From fdc00a7042d912aafaabddae4d9c84199921ef23 Mon Sep 17 00:00:00 2001 From: Bo Xu Date: Tue, 28 Oct 2014 23:03:33 -0700 Subject: Merge XFA to PDFium master at 4dc95e7 on 10/28/2014 --- xfa/src/fdp/include/fde.h | 20 + xfa/src/fdp/include/fde_brs.h | 143 + xfa/src/fdp/include/fde_css.h | 1082 +++ xfa/src/fdp/include/fde_img.h | 76 + xfa/src/fdp/include/fde_mem.h | 23 + xfa/src/fdp/include/fde_pen.h | 61 + xfa/src/fdp/include/fde_psr.h | 94 + xfa/src/fdp/include/fde_pth.h | 29 + xfa/src/fdp/include/fde_rdr.h | 32 + xfa/src/fdp/include/fde_rdv.h | 53 + xfa/src/fdp/include/fde_tto.h | 69 + xfa/src/fdp/include/fde_xml.h | 188 + xfa/src/fdp/src/css/fde_csscache.cpp | 163 + xfa/src/fdp/src/css/fde_csscache.h | 97 + xfa/src/fdp/src/css/fde_cssdatatable.cpp | 729 ++ xfa/src/fdp/src/css/fde_cssdatatable.h | 195 + xfa/src/fdp/src/css/fde_cssdeclaration.cpp | 1193 ++++ xfa/src/fdp/src/css/fde_cssdeclaration.h | 70 + xfa/src/fdp/src/css/fde_cssstyleselector.cpp | 1715 +++++ xfa/src/fdp/src/css/fde_cssstyleselector.h | 1000 +++ xfa/src/fdp/src/css/fde_cssstylesheet.cpp | 481 ++ xfa/src/fdp/src/css/fde_cssstylesheet.h | 163 + xfa/src/fdp/src/css/fde_csssyntax.cpp | 495 ++ xfa/src/fdp/src/css/fde_csssyntax.h | 135 + xfa/src/fdp/src/fde/fde_devbasic.cpp | 70 + xfa/src/fdp/src/fde/fde_devbasic.h | 16 + xfa/src/fdp/src/fde/fde_gdidevice.cpp | 555 ++ xfa/src/fdp/src/fde/fde_gdidevice.h | 76 + xfa/src/fdp/src/fde/fde_gedevice.cpp | 532 ++ xfa/src/fdp/src/fde/fde_gedevice.h | 63 + xfa/src/fdp/src/fde/fde_geobject.cpp | 270 + xfa/src/fdp/src/fde/fde_geobject.h | 53 + xfa/src/fdp/src/fde/fde_iterator.cpp | 101 + xfa/src/fdp/src/fde/fde_iterator.h | 33 + xfa/src/fdp/src/fde/fde_object.cpp | 27 + xfa/src/fdp/src/fde/fde_object.h | 427 ++ xfa/src/fdp/src/fde/fde_render.cpp | 253 + xfa/src/fdp/src/fde/fde_render.h | 42 + xfa/src/fdp/src/tto/fde_textout.cpp | 952 +++ xfa/src/fdp/src/tto/fde_textout.h | 132 + xfa/src/fdp/src/xml/fde_xml.cpp | 2712 ++++++++ xfa/src/fdp/src/xml/fde_xml.h | 443 ++ xfa/src/fee/include/fx_wordbreak.h | 24 + xfa/src/fee/include/ifde_txtedtbuf.h | 31 + xfa/src/fee/include/ifde_txtedtengine.h | 233 + xfa/src/fee/include/ifde_txtedtpage.h | 32 + xfa/src/fee/src/fee/fde_txtedtblock.cpp | 674 ++ xfa/src/fee/src/fee/fde_txtedtblock.h | 227 + xfa/src/fee/src/fee/fde_txtedtbuf.cpp | 446 ++ xfa/src/fee/src/fee/fde_txtedtbuf.h | 90 + xfa/src/fee/src/fee/fde_txtedtengine.cpp | 2871 ++++++++ xfa/src/fee/src/fee/fde_txtedtengine.h | 341 + xfa/src/fee/src/fee/fde_txtedtkmpmatch.cpp | 8 + xfa/src/fee/src/fee/fde_txtedtkmpmatch.h | 9 + xfa/src/fee/src/fee/fde_txtedtpage.cpp | 647 ++ xfa/src/fee/src/fee/fde_txtedtpage.h | 130 + xfa/src/fee/src/fee/fde_txtedtparag.cpp | 149 + xfa/src/fee/src/fee/fde_txtedtparag.h | 39 + xfa/src/fee/src/fx_wordbreak/fx_wordbreak_impl.cpp | 263 + xfa/src/fee/src/fx_wordbreak/fx_wordbreak_impl.h | 64 + xfa/src/fee/src/fx_wordbreak/fx_wordbreakdata.cpp | 2062 ++++++ xfa/src/fgas/include/fgas.h | 24 + xfa/src/fgas/include/fx_alg.h | 46 + xfa/src/fgas/include/fx_cpg.h | 233 + xfa/src/fgas/include/fx_datetime.h | 470 ++ xfa/src/fgas/include/fx_fnt.h | 170 + xfa/src/fgas/include/fx_lbk.h | 27 + xfa/src/fgas/include/fx_lgg.h | 267 + xfa/src/fgas/include/fx_locale.h | 160 + xfa/src/fgas/include/fx_mem.h | 58 + xfa/src/fgas/include/fx_rbk.h | 235 + xfa/src/fgas/include/fx_sax.h | 48 + xfa/src/fgas/include/fx_stm.h | 60 + xfa/src/fgas/include/fx_sys.h | 63 + xfa/src/fgas/include/fx_tbk.h | 211 + xfa/src/fgas/include/fx_ucd.h | 23 + xfa/src/fgas/include/fx_utl.h | 797 +++ xfa/src/fgas/src/crt/codepage/cpcu1250.cpp | 6 + xfa/src/fgas/src/crt/codepage/cpcu1251.cpp | 6 + xfa/src/fgas/src/crt/codepage/cpcu1252.cpp | 6 + xfa/src/fgas/src/crt/codepage/cpcu1253.cpp | 6 + xfa/src/fgas/src/crt/codepage/cpcu1254.cpp | 6 + xfa/src/fgas/src/crt/codepage/cpcu1255.cpp | 6 + xfa/src/fgas/src/crt/codepage/cpcu1256.cpp | 6 + xfa/src/fgas/src/crt/codepage/cpcu1257.cpp | 6 + xfa/src/fgas/src/crt/codepage/cpcu1258.cpp | 6 + xfa/src/fgas/src/crt/codepage/cpcu874.cpp | 6 + xfa/src/fgas/src/crt/codepage/cpcu932.cpp | 6 + xfa/src/fgas/src/crt/codepage/cpcu936.cpp | 6 + xfa/src/fgas/src/crt/codepage/cpcu949.cpp | 6 + xfa/src/fgas/src/crt/codepage/cpcu950.cpp | 6 + xfa/src/fgas/src/crt/codepage/cphi1250.cpp | 6 + xfa/src/fgas/src/crt/codepage/cphi1251.cpp | 6 + xfa/src/fgas/src/crt/codepage/cphi1252.cpp | 6 + xfa/src/fgas/src/crt/codepage/cphi1253.cpp | 6 + xfa/src/fgas/src/crt/codepage/cphi1254.cpp | 6 + xfa/src/fgas/src/crt/codepage/cphi1255.cpp | 6 + xfa/src/fgas/src/crt/codepage/cphi1256.cpp | 6 + xfa/src/fgas/src/crt/codepage/cphi1257.cpp | 6 + xfa/src/fgas/src/crt/codepage/cphi1258.cpp | 6 + xfa/src/fgas/src/crt/codepage/cphi874.cpp | 6 + xfa/src/fgas/src/crt/codepage/cphi932.cpp | 6 + xfa/src/fgas/src/crt/codepage/cphi936.cpp | 6 + xfa/src/fgas/src/crt/codepage/cphi949.cpp | 6 + xfa/src/fgas/src/crt/codepage/cphi950.cpp | 6 + xfa/src/fgas/src/crt/codepage/cpuc1250.cpp | 6 + xfa/src/fgas/src/crt/codepage/cpuc1251.cpp | 6 + xfa/src/fgas/src/crt/codepage/cpuc1252.cpp | 6 + xfa/src/fgas/src/crt/codepage/cpuc1253.cpp | 6 + xfa/src/fgas/src/crt/codepage/cpuc1254.cpp | 6 + xfa/src/fgas/src/crt/codepage/cpuc1255.cpp | 6 + xfa/src/fgas/src/crt/codepage/cpuc1256.cpp | 6 + xfa/src/fgas/src/crt/codepage/cpuc1257.cpp | 6 + xfa/src/fgas/src/crt/codepage/cpuc1258.cpp | 6 + xfa/src/fgas/src/crt/codepage/cpuc874.cpp | 6 + xfa/src/fgas/src/crt/codepage/cpuc932.cpp | 6 + xfa/src/fgas/src/crt/codepage/cpuc936.cpp | 6 + xfa/src/fgas/src/crt/codepage/cpuc949.cpp | 6 + xfa/src/fgas/src/crt/codepage/cpuc950.cpp | 6 + xfa/src/fgas/src/crt/fx_algorithm.cpp | 315 + xfa/src/fgas/src/crt/fx_codepage.cpp | 373 + xfa/src/fgas/src/crt/fx_codepage.h | 9 + xfa/src/fgas/src/crt/fx_cpmgr.cpp | 65 + xfa/src/fgas/src/crt/fx_encode.cpp | 189 + xfa/src/fgas/src/crt/fx_memory.cpp | 334 + xfa/src/fgas/src/crt/fx_memory.h | 199 + xfa/src/fgas/src/crt/fx_stream.cpp | 1613 +++++ xfa/src/fgas/src/crt/fx_stream.h | 405 ++ xfa/src/fgas/src/crt/fx_system.cpp | 236 + xfa/src/fgas/src/crt/fx_utils.cpp | 456 ++ xfa/src/fgas/src/crt/fx_utils.h | 32 + xfa/src/fgas/src/fgas_base.h | 12 + xfa/src/fgas/src/font/fx_fontutils.cpp | 236 + xfa/src/fgas/src/font/fx_fontutils.h | 19 + xfa/src/fgas/src/font/fx_gdifont.cpp | 532 ++ xfa/src/fgas/src/font/fx_gdifont.h | 89 + xfa/src/fgas/src/font/fx_gefont.cpp | 595 ++ xfa/src/fgas/src/font/fx_gefont.h | 81 + xfa/src/fgas/src/font/fx_stdfontmgr.cpp | 1490 ++++ xfa/src/fgas/src/font/fx_stdfontmgr.h | 175 + xfa/src/fgas/src/layout/fx_linebreak.cpp | 121 + xfa/src/fgas/src/layout/fx_rtfbreak.cpp | 1522 +++++ xfa/src/fgas/src/layout/fx_rtfbreak.h | 180 + xfa/src/fgas/src/layout/fx_textbreak.cpp | 1653 +++++ xfa/src/fgas/src/layout/fx_textbreak.h | 171 + xfa/src/fgas/src/layout/fx_unicode.cpp | 146 + xfa/src/fgas/src/layout/fx_unicode.h | 15 + xfa/src/fgas/src/localization/fx_datetime.cpp | 548 ++ xfa/src/fgas/src/localization/fx_locale.cpp | 4954 ++++++++++++++ xfa/src/fgas/src/localization/fx_localeimp.h | 74 + xfa/src/fgas/src/localization/fx_localemgr.cpp | 100 + xfa/src/fgas/src/localization/fx_localemgr.h | 27 + xfa/src/fgas/src/xml/fx_sax_imp.cpp | 720 ++ xfa/src/fgas/src/xml/fx_sax_imp.h | 140 + xfa/src/foxitlib.h | 15 + xfa/src/fwl/src/basewidget/fwl_barcodeimp.cpp | 247 + xfa/src/fwl/src/basewidget/fwl_caretimp.cpp | 192 + xfa/src/fwl/src/basewidget/fwl_checkboximp.cpp | 606 ++ xfa/src/fwl/src/basewidget/fwl_comboboximp.cpp | 1991 ++++++ .../fwl/src/basewidget/fwl_datetimepickerimp.cpp | 1202 ++++ xfa/src/fwl/src/basewidget/fwl_editimp.cpp | 2244 ++++++ xfa/src/fwl/src/basewidget/fwl_formproxyimp.cpp | 71 + xfa/src/fwl/src/basewidget/fwl_listboximp.cpp | 1255 ++++ .../fwl/src/basewidget/fwl_monthcalendarimp.cpp | 1113 +++ xfa/src/fwl/src/basewidget/fwl_pictureboximp.cpp | 172 + xfa/src/fwl/src/basewidget/fwl_pushbuttonimp.cpp | 542 ++ xfa/src/fwl/src/basewidget/fwl_scrollbarimp.cpp | 852 +++ xfa/src/fwl/src/basewidget/fwl_spinbuttonimp.cpp | 450 ++ xfa/src/fwl/src/basewidget/fwl_tooltipctrlimp.cpp | 338 + xfa/src/fwl/src/basewidget/fxmath_barcodeimp.cpp | 400 ++ .../fwl/src/basewidget/include/fwl_barcodeimp.h | 51 + xfa/src/fwl/src/basewidget/include/fwl_caretimp.h | 63 + .../fwl/src/basewidget/include/fwl_checkboximp.h | 60 + .../fwl/src/basewidget/include/fwl_comboboximp.h | 227 + .../src/basewidget/include/fwl_datetimepickerimp.h | 206 + xfa/src/fwl/src/basewidget/include/fwl_editimp.h | 169 + .../fwl/src/basewidget/include/fwl_formproxyimp.h | 39 + .../fwl/src/basewidget/include/fwl_listboximp.h | 98 + .../src/basewidget/include/fwl_monthcalendarimp.h | 203 + .../fwl/src/basewidget/include/fwl_pictureboximp.h | 47 + .../fwl/src/basewidget/include/fwl_pushbuttonimp.h | 57 + .../fwl/src/basewidget/include/fwl_scrollbarimp.h | 113 + .../fwl/src/basewidget/include/fwl_spinbuttonimp.h | 62 + .../src/basewidget/include/fwl_tooltipctrlimp.h | 78 + .../fwl/src/basewidget/include/fxmath_barcodeimp.h | 45 + xfa/src/fwl/src/core/fwl_appimp.cpp | 110 + xfa/src/fwl/src/core/fwl_contentimp.cpp | 131 + xfa/src/fwl/src/core/fwl_formimp.cpp | 1434 ++++ xfa/src/fwl/src/core/fwl_gridimp.cpp | 1359 ++++ xfa/src/fwl/src/core/fwl_noteimp.cpp | 1116 +++ xfa/src/fwl/src/core/fwl_panelimp.cpp | 208 + xfa/src/fwl/src/core/fwl_sdadapterimp.cpp | 187 + xfa/src/fwl/src/core/fwl_targetimp.cpp | 101 + xfa/src/fwl/src/core/fwl_threadimp.cpp | 158 + xfa/src/fwl/src/core/fwl_timerimp.cpp | 28 + xfa/src/fwl/src/core/fwl_widgetimp.cpp | 1217 ++++ xfa/src/fwl/src/core/fwl_widgetmgrimp.cpp | 1054 +++ xfa/src/fwl/src/core/include/fwl_appimp.h | 34 + xfa/src/fwl/src/core/include/fwl_contentimp.h | 31 + xfa/src/fwl/src/core/include/fwl_formimp.h | 187 + xfa/src/fwl/src/core/include/fwl_gridimp.h | 161 + xfa/src/fwl/src/core/include/fwl_noteimp.h | 152 + xfa/src/fwl/src/core/include/fwl_panelimp.h | 29 + xfa/src/fwl/src/core/include/fwl_targetimp.h | 33 + xfa/src/fwl/src/core/include/fwl_threadimp.h | 53 + xfa/src/fwl/src/core/include/fwl_widgetimp.h | 128 + xfa/src/fwl/src/core/include/fwl_widgetmgrimp.h | 142 + xfa/src/fwl/src/lightwidget/app.cpp | 42 + xfa/src/fwl/src/lightwidget/barcode.cpp | 57 + xfa/src/fwl/src/lightwidget/caret.cpp | 58 + xfa/src/fwl/src/lightwidget/checkbox.cpp | 75 + xfa/src/fwl/src/lightwidget/combobox.cpp | 361 + xfa/src/fwl/src/lightwidget/datetimepicker.cpp | 156 + xfa/src/fwl/src/lightwidget/edit.cpp | 226 + xfa/src/fwl/src/lightwidget/listbox.cpp | 327 + xfa/src/fwl/src/lightwidget/picturebox.cpp | 144 + xfa/src/fwl/src/lightwidget/pushbutton.cpp | 71 + xfa/src/fwl/src/lightwidget/scrollbar.cpp | 102 + xfa/src/fwl/src/lightwidget/theme.cpp | 155 + xfa/src/fwl/src/lightwidget/tooltipctrl.cpp | 141 + xfa/src/fwl/src/lightwidget/widget.cpp | 344 + xfa/src/fwl/src/theme/barcodetp.cpp | 39 + xfa/src/fwl/src/theme/carettp.cpp | 43 + xfa/src/fwl/src/theme/checkboxtp.cpp | 500 ++ xfa/src/fwl/src/theme/comboboxtp.cpp | 147 + xfa/src/fwl/src/theme/datetimepickertp.cpp | 120 + xfa/src/fwl/src/theme/edittp.cpp | 84 + xfa/src/fwl/src/theme/formtp.cpp | 796 +++ xfa/src/fwl/src/theme/listboxtp.cpp | 92 + xfa/src/fwl/src/theme/monthcalendartp.cpp | 554 ++ xfa/src/fwl/src/theme/pictureboxtp.cpp | 35 + xfa/src/fwl/src/theme/pushbuttontp.cpp | 165 + xfa/src/fwl/src/theme/scrollbartp.cpp | 362 + xfa/src/fwl/src/theme/widgettp.cpp | 827 +++ xfa/src/fxbarcode/src/BC_ASCIIEncoder.cpp | 83 + xfa/src/fxbarcode/src/BC_BarCode.cpp | 856 +++ xfa/src/fxbarcode/src/BC_Base256Encoder.cpp | 79 + xfa/src/fxbarcode/src/BC_Binarizer.cpp | 22 + xfa/src/fxbarcode/src/BC_BinaryBitmap.cpp | 60 + .../src/BC_BufferedImageLuminanceSource.cpp | 188 + xfa/src/fxbarcode/src/BC_C40Encoder.cpp | 182 + xfa/src/fxbarcode/src/BC_CommonBitArray.cpp | 108 + xfa/src/fxbarcode/src/BC_CommonBitMatrix.cpp | 145 + xfa/src/fxbarcode/src/BC_CommonBitSource.cpp | 60 + xfa/src/fxbarcode/src/BC_CommonByteArray.cpp | 98 + xfa/src/fxbarcode/src/BC_CommonByteMatrix.cpp | 60 + xfa/src/fxbarcode/src/BC_CommonCharacterSetECI.cpp | 34 + xfa/src/fxbarcode/src/BC_CommonDecoderResult.cpp | 63 + xfa/src/fxbarcode/src/BC_CommonECI.cpp | 30 + .../src/BC_CommonPerspectiveTransform.cpp | 109 + .../fxbarcode/src/BC_DataMatrixBitMatrixParser.cpp | 350 + xfa/src/fxbarcode/src/BC_DataMatrixDataBlock.cpp | 83 + .../src/BC_DataMatrixDecodedBitStreamParser.cpp | 456 ++ xfa/src/fxbarcode/src/BC_DataMatrixDecoder.cpp | 94 + xfa/src/fxbarcode/src/BC_DataMatrixDetector.cpp | 352 + xfa/src/fxbarcode/src/BC_DataMatrixReader.cpp | 51 + .../fxbarcode/src/BC_DataMatrixSymbolInfo144.cpp | 27 + xfa/src/fxbarcode/src/BC_DataMatrixVersion.cpp | 131 + xfa/src/fxbarcode/src/BC_DataMatrixWriter.cpp | 122 + xfa/src/fxbarcode/src/BC_DefaultPlacement.cpp | 158 + xfa/src/fxbarcode/src/BC_Dimension.cpp | 39 + xfa/src/fxbarcode/src/BC_EdifactEncoder.cpp | 137 + xfa/src/fxbarcode/src/BC_Encoder.cpp | 14 + xfa/src/fxbarcode/src/BC_EncoderContext.cpp | 111 + xfa/src/fxbarcode/src/BC_ErrorCorrection.cpp | 178 + xfa/src/fxbarcode/src/BC_FinderPatternInfo.cpp | 31 + .../fxbarcode/src/BC_GlobalHistogramBinarizer.cpp | 153 + xfa/src/fxbarcode/src/BC_HighLevelEncoder.cpp | 352 + xfa/src/fxbarcode/src/BC_Library.cpp | 122 + xfa/src/fxbarcode/src/BC_LuminanceSource.cpp | 22 + xfa/src/fxbarcode/src/BC_OneDReader.cpp | 163 + xfa/src/fxbarcode/src/BC_OneDimReader.cpp | 219 + xfa/src/fxbarcode/src/BC_OneDimWriter.cpp | 399 ++ xfa/src/fxbarcode/src/BC_OnedCodaBarReader.cpp | 190 + xfa/src/fxbarcode/src/BC_OnedCodaBarWriter.cpp | 206 + xfa/src/fxbarcode/src/BC_OnedCode128Reader.cpp | 414 ++ xfa/src/fxbarcode/src/BC_OnedCode128Writer.cpp | 214 + xfa/src/fxbarcode/src/BC_OnedCode39Reader.cpp | 277 + xfa/src/fxbarcode/src/BC_OnedCode39Writer.cpp | 335 + xfa/src/fxbarcode/src/BC_OnedEAN13Reader.cpp | 78 + xfa/src/fxbarcode/src/BC_OnedEAN13Writer.cpp | 278 + xfa/src/fxbarcode/src/BC_OnedEAN8Reader.cpp | 65 + xfa/src/fxbarcode/src/BC_OnedEAN8Writer.cpp | 245 + xfa/src/fxbarcode/src/BC_OnedUPCAReader.cpp | 76 + xfa/src/fxbarcode/src/BC_OnedUPCAWriter.cpp | 269 + xfa/src/fxbarcode/src/BC_PDF417.cpp | 676 ++ xfa/src/fxbarcode/src/BC_PDF417BarcodeMatrix.cpp | 82 + xfa/src/fxbarcode/src/BC_PDF417BarcodeMetadata.cpp | 39 + xfa/src/fxbarcode/src/BC_PDF417BarcodeRow.cpp | 44 + xfa/src/fxbarcode/src/BC_PDF417BarcodeValue.cpp | 52 + xfa/src/fxbarcode/src/BC_PDF417BoundingBox.cpp | 178 + xfa/src/fxbarcode/src/BC_PDF417Codeword.cpp | 64 + xfa/src/fxbarcode/src/BC_PDF417CodewordDecoder.cpp | 102 + xfa/src/fxbarcode/src/BC_PDF417Common.cpp | 434 ++ xfa/src/fxbarcode/src/BC_PDF417Compaction.cpp | 14 + .../src/BC_PDF417DecodedBitStreamParser.cpp | 474 ++ xfa/src/fxbarcode/src/BC_PDF417DetectionResult.cpp | 267 + .../src/BC_PDF417DetectionResultColumn.cpp | 91 + .../BC_PDF417DetectionResultRowIndicatorColumn.cpp | 225 + xfa/src/fxbarcode/src/BC_PDF417Detector.cpp | 295 + xfa/src/fxbarcode/src/BC_PDF417DetectorResult.cpp | 37 + xfa/src/fxbarcode/src/BC_PDF417Dimensions.cpp | 34 + .../fxbarcode/src/BC_PDF417ECErrorCorrection.cpp | 353 + xfa/src/fxbarcode/src/BC_PDF417ECModulusGF.cpp | 110 + xfa/src/fxbarcode/src/BC_PDF417ECModulusPoly.cpp | 300 + xfa/src/fxbarcode/src/BC_PDF417ErrorCorrection.cpp | 177 + .../fxbarcode/src/BC_PDF417HighLevelEncoder.cpp | 420 ++ xfa/src/fxbarcode/src/BC_PDF417Reader.cpp | 103 + xfa/src/fxbarcode/src/BC_PDF417ResultMetadata.cpp | 46 + xfa/src/fxbarcode/src/BC_PDF417ScanningDecoder.cpp | 580 ++ xfa/src/fxbarcode/src/BC_PDF417Writer.cpp | 110 + xfa/src/fxbarcode/src/BC_QRAlignmentPattern.cpp | 36 + .../fxbarcode/src/BC_QRAlignmentPatternFinder.cpp | 171 + xfa/src/fxbarcode/src/BC_QRBitMatrixParser.cpp | 169 + xfa/src/fxbarcode/src/BC_QRCodeReader.cpp | 95 + xfa/src/fxbarcode/src/BC_QRCodeWriter.cpp | 87 + xfa/src/fxbarcode/src/BC_QRCoder.cpp | 152 + xfa/src/fxbarcode/src/BC_QRCoderBitVector.cpp | 125 + xfa/src/fxbarcode/src/BC_QRCoderBlockPair.cpp | 33 + xfa/src/fxbarcode/src/BC_QRCoderDecoder.cpp | 112 + xfa/src/fxbarcode/src/BC_QRCoderECB.cpp | 24 + xfa/src/fxbarcode/src/BC_QRCoderECBlocks.cpp | 49 + xfa/src/fxbarcode/src/BC_QRCoderEncoder.cpp | 860 +++ .../src/BC_QRCoderErrorCorrectionLevel.cpp | 81 + .../fxbarcode/src/BC_QRCoderFormatInformation.cpp | 103 + xfa/src/fxbarcode/src/BC_QRCoderMaskUtil.cpp | 192 + xfa/src/fxbarcode/src/BC_QRCoderMatrixUtil.cpp | 474 ++ xfa/src/fxbarcode/src/BC_QRCoderMode.cpp | 162 + xfa/src/fxbarcode/src/BC_QRCoderVersion.cpp | 761 +++ xfa/src/fxbarcode/src/BC_QRDataBlock.cpp | 88 + xfa/src/fxbarcode/src/BC_QRDataMask.cpp | 133 + .../fxbarcode/src/BC_QRDecodedBitStreamParser.cpp | 238 + xfa/src/fxbarcode/src/BC_QRDetector.cpp | 248 + xfa/src/fxbarcode/src/BC_QRDetectorResult.cpp | 35 + xfa/src/fxbarcode/src/BC_QRFinderPattern.cpp | 55 + xfa/src/fxbarcode/src/BC_QRFinderPatternFinder.cpp | 435 ++ xfa/src/fxbarcode/src/BC_QRGridSampler.cpp | 112 + xfa/src/fxbarcode/src/BC_Reader.cpp | 14 + xfa/src/fxbarcode/src/BC_ReedSolomon.cpp | 84 + xfa/src/fxbarcode/src/BC_ReedSolomonDecoder.cpp | 208 + xfa/src/fxbarcode/src/BC_ReedSolomonGF256.cpp | 124 + xfa/src/fxbarcode/src/BC_ReedSolomonGF256Poly.cpp | 241 + xfa/src/fxbarcode/src/BC_ResultPoint.cpp | 19 + xfa/src/fxbarcode/src/BC_SymbolInfo.cpp | 226 + xfa/src/fxbarcode/src/BC_SymbolShapeHint.cpp | 14 + xfa/src/fxbarcode/src/BC_TextEncoder.cpp | 86 + xfa/src/fxbarcode/src/BC_TwoDimWriter.cpp | 137 + xfa/src/fxbarcode/src/BC_UtilCodingConvert.cpp | 49 + xfa/src/fxbarcode/src/BC_UtilRSS.cpp | 148 + xfa/src/fxbarcode/src/BC_Utils.cpp | 46 + .../fxbarcode/src/BC_WhiteRectangleDetector.cpp | 228 + xfa/src/fxbarcode/src/BC_Writer.cpp | 70 + xfa/src/fxbarcode/src/BC_X12Encoder.cpp | 88 + xfa/src/fxbarcode/src/barcode.h | 8 + xfa/src/fxbarcode/src/include/BC_ASCIIEncoder.h | 22 + xfa/src/fxbarcode/src/include/BC_Base256Encoder.h | 21 + xfa/src/fxbarcode/src/include/BC_Binarizer.h | 24 + xfa/src/fxbarcode/src/include/BC_BinaryBitmap.h | 29 + .../src/include/BC_BufferedImageLuminanceSource.h | 33 + xfa/src/fxbarcode/src/include/BC_C40Encoder.h | 24 + xfa/src/fxbarcode/src/include/BC_CommonBitArray.h | 32 + xfa/src/fxbarcode/src/include/BC_CommonBitMatrix.h | 38 + xfa/src/fxbarcode/src/include/BC_CommonBitSource.h | 23 + xfa/src/fxbarcode/src/include/BC_CommonByteArray.h | 30 + .../fxbarcode/src/include/BC_CommonByteMatrix.h | 29 + .../src/include/BC_CommonCharacterSetECI.h | 25 + .../fxbarcode/src/include/BC_CommonDecoderResult.h | 33 + xfa/src/fxbarcode/src/include/BC_CommonECI.h | 21 + .../src/include/BC_CommonPerspectiveTransform.h | 39 + .../src/include/BC_DataMatrixBitMatrixParser.h | 33 + .../fxbarcode/src/include/BC_DataMatrixDataBlock.h | 26 + .../include/BC_DataMatrixDecodedBitStreamParser.h | 43 + .../fxbarcode/src/include/BC_DataMatrixDecoder.h | 24 + .../fxbarcode/src/include/BC_DataMatrixDetector.h | 78 + .../fxbarcode/src/include/BC_DataMatrixReader.h | 25 + .../src/include/BC_DataMatrixSymbolInfo144.h | 19 + .../fxbarcode/src/include/BC_DataMatrixVersion.h | 101 + .../fxbarcode/src/include/BC_DataMatrixWriter.h | 30 + xfa/src/fxbarcode/src/include/BC_DecoderResult.h | 32 + .../fxbarcode/src/include/BC_DefaultPlacement.h | 35 + xfa/src/fxbarcode/src/include/BC_Dimension.h | 24 + xfa/src/fxbarcode/src/include/BC_EdifactEncoder.h | 23 + xfa/src/fxbarcode/src/include/BC_Encoder.h | 19 + xfa/src/fxbarcode/src/include/BC_EncoderContext.h | 48 + xfa/src/fxbarcode/src/include/BC_ErrorCorrection.h | 29 + .../fxbarcode/src/include/BC_FinderPatternInfo.h | 24 + .../src/include/BC_GlobalHistogramBinarizer.h | 28 + .../fxbarcode/src/include/BC_HighLevelEncoder.h | 60 + xfa/src/fxbarcode/src/include/BC_LuminanceSource.h | 34 + xfa/src/fxbarcode/src/include/BC_OneDReader.h | 34 + xfa/src/fxbarcode/src/include/BC_OneDimReader.h | 39 + xfa/src/fxbarcode/src/include/BC_OneDimWriter.h | 70 + .../fxbarcode/src/include/BC_OnedCodaBarReader.h | 30 + .../fxbarcode/src/include/BC_OnedCodaBarWriter.h | 38 + .../fxbarcode/src/include/BC_OnedCode128Reader.h | 40 + .../fxbarcode/src/include/BC_OnedCode128Writer.h | 37 + .../fxbarcode/src/include/BC_OnedCode39Reader.h | 32 + .../fxbarcode/src/include/BC_OnedCode39Writer.h | 37 + xfa/src/fxbarcode/src/include/BC_OnedEAN13Reader.h | 24 + xfa/src/fxbarcode/src/include/BC_OnedEAN13Writer.h | 31 + xfa/src/fxbarcode/src/include/BC_OnedEAN8Reader.h | 20 + xfa/src/fxbarcode/src/include/BC_OnedEAN8Writer.h | 32 + xfa/src/fxbarcode/src/include/BC_OnedUPCAReader.h | 30 + xfa/src/fxbarcode/src/include/BC_OnedUPCAWriter.h | 31 + xfa/src/fxbarcode/src/include/BC_PDF417.h | 45 + .../fxbarcode/src/include/BC_PDF417BarcodeMatrix.h | 35 + .../src/include/BC_PDF417BarcodeMetadata.h | 27 + .../fxbarcode/src/include/BC_PDF417BarcodeRow.h | 25 + .../fxbarcode/src/include/BC_PDF417BarcodeValue.h | 22 + .../fxbarcode/src/include/BC_PDF417BoundingBox.h | 43 + xfa/src/fxbarcode/src/include/BC_PDF417Codeword.h | 34 + .../src/include/BC_PDF417CodewordDecoder.h | 27 + xfa/src/fxbarcode/src/include/BC_PDF417Common.h | 31 + .../fxbarcode/src/include/BC_PDF417Compaction.h | 22 + .../src/include/BC_PDF417DecodedBitStreamParser.h | 49 + .../src/include/BC_PDF417DetectionResult.h | 48 + .../src/include/BC_PDF417DetectionResultColumn.h | 31 + .../BC_PDF417DetectionResultRowIndicatorColumn.h | 28 + xfa/src/fxbarcode/src/include/BC_PDF417Detector.h | 43 + .../src/include/BC_PDF417DetectorResult.h | 22 + .../fxbarcode/src/include/BC_PDF417Dimensions.h | 25 + .../src/include/BC_PDF417ECErrorCorrection.h | 26 + .../fxbarcode/src/include/BC_PDF417ECModulusGF.h | 37 + .../fxbarcode/src/include/BC_PDF417ECModulusPoly.h | 34 + .../src/include/BC_PDF417ErrorCorrection.h | 21 + .../src/include/BC_PDF417HighLevelEncoder.h | 48 + xfa/src/fxbarcode/src/include/BC_PDF417Reader.h | 26 + .../src/include/BC_PDF417ResultMetadata.h | 29 + .../src/include/BC_PDF417ScanningDecoder.h | 61 + xfa/src/fxbarcode/src/include/BC_PDF417Writer.h | 26 + .../fxbarcode/src/include/BC_QRAlignmentPattern.h | 24 + .../src/include/BC_QRAlignmentPatternFinder.h | 32 + .../fxbarcode/src/include/BC_QRBitMatrixParser.h | 31 + xfa/src/fxbarcode/src/include/BC_QRCodeReader.h | 35 + xfa/src/fxbarcode/src/include/BC_QRCodeWriter.h | 28 + xfa/src/fxbarcode/src/include/BC_QRCoder.h | 55 + .../fxbarcode/src/include/BC_QRCoderBitVector.h | 32 + .../fxbarcode/src/include/BC_QRCoderBlockPair.h | 23 + xfa/src/fxbarcode/src/include/BC_QRCoderDecoder.h | 29 + xfa/src/fxbarcode/src/include/BC_QRCoderECB.h | 21 + xfa/src/fxbarcode/src/include/BC_QRCoderECBlocks.h | 25 + xfa/src/fxbarcode/src/include/BC_QRCoderEncoder.h | 60 + .../src/include/BC_QRCoderErrorCorrectionLevel.h | 32 + .../src/include/BC_QRCoderFormatInformation.h | 29 + xfa/src/fxbarcode/src/include/BC_QRCoderMaskUtil.h | 24 + .../fxbarcode/src/include/BC_QRCoderMatrixUtil.h | 50 + xfa/src/fxbarcode/src/include/BC_QRCoderMode.h | 40 + xfa/src/fxbarcode/src/include/BC_QRCoderVersion.h | 42 + xfa/src/fxbarcode/src/include/BC_QRDataBlock.h | 27 + xfa/src/fxbarcode/src/include/BC_QRDataMask.h | 25 + .../src/include/BC_QRDecodedBitStreamParser.h | 35 + xfa/src/fxbarcode/src/include/BC_QRDetector.h | 41 + .../fxbarcode/src/include/BC_QRDetectorResult.h | 23 + xfa/src/fxbarcode/src/include/BC_QRFinderPattern.h | 29 + .../src/include/BC_QRFinderPatternFinder.h | 45 + xfa/src/fxbarcode/src/include/BC_QRGridSampler.h | 33 + xfa/src/fxbarcode/src/include/BC_Reader.h | 19 + xfa/src/fxbarcode/src/include/BC_ReedSolomon.h | 25 + .../fxbarcode/src/include/BC_ReedSolomonDecoder.h | 24 + .../fxbarcode/src/include/BC_ReedSolomonGF256.h | 35 + .../src/include/BC_ReedSolomonGF256Poly.h | 33 + xfa/src/fxbarcode/src/include/BC_ResultPoint.h | 24 + xfa/src/fxbarcode/src/include/BC_SymbolInfo.h | 53 + xfa/src/fxbarcode/src/include/BC_SymbolShapeHint.h | 21 + xfa/src/fxbarcode/src/include/BC_TextEncoder.h | 18 + xfa/src/fxbarcode/src/include/BC_TwoDimWriter.h | 44 + .../fxbarcode/src/include/BC_UtilCodingConvert.h | 22 + xfa/src/fxbarcode/src/include/BC_UtilRSS.h | 23 + .../src/include/BC_WhiteRectangleDetector.h | 38 + xfa/src/fxbarcode/src/include/BC_Writer.h | 35 + xfa/src/fxbarcode/src/include/BC_X12Encoder.h | 21 + xfa/src/fxbarcode/src/include/utils.h | 219 + xfa/src/fxfa/src/app/xfa_checksum.cpp | 203 + xfa/src/fxfa/src/app/xfa_checksum.h | 58 + xfa/src/fxfa/src/app/xfa_ffConfigAcc.cpp | 65 + xfa/src/fxfa/src/app/xfa_ffConfigAcc.h | 21 + xfa/src/fxfa/src/app/xfa_ffapp.cpp | 301 + xfa/src/fxfa/src/app/xfa_ffapp.h | 92 + xfa/src/fxfa/src/app/xfa_ffbarcode.cpp | 223 + xfa/src/fxfa/src/app/xfa_ffbarcode.h | 93 + xfa/src/fxfa/src/app/xfa_ffcheckbutton.cpp | 341 + xfa/src/fxfa/src/app/xfa_ffcheckbutton.h | 36 + xfa/src/fxfa/src/app/xfa_ffchoicelist.cpp | 571 ++ xfa/src/fxfa/src/app/xfa_ffchoicelist.h | 82 + xfa/src/fxfa/src/app/xfa_ffdoc.cpp | 453 ++ xfa/src/fxfa/src/app/xfa_ffdoc.h | 63 + xfa/src/fxfa/src/app/xfa_ffdochandler.cpp | 113 + xfa/src/fxfa/src/app/xfa_ffdochandler.h | 34 + xfa/src/fxfa/src/app/xfa_ffdocview.cpp | 960 +++ xfa/src/fxfa/src/app/xfa_ffdocview.h | 164 + xfa/src/fxfa/src/app/xfa_ffdraw.cpp | 20 + xfa/src/fxfa/src/app/xfa_ffdraw.h | 16 + xfa/src/fxfa/src/app/xfa_ffexclgroup.cpp | 32 + xfa/src/fxfa/src/app/xfa_ffexclgroup.h | 18 + xfa/src/fxfa/src/app/xfa_fffield.cpp | 874 +++ xfa/src/fxfa/src/app/xfa_fffield.h | 77 + xfa/src/fxfa/src/app/xfa_ffimage.cpp | 70 + xfa/src/fxfa/src/app/xfa_ffimage.h | 19 + xfa/src/fxfa/src/app/xfa_ffimageedit.cpp | 188 + xfa/src/fxfa/src/app/xfa_ffimageedit.h | 28 + xfa/src/fxfa/src/app/xfa_ffnotify.cpp | 611 ++ xfa/src/fxfa/src/app/xfa_ffnotify.h | 52 + xfa/src/fxfa/src/app/xfa_ffpageview.cpp | 428 ++ xfa/src/fxfa/src/app/xfa_ffpageview.h | 99 + xfa/src/fxfa/src/app/xfa_ffpath.cpp | 162 + xfa/src/fxfa/src/app/xfa_ffpath.h | 32 + xfa/src/fxfa/src/app/xfa_ffpushbutton.cpp | 252 + xfa/src/fxfa/src/app/xfa_ffpushbutton.h | 39 + xfa/src/fxfa/src/app/xfa_ffsignature.cpp | 129 + xfa/src/fxfa/src/app/xfa_ffsignature.h | 37 + xfa/src/fxfa/src/app/xfa_ffsubform.cpp | 20 + xfa/src/fxfa/src/app/xfa_ffsubform.h | 17 + xfa/src/fxfa/src/app/xfa_fftext.cpp | 188 + xfa/src/fxfa/src/app/xfa_fftext.h | 26 + xfa/src/fxfa/src/app/xfa_fftextedit.cpp | 830 +++ xfa/src/fxfa/src/app/xfa_fftextedit.h | 116 + xfa/src/fxfa/src/app/xfa_ffwidget.cpp | 1876 +++++ xfa/src/fxfa/src/app/xfa_ffwidget.h | 201 + xfa/src/fxfa/src/app/xfa_ffwidgetacc.cpp | 1713 +++++ xfa/src/fxfa/src/app/xfa_ffwidgetacc.h | 40 + xfa/src/fxfa/src/app/xfa_ffwidgethandler.cpp | 591 ++ xfa/src/fxfa/src/app/xfa_ffwidgethandler.h | 104 + xfa/src/fxfa/src/app/xfa_fontmgr.cpp | 1379 ++++ xfa/src/fxfa/src/app/xfa_fontmgr.h | 62 + xfa/src/fxfa/src/app/xfa_fwladapter.cpp | 80 + xfa/src/fxfa/src/app/xfa_fwladapter.h | 48 + xfa/src/fxfa/src/app/xfa_fwltheme.cpp | 412 ++ xfa/src/fxfa/src/app/xfa_fwltheme.h | 94 + xfa/src/fxfa/src/app/xfa_rendercontext.cpp | 74 + xfa/src/fxfa/src/app/xfa_rendercontext.h | 31 + xfa/src/fxfa/src/app/xfa_textlayout.cpp | 1927 ++++++ xfa/src/fxfa/src/app/xfa_textlayout.h | 391 ++ xfa/src/fxfa/src/common/fxfa_localevalue.h | 81 + xfa/src/fxfa/src/common/xfa_common.h | 19 + xfa/src/fxfa/src/common/xfa_debug.h | 9 + xfa/src/fxfa/src/common/xfa_docdata.h | 27 + xfa/src/fxfa/src/common/xfa_doclayout.h | 107 + xfa/src/fxfa/src/common/xfa_document.h | 177 + xfa/src/fxfa/src/common/xfa_fm2jsapi.h | 25 + xfa/src/fxfa/src/common/xfa_localemgr.h | 69 + xfa/src/fxfa/src/common/xfa_object.h | 588 ++ xfa/src/fxfa/src/common/xfa_parser.h | 37 + xfa/src/fxfa/src/common/xfa_script.h | 107 + xfa/src/fxfa/src/common/xfa_utils.h | 237 + xfa/src/fxfa/src/fm2js/xfa_error.cpp | 25 + xfa/src/fxfa/src/fm2js/xfa_error.h | 29 + xfa/src/fxfa/src/fm2js/xfa_expression.cpp | 715 ++ xfa/src/fxfa/src/fm2js/xfa_expression.h | 172 + xfa/src/fxfa/src/fm2js/xfa_fm2js.cpp | 7 + xfa/src/fxfa/src/fm2js/xfa_fm2js.h | 30 + xfa/src/fxfa/src/fm2js/xfa_fm2jsapi.cpp | 57 + xfa/src/fxfa/src/fm2js/xfa_fm2jscontext.cpp | 7185 ++++++++++++++++++++ xfa/src/fxfa/src/fm2js/xfa_fm2jscontext.h | 174 + xfa/src/fxfa/src/fm2js/xfa_fmparse.cpp | 1146 ++++ xfa/src/fxfa/src/fm2js/xfa_fmparse.h | 49 + xfa/src/fxfa/src/fm2js/xfa_lexer.cpp | 589 ++ xfa/src/fxfa/src/fm2js/xfa_lexer.h | 82 + xfa/src/fxfa/src/fm2js/xfa_program.cpp | 50 + xfa/src/fxfa/src/fm2js/xfa_program.h | 26 + xfa/src/fxfa/src/fm2js/xfa_simpleexpression.cpp | 758 +++ xfa/src/fxfa/src/fm2js/xfa_simpleexpression.h | 239 + xfa/src/fxfa/src/parser/xfa_basic_data.cpp | 1429 ++++ xfa/src/fxfa/src/parser/xfa_basic_imp.cpp | 634 ++ xfa/src/fxfa/src/parser/xfa_basic_imp.h | 73 + xfa/src/fxfa/src/parser/xfa_debug_parser.cpp | 18 + xfa/src/fxfa/src/parser/xfa_debug_parser.h | 9 + .../parser/xfa_document_datadescription_imp.cpp | 116 + .../src/parser/xfa_document_datadescription_imp.h | 11 + .../src/parser/xfa_document_datamerger_imp.cpp | 1267 ++++ .../fxfa/src/parser/xfa_document_datamerger_imp.h | 12 + xfa/src/fxfa/src/parser/xfa_document_imp.cpp | 418 ++ xfa/src/fxfa/src/parser/xfa_document_imp.h | 9 + .../fxfa/src/parser/xfa_document_layout_imp.cpp | 201 + xfa/src/fxfa/src/parser/xfa_document_layout_imp.h | 52 + xfa/src/fxfa/src/parser/xfa_document_serialize.cpp | 543 ++ xfa/src/fxfa/src/parser/xfa_document_serialize.h | 35 + xfa/src/fxfa/src/parser/xfa_layout_appadapter.cpp | 180 + xfa/src/fxfa/src/parser/xfa_layout_appadapter.h | 74 + xfa/src/fxfa/src/parser/xfa_layout_itemlayout.cpp | 2391 +++++++ xfa/src/fxfa/src/parser/xfa_layout_itemlayout.h | 132 + xfa/src/fxfa/src/parser/xfa_layout_pagemgr_new.cpp | 1680 +++++ xfa/src/fxfa/src/parser/xfa_layout_pagemgr_new.h | 102 + xfa/src/fxfa/src/parser/xfa_locale.cpp | 373 + xfa/src/fxfa/src/parser/xfa_locale.h | 61 + xfa/src/fxfa/src/parser/xfa_localemgr.cpp | 934 +++ xfa/src/fxfa/src/parser/xfa_localevalue.cpp | 976 +++ xfa/src/fxfa/src/parser/xfa_object_imp.cpp | 5125 ++++++++++++++ xfa/src/fxfa/src/parser/xfa_objectacc_imp.cpp | 4161 ++++++++++++ xfa/src/fxfa/src/parser/xfa_parser_imp.cpp | 1421 ++++ xfa/src/fxfa/src/parser/xfa_parser_imp.h | 137 + xfa/src/fxfa/src/parser/xfa_script_datawindow.cpp | 51 + xfa/src/fxfa/src/parser/xfa_script_datawindow.h | 23 + .../src/parser/xfa_script_eventpseudomodel.cpp | 218 + .../fxfa/src/parser/xfa_script_eventpseudomodel.h | 56 + .../fxfa/src/parser/xfa_script_hostpseudomodel.cpp | 754 ++ .../fxfa/src/parser/xfa_script_hostpseudomodel.h | 50 + xfa/src/fxfa/src/parser/xfa_script_imp.cpp | 750 ++ xfa/src/fxfa/src/parser/xfa_script_imp.h | 113 + .../src/parser/xfa_script_layoutpseudomodel.cpp | 524 ++ .../fxfa/src/parser/xfa_script_layoutpseudomodel.h | 48 + .../fxfa/src/parser/xfa_script_logpseudomodel.cpp | 42 + .../fxfa/src/parser/xfa_script_logpseudomodel.h | 21 + xfa/src/fxfa/src/parser/xfa_script_nodehelper.cpp | 393 ++ xfa/src/fxfa/src/parser/xfa_script_nodehelper.h | 41 + .../src/parser/xfa_script_resolveprocessor.cpp | 784 +++ .../fxfa/src/parser/xfa_script_resolveprocessor.h | 72 + .../src/parser/xfa_script_signaturepseudomodel.cpp | 122 + .../src/parser/xfa_script_signaturepseudomodel.h | 19 + xfa/src/fxfa/src/parser/xfa_utils_imp.cpp | 382 ++ xfa/src/fxgraphics/src/fx_graphics.cpp | 1670 +++++ xfa/src/fxgraphics/src/fx_metafile_interpreter.cpp | 281 + xfa/src/fxgraphics/src/fx_metafile_interpreter.h | 54 + xfa/src/fxgraphics/src/fx_path_generator.cpp | 222 + xfa/src/fxgraphics/src/fx_path_generator.h | 42 + xfa/src/fxgraphics/src/pre.h | 115 + xfa/src/fxjse/src/class.cpp | 268 + xfa/src/fxjse/src/class.h | 40 + xfa/src/fxjse/src/context.cpp | 224 + xfa/src/fxjse/src/context.h | 37 + xfa/src/fxjse/src/dynprop.cpp | 284 + xfa/src/fxjse/src/fxv8.h | 11 + xfa/src/fxjse/src/runtime.cpp | 118 + xfa/src/fxjse/src/runtime.h | 39 + xfa/src/fxjse/src/scope_inline.h | 86 + xfa/src/fxjse/src/util_inline.h | 44 + xfa/src/fxjse/src/value.cpp | 524 ++ xfa/src/fxjse/src/value.h | 236 + 627 files changed, 157868 insertions(+) create mode 100644 xfa/src/fdp/include/fde.h create mode 100644 xfa/src/fdp/include/fde_brs.h create mode 100644 xfa/src/fdp/include/fde_css.h create mode 100644 xfa/src/fdp/include/fde_img.h create mode 100644 xfa/src/fdp/include/fde_mem.h create mode 100644 xfa/src/fdp/include/fde_pen.h create mode 100644 xfa/src/fdp/include/fde_psr.h create mode 100644 xfa/src/fdp/include/fde_pth.h create mode 100644 xfa/src/fdp/include/fde_rdr.h create mode 100644 xfa/src/fdp/include/fde_rdv.h create mode 100644 xfa/src/fdp/include/fde_tto.h create mode 100644 xfa/src/fdp/include/fde_xml.h create mode 100644 xfa/src/fdp/src/css/fde_csscache.cpp create mode 100644 xfa/src/fdp/src/css/fde_csscache.h create mode 100644 xfa/src/fdp/src/css/fde_cssdatatable.cpp create mode 100644 xfa/src/fdp/src/css/fde_cssdatatable.h create mode 100644 xfa/src/fdp/src/css/fde_cssdeclaration.cpp create mode 100644 xfa/src/fdp/src/css/fde_cssdeclaration.h create mode 100644 xfa/src/fdp/src/css/fde_cssstyleselector.cpp create mode 100644 xfa/src/fdp/src/css/fde_cssstyleselector.h create mode 100644 xfa/src/fdp/src/css/fde_cssstylesheet.cpp create mode 100644 xfa/src/fdp/src/css/fde_cssstylesheet.h create mode 100644 xfa/src/fdp/src/css/fde_csssyntax.cpp create mode 100644 xfa/src/fdp/src/css/fde_csssyntax.h create mode 100644 xfa/src/fdp/src/fde/fde_devbasic.cpp create mode 100644 xfa/src/fdp/src/fde/fde_devbasic.h create mode 100644 xfa/src/fdp/src/fde/fde_gdidevice.cpp create mode 100644 xfa/src/fdp/src/fde/fde_gdidevice.h create mode 100644 xfa/src/fdp/src/fde/fde_gedevice.cpp create mode 100644 xfa/src/fdp/src/fde/fde_gedevice.h create mode 100644 xfa/src/fdp/src/fde/fde_geobject.cpp create mode 100644 xfa/src/fdp/src/fde/fde_geobject.h create mode 100644 xfa/src/fdp/src/fde/fde_iterator.cpp create mode 100644 xfa/src/fdp/src/fde/fde_iterator.h create mode 100644 xfa/src/fdp/src/fde/fde_object.cpp create mode 100644 xfa/src/fdp/src/fde/fde_object.h create mode 100644 xfa/src/fdp/src/fde/fde_render.cpp create mode 100644 xfa/src/fdp/src/fde/fde_render.h create mode 100644 xfa/src/fdp/src/tto/fde_textout.cpp create mode 100644 xfa/src/fdp/src/tto/fde_textout.h create mode 100644 xfa/src/fdp/src/xml/fde_xml.cpp create mode 100644 xfa/src/fdp/src/xml/fde_xml.h create mode 100644 xfa/src/fee/include/fx_wordbreak.h create mode 100644 xfa/src/fee/include/ifde_txtedtbuf.h create mode 100644 xfa/src/fee/include/ifde_txtedtengine.h create mode 100644 xfa/src/fee/include/ifde_txtedtpage.h create mode 100644 xfa/src/fee/src/fee/fde_txtedtblock.cpp create mode 100644 xfa/src/fee/src/fee/fde_txtedtblock.h create mode 100644 xfa/src/fee/src/fee/fde_txtedtbuf.cpp create mode 100644 xfa/src/fee/src/fee/fde_txtedtbuf.h create mode 100644 xfa/src/fee/src/fee/fde_txtedtengine.cpp create mode 100644 xfa/src/fee/src/fee/fde_txtedtengine.h create mode 100644 xfa/src/fee/src/fee/fde_txtedtkmpmatch.cpp create mode 100644 xfa/src/fee/src/fee/fde_txtedtkmpmatch.h create mode 100644 xfa/src/fee/src/fee/fde_txtedtpage.cpp create mode 100644 xfa/src/fee/src/fee/fde_txtedtpage.h create mode 100644 xfa/src/fee/src/fee/fde_txtedtparag.cpp create mode 100644 xfa/src/fee/src/fee/fde_txtedtparag.h create mode 100644 xfa/src/fee/src/fx_wordbreak/fx_wordbreak_impl.cpp create mode 100644 xfa/src/fee/src/fx_wordbreak/fx_wordbreak_impl.h create mode 100644 xfa/src/fee/src/fx_wordbreak/fx_wordbreakdata.cpp create mode 100644 xfa/src/fgas/include/fgas.h create mode 100644 xfa/src/fgas/include/fx_alg.h create mode 100644 xfa/src/fgas/include/fx_cpg.h create mode 100644 xfa/src/fgas/include/fx_datetime.h create mode 100644 xfa/src/fgas/include/fx_fnt.h create mode 100644 xfa/src/fgas/include/fx_lbk.h create mode 100644 xfa/src/fgas/include/fx_lgg.h create mode 100644 xfa/src/fgas/include/fx_locale.h create mode 100644 xfa/src/fgas/include/fx_mem.h create mode 100644 xfa/src/fgas/include/fx_rbk.h create mode 100644 xfa/src/fgas/include/fx_sax.h create mode 100644 xfa/src/fgas/include/fx_stm.h create mode 100644 xfa/src/fgas/include/fx_sys.h create mode 100644 xfa/src/fgas/include/fx_tbk.h create mode 100644 xfa/src/fgas/include/fx_ucd.h create mode 100644 xfa/src/fgas/include/fx_utl.h create mode 100644 xfa/src/fgas/src/crt/codepage/cpcu1250.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cpcu1251.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cpcu1252.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cpcu1253.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cpcu1254.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cpcu1255.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cpcu1256.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cpcu1257.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cpcu1258.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cpcu874.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cpcu932.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cpcu936.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cpcu949.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cpcu950.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cphi1250.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cphi1251.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cphi1252.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cphi1253.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cphi1254.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cphi1255.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cphi1256.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cphi1257.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cphi1258.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cphi874.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cphi932.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cphi936.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cphi949.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cphi950.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cpuc1250.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cpuc1251.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cpuc1252.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cpuc1253.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cpuc1254.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cpuc1255.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cpuc1256.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cpuc1257.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cpuc1258.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cpuc874.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cpuc932.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cpuc936.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cpuc949.cpp create mode 100644 xfa/src/fgas/src/crt/codepage/cpuc950.cpp create mode 100644 xfa/src/fgas/src/crt/fx_algorithm.cpp create mode 100644 xfa/src/fgas/src/crt/fx_codepage.cpp create mode 100644 xfa/src/fgas/src/crt/fx_codepage.h create mode 100644 xfa/src/fgas/src/crt/fx_cpmgr.cpp create mode 100644 xfa/src/fgas/src/crt/fx_encode.cpp create mode 100644 xfa/src/fgas/src/crt/fx_memory.cpp create mode 100644 xfa/src/fgas/src/crt/fx_memory.h create mode 100644 xfa/src/fgas/src/crt/fx_stream.cpp create mode 100644 xfa/src/fgas/src/crt/fx_stream.h create mode 100644 xfa/src/fgas/src/crt/fx_system.cpp create mode 100644 xfa/src/fgas/src/crt/fx_utils.cpp create mode 100644 xfa/src/fgas/src/crt/fx_utils.h create mode 100644 xfa/src/fgas/src/fgas_base.h create mode 100644 xfa/src/fgas/src/font/fx_fontutils.cpp create mode 100644 xfa/src/fgas/src/font/fx_fontutils.h create mode 100644 xfa/src/fgas/src/font/fx_gdifont.cpp create mode 100644 xfa/src/fgas/src/font/fx_gdifont.h create mode 100644 xfa/src/fgas/src/font/fx_gefont.cpp create mode 100644 xfa/src/fgas/src/font/fx_gefont.h create mode 100644 xfa/src/fgas/src/font/fx_stdfontmgr.cpp create mode 100644 xfa/src/fgas/src/font/fx_stdfontmgr.h create mode 100644 xfa/src/fgas/src/layout/fx_linebreak.cpp create mode 100644 xfa/src/fgas/src/layout/fx_rtfbreak.cpp create mode 100644 xfa/src/fgas/src/layout/fx_rtfbreak.h create mode 100644 xfa/src/fgas/src/layout/fx_textbreak.cpp create mode 100644 xfa/src/fgas/src/layout/fx_textbreak.h create mode 100644 xfa/src/fgas/src/layout/fx_unicode.cpp create mode 100644 xfa/src/fgas/src/layout/fx_unicode.h create mode 100644 xfa/src/fgas/src/localization/fx_datetime.cpp create mode 100644 xfa/src/fgas/src/localization/fx_locale.cpp create mode 100644 xfa/src/fgas/src/localization/fx_localeimp.h create mode 100644 xfa/src/fgas/src/localization/fx_localemgr.cpp create mode 100644 xfa/src/fgas/src/localization/fx_localemgr.h create mode 100644 xfa/src/fgas/src/xml/fx_sax_imp.cpp create mode 100644 xfa/src/fgas/src/xml/fx_sax_imp.h create mode 100644 xfa/src/foxitlib.h create mode 100644 xfa/src/fwl/src/basewidget/fwl_barcodeimp.cpp create mode 100644 xfa/src/fwl/src/basewidget/fwl_caretimp.cpp create mode 100644 xfa/src/fwl/src/basewidget/fwl_checkboximp.cpp create mode 100644 xfa/src/fwl/src/basewidget/fwl_comboboximp.cpp create mode 100644 xfa/src/fwl/src/basewidget/fwl_datetimepickerimp.cpp create mode 100644 xfa/src/fwl/src/basewidget/fwl_editimp.cpp create mode 100644 xfa/src/fwl/src/basewidget/fwl_formproxyimp.cpp create mode 100644 xfa/src/fwl/src/basewidget/fwl_listboximp.cpp create mode 100644 xfa/src/fwl/src/basewidget/fwl_monthcalendarimp.cpp create mode 100644 xfa/src/fwl/src/basewidget/fwl_pictureboximp.cpp create mode 100644 xfa/src/fwl/src/basewidget/fwl_pushbuttonimp.cpp create mode 100644 xfa/src/fwl/src/basewidget/fwl_scrollbarimp.cpp create mode 100644 xfa/src/fwl/src/basewidget/fwl_spinbuttonimp.cpp create mode 100644 xfa/src/fwl/src/basewidget/fwl_tooltipctrlimp.cpp create mode 100644 xfa/src/fwl/src/basewidget/fxmath_barcodeimp.cpp create mode 100644 xfa/src/fwl/src/basewidget/include/fwl_barcodeimp.h create mode 100644 xfa/src/fwl/src/basewidget/include/fwl_caretimp.h create mode 100644 xfa/src/fwl/src/basewidget/include/fwl_checkboximp.h create mode 100644 xfa/src/fwl/src/basewidget/include/fwl_comboboximp.h create mode 100644 xfa/src/fwl/src/basewidget/include/fwl_datetimepickerimp.h create mode 100644 xfa/src/fwl/src/basewidget/include/fwl_editimp.h create mode 100644 xfa/src/fwl/src/basewidget/include/fwl_formproxyimp.h create mode 100644 xfa/src/fwl/src/basewidget/include/fwl_listboximp.h create mode 100644 xfa/src/fwl/src/basewidget/include/fwl_monthcalendarimp.h create mode 100644 xfa/src/fwl/src/basewidget/include/fwl_pictureboximp.h create mode 100644 xfa/src/fwl/src/basewidget/include/fwl_pushbuttonimp.h create mode 100644 xfa/src/fwl/src/basewidget/include/fwl_scrollbarimp.h create mode 100644 xfa/src/fwl/src/basewidget/include/fwl_spinbuttonimp.h create mode 100644 xfa/src/fwl/src/basewidget/include/fwl_tooltipctrlimp.h create mode 100644 xfa/src/fwl/src/basewidget/include/fxmath_barcodeimp.h create mode 100644 xfa/src/fwl/src/core/fwl_appimp.cpp create mode 100644 xfa/src/fwl/src/core/fwl_contentimp.cpp create mode 100644 xfa/src/fwl/src/core/fwl_formimp.cpp create mode 100644 xfa/src/fwl/src/core/fwl_gridimp.cpp create mode 100644 xfa/src/fwl/src/core/fwl_noteimp.cpp create mode 100644 xfa/src/fwl/src/core/fwl_panelimp.cpp create mode 100644 xfa/src/fwl/src/core/fwl_sdadapterimp.cpp create mode 100644 xfa/src/fwl/src/core/fwl_targetimp.cpp create mode 100644 xfa/src/fwl/src/core/fwl_threadimp.cpp create mode 100644 xfa/src/fwl/src/core/fwl_timerimp.cpp create mode 100644 xfa/src/fwl/src/core/fwl_widgetimp.cpp create mode 100644 xfa/src/fwl/src/core/fwl_widgetmgrimp.cpp create mode 100644 xfa/src/fwl/src/core/include/fwl_appimp.h create mode 100644 xfa/src/fwl/src/core/include/fwl_contentimp.h create mode 100644 xfa/src/fwl/src/core/include/fwl_formimp.h create mode 100644 xfa/src/fwl/src/core/include/fwl_gridimp.h create mode 100644 xfa/src/fwl/src/core/include/fwl_noteimp.h create mode 100644 xfa/src/fwl/src/core/include/fwl_panelimp.h create mode 100644 xfa/src/fwl/src/core/include/fwl_targetimp.h create mode 100644 xfa/src/fwl/src/core/include/fwl_threadimp.h create mode 100644 xfa/src/fwl/src/core/include/fwl_widgetimp.h create mode 100644 xfa/src/fwl/src/core/include/fwl_widgetmgrimp.h create mode 100644 xfa/src/fwl/src/lightwidget/app.cpp create mode 100644 xfa/src/fwl/src/lightwidget/barcode.cpp create mode 100644 xfa/src/fwl/src/lightwidget/caret.cpp create mode 100644 xfa/src/fwl/src/lightwidget/checkbox.cpp create mode 100644 xfa/src/fwl/src/lightwidget/combobox.cpp create mode 100644 xfa/src/fwl/src/lightwidget/datetimepicker.cpp create mode 100644 xfa/src/fwl/src/lightwidget/edit.cpp create mode 100644 xfa/src/fwl/src/lightwidget/listbox.cpp create mode 100644 xfa/src/fwl/src/lightwidget/picturebox.cpp create mode 100644 xfa/src/fwl/src/lightwidget/pushbutton.cpp create mode 100644 xfa/src/fwl/src/lightwidget/scrollbar.cpp create mode 100644 xfa/src/fwl/src/lightwidget/theme.cpp create mode 100644 xfa/src/fwl/src/lightwidget/tooltipctrl.cpp create mode 100644 xfa/src/fwl/src/lightwidget/widget.cpp create mode 100644 xfa/src/fwl/src/theme/barcodetp.cpp create mode 100644 xfa/src/fwl/src/theme/carettp.cpp create mode 100644 xfa/src/fwl/src/theme/checkboxtp.cpp create mode 100644 xfa/src/fwl/src/theme/comboboxtp.cpp create mode 100644 xfa/src/fwl/src/theme/datetimepickertp.cpp create mode 100644 xfa/src/fwl/src/theme/edittp.cpp create mode 100644 xfa/src/fwl/src/theme/formtp.cpp create mode 100644 xfa/src/fwl/src/theme/listboxtp.cpp create mode 100644 xfa/src/fwl/src/theme/monthcalendartp.cpp create mode 100644 xfa/src/fwl/src/theme/pictureboxtp.cpp create mode 100644 xfa/src/fwl/src/theme/pushbuttontp.cpp create mode 100644 xfa/src/fwl/src/theme/scrollbartp.cpp create mode 100644 xfa/src/fwl/src/theme/widgettp.cpp create mode 100644 xfa/src/fxbarcode/src/BC_ASCIIEncoder.cpp create mode 100644 xfa/src/fxbarcode/src/BC_BarCode.cpp create mode 100644 xfa/src/fxbarcode/src/BC_Base256Encoder.cpp create mode 100644 xfa/src/fxbarcode/src/BC_Binarizer.cpp create mode 100644 xfa/src/fxbarcode/src/BC_BinaryBitmap.cpp create mode 100644 xfa/src/fxbarcode/src/BC_BufferedImageLuminanceSource.cpp create mode 100644 xfa/src/fxbarcode/src/BC_C40Encoder.cpp create mode 100644 xfa/src/fxbarcode/src/BC_CommonBitArray.cpp create mode 100644 xfa/src/fxbarcode/src/BC_CommonBitMatrix.cpp create mode 100644 xfa/src/fxbarcode/src/BC_CommonBitSource.cpp create mode 100644 xfa/src/fxbarcode/src/BC_CommonByteArray.cpp create mode 100644 xfa/src/fxbarcode/src/BC_CommonByteMatrix.cpp create mode 100644 xfa/src/fxbarcode/src/BC_CommonCharacterSetECI.cpp create mode 100644 xfa/src/fxbarcode/src/BC_CommonDecoderResult.cpp create mode 100644 xfa/src/fxbarcode/src/BC_CommonECI.cpp create mode 100644 xfa/src/fxbarcode/src/BC_CommonPerspectiveTransform.cpp create mode 100644 xfa/src/fxbarcode/src/BC_DataMatrixBitMatrixParser.cpp create mode 100644 xfa/src/fxbarcode/src/BC_DataMatrixDataBlock.cpp create mode 100644 xfa/src/fxbarcode/src/BC_DataMatrixDecodedBitStreamParser.cpp create mode 100644 xfa/src/fxbarcode/src/BC_DataMatrixDecoder.cpp create mode 100644 xfa/src/fxbarcode/src/BC_DataMatrixDetector.cpp create mode 100644 xfa/src/fxbarcode/src/BC_DataMatrixReader.cpp create mode 100644 xfa/src/fxbarcode/src/BC_DataMatrixSymbolInfo144.cpp create mode 100644 xfa/src/fxbarcode/src/BC_DataMatrixVersion.cpp create mode 100644 xfa/src/fxbarcode/src/BC_DataMatrixWriter.cpp create mode 100644 xfa/src/fxbarcode/src/BC_DefaultPlacement.cpp create mode 100644 xfa/src/fxbarcode/src/BC_Dimension.cpp create mode 100644 xfa/src/fxbarcode/src/BC_EdifactEncoder.cpp create mode 100644 xfa/src/fxbarcode/src/BC_Encoder.cpp create mode 100644 xfa/src/fxbarcode/src/BC_EncoderContext.cpp create mode 100644 xfa/src/fxbarcode/src/BC_ErrorCorrection.cpp create mode 100644 xfa/src/fxbarcode/src/BC_FinderPatternInfo.cpp create mode 100644 xfa/src/fxbarcode/src/BC_GlobalHistogramBinarizer.cpp create mode 100644 xfa/src/fxbarcode/src/BC_HighLevelEncoder.cpp create mode 100644 xfa/src/fxbarcode/src/BC_Library.cpp create mode 100644 xfa/src/fxbarcode/src/BC_LuminanceSource.cpp create mode 100644 xfa/src/fxbarcode/src/BC_OneDReader.cpp create mode 100644 xfa/src/fxbarcode/src/BC_OneDimReader.cpp create mode 100644 xfa/src/fxbarcode/src/BC_OneDimWriter.cpp create mode 100644 xfa/src/fxbarcode/src/BC_OnedCodaBarReader.cpp create mode 100644 xfa/src/fxbarcode/src/BC_OnedCodaBarWriter.cpp create mode 100644 xfa/src/fxbarcode/src/BC_OnedCode128Reader.cpp create mode 100644 xfa/src/fxbarcode/src/BC_OnedCode128Writer.cpp create mode 100644 xfa/src/fxbarcode/src/BC_OnedCode39Reader.cpp create mode 100644 xfa/src/fxbarcode/src/BC_OnedCode39Writer.cpp create mode 100644 xfa/src/fxbarcode/src/BC_OnedEAN13Reader.cpp create mode 100644 xfa/src/fxbarcode/src/BC_OnedEAN13Writer.cpp create mode 100644 xfa/src/fxbarcode/src/BC_OnedEAN8Reader.cpp create mode 100644 xfa/src/fxbarcode/src/BC_OnedEAN8Writer.cpp create mode 100644 xfa/src/fxbarcode/src/BC_OnedUPCAReader.cpp create mode 100644 xfa/src/fxbarcode/src/BC_OnedUPCAWriter.cpp create mode 100644 xfa/src/fxbarcode/src/BC_PDF417.cpp create mode 100644 xfa/src/fxbarcode/src/BC_PDF417BarcodeMatrix.cpp create mode 100644 xfa/src/fxbarcode/src/BC_PDF417BarcodeMetadata.cpp create mode 100644 xfa/src/fxbarcode/src/BC_PDF417BarcodeRow.cpp create mode 100644 xfa/src/fxbarcode/src/BC_PDF417BarcodeValue.cpp create mode 100644 xfa/src/fxbarcode/src/BC_PDF417BoundingBox.cpp create mode 100644 xfa/src/fxbarcode/src/BC_PDF417Codeword.cpp create mode 100644 xfa/src/fxbarcode/src/BC_PDF417CodewordDecoder.cpp create mode 100644 xfa/src/fxbarcode/src/BC_PDF417Common.cpp create mode 100644 xfa/src/fxbarcode/src/BC_PDF417Compaction.cpp create mode 100644 xfa/src/fxbarcode/src/BC_PDF417DecodedBitStreamParser.cpp create mode 100644 xfa/src/fxbarcode/src/BC_PDF417DetectionResult.cpp create mode 100644 xfa/src/fxbarcode/src/BC_PDF417DetectionResultColumn.cpp create mode 100644 xfa/src/fxbarcode/src/BC_PDF417DetectionResultRowIndicatorColumn.cpp create mode 100644 xfa/src/fxbarcode/src/BC_PDF417Detector.cpp create mode 100644 xfa/src/fxbarcode/src/BC_PDF417DetectorResult.cpp create mode 100644 xfa/src/fxbarcode/src/BC_PDF417Dimensions.cpp create mode 100644 xfa/src/fxbarcode/src/BC_PDF417ECErrorCorrection.cpp create mode 100644 xfa/src/fxbarcode/src/BC_PDF417ECModulusGF.cpp create mode 100644 xfa/src/fxbarcode/src/BC_PDF417ECModulusPoly.cpp create mode 100644 xfa/src/fxbarcode/src/BC_PDF417ErrorCorrection.cpp create mode 100644 xfa/src/fxbarcode/src/BC_PDF417HighLevelEncoder.cpp create mode 100644 xfa/src/fxbarcode/src/BC_PDF417Reader.cpp create mode 100644 xfa/src/fxbarcode/src/BC_PDF417ResultMetadata.cpp create mode 100644 xfa/src/fxbarcode/src/BC_PDF417ScanningDecoder.cpp create mode 100644 xfa/src/fxbarcode/src/BC_PDF417Writer.cpp create mode 100644 xfa/src/fxbarcode/src/BC_QRAlignmentPattern.cpp create mode 100644 xfa/src/fxbarcode/src/BC_QRAlignmentPatternFinder.cpp create mode 100644 xfa/src/fxbarcode/src/BC_QRBitMatrixParser.cpp create mode 100644 xfa/src/fxbarcode/src/BC_QRCodeReader.cpp create mode 100644 xfa/src/fxbarcode/src/BC_QRCodeWriter.cpp create mode 100644 xfa/src/fxbarcode/src/BC_QRCoder.cpp create mode 100644 xfa/src/fxbarcode/src/BC_QRCoderBitVector.cpp create mode 100644 xfa/src/fxbarcode/src/BC_QRCoderBlockPair.cpp create mode 100644 xfa/src/fxbarcode/src/BC_QRCoderDecoder.cpp create mode 100644 xfa/src/fxbarcode/src/BC_QRCoderECB.cpp create mode 100644 xfa/src/fxbarcode/src/BC_QRCoderECBlocks.cpp create mode 100644 xfa/src/fxbarcode/src/BC_QRCoderEncoder.cpp create mode 100644 xfa/src/fxbarcode/src/BC_QRCoderErrorCorrectionLevel.cpp create mode 100644 xfa/src/fxbarcode/src/BC_QRCoderFormatInformation.cpp create mode 100644 xfa/src/fxbarcode/src/BC_QRCoderMaskUtil.cpp create mode 100644 xfa/src/fxbarcode/src/BC_QRCoderMatrixUtil.cpp create mode 100644 xfa/src/fxbarcode/src/BC_QRCoderMode.cpp create mode 100644 xfa/src/fxbarcode/src/BC_QRCoderVersion.cpp create mode 100644 xfa/src/fxbarcode/src/BC_QRDataBlock.cpp create mode 100644 xfa/src/fxbarcode/src/BC_QRDataMask.cpp create mode 100644 xfa/src/fxbarcode/src/BC_QRDecodedBitStreamParser.cpp create mode 100644 xfa/src/fxbarcode/src/BC_QRDetector.cpp create mode 100644 xfa/src/fxbarcode/src/BC_QRDetectorResult.cpp create mode 100644 xfa/src/fxbarcode/src/BC_QRFinderPattern.cpp create mode 100644 xfa/src/fxbarcode/src/BC_QRFinderPatternFinder.cpp create mode 100644 xfa/src/fxbarcode/src/BC_QRGridSampler.cpp create mode 100644 xfa/src/fxbarcode/src/BC_Reader.cpp create mode 100644 xfa/src/fxbarcode/src/BC_ReedSolomon.cpp create mode 100644 xfa/src/fxbarcode/src/BC_ReedSolomonDecoder.cpp create mode 100644 xfa/src/fxbarcode/src/BC_ReedSolomonGF256.cpp create mode 100644 xfa/src/fxbarcode/src/BC_ReedSolomonGF256Poly.cpp create mode 100644 xfa/src/fxbarcode/src/BC_ResultPoint.cpp create mode 100644 xfa/src/fxbarcode/src/BC_SymbolInfo.cpp create mode 100644 xfa/src/fxbarcode/src/BC_SymbolShapeHint.cpp create mode 100644 xfa/src/fxbarcode/src/BC_TextEncoder.cpp create mode 100644 xfa/src/fxbarcode/src/BC_TwoDimWriter.cpp create mode 100644 xfa/src/fxbarcode/src/BC_UtilCodingConvert.cpp create mode 100644 xfa/src/fxbarcode/src/BC_UtilRSS.cpp create mode 100644 xfa/src/fxbarcode/src/BC_Utils.cpp create mode 100644 xfa/src/fxbarcode/src/BC_WhiteRectangleDetector.cpp create mode 100644 xfa/src/fxbarcode/src/BC_Writer.cpp create mode 100644 xfa/src/fxbarcode/src/BC_X12Encoder.cpp create mode 100644 xfa/src/fxbarcode/src/barcode.h create mode 100644 xfa/src/fxbarcode/src/include/BC_ASCIIEncoder.h create mode 100644 xfa/src/fxbarcode/src/include/BC_Base256Encoder.h create mode 100644 xfa/src/fxbarcode/src/include/BC_Binarizer.h create mode 100644 xfa/src/fxbarcode/src/include/BC_BinaryBitmap.h create mode 100644 xfa/src/fxbarcode/src/include/BC_BufferedImageLuminanceSource.h create mode 100644 xfa/src/fxbarcode/src/include/BC_C40Encoder.h create mode 100644 xfa/src/fxbarcode/src/include/BC_CommonBitArray.h create mode 100644 xfa/src/fxbarcode/src/include/BC_CommonBitMatrix.h create mode 100644 xfa/src/fxbarcode/src/include/BC_CommonBitSource.h create mode 100644 xfa/src/fxbarcode/src/include/BC_CommonByteArray.h create mode 100644 xfa/src/fxbarcode/src/include/BC_CommonByteMatrix.h create mode 100644 xfa/src/fxbarcode/src/include/BC_CommonCharacterSetECI.h create mode 100644 xfa/src/fxbarcode/src/include/BC_CommonDecoderResult.h create mode 100644 xfa/src/fxbarcode/src/include/BC_CommonECI.h create mode 100644 xfa/src/fxbarcode/src/include/BC_CommonPerspectiveTransform.h create mode 100644 xfa/src/fxbarcode/src/include/BC_DataMatrixBitMatrixParser.h create mode 100644 xfa/src/fxbarcode/src/include/BC_DataMatrixDataBlock.h create mode 100644 xfa/src/fxbarcode/src/include/BC_DataMatrixDecodedBitStreamParser.h create mode 100644 xfa/src/fxbarcode/src/include/BC_DataMatrixDecoder.h create mode 100644 xfa/src/fxbarcode/src/include/BC_DataMatrixDetector.h create mode 100644 xfa/src/fxbarcode/src/include/BC_DataMatrixReader.h create mode 100644 xfa/src/fxbarcode/src/include/BC_DataMatrixSymbolInfo144.h create mode 100644 xfa/src/fxbarcode/src/include/BC_DataMatrixVersion.h create mode 100644 xfa/src/fxbarcode/src/include/BC_DataMatrixWriter.h create mode 100644 xfa/src/fxbarcode/src/include/BC_DecoderResult.h create mode 100644 xfa/src/fxbarcode/src/include/BC_DefaultPlacement.h create mode 100644 xfa/src/fxbarcode/src/include/BC_Dimension.h create mode 100644 xfa/src/fxbarcode/src/include/BC_EdifactEncoder.h create mode 100644 xfa/src/fxbarcode/src/include/BC_Encoder.h create mode 100644 xfa/src/fxbarcode/src/include/BC_EncoderContext.h create mode 100644 xfa/src/fxbarcode/src/include/BC_ErrorCorrection.h create mode 100644 xfa/src/fxbarcode/src/include/BC_FinderPatternInfo.h create mode 100644 xfa/src/fxbarcode/src/include/BC_GlobalHistogramBinarizer.h create mode 100644 xfa/src/fxbarcode/src/include/BC_HighLevelEncoder.h create mode 100644 xfa/src/fxbarcode/src/include/BC_LuminanceSource.h create mode 100644 xfa/src/fxbarcode/src/include/BC_OneDReader.h create mode 100644 xfa/src/fxbarcode/src/include/BC_OneDimReader.h create mode 100644 xfa/src/fxbarcode/src/include/BC_OneDimWriter.h create mode 100644 xfa/src/fxbarcode/src/include/BC_OnedCodaBarReader.h create mode 100644 xfa/src/fxbarcode/src/include/BC_OnedCodaBarWriter.h create mode 100644 xfa/src/fxbarcode/src/include/BC_OnedCode128Reader.h create mode 100644 xfa/src/fxbarcode/src/include/BC_OnedCode128Writer.h create mode 100644 xfa/src/fxbarcode/src/include/BC_OnedCode39Reader.h create mode 100644 xfa/src/fxbarcode/src/include/BC_OnedCode39Writer.h create mode 100644 xfa/src/fxbarcode/src/include/BC_OnedEAN13Reader.h create mode 100644 xfa/src/fxbarcode/src/include/BC_OnedEAN13Writer.h create mode 100644 xfa/src/fxbarcode/src/include/BC_OnedEAN8Reader.h create mode 100644 xfa/src/fxbarcode/src/include/BC_OnedEAN8Writer.h create mode 100644 xfa/src/fxbarcode/src/include/BC_OnedUPCAReader.h create mode 100644 xfa/src/fxbarcode/src/include/BC_OnedUPCAWriter.h create mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417.h create mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417BarcodeMatrix.h create mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417BarcodeMetadata.h create mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417BarcodeRow.h create mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417BarcodeValue.h create mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417BoundingBox.h create mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417Codeword.h create mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417CodewordDecoder.h create mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417Common.h create mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417Compaction.h create mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417DecodedBitStreamParser.h create mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417DetectionResult.h create mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417DetectionResultColumn.h create mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417DetectionResultRowIndicatorColumn.h create mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417Detector.h create mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417DetectorResult.h create mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417Dimensions.h create mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417ECErrorCorrection.h create mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417ECModulusGF.h create mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417ECModulusPoly.h create mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417ErrorCorrection.h create mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417HighLevelEncoder.h create mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417Reader.h create mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417ResultMetadata.h create mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417ScanningDecoder.h create mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417Writer.h create mode 100644 xfa/src/fxbarcode/src/include/BC_QRAlignmentPattern.h create mode 100644 xfa/src/fxbarcode/src/include/BC_QRAlignmentPatternFinder.h create mode 100644 xfa/src/fxbarcode/src/include/BC_QRBitMatrixParser.h create mode 100644 xfa/src/fxbarcode/src/include/BC_QRCodeReader.h create mode 100644 xfa/src/fxbarcode/src/include/BC_QRCodeWriter.h create mode 100644 xfa/src/fxbarcode/src/include/BC_QRCoder.h create mode 100644 xfa/src/fxbarcode/src/include/BC_QRCoderBitVector.h create mode 100644 xfa/src/fxbarcode/src/include/BC_QRCoderBlockPair.h create mode 100644 xfa/src/fxbarcode/src/include/BC_QRCoderDecoder.h create mode 100644 xfa/src/fxbarcode/src/include/BC_QRCoderECB.h create mode 100644 xfa/src/fxbarcode/src/include/BC_QRCoderECBlocks.h create mode 100644 xfa/src/fxbarcode/src/include/BC_QRCoderEncoder.h create mode 100644 xfa/src/fxbarcode/src/include/BC_QRCoderErrorCorrectionLevel.h create mode 100644 xfa/src/fxbarcode/src/include/BC_QRCoderFormatInformation.h create mode 100644 xfa/src/fxbarcode/src/include/BC_QRCoderMaskUtil.h create mode 100644 xfa/src/fxbarcode/src/include/BC_QRCoderMatrixUtil.h create mode 100644 xfa/src/fxbarcode/src/include/BC_QRCoderMode.h create mode 100644 xfa/src/fxbarcode/src/include/BC_QRCoderVersion.h create mode 100644 xfa/src/fxbarcode/src/include/BC_QRDataBlock.h create mode 100644 xfa/src/fxbarcode/src/include/BC_QRDataMask.h create mode 100644 xfa/src/fxbarcode/src/include/BC_QRDecodedBitStreamParser.h create mode 100644 xfa/src/fxbarcode/src/include/BC_QRDetector.h create mode 100644 xfa/src/fxbarcode/src/include/BC_QRDetectorResult.h create mode 100644 xfa/src/fxbarcode/src/include/BC_QRFinderPattern.h create mode 100644 xfa/src/fxbarcode/src/include/BC_QRFinderPatternFinder.h create mode 100644 xfa/src/fxbarcode/src/include/BC_QRGridSampler.h create mode 100644 xfa/src/fxbarcode/src/include/BC_Reader.h create mode 100644 xfa/src/fxbarcode/src/include/BC_ReedSolomon.h create mode 100644 xfa/src/fxbarcode/src/include/BC_ReedSolomonDecoder.h create mode 100644 xfa/src/fxbarcode/src/include/BC_ReedSolomonGF256.h create mode 100644 xfa/src/fxbarcode/src/include/BC_ReedSolomonGF256Poly.h create mode 100644 xfa/src/fxbarcode/src/include/BC_ResultPoint.h create mode 100644 xfa/src/fxbarcode/src/include/BC_SymbolInfo.h create mode 100644 xfa/src/fxbarcode/src/include/BC_SymbolShapeHint.h create mode 100644 xfa/src/fxbarcode/src/include/BC_TextEncoder.h create mode 100644 xfa/src/fxbarcode/src/include/BC_TwoDimWriter.h create mode 100644 xfa/src/fxbarcode/src/include/BC_UtilCodingConvert.h create mode 100644 xfa/src/fxbarcode/src/include/BC_UtilRSS.h create mode 100644 xfa/src/fxbarcode/src/include/BC_WhiteRectangleDetector.h create mode 100644 xfa/src/fxbarcode/src/include/BC_Writer.h create mode 100644 xfa/src/fxbarcode/src/include/BC_X12Encoder.h create mode 100644 xfa/src/fxbarcode/src/include/utils.h create mode 100644 xfa/src/fxfa/src/app/xfa_checksum.cpp create mode 100644 xfa/src/fxfa/src/app/xfa_checksum.h create mode 100644 xfa/src/fxfa/src/app/xfa_ffConfigAcc.cpp create mode 100644 xfa/src/fxfa/src/app/xfa_ffConfigAcc.h create mode 100644 xfa/src/fxfa/src/app/xfa_ffapp.cpp create mode 100644 xfa/src/fxfa/src/app/xfa_ffapp.h create mode 100644 xfa/src/fxfa/src/app/xfa_ffbarcode.cpp create mode 100644 xfa/src/fxfa/src/app/xfa_ffbarcode.h create mode 100644 xfa/src/fxfa/src/app/xfa_ffcheckbutton.cpp create mode 100644 xfa/src/fxfa/src/app/xfa_ffcheckbutton.h create mode 100644 xfa/src/fxfa/src/app/xfa_ffchoicelist.cpp create mode 100644 xfa/src/fxfa/src/app/xfa_ffchoicelist.h create mode 100644 xfa/src/fxfa/src/app/xfa_ffdoc.cpp create mode 100644 xfa/src/fxfa/src/app/xfa_ffdoc.h create mode 100644 xfa/src/fxfa/src/app/xfa_ffdochandler.cpp create mode 100644 xfa/src/fxfa/src/app/xfa_ffdochandler.h create mode 100644 xfa/src/fxfa/src/app/xfa_ffdocview.cpp create mode 100644 xfa/src/fxfa/src/app/xfa_ffdocview.h create mode 100644 xfa/src/fxfa/src/app/xfa_ffdraw.cpp create mode 100644 xfa/src/fxfa/src/app/xfa_ffdraw.h create mode 100644 xfa/src/fxfa/src/app/xfa_ffexclgroup.cpp create mode 100644 xfa/src/fxfa/src/app/xfa_ffexclgroup.h create mode 100644 xfa/src/fxfa/src/app/xfa_fffield.cpp create mode 100644 xfa/src/fxfa/src/app/xfa_fffield.h create mode 100644 xfa/src/fxfa/src/app/xfa_ffimage.cpp create mode 100644 xfa/src/fxfa/src/app/xfa_ffimage.h create mode 100644 xfa/src/fxfa/src/app/xfa_ffimageedit.cpp create mode 100644 xfa/src/fxfa/src/app/xfa_ffimageedit.h create mode 100644 xfa/src/fxfa/src/app/xfa_ffnotify.cpp create mode 100644 xfa/src/fxfa/src/app/xfa_ffnotify.h create mode 100644 xfa/src/fxfa/src/app/xfa_ffpageview.cpp create mode 100644 xfa/src/fxfa/src/app/xfa_ffpageview.h create mode 100644 xfa/src/fxfa/src/app/xfa_ffpath.cpp create mode 100644 xfa/src/fxfa/src/app/xfa_ffpath.h create mode 100644 xfa/src/fxfa/src/app/xfa_ffpushbutton.cpp create mode 100644 xfa/src/fxfa/src/app/xfa_ffpushbutton.h create mode 100644 xfa/src/fxfa/src/app/xfa_ffsignature.cpp create mode 100644 xfa/src/fxfa/src/app/xfa_ffsignature.h create mode 100644 xfa/src/fxfa/src/app/xfa_ffsubform.cpp create mode 100644 xfa/src/fxfa/src/app/xfa_ffsubform.h create mode 100644 xfa/src/fxfa/src/app/xfa_fftext.cpp create mode 100644 xfa/src/fxfa/src/app/xfa_fftext.h create mode 100644 xfa/src/fxfa/src/app/xfa_fftextedit.cpp create mode 100644 xfa/src/fxfa/src/app/xfa_fftextedit.h create mode 100644 xfa/src/fxfa/src/app/xfa_ffwidget.cpp create mode 100644 xfa/src/fxfa/src/app/xfa_ffwidget.h create mode 100644 xfa/src/fxfa/src/app/xfa_ffwidgetacc.cpp create mode 100644 xfa/src/fxfa/src/app/xfa_ffwidgetacc.h create mode 100644 xfa/src/fxfa/src/app/xfa_ffwidgethandler.cpp create mode 100644 xfa/src/fxfa/src/app/xfa_ffwidgethandler.h create mode 100644 xfa/src/fxfa/src/app/xfa_fontmgr.cpp create mode 100644 xfa/src/fxfa/src/app/xfa_fontmgr.h create mode 100644 xfa/src/fxfa/src/app/xfa_fwladapter.cpp create mode 100644 xfa/src/fxfa/src/app/xfa_fwladapter.h create mode 100644 xfa/src/fxfa/src/app/xfa_fwltheme.cpp create mode 100644 xfa/src/fxfa/src/app/xfa_fwltheme.h create mode 100644 xfa/src/fxfa/src/app/xfa_rendercontext.cpp create mode 100644 xfa/src/fxfa/src/app/xfa_rendercontext.h create mode 100644 xfa/src/fxfa/src/app/xfa_textlayout.cpp create mode 100644 xfa/src/fxfa/src/app/xfa_textlayout.h create mode 100644 xfa/src/fxfa/src/common/fxfa_localevalue.h create mode 100644 xfa/src/fxfa/src/common/xfa_common.h create mode 100644 xfa/src/fxfa/src/common/xfa_debug.h create mode 100644 xfa/src/fxfa/src/common/xfa_docdata.h create mode 100644 xfa/src/fxfa/src/common/xfa_doclayout.h create mode 100644 xfa/src/fxfa/src/common/xfa_document.h create mode 100644 xfa/src/fxfa/src/common/xfa_fm2jsapi.h create mode 100644 xfa/src/fxfa/src/common/xfa_localemgr.h create mode 100644 xfa/src/fxfa/src/common/xfa_object.h create mode 100644 xfa/src/fxfa/src/common/xfa_parser.h create mode 100644 xfa/src/fxfa/src/common/xfa_script.h create mode 100644 xfa/src/fxfa/src/common/xfa_utils.h create mode 100644 xfa/src/fxfa/src/fm2js/xfa_error.cpp create mode 100644 xfa/src/fxfa/src/fm2js/xfa_error.h create mode 100644 xfa/src/fxfa/src/fm2js/xfa_expression.cpp create mode 100644 xfa/src/fxfa/src/fm2js/xfa_expression.h create mode 100644 xfa/src/fxfa/src/fm2js/xfa_fm2js.cpp create mode 100644 xfa/src/fxfa/src/fm2js/xfa_fm2js.h create mode 100644 xfa/src/fxfa/src/fm2js/xfa_fm2jsapi.cpp create mode 100644 xfa/src/fxfa/src/fm2js/xfa_fm2jscontext.cpp create mode 100644 xfa/src/fxfa/src/fm2js/xfa_fm2jscontext.h create mode 100644 xfa/src/fxfa/src/fm2js/xfa_fmparse.cpp create mode 100644 xfa/src/fxfa/src/fm2js/xfa_fmparse.h create mode 100644 xfa/src/fxfa/src/fm2js/xfa_lexer.cpp create mode 100644 xfa/src/fxfa/src/fm2js/xfa_lexer.h create mode 100644 xfa/src/fxfa/src/fm2js/xfa_program.cpp create mode 100644 xfa/src/fxfa/src/fm2js/xfa_program.h create mode 100644 xfa/src/fxfa/src/fm2js/xfa_simpleexpression.cpp create mode 100644 xfa/src/fxfa/src/fm2js/xfa_simpleexpression.h create mode 100644 xfa/src/fxfa/src/parser/xfa_basic_data.cpp create mode 100644 xfa/src/fxfa/src/parser/xfa_basic_imp.cpp create mode 100644 xfa/src/fxfa/src/parser/xfa_basic_imp.h create mode 100644 xfa/src/fxfa/src/parser/xfa_debug_parser.cpp create mode 100644 xfa/src/fxfa/src/parser/xfa_debug_parser.h create mode 100644 xfa/src/fxfa/src/parser/xfa_document_datadescription_imp.cpp create mode 100644 xfa/src/fxfa/src/parser/xfa_document_datadescription_imp.h create mode 100644 xfa/src/fxfa/src/parser/xfa_document_datamerger_imp.cpp create mode 100644 xfa/src/fxfa/src/parser/xfa_document_datamerger_imp.h create mode 100644 xfa/src/fxfa/src/parser/xfa_document_imp.cpp create mode 100644 xfa/src/fxfa/src/parser/xfa_document_imp.h create mode 100644 xfa/src/fxfa/src/parser/xfa_document_layout_imp.cpp create mode 100644 xfa/src/fxfa/src/parser/xfa_document_layout_imp.h create mode 100644 xfa/src/fxfa/src/parser/xfa_document_serialize.cpp create mode 100644 xfa/src/fxfa/src/parser/xfa_document_serialize.h create mode 100644 xfa/src/fxfa/src/parser/xfa_layout_appadapter.cpp create mode 100644 xfa/src/fxfa/src/parser/xfa_layout_appadapter.h create mode 100644 xfa/src/fxfa/src/parser/xfa_layout_itemlayout.cpp create mode 100644 xfa/src/fxfa/src/parser/xfa_layout_itemlayout.h create mode 100644 xfa/src/fxfa/src/parser/xfa_layout_pagemgr_new.cpp create mode 100644 xfa/src/fxfa/src/parser/xfa_layout_pagemgr_new.h create mode 100644 xfa/src/fxfa/src/parser/xfa_locale.cpp create mode 100644 xfa/src/fxfa/src/parser/xfa_locale.h create mode 100644 xfa/src/fxfa/src/parser/xfa_localemgr.cpp create mode 100644 xfa/src/fxfa/src/parser/xfa_localevalue.cpp create mode 100644 xfa/src/fxfa/src/parser/xfa_object_imp.cpp create mode 100644 xfa/src/fxfa/src/parser/xfa_objectacc_imp.cpp create mode 100644 xfa/src/fxfa/src/parser/xfa_parser_imp.cpp create mode 100644 xfa/src/fxfa/src/parser/xfa_parser_imp.h create mode 100644 xfa/src/fxfa/src/parser/xfa_script_datawindow.cpp create mode 100644 xfa/src/fxfa/src/parser/xfa_script_datawindow.h create mode 100644 xfa/src/fxfa/src/parser/xfa_script_eventpseudomodel.cpp create mode 100644 xfa/src/fxfa/src/parser/xfa_script_eventpseudomodel.h create mode 100644 xfa/src/fxfa/src/parser/xfa_script_hostpseudomodel.cpp create mode 100644 xfa/src/fxfa/src/parser/xfa_script_hostpseudomodel.h create mode 100644 xfa/src/fxfa/src/parser/xfa_script_imp.cpp create mode 100644 xfa/src/fxfa/src/parser/xfa_script_imp.h create mode 100644 xfa/src/fxfa/src/parser/xfa_script_layoutpseudomodel.cpp create mode 100644 xfa/src/fxfa/src/parser/xfa_script_layoutpseudomodel.h create mode 100644 xfa/src/fxfa/src/parser/xfa_script_logpseudomodel.cpp create mode 100644 xfa/src/fxfa/src/parser/xfa_script_logpseudomodel.h create mode 100644 xfa/src/fxfa/src/parser/xfa_script_nodehelper.cpp create mode 100644 xfa/src/fxfa/src/parser/xfa_script_nodehelper.h create mode 100644 xfa/src/fxfa/src/parser/xfa_script_resolveprocessor.cpp create mode 100644 xfa/src/fxfa/src/parser/xfa_script_resolveprocessor.h create mode 100644 xfa/src/fxfa/src/parser/xfa_script_signaturepseudomodel.cpp create mode 100644 xfa/src/fxfa/src/parser/xfa_script_signaturepseudomodel.h create mode 100644 xfa/src/fxfa/src/parser/xfa_utils_imp.cpp create mode 100644 xfa/src/fxgraphics/src/fx_graphics.cpp create mode 100644 xfa/src/fxgraphics/src/fx_metafile_interpreter.cpp create mode 100644 xfa/src/fxgraphics/src/fx_metafile_interpreter.h create mode 100644 xfa/src/fxgraphics/src/fx_path_generator.cpp create mode 100644 xfa/src/fxgraphics/src/fx_path_generator.h create mode 100644 xfa/src/fxgraphics/src/pre.h create mode 100644 xfa/src/fxjse/src/class.cpp create mode 100644 xfa/src/fxjse/src/class.h create mode 100644 xfa/src/fxjse/src/context.cpp create mode 100644 xfa/src/fxjse/src/context.h create mode 100644 xfa/src/fxjse/src/dynprop.cpp create mode 100644 xfa/src/fxjse/src/fxv8.h create mode 100644 xfa/src/fxjse/src/runtime.cpp create mode 100644 xfa/src/fxjse/src/runtime.h create mode 100644 xfa/src/fxjse/src/scope_inline.h create mode 100644 xfa/src/fxjse/src/util_inline.h create mode 100644 xfa/src/fxjse/src/value.cpp create mode 100644 xfa/src/fxjse/src/value.h (limited to 'xfa/src') diff --git a/xfa/src/fdp/include/fde.h b/xfa/src/fdp/include/fde.h new file mode 100644 index 0000000000..1e2c311188 --- /dev/null +++ b/xfa/src/fdp/include/fde.h @@ -0,0 +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 _FDE +#define _FDE +#include "fde_mem.h" +#include "fde_xml.h" +#include "fde_img.h" +#include "fde_brs.h" +#include "fde_pen.h" +#include "fde_pth.h" +#include "fde_tto.h" +#include "fde_psr.h" +#include "fde_css.h" +#include "fde_rdv.h" +#include "fde_rdr.h" +#endif diff --git a/xfa/src/fdp/include/fde_brs.h b/xfa/src/fdp/include/fde_brs.h new file mode 100644 index 0000000000..04a4f48ad5 --- /dev/null +++ b/xfa/src/fdp/include/fde_brs.h @@ -0,0 +1,143 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FDE_BRUSH +#define _FDE_BRUSH +class IFDE_Image; +class IFDE_Path; +class IFDE_Brush; +class IFDE_SolidBrush; +class IFDE_HatchBrush; +class IFDE_TextureBrush; +class IFDE_LinearGradientBrush; +#define FDE_BRUSHTYPE_Unknown -1 +#define FDE_BRUSHTYPE_Solid 0 +#define FDE_BRUSHTYPE_Hatch 1 +#define FDE_BRUSHTYPE_Texture 2 +#define FDE_BRUSHTYPE_LinearGradient 3 +#define FDE_BRUSHTYPE_MAX 3 +#define FDE_WRAPMODE_Tile 0 +#define FDE_WRAPMODE_TileFlipX 1 +#define FDE_WRAPMODE_TileFlipY 2 +#define FDE_WRAPMODE_TileFlipXY 3 +#define FDE_WRAPMODE_Clamp 4 +typedef struct _FDE_GRADIENTCOLOR { + FX_FLOAT pos; + FX_ARGB color; +} FDE_GRADIENTCOLOR, * FDE_LPGRADIENTCOLOR; +typedef FDE_GRADIENTCOLOR const * FDE_LPCGRADIENTCOLOR; +typedef CFX_ArrayTemplate CFDE_GradientColors; +class IFDE_Brush +{ +public: + static IFDE_Brush* Create(FX_INT32 iType); + virtual void Release() = 0; + virtual FX_INT32 GetType() const = 0; +}; +class IFDE_SolidBrush : public IFDE_Brush +{ +public: + virtual FX_ARGB GetColor() const = 0; + virtual void SetColor(FX_ARGB color) = 0; + virtual const CFX_Matrix& GetMatrix() const = 0; + virtual void ResetMatrix() = 0; + virtual void TranslateMatrix(FX_FLOAT dx, FX_FLOAT dy) = 0; + virtual void RotateMatrix(FX_FLOAT fRadian) = 0; + virtual void ScaleMatrix(FX_FLOAT sx, FX_FLOAT sy) = 0; + virtual void ConcatMatrix(const CFX_Matrix &matrix) = 0; + virtual void SetMatrix(const CFX_Matrix &matrix) = 0; +}; +#define FDE_HATCHSTYLE_Horizontal 0 +#define FDE_HATCHSTYLE_Vertical 1 +#define FDE_HATCHSTYLE_ForwardDiagonal 2 +#define FDE_HATCHSTYLE_BackwardDiagonal 3 +#define FDE_HATCHSTYLE_Cross 4 +#define FDE_HATCHSTYLE_DiagonalCross 5 +#define FDE_HATCHSTYLE_05Percent 6 +#define FDE_HATCHSTYLE_10Percent 7 +#define FDE_HATCHSTYLE_20Percent 8 +#define FDE_HATCHSTYLE_25Percent 9 +#define FDE_HATCHSTYLE_30Percent 10 +#define FDE_HATCHSTYLE_40Percent 11 +#define FDE_HATCHSTYLE_50Percent 12 +#define FDE_HATCHSTYLE_60Percent 13 +#define FDE_HATCHSTYLE_70Percent 14 +#define FDE_HATCHSTYLE_75Percent 15 +#define FDE_HATCHSTYLE_80Percent 16 +#define FDE_HATCHSTYLE_90Percent 17 +#define FDE_HATCHSTYLE_LightDownwardDiagonal 18 +#define FDE_HATCHSTYLE_LightUpwardDiagonal 19 +#define FDE_HATCHSTYLE_DarkDownwardDiagonal 20 +#define FDE_HATCHSTYLE_DarkUpwardDiagonal 21 +#define FDE_HATCHSTYLE_WideDownwardDiagonal 22 +#define FDE_HATCHSTYLE_WideUpwardDiagonal 23 +#define FDE_HATCHSTYLE_LightVertical 24 +#define FDE_HATCHSTYLE_LightHorizontal 25 +#define FDE_HATCHSTYLE_NarrowVertical 26 +#define FDE_HATCHSTYLE_NarrowHorizontal 27 +#define FDE_HATCHSTYLE_DarkVertical 28 +#define FDE_HATCHSTYLE_DarkHorizontal 29 +#define FDE_HATCHSTYLE_DashedDownwardDiagonal 30 +#define FDE_HATCHSTYLE_DashedUpwardDiagonal 31 +#define FDE_HATCHSTYLE_DashedHorizontal 32 +#define FDE_HATCHSTYLE_DashedVertical 33 +#define FDE_HATCHSTYLE_SmallConfetti 34 +#define FDE_HATCHSTYLE_LargeConfetti 35 +#define FDE_HATCHSTYLE_ZigZag 36 +#define FDE_HATCHSTYLE_Wave 37 +#define FDE_HATCHSTYLE_DiagonalBrick 38 +#define FDE_HATCHSTYLE_HorizontalBrick 39 +#define FDE_HATCHSTYLE_Weave 40 +#define FDE_HATCHSTYLE_Plaid 41 +#define FDE_HATCHSTYLE_Divot 42 +#define FDE_HATCHSTYLE_DottedGrid 43 +#define FDE_HATCHSTYLE_DottedDiamond 44 +#define FDE_HATCHSTYLE_Shingle 45 +#define FDE_HATCHSTYLE_Trellis 46 +#define FDE_HATCHSTYLE_Sphere 47 +#define FDE_HATCHSTYLE_SmallGrid 48 +#define FDE_HATCHSTYLE_SmallCheckerBoard 49 +#define FDE_HATCHSTYLE_LargeCheckerBoard 50 +#define FDE_HATCHSTYLE_OutlinedDiamond 51 +#define FDE_HATCHSTYLE_SolidDiamond 52 +#define FDE_HATCHSTYLE_Total 53 +#define FDE_HATCHSTYLE_LargeGrid FDE_HATCHSTYLE_Cross +#define FDE_HATCHSTYLE_Min FDE_HATCHSTYLE_Horizontal +#define FDE_HATCHSTYLE_Max (FDE_HATCHSTYLE_Total - 1) +class IFDE_HatchBrush : public IFDE_Brush +{ +public: + virtual FX_ARGB GetColor(FX_BOOL bForegroundColor) const = 0; + virtual void SetColor(FX_ARGB color, FX_BOOL bForegroundColor) = 0; + virtual FX_INT32 GetHatchStyle() const = 0; + virtual FX_BOOL SetHatchStyle(FX_INT32 iHatchStyle) = 0; +}; +class IFDE_TextureBrush : public IFDE_Brush +{ +public: + virtual IFDE_Image* GetImage() const = 0; + virtual void SetImage(IFDE_Image *pImage, FX_BOOL bAutoRelease) = 0; + virtual FX_INT32 GetWrapMode() const = 0; + virtual void SetWrapMode(FX_INT32 iWrapMode) = 0; +}; +#define FDE_LINEARGRADIENTMODE_Horizontal 0 +#define FDE_LINEARGRADIENTMODE_Vertical 1 +#define FDE_LINEARGRADIENTMODE_ForwardDiagonal 2 +#define FDE_LINEARGRADIENTMODE_BackwardDiagonal 3 +class IFDE_LinearGradientBrush : public IFDE_Brush +{ +public: + virtual void GetLinearPoints(CFX_PointF &startingPoint, CFX_PointF &endingPoint) const = 0; + virtual void SetLinearPoints(const CFX_PointF &startingPoint, const CFX_PointF &endingPoint) = 0; + virtual void GetLinearColors(FX_ARGB &startingColor, FX_ARGB &endingColor) const = 0; + virtual void SetLinearColors(const FX_ARGB &startingColor, const FX_ARGB &endingColor) = 0; + virtual FX_INT32 CountGradientColors() const = 0; + virtual FX_BOOL GetGradientColors(CFDE_GradientColors &colors) const = 0; + virtual FX_BOOL SetGradientColors(const CFDE_GradientColors &colors) = 0; + virtual FX_INT32 GetWrapMode() const = 0; + virtual void SetWrapMode(FX_INT32 iWrapMode) = 0; +}; +#endif diff --git a/xfa/src/fdp/include/fde_css.h b/xfa/src/fdp/include/fde_css.h new file mode 100644 index 0000000000..2870c8d27a --- /dev/null +++ b/xfa/src/fdp/include/fde_css.h @@ -0,0 +1,1082 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FDE_CSS +#define _FDE_CSS +class IFDE_HTMNotify; +class IFDE_CSSValue; +class IFDE_CSSPrimitiveValue; +class IFDE_CSSValueList; +class IFDE_CSSDeclaration; +class IFDE_CSSSelector; +class IFDE_CSSRule; +class IFDE_CSSStyleRule; +class IFDE_CSSMediaRule; +class IFDE_CSSFontFaceRule; +class IFDE_CSSStyleSheet; +class IFDE_CSSStyleSheetCache; +class IFDE_CSSSyntaxParser; +class IFDE_CSSRubyStyle; +class IFDE_CSSMultiColumnStyle; +class IFDE_CSSGeneratedContentStyle; +class IFDE_CSSFontStyle; +class IFDE_CSSBoundaryStyle; +class IFDE_CSSPositionStyle; +class IFDE_CSSParagraphStyle; +class IFDE_CSSBackgroundStyle; +class IFDE_CSSListStyle; +class IFDE_CSSTableStyle; +class IFDE_CSSVisualStyle; +class IFDE_CSSComputedStyle; +class IFDE_CSSTagProvider; +class IFDE_CSSAccelerator; +class IFDE_CSSStyleSelector; +class IFDE_CSSCounterContext; +class IFDE_CSSCounterManager; +class IFDE_CSSQuoteContext; +class IFDE_CSSContentContext; +class IFDE_CSSMultiColumnContext; +class IFDE_CSSFloatContext; +enum FDE_CSSVALUETYPE { + FDE_CSSVALUETYPE_Primitive = 1, + FDE_CSSVALUETYPE_List = 2, + FDE_CSSVALUETYPE_Shorthand, +}; +enum FDE_CSSPRIMITIVETYPE { + FDE_CSSPRIMITIVETYPE_Unknown = 0, + FDE_CSSPRIMITIVETYPE_Number = 1, + FDE_CSSPRIMITIVETYPE_Percent = 2, + FDE_CSSPRIMITIVETYPE_EMS = 3, + FDE_CSSPRIMITIVETYPE_EXS = 4, + FDE_CSSPRIMITIVETYPE_PX = 5, + FDE_CSSPRIMITIVETYPE_CM = 6, + FDE_CSSPRIMITIVETYPE_MM = 7, + FDE_CSSPRIMITIVETYPE_IN = 8, + FDE_CSSPRIMITIVETYPE_PT = 9, + FDE_CSSPRIMITIVETYPE_PC = 10, + FDE_CSSPRIMITIVETYPE_String = 19, + FDE_CSSPRIMITIVETYPE_URI = 20, + FDE_CSSPRIMITIVETYPE_RGB = 25, + FDE_CSSPRIMITIVETYPE_Enum, + FDE_CSSPRIMITIVETYPE_Function, +}; +enum FDE_CSSPROPERTYVALUE { + FDE_CSSPROPERTYVALUE_Bolder, + FDE_CSSPROPERTYVALUE_LowerLatin, + FDE_CSSPROPERTYVALUE_Lowercase, + FDE_CSSPROPERTYVALUE_LowerGreek, + FDE_CSSPROPERTYVALUE_Sesame, + FDE_CSSPROPERTYVALUE_None, + FDE_CSSPROPERTYVALUE_NwResize, + FDE_CSSPROPERTYVALUE_WResize, + FDE_CSSPROPERTYVALUE_Dot, + FDE_CSSPROPERTYVALUE_End, + FDE_CSSPROPERTYVALUE_Ltr, + FDE_CSSPROPERTYVALUE_Pre, + FDE_CSSPROPERTYVALUE_Rtl, + FDE_CSSPROPERTYVALUE_Sub, + FDE_CSSPROPERTYVALUE_Top, + FDE_CSSPROPERTYVALUE_Visible, + FDE_CSSPROPERTYVALUE_Filled, + FDE_CSSPROPERTYVALUE_SwResize, + FDE_CSSPROPERTYVALUE_NoRepeat, + FDE_CSSPROPERTYVALUE_Default, + FDE_CSSPROPERTYVALUE_Transparent, + FDE_CSSPROPERTYVALUE_Ridge, + FDE_CSSPROPERTYVALUE_Right, + FDE_CSSPROPERTYVALUE_HorizontalTb, + FDE_CSSPROPERTYVALUE_DistributeLetter, + FDE_CSSPROPERTYVALUE_DoubleCircle, + FDE_CSSPROPERTYVALUE_Ruby, + FDE_CSSPROPERTYVALUE_Collapse, + FDE_CSSPROPERTYVALUE_Normal, + FDE_CSSPROPERTYVALUE_Avoid, + FDE_CSSPROPERTYVALUE_UpperRoman, + FDE_CSSPROPERTYVALUE_Auto, + FDE_CSSPROPERTYVALUE_Text, + FDE_CSSPROPERTYVALUE_XSmall, + FDE_CSSPROPERTYVALUE_Thin, + FDE_CSSPROPERTYVALUE_Repeat, + FDE_CSSPROPERTYVALUE_Small, + FDE_CSSPROPERTYVALUE_NeResize, + FDE_CSSPROPERTYVALUE_NoContent, + FDE_CSSPROPERTYVALUE_Outside, + FDE_CSSPROPERTYVALUE_EResize, + FDE_CSSPROPERTYVALUE_TableRow, + FDE_CSSPROPERTYVALUE_Bottom, + FDE_CSSPROPERTYVALUE_Underline, + FDE_CSSPROPERTYVALUE_CjkIdeographic, + FDE_CSSPROPERTYVALUE_SeResize, + FDE_CSSPROPERTYVALUE_Fixed, + FDE_CSSPROPERTYVALUE_Double, + FDE_CSSPROPERTYVALUE_Solid, + FDE_CSSPROPERTYVALUE_RubyBaseGroup, + FDE_CSSPROPERTYVALUE_OpenQuote, + FDE_CSSPROPERTYVALUE_Lighter, + FDE_CSSPROPERTYVALUE_LowerRoman, + FDE_CSSPROPERTYVALUE_Strict, + FDE_CSSPROPERTYVALUE_TableCaption, + FDE_CSSPROPERTYVALUE_Oblique, + FDE_CSSPROPERTYVALUE_Decimal, + FDE_CSSPROPERTYVALUE_Loose, + FDE_CSSPROPERTYVALUE_Hebrew, + FDE_CSSPROPERTYVALUE_Hidden, + FDE_CSSPROPERTYVALUE_Dashed, + FDE_CSSPROPERTYVALUE_Embed, + FDE_CSSPROPERTYVALUE_TableRowGroup, + FDE_CSSPROPERTYVALUE_TableColumn, + FDE_CSSPROPERTYVALUE_Static, + FDE_CSSPROPERTYVALUE_Outset, + FDE_CSSPROPERTYVALUE_DecimalLeadingZero, + FDE_CSSPROPERTYVALUE_KeepWords, + FDE_CSSPROPERTYVALUE_KatakanaIroha, + FDE_CSSPROPERTYVALUE_Super, + FDE_CSSPROPERTYVALUE_Center, + FDE_CSSPROPERTYVALUE_TableHeaderGroup, + FDE_CSSPROPERTYVALUE_Inside, + FDE_CSSPROPERTYVALUE_XxLarge, + FDE_CSSPROPERTYVALUE_Triangle, + FDE_CSSPROPERTYVALUE_RubyTextGroup, + FDE_CSSPROPERTYVALUE_Circle, + FDE_CSSPROPERTYVALUE_Hiragana, + FDE_CSSPROPERTYVALUE_RepeatX, + FDE_CSSPROPERTYVALUE_RepeatY, + FDE_CSSPROPERTYVALUE_Move, + FDE_CSSPROPERTYVALUE_HiraganaIroha, + FDE_CSSPROPERTYVALUE_RubyBase, + FDE_CSSPROPERTYVALUE_Scroll, + FDE_CSSPROPERTYVALUE_Smaller, + FDE_CSSPROPERTYVALUE_TableFooterGroup, + FDE_CSSPROPERTYVALUE_Baseline, + FDE_CSSPROPERTYVALUE_Separate, + FDE_CSSPROPERTYVALUE_Armenian, + FDE_CSSPROPERTYVALUE_Open, + FDE_CSSPROPERTYVALUE_Relative, + FDE_CSSPROPERTYVALUE_Thick, + FDE_CSSPROPERTYVALUE_Justify, + FDE_CSSPROPERTYVALUE_Middle, + FDE_CSSPROPERTYVALUE_Always, + FDE_CSSPROPERTYVALUE_DistributeSpace, + FDE_CSSPROPERTYVALUE_LineEdge, + FDE_CSSPROPERTYVALUE_PreWrap, + FDE_CSSPROPERTYVALUE_Medium, + FDE_CSSPROPERTYVALUE_NResize, + FDE_CSSPROPERTYVALUE_ListItem, + FDE_CSSPROPERTYVALUE_Show, + FDE_CSSPROPERTYVALUE_Currentcolor, + FDE_CSSPROPERTYVALUE_NoCloseQuote, + FDE_CSSPROPERTYVALUE_VerticalLr, + FDE_CSSPROPERTYVALUE_VerticalRl, + FDE_CSSPROPERTYVALUE_Pointer, + FDE_CSSPROPERTYVALUE_XxSmall, + FDE_CSSPROPERTYVALUE_Bold, + FDE_CSSPROPERTYVALUE_Both, + FDE_CSSPROPERTYVALUE_SmallCaps, + FDE_CSSPROPERTYVALUE_Katakana, + FDE_CSSPROPERTYVALUE_After, + FDE_CSSPROPERTYVALUE_Horizontal, + FDE_CSSPROPERTYVALUE_Dotted, + FDE_CSSPROPERTYVALUE_Disc, + FDE_CSSPROPERTYVALUE_Georgian, + FDE_CSSPROPERTYVALUE_Inline, + FDE_CSSPROPERTYVALUE_Overline, + FDE_CSSPROPERTYVALUE_Wait, + FDE_CSSPROPERTYVALUE_BreakAll, + FDE_CSSPROPERTYVALUE_UpperAlpha, + FDE_CSSPROPERTYVALUE_Capitalize, + FDE_CSSPROPERTYVALUE_Nowrap, + FDE_CSSPROPERTYVALUE_TextBottom, + FDE_CSSPROPERTYVALUE_NoOpenQuote, + FDE_CSSPROPERTYVALUE_Groove, + FDE_CSSPROPERTYVALUE_Progress, + FDE_CSSPROPERTYVALUE_Larger, + FDE_CSSPROPERTYVALUE_CloseQuote, + FDE_CSSPROPERTYVALUE_TableCell, + FDE_CSSPROPERTYVALUE_PreLine, + FDE_CSSPROPERTYVALUE_Absolute, + FDE_CSSPROPERTYVALUE_InlineTable, + FDE_CSSPROPERTYVALUE_BidiOverride, + FDE_CSSPROPERTYVALUE_InlineBlock, + FDE_CSSPROPERTYVALUE_Inset, + FDE_CSSPROPERTYVALUE_Crosshair, + FDE_CSSPROPERTYVALUE_UpperLatin, + FDE_CSSPROPERTYVALUE_Help, + FDE_CSSPROPERTYVALUE_Hide, + FDE_CSSPROPERTYVALUE_Uppercase, + FDE_CSSPROPERTYVALUE_SResize, + FDE_CSSPROPERTYVALUE_Table, + FDE_CSSPROPERTYVALUE_Blink, + FDE_CSSPROPERTYVALUE_Block, + FDE_CSSPROPERTYVALUE_Start, + FDE_CSSPROPERTYVALUE_TableColumnGroup, + FDE_CSSPROPERTYVALUE_Italic, + FDE_CSSPROPERTYVALUE_LineThrough, + FDE_CSSPROPERTYVALUE_KeepAll, + FDE_CSSPROPERTYVALUE_LowerAlpha, + FDE_CSSPROPERTYVALUE_RunIn, + FDE_CSSPROPERTYVALUE_Square, + FDE_CSSPROPERTYVALUE_XLarge, + FDE_CSSPROPERTYVALUE_Large, + FDE_CSSPROPERTYVALUE_Before, + FDE_CSSPROPERTYVALUE_Left, + FDE_CSSPROPERTYVALUE_TextTop, + FDE_CSSPROPERTYVALUE_RubyText, + FDE_CSSPROPERTYVALUE_NoDisplay, + FDE_CSSPROPERTYVALUE_MAX +}; +class IFDE_CSSValue +{ +public: + virtual FDE_CSSVALUETYPE GetType() const = 0; +}; +class IFDE_CSSPrimitiveValue : public IFDE_CSSValue +{ +public: + virtual FDE_CSSVALUETYPE GetType() const + { + return FDE_CSSVALUETYPE_Primitive; + } + virtual FDE_CSSPRIMITIVETYPE GetPrimitiveType() const = 0; + virtual FX_ARGB GetRGBColor() const = 0; + virtual FX_FLOAT GetFloat() const = 0; + virtual FX_LPCWSTR GetString(FX_INT32 &iLength) const = 0; + virtual FDE_CSSPROPERTYVALUE GetEnum() const = 0; + virtual FX_LPCWSTR GetFuncName() const = 0; + virtual FX_INT32 CountArgs() const = 0; + virtual IFDE_CSSValue* GetArgs(FX_INT32 index) const = 0; +}; +class IFDE_CSSValueList : public IFDE_CSSValue +{ +public: + virtual FDE_CSSVALUETYPE GetType() const + { + return FDE_CSSVALUETYPE_List; + } + virtual FX_INT32 CountValues() const = 0; + virtual IFDE_CSSValue* GetValue(FX_INT32 index) const = 0; +}; +enum FDE_CSSPROPERTY { + FDE_CSSPROPERTY_WritingMode, + FDE_CSSPROPERTY_ColumnRuleWidth, + FDE_CSSPROPERTY_BorderLeft, + FDE_CSSPROPERTY_ColumnRule, + FDE_CSSPROPERTY_Height, + FDE_CSSPROPERTY_CounterReset, + FDE_CSSPROPERTY_Content, + FDE_CSSPROPERTY_RubyPosition, + FDE_CSSPROPERTY_BackgroundColor, + FDE_CSSPROPERTY_Width, + FDE_CSSPROPERTY_Src, + FDE_CSSPROPERTY_Top, + FDE_CSSPROPERTY_Margin, + FDE_CSSPROPERTY_BorderColor, + FDE_CSSPROPERTY_Widows, + FDE_CSSPROPERTY_BorderBottomColor, + FDE_CSSPROPERTY_TextIndent, + FDE_CSSPROPERTY_Right, + FDE_CSSPROPERTY_TextEmphasisStyle, + FDE_CSSPROPERTY_PaddingLeft, + FDE_CSSPROPERTY_ColumnWidth, + FDE_CSSPROPERTY_MarginLeft, + FDE_CSSPROPERTY_Border, + FDE_CSSPROPERTY_BorderTop, + FDE_CSSPROPERTY_RubyOverhang, + FDE_CSSPROPERTY_PageBreakBefore, + FDE_CSSPROPERTY_MaxHeight, + FDE_CSSPROPERTY_MinWidth, + FDE_CSSPROPERTY_BorderLeftColor, + FDE_CSSPROPERTY_Bottom, + FDE_CSSPROPERTY_Quotes, + FDE_CSSPROPERTY_MaxWidth, + FDE_CSSPROPERTY_PaddingRight, + FDE_CSSPROPERTY_ListStyleImage, + FDE_CSSPROPERTY_WhiteSpace, + FDE_CSSPROPERTY_BorderBottom, + FDE_CSSPROPERTY_ListStyleType, + FDE_CSSPROPERTY_WordBreak, + FDE_CSSPROPERTY_OverflowX, + FDE_CSSPROPERTY_OverflowY, + FDE_CSSPROPERTY_BorderTopColor, + FDE_CSSPROPERTY_FontFamily, + FDE_CSSPROPERTY_Cursor, + FDE_CSSPROPERTY_RubyAlign, + FDE_CSSPROPERTY_ColumnRuleColor, + FDE_CSSPROPERTY_FontWeight, + FDE_CSSPROPERTY_BorderRightStyle, + FDE_CSSPROPERTY_MinHeight, + FDE_CSSPROPERTY_Color, + FDE_CSSPROPERTY_LetterSpacing, + FDE_CSSPROPERTY_EmptyCells, + FDE_CSSPROPERTY_TextAlign, + FDE_CSSPROPERTY_RubySpan, + FDE_CSSPROPERTY_Position, + FDE_CSSPROPERTY_BorderStyle, + FDE_CSSPROPERTY_BorderBottomStyle, + FDE_CSSPROPERTY_BorderCollapse, + FDE_CSSPROPERTY_ColumnCount, + FDE_CSSPROPERTY_BorderRightWidth, + FDE_CSSPROPERTY_UnicodeBidi, + FDE_CSSPROPERTY_VerticalAlign, + FDE_CSSPROPERTY_PaddingTop, + FDE_CSSPROPERTY_Columns, + FDE_CSSPROPERTY_Overflow, + FDE_CSSPROPERTY_TableLayout, + FDE_CSSPROPERTY_FontVariant, + FDE_CSSPROPERTY_ListStyle, + FDE_CSSPROPERTY_BackgroundPosition, + FDE_CSSPROPERTY_BorderWidth, + FDE_CSSPROPERTY_TextEmphasisColor, + FDE_CSSPROPERTY_BorderLeftStyle, + FDE_CSSPROPERTY_PageBreakInside, + FDE_CSSPROPERTY_TextEmphasis, + FDE_CSSPROPERTY_BorderBottomWidth, + FDE_CSSPROPERTY_ColumnGap, + FDE_CSSPROPERTY_Orphans, + FDE_CSSPROPERTY_BorderRight, + FDE_CSSPROPERTY_FontSize, + FDE_CSSPROPERTY_PageBreakAfter, + FDE_CSSPROPERTY_CaptionSide, + FDE_CSSPROPERTY_BackgroundRepeat, + FDE_CSSPROPERTY_BorderTopStyle, + FDE_CSSPROPERTY_BorderSpacing, + FDE_CSSPROPERTY_TextTransform, + FDE_CSSPROPERTY_FontStyle, + FDE_CSSPROPERTY_Font, + FDE_CSSPROPERTY_LineHeight, + FDE_CSSPROPERTY_MarginRight, + FDE_CSSPROPERTY_Float, + FDE_CSSPROPERTY_BorderLeftWidth, + FDE_CSSPROPERTY_Display, + FDE_CSSPROPERTY_Clear, + FDE_CSSPROPERTY_ColumnRuleStyle, + FDE_CSSPROPERTY_TextCombine, + FDE_CSSPROPERTY_ListStylePosition, + FDE_CSSPROPERTY_Visibility, + FDE_CSSPROPERTY_PaddingBottom, + FDE_CSSPROPERTY_BackgroundAttachment, + FDE_CSSPROPERTY_BackgroundImage, + FDE_CSSPROPERTY_LineBreak, + FDE_CSSPROPERTY_Background, + FDE_CSSPROPERTY_BorderTopWidth, + FDE_CSSPROPERTY_WordSpacing, + FDE_CSSPROPERTY_BorderRightColor, + FDE_CSSPROPERTY_CounterIncrement, + FDE_CSSPROPERTY_Left, + FDE_CSSPROPERTY_TextDecoration, + FDE_CSSPROPERTY_Padding, + FDE_CSSPROPERTY_MarginBottom, + FDE_CSSPROPERTY_MarginTop, + FDE_CSSPROPERTY_Direction, + FDE_CSSPROPERTY_MAX +}; +class IFDE_CSSDeclaration +{ +public: + virtual IFDE_CSSValue* GetProperty(FDE_CSSPROPERTY eProperty, FX_BOOL &bImportant) const = 0; + virtual FX_POSITION GetStartPosition() const = 0; + virtual void GetNextProperty(FX_POSITION &pos, FDE_CSSPROPERTY &eProperty, IFDE_CSSValue *&pValue, FX_BOOL &bImportant) const = 0; + virtual FX_POSITION GetStartCustom() const = 0; + virtual void GetNextCustom(FX_POSITION &pos, CFX_WideString &wsName, CFX_WideString &wsValue) const = 0; +}; +typedef CFX_ArrayTemplate CFDE_CSSDeclarationArray; +enum FDE_CSSPERSUDO { + FDE_CSSPERSUDO_After, + FDE_CSSPERSUDO_Before, + FDE_CSSPERSUDO_NONE +}; +enum FDE_CSSSELECTORTYPE { + FDE_CSSSELECTORTYPE_Element, + FDE_CSSSELECTORTYPE_Descendant, + FDE_CSSSELECTORTYPE_Class, + FDE_CSSSELECTORTYPE_Persudo, + FDE_CSSSELECTORTYPE_ID, +}; +class IFDE_CSSSelector +{ +public: + virtual FDE_CSSSELECTORTYPE GetType() const = 0; + virtual FX_DWORD GetNameHash() const = 0; + virtual IFDE_CSSSelector* GetNextSelector() const = 0; +}; +#define FDE_CSSMEDIATYPE_Braille 0x01 +#define FDE_CSSMEDIATYPE_Emboss 0x02 +#define FDE_CSSMEDIATYPE_Handheld 0x04 +#define FDE_CSSMEDIATYPE_Print 0x08 +#define FDE_CSSMEDIATYPE_Projection 0x10 +#define FDE_CSSMEDIATYPE_Screen 0x20 +#define FDE_CSSMEDIATYPE_TTY 0x40 +#define FDE_CSSMEDIATYPE_TV 0x80 +#define FDE_CSSMEDIATYPE_ALL 0xFF +enum FDE_CSSRULETYPE { + FDE_CSSRULETYPE_Unknown = 0, + FDE_CSSRULETYPE_Style = 1, + FDE_CSSRULETYPE_Media = 4, + FDE_CSSRULETYPE_FontFace = 5, +}; +class IFDE_CSSRule +{ +public: + virtual FDE_CSSRULETYPE GetType() const = 0; +}; +typedef CFX_MassArrayTemplate CFDE_CSSRuleArray; +class IFDE_CSSStyleRule : public IFDE_CSSRule +{ +public: + virtual FDE_CSSRULETYPE GetType() const + { + return FDE_CSSRULETYPE_Style; + } + virtual FX_INT32 CountSelectorLists() const = 0; + virtual IFDE_CSSSelector* GetSelectorList(FX_INT32 index) const = 0; + virtual IFDE_CSSDeclaration* GetDeclaration() const = 0; +}; +class IFDE_CSSMediaRule : public IFDE_CSSRule +{ +public: + virtual FDE_CSSRULETYPE GetType() const + { + return FDE_CSSRULETYPE_Media; + } + virtual FX_DWORD GetMediaList() const = 0; + virtual FX_INT32 CountRules() const = 0; + virtual IFDE_CSSRule* GetRule(FX_INT32 index) = 0; +}; +class IFDE_CSSFontFaceRule : public IFDE_CSSRule +{ +public: + virtual FDE_CSSRULETYPE GetType() const + { + return FDE_CSSRULETYPE_FontFace; + } + virtual IFDE_CSSDeclaration* GetDeclaration() const = 0; +}; +class IFDE_CSSStyleSheet : public IFX_Unknown +{ +public: + static IFDE_CSSStyleSheet* LoadHTMLStandardStyleSheet(); + static IFDE_CSSStyleSheet* LoadFromStream(const CFX_WideString &szUrl, IFX_Stream *pStream, FX_WORD wCodePage, FX_DWORD dwMediaList = FDE_CSSMEDIATYPE_ALL); + static IFDE_CSSStyleSheet* LoadFromBuffer(const CFX_WideString &szUrl, FX_LPCWSTR pBuffer, FX_INT32 iBufSize, FX_WORD wCodePage, FX_DWORD dwMediaList = FDE_CSSMEDIATYPE_ALL); + virtual FX_BOOL GetUrl(CFX_WideString &szUrl) = 0; + virtual FX_DWORD GetMediaList() const = 0; + virtual FX_WORD GetCodePage() const = 0; + + virtual FX_INT32 CountRules() const = 0; + virtual IFDE_CSSRule* GetRule(FX_INT32 index) = 0; +}; +typedef CFX_ArrayTemplate CFDE_CSSStyleSheetArray; +#define FDE_CSSUSERSTYLESHEET (FX_BSTRC("#USERSHEET")) +#define FDE_CSSUAGENTSTYLESHEET (FX_BSTRC("#AGENTSHEET")) +class IFDE_CSSStyleSheetCache +{ +public: + static IFDE_CSSStyleSheetCache* Create(); + virtual void Release() = 0; + virtual void SetMaxItems(FX_INT32 iMaxCount = 5) = 0; + virtual void AddStyleSheet(FX_BSTR szKey, IFDE_CSSStyleSheet *pStyleSheet) = 0; + virtual IFDE_CSSStyleSheet* GetStyleSheet(FX_BSTR szKey) const = 0; + virtual void RemoveStyleSheet(FX_BSTR szKey) = 0; +}; +enum FDE_CSSSYNTAXSTATUS { + FDE_CSSSYNTAXSTATUS_Error, + FDE_CSSSYNTAXSTATUS_EOS, + FDE_CSSSYNTAXSTATUS_None, + FDE_CSSSYNTAXSTATUS_Charset, + FDE_CSSSYNTAXSTATUS_ImportRule, + FDE_CSSSYNTAXSTATUS_ImportClose, + FDE_CSSSYNTAXSTATUS_PageRule, + FDE_CSSSYNTAXSTATUS_StyleRule, + FDE_CSSSYNTAXSTATUS_FontFaceRule, + FDE_CSSSYNTAXSTATUS_MediaRule, + FDE_CSSSYNTAXSTATUS_MediaType, + FDE_CSSSYNTAXSTATUS_URI, + FDE_CSSSYNTAXSTATUS_Selector, + FDE_CSSSYNTAXSTATUS_DeclOpen, + FDE_CSSSYNTAXSTATUS_DeclClose, + FDE_CSSSYNTAXSTATUS_PropertyName, + FDE_CSSSYNTAXSTATUS_PropertyValue, +}; +class IFDE_CSSSyntaxParser +{ +public: + static IFDE_CSSSyntaxParser* Create(); + virtual void Release() = 0; + virtual FX_BOOL Init(IFX_Stream *pStream, FX_INT32 iCSSPlaneSize, FX_INT32 iTextDataSize = 32, FX_BOOL bOnlyDeclaration = FALSE) = 0; + virtual FX_BOOL Init(FX_LPCWSTR pBuffer, FX_INT32 iBufferSize, FX_INT32 iTextDatSize = 32, FX_BOOL bOnlyDeclaration = FALSE) = 0; + + virtual FDE_CSSSYNTAXSTATUS DoSyntaxParse() = 0; + virtual FX_LPCWSTR GetCurrentString(FX_INT32 &iLength) const = 0; +}; +enum FDE_CSSLENGTHUNIT { + FDE_CSSLENGTHUNIT_Auto, + FDE_CSSLENGTHUNIT_None, + FDE_CSSLENGTHUNIT_Normal, + FDE_CSSLENGTHUNIT_Point, + FDE_CSSLENGTHUNIT_Percent, +}; +#define FDE_CSSUNITBITS (3) +#define FDE_CSSUNITMASK ((1 << FDE_CSSUNITBITS) - 1) +struct FDE_CSSLENGTH { + FDE_CSSLENGTH& Set(FDE_CSSLENGTHUNIT eUnit) + { + m_iData = eUnit; + return *this; + } + FDE_CSSLENGTH& Set(FDE_CSSLENGTHUNIT eUnit, FX_FLOAT fValue) + { + m_iData = ((FX_INTPTR)(fValue * 1024.0f) << FDE_CSSUNITBITS) | eUnit; + return *this; + } + FDE_CSSLENGTHUNIT GetUnit() const + { + return (FDE_CSSLENGTHUNIT)(m_iData & FDE_CSSUNITMASK); + } + FX_FLOAT GetValue() const + { + return (m_iData >> FDE_CSSUNITBITS) / 1024.0f; + } + FX_BOOL NonZero() const + { + return (m_iData >> FDE_CSSUNITBITS) != 0; + } +private: + FX_INTPTR m_iData; +}; +struct FDE_CSSPOINT { + FDE_CSSPOINT& Set(FDE_CSSLENGTHUNIT eUnit) + { + x.Set(eUnit); + y.Set(eUnit); + return *this; + } + FDE_CSSPOINT& Set(FDE_CSSLENGTHUNIT eUnit, FX_FLOAT fValue) + { + x.Set(eUnit, fValue); + y.Set(eUnit, fValue); + return *this; + } + FDE_CSSLENGTH x, y; +}; +struct FDE_CSSSIZE { + FDE_CSSSIZE& Set(FDE_CSSLENGTHUNIT eUnit) + { + cx.Set(eUnit); + cy.Set(eUnit); + return *this; + } + FDE_CSSSIZE& Set(FDE_CSSLENGTHUNIT eUnit, FX_FLOAT fValue) + { + cx.Set(eUnit, fValue); + cy.Set(eUnit, fValue); + return *this; + } + FDE_CSSLENGTH cx, cy; +}; +struct FDE_CSSRECT { + FDE_CSSRECT& Set(FDE_CSSLENGTHUNIT eUnit) + { + left.Set(eUnit); + top.Set(eUnit); + right.Set(eUnit); + bottom.Set(eUnit); + return *this; + } + FDE_CSSRECT& Set(FDE_CSSLENGTHUNIT eUnit, FX_FLOAT fValue) + { + left.Set(eUnit, fValue); + top.Set(eUnit, fValue); + right.Set(eUnit, fValue); + bottom.Set(eUnit, fValue); + return *this; + } + + FDE_CSSLENGTH left, top, right, bottom; +}; +enum FDE_CSSBKGATTACHMENT { + FDE_CSSBKGATTACHMENT_Scroll, + FDE_CSSBKGATTACHMENT_Fixed, +}; +enum FDE_CSSBKGREPEAT { + FDE_CSSBKGREPEAT_Repeat, + FDE_CSSBKGREPEAT_RepeatX, + FDE_CSSBKGREPEAT_RepeatY, + FDE_CSSBKGREPEAT_NoRepeat, +}; +enum FDE_CSSBORDERSTYLE { + FDE_CSSBORDERSTYLE_None, + FDE_CSSBORDERSTYLE_Hidden, + FDE_CSSBORDERSTYLE_Dotted, + FDE_CSSBORDERSTYLE_Dashed, + FDE_CSSBORDERSTYLE_Solid, + FDE_CSSBORDERSTYLE_Double, + FDE_CSSBORDERSTYLE_Groove, + FDE_CSSBORDERSTYLE_Ridge, + FDE_CSSBORDERSTYLE_Inset, + FDE_CSSBORDERSTYLE_outset, +}; +enum FDE_CSSCLEAR { + FDE_CSSCLEAR_None, + FDE_CSSCLEAR_Left, + FDE_CSSCLEAR_Right, + FDE_CSSCLEAR_Both, +}; +enum FDE_CSSDISPLAY { + FDE_CSSDISPLAY_None, + FDE_CSSDISPLAY_ListItem, + FDE_CSSDISPLAY_RunIn, + FDE_CSSDISPLAY_Block, + FDE_CSSDISPLAY_Inline, + FDE_CSSDISPLAY_InlineBlock, + FDE_CSSDISPLAY_InlineTable, + FDE_CSSDISPLAY_Table, + FDE_CSSDISPLAY_TableRow, + FDE_CSSDISPLAY_TableCell, + FDE_CSSDISPLAY_TableCaption, + FDE_CSSDISPLAY_TableColumn, + FDE_CSSDISPLAY_TableRowGroup, + FDE_CSSDISPLAY_TableColumnGroup, + FDE_CSSDISPLAY_TableHeaderGroup, + FDE_CSSDISPLAY_TableFooterGroup, + FDE_CSSDISPLAY_Ruby, + FDE_CSSDISPLAY_RubyBase, + FDE_CSSDISPLAY_RubyText, + FDE_CSSDISPLSY_RubyBaseGroup, + FDE_CSSDISPLAY_RubyTextGroup, +}; +enum FDE_CSSVISIBILITY { + FDE_CSSVISIBILITY_Visible, + FDE_CSSVISIBILITY_Hidden, + FDE_CSSVISIBILITY_Collapse, +}; +enum FDE_CSSFONTSTYLE { + FDE_CSSFONTSTYLE_Normal, + FDE_CSSFONTSTYLE_Italic, +}; +enum FDE_CSSFLOAT { + FDE_CSSFLOAT_None, + FDE_CSSFLOAT_Left, + FDE_CSSFLOAT_Right, +}; +enum FDE_CSSWRITINGMODE { + FDE_CSSWRITINGMODE_HorizontalTb, + FDE_CSSWRITINGMODE_VerticalRl, + FDE_CSSWRITINGMODE_VerticalLr, +}; +enum FDE_CSSWORDBREAK { + FDE_CSSWORDBREAK_Normal, + FDE_CSSWORDBREAK_KeepAll, + FDE_CSSWORDBREAK_BreakAll, + FDE_CSSWORDBREAK_KeepWords, +}; +enum FDE_CSSPAGEBREAK { + FDE_CSSPAGEBREAK_Auto, + FDE_CSSPAGEBREAK_Always, + FDE_CSSPAGEBREAK_Avoid, + FDE_CSSPAGEBREAK_Left, + FDE_CSSPAGEBREAK_Right, +}; +enum FDE_CSSOVERFLOW { + FDE_CSSOVERFLOW_Visible, + FDE_CSSOVERFLOW_Hidden, + FDE_CSSOVERFLOW_Scroll, + FDE_CSSOVERFLOW_Auto, + FDE_CSSOVERFLOW_NoDisplay, + FDE_CSSOVERFLOW_NoContent, +}; +enum FDE_CSSLINEBREAK { + FDE_CSSLINEBREAK_Auto, + FDE_CSSLINEBREAK_Loose, + FDE_CSSLINEBREAK_Normal, + FDE_CSSLINEBREAK_Strict, +}; +enum FDE_CSSTEXTEMPHASISFILL { + FDE_CSSTEXTEMPHASISFILL_Filled, + FDE_CSSTEXTEMPHASISFILL_Open, +}; +enum FDE_CSSTEXTEMPHASISMARK { + FDE_CSSTEXTEMPHASISMARK_None, + FDE_CSSTEXTEMPHASISMARK_Auto, + FDE_CSSTEXTEMPHASISMARK_Dot, + FDE_CSSTEXTEMPHASISMARK_Circle, + FDE_CSSTEXTEMPHASISMARK_DoubleCircle, + FDE_CSSTEXTEMPHASISMARK_Triangle, + FDE_CSSTEXTEMPHASISMARK_Sesame, + FDE_CSSTEXTEMPHASISMARK_Custom, +}; +enum FDE_CSSTEXTCOMBINE { + FDE_CSSTEXTCOMBINE_Horizontal, + FDE_CSSTEXTCOMBINE_None, +}; +enum FDE_CSSCURSOR { + FDE_CSSCURSOR_Auto, + FDE_CSSCURSOR_Crosshair, + FDE_CSSCURSOR_Default, + FDE_CSSCURSOR_Pointer, + FDE_CSSCURSOR_Move, + FDE_CSSCURSOR_EResize, + FDE_CSSCURSOR_NeResize, + FDE_CSSCURSOR_NwResize, + FDE_CSSCURSOR_NResize, + FDE_CSSCURSOR_SeResize, + FDE_CSSCURSOR_SwResize, + FDE_CSSCURSOR_SResize, + FDE_CSSCURSOR_WResize, + FDE_CSSCURSOR_Text, + FDE_CSSCURSOR_Wait, + FDE_CSSCURSOR_Help, + FDE_CSSCURSOR_Progress, +}; +enum FDE_CSSPOSITION { + FDE_CSSPOSITION_Static, + FDE_CSSPOSITION_Relative, + FDE_CSSPOSITION_Absolute, + FDE_CSSPOSITION_Fixed, +}; +enum FDE_CSSCAPTIONSIDE { + FDE_CSSCAPTIONSIDE_Top, + FDE_CSSCAPTIONSIDE_Bottom, + FDE_CSSCAPTIONSIDE_Left, + FDE_CSSCAPTIONSIDE_Right, + FDE_CSSCAPTIONSIDE_Before, + FDE_CSSCAPTIONSIDE_After, +}; +enum FDE_CSSRUBYALIGN { + FDE_CSSRUBYALIGN_Auto, + FDE_CSSRUBYALIGN_Start, + FDE_CSSRUBYALIGN_Left, + FDE_CSSRUBYALIGN_Center, + FDE_CSSRUBYALIGN_End, + FDE_CSSRUBYALIGN_Right, + FDE_CSSRUBYALIGN_DistributeLetter, + FDE_CSSRUBYALIGN_DistributeSpace, + FDE_CSSRUBYALIGN_LineEdge, +}; +enum FDE_CSSRUBYOVERHANG { + FDE_CSSRUBYOVERHANG_Auto, + FDE_CSSRUBYOVERHANG_Start, + FDE_CSSRUBYOVERHANG_End, + FDE_CSSRUBYOVERHANG_None, +}; +enum FDE_CSSRUBYPOSITION { + FDE_CSSRUBYPOSITION_Before, + FDE_CSSRUBYPOSITION_After, + FDE_CSSRUBYPOSITION_Right, + FDE_CSSRUBYPOSITION_Inline, +}; +enum FDE_CSSRUBYSPAN { + FDE_CSSRUBYSPAN_None, + FDE_CSSRUBYSPAN_Attr, +}; +enum FDE_CSSTEXTALIGN { + FDE_CSSTEXTALIGN_Left, + FDE_CSSTEXTALIGN_Right, + FDE_CSSTEXTALIGN_Center, + FDE_CSSTEXTALIGN_Justify, + FDE_CSSTEXTALIGN_JustifyAll, +}; +enum FDE_CSSVERTICALALIGN { + FDE_CSSVERTICALALIGN_Baseline, + FDE_CSSVERTICALALIGN_Sub, + FDE_CSSVERTICALALIGN_Super, + FDE_CSSVERTICALALIGN_Top, + FDE_CSSVERTICALALIGN_TextTop, + FDE_CSSVERTICALALIGN_Middle, + FDE_CSSVERTICALALIGN_Bottom, + FDE_CSSVERTICALALIGN_TextBottom, + FDE_CSSVERTICALALIGN_Number, +}; +enum FDE_CSSLISTSTYLETYPE { + FDE_CSSLISTSTYLETYPE_Disc, + FDE_CSSLISTSTYLETYPE_Circle, + FDE_CSSLISTSTYLETYPE_Square, + FDE_CSSLISTSTYLETYPE_Decimal, + FDE_CSSLISTSTYLETYPE_DecimalLeadingZero, + FDE_CSSLISTSTYLETYPE_LowerRoman, + FDE_CSSLISTSTYLETYPE_UpperRoman, + FDE_CSSLISTSTYLETYPE_LowerGreek, + FDE_CSSLISTSTYLETYPE_LowerLatin, + FDE_CSSLISTSTYLETYPE_UpperLatin, + FDE_CSSLISTSTYLETYPE_Armenian, + FDE_CSSLISTSTYLETYPE_Georgian, + FDE_CSSLISTSTYLETYPE_LowerAlpha, + FDE_CSSLISTSTYLETYPE_UpperAlpha, + FDE_CSSLISTSTYLETYPE_None, + FDE_CSSLISTSTYLETYPE_CjkIdeographic, + FDE_CSSLISTSTYLETYPE_Hebrew, + FDE_CSSLISTSTYLETYPE_Hiragana, + FDE_CSSLISTSTYLETYPE_HiraganaIroha, + FDE_CSSLISTSTYLETYPE_Katakana, + FDE_CSSLISTSTYLETYPE_KatakanaIroha, +}; +enum FDE_CSSLISTSTYLEPOSITION { + FDE_CSSLISTSTYLEPOSITION_Outside, + FDE_CSSLISTSTYLEPOSITION_Inside, +}; +enum FDE_CSSWHITESPACE { + FDE_CSSWHITESPACE_Normal, + FDE_CSSWHITESPACE_Pre, + FDE_CSSWHITESPACE_Nowrap, + FDE_CSSWHITESPACE_PreWrap, + FDE_CSSWHITESPACE_PreLine, +}; +enum FDE_CSSFONTVARIANT { + FDE_CSSFONTVARIANT_Normal, + FDE_CSSFONTVARIANT_SmallCaps, +}; +enum FDE_CSSTEXTTRANSFORM { + FDE_CSSTEXTTRANSFORM_None, + FDE_CSSTEXTTRANSFORM_Capitalize, + FDE_CSSTEXTTRANSFORM_UpperCase, + FDE_CSSTEXTTRANSFORM_LowerCase, +}; +enum FDE_CSSTEXTDECORATION { + FDE_CSSTEXTDECORATION_None = 0, + FDE_CSSTEXTDECORATION_Underline = 1, + FDE_CSSTEXTDECORATION_Overline = 2, + FDE_CSSTEXTDECORATION_LineThrough = 4, + FDE_CSSTEXTDECORATION_Blink = 8, + FDE_CSSTEXTDECORATION_Double = 16, +}; +class IFDE_CSSRubyStyle +{ +public: + virtual FDE_CSSRUBYALIGN GetRubyAlign() const = 0; + virtual FDE_CSSRUBYOVERHANG GetRubyOverhang() const = 0; + virtual FDE_CSSRUBYPOSITION GetRubyPosition() const = 0; + virtual FDE_CSSRUBYSPAN GetRubySpanType() const = 0; + virtual IFDE_CSSValue* GetRubySpanAttr() const = 0; +}; +class IFDE_CSSMultiColumnStyle +{ +public: + virtual const FDE_CSSLENGTH& GetColumnCount() const = 0; + virtual const FDE_CSSLENGTH& GetColumnGap() const = 0; + virtual FX_ARGB GetColumnRuleColor() const = 0; + virtual FDE_CSSBORDERSTYLE GetColumnRuleStyle() const = 0; + virtual const FDE_CSSLENGTH& GetColumnRuleWidth() const = 0; + virtual const FDE_CSSLENGTH& GetColumnWidth() const = 0; + virtual void SetColumnCount(const FDE_CSSLENGTH &columnCount) = 0; + virtual void SetColumnGap(const FDE_CSSLENGTH &columnGap) = 0; + virtual void SetColumnRuleColor(FX_ARGB dwColumnRuleColor) = 0; + virtual void SetColumnRuleStyle(FDE_CSSBORDERSTYLE eColumnRuleStyle) = 0; + virtual void SetColumnRuleWidth(const FDE_CSSLENGTH &columnRuleWidth) = 0; + virtual void SetColumnWidth(const FDE_CSSLENGTH &columnWidth) = 0; +}; +class IFDE_CSSGeneratedContentStyle +{ +public: + virtual FX_INT32 CountCounters() = 0; + virtual FX_LPCWSTR GetCounterIdentifier(FX_INT32 index) = 0; + virtual FX_BOOL GetCounterReset(FX_INT32 index, FX_INT32 &iValue) = 0; + virtual FX_BOOL GetCounterIncrement(FX_INT32 index, FX_INT32 &iValue) = 0; + virtual IFDE_CSSValueList* GetContent() const = 0; + virtual FX_INT32 CountQuotes() const = 0; + virtual FX_LPCWSTR GetQuotes(FX_INT32 index) const = 0; +}; +class IFDE_CSSFontStyle +{ +public: + virtual FX_INT32 CountFontFamilies() const = 0; + virtual FX_LPCWSTR GetFontFamily(FX_INT32 index) const = 0; + virtual FX_WORD GetFontWeight() const = 0; + virtual FDE_CSSFONTVARIANT GetFontVariant() const = 0; + virtual FDE_CSSFONTSTYLE GetFontStyle() const = 0; + virtual FX_FLOAT GetFontSize() const = 0; + virtual FX_ARGB GetColor() const = 0; + virtual void SetFontWeight(FX_WORD wFontWeight) = 0; + virtual void SetFontVariant(FDE_CSSFONTVARIANT eFontVariant) = 0; + virtual void SetFontStyle(FDE_CSSFONTSTYLE eFontStyle) = 0; + virtual void SetFontSize(FX_FLOAT fFontSize) = 0; + virtual void SetColor(FX_ARGB dwFontColor) = 0; +}; +class IFDE_CSSBoundaryStyle +{ +public: + virtual FX_ARGB GetBorderLeftColor() const = 0; + virtual FX_ARGB GetBorderTopColor() const = 0; + virtual FX_ARGB GetBorderRightColor() const = 0; + virtual FX_ARGB GetBorderBottomColor() const = 0; + virtual FDE_CSSBORDERSTYLE GetBorderLeftStyle() const = 0; + virtual FDE_CSSBORDERSTYLE GetBorderTopStyle() const = 0; + virtual FDE_CSSBORDERSTYLE GetBorderRightStyle() const = 0; + virtual FDE_CSSBORDERSTYLE GetBorderBottomStyle() const = 0; + virtual const FDE_CSSRECT* GetBorderWidth() const = 0; + virtual const FDE_CSSRECT* GetMarginWidth() const = 0; + virtual const FDE_CSSRECT* GetPaddingWidth() const = 0; + virtual void SetBorderLeftColor(FX_ARGB dwBorderColor) = 0; + virtual void SetBorderTopColor(FX_ARGB dwBorderColor) = 0; + virtual void SetBorderRightColor(FX_ARGB dwBorderColor) = 0; + virtual void SetBorderBottomColor(FX_ARGB dwBorderColor) = 0; + + virtual void SetBorderLeftStyle(FDE_CSSBORDERSTYLE eBorderStyle) = 0; + virtual void SetBorderTopStyle(FDE_CSSBORDERSTYLE eBorderStyle) = 0; + virtual void SetBorderRightStyle(FDE_CSSBORDERSTYLE eBorderStyle) = 0; + virtual void SetBorderBottomStyle(FDE_CSSBORDERSTYLE eBorderStyle) = 0; + + virtual void SetBorderWidth(const FDE_CSSRECT &rect) = 0; + virtual void SetMarginWidth(const FDE_CSSRECT &rect) = 0; + virtual void SetPaddingWidth(const FDE_CSSRECT &rect) = 0; +}; +class IFDE_CSSPositionStyle +{ +public: + virtual FDE_CSSDISPLAY GetDisplay() const = 0; + virtual const FDE_CSSSIZE& GetBoxSize() const = 0; + virtual const FDE_CSSSIZE& GetMinBoxSize() const = 0; + virtual const FDE_CSSSIZE& GetMaxBoxSize() const = 0; + virtual FDE_CSSFLOAT GetFloat() const = 0; + virtual FDE_CSSCLEAR GetClear() const = 0; + virtual FDE_CSSPOSITION GetPosition() const = 0; + virtual FDE_CSSLENGTH GetTop() const = 0; + virtual FDE_CSSLENGTH GetBottom() const = 0; + virtual FDE_CSSLENGTH GetLeft() const = 0; + virtual FDE_CSSLENGTH GetRight() const = 0; + virtual void SetDisplay(FDE_CSSDISPLAY eDisplay) = 0; + virtual void SetBoxSize(const FDE_CSSSIZE &boxSize) = 0; + virtual void SetMinBoxSize(const FDE_CSSSIZE &minBoxSize) = 0; + virtual void SetMaxBoxSize(const FDE_CSSSIZE &maxBoxSize) = 0; + virtual void SetFloat(FDE_CSSFLOAT eFloat) = 0; + virtual void SetClear(FDE_CSSCLEAR eClear) = 0; +}; +class IFDE_CSSParagraphStyle +{ +public: + virtual FX_FLOAT GetLineHeight() const = 0; + virtual FDE_CSSWHITESPACE GetWhiteSpace() const = 0; + virtual const FDE_CSSLENGTH& GetTextIndent() const = 0; + virtual FDE_CSSTEXTALIGN GetTextAlign() const = 0; + virtual FDE_CSSVERTICALALIGN GetVerticalAlign() const = 0; + virtual FX_FLOAT GetNumberVerticalAlign() const = 0; + virtual FDE_CSSTEXTTRANSFORM GetTextTransform() const = 0; + virtual FX_DWORD GetTextDecoration() const = 0; + virtual const FDE_CSSLENGTH& GetLetterSpacing() const = 0; + virtual const FDE_CSSLENGTH& GetWordSpacing() const = 0; + virtual FDE_CSSWRITINGMODE GetWritingMode() const = 0; + virtual FDE_CSSWORDBREAK GetWordBreak() const = 0; + virtual FX_INT32 GetWidows() const = 0; + virtual FX_ARGB GetTextEmphasisColor() const = 0; + virtual FDE_CSSPAGEBREAK GetPageBreakBefore() const = 0; + virtual FDE_CSSPAGEBREAK GetPageBreakAfter() const = 0; + virtual FDE_CSSPAGEBREAK GetPageBreakInside() const = 0; + virtual FX_INT32 GetOrphans() const = 0; + virtual FDE_CSSLINEBREAK GetLineBreak() const = 0; + virtual FDE_CSSTEXTEMPHASISMARK GetTextEmphasisMark() const = 0; + virtual FDE_CSSTEXTEMPHASISFILL GetTextEmphasisFill() const = 0; + virtual FX_LPCWSTR GetTextEmphasisCustom() const = 0; + virtual FDE_CSSTEXTCOMBINE GetTextCombineType() const = 0; + virtual FX_BOOL HasTextCombineNumber() const = 0; + virtual FX_FLOAT GetTextCombineNumber() const = 0; + virtual void SetLineHeight(FX_FLOAT fLineHeight) = 0; + virtual void SetWhiteSpace(FDE_CSSWHITESPACE eWhiteSpace) = 0; + virtual void SetTextIndent(const FDE_CSSLENGTH &textIndent) = 0; + virtual void SetTextAlign(FDE_CSSTEXTALIGN eTextAlign) = 0; + virtual void SetVerticalAlign(FDE_CSSVERTICALALIGN eVerticalAlign) = 0; + virtual void SetNumberVerticalAlign(FX_FLOAT fAlign) = 0; + virtual void SetTextTransform(FDE_CSSTEXTTRANSFORM eTextTransform) = 0; + virtual void SetTextDecoration(FX_DWORD dwTextDecoration) = 0; + virtual void SetLetterSpacing(const FDE_CSSLENGTH &letterSpacing) = 0; + virtual void SetWordSpacing(const FDE_CSSLENGTH &wordSpacing) = 0; + virtual void SetWritingMode(FDE_CSSWRITINGMODE eWritingMode) = 0; + virtual void SetWordBreak(FDE_CSSWORDBREAK eWordBreak) = 0; + virtual void SetWidows(FX_INT32 iWidows) = 0; + virtual void SetTextEmphasisColor(FX_ARGB dwTextEmphasisColor) = 0; + virtual void SetPageBreakBefore(FDE_CSSPAGEBREAK ePageBreakBefore) = 0; + virtual void SetPageBreakAfter(FDE_CSSPAGEBREAK ePageBreakAfter) = 0; + virtual void SetPageBreakInside(FDE_CSSPAGEBREAK ePageBreakInside) = 0; + virtual void SetOrphans(FX_INT32 iOrphans) = 0; + virtual void SetLineBreak(FDE_CSSLINEBREAK eLineBreak) = 0; +}; +class IFDE_CSSBackgroundStyle +{ +public: + virtual FX_ARGB GetBKGColor() const = 0; + virtual FX_LPCWSTR GetBKGImage() const = 0; + virtual FDE_CSSBKGREPEAT GetBKGRepeat() const = 0; + virtual FDE_CSSBKGATTACHMENT GetBKGAttachment() const = 0; + virtual const FDE_CSSPOINT& GetBKGPosition() const = 0; + virtual void SetBKGColor(FX_ARGB dwBKGColor) = 0; + virtual void SetBKGPosition(const FDE_CSSPOINT &bkgPosition) = 0; +}; +class IFDE_CSSListStyle +{ +public: + virtual FDE_CSSLISTSTYLETYPE GetListStyleType() const = 0; + virtual FDE_CSSLISTSTYLEPOSITION GetListStylePosition() const = 0; + virtual FX_LPCWSTR GetListStyleImage() const = 0; + virtual void SetListStyleType(FDE_CSSLISTSTYLETYPE eListStyleType) = 0; + virtual void SetListStylePosition(FDE_CSSLISTSTYLEPOSITION eListStylePosition) = 0; +}; +class IFDE_CSSTableStyle +{ +public: + virtual FDE_CSSCAPTIONSIDE GetCaptionSide() const = 0; +}; +class IFDE_CSSVisualStyle +{ +public: + virtual FDE_CSSVISIBILITY GetVisibility() const = 0; + virtual FDE_CSSOVERFLOW GetOverflowX() const = 0; + virtual FDE_CSSOVERFLOW GetOverflowY() const = 0; + virtual void SetVisibility(FDE_CSSVISIBILITY eVisibility) = 0; +}; +class IFDE_CSSComputedStyle : public IFX_Unknown +{ +public: + virtual void Reset() = 0; + virtual IFDE_CSSFontStyle* GetFontStyles() const = 0; + virtual IFDE_CSSBoundaryStyle* GetBoundaryStyles() const = 0; + virtual IFDE_CSSPositionStyle* GetPositionStyles() const = 0; + virtual IFDE_CSSParagraphStyle* GetParagraphStyles() const = 0; + virtual IFDE_CSSBackgroundStyle* GetBackgroundStyles() const = 0; + virtual IFDE_CSSVisualStyle* GetVisualStyles() const = 0; + virtual IFDE_CSSListStyle* GetListStyles() const = 0; + virtual IFDE_CSSMultiColumnStyle* GetMultiColumnStyle() const = 0; + virtual IFDE_CSSTableStyle* GetTableStyle() const = 0; + virtual IFDE_CSSGeneratedContentStyle* GetGeneratedContentStyle() const = 0; + virtual IFDE_CSSRubyStyle* GetRubyStyle() const = 0; + virtual FX_BOOL GetCustomStyle(FX_WSTR wsName, CFX_WideString &wsValue) const = 0; +}; +enum FDE_CSSSTYLESHEETGROUP { + FDE_CSSSTYLESHEETGROUP_UserAgent, + FDE_CSSSTYLESHEETGROUP_User, + FDE_CSSSTYLESHEETGROUP_Author, + FDE_CSSSTYLESHEETGROUP_MAX, +}; +enum FDE_CSSSTYLESHEETPRIORITY { + FDE_CSSSTYLESHEETPRIORITY_High, + FDE_CSSSTYLESHEETPRIORITY_Mid, + FDE_CSSSTYLESHEETPRIORITY_Low, + FDE_CSSSTYLESHEETPRIORITY_MAX, +}; +class IFDE_CSSTagProvider +{ +public: + virtual CFX_WideStringC GetTagName() = 0; + virtual FX_POSITION GetFirstAttribute() = 0; + virtual void GetNextAttribute(FX_POSITION &pos, CFX_WideStringC &wsAttr, CFX_WideStringC &wsValue) = 0; +}; +class IFDE_CSSAccelerator +{ +public: + virtual void OnEnterTag(IFDE_CSSTagProvider *pTag) = 0; + virtual void OnLeaveTag(IFDE_CSSTagProvider *pTag) = 0; +}; +class IFDE_CSSStyleSelector +{ +public: + static IFDE_CSSStyleSelector* Create(); + virtual void Release() = 0; + virtual void SetFontMgr(IFX_FontMgr *pFontMgr) = 0; + virtual void SetDefFontSize(FX_FLOAT fFontSize) = 0; + virtual FX_BOOL SetStyleSheet(FDE_CSSSTYLESHEETGROUP eType, IFDE_CSSStyleSheet *pSheet) = 0; + virtual FX_BOOL SetStyleSheets(FDE_CSSSTYLESHEETGROUP eType, const CFDE_CSSStyleSheetArray *pArray) = 0; + virtual void SetStylePriority(FDE_CSSSTYLESHEETGROUP eType, FDE_CSSSTYLESHEETPRIORITY ePriority) = 0; + virtual void UpdateStyleIndex(FX_DWORD dwMediaList) = 0; + virtual IFDE_CSSAccelerator* InitAccelerator() = 0; + virtual IFDE_CSSComputedStyle* CreateComputedStyle(IFDE_CSSComputedStyle *pParentStyle) = 0; + virtual FX_INT32 MatchDeclarations(IFDE_CSSTagProvider *pTag, CFDE_CSSDeclarationArray &matchedDecls, FDE_CSSPERSUDO ePersudoType = FDE_CSSPERSUDO_NONE) = 0; + virtual void ComputeStyle(IFDE_CSSTagProvider *pTag, const IFDE_CSSDeclaration **ppDeclArray, FX_INT32 iDeclCount, IFDE_CSSComputedStyle *pDestStyle) = 0; +}; +#endif diff --git a/xfa/src/fdp/include/fde_img.h b/xfa/src/fdp/include/fde_img.h new file mode 100644 index 0000000000..808bc4c304 --- /dev/null +++ b/xfa/src/fdp/include/fde_img.h @@ -0,0 +1,76 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FDE_IMAGE +#define _FDE_IMAGE +class IFDE_Image; +#define FDE_IMAGEFORMAT_Unknown -1 +#define FDE_IMAGEFORMAT_BMP 0 +#define FDE_IMAGEFORMAT_GIF 1 +#define FDE_IMAGEFORMAT_JPEG 2 +#define FDE_IMAGEFORMAT_PNG 3 +#define FDE_IMAGEFORMAT_TIFF 4 +#define FDE_IMAGEFORMAT_JPEG2000 5 +#define FDE_IMAGEFORMAT_JBig2 6 +class IFDE_Image +{ +public: + static IFDE_Image* Create(IFX_Stream *pStream, FX_INT32 iFormat = FDE_IMAGEFORMAT_Unknown); + virtual void Release() = 0; + virtual FX_BOOL LoadImage() = 0; + virtual void FreeImage() = 0; + virtual FX_INT32 CountFrames() const = 0; + virtual FX_BOOL LoadFrame(FX_INT32 index) = 0; + virtual CFX_DIBitmap* GetFrameImage() = 0; + virtual FX_INT32 GetImageFormat() const = 0; + virtual FX_INT32 GetImageWidth() const = 0; + virtual FX_INT32 GetImageHeight() const = 0; + virtual FX_INT32 GetDelayTime(FX_INT32 iFrameIndex) const = 0; + virtual FX_INT32 GetLoopCount() const = 0; + virtual FX_BOOL StartLoadImage(CFX_DIBitmap *pDIBitmap, FX_INT32 dibX, FX_INT32 dibY, FX_INT32 dibCX, FX_INT32 dibCY, + FX_INT32 imgX, FX_INT32 imgY, FX_INT32 imgCX, FX_INT32 imgCY, FX_INT32 iFrameIndex = 0) = 0; + virtual FX_INT32 DoLoadImage(IFX_Pause *pPause = NULL) = 0; + virtual void StopLoadImage() = 0; +}; +#define FDE_IMAGEFILTER_Unknown -1 +#define FDE_IMAGEFILTER_Opacity 0 +#define FDE_IMAGEFILTER_GrayScale 1 +#define FDE_IMAGEFILTER_BlackWhite 2 +#define FDE_IMAGEFILTER_InvertColor 3 +#define FDE_IMAGEFILTER_TransparentColor 4 +#define FDE_IMAGEFILTER_MaskColor 5 +#define FDE_IMAGEFILTER_Brightness 6 +#define FDE_IMAGEFILTER_Contrast 7 +typedef struct _FDE_IMAGEFILTERPARAMS : public CFX_Target { + FX_INT32 iFilterType; +} FDE_IMAGEFILTERPARAMS, * FDE_LPIMAGEFILTERPARAMS; +typedef FDE_IMAGEFILTERPARAMS const * FDE_LPCIMAGEFILTERPARAMS; +typedef struct _FDE_OPACITYPARAMS : public FDE_IMAGEFILTERPARAMS { + FX_INT32 iOpacity; +} FDE_OPACITYPARAMS, * FDE_LPOPACITYPARAMS; +typedef FDE_OPACITYPARAMS const * FDE_LPCOPACITYPARAMS; +typedef struct _FDE_BLACKWHITEPARAMS : public FDE_IMAGEFILTERPARAMS { + FX_ARGB dwBlackColor; + FX_ARGB dwWhiteColor; +} FDE_BLACKWHITEPARAMS, * FDE_LPBLACKWHITEPARAMS; +typedef FDE_BLACKWHITEPARAMS const * FDE_LPCBLACKWHITEPARAMS; +typedef struct _FDE_TRANSPARENTPARAMS : public FDE_IMAGEFILTERPARAMS { + FX_ARGB color; +} FDE_TRANSPARENTPARAMS, * FDE_LPTRANSPARENTPARAMS; +typedef FDE_TRANSPARENTPARAMS const * FDE_LPCTRANSPARENTPARAMS; +typedef struct _FDE_MASKCOLORPARAMS : public FDE_IMAGEFILTERPARAMS { + FX_ARGB color; +} FDE_MASKCOLORPARAMS, * FDE_LPMASKCOLORPARAMS; +typedef FDE_MASKCOLORPARAMS const * FDE_LPCMASKCOLORPARAMS; +typedef struct _FDE_BRIGHTNESSPARAMS : public FDE_IMAGEFILTERPARAMS { + FX_INT32 iBrightness; +} FDE_BRIGHTNESSPARAMS, * FDE_LPBRIGHTNESSPARAMS; +typedef FDE_BRIGHTNESSPARAMS const * FDE_LPCBRIGHTNESSPARAMS; +typedef struct _FDE_CONTRASTPARAMS : public FDE_IMAGEFILTERPARAMS { + FX_INT32 iContrast; +} FDE_CONTRASTPARAMS, * FDE_LPCONTRASTPARAMS; +typedef FDE_CONTRASTPARAMS const * FDE_LPCCONTRASTPARAMS; +#endif diff --git a/xfa/src/fdp/include/fde_mem.h b/xfa/src/fdp/include/fde_mem.h new file mode 100644 index 0000000000..516e67c945 --- /dev/null +++ b/xfa/src/fdp/include/fde_mem.h @@ -0,0 +1,23 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FDE_MEM +#define _FDE_MEM +#ifdef __cplusplus +extern "C" { +#endif +#define FDE_Alloc(size) FX_Alloc(FX_BYTE, size) +#define FDE_Realloc(ptr, newSize) FX_Realloc(FX_BYTE, ptr, newSize) +#define FDE_Free(ptr) FX_Free(ptr) +#define FDE_New FXTARGET_New +#define FDE_Delete FXTARGET_Delete +#define FDE_NewWith FXTARGET_NewWith +#define FDE_DeleteWith FXTARGET_DeleteWith + +#ifdef __cplusplus +}; +#endif +#endif diff --git a/xfa/src/fdp/include/fde_pen.h b/xfa/src/fdp/include/fde_pen.h new file mode 100644 index 0000000000..7730b6a964 --- /dev/null +++ b/xfa/src/fdp/include/fde_pen.h @@ -0,0 +1,61 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FDE_PEN +#define _FDE_PEN +class IFDE_Pen; +#define FDE_PENTYPE_Unknown FDE_BRUSHTYPE_Unknown +#define FDE_PENTYPE_SolidColor FDE_BRUSHTYPE_Solid +#define FDE_PENTYPE_HatchBrush FDE_BRUSHTYPE_Hatch +#define FDE_PENTYPE_TextureBrush FDE_BRUSHTYPE_Texture +#define FDE_PENTYPE_LinearGradient FDE_BRUSHTYPE_LinearGradient +#define FDE_PENTYPE_MAX FDE_BRUSHTYPE_MAX +#define FDE_DASHSTYLE_Solid 0 +#define FDE_DASHSTYLE_Dash 1 +#define FDE_DASHSTYLE_Dot 2 +#define FDE_DASHSTYLE_DashDot 3 +#define FDE_DASHSTYLE_DashDotDot 4 +#define FDE_DASHSTYLE_Customized 5 +#define FDE_LINEJOIN_Miter 0 +#define FDE_LINEJOIN_Round 1 +#define FDE_LINEJOIN_Bevel 2 +#define FDE_LINECAP_Flat 0 +#define FDE_LINECAP_Round 1 +#define FDE_LINECAP_Square 2 +typedef struct _FDE_COMPOUNDPATTERN { + FX_FLOAT pos; + FX_FLOAT width; +} FDE_COMPOUNDPATTERN, * FDE_LPCOMPOUNDPATTERN; +typedef FDE_COMPOUNDPATTERN const * FDE_LPCCOMPOUNDPATTERN; +typedef CFX_ArrayTemplate CFDE_CompoundPatterns; +class IFDE_Pen +{ +public: + static IFDE_Pen* Create(); + virtual void Release() = 0; + virtual FX_INT32 GetType() const = 0; + virtual FX_ARGB GetColor() const = 0; + virtual void SetColor(FX_ARGB color) = 0; + virtual IFDE_Brush* GetBrush() const = 0; + virtual void SetBrush(IFDE_Brush *pBrush, FX_BOOL bAutoRelease) = 0; + virtual FX_INT32 GetLineCap() const = 0; + virtual void SetLineCap(FX_INT32 iLineCap) = 0; + virtual FX_INT32 GetDashStyle() const = 0; + virtual void SetDashStyle(FX_INT32 iDashStyle) = 0; + virtual FX_FLOAT GetDashPhase() const = 0; + virtual void SetDashPhase(FX_FLOAT fPhase) = 0; + virtual FX_INT32 CountDashArray() const = 0; + virtual FX_INT32 GetDashArray(CFX_FloatArray &dashArray) const = 0; + virtual void SetDashArray(const CFX_FloatArray &dashArray) = 0; + virtual FX_INT32 GetLineJoin() const = 0; + virtual void SetLineJoin(FX_INT32 iLineJoin) = 0; + virtual FX_FLOAT GetMiterLimit() const = 0; + virtual void SetMiterLimit(FX_FLOAT fMiterLimit) = 0; + virtual FX_INT32 CountCompoundPatterns() const = 0; + virtual FX_BOOL GetCompoundPatterns(CFDE_CompoundPatterns &compoundPatterns) const = 0; + virtual FX_BOOL SetCompoundPatterns(const CFDE_CompoundPatterns &compoundPatterns) = 0; +}; +#endif diff --git a/xfa/src/fdp/include/fde_psr.h b/xfa/src/fdp/include/fde_psr.h new file mode 100644 index 0000000000..64070e6648 --- /dev/null +++ b/xfa/src/fdp/include/fde_psr.h @@ -0,0 +1,94 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FDE_PARSER +#define _FDE_PARSER +enum FDE_VISUALOBJTYPE { + FDE_VISUALOBJ_Canvas = 0x00, + FDE_VISUALOBJ_Text = 0x01 , + FDE_VISUALOBJ_Image = 0x02 , + FDE_VISUALOBJ_Path = 0x04 , + FDE_VISUALOBJ_Widget = 0x08 , +}; +typedef struct _FDE_HVISUALOBJ { + FX_LPVOID pData; +} const * FDE_HVISUALOBJ; +class IFDE_VisualSet +{ +public: + virtual FDE_VISUALOBJTYPE GetType() = 0; + virtual FX_BOOL GetBBox(FDE_HVISUALOBJ hVisualObj, CFX_RectF &bbox) = 0; + virtual FX_BOOL GetMatrix(FDE_HVISUALOBJ hVisualObj, CFX_Matrix &matrix) = 0; + virtual FX_BOOL GetRect(FDE_HVISUALOBJ hVisualObj, CFX_RectF &rt) = 0; + virtual FX_BOOL GetClip(FDE_HVISUALOBJ hVisualObj, CFX_RectF &rt) = 0; +}; +class IFDE_CanvasSet : public IFDE_VisualSet +{ +public: + virtual FX_POSITION GetFirstPosition(FDE_HVISUALOBJ hCanvas) = 0; + virtual FDE_HVISUALOBJ GetNext(FDE_HVISUALOBJ hCanvas, FX_POSITION &pos, IFDE_VisualSet *&pVisualSet) = 0; + virtual FDE_HVISUALOBJ GetParentCanvas(FDE_HVISUALOBJ hCanvas, IFDE_VisualSet *&pVisualSet) = 0; +}; +class IFDE_TextSet : public IFDE_VisualSet +{ +public: + virtual FX_INT32 GetString(FDE_HVISUALOBJ hText, CFX_WideString &wsText) = 0; + virtual IFX_Font* GetFont(FDE_HVISUALOBJ hText) = 0; + virtual FX_FLOAT GetFontSize(FDE_HVISUALOBJ hText) = 0; + virtual FX_ARGB GetFontColor(FDE_HVISUALOBJ hText) = 0; + virtual FX_INT32 GetDisplayPos(FDE_HVISUALOBJ hText, FXTEXT_CHARPOS *pCharPos, FX_BOOL bCharCode = FALSE, CFX_WideString *pWSForms = NULL) = 0; + virtual FX_INT32 GetCharRects(FDE_HVISUALOBJ hText, CFX_RectFArray &rtArray) = 0; +}; +class IFDE_ImageSet : public IFDE_VisualSet +{ +public: + virtual IFDE_Image* GetImage(FDE_HVISUALOBJ hImage) = 0; + virtual FX_POSITION GetFirstFilterPosition(FDE_HVISUALOBJ hImage) = 0; + virtual FDE_LPCIMAGEFILTERPARAMS GetNextFilter(FDE_HVISUALOBJ hImage, FX_POSITION &pos) = 0; +}; +#define FDE_FILLMODE_Alternate 1 +#define FDE_FILLMODE_Winding 2 +#define FDE_PATHRENDER_Stroke 1 +#define FDE_PATHRENDER_Fill 2 +#define FDE_PATHRENDER_FillStroke 3 +class IFDE_PathSet : public IFDE_VisualSet +{ +public: + virtual IFDE_Path* GetPath(FDE_HVISUALOBJ hPath) = 0; + virtual FX_INT32 GetFillMode(FDE_HVISUALOBJ hPath) = 0; + virtual FX_INT32 GetRenderMode(FDE_HVISUALOBJ hPath) = 0; + virtual IFDE_Pen* GetPen(FDE_HVISUALOBJ hPath) = 0; + virtual FX_FLOAT GetPenWidth(FDE_HVISUALOBJ hPath) = 0; + virtual IFDE_Brush* GetBrush(FDE_HVISUALOBJ hPath) = 0; +}; +enum FDE_WIDGETOBJ { + FDE_WIDGETOBJ_Unknown = 0x0000, + FDE_WIDGETOBJ_Anchor = 0x0100, + FDE_WIDGETOBJ_NamedDest = 0x0200, + FDE_WIDGETOBJ_HyperLink = 0x0400, +}; +#define FDE_WIDGETPARAM_Uri 1 +#define FDE_WIDGETPARAM_Rects 2 +class IFDE_WidgetSet : public IFDE_VisualSet +{ +public: + virtual FDE_WIDGETOBJ GetWidgetType(FDE_HVISUALOBJ hWidget) = 0; + virtual FX_FLOAT GetFloat(FDE_HVISUALOBJ hWidget, FX_INT32 iParameter, FX_FLOAT fDefVal = 0.0f) = 0; + virtual FX_INT32 GetInteger(FDE_HVISUALOBJ hWidget, FX_INT32 iParameter, FX_INT32 iDefVal = 0) = 0; + virtual FX_BOOL GetString(FDE_HVISUALOBJ hWidget, FX_INT32 iParameter, CFX_WideString &wsValue) = 0; + virtual FX_BOOL GetRects(FDE_HVISUALOBJ hWidget, FX_INT32 iParameter, CFX_RectFArray &rects) = 0; +}; +class IFDE_VisualSetIterator +{ +public: + static IFDE_VisualSetIterator* Create(); + virtual void Release() = 0; + virtual FX_BOOL AttachCanvas(IFDE_CanvasSet *pCanvas) = 0; + virtual FX_BOOL FilterObjects(FX_DWORD dwObjects = 0xFFFFFFFF) = 0; + virtual void Reset() = 0; + virtual FDE_HVISUALOBJ GetNext(IFDE_VisualSet *&pVisualSet, FDE_HVISUALOBJ *phCanvasObj = NULL, IFDE_CanvasSet **ppCanvasSet = NULL) = 0; +}; +#endif diff --git a/xfa/src/fdp/include/fde_pth.h b/xfa/src/fdp/include/fde_pth.h new file mode 100644 index 0000000000..be3cc8d50e --- /dev/null +++ b/xfa/src/fdp/include/fde_pth.h @@ -0,0 +1,29 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FDE_PATH +#define _FDE_PATH +class IFDE_Path; +class IFDE_Path +{ +public: + static IFDE_Path* Create(); + virtual void Release() = 0; + virtual FX_BOOL StartFigure() = 0; + virtual FX_BOOL CloseFigure() = 0; + virtual void AddBezier(const CFX_PointsF &points) = 0; + virtual void AddBeziers(const CFX_PointsF &points) = 0; + virtual void AddCurve(const CFX_PointsF &points, FX_BOOL bClosed, FX_FLOAT fTension = 0.5f) = 0; + virtual void AddEllipse(const CFX_RectF &rect) = 0; + virtual void AddLines(const CFX_PointsF &points) = 0; + virtual void AddLine(const CFX_PointF &pt1, const CFX_PointF &pt2) = 0; + virtual void AddPath(const IFDE_Path *pSrc, FX_BOOL bConnect) = 0; + virtual void AddPolygon(const CFX_PointsF &points) = 0; + virtual void AddRectangle(const CFX_RectF &rect) = 0; + virtual void GetBBox(CFX_RectF &bbox) const = 0; + virtual void GetBBox(CFX_RectF &bbox, FX_FLOAT fLineWidth, FX_FLOAT fMiterLimit) const = 0; +}; +#endif diff --git a/xfa/src/fdp/include/fde_rdr.h b/xfa/src/fdp/include/fde_rdr.h new file mode 100644 index 0000000000..74c5d24516 --- /dev/null +++ b/xfa/src/fdp/include/fde_rdr.h @@ -0,0 +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 _FDE_RENDERCONTEXT +#define _FDE_RENDERCONTEXT +class IFDE_Page; +class IFDE_RenderDevice; +class IFDE_RenderContext; +void FDE_GetPageMatrix(CFX_Matrix &pageMatrix, const CFX_RectF &docPageRect, const CFX_Rect &devicePageRect, FX_INT32 iRotate, FX_DWORD dwCoordinatesType = 0); +enum FDE_RENDERSTATUS { + FDE_RENDERSTATUS_Reset = 0, + FDE_RENDERSTATUS_Paused , + FDE_RENDERSTATUS_Done , + FDE_RENDERSTATUS_Failed , +}; +class IFDE_RenderContext +{ +public: + static IFDE_RenderContext* Create(); + virtual void Release() = 0; + virtual FX_BOOL StartRender(IFDE_RenderDevice *pRenderDevice, + IFDE_CanvasSet *pCanvasSet, + const CFX_Matrix &tmDoc2Device + ) = 0; + virtual FDE_RENDERSTATUS GetStatus() const = 0; + virtual FDE_RENDERSTATUS DoRender(IFX_Pause *pPause = NULL) = 0; + virtual void StopRender() = 0; +}; +#endif diff --git a/xfa/src/fdp/include/fde_rdv.h b/xfa/src/fdp/include/fde_rdv.h new file mode 100644 index 0000000000..ee1e922c48 --- /dev/null +++ b/xfa/src/fdp/include/fde_rdv.h @@ -0,0 +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 + +#ifndef _FDE_RENDERDEVICE +#define _FDE_RENDERDEVICE +class IFDE_Pen; +class IFDE_Brush; +class IFDE_Image; +class CFX_DIBitmap; +class CFX_DIBSource; +class IFDE_RenderDevice; +typedef struct _FDE_HDEVICESTATE { + FX_LPVOID pData; +} * FDE_HDEVICESTATE; +class IFDE_RenderDevice +{ +public: + static IFDE_RenderDevice* Create(CFX_DIBitmap *pBitmap, FX_BOOL bRgbByteOrder = FALSE); + static IFDE_RenderDevice* Create(CFX_RenderDevice *pDevice); + virtual void Release() = 0; + + virtual FX_INT32 GetWidth() const = 0; + virtual FX_INT32 GetHeight() const = 0; + virtual FDE_HDEVICESTATE SaveState() = 0; + virtual void RestoreState(FDE_HDEVICESTATE hState) = 0; + virtual FX_BOOL SetClipPath(const IFDE_Path *pClip) = 0; + virtual IFDE_Path* GetClipPath() const = 0; + virtual FX_BOOL SetClipRect(const CFX_RectF &rtClip) = 0; + virtual const CFX_RectF& GetClipRect() = 0; + + virtual FX_FLOAT GetDpiX() const = 0; + virtual FX_FLOAT GetDpiY() const = 0; + + virtual FX_BOOL DrawImage(CFX_DIBSource *pDib, const CFX_RectF *pSrcRect, const CFX_RectF &dstRect, const CFX_Matrix *pImgMatrix = NULL, const CFX_Matrix *pDevMatrix = NULL) = 0; + virtual FX_BOOL DrawString(IFDE_Brush *pBrush, IFX_Font *pFont, const FXTEXT_CHARPOS *pCharPos, FX_INT32 iCount, FX_FLOAT fFontSize, const CFX_Matrix *pMatrix = NULL) = 0; + virtual FX_BOOL DrawBezier(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_PointF &pt1, const CFX_PointF &pt2, const CFX_PointF &pt3, const CFX_PointF &pt4, const CFX_Matrix *pMatrix = NULL) = 0; + virtual FX_BOOL DrawCurve(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_PointsF &points, FX_BOOL bClosed, FX_FLOAT fTension = 0.5f, const CFX_Matrix *pMatrix = NULL) = 0; + virtual FX_BOOL DrawEllipse(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_RectF &rect, const CFX_Matrix *pMatrix = NULL) = 0; + virtual FX_BOOL DrawLines(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_PointsF &points, const CFX_Matrix *pMatrix = NULL) = 0; + virtual FX_BOOL DrawLine(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_PointF &pt1, const CFX_PointF &pt2, const CFX_Matrix *pMatrix = NULL) = 0; + virtual FX_BOOL DrawPath(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const IFDE_Path *pPath, const CFX_Matrix *pMatrix = NULL) = 0; + virtual FX_BOOL DrawPolygon(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_PointsF &points, const CFX_Matrix *pMatrix = NULL) = 0; + virtual FX_BOOL DrawRectangle(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_RectF &rect, const CFX_Matrix *pMatrix = NULL) = 0; + virtual FX_BOOL FillClosedCurve(IFDE_Brush *pBrush, const CFX_PointsF &points, FX_FLOAT fTension = 0.5f, const CFX_Matrix *pMatrix = NULL) = 0; + virtual FX_BOOL FillEllipse(IFDE_Brush* pBrush, const CFX_RectF& rect, const CFX_Matrix *pMatrix = NULL) = 0; + virtual FX_BOOL FillPath(IFDE_Brush *pBrush, const IFDE_Path *pPath, const CFX_Matrix *pMatrix = NULL) = 0; + virtual FX_BOOL FillPolygon(IFDE_Brush *pBrush, const CFX_PointsF &points, const CFX_Matrix *pMatrix = NULL) = 0; + virtual FX_BOOL FillRectangle(IFDE_Brush *pBrush, const CFX_RectF &rect, const CFX_Matrix *pMatrix = NULL) = 0; +}; +#endif diff --git a/xfa/src/fdp/include/fde_tto.h b/xfa/src/fdp/include/fde_tto.h new file mode 100644 index 0000000000..25dead13ca --- /dev/null +++ b/xfa/src/fdp/include/fde_tto.h @@ -0,0 +1,69 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FDE_TEXTOUT +#define _FDE_TEXTOUT +class IFDE_TextOut; +#define FDE_TTOSTYLE_Underline 0x0001 +#define FDE_TTOSTYLE_Strikeout 0x0002 +#define FDE_TTOSTYLE_VerticalLayout 0x0004 +#define FDE_TTOSTYLE_SingleLine 0x0010 +#define FDE_TTOSTYLE_ExpandTab 0x0020 +#define FDE_TTOSTYLE_HotKey 0x0040 +#define FDE_TTOSTYLE_Ellipsis 0x0080 +#define FDE_TTOSTYLE_LineWrap 0x0100 +#define FDE_TTOSTYLE_ArabicShapes 0x0200 +#define FDE_TTOSTYLE_RTL 0x0400 +#define FDE_TTOSTYLE_ArabicContext 0x0800 +#define FDE_TTOSTYLE_LastLineHeight 0x1000 +#define FDE_TTOALIGNMENT_TopLeft 0 +#define FDE_TTOALIGNMENT_TopCenter 1 +#define FDE_TTOALIGNMENT_TopRight 2 +#define FDE_TTOALIGNMENT_TopAuto 3 +#define FDE_TTOALIGNMENT_CenterLeft 4 +#define FDE_TTOALIGNMENT_Center 5 +#define FDE_TTOALIGNMENT_CenterRight 6 +#define FDE_TTOALIGNMENT_CenterAuto 7 +#define FDE_TTOALIGNMENT_BottomLeft 8 +#define FDE_TTOALIGNMENT_BottomCenter 9 +#define FDE_TTOALIGNMENT_BottomRight 10 +#define FDE_TTOALIGNMENT_BottomAuto 11 +class IFDE_TextOut +{ +public: + static IFDE_TextOut* Create(); + virtual void Release() = 0; + virtual void SetFont(IFX_Font *pFont) = 0; + virtual void SetFontSize(FX_FLOAT fFontSize) = 0; + virtual void SetTextColor(FX_ARGB color) = 0; + virtual void SetStyles(FX_DWORD dwStyles) = 0; + virtual void SetTabWidth(FX_FLOAT fTabWidth) = 0; + virtual void SetEllipsisString(const CFX_WideString &wsEllipsis) = 0; + virtual void SetParagraphBreakChar(FX_WCHAR wch) = 0; + virtual void SetAlignment(FX_INT32 iAlignment) = 0; + virtual void SetLineSpace(FX_FLOAT fLineSpace) = 0; + virtual void SetDIBitmap(CFX_DIBitmap *pDIB) = 0; + virtual void SetRenderDevice(CFX_RenderDevice *pDevice) = 0; + virtual void SetClipRect(const CFX_Rect &rtClip) = 0; + virtual void SetClipRect(const CFX_RectF &rtClip) = 0; + virtual void SetMatrix(const CFX_Matrix &matrix) = 0; + virtual void SetLineBreakTolerance(FX_FLOAT fTolerance) = 0; + virtual void CalcSize(FX_LPCWSTR pwsStr, FX_INT32 iLength, CFX_Size &size) = 0; + virtual void CalcSize(FX_LPCWSTR pwsStr, FX_INT32 iLength, CFX_SizeF &size) = 0; + virtual void CalcSize(FX_LPCWSTR pwsStr, FX_INT32 iLength, CFX_Rect &rect) = 0; + virtual void CalcSize(FX_LPCWSTR pwsStr, FX_INT32 iLength, CFX_RectF &rect) = 0; + virtual void DrawText(FX_LPCWSTR pwsStr, FX_INT32 iLength, FX_INT32 x, FX_INT32 y) = 0; + virtual void DrawText(FX_LPCWSTR pwsStr, FX_INT32 iLength, FX_FLOAT x, FX_FLOAT y) = 0; + virtual void DrawText(FX_LPCWSTR pwsStr, FX_INT32 iLength, const CFX_Rect &rect) = 0; + virtual void DrawText(FX_LPCWSTR pwsStr, FX_INT32 iLength, const CFX_RectF &rect) = 0; + virtual void SetLogicClipRect(const CFX_RectF &rtClip) = 0; + virtual void CalcLogicSize(FX_LPCWSTR pwsStr, FX_INT32 iLength, CFX_SizeF &size) = 0; + virtual void CalcLogicSize(FX_LPCWSTR pwsStr, FX_INT32 iLength, CFX_RectF &rect) = 0; + virtual void DrawLogicText(FX_LPCWSTR pwsStr, FX_INT32 iLength, FX_FLOAT x, FX_FLOAT y) = 0; + virtual void DrawLogicText(FX_LPCWSTR pwsStr, FX_INT32 iLength, const CFX_RectF &rect) = 0; + virtual FX_INT32 GetTotalLines() = 0; +}; +#endif diff --git a/xfa/src/fdp/include/fde_xml.h b/xfa/src/fdp/include/fde_xml.h new file mode 100644 index 0000000000..b8b136b5aa --- /dev/null +++ b/xfa/src/fdp/include/fde_xml.h @@ -0,0 +1,188 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FDE_XML +#define _FDE_XML +class IFDE_XMLNode; +class IFDE_XMLInstruction; +class IFDE_XMLDeclaration; +class IFDE_XMLDeclComment; +class IFDE_XMLDeclCharData; +class IFDE_XMLDeclDocType; +class IFDE_XMLDeclElement; +class IFDE_XMLDeclAttriList; +class IFDE_XMLDeclNotition; +class IFDE_XMLDeclEntity; +class IFDE_XMLElement; +class IFDE_XMLText; +class IFDE_XMLDoc; +class IFDE_XMLParser; +class IFDE_XMLSyntaxParser; +#ifdef __cplusplus +extern "C" { +#endif +enum FDE_XMLNODETYPE { + FDE_XMLNODE_Unknown = 0, + FDE_XMLNODE_Instruction , + FDE_XMLNODE_Element , + FDE_XMLNODE_Text , + FDE_XMLNODE_CharData , +}; +typedef struct _FDE_XMLNODE { + FX_INT32 iNodeNum; + FDE_XMLNODETYPE eNodeType; +} FDE_XMLNODE, * FDE_LPXMLNODE; +typedef FDE_XMLNODE const * FDE_LPCXMLNODE; +typedef CFX_StackTemplate CFDE_XMLNodeStack; +FX_BOOL FDE_IsXMLValidChar(FX_WCHAR ch); +FX_BOOL FDE_IsXMLWhiteSpace(FX_WCHAR ch); +FX_BOOL FDE_IsXMLNameChar(FX_WCHAR ch, FX_BOOL bFirstChar); +#ifdef __cplusplus +} +#endif +class IFDE_XMLNode +{ +public: + virtual void Release() = 0; + virtual FDE_XMLNODETYPE GetType() const = 0; + virtual FX_INT32 CountChildNodes() const = 0; + virtual IFDE_XMLNode* GetChildNode(FX_INT32 index) const = 0; + virtual FX_INT32 GetChildNodeIndex(IFDE_XMLNode *pNode) const = 0; + virtual IFDE_XMLNode* GetPath(FX_LPCWSTR pPath, FX_INT32 iLength = -1, FX_BOOL bQualifiedName = TRUE) const = 0; + virtual FX_INT32 InsertChildNode(IFDE_XMLNode *pNode, FX_INT32 index = -1) = 0; + virtual void RemoveChildNode(IFDE_XMLNode *pNode) = 0; + virtual void DeleteChildren() = 0; + enum NodeItem {Root = 0, Parent, FirstSibling, PriorSibling, NextSibling, LastSibling, FirstNeighbor, PriorNeighbor, NextNeighbor, LastNeighbor, FirstChild, LastChild}; + virtual IFDE_XMLNode* GetNodeItem(NodeItem eItem) const = 0; + virtual FX_INT32 GetNodeLevel() const = 0; + virtual FX_BOOL InsertNodeItem(IFDE_XMLNode::NodeItem eItem, IFDE_XMLNode *pNode) = 0; + virtual IFDE_XMLNode* RemoveNodeItem(IFDE_XMLNode::NodeItem eItem) = 0; + virtual IFDE_XMLNode* Clone(FX_BOOL bRecursive) = 0; + virtual void SaveXMLNode(IFX_Stream *pXMLStream) = 0; +}; +class IFDE_XMLInstruction : public IFDE_XMLNode +{ +public: + static IFDE_XMLInstruction* Create(const CFX_WideString &wsTarget); + virtual void GetTargetName(CFX_WideString &wsTarget) const = 0; + virtual FX_INT32 CountAttributes() const = 0; + virtual FX_BOOL GetAttribute(FX_INT32 index, CFX_WideString &wsAttriName, CFX_WideString &wsAttriValue) const = 0; + virtual FX_BOOL HasAttribute(FX_LPCWSTR pwsAttriName) const = 0; + virtual void GetString(FX_LPCWSTR pwsAttriName, CFX_WideString &wsAttriValue, FX_LPCWSTR pwsDefValue = NULL) const = 0; + virtual void SetString(const CFX_WideString &wsAttriName, const CFX_WideString &wsAttriValue) = 0; + virtual FX_INT32 GetInteger(FX_LPCWSTR pwsAttriName, FX_INT32 iDefValue = 0) const = 0; + virtual void SetInteger(FX_LPCWSTR pwsAttriName, FX_INT32 iAttriValue) = 0; + virtual FX_FLOAT GetFloat(FX_LPCWSTR pwsAttriName, FX_FLOAT fDefValue = 0) const = 0; + virtual void SetFloat(FX_LPCWSTR pwsAttriName, FX_FLOAT fAttriValue) = 0; + virtual void RemoveAttribute(FX_LPCWSTR pwsAttriName) = 0; + virtual FX_INT32 CountData() const = 0; + virtual FX_BOOL GetData(FX_INT32 index, CFX_WideString &wsData) const = 0; + virtual void AppendData(const CFX_WideString &wsData) = 0; + virtual void RemoveData(FX_INT32 index) = 0; +}; +class IFDE_XMLElement : public IFDE_XMLNode +{ +public: + static IFDE_XMLElement* Create(const CFX_WideString &wsTag); + virtual void GetTagName(CFX_WideString &wsTag) const = 0; + virtual void GetLocalTagName(CFX_WideString &wsTag) const = 0; + virtual void GetNamespacePrefix(CFX_WideString &wsPrefix) const = 0; + virtual void GetNamespaceURI(CFX_WideString &wsNamespace) const = 0; + virtual FX_INT32 CountAttributes() const = 0; + virtual FX_BOOL GetAttribute(FX_INT32 index, CFX_WideString &wsAttriName, CFX_WideString &wsAttriValue) const = 0; + virtual FX_BOOL HasAttribute(FX_LPCWSTR pwsAttriName) const = 0; + virtual void GetString(FX_LPCWSTR pwsAttriName, CFX_WideString &wsAttriValue, FX_LPCWSTR pwsDefValue = NULL) const = 0; + virtual void SetString(const CFX_WideString &wsAttriName, const CFX_WideString &wsAttriValue) = 0; + virtual FX_INT32 GetInteger(FX_LPCWSTR pwsAttriName, FX_INT32 iDefValue = 0) const = 0; + virtual void SetInteger(FX_LPCWSTR pwsAttriName, FX_INT32 iAttriValue) = 0; + virtual FX_FLOAT GetFloat(FX_LPCWSTR pwsAttriName, FX_FLOAT fDefValue = 0) const = 0; + virtual void SetFloat(FX_LPCWSTR pwsAttriName, FX_FLOAT fAttriValue) = 0; + virtual void RemoveAttribute(FX_LPCWSTR pwsAttriName) = 0; + virtual void GetTextData(CFX_WideString &wsText) const = 0; + virtual void SetTextData(const CFX_WideString &wsText) = 0; +}; +class IFDE_XMLText : public IFDE_XMLNode +{ +public: + static IFDE_XMLText* Create(const CFX_WideString &wsText); + virtual void GetText(CFX_WideString &wsText) const = 0; + virtual void SetText(const CFX_WideString &wsText) = 0; +}; +class IFDE_XMLDeclaration : public IFDE_XMLNode +{ +public: +}; +class IFDE_XMLCharData : public IFDE_XMLDeclaration +{ +public: + static IFDE_XMLCharData* Create(const CFX_WideString &wsCData); + + virtual void GetCharData(CFX_WideString &wsCData) const = 0; + virtual void SetCharData(const CFX_WideString &wsCData) = 0; +}; +typedef struct _FDE_XMLREADERHANDLER { + FX_LPVOID pData; + + void (*OnTagEnter)(_FDE_XMLREADERHANDLER *pThis, FDE_XMLNODETYPE eType, const CFX_WideString &wsTagName); + void (*OnTagBreak)(_FDE_XMLREADERHANDLER *pThis, const CFX_WideString &wsTagName); + void (*OnTagClose)(_FDE_XMLREADERHANDLER *pThis, const CFX_WideString &wsTagName); + void (*OnAttribute)(_FDE_XMLREADERHANDLER *pThis, const CFX_WideString &wsName, const CFX_WideString &wsValue); + void (*OnData)(_FDE_XMLREADERHANDLER *pThis, FDE_XMLNODETYPE eType, const CFX_WideString &wsValue); +} FDE_XMLREADERHANDLER, * FDE_LPXMLREADERHANDLER; +class IFDE_XMLDoc +{ +public: + static IFDE_XMLDoc* Create(); + virtual void Release() = 0; + virtual FX_BOOL LoadXML(IFX_Stream *pXMLStream, FX_INT32 iXMLPlaneSize = 8192, FX_INT32 iTextDataSize = 256, FDE_LPXMLREADERHANDLER pHandler = NULL) = 0; + virtual FX_BOOL LoadXML(IFDE_XMLParser *pXMLParser) = 0; + virtual FX_INT32 DoLoad(IFX_Pause *pPause = NULL) = 0; + virtual void CloseXML() = 0; + virtual IFDE_XMLNode* GetRoot() const = 0; + virtual void SaveXML(IFX_Stream *pXMLStream = NULL, FX_BOOL bSaveBOM = TRUE) = 0; + virtual void SaveXMLNode(IFX_Stream *pXMLStream, IFDE_XMLNode *pNode) = 0; +}; +class IFDE_XMLParser +{ +public: + virtual void Release() = 0; + virtual FX_INT32 DoParser(IFX_Pause *pPause) = 0; +}; +#define FDE_XMLSYNTAXSTATUS_None 0x00 +#define FDE_XMLSYNTAXSTATUS_InstructionOpen 0x01 +#define FDE_XMLSYNTAXSTATUS_InstructionClose 0x02 +#define FDE_XMLSYNTAXSTATUS_ElementOpen 0x03 +#define FDE_XMLSYNTAXSTATUS_ElementBreak 0x04 +#define FDE_XMLSYNTAXSTATUS_ElementClose 0x05 +#define FDE_XMLSYNTAXSTATUS_TargetName 0x06 +#define FDE_XMLSYNTAXSTATUS_TagName 0x07 +#define FDE_XMLSYNTAXSTATUS_AttriName 0x08 +#define FDE_XMLSYNTAXSTATUS_AttriValue 0x09 +#define FDE_XMLSYNTAXSTATUS_Text 0x0A +#define FDE_XMLSYNTAXSTATUS_CData 0x0B +#define FDE_XMLSYNTAXSTATUS_TargetData 0x0C +#define FDE_XMLSYNTAXSTATUS_Error 0xFE +#define FDE_XMLSYNTAXSTATUS_EOS 0xFF +class IFDE_XMLSyntaxParser +{ +public: + static IFDE_XMLSyntaxParser* Create(); + virtual void Release() = 0; + virtual void Init(IFX_Stream *pStream, FX_INT32 iXMLPlaneSize, FX_INT32 iTextDataSize = 256) = 0; + virtual FX_DWORD DoSyntaxParse() = 0; + virtual FX_INT32 GetStatus() const = 0; + virtual FX_INT32 GetCurrentPos() const = 0; + virtual FX_FILESIZE GetCurrentBinaryPos() const = 0; + virtual FX_INT32 GetCurrentNodeNumber() const = 0; + virtual FX_INT32 GetLastNodeNumber() const = 0; + virtual void GetTargetName(CFX_WideString &wsTarget) const = 0; + virtual void GetTagName(CFX_WideString &wsTag) const = 0; + virtual void GetAttributeName(CFX_WideString &wsAttriName) const = 0; + virtual void GetAttributeValue(CFX_WideString &wsAttriValue) const = 0; + virtual void GetTextData(CFX_WideString &wsText) const = 0; + virtual void GetTargetData(CFX_WideString &wsData) const = 0; +}; +#endif diff --git a/xfa/src/fdp/src/css/fde_csscache.cpp b/xfa/src/fdp/src/css/fde_csscache.cpp new file mode 100644 index 0000000000..13ff27b8e7 --- /dev/null +++ b/xfa/src/fdp/src/css/fde_csscache.cpp @@ -0,0 +1,163 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "fde_csscache.h" +_FDE_CSSCACHEITEM::_FDE_CSSCACHEITEM(IFDE_CSSStyleSheet *p) + : pStylesheet(p) + , dwActivity(0) +{ + FXSYS_assert(pStylesheet); + pStylesheet->AddRef(); +} +_FDE_CSSCACHEITEM::~_FDE_CSSCACHEITEM() +{ + pStylesheet->Release(); +} +IFDE_CSSStyleSheetCache* IFDE_CSSStyleSheetCache::Create() +{ + return FDE_New CFDE_CSSStyleSheetCache; +} +CFDE_CSSStyleSheetCache::CFDE_CSSStyleSheetCache() + : m_pFixedStore(NULL) + , m_iMaxItems(5) +{ +} +CFDE_CSSStyleSheetCache::~CFDE_CSSStyleSheetCache() +{ + FX_POSITION pos = m_Stylesheets.GetStartPosition(); + if (pos != NULL) { + CFX_ByteString szKey; + FX_LPVOID pValue; + while (pos != NULL) { + m_Stylesheets.GetNextAssoc(pos, szKey, pValue); + FDE_DeleteWith(FDE_CSSCACHEITEM, m_pFixedStore, (FDE_LPCSSCACHEITEM)pValue); + } + m_Stylesheets.RemoveAll(); + } + if (m_pFixedStore != NULL) { + m_pFixedStore->Release(); + } +} +void CFDE_CSSStyleSheetCache::AddStyleSheet(FX_BSTR szKey, IFDE_CSSStyleSheet *pStyleSheet) +{ + FXSYS_assert(pStyleSheet != NULL); + if (m_pFixedStore == NULL) { + m_pFixedStore = FX_CreateAllocator(FX_ALLOCTYPE_Fixed, FX_MAX(10, m_iMaxItems), sizeof(FDE_CSSCACHEITEM)); + FXSYS_assert(m_pFixedStore != NULL); + } + FX_LPVOID pValue = NULL; + if (m_Stylesheets.Lookup(szKey, pValue)) { + FDE_LPCSSCACHEITEM pItem = (FDE_LPCSSCACHEITEM)pValue; + if (pItem->pStylesheet != pStyleSheet) { + pItem->pStylesheet->Release(); + pItem->pStylesheet = pStyleSheet; + pItem->pStylesheet->AddRef(); + pItem->dwActivity = 0; + } + } else { + while (m_Stylesheets.GetCount() >= m_iMaxItems) { + RemoveLowestActivityItem(); + } + FDE_LPCSSCACHEITEM pItem = FDE_NewWith(m_pFixedStore) FDE_CSSCACHEITEM(pStyleSheet); + FXSYS_assert(pItem != NULL); + m_Stylesheets.SetAt(szKey, pItem); + } +} +IFDE_CSSStyleSheet* CFDE_CSSStyleSheetCache::GetStyleSheet(FX_BSTR szKey) const +{ + FX_LPVOID pValue = NULL; + if (m_Stylesheets.Lookup(szKey, pValue)) { + FDE_LPCSSCACHEITEM pItem = (FDE_LPCSSCACHEITEM)pValue; + pItem->dwActivity++; + pItem->pStylesheet->AddRef(); + return pItem->pStylesheet; + } + return NULL; +} +void CFDE_CSSStyleSheetCache::RemoveStyleSheet(FX_BSTR szKey) +{ + FX_LPVOID pValue = NULL; + if (!m_Stylesheets.Lookup(szKey, pValue)) { + return; + } + FDE_DeleteWith(FDE_CSSCACHEITEM, m_pFixedStore, (FDE_LPCSSCACHEITEM)pValue); + m_Stylesheets.RemoveKey(szKey); +} +void CFDE_CSSStyleSheetCache::RemoveLowestActivityItem() +{ + FX_POSITION pos = m_Stylesheets.GetStartPosition(); + CFX_ByteString szKey; + FX_LPVOID pValue; + FDE_LPCSSCACHEITEM pItem = NULL; + CFX_ByteString szItem; + while (pos != NULL) { + m_Stylesheets.GetNextAssoc(pos, szKey, pValue); + switch (szKey.GetID()) { + case FXBSTR_ID('#', 'U', 'S', 'E'): + case FXBSTR_ID('#', 'A', 'G', 'E'): + continue; + } + FDE_LPCSSCACHEITEM p = (FDE_LPCSSCACHEITEM)pValue; + if (pItem == NULL || pItem->dwActivity > p->dwActivity) { + szItem = szKey; + pItem = p; + } + } + if (pItem != NULL) { + FDE_DeleteWith(FDE_CSSCACHEITEM, m_pFixedStore, pItem); + m_Stylesheets.RemoveKey(szItem); + } +} +_FDE_CSSTAGCACHE::_FDE_CSSTAGCACHE(_FDE_CSSTAGCACHE *parent, IFDE_CSSTagProvider *tag) + : pTag(tag) + , pParent(parent) + , dwIDHash(0) + , dwTagHash(0) + , iClassIndex(0) + , dwClassHashs(1) +{ + FXSYS_assert(pTag != NULL); + CFX_WideStringC wsValue, wsName = pTag->GetTagName(); + dwTagHash = FX_HashCode_String_GetW(wsName.GetPtr(), wsName.GetLength(), TRUE); + FX_POSITION pos = pTag->GetFirstAttribute(); + while (pos != NULL) { + pTag->GetNextAttribute(pos, wsName, wsValue); + FX_DWORD dwNameHash = FX_HashCode_String_GetW(wsName.GetPtr(), wsName.GetLength(), TRUE); + static const FX_DWORD s_dwIDHash = FX_HashCode_String_GetW((FX_LPCWSTR)L"id", 2, TRUE); + static const FX_DWORD s_dwClassHash = FX_HashCode_String_GetW((FX_LPCWSTR)L"class", 5, TRUE); + if (dwNameHash == s_dwClassHash) { + FX_DWORD dwHash = FX_HashCode_String_GetW(wsValue.GetPtr(), wsValue.GetLength()); + dwClassHashs.Add(dwHash); + } else if (dwNameHash == s_dwIDHash) { + dwIDHash = FX_HashCode_String_GetW(wsValue.GetPtr(), wsValue.GetLength()); + } + } +} +_FDE_CSSTAGCACHE::_FDE_CSSTAGCACHE(const _FDE_CSSTAGCACHE &it) + : pTag(it.pTag) + , pParent(it.pParent) + , dwIDHash(it.dwIDHash) + , dwTagHash(it.dwTagHash) + , iClassIndex(0) + , dwClassHashs(1) +{ + if (it.dwClassHashs.GetSize() > 0) { + dwClassHashs.Copy(it.dwClassHashs); + } +} +void CFDE_CSSAccelerator::OnEnterTag(IFDE_CSSTagProvider *pTag) +{ + FDE_CSSTAGCACHE *pTop = GetTopElement(); + FDE_CSSTAGCACHE item(pTop, pTag); + m_Stack.Push(item); +} +void CFDE_CSSAccelerator::OnLeaveTag(IFDE_CSSTagProvider *pTag) +{ + FDE_CSSTAGCACHE *pItem = m_Stack.GetTopElement(); + FXSYS_assert(pItem && pItem->GetTag() == pTag); + m_Stack.Pop(); +} diff --git a/xfa/src/fdp/src/css/fde_csscache.h b/xfa/src/fdp/src/css/fde_csscache.h new file mode 100644 index 0000000000..f4b8cffd57 --- /dev/null +++ b/xfa/src/fdp/src/css/fde_csscache.h @@ -0,0 +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 + +#ifndef _FDE_CSSCACHE +#define _FDE_CSSCACHE +typedef struct _FDE_CSSCACHEITEM : public CFX_Target { + _FDE_CSSCACHEITEM(IFDE_CSSStyleSheet *p); + ~_FDE_CSSCACHEITEM(); + IFDE_CSSStyleSheet *pStylesheet; + FX_DWORD dwActivity; +} FDE_CSSCACHEITEM, * FDE_LPCSSCACHEITEM; +class CFDE_CSSStyleSheetCache : public IFDE_CSSStyleSheetCache, public CFX_ThreadLock, public CFX_Target +{ +public: + CFDE_CSSStyleSheetCache(); + ~CFDE_CSSStyleSheetCache(); + virtual void Release() + { + FDE_Delete this; + } + + virtual void SetMaxItems(FX_INT32 iMaxCount = 5) + { + FXSYS_assert(iMaxCount >= 3); + m_iMaxItems = iMaxCount; + } + + virtual void AddStyleSheet(FX_BSTR szKey, IFDE_CSSStyleSheet *pStyleSheet); + virtual IFDE_CSSStyleSheet* GetStyleSheet(FX_BSTR szKey) const; + virtual void RemoveStyleSheet(FX_BSTR szKey); +protected: + void RemoveLowestActivityItem(); + CFX_MapByteStringToPtr m_Stylesheets; + IFX_MEMAllocator *m_pFixedStore; + FX_INT32 m_iMaxItems; +}; +typedef struct _FDE_CSSTAGCACHE : public CFX_Target { +public: + _FDE_CSSTAGCACHE(_FDE_CSSTAGCACHE *parent, IFDE_CSSTagProvider *tag); + _FDE_CSSTAGCACHE(const _FDE_CSSTAGCACHE &it); + _FDE_CSSTAGCACHE* GetParent() const + { + return pParent; + } + IFDE_CSSTagProvider* GetTag() const + { + return pTag; + } + FX_DWORD HashID() const + { + return dwIDHash; + } + FX_DWORD HashTag() const + { + return dwTagHash; + } + FX_INT32 CountHashClass() const + { + return dwClassHashs.GetSize(); + } + void SetClassIndex(FX_INT32 index) + { + iClassIndex = index; + } + FX_DWORD HashClass() const + { + return iClassIndex < dwClassHashs.GetSize() ? dwClassHashs.GetAt(iClassIndex) : 0; + } +protected: + IFDE_CSSTagProvider *pTag; + _FDE_CSSTAGCACHE *pParent; + FX_DWORD dwIDHash; + FX_DWORD dwTagHash; + FX_INT32 iClassIndex; + CFDE_DWordArray dwClassHashs; +} FDE_CSSTAGCACHE, * FDE_LPCSSTAGCACHE; +typedef CFX_ObjectStackTemplate CFDE_CSSTagStack; +class CFDE_CSSAccelerator : public IFDE_CSSAccelerator, public CFX_Target +{ +public: + virtual void OnEnterTag(IFDE_CSSTagProvider *pTag); + virtual void OnLeaveTag(IFDE_CSSTagProvider *pTag); + void Clear() + { + m_Stack.RemoveAll(); + } + FDE_LPCSSTAGCACHE GetTopElement() const + { + return m_Stack.GetTopElement(); + } +protected: + CFDE_CSSTagStack m_Stack; +}; +#endif diff --git a/xfa/src/fdp/src/css/fde_cssdatatable.cpp b/xfa/src/fdp/src/css/fde_cssdatatable.cpp new file mode 100644 index 0000000000..b449b27c25 --- /dev/null +++ b/xfa/src/fdp/src/css/fde_cssdatatable.cpp @@ -0,0 +1,729 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "fde_cssdatatable.h" +#ifdef _cplusplus +extern "C" { +#endif + FX_BOOL FDE_CSSLengthToFloat(const FDE_CSSLENGTH &len, FX_FLOAT fPercentBase, FX_FLOAT &fResult) + { + switch (len.GetUnit()) { + case FDE_CSSLENGTHUNIT_Point: + fResult = len.GetValue(); + return TRUE; + case FDE_CSSLENGTHUNIT_Percent: + fResult = len.GetValue() * fPercentBase; + return TRUE; + default: + return FALSE; + } + } + CFX_FloatRect FDE_CSSBoundaryToRect(IFDE_CSSBoundaryStyle *pBoundStyle, FX_FLOAT fContainerWidth, FX_BOOL bPadding, FX_BOOL bBorder, FX_BOOL bMargin) + { + FXSYS_assert(pBoundStyle != NULL); + FX_FLOAT fResult; + const FDE_CSSRECT *pRect; + CFX_FloatRect rect(0, 0, 0, 0); + if (bPadding) { + pRect = pBoundStyle->GetPaddingWidth(); + if (pRect != NULL) { + if (FDE_CSSLengthToFloat(pRect->left, fContainerWidth, fResult)) { + rect.left += fResult; + } + if (FDE_CSSLengthToFloat(pRect->top, fContainerWidth, fResult)) { + rect.top += fResult; + } + if (FDE_CSSLengthToFloat(pRect->right, fContainerWidth, fResult)) { + rect.right += fResult; + } + if (FDE_CSSLengthToFloat(pRect->bottom, fContainerWidth, fResult)) { + rect.bottom += fResult; + } + } + } + if (bBorder) { + pRect = pBoundStyle->GetBorderWidth(); + if (pRect != NULL) { + if (FDE_CSSLengthToFloat(pRect->left, fContainerWidth, fResult)) { + rect.left += fResult; + } + if (FDE_CSSLengthToFloat(pRect->top, fContainerWidth, fResult)) { + rect.top += fResult; + } + if (FDE_CSSLengthToFloat(pRect->right, fContainerWidth, fResult)) { + rect.right += fResult; + } + if (FDE_CSSLengthToFloat(pRect->bottom, fContainerWidth, fResult)) { + rect.bottom += fResult; + } + } + } + if (bMargin) { + pRect = pBoundStyle->GetMarginWidth(); + if (pRect != NULL) { + if (FDE_CSSLengthToFloat(pRect->left, fContainerWidth, fResult)) { + rect.left += fResult; + } + if (FDE_CSSLengthToFloat(pRect->top, fContainerWidth, fResult)) { + rect.top += fResult; + } + if (FDE_CSSLengthToFloat(pRect->right, fContainerWidth, fResult)) { + rect.right += fResult; + } + if (FDE_CSSLengthToFloat(pRect->bottom, fContainerWidth, fResult)) { + rect.bottom += fResult; + } + } + } + return rect; + } + FX_DWORD FDE_CSSFontStyleToFDE(IFDE_CSSFontStyle *pFontStyle) + { + FXSYS_assert(pFontStyle != NULL); + FX_DWORD dwFontStyle = FX_FONTSTYLE_Normal; + if (pFontStyle->GetFontStyle() == FDE_CSSFONTSTYLE_Italic) { + dwFontStyle |= FX_FONTSTYLE_Italic; + } + if (pFontStyle->GetFontWeight() >= 700) { + dwFontStyle |= FX_FONTSTYLE_Bold; + } + return dwFontStyle; + } + static const FDE_CSSPROPERTYTABLE g_FDE_CSSProperties[] = { + {FDE_CSSPROPERTY_WritingMode, (FX_LPCWSTR)L"writing-mode", 0x01878076, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_ColumnRuleWidth, (FX_LPCWSTR)L"column-rule-width", 0x0200FB00, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_BorderLeft, (FX_LPCWSTR)L"border-left", 0x04080036, FDE_CSSVALUETYPE_Shorthand}, + {FDE_CSSPROPERTY_ColumnRule, (FX_LPCWSTR)L"column-rule", 0x04C83DF3, FDE_CSSVALUETYPE_Shorthand}, + {FDE_CSSPROPERTY_Height, (FX_LPCWSTR)L"height", 0x05A5C519, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_CounterReset, (FX_LPCWSTR)L"counter-reset", 0x0894F9B0, FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeNumber | FDE_CSSVALUETYPE_MaybeString}, + {FDE_CSSPROPERTY_Content, (FX_LPCWSTR)L"content", 0x097BE91B, FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeURI | FDE_CSSVALUETYPE_MaybeString}, + {FDE_CSSPROPERTY_RubyPosition, (FX_LPCWSTR)L"ruby-position", 0x09ACD024, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_BackgroundColor, (FX_LPCWSTR)L"background-color", 0x09E8E8AC, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeColor}, + {FDE_CSSPROPERTY_Width, (FX_LPCWSTR)L"width", 0x0A8A8F80, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_Src, (FX_LPCWSTR)L"src", 0x0BD37048, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeURI}, + {FDE_CSSPROPERTY_Top, (FX_LPCWSTR)L"top", 0x0BEDAF33, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_Margin, (FX_LPCWSTR)L"margin", 0x0CB016BE, FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_BorderColor, (FX_LPCWSTR)L"border-color", 0x0CBB528A, FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeColor}, + {FDE_CSSPROPERTY_Widows, (FX_LPCWSTR)L"widows", 0x1026C59D, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_BorderBottomColor, (FX_LPCWSTR)L"border-bottom-color", 0x121E22EC, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeColor}, + {FDE_CSSPROPERTY_TextIndent, (FX_LPCWSTR)L"text-indent", 0x169ADB74, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_Right, (FX_LPCWSTR)L"right", 0x193ADE3E, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_TextEmphasisStyle, (FX_LPCWSTR)L"text-emphasis-style", 0x20DBAF4A, FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeString}, + {FDE_CSSPROPERTY_PaddingLeft, (FX_LPCWSTR)L"padding-left", 0x228CF02F, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_ColumnWidth, (FX_LPCWSTR)L"column-width", 0x24C9AC9B, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_MarginLeft, (FX_LPCWSTR)L"margin-left", 0x297C5656, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_Border, (FX_LPCWSTR)L"border", 0x2A23349E, FDE_CSSVALUETYPE_Shorthand}, + {FDE_CSSPROPERTY_BorderTop, (FX_LPCWSTR)L"border-top", 0x2B866ADE, FDE_CSSVALUETYPE_Shorthand}, + {FDE_CSSPROPERTY_RubyOverhang, (FX_LPCWSTR)L"ruby-overhang", 0x2CCA0D89, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_PageBreakBefore, (FX_LPCWSTR)L"page-break-before", 0x3119B36F, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_MaxHeight, (FX_LPCWSTR)L"max-height", 0x343597EC, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_MinWidth, (FX_LPCWSTR)L"min-width", 0x35832871, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_BorderLeftColor, (FX_LPCWSTR)L"border-left-color", 0x35C64022, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeColor}, + {FDE_CSSPROPERTY_Bottom, (FX_LPCWSTR)L"bottom", 0x399F02B5, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_Quotes, (FX_LPCWSTR)L"quotes", 0x3D8C6A01, FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeString}, + {FDE_CSSPROPERTY_MaxWidth, (FX_LPCWSTR)L"max-width", 0x3EA274F3, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_PaddingRight, (FX_LPCWSTR)L"padding-right", 0x3F616AC2, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_ListStyleImage, (FX_LPCWSTR)L"list-style-image", 0x42A8A86A, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeURI}, + {FDE_CSSPROPERTY_WhiteSpace, (FX_LPCWSTR)L"white-space", 0x42F0429A, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_BorderBottom, (FX_LPCWSTR)L"border-bottom", 0x452CE780, FDE_CSSVALUETYPE_Shorthand}, + {FDE_CSSPROPERTY_ListStyleType, (FX_LPCWSTR)L"list-style-type", 0x48094789, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_WordBreak, (FX_LPCWSTR)L"word-break", 0x4D74A3CE, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_OverflowX, (FX_LPCWSTR)L"overflow-x", 0x4ECEBF99, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_OverflowY, (FX_LPCWSTR)L"overflow-y", 0x4ECEBF9A, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_BorderTopColor, (FX_LPCWSTR)L"border-top-color", 0x5109B8CA, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeColor}, + {FDE_CSSPROPERTY_FontFamily, (FX_LPCWSTR)L"font-family", 0x574686E6, FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeString}, + {FDE_CSSPROPERTY_Cursor, (FX_LPCWSTR)L"cursor", 0x59DFCA5E, FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeString}, + {FDE_CSSPROPERTY_RubyAlign, (FX_LPCWSTR)L"ruby-align", 0x6077BDFA, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_ColumnRuleColor, (FX_LPCWSTR)L"column-rule-color", 0x65DDFD9F, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeColor}, + {FDE_CSSPROPERTY_FontWeight, (FX_LPCWSTR)L"font-weight", 0x6692F60C, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_BorderRightStyle, (FX_LPCWSTR)L"border-right-style", 0x6920DDA7, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_MinHeight, (FX_LPCWSTR)L"min-height", 0x6AAE312A, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_Color, (FX_LPCWSTR)L"color", 0x6E67921F, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeColor}, + {FDE_CSSPROPERTY_LetterSpacing, (FX_LPCWSTR)L"letter-spacing", 0x70536102, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_EmptyCells, (FX_LPCWSTR)L"empty-cells", 0x7531528F, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_TextAlign, (FX_LPCWSTR)L"text-align", 0x7553F1BD, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_RubySpan, (FX_LPCWSTR)L"ruby-span", 0x76FCFCE1, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeFunction}, + {FDE_CSSPROPERTY_Position, (FX_LPCWSTR)L"position", 0x814F82B5, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_BorderStyle, (FX_LPCWSTR)L"border-style", 0x82A4CD5C, FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_BorderBottomStyle, (FX_LPCWSTR)L"border-bottom-style", 0x88079DBE, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_BorderCollapse, (FX_LPCWSTR)L"border-collapse", 0x8883C7FE, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_ColumnCount, (FX_LPCWSTR)L"column-count", 0x89936A64, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_BorderRightWidth, (FX_LPCWSTR)L"border-right-width", 0x8F5A6036, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_UnicodeBidi, (FX_LPCWSTR)L"unicode-bidi", 0x91670F6C, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_VerticalAlign, (FX_LPCWSTR)L"vertical-align", 0x934A87D2, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_PaddingTop, (FX_LPCWSTR)L"padding-top", 0x959D22B7, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_Columns, (FX_LPCWSTR)L"columns", 0x96FA5D81, FDE_CSSVALUETYPE_Shorthand}, + {FDE_CSSPROPERTY_Overflow, (FX_LPCWSTR)L"overflow", 0x97B76B54, FDE_CSSVALUETYPE_Shorthand}, + {FDE_CSSPROPERTY_TableLayout, (FX_LPCWSTR)L"table-layout", 0x9B1CB4B3, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_FontVariant, (FX_LPCWSTR)L"font-variant", 0x9C785779, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_ListStyle, (FX_LPCWSTR)L"list-style", 0x9E6C471A, FDE_CSSVALUETYPE_Shorthand}, + {FDE_CSSPROPERTY_BackgroundPosition, (FX_LPCWSTR)L"background-position", 0xA8846D22, FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_BorderWidth, (FX_LPCWSTR)L"border-width", 0xA8DE4FEB, FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_TextEmphasisColor, (FX_LPCWSTR)L"text-emphasis-color", 0xAAF23478, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeColor}, + {FDE_CSSPROPERTY_BorderLeftStyle, (FX_LPCWSTR)L"border-left-style", 0xABAFBAF4, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_PageBreakInside, (FX_LPCWSTR)L"page-break-inside", 0xACB695F8, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_TextEmphasis, (FX_LPCWSTR)L"text-emphasis", 0xAD0E580C, FDE_CSSVALUETYPE_Shorthand}, + {FDE_CSSPROPERTY_BorderBottomWidth, (FX_LPCWSTR)L"border-bottom-width", 0xAE41204D, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_ColumnGap, (FX_LPCWSTR)L"column-gap", 0xB5C1BA73, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_Orphans, (FX_LPCWSTR)L"orphans", 0xB716467B, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_BorderRight, (FX_LPCWSTR)L"border-right", 0xB78E9EA9, FDE_CSSVALUETYPE_Shorthand}, + {FDE_CSSPROPERTY_FontSize, (FX_LPCWSTR)L"font-size", 0xB93956DF, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_PageBreakAfter, (FX_LPCWSTR)L"page-break-after", 0xBC358AEE, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_CaptionSide, (FX_LPCWSTR)L"caption-side", 0xC03F3560, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_BackgroundRepeat, (FX_LPCWSTR)L"background-repeat", 0xC2C2FDCE, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_BorderTopStyle, (FX_LPCWSTR)L"border-top-style", 0xC6F3339C, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_BorderSpacing, (FX_LPCWSTR)L"border-spacing", 0xC72030F0, FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_TextTransform, (FX_LPCWSTR)L"text-transform", 0xC88EEA6E, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_FontStyle, (FX_LPCWSTR)L"font-style", 0xCB1950F5, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_Font, (FX_LPCWSTR)L"font", 0xCD308B77, FDE_CSSVALUETYPE_Shorthand}, + {FDE_CSSPROPERTY_LineHeight, (FX_LPCWSTR)L"line-height", 0xCFCACE2E, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_MarginRight, (FX_LPCWSTR)L"margin-right", 0xD13C58C9, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_Float, (FX_LPCWSTR)L"float", 0xD1532876, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_BorderLeftWidth, (FX_LPCWSTR)L"border-left-width", 0xD1E93D83, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_Display, (FX_LPCWSTR)L"display", 0xD4224C36, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_Clear, (FX_LPCWSTR)L"clear", 0xD8ED1467, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_ColumnRuleStyle, (FX_LPCWSTR)L"column-rule-style", 0xDBC77871, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_TextCombine, (FX_LPCWSTR)L"text-combine", 0xDC5207CF, FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_ListStylePosition, (FX_LPCWSTR)L"list-style-position", 0xE1A1DE3C, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_Visibility, (FX_LPCWSTR)L"visibility", 0xE29F5168, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_PaddingBottom, (FX_LPCWSTR)L"padding-bottom", 0xE555B3B9, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_BackgroundAttachment, (FX_LPCWSTR)L"background-attachment", 0xE77981F6, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_BackgroundImage, (FX_LPCWSTR)L"background-image", 0xE9AEB710, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeURI}, + {FDE_CSSPROPERTY_LineBreak, (FX_LPCWSTR)L"line-break", 0xEA2D1D9A, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_Background, (FX_LPCWSTR)L"background", 0xEB49DD40, FDE_CSSVALUETYPE_Shorthand}, + {FDE_CSSPROPERTY_BorderTopWidth, (FX_LPCWSTR)L"border-top-width", 0xED2CB62B, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_WordSpacing, (FX_LPCWSTR)L"word-spacing", 0xEDA63BAE, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_BorderRightColor, (FX_LPCWSTR)L"border-right-color", 0xF33762D5, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeColor}, + {FDE_CSSPROPERTY_CounterIncrement, (FX_LPCWSTR)L"counter-increment", 0xF4CFB1B2, FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeNumber | FDE_CSSVALUETYPE_MaybeString}, + {FDE_CSSPROPERTY_Left, (FX_LPCWSTR)L"left", 0xF5AD782B, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_TextDecoration, (FX_LPCWSTR)L"text-decoration", 0xF7C634BA, FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_Padding, (FX_LPCWSTR)L"padding", 0xF8C373F7, FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeNumber}, + {FDE_CSSPROPERTY_MarginBottom, (FX_LPCWSTR)L"margin-bottom", 0xF93485A0, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_MarginTop, (FX_LPCWSTR)L"margin-top", 0xFE51DCFE, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber | FDE_CSSVALUETYPE_MaybeEnum}, + {FDE_CSSPROPERTY_Direction, (FX_LPCWSTR)L"direction", 0xFE746E61, FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum}, + }; + static const FDE_CSSPROPERTYVALUETABLE g_FDE_CSSPropertyValues[] = { + {FDE_CSSPROPERTYVALUE_Bolder, (FX_LPCWSTR)L"bolder", 0x009F1058}, + {FDE_CSSPROPERTYVALUE_LowerLatin, (FX_LPCWSTR)L"lower-latin", 0x016014CE}, + {FDE_CSSPROPERTYVALUE_Lowercase, (FX_LPCWSTR)L"lowercase", 0x02ACB805}, + {FDE_CSSPROPERTYVALUE_LowerGreek, (FX_LPCWSTR)L"lower-greek", 0x03D81D64}, + {FDE_CSSPROPERTYVALUE_Sesame, (FX_LPCWSTR)L"sesame", 0x0432ECDE}, + {FDE_CSSPROPERTYVALUE_None, (FX_LPCWSTR)L"none", 0x048B6670}, + {FDE_CSSPROPERTYVALUE_NwResize, (FX_LPCWSTR)L"nw-resize", 0x054B4BE4}, + {FDE_CSSPROPERTYVALUE_WResize, (FX_LPCWSTR)L"w-resize", 0x0A2F8D76}, + {FDE_CSSPROPERTYVALUE_Dot, (FX_LPCWSTR)L"dot", 0x0A48CB27}, + {FDE_CSSPROPERTYVALUE_End, (FX_LPCWSTR)L"end", 0x0A631437}, + {FDE_CSSPROPERTYVALUE_Ltr, (FX_LPCWSTR)L"ltr", 0x0B1B56D2}, + {FDE_CSSPROPERTYVALUE_Pre, (FX_LPCWSTR)L"pre", 0x0B848587}, + {FDE_CSSPROPERTYVALUE_Rtl, (FX_LPCWSTR)L"rtl", 0x0BB92C52}, + {FDE_CSSPROPERTYVALUE_Sub, (FX_LPCWSTR)L"sub", 0x0BD37FAA}, + {FDE_CSSPROPERTYVALUE_Top, (FX_LPCWSTR)L"top", 0x0BEDAF33}, + {FDE_CSSPROPERTYVALUE_Visible, (FX_LPCWSTR)L"visible", 0x0F55D7EE}, + {FDE_CSSPROPERTYVALUE_Filled, (FX_LPCWSTR)L"filled", 0x10827DD0}, + {FDE_CSSPROPERTYVALUE_SwResize, (FX_LPCWSTR)L"sw-resize", 0x10B548E9}, + {FDE_CSSPROPERTYVALUE_NoRepeat, (FX_LPCWSTR)L"no-repeat", 0x1235C18B}, + {FDE_CSSPROPERTYVALUE_Default, (FX_LPCWSTR)L"default", 0x14DA2125}, + {FDE_CSSPROPERTYVALUE_Transparent, (FX_LPCWSTR)L"transparent", 0x17B64DB2}, + {FDE_CSSPROPERTYVALUE_Ridge, (FX_LPCWSTR)L"ridge", 0x18EBEE4B}, + {FDE_CSSPROPERTYVALUE_Right, (FX_LPCWSTR)L"right", 0x193ADE3E}, + {FDE_CSSPROPERTYVALUE_HorizontalTb, (FX_LPCWSTR)L"horizontal-tb", 0x1A66A86D}, + {FDE_CSSPROPERTYVALUE_DistributeLetter, (FX_LPCWSTR)L"distribute-letter", 0x1EDBD75C}, + {FDE_CSSPROPERTYVALUE_DoubleCircle, (FX_LPCWSTR)L"double-circle", 0x1FF082BA}, + {FDE_CSSPROPERTYVALUE_Ruby, (FX_LPCWSTR)L"ruby", 0x20D66C02}, + {FDE_CSSPROPERTYVALUE_Collapse, (FX_LPCWSTR)L"collapse", 0x2128D673}, + {FDE_CSSPROPERTYVALUE_Normal, (FX_LPCWSTR)L"normal", 0x247CF3E9}, + {FDE_CSSPROPERTYVALUE_Avoid, (FX_LPCWSTR)L"avoid", 0x24E684B3}, + {FDE_CSSPROPERTYVALUE_UpperRoman, (FX_LPCWSTR)L"upper-roman", 0x28BAC2B6}, + {FDE_CSSPROPERTYVALUE_Auto, (FX_LPCWSTR)L"auto", 0x2B35B6D9}, + {FDE_CSSPROPERTYVALUE_Text, (FX_LPCWSTR)L"text", 0x2D08AF85}, + {FDE_CSSPROPERTYVALUE_XSmall, (FX_LPCWSTR)L"x-small", 0x2D2FCAFE}, + {FDE_CSSPROPERTYVALUE_Thin, (FX_LPCWSTR)L"thin", 0x2D574D53}, + {FDE_CSSPROPERTYVALUE_Repeat, (FX_LPCWSTR)L"repeat", 0x306614A1}, + {FDE_CSSPROPERTYVALUE_Small, (FX_LPCWSTR)L"small", 0x316A3739}, + {FDE_CSSPROPERTYVALUE_NeResize, (FX_LPCWSTR)L"ne-resize", 0x31FD5E12}, + {FDE_CSSPROPERTYVALUE_NoContent, (FX_LPCWSTR)L"no-content", 0x33A1C545}, + {FDE_CSSPROPERTYVALUE_Outside, (FX_LPCWSTR)L"outside", 0x36DF693D}, + {FDE_CSSPROPERTYVALUE_EResize, (FX_LPCWSTR)L"e-resize", 0x36E19FA4}, + {FDE_CSSPROPERTYVALUE_TableRow, (FX_LPCWSTR)L"table-row", 0x3912A02D}, + {FDE_CSSPROPERTYVALUE_Bottom, (FX_LPCWSTR)L"bottom", 0x399F02B5}, + {FDE_CSSPROPERTYVALUE_Underline, (FX_LPCWSTR)L"underline", 0x3A0273A6}, + {FDE_CSSPROPERTYVALUE_CjkIdeographic, (FX_LPCWSTR)L"cjk-ideographic", 0x3A641CC4}, + {FDE_CSSPROPERTYVALUE_SeResize, (FX_LPCWSTR)L"se-resize", 0x3D675B17}, + {FDE_CSSPROPERTYVALUE_Fixed, (FX_LPCWSTR)L"fixed", 0x3D7DEB10}, + {FDE_CSSPROPERTYVALUE_Double, (FX_LPCWSTR)L"double", 0x3D98515B}, + {FDE_CSSPROPERTYVALUE_Solid, (FX_LPCWSTR)L"solid", 0x40623B5B}, + {FDE_CSSPROPERTYVALUE_RubyBaseGroup, (FX_LPCWSTR)L"ruby-base-group", 0x41014E84}, + {FDE_CSSPROPERTYVALUE_OpenQuote, (FX_LPCWSTR)L"open-quote", 0x44A41E8D}, + {FDE_CSSPROPERTYVALUE_Lighter, (FX_LPCWSTR)L"lighter", 0x45BEB7AF}, + {FDE_CSSPROPERTYVALUE_LowerRoman, (FX_LPCWSTR)L"lower-roman", 0x5044D253}, + {FDE_CSSPROPERTYVALUE_Strict, (FX_LPCWSTR)L"strict", 0x52F4EBD9}, + {FDE_CSSPROPERTYVALUE_TableCaption, (FX_LPCWSTR)L"table-caption", 0x5325CD63}, + {FDE_CSSPROPERTYVALUE_Oblique, (FX_LPCWSTR)L"oblique", 0x53EBDDB1}, + {FDE_CSSPROPERTYVALUE_Decimal, (FX_LPCWSTR)L"decimal", 0x54034C2F}, + {FDE_CSSPROPERTYVALUE_Loose, (FX_LPCWSTR)L"loose", 0x54D3A1E2}, + {FDE_CSSPROPERTYVALUE_Hebrew, (FX_LPCWSTR)L"hebrew", 0x565792DD}, + {FDE_CSSPROPERTYVALUE_Hidden, (FX_LPCWSTR)L"hidden", 0x573CB40C}, + {FDE_CSSPROPERTYVALUE_Dashed, (FX_LPCWSTR)L"dashed", 0x58A3DD29}, + {FDE_CSSPROPERTYVALUE_Embed, (FX_LPCWSTR)L"embed", 0x59C8F27D}, + {FDE_CSSPROPERTYVALUE_TableRowGroup, (FX_LPCWSTR)L"table-row-group", 0x5A43BD07}, + {FDE_CSSPROPERTYVALUE_TableColumn, (FX_LPCWSTR)L"table-column", 0x5E705DA3}, + {FDE_CSSPROPERTYVALUE_Static, (FX_LPCWSTR)L"static", 0x5E7555E8}, + {FDE_CSSPROPERTYVALUE_Outset, (FX_LPCWSTR)L"outset", 0x61236164}, + {FDE_CSSPROPERTYVALUE_DecimalLeadingZero, (FX_LPCWSTR)L"decimal-leading-zero", 0x61DFC55D}, + {FDE_CSSPROPERTYVALUE_KeepWords, (FX_LPCWSTR)L"keep-words", 0x63964801}, + {FDE_CSSPROPERTYVALUE_KatakanaIroha, (FX_LPCWSTR)L"katakana-iroha", 0x65D7C91C}, + {FDE_CSSPROPERTYVALUE_Super, (FX_LPCWSTR)L"super", 0x6A4F842F}, + {FDE_CSSPROPERTYVALUE_Center, (FX_LPCWSTR)L"center", 0x6C51AFC1}, + {FDE_CSSPROPERTYVALUE_TableHeaderGroup, (FX_LPCWSTR)L"table-header-group", 0x706103D8}, + {FDE_CSSPROPERTYVALUE_Inside, (FX_LPCWSTR)L"inside", 0x709CB0FC}, + {FDE_CSSPROPERTYVALUE_XxLarge, (FX_LPCWSTR)L"xx-large", 0x70BB1508}, + {FDE_CSSPROPERTYVALUE_Triangle, (FX_LPCWSTR)L"triangle", 0x7524EDF6}, + {FDE_CSSPROPERTYVALUE_RubyTextGroup, (FX_LPCWSTR)L"ruby-text-group", 0x78C2B98E}, + {FDE_CSSPROPERTYVALUE_Circle, (FX_LPCWSTR)L"circle", 0x7ABEC0D2}, + {FDE_CSSPROPERTYVALUE_Hiragana, (FX_LPCWSTR)L"hiragana", 0x7BF5E25B}, + {FDE_CSSPROPERTYVALUE_RepeatX, (FX_LPCWSTR)L"repeat-x", 0x7C8F3226}, + {FDE_CSSPROPERTYVALUE_RepeatY, (FX_LPCWSTR)L"repeat-y", 0x7C8F3227}, + {FDE_CSSPROPERTYVALUE_Move, (FX_LPCWSTR)L"move", 0x7DA03417}, + {FDE_CSSPROPERTYVALUE_HiraganaIroha, (FX_LPCWSTR)L"hiragana-iroha", 0x7EE863FB}, + {FDE_CSSPROPERTYVALUE_RubyBase, (FX_LPCWSTR)L"ruby-base", 0x7FD1B1EA}, + {FDE_CSSPROPERTYVALUE_Scroll, (FX_LPCWSTR)L"scroll", 0x84787AEF}, + {FDE_CSSPROPERTYVALUE_Smaller, (FX_LPCWSTR)L"smaller", 0x849769F0}, + {FDE_CSSPROPERTYVALUE_TableFooterGroup, (FX_LPCWSTR)L"table-footer-group", 0x85BDD97E}, + {FDE_CSSPROPERTYVALUE_Baseline, (FX_LPCWSTR)L"baseline", 0x87436BA3}, + {FDE_CSSPROPERTYVALUE_Separate, (FX_LPCWSTR)L"separate", 0x877C66B5}, + {FDE_CSSPROPERTYVALUE_Armenian, (FX_LPCWSTR)L"armenian", 0x889BE4EB}, + {FDE_CSSPROPERTYVALUE_Open, (FX_LPCWSTR)L"open", 0x8B90E1F2}, + {FDE_CSSPROPERTYVALUE_Relative, (FX_LPCWSTR)L"relative", 0x8C995B5C}, + {FDE_CSSPROPERTYVALUE_Thick, (FX_LPCWSTR)L"thick", 0x8CC35EB3}, + {FDE_CSSPROPERTYVALUE_Justify, (FX_LPCWSTR)L"justify", 0x8D269CAE}, + {FDE_CSSPROPERTYVALUE_Middle, (FX_LPCWSTR)L"middle", 0x947FA00F}, + {FDE_CSSPROPERTYVALUE_Always, (FX_LPCWSTR)L"always", 0x959AB231}, + {FDE_CSSPROPERTYVALUE_DistributeSpace, (FX_LPCWSTR)L"distribute-space", 0x97A20E58}, + {FDE_CSSPROPERTYVALUE_LineEdge, (FX_LPCWSTR)L"line-edge", 0x9A845D2A}, + {FDE_CSSPROPERTYVALUE_PreWrap, (FX_LPCWSTR)L"pre-wrap", 0x9D59588E}, + {FDE_CSSPROPERTYVALUE_Medium, (FX_LPCWSTR)L"medium", 0xA084A381}, + {FDE_CSSPROPERTYVALUE_NResize, (FX_LPCWSTR)L"n-resize", 0xA088968D}, + {FDE_CSSPROPERTYVALUE_ListItem, (FX_LPCWSTR)L"list-item", 0xA32382B8}, + {FDE_CSSPROPERTYVALUE_Show, (FX_LPCWSTR)L"show", 0xA66C10C1}, + {FDE_CSSPROPERTYVALUE_Currentcolor, (FX_LPCWSTR)L"currentColor", 0xA7883922}, + {FDE_CSSPROPERTYVALUE_NoCloseQuote, (FX_LPCWSTR)L"no-close-quote", 0xA79CBFFB}, + {FDE_CSSPROPERTYVALUE_VerticalLr, (FX_LPCWSTR)L"vertical-lr", 0xA8673F65}, + {FDE_CSSPROPERTYVALUE_VerticalRl, (FX_LPCWSTR)L"vertical-rl", 0xA8675E25}, + {FDE_CSSPROPERTYVALUE_Pointer, (FX_LPCWSTR)L"pointer", 0xA90929C1}, + {FDE_CSSPROPERTYVALUE_XxSmall, (FX_LPCWSTR)L"xx-small", 0xADE1FC76}, + {FDE_CSSPROPERTYVALUE_Bold, (FX_LPCWSTR)L"bold", 0xB18313A1}, + {FDE_CSSPROPERTYVALUE_Both, (FX_LPCWSTR)L"both", 0xB1833CAD}, + {FDE_CSSPROPERTYVALUE_SmallCaps, (FX_LPCWSTR)L"small-caps", 0xB299428D}, + {FDE_CSSPROPERTYVALUE_Katakana, (FX_LPCWSTR)L"katakana", 0xB421A4BC}, + {FDE_CSSPROPERTYVALUE_After, (FX_LPCWSTR)L"after", 0xB6B44172}, + {FDE_CSSPROPERTYVALUE_Horizontal, (FX_LPCWSTR)L"horizontal", 0xB7732DEA}, + {FDE_CSSPROPERTYVALUE_Dotted, (FX_LPCWSTR)L"dotted", 0xB88652A4}, + {FDE_CSSPROPERTYVALUE_Disc, (FX_LPCWSTR)L"disc", 0xBEBC18C3}, + {FDE_CSSPROPERTYVALUE_Georgian, (FX_LPCWSTR)L"georgian", 0xBEF99E8C}, + {FDE_CSSPROPERTYVALUE_Inline, (FX_LPCWSTR)L"inline", 0xC02D649F}, + {FDE_CSSPROPERTYVALUE_Overline, (FX_LPCWSTR)L"overline", 0xC0EC9FA4}, + {FDE_CSSPROPERTYVALUE_Wait, (FX_LPCWSTR)L"wait", 0xC1613BB5}, + {FDE_CSSPROPERTYVALUE_BreakAll, (FX_LPCWSTR)L"break-all", 0xC3145BAB}, + {FDE_CSSPROPERTYVALUE_UpperAlpha, (FX_LPCWSTR)L"upper-alpha", 0xC52D4A9F}, + {FDE_CSSPROPERTYVALUE_Capitalize, (FX_LPCWSTR)L"capitalize", 0xC5321D46}, + {FDE_CSSPROPERTYVALUE_Nowrap, (FX_LPCWSTR)L"nowrap", 0xC7994417}, + {FDE_CSSPROPERTYVALUE_TextBottom, (FX_LPCWSTR)L"text-bottom", 0xC7D08D87}, + {FDE_CSSPROPERTYVALUE_NoOpenQuote, (FX_LPCWSTR)L"no-open-quote", 0xC8CD7877}, + {FDE_CSSPROPERTYVALUE_Groove, (FX_LPCWSTR)L"groove", 0xCB24A412}, + {FDE_CSSPROPERTYVALUE_Progress, (FX_LPCWSTR)L"progress", 0xCD1D9835}, + {FDE_CSSPROPERTYVALUE_Larger, (FX_LPCWSTR)L"larger", 0xCD3C409D}, + {FDE_CSSPROPERTYVALUE_CloseQuote, (FX_LPCWSTR)L"close-quote", 0xCF8696D1}, + {FDE_CSSPROPERTYVALUE_TableCell, (FX_LPCWSTR)L"table-cell", 0xCFB5E595}, + {FDE_CSSPROPERTYVALUE_PreLine, (FX_LPCWSTR)L"pre-line", 0xD04FEDBC}, + {FDE_CSSPROPERTYVALUE_Absolute, (FX_LPCWSTR)L"absolute", 0xD0B2D55F}, + {FDE_CSSPROPERTYVALUE_InlineTable, (FX_LPCWSTR)L"inline-table", 0xD131F494}, + {FDE_CSSPROPERTYVALUE_BidiOverride, (FX_LPCWSTR)L"bidi-override", 0xD161FDE5}, + {FDE_CSSPROPERTYVALUE_InlineBlock, (FX_LPCWSTR)L"inline-block", 0xD26A8BD7}, + {FDE_CSSPROPERTYVALUE_Inset, (FX_LPCWSTR)L"inset", 0xD6F23243}, + {FDE_CSSPROPERTYVALUE_Crosshair, (FX_LPCWSTR)L"crosshair", 0xD6F8018E}, + {FDE_CSSPROPERTYVALUE_UpperLatin, (FX_LPCWSTR)L"upper-latin", 0xD9D60531}, + {FDE_CSSPROPERTYVALUE_Help, (FX_LPCWSTR)L"help", 0xDA002969}, + {FDE_CSSPROPERTYVALUE_Hide, (FX_LPCWSTR)L"hide", 0xDA69395A}, + {FDE_CSSPROPERTYVALUE_Uppercase, (FX_LPCWSTR)L"uppercase", 0xDAD595A8}, + {FDE_CSSPROPERTYVALUE_SResize, (FX_LPCWSTR)L"s-resize", 0xDB3AADF2}, + {FDE_CSSPROPERTYVALUE_Table, (FX_LPCWSTR)L"table", 0xDB9BE968}, + {FDE_CSSPROPERTYVALUE_Blink, (FX_LPCWSTR)L"blink", 0xDC36E390}, + {FDE_CSSPROPERTYVALUE_Block, (FX_LPCWSTR)L"block", 0xDCD480AB}, + {FDE_CSSPROPERTYVALUE_Start, (FX_LPCWSTR)L"start", 0xE1D9D5AE}, + {FDE_CSSPROPERTYVALUE_TableColumnGroup, (FX_LPCWSTR)L"table-column-group", 0xE2258EFD}, + {FDE_CSSPROPERTYVALUE_Italic, (FX_LPCWSTR)L"italic", 0xE31D5396}, + {FDE_CSSPROPERTYVALUE_LineThrough, (FX_LPCWSTR)L"line-through", 0xE4C5A276}, + {FDE_CSSPROPERTYVALUE_KeepAll, (FX_LPCWSTR)L"keep-all", 0xE704A72B}, + {FDE_CSSPROPERTYVALUE_LowerAlpha, (FX_LPCWSTR)L"lower-alpha", 0xECB75A3C}, + {FDE_CSSPROPERTYVALUE_RunIn, (FX_LPCWSTR)L"run-in", 0xEEC930B9}, + {FDE_CSSPROPERTYVALUE_Square, (FX_LPCWSTR)L"square", 0xEF85D351}, + {FDE_CSSPROPERTYVALUE_XLarge, (FX_LPCWSTR)L"x-large", 0xF008E390}, + {FDE_CSSPROPERTYVALUE_Large, (FX_LPCWSTR)L"large", 0xF4434FCB}, + {FDE_CSSPROPERTYVALUE_Before, (FX_LPCWSTR)L"before", 0xF4FFCE73}, + {FDE_CSSPROPERTYVALUE_Left, (FX_LPCWSTR)L"left", 0xF5AD782B}, + {FDE_CSSPROPERTYVALUE_TextTop, (FX_LPCWSTR)L"text-top", 0xFCB58D45}, + {FDE_CSSPROPERTYVALUE_RubyText, (FX_LPCWSTR)L"ruby-text", 0xFCC77174}, + {FDE_CSSPROPERTYVALUE_NoDisplay, (FX_LPCWSTR)L"no-display", 0xFE482860}, + }; + static const FDE_CSSMEDIATYPETABLE g_FDE_CSSMediaTypes[] = { + {0xF09, 0x02}, + {0x4880, 0x20}, + {0x536A, 0x80}, + {0x741D, 0x10}, + {0x76ED, 0x08}, + {0x7CFB, 0x01}, + {0x9578, 0x04}, + {0xC8E1, 0x40}, + {0xD0F9, 0xFF}, + }; + static const FDE_CSSLENGTHUNITTABLE g_FDE_CSSLengthUnits[] = { + {0x0672, 3}, + {0x067D, 4}, + {0x1AF7, 8}, + {0x2F7A, 7}, + {0x3ED3, 10}, + {0x3EE4, 9}, + {0x3EE8, 5}, + {0xFC30, 6}, + }; + static const FDE_CSSCOLORTABLE g_FDE_CSSColors[] = { + {0x031B47FE, 0xff000080}, + {0x0BB8DF5B, 0xffff0000}, + {0x0D82A78C, 0xff800000}, + {0x2ACC82E8, 0xff00ffff}, + {0x2D083986, 0xff008080}, + {0x4A6A6195, 0xffc0c0c0}, + {0x546A8EF3, 0xff808080}, + {0x65C9169C, 0xffffa500}, + {0x8422BB61, 0xffffffff}, + {0x9271A558, 0xff800080}, + {0xA65A3EE3, 0xffff00ff}, + {0xB1345708, 0xff0000ff}, + {0xB6D2CF1F, 0xff808000}, + {0xD19B5E1C, 0xffffff00}, + {0xDB64391D, 0xff000000}, + {0xF616D507, 0xff00ff00}, + {0xF6EFFF31, 0xff008000}, + }; + static const FDE_CSSPERSUDOTABLE g_FDE_CSSPersudoType[] = { + {FDE_CSSPERSUDO_After, (FX_LPCWSTR)L":after", 0x16EE1FEC}, + {FDE_CSSPERSUDO_Before, (FX_LPCWSTR)L":before", 0x7DCDDE2D}, + }; + FDE_LPCCSSPERSUDOTABLE FDE_GetCSSPersudoByEnum(FDE_CSSPERSUDO ePersudo) + { + return (ePersudo < FDE_CSSPERSUDO_NONE) ? (g_FDE_CSSPersudoType + ePersudo) : NULL; + } + FDE_LPCCSSPROPERTYTABLE FDE_GetCSSPropertyByName(FX_LPCWSTR pszName, FX_INT32 iLength) + { + FXSYS_assert(pszName != NULL && iLength > 0); + FX_DWORD dwHash = FX_HashCode_String_GetW(pszName, iLength, TRUE); + FX_INT32 iEnd = FDE_CSSPROPERTY_MAX - 1; + FX_INT32 iMid, iStart = 0; + FX_DWORD dwMid; + do { + iMid = (iStart + iEnd) / 2; + dwMid = g_FDE_CSSProperties[iMid].dwHash; + if (dwHash == dwMid) { + return g_FDE_CSSProperties + iMid; + } else if (dwHash > dwMid) { + iStart = iMid + 1; + } else { + iEnd = iMid - 1; + } + } while (iStart <= iEnd); + return NULL; + } + FDE_LPCCSSPROPERTYTABLE FDE_GetCSSPropertyByEnum(FDE_CSSPROPERTY eName) + { + return (eName < FDE_CSSPROPERTY_MAX) ? (g_FDE_CSSProperties + eName) : NULL; + } + FDE_LPCCSSPROPERTYVALUETABLE FDE_GetCSSPropertyValueByName(FX_LPCWSTR pszName, FX_INT32 iLength) + { + FXSYS_assert(pszName != NULL && iLength > 0); + FX_DWORD dwHash = FX_HashCode_String_GetW(pszName, iLength, TRUE); + FX_INT32 iEnd = FDE_CSSPROPERTYVALUE_MAX - 1; + FX_INT32 iMid, iStart = 0; + FX_DWORD dwMid; + do { + iMid = (iStart + iEnd) / 2; + dwMid = g_FDE_CSSPropertyValues[iMid].dwHash; + if (dwHash == dwMid) { + return g_FDE_CSSPropertyValues + iMid; + } else if (dwHash > dwMid) { + iStart = iMid + 1; + } else { + iEnd = iMid - 1; + } + } while (iStart <= iEnd); + return NULL; + } + FDE_LPCCSSPROPERTYVALUETABLE FDE_GetCSSPropertyValueByEnum(FDE_CSSPROPERTYVALUE eName) + { + return (eName < FDE_CSSPROPERTYVALUE_MAX) ? (g_FDE_CSSPropertyValues + eName) : NULL; + } + FDE_LPCCSSMEDIATYPETABLE FDE_GetCSSMediaTypeByName(FX_LPCWSTR pszName, FX_INT32 iLength) + { + FXSYS_assert(pszName != NULL && iLength > 0); + FX_WORD wHash = (FX_WORD)FX_HashCode_String_GetW(pszName, iLength, TRUE); + FX_INT32 iEnd = sizeof(g_FDE_CSSMediaTypes) / sizeof(FDE_CSSMEDIATYPETABLE) - 1; + FX_INT32 iMid, iStart = 0; + FX_WORD uMid; + do { + iMid = (iStart + iEnd) / 2; + uMid = g_FDE_CSSMediaTypes[iMid].wHash; + if (wHash == uMid) { + return g_FDE_CSSMediaTypes + iMid; + } else if (wHash > uMid) { + iStart = iMid + 1; + } else { + iEnd = iMid - 1; + } + } while (iStart <= iEnd); + return NULL; + } + FDE_LPCCSSLENGTHUNITTABLE FDE_GetCSSLengthUnitByName(FX_LPCWSTR pszName, FX_INT32 iLength) + { + FXSYS_assert(pszName != NULL && iLength > 0); + FX_WORD wHash = (FX_WORD)FX_HashCode_String_GetW(pszName, iLength, TRUE); + FX_INT32 iEnd = sizeof(g_FDE_CSSLengthUnits) / sizeof(FDE_CSSLENGTHUNITTABLE) - 1; + FX_INT32 iMid, iStart = 0; + FX_WORD wMid; + do { + iMid = (iStart + iEnd) / 2; + wMid = g_FDE_CSSLengthUnits[iMid].wHash; + if (wHash == wMid) { + return g_FDE_CSSLengthUnits + iMid; + } else if (wHash > wMid) { + iStart = iMid + 1; + } else { + iEnd = iMid - 1; + } + } while (iStart <= iEnd); + return NULL; + } + FDE_LPCCSSCOLORTABLE FDE_GetCSSColorByName(FX_LPCWSTR pszName, FX_INT32 iLength) + { + FXSYS_assert(pszName != NULL && iLength > 0); + FX_DWORD dwHash = FX_HashCode_String_GetW(pszName, iLength, TRUE); + FX_INT32 iEnd = sizeof(g_FDE_CSSColors) / sizeof(FDE_CSSCOLORTABLE) - 1; + FX_INT32 iMid, iStart = 0; + FX_DWORD dwMid; + do { + iMid = (iStart + iEnd) / 2; + dwMid = g_FDE_CSSColors[iMid].dwHash; + if (dwHash == dwMid) { + return g_FDE_CSSColors + iMid; + } else if (dwHash > dwMid) { + iStart = iMid + 1; + } else { + iEnd = iMid - 1; + } + } while (iStart <= iEnd); + return NULL; + } + FX_BOOL FDE_ParseCSSNumber(FX_LPCWSTR pszValue, FX_INT32 iValueLen, FX_FLOAT &fValue, FDE_CSSPRIMITIVETYPE &eUnit) + { + FXSYS_assert(pszValue != NULL && iValueLen > 0); + FX_INT32 iUsedLen = 0; + fValue = FX_wcstof(pszValue, iValueLen, &iUsedLen); + if (iUsedLen <= 0) { + return FALSE; + } + iValueLen -= iUsedLen; + pszValue += iUsedLen; + eUnit = FDE_CSSPRIMITIVETYPE_Number; + if (iValueLen >= 1 && *pszValue == '%') { + eUnit = FDE_CSSPRIMITIVETYPE_Percent; + } else if (iValueLen == 2) { + FDE_LPCCSSLENGTHUNITTABLE pUnit = FDE_GetCSSLengthUnitByName(pszValue, 2); + if (pUnit != NULL) { + eUnit = (FDE_CSSPRIMITIVETYPE)pUnit->wValue; + } + } + return TRUE; + } + + FX_BOOL FDE_ParseCSSString(FX_LPCWSTR pszValue, FX_INT32 iValueLen, FX_INT32 &iOffset, FX_INT32 &iLength) + { + FXSYS_assert(pszValue != NULL && iValueLen > 0); + iOffset = 0; + iLength = iValueLen; + if (iValueLen >= 2) { + FX_WCHAR first = pszValue[0], last = pszValue[iValueLen - 1]; + if ((first == '\"' && last == '\"') || (first == '\'' && last == '\'')) { + iOffset = 1, iLength -= 2; + } + } + return iValueLen > 0; + } + + FX_BOOL FDE_ParseCSSURI(FX_LPCWSTR pszValue, FX_INT32 iValueLen, FX_INT32 &iOffset, FX_INT32 &iLength) + { + FXSYS_assert(pszValue != NULL && iValueLen > 0); + if (iValueLen < 6 || pszValue[iValueLen - 1] != ')' || FX_wcsnicmp((FX_LPCWSTR)L"url(", pszValue, 4)) { + return FALSE; + } + if (FDE_ParseCSSString(pszValue + 4, iValueLen - 5, iOffset, iLength)) { + iOffset += 4; + return TRUE; + } + return FALSE; + } + + FX_BOOL FDE_ParseCSSColor(FX_LPCWSTR pszValue, FX_INT32 iValueLen, FX_ARGB &dwColor) + { + FXSYS_assert(pszValue != NULL && iValueLen > 0); + if (*pszValue == '#') { + switch (iValueLen) { + case 4: { + FX_BYTE red = FX_Hex2Dec((FX_BYTE)pszValue[1], (FX_BYTE)pszValue[1]); + FX_BYTE green = FX_Hex2Dec((FX_BYTE)pszValue[2], (FX_BYTE)pszValue[2]); + FX_BYTE blue = FX_Hex2Dec((FX_BYTE)pszValue[3], (FX_BYTE)pszValue[3]); + dwColor = ArgbEncode(255, red, green, blue); + } + return TRUE; + case 7: { + FX_BYTE red = FX_Hex2Dec((FX_BYTE)pszValue[1], (FX_BYTE)pszValue[2]); + FX_BYTE green = FX_Hex2Dec((FX_BYTE)pszValue[3], (FX_BYTE)pszValue[4]); + FX_BYTE blue = FX_Hex2Dec((FX_BYTE)pszValue[5], (FX_BYTE)pszValue[6]); + dwColor = ArgbEncode(255, red, green, blue); + } + return TRUE; + } + } else if (iValueLen >= 10) { + if (pszValue[iValueLen - 1] != ')' || FX_wcsnicmp((FX_LPCWSTR)L"rgb(", pszValue, 4)) { + return FALSE; + } + FX_BYTE rgb[3] = {0}; + FX_FLOAT fValue; + FDE_CSSPRIMITIVETYPE eType; + CFDE_CSSValueListParser list(pszValue + 4, iValueLen - 5, ','); + for (FX_INT32 i = 0; i < 3; ++i) { + if (!list.NextValue(eType, pszValue, iValueLen)) { + return FALSE; + } + if (eType != FDE_CSSPRIMITIVETYPE_Number) { + return FALSE; + } + if (!FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eType)) { + return FALSE; + } + rgb[i] = eType == FDE_CSSPRIMITIVETYPE_Percent ? FXSYS_round(fValue * 2.55f) : FXSYS_round(fValue); + } + dwColor = ArgbEncode(255, rgb[0], rgb[1], rgb[2]); + return TRUE; + } else { + FDE_LPCCSSCOLORTABLE pColor = FDE_GetCSSColorByName(pszValue, iValueLen); + if (pColor != NULL) { + dwColor = pColor->dwValue; + return TRUE; + } + } + return FALSE; + } +#ifdef _cplusplus +}; +#endif +CFDE_CSSValueList::CFDE_CSSValueList(IFX_MEMAllocator *pStaticStore, const CFDE_CSSValueArray &list) +{ + m_iCount = list.GetSize(); + FX_INT32 iByteCount = m_iCount * sizeof(IFDE_CSSValue*); + m_ppList = (IFDE_CSSValue**)pStaticStore->Alloc(iByteCount); + FXSYS_memcpy(m_ppList, list.GetData(), iByteCount); +} +FX_BOOL CFDE_CSSValueListParser::NextValue(FDE_CSSPRIMITIVETYPE &eType, FX_LPCWSTR &pStart, FX_INT32 &iLength) +{ + while (m_pCur < m_pEnd && (*m_pCur <= ' ' || *m_pCur == m_Separator)) { + ++m_pCur; + } + if (m_pCur >= m_pEnd) { + return FALSE; + } + eType = FDE_CSSPRIMITIVETYPE_Unknown; + pStart = m_pCur; + iLength = 0; + FX_WCHAR wch = *m_pCur; + if (wch == '#') { + iLength = SkipTo(' '); + if (iLength == 4 || iLength == 7) { + eType = FDE_CSSPRIMITIVETYPE_RGB; + } + } else if ((wch >= '0' && wch <= '9') || wch == '.' || wch == '-' || wch == '+') { + while (m_pCur < m_pEnd && (*m_pCur > ' ' && *m_pCur != m_Separator)) { + ++m_pCur; + } + iLength = m_pCur - pStart; + if (iLength > 0) { + eType = FDE_CSSPRIMITIVETYPE_Number; + } + } else if (wch == '\"' || wch == '\'') { + pStart++; + iLength = SkipTo(wch) - 1; + m_pCur++; + eType = FDE_CSSPRIMITIVETYPE_String; + } else if (m_pEnd - m_pCur > 5 && m_pCur[3] == '(') { + if (FX_wcsnicmp((FX_LPCWSTR)L"url", m_pCur, 3) == 0) { + wch = m_pCur[4]; + if (wch == '\"' || wch == '\'') { + pStart += 5; + iLength = SkipTo(wch) - 6; + m_pCur += 2; + } else { + pStart += 4; + iLength = SkipTo(')') - 4; + m_pCur++; + } + eType = FDE_CSSPRIMITIVETYPE_URI; + } else if (FX_wcsnicmp((FX_LPCWSTR)L"rgb", m_pCur, 3) == 0) { + iLength = SkipTo(')') + 1; + m_pCur++; + eType = FDE_CSSPRIMITIVETYPE_RGB; + } + } else { + iLength = SkipTo(m_Separator, TRUE, TRUE); + eType = FDE_CSSPRIMITIVETYPE_String; + } + return m_pCur <= m_pEnd && iLength > 0; +} +FX_INT32 CFDE_CSSValueListParser::SkipTo(FX_WCHAR wch, FX_BOOL bWSSeparator , FX_BOOL bBrContinue ) +{ + FX_LPCWSTR pStart = m_pCur; + if (!bBrContinue) { + if (bWSSeparator) + while (++m_pCur < m_pEnd && *m_pCur != wch && *m_pCur > ' ') ; + else + while (++m_pCur < m_pEnd && *m_pCur != wch) ; + } else { + FX_INT32 iBracketCount = 0; + if (bWSSeparator) { + while (m_pCur < m_pEnd && *m_pCur != wch && *m_pCur > ' ') { + if (*m_pCur == '(') { + iBracketCount++; + } else if (*m_pCur == ')') { + iBracketCount--; + } + m_pCur++; + } + } else { + while (m_pCur < m_pEnd && *m_pCur != wch) { + if (*m_pCur == '(') { + iBracketCount++; + } else if (*m_pCur == ')') { + iBracketCount--; + } + m_pCur++; + } + } + while (iBracketCount > 0 && m_pCur < m_pEnd) { + if (*m_pCur == ')') { + iBracketCount--; + } + m_pCur++; + } + } + return m_pCur - pStart; +} diff --git a/xfa/src/fdp/src/css/fde_cssdatatable.h b/xfa/src/fdp/src/css/fde_cssdatatable.h new file mode 100644 index 0000000000..0ebcccfab7 --- /dev/null +++ b/xfa/src/fdp/src/css/fde_cssdatatable.h @@ -0,0 +1,195 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FDE_CSSDATATABLE +#define _FDE_CSSDATATABLE +class CFDE_CSSFunction: public CFX_Target +{ +public: + CFDE_CSSFunction(FX_LPCWSTR pszFuncName, IFDE_CSSValueList *pArgList): m_pszFuncName(pszFuncName), m_pArgList(pArgList) + { + FXSYS_assert(pArgList != NULL); + } + FX_INT32 CountArgs() const + { + return m_pArgList->CountValues(); + } + IFDE_CSSValue* GetArgs(FX_INT32 index) const + { + return m_pArgList->GetValue(index); + } + FX_LPCWSTR GetFuncName() const + { + return m_pszFuncName; + }; + +protected: + IFDE_CSSValueList *m_pArgList; + FX_LPCWSTR m_pszFuncName; +}; +class CFDE_CSSPrimitiveValue : public IFDE_CSSPrimitiveValue, public CFX_Target +{ +public: + CFDE_CSSPrimitiveValue(const CFDE_CSSPrimitiveValue &src) + { + *this = src; + } + CFDE_CSSPrimitiveValue(FX_ARGB color) : m_eType(FDE_CSSPRIMITIVETYPE_RGB), m_dwColor(color) { } + CFDE_CSSPrimitiveValue(FDE_CSSPROPERTYVALUE eValue) : m_eType(FDE_CSSPRIMITIVETYPE_Enum) , m_eEnum(eValue) { } + CFDE_CSSPrimitiveValue(FDE_CSSPRIMITIVETYPE eType, FX_FLOAT fValue) : m_eType(eType), m_fNumber(fValue) { } + CFDE_CSSPrimitiveValue(FDE_CSSPRIMITIVETYPE eType, FX_LPCWSTR pValue) : m_eType(eType), m_pString(pValue) + { + FXSYS_assert(m_pString != NULL); + } + CFDE_CSSPrimitiveValue(CFDE_CSSFunction *pFunction) : m_eType(FDE_CSSPRIMITIVETYPE_Function), m_pFunction(pFunction) {} + + virtual FDE_CSSPRIMITIVETYPE GetPrimitiveType() const + { + return m_eType; + } + + virtual FX_ARGB GetRGBColor() const + { + FXSYS_assert(m_eType == FDE_CSSPRIMITIVETYPE_RGB); + return m_dwColor; + } + virtual FX_FLOAT GetFloat() const + { + FXSYS_assert(m_eType >= FDE_CSSPRIMITIVETYPE_Number && m_eType <= FDE_CSSPRIMITIVETYPE_PC); + return m_fNumber; + } + virtual FX_LPCWSTR GetString(FX_INT32 &iLength) const + { + FXSYS_assert(m_eType >= FDE_CSSPRIMITIVETYPE_String && m_eType <= FDE_CSSPRIMITIVETYPE_URI); + iLength = FXSYS_wcslen(m_pString); + return m_pString; + } + virtual FDE_CSSPROPERTYVALUE GetEnum() const + { + FXSYS_assert(m_eType == FDE_CSSPRIMITIVETYPE_Enum); + return m_eEnum; + } + virtual FX_LPCWSTR GetFuncName() const + { + FXSYS_assert(m_eType == FDE_CSSPRIMITIVETYPE_Function); + return m_pFunction->GetFuncName(); + } + virtual FX_INT32 CountArgs() const + { + FXSYS_assert(m_eType == FDE_CSSPRIMITIVETYPE_Function); + return m_pFunction->CountArgs(); + } + virtual IFDE_CSSValue* GetArgs(FX_INT32 index) const + { + FXSYS_assert(m_eType == FDE_CSSPRIMITIVETYPE_Function); + return m_pFunction->GetArgs(index); + } + + FDE_CSSPRIMITIVETYPE m_eType; + union { + FX_ARGB m_dwColor; + FX_FLOAT m_fNumber; + FX_LPCWSTR m_pString; + FDE_CSSPROPERTYVALUE m_eEnum; + CFDE_CSSFunction *m_pFunction; + }; +}; +typedef CFX_ArrayTemplate CFDE_CSSPrimitiveArray; +typedef CFX_ArrayTemplate CFDE_CSSValueArray; +class CFDE_CSSValueList : public IFDE_CSSValueList, public CFX_Target +{ +public: + CFDE_CSSValueList(IFX_MEMAllocator *pStaticStore, const CFDE_CSSValueArray &list); + virtual FX_INT32 CountValues() const + { + return m_iCount; + } + virtual IFDE_CSSValue* GetValue(FX_INT32 index) const + { + return m_ppList[index]; + } +protected: + IFDE_CSSValue **m_ppList; + FX_INT32 m_iCount; +}; +class CFDE_CSSValueListParser : public CFX_Target +{ +public: + CFDE_CSSValueListParser(FX_LPCWSTR psz, FX_INT32 iLen, FX_WCHAR separator) + : m_Separator(separator), m_pCur(psz), m_pEnd(psz + iLen) + { + FXSYS_assert(psz != NULL && iLen > 0); + } + FX_BOOL NextValue(FDE_CSSPRIMITIVETYPE &eType, FX_LPCWSTR &pStart, FX_INT32 &iLength); + FX_WCHAR m_Separator; +protected: + FX_INT32 SkipTo(FX_WCHAR wch, FX_BOOL bWSSeparator = FALSE, FX_BOOL bBrContinue = FALSE); + FX_LPCWSTR m_pCur; + FX_LPCWSTR m_pEnd; +}; +#ifdef _cplusplus +extern "C" { +#endif +#define FDE_CSSVALUETYPE_MaybeNumber 0x0100 +#define FDE_CSSVALUETYPE_MaybeEnum 0x0200 +#define FDE_CSSVALUETYPE_MaybeURI 0x0400 +#define FDE_CSSVALUETYPE_MaybeString 0x0800 +#define FDE_CSSVALUETYPE_MaybeColor 0x1000 +#define FDE_CSSVALUETYPE_MaybeFunction 0x2000 +#define FDE_IsOnlyValue(type,enum) (((type) & ~(enum)) == FDE_CSSVALUETYPE_Primitive) + struct FDE_CSSPROPERTYTABLE { + FDE_CSSPROPERTY eName; + FX_LPCWSTR pszName; + FX_DWORD dwHash; + FX_DWORD dwType; + }; + typedef FDE_CSSPROPERTYTABLE const * FDE_LPCCSSPROPERTYTABLE; + + FDE_LPCCSSPROPERTYTABLE FDE_GetCSSPropertyByName(FX_LPCWSTR pszName, FX_INT32 iLength); + FDE_LPCCSSPROPERTYTABLE FDE_GetCSSPropertyByEnum(FDE_CSSPROPERTY eName); + struct FDE_CSSPROPERTYVALUETABLE { + FDE_CSSPROPERTYVALUE eName; + FX_LPCWSTR pszName; + FX_DWORD dwHash; + }; + typedef FDE_CSSPROPERTYVALUETABLE const * FDE_LPCCSSPROPERTYVALUETABLE; + + FDE_LPCCSSPROPERTYVALUETABLE FDE_GetCSSPropertyValueByName(FX_LPCWSTR pszName, FX_INT32 iLength); + FDE_LPCCSSPROPERTYVALUETABLE FDE_GetCSSPropertyValueByEnum(FDE_CSSPROPERTYVALUE eName); + struct FDE_CSSMEDIATYPETABLE { + FX_WORD wHash; + FX_WORD wValue; + }; + typedef FDE_CSSMEDIATYPETABLE const * FDE_LPCCSSMEDIATYPETABLE; + FDE_LPCCSSMEDIATYPETABLE FDE_GetCSSMediaTypeByName(FX_LPCWSTR pszName, FX_INT32 iLength); + struct FDE_CSSLENGTHUNITTABLE { + FX_WORD wHash; + FX_WORD wValue; + }; + typedef FDE_CSSLENGTHUNITTABLE const * FDE_LPCCSSLENGTHUNITTABLE; + FDE_LPCCSSLENGTHUNITTABLE FDE_GetCSSLengthUnitByName(FX_LPCWSTR pszName, FX_INT32 iLength); + struct FDE_CSSCOLORTABLE { + FX_DWORD dwHash; + FX_ARGB dwValue; + }; + typedef FDE_CSSCOLORTABLE const * FDE_LPCCSSCOLORTABLE; + FDE_LPCCSSCOLORTABLE FDE_GetCSSColorByName(FX_LPCWSTR pszName, FX_INT32 iLength); + struct FDE_CSSPERSUDOTABLE { + FDE_CSSPERSUDO eName; + FX_LPCWSTR pszName; + FX_DWORD dwHash; + }; + typedef FDE_CSSPERSUDOTABLE const * FDE_LPCCSSPERSUDOTABLE; + + FDE_LPCCSSPERSUDOTABLE FDE_GetCSSPersudoByEnum(FDE_CSSPERSUDO ePersudo); + FX_BOOL FDE_ParseCSSNumber(FX_LPCWSTR pszValue, FX_INT32 iValueLen, FX_FLOAT &fValue, FDE_CSSPRIMITIVETYPE &eUnit); + FX_BOOL FDE_ParseCSSString(FX_LPCWSTR pszValue, FX_INT32 iValueLen, FX_INT32 &iOffset, FX_INT32 &iLength); + FX_BOOL FDE_ParseCSSColor(FX_LPCWSTR pszValue, FX_INT32 iValueLen, FX_ARGB &dwColor); + FX_BOOL FDE_ParseCSSURI(FX_LPCWSTR pszValue, FX_INT32 iValueLen, FX_INT32 &iOffset, FX_INT32 &iLength); +#ifdef _cplusplus +}; +#endif +#endif diff --git a/xfa/src/fdp/src/css/fde_cssdeclaration.cpp b/xfa/src/fdp/src/css/fde_cssdeclaration.cpp new file mode 100644 index 0000000000..4abbc5cfa9 --- /dev/null +++ b/xfa/src/fdp/src/css/fde_cssdeclaration.cpp @@ -0,0 +1,1193 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "fde_cssdeclaration.h" +IFDE_CSSValue* CFDE_CSSDeclaration::GetProperty(FDE_CSSPROPERTY eProperty, FX_BOOL &bImportant) const +{ + for (FDE_LPCSSPROPERTYHOLDER pHolder = m_pFirstProperty; pHolder; pHolder = pHolder->pNext) { + if (pHolder->eProperty == eProperty) { + bImportant = pHolder->bImportant; + return pHolder->pValue; + } + } + return NULL; +} +FX_POSITION CFDE_CSSDeclaration::GetStartPosition() const +{ + return (FX_POSITION)m_pFirstProperty; +} +void CFDE_CSSDeclaration::GetNextProperty(FX_POSITION &pos, FDE_CSSPROPERTY &eProperty, IFDE_CSSValue *&pValue, FX_BOOL &bImportant) const +{ + FDE_LPCSSPROPERTYHOLDER pHolder = (FDE_LPCSSPROPERTYHOLDER)pos; + FXSYS_assert(pHolder != NULL); + bImportant = pHolder->bImportant; + eProperty = (FDE_CSSPROPERTY)pHolder->eProperty; + pValue = pHolder->pValue; + pos = (FX_POSITION)pHolder->pNext; +} +FX_POSITION CFDE_CSSDeclaration::GetStartCustom() const +{ + return (FX_POSITION)m_pFirstCustom; +} +void CFDE_CSSDeclaration::GetNextCustom(FX_POSITION &pos, CFX_WideString &wsName, CFX_WideString &wsValue) const +{ + FDE_LPCSSCUSTOMPROPERTY pProperty = (FDE_LPCSSCUSTOMPROPERTY)pos; + if (pProperty == NULL) { + return; + } + wsName = pProperty->pwsName; + wsValue = pProperty->pwsValue; + pos = (FX_POSITION)pProperty->pNext; +} +FX_LPCWSTR CFDE_CSSDeclaration::CopyToLocal(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen) +{ + FXSYS_assert(iValueLen > 0); + CFX_MapPtrToPtr *pCache = pArgs->pStringCache; + FX_LPVOID pKey = NULL; + if (pCache) { + FX_LPVOID pszCached = NULL; + pKey = (FX_LPVOID)(FX_UINTPTR)FX_HashCode_String_GetW(pszValue, iValueLen, FALSE); + if (pCache->Lookup(pKey, pszCached)) { + return (FX_LPCWSTR)pszCached; + } + } + FX_LPWSTR psz = (FX_LPWSTR)pArgs->pStaticStore->Alloc((iValueLen + 1) * sizeof(FX_WCHAR)); + if (psz == NULL) { + return NULL; + } + FXSYS_wcsncpy(psz, pszValue, iValueLen); + psz[iValueLen] = '\0'; + if (pCache) { + pCache->SetAt(pKey, psz); + } + return psz; +} +IFDE_CSSPrimitiveValue* CFDE_CSSDeclaration::NewNumberValue(IFX_MEMAllocator *pStaticStore, FDE_CSSPRIMITIVETYPE eUnit, FX_FLOAT fValue) const +{ + static CFDE_CSSPrimitiveValue s_ZeroValue(FDE_CSSPRIMITIVETYPE_Number, 0.0f); + if (eUnit == FDE_CSSPRIMITIVETYPE_Number && FXSYS_fabs(fValue) < 0.001f) { + return &s_ZeroValue; + } + return FDE_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(eUnit, fValue); +} +inline IFDE_CSSPrimitiveValue* CFDE_CSSDeclaration::NewEnumValue(IFX_MEMAllocator *pStaticStore, FDE_CSSPROPERTYVALUE eValue) const +{ + return FDE_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(eValue); +} +void CFDE_CSSDeclaration::AddPropertyHolder(IFX_MEMAllocator *pStaticStore, FDE_CSSPROPERTY eProperty, IFDE_CSSValue *pValue, FX_BOOL bImportant) +{ + FDE_LPCSSPROPERTYHOLDER pHolder = FDE_NewWith(pStaticStore) FDE_CSSPROPERTYHOLDER; + pHolder->bImportant = bImportant; + pHolder->eProperty = eProperty; + pHolder->pValue = pValue; + pHolder->pNext = NULL; + if (m_pLastProperty == NULL) { + m_pLastProperty = m_pFirstProperty = pHolder; + } else { + m_pLastProperty->pNext = pHolder; + m_pLastProperty = pHolder; + } +} +FX_BOOL CFDE_CSSDeclaration::AddProperty(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen) +{ + FXSYS_assert(iValueLen > 0); + FX_BOOL bImportant = FALSE; + if (iValueLen >= 10 && pszValue[iValueLen - 10] == '!' + && FX_wcsnicmp((FX_LPCWSTR)L"important", pszValue + iValueLen - 9, 9) == 0) { + if ((iValueLen -= 10) == 0) { + return FALSE; + } + bImportant = TRUE; + } + const FX_DWORD dwType = pArgs->pProperty->dwType; + switch (dwType & 0x0F) { + case FDE_CSSVALUETYPE_Primitive: { + static const FX_DWORD g_ValueGuessOrder[] = { + FDE_CSSVALUETYPE_MaybeNumber, + FDE_CSSVALUETYPE_MaybeEnum, + FDE_CSSVALUETYPE_MaybeColor, + FDE_CSSVALUETYPE_MaybeURI, + FDE_CSSVALUETYPE_MaybeFunction, + FDE_CSSVALUETYPE_MaybeString, + }; + static const FX_INT32 g_ValueGuessCount = sizeof(g_ValueGuessOrder) / sizeof(FX_DWORD); + for (FX_INT32 i = 0; i < g_ValueGuessCount; ++i) { + const FX_DWORD dwMatch = dwType & g_ValueGuessOrder[i]; + if (dwMatch == 0) { + continue; + } + IFDE_CSSValue *pCSSValue = NULL; + switch (dwMatch) { + case FDE_CSSVALUETYPE_MaybeFunction: + pCSSValue = ParseFunction(pArgs, pszValue, iValueLen); + break; + case FDE_CSSVALUETYPE_MaybeNumber: + pCSSValue = ParseNumber(pArgs, pszValue, iValueLen); + break; + case FDE_CSSVALUETYPE_MaybeEnum: + pCSSValue = ParseEnum(pArgs, pszValue, iValueLen); + break; + case FDE_CSSVALUETYPE_MaybeColor: + pCSSValue = ParseColor(pArgs, pszValue, iValueLen); + break; + case FDE_CSSVALUETYPE_MaybeURI: + pCSSValue = ParseURI(pArgs, pszValue, iValueLen); + break; + case FDE_CSSVALUETYPE_MaybeString: + pCSSValue = ParseString(pArgs, pszValue, iValueLen); + break; + default: + break; + } + if (pCSSValue != NULL) { + AddPropertyHolder(pArgs->pStaticStore, pArgs->pProperty->eName, pCSSValue, bImportant); + return TRUE; + } + if (FDE_IsOnlyValue(dwType, g_ValueGuessOrder[i])) { + return FALSE; + } + } + } + break; + case FDE_CSSVALUETYPE_Shorthand: { + IFX_MEMAllocator *pStaticStore = pArgs->pStaticStore; + IFDE_CSSValue *pColor, *pStyle, *pWidth; + switch (pArgs->pProperty->eName) { + case FDE_CSSPROPERTY_Font: + return ParseFontProperty(pArgs, pszValue, iValueLen, bImportant); + case FDE_CSSPROPERTY_Background: + return ParseBackgroundProperty(pArgs, pszValue, iValueLen, bImportant); + case FDE_CSSPROPERTY_ListStyle: + return ParseListStyleProperty(pArgs, pszValue, iValueLen, bImportant); + case FDE_CSSPROPERTY_Border: + if (ParseBorderPropoerty(pStaticStore, pszValue, iValueLen, pColor, pStyle, pWidth)) { + AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant, + FDE_CSSPROPERTY_BorderLeftColor, FDE_CSSPROPERTY_BorderLeftStyle, FDE_CSSPROPERTY_BorderLeftWidth); + AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant, + FDE_CSSPROPERTY_BorderTopColor, FDE_CSSPROPERTY_BorderTopStyle, FDE_CSSPROPERTY_BorderTopWidth); + AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant, + FDE_CSSPROPERTY_BorderRightColor, FDE_CSSPROPERTY_BorderRightStyle, FDE_CSSPROPERTY_BorderRightWidth); + AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant, + FDE_CSSPROPERTY_BorderBottomColor, FDE_CSSPROPERTY_BorderBottomStyle, FDE_CSSPROPERTY_BorderBottomWidth); + return TRUE; + } + break; + case FDE_CSSPROPERTY_BorderLeft: + if (ParseBorderPropoerty(pStaticStore, pszValue, iValueLen, pColor, pStyle, pWidth)) { + AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant, + FDE_CSSPROPERTY_BorderLeftColor, FDE_CSSPROPERTY_BorderLeftStyle, FDE_CSSPROPERTY_BorderLeftWidth); + return TRUE; + } + break; + case FDE_CSSPROPERTY_BorderTop: + if (ParseBorderPropoerty(pStaticStore, pszValue, iValueLen, pColor, pStyle, pWidth)) { + AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant, + FDE_CSSPROPERTY_BorderTopColor, FDE_CSSPROPERTY_BorderTopStyle, FDE_CSSPROPERTY_BorderTopWidth); + return TRUE; + } + break; + case FDE_CSSPROPERTY_BorderRight: + if (ParseBorderPropoerty(pStaticStore, pszValue, iValueLen, pColor, pStyle, pWidth)) { + AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant, + FDE_CSSPROPERTY_BorderRightColor, FDE_CSSPROPERTY_BorderRightStyle, FDE_CSSPROPERTY_BorderRightWidth); + return TRUE; + } + break; + case FDE_CSSPROPERTY_BorderBottom: + if (ParseBorderPropoerty(pStaticStore, pszValue, iValueLen, pColor, pStyle, pWidth)) { + AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant, + FDE_CSSPROPERTY_BorderBottomColor, FDE_CSSPROPERTY_BorderBottomStyle, FDE_CSSPROPERTY_BorderBottomWidth); + return TRUE; + } + break; + case FDE_CSSPROPERTY_Overflow: + return ParseOverflowProperty(pArgs, pszValue, iValueLen, bImportant); + case FDE_CSSPROPERTY_ColumnRule: + return ParseColumnRuleProperty(pArgs, pszValue, iValueLen, bImportant); + default: + break; + } + } + break; + case FDE_CSSVALUETYPE_List: + switch (pArgs->pProperty->eName) { + case FDE_CSSPROPERTY_CounterIncrement: + case FDE_CSSPROPERTY_CounterReset: + return ParseCounterProperty(pArgs, pszValue, iValueLen, bImportant); + case FDE_CSSPROPERTY_Content: + return ParseContentProperty(pArgs, pszValue, iValueLen, bImportant); + default: + return ParseValueListProperty(pArgs, pszValue, iValueLen, bImportant); + } + default: + FXSYS_assert(FALSE); + break; + } + return FALSE; +} +FX_BOOL CFDE_CSSDeclaration::AddProperty(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszName, FX_INT32 iNameLen, FX_LPCWSTR pszValue, FX_INT32 iValueLen) +{ + FDE_LPCSSCUSTOMPROPERTY pProperty = FDE_NewWith(pArgs->pStaticStore) FDE_CSSCUSTOMPROPERTY; + pProperty->pwsName = CopyToLocal(pArgs, pszName, iNameLen); + pProperty->pwsValue = CopyToLocal(pArgs, pszValue, iValueLen); + pProperty->pNext = NULL; + if (m_pLastCustom == NULL) { + m_pLastCustom = m_pFirstCustom = pProperty; + } else { + m_pLastCustom->pNext = pProperty; + m_pLastCustom = pProperty; + } + return TRUE; +} +IFDE_CSSValue* CFDE_CSSDeclaration::ParseNumber(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen) +{ + FX_FLOAT fValue; + FDE_CSSPRIMITIVETYPE eUnit; + if (!FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eUnit)) { + return NULL; + } + return NewNumberValue(pArgs->pStaticStore, eUnit, fValue); +} +IFDE_CSSValue* CFDE_CSSDeclaration::ParseEnum(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen) +{ + FDE_LPCCSSPROPERTYVALUETABLE pValue = FDE_GetCSSPropertyValueByName(pszValue, iValueLen); + return pValue ? NewEnumValue(pArgs->pStaticStore, pValue->eName) : NULL; +} +IFDE_CSSValue* CFDE_CSSDeclaration::ParseColor(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen) +{ + FX_ARGB dwColor; + if (!FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) { + return NULL; + } + return FDE_NewWith(pArgs->pStaticStore) CFDE_CSSPrimitiveValue(dwColor); +} +IFDE_CSSValue* CFDE_CSSDeclaration::ParseURI(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen) +{ + FX_INT32 iOffset; + if (!FDE_ParseCSSURI(pszValue, iValueLen, iOffset, iValueLen)) { + return NULL; + } + if (iValueLen <= 0) { + return NULL; + } + pszValue = CopyToLocal(pArgs, pszValue + iOffset, iValueLen); + return pszValue ? FDE_NewWith(pArgs->pStaticStore) CFDE_CSSPrimitiveValue(FDE_CSSPRIMITIVETYPE_URI, pszValue) : NULL; +} +IFDE_CSSValue* CFDE_CSSDeclaration::ParseString(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen) +{ + FX_INT32 iOffset; + if (!FDE_ParseCSSString(pszValue, iValueLen, iOffset, iValueLen)) { + return NULL; + } + if (iValueLen <= 0) { + return NULL; + } + pszValue = CopyToLocal(pArgs, pszValue + iOffset, iValueLen); + return pszValue ? FDE_NewWith(pArgs->pStaticStore) CFDE_CSSPrimitiveValue(FDE_CSSPRIMITIVETYPE_String, pszValue) : NULL; +} +IFDE_CSSValue* CFDE_CSSDeclaration::ParseFunction(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen) +{ + if (pszValue[iValueLen - 1] != ')') { + return NULL; + } + FX_INT32 iStartBracket = 0; + while (pszValue[iStartBracket] != '(') { + if (iStartBracket < iValueLen) { + iStartBracket++; + } else { + return NULL; + } + } + if (iStartBracket == 0) { + return NULL; + } + FX_LPCWSTR pszFuncName = CopyToLocal(pArgs, pszValue, iStartBracket); + pszValue += (iStartBracket + 1); + iValueLen -= (iStartBracket + 2); + CFDE_CSSValueArray argumentArr; + CFDE_CSSValueListParser parser(pszValue, iValueLen, ','); + FDE_CSSPRIMITIVETYPE ePrimitiveType; + while (parser.NextValue(ePrimitiveType, pszValue, iValueLen)) { + switch (ePrimitiveType) { + case FDE_CSSPRIMITIVETYPE_String: { + FDE_LPCCSSPROPERTYVALUETABLE pPropertyValue = FDE_GetCSSPropertyValueByName(pszValue, iValueLen); + if (pPropertyValue != NULL) { + argumentArr.Add(NewEnumValue(pArgs->pStaticStore, pPropertyValue->eName)); + continue; + } + IFDE_CSSValue *pFunctionValue = ParseFunction(pArgs, pszValue, iValueLen); + if (pFunctionValue != NULL) { + argumentArr.Add(pFunctionValue); + continue; + } + argumentArr.Add(FDE_NewWith(pArgs->pStaticStore) CFDE_CSSPrimitiveValue(FDE_CSSPRIMITIVETYPE_String, CopyToLocal(pArgs, pszValue, iValueLen))); + } + break; + case FDE_CSSPRIMITIVETYPE_Number: { + FX_FLOAT fValue; + if (FDE_ParseCSSNumber(pszValue, iValueLen, fValue, ePrimitiveType)) { + argumentArr.Add(NewNumberValue(pArgs->pStaticStore, ePrimitiveType, fValue)); + } + } + break; + default: + argumentArr.Add(FDE_NewWith(pArgs->pStaticStore) CFDE_CSSPrimitiveValue(FDE_CSSPRIMITIVETYPE_String, CopyToLocal(pArgs, pszValue, iValueLen))); + break; + } + } + IFDE_CSSValueList *pArgumentList = FDE_NewWith(pArgs->pStaticStore) CFDE_CSSValueList(pArgs->pStaticStore, argumentArr); + CFDE_CSSFunction *pFunction = FDE_NewWith(pArgs->pStaticStore) CFDE_CSSFunction(pszFuncName, pArgumentList); + return FDE_NewWith(pArgs->pStaticStore) CFDE_CSSPrimitiveValue(pFunction); +} +FX_BOOL CFDE_CSSDeclaration::ParseContentProperty(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen, FX_BOOL bImportant) +{ + IFX_MEMAllocator* pStaticStore = (IFX_MEMAllocator*)pArgs->pStaticStore; + CFDE_CSSValueListParser parser(pszValue, iValueLen, ' '); + FDE_CSSPRIMITIVETYPE eType; + CFDE_CSSValueArray list; + while (parser.NextValue(eType, pszValue, iValueLen)) { + switch (eType) { + case FDE_CSSPRIMITIVETYPE_URI: + list.Add(FDE_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(eType, CopyToLocal(pArgs, pszValue, iValueLen))); + break; + case FDE_CSSPRIMITIVETYPE_Number: + return FALSE; + case FDE_CSSPRIMITIVETYPE_String: { + FDE_LPCCSSPROPERTYVALUETABLE pValue = FDE_GetCSSPropertyValueByName(pszValue, iValueLen); + if (pValue != NULL) { + switch (pValue->eName) { + case FDE_CSSPROPERTYVALUE_Normal: + case FDE_CSSPROPERTYVALUE_None: { + if (list.GetSize() == 0) { + list.Add(NewEnumValue(pStaticStore, pValue->eName)); + } else { + return FALSE; + } + } + break; + case FDE_CSSPROPERTYVALUE_OpenQuote: + case FDE_CSSPROPERTYVALUE_CloseQuote: + case FDE_CSSPROPERTYVALUE_NoOpenQuote: + case FDE_CSSPROPERTYVALUE_NoCloseQuote: + list.Add(NewEnumValue(pStaticStore, pValue->eName)); + break; + default: + return FALSE; + } + continue; + } + IFDE_CSSValue *pFunction = ParseFunction(pArgs, pszValue, iValueLen); + if (pFunction != NULL) { + list.Add(pFunction); + continue; + } + list.Add(FDE_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(eType, CopyToLocal(pArgs, pszValue, iValueLen))); + } + break; + case FDE_CSSPRIMITIVETYPE_RGB: + return FALSE; + default: + break; + } + } + if (list.GetSize() == 0) { + return FALSE; + } + AddPropertyHolder(pStaticStore, pArgs->pProperty->eName, FDE_NewWith(pStaticStore) CFDE_CSSValueList(pStaticStore, list), bImportant); + return TRUE; +} +FX_BOOL CFDE_CSSDeclaration::ParseCounterProperty(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen, FX_BOOL bImportant) +{ + IFX_MEMAllocator *pStaticStore = pArgs->pStaticStore; + CFDE_CSSValueListParser parser(pszValue, iValueLen, ' '); + CFDE_CSSValueArray list; + CFDE_CSSValueArray listFull; + FDE_CSSPRIMITIVETYPE eType; + while (parser.NextValue(eType, pszValue, iValueLen)) { + switch (eType) { + case FDE_CSSPRIMITIVETYPE_Number: { + FX_FLOAT fValue; + if (FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eType)) { + if (list.GetSize() == 1) { + list.Add(NewNumberValue(pStaticStore, eType, fValue)); + listFull.Add(FDE_NewWith(pStaticStore) CFDE_CSSValueList(pStaticStore, list)); + list.RemoveAll(); + } else { + return FALSE; + } + } + } + break; + case FDE_CSSPRIMITIVETYPE_String: { + if (list.GetSize() == 0) { + pszValue = CopyToLocal(pArgs, pszValue, iValueLen); + list.Add(FDE_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(FDE_CSSPRIMITIVETYPE_String, pszValue)); + } else { + listFull.Add(FDE_NewWith(pStaticStore) CFDE_CSSValueList(pStaticStore, list)); + list.RemoveAll(); + pszValue = CopyToLocal(pArgs, pszValue, iValueLen); + list.Add(FDE_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(FDE_CSSPRIMITIVETYPE_String, pszValue)); + } + } + break; + default: + break; + } + } + if (list.GetSize() == 1) { + listFull.Add(FDE_NewWith(pStaticStore) CFDE_CSSValueList(pStaticStore, list)); + } + if (listFull.GetSize() == 0) { + return FALSE; + } + AddPropertyHolder(pStaticStore, pArgs->pProperty->eName, FDE_NewWith(pStaticStore) CFDE_CSSValueList(pStaticStore, listFull), bImportant); + return TRUE; +} +FX_BOOL CFDE_CSSDeclaration::ParseValueListProperty(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen, FX_BOOL bImportant) +{ + IFX_MEMAllocator *pStaticStore = pArgs->pStaticStore; + FX_WCHAR separator = (pArgs->pProperty->eName == FDE_CSSPROPERTY_FontFamily) ? ',' : ' '; + CFDE_CSSValueListParser parser(pszValue, iValueLen, separator); + const FX_DWORD dwType = pArgs->pProperty->dwType; + FDE_CSSPRIMITIVETYPE eType; + CFDE_CSSValueArray list; + while (parser.NextValue(eType, pszValue, iValueLen)) { + switch (eType) { + case FDE_CSSPRIMITIVETYPE_Number: + if (dwType & FDE_CSSVALUETYPE_MaybeNumber) { + FX_FLOAT fValue; + if (FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eType)) { + list.Add(NewNumberValue(pStaticStore, eType, fValue)); + } + } + break; + case FDE_CSSPRIMITIVETYPE_String: + if (dwType & FDE_CSSVALUETYPE_MaybeColor) { + FX_ARGB dwColor; + if (FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) { + list.Add(FDE_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(dwColor)); + continue; + } + } + if (dwType & FDE_CSSVALUETYPE_MaybeEnum) { + FDE_LPCCSSPROPERTYVALUETABLE pValue = FDE_GetCSSPropertyValueByName(pszValue, iValueLen); + if (pValue != NULL) { + list.Add(NewEnumValue(pStaticStore, pValue->eName)); + continue; + } + } + if (dwType & FDE_CSSVALUETYPE_MaybeString) { + pszValue = CopyToLocal(pArgs, pszValue, iValueLen); + list.Add(FDE_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(FDE_CSSPRIMITIVETYPE_String, pszValue)); + } + break; + case FDE_CSSPRIMITIVETYPE_RGB: + if (dwType & FDE_CSSVALUETYPE_MaybeColor) { + FX_ARGB dwColor; + if (FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) { + list.Add(FDE_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(dwColor)); + } + } + break; + default: + break; + } + } + if (list.GetSize() == 0) { + return FALSE; + } + switch (pArgs->pProperty->eName) { + case FDE_CSSPROPERTY_BorderColor: + return Add4ValuesProperty(pStaticStore, list, bImportant, FDE_CSSPROPERTY_BorderLeftColor, + FDE_CSSPROPERTY_BorderTopColor, FDE_CSSPROPERTY_BorderRightColor, FDE_CSSPROPERTY_BorderBottomColor); + case FDE_CSSPROPERTY_BorderStyle: + return Add4ValuesProperty(pStaticStore, list, bImportant, FDE_CSSPROPERTY_BorderLeftStyle, + FDE_CSSPROPERTY_BorderTopStyle, FDE_CSSPROPERTY_BorderRightStyle, FDE_CSSPROPERTY_BorderBottomStyle); + case FDE_CSSPROPERTY_BorderWidth: + return Add4ValuesProperty(pStaticStore, list, bImportant, FDE_CSSPROPERTY_BorderLeftWidth, + FDE_CSSPROPERTY_BorderTopWidth, FDE_CSSPROPERTY_BorderRightWidth, FDE_CSSPROPERTY_BorderBottomWidth); + case FDE_CSSPROPERTY_Margin: + return Add4ValuesProperty(pStaticStore, list, bImportant, FDE_CSSPROPERTY_MarginLeft, + FDE_CSSPROPERTY_MarginTop, FDE_CSSPROPERTY_MarginRight, FDE_CSSPROPERTY_MarginBottom); + case FDE_CSSPROPERTY_Padding: + return Add4ValuesProperty(pStaticStore, list, bImportant, FDE_CSSPROPERTY_PaddingLeft, + FDE_CSSPROPERTY_PaddingTop, FDE_CSSPROPERTY_PaddingRight, FDE_CSSPROPERTY_PaddingBottom); + default: { + CFDE_CSSValueList *pList = FDE_NewWith(pStaticStore) CFDE_CSSValueList(pStaticStore, list); + AddPropertyHolder(pStaticStore, pArgs->pProperty->eName, pList, bImportant); + return TRUE; + } + break; + } + return FALSE; +} +FX_BOOL CFDE_CSSDeclaration::Add4ValuesProperty(IFX_MEMAllocator *pStaticStore, const CFDE_CSSValueArray &list, FX_BOOL bImportant, FDE_CSSPROPERTY eLeft, FDE_CSSPROPERTY eTop, FDE_CSSPROPERTY eRight, FDE_CSSPROPERTY eBottom) +{ + switch (list.GetSize()) { + case 1: + AddPropertyHolder(pStaticStore, eLeft, list[0], bImportant); + AddPropertyHolder(pStaticStore, eTop, list[0], bImportant); + AddPropertyHolder(pStaticStore, eRight, list[0], bImportant); + AddPropertyHolder(pStaticStore, eBottom, list[0], bImportant); + return TRUE; + case 2: + AddPropertyHolder(pStaticStore, eLeft, list[1], bImportant); + AddPropertyHolder(pStaticStore, eTop, list[0], bImportant); + AddPropertyHolder(pStaticStore, eRight, list[1], bImportant); + AddPropertyHolder(pStaticStore, eBottom, list[0], bImportant); + return TRUE; + case 3: + AddPropertyHolder(pStaticStore, eLeft, list[1], bImportant); + AddPropertyHolder(pStaticStore, eTop, list[0], bImportant); + AddPropertyHolder(pStaticStore, eRight, list[1], bImportant); + AddPropertyHolder(pStaticStore, eBottom, list[2], bImportant); + return TRUE; + case 4: + AddPropertyHolder(pStaticStore, eLeft, list[3], bImportant); + AddPropertyHolder(pStaticStore, eTop, list[0], bImportant); + AddPropertyHolder(pStaticStore, eRight, list[1], bImportant); + AddPropertyHolder(pStaticStore, eBottom, list[2], bImportant); + return TRUE; + default: + break; + } + return FALSE; +} +FX_BOOL CFDE_CSSDeclaration::ParseBorderPropoerty(IFX_MEMAllocator *pStaticStore, FX_LPCWSTR pszValue, FX_INT32 iValueLen, IFDE_CSSValue *&pColor, IFDE_CSSValue *&pStyle, IFDE_CSSValue *&pWidth) const +{ + pColor = pStyle = pWidth = NULL; + CFDE_CSSValueListParser parser(pszValue, iValueLen, ' '); + FDE_CSSPRIMITIVETYPE eType; + while (parser.NextValue(eType, pszValue, iValueLen)) { + switch (eType) { + case FDE_CSSPRIMITIVETYPE_Number: + if (pWidth == NULL) { + FX_FLOAT fValue; + if (FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eType)) { + pWidth = NewNumberValue(pStaticStore, eType, fValue); + } + } + break; + case FDE_CSSPRIMITIVETYPE_RGB: + if (pColor == NULL) { + FX_ARGB dwColor; + if (FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) { + pColor = FDE_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(dwColor); + } + } + break; + case FDE_CSSPRIMITIVETYPE_String: { + FDE_LPCCSSCOLORTABLE pColorItem = FDE_GetCSSColorByName(pszValue, iValueLen); + if (pColorItem != NULL) { + if (pColor == NULL) { + pColor = FDE_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(pColorItem->dwValue); + } + continue; + } + FDE_LPCCSSPROPERTYVALUETABLE pValue = FDE_GetCSSPropertyValueByName(pszValue, iValueLen); + if (pValue == NULL) { + continue; + } + switch (pValue->eName) { + case FDE_CSSPROPERTYVALUE_Transparent: + if (pColor == NULL) { + pColor = FDE_NewWith(pStaticStore) CFDE_CSSPrimitiveValue((FX_ARGB)0); + } + break; + case FDE_CSSPROPERTYVALUE_Thin: + case FDE_CSSPROPERTYVALUE_Thick: + case FDE_CSSPROPERTYVALUE_Medium: + if (pWidth == NULL) { + pWidth = NewEnumValue(pStaticStore, pValue->eName); + } + break; + case FDE_CSSPROPERTYVALUE_None: + case FDE_CSSPROPERTYVALUE_Hidden: + case FDE_CSSPROPERTYVALUE_Dotted: + case FDE_CSSPROPERTYVALUE_Dashed: + case FDE_CSSPROPERTYVALUE_Solid: + case FDE_CSSPROPERTYVALUE_Double: + case FDE_CSSPROPERTYVALUE_Groove: + case FDE_CSSPROPERTYVALUE_Ridge: + case FDE_CSSPROPERTYVALUE_Inset: + case FDE_CSSPROPERTYVALUE_Outset: + if (pStyle == NULL) { + pStyle = NewEnumValue(pStaticStore, pValue->eName); + } + break; + default: + break; + } + }; + break; + default: + break; + } + } + if (pColor == NULL) { + pColor = FDE_NewWith(pStaticStore) CFDE_CSSPrimitiveValue((FX_ARGB)0); + } + if (pStyle == NULL) { + pStyle = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_None); + } + if (pWidth == NULL) { + pWidth = NewNumberValue(pStaticStore, FDE_CSSPRIMITIVETYPE_Number, 0.0f); + } + return TRUE; +} +void CFDE_CSSDeclaration::AddBorderProperty(IFX_MEMAllocator *pStaticStore, IFDE_CSSValue *pColor, IFDE_CSSValue *pStyle, IFDE_CSSValue *pWidth, FX_BOOL bImportant, FDE_CSSPROPERTY eColor, FDE_CSSPROPERTY eStyle, FDE_CSSPROPERTY eWidth) +{ + AddPropertyHolder(pStaticStore, eStyle, pStyle, bImportant); + AddPropertyHolder(pStaticStore, eWidth, pWidth, bImportant); + AddPropertyHolder(pStaticStore, eColor, pColor, bImportant); +} +FX_BOOL CFDE_CSSDeclaration::ParseListStyleProperty(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen, FX_BOOL bImportant) +{ + IFX_MEMAllocator *pStaticStore = pArgs->pStaticStore; + CFDE_CSSValueListParser parser(pszValue, iValueLen, ' '); + IFDE_CSSPrimitiveValue *pType = NULL, *pImage = NULL, *pPosition = NULL; + FDE_CSSPRIMITIVETYPE eType; + while (parser.NextValue(eType, pszValue, iValueLen)) { + switch (eType) { + case FDE_CSSPRIMITIVETYPE_URI: + if (pImage == NULL) { + pImage = FDE_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(eType, CopyToLocal(pArgs, pszValue, iValueLen)); + } + break; + case FDE_CSSPRIMITIVETYPE_String: { + FDE_LPCCSSPROPERTYVALUETABLE pValue = FDE_GetCSSPropertyValueByName(pszValue, iValueLen); + if (pValue == NULL) { + break; + } + switch (pValue->eName) { + case FDE_CSSPROPERTYVALUE_None: + if (pImage == NULL) { + pImage = NewEnumValue(pStaticStore, pValue->eName); + } else if (pType == NULL) { + pImage = NewEnumValue(pStaticStore, pValue->eName); + } + break; + case FDE_CSSPROPERTYVALUE_Inside: + case FDE_CSSPROPERTYVALUE_Outside: + if (pPosition == NULL) { + pPosition = NewEnumValue(pStaticStore, pValue->eName); + } + break; + case FDE_CSSPROPERTYVALUE_Disc: + case FDE_CSSPROPERTYVALUE_Circle: + case FDE_CSSPROPERTYVALUE_Square: + case FDE_CSSPROPERTYVALUE_Decimal: + case FDE_CSSPROPERTYVALUE_DecimalLeadingZero: + case FDE_CSSPROPERTYVALUE_LowerRoman: + case FDE_CSSPROPERTYVALUE_UpperRoman: + case FDE_CSSPROPERTYVALUE_LowerGreek: + case FDE_CSSPROPERTYVALUE_LowerLatin: + case FDE_CSSPROPERTYVALUE_UpperLatin: + case FDE_CSSPROPERTYVALUE_Armenian: + case FDE_CSSPROPERTYVALUE_Georgian: + case FDE_CSSPROPERTYVALUE_LowerAlpha: + case FDE_CSSPROPERTYVALUE_UpperAlpha: + if (pType == NULL) { + pType = NewEnumValue(pStaticStore, pValue->eName); + } + break; + default: + break; + } + }; + break; + default: + break; + } + } + if (pPosition == NULL) { + pPosition = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Outside); + } + if (pImage == NULL) { + pImage = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_None); + } + if (pType == NULL) { + pType = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_None); + } + AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ListStylePosition, pPosition, bImportant); + AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ListStyleImage, pImage, bImportant); + AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ListStyleType, pType, bImportant); + return TRUE; +} +FX_BOOL CFDE_CSSDeclaration::ParseBackgroundProperty(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen, FX_BOOL bImportant) +{ + IFX_MEMAllocator *pStaticStore = pArgs->pStaticStore; + CFDE_CSSValueListParser parser(pszValue, iValueLen, ' '); + IFDE_CSSPrimitiveValue *pColor = NULL, *pImage = NULL, *pRepeat = NULL; + IFDE_CSSPrimitiveValue *pPosX = NULL, *pPosY = NULL, *pAttachment = NULL; + FDE_CSSPRIMITIVETYPE eType; + while (parser.NextValue(eType, pszValue, iValueLen)) { + switch (eType) { + case FDE_CSSPRIMITIVETYPE_URI: + if (pImage == NULL) { + pImage = FDE_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(eType, CopyToLocal(pArgs, pszValue, iValueLen)); + } + break; + case FDE_CSSPRIMITIVETYPE_Number: { + FX_FLOAT fValue; + if (!FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eType)) { + break; + } + if (pPosX == NULL) { + pPosX = NewNumberValue(pStaticStore, eType, fValue); + } else if (pPosY == NULL) { + pPosY = NewNumberValue(pStaticStore, eType, fValue); + } + } + break; + case FDE_CSSPRIMITIVETYPE_String: { + FDE_LPCCSSPROPERTYVALUETABLE pValue = FDE_GetCSSPropertyValueByName(pszValue, iValueLen); + if (pValue != NULL) { + switch (pValue->eName) { + case FDE_CSSPROPERTYVALUE_None: + if (pImage == NULL) { + pImage = NewEnumValue(pStaticStore, pValue->eName); + } + break; + case FDE_CSSPROPERTYVALUE_Transparent: + if (pColor == NULL) { + pColor = FDE_NewWith(pStaticStore) CFDE_CSSPrimitiveValue((FX_ARGB)0); + } + break; + case FDE_CSSPROPERTYVALUE_Fixed: + case FDE_CSSPROPERTYVALUE_Scroll: + if (pAttachment == NULL) { + pAttachment = NewEnumValue(pStaticStore, pValue->eName); + } + break; + case FDE_CSSPROPERTYVALUE_Repeat: + case FDE_CSSPROPERTYVALUE_RepeatX: + case FDE_CSSPROPERTYVALUE_RepeatY: + case FDE_CSSPROPERTYVALUE_NoRepeat: + if (pRepeat == NULL) { + pRepeat = NewEnumValue(pStaticStore, pValue->eName); + } + break; + case FDE_CSSPROPERTYVALUE_Left: + case FDE_CSSPROPERTYVALUE_Right: + if (pPosX == NULL) { + pPosX = NewEnumValue(pStaticStore, pValue->eName); + } + break; + case FDE_CSSPROPERTYVALUE_Top: + case FDE_CSSPROPERTYVALUE_Bottom: + if (pPosY == NULL) { + pPosX = NewEnumValue(pStaticStore, pValue->eName); + } + break; + case FDE_CSSPROPERTYVALUE_Center: + if (pPosX == NULL) { + pPosX = NewEnumValue(pStaticStore, pValue->eName); + } else if (pPosY == NULL) { + pPosX = NewEnumValue(pStaticStore, pValue->eName); + } + break; + default: + break; + } + break; + } + FDE_LPCCSSCOLORTABLE pColorItem = FDE_GetCSSColorByName(pszValue, iValueLen); + if (pColorItem != NULL) + if (pColor == NULL) { + pColor = FDE_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(pColorItem->dwValue); + } + } + break; + case FDE_CSSPRIMITIVETYPE_RGB: + if (pColor == NULL) { + FX_ARGB dwColor; + if (FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) { + pColor = FDE_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(dwColor); + } + } + break; + default: + break; + } + } + if (pColor == NULL) { + pColor = FDE_NewWith(pStaticStore) CFDE_CSSPrimitiveValue((FX_ARGB)0); + } + if (pImage == NULL) { + pImage = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_None); + } + if (pRepeat == NULL) { + pRepeat = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Repeat); + } + if (pAttachment == NULL) { + pAttachment = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Scroll); + } + if (pPosX == NULL) { + pPosX = NewNumberValue(pStaticStore, FDE_CSSPRIMITIVETYPE_Number, 0.0f); + pPosY = NewNumberValue(pStaticStore, FDE_CSSPRIMITIVETYPE_Number, 0.0f); + } else if (pPosY == NULL) { + pPosY = NewNumberValue(pStaticStore, FDE_CSSPRIMITIVETYPE_Number, 0.0f); + } + CFDE_CSSValueArray position; + position.Add(pPosX); + position.Add(pPosY); + CFDE_CSSValueList *pPosList = FDE_NewWith(pStaticStore) CFDE_CSSValueList(pStaticStore, position); + AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_BackgroundColor, pColor, bImportant); + AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_BackgroundImage, pImage, bImportant); + AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_BackgroundRepeat, pRepeat, bImportant); + AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_BackgroundPosition, pPosList, bImportant); + AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_BackgroundAttachment, pAttachment, bImportant); + return TRUE; +} +FX_BOOL CFDE_CSSDeclaration::ParseFontProperty(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen, FX_BOOL bImportant) +{ + IFX_MEMAllocator *pStaticStore = pArgs->pStaticStore; + CFDE_CSSValueListParser parser(pszValue, iValueLen, '/'); + IFDE_CSSPrimitiveValue *pStyle = NULL, *pVariant = NULL, *pWeight = NULL; + IFDE_CSSPrimitiveValue *pFontSize = NULL, *pLineHeight = NULL; + CFDE_CSSValueArray familyList; + FDE_CSSPRIMITIVETYPE eType; + while (parser.NextValue(eType, pszValue, iValueLen)) { + switch (eType) { + case FDE_CSSPRIMITIVETYPE_String: { + FDE_LPCCSSPROPERTYVALUETABLE pValue = FDE_GetCSSPropertyValueByName(pszValue, iValueLen); + if (pValue != NULL) { + switch (pValue->eName) { + case FDE_CSSPROPERTYVALUE_XxSmall: + case FDE_CSSPROPERTYVALUE_XSmall: + case FDE_CSSPROPERTYVALUE_Small: + case FDE_CSSPROPERTYVALUE_Medium: + case FDE_CSSPROPERTYVALUE_Large: + case FDE_CSSPROPERTYVALUE_XLarge: + case FDE_CSSPROPERTYVALUE_XxLarge: + case FDE_CSSPROPERTYVALUE_Smaller: + case FDE_CSSPROPERTYVALUE_Larger: + if (pFontSize == NULL) { + pFontSize = NewEnumValue(pStaticStore, pValue->eName); + } + continue; + case FDE_CSSPROPERTYVALUE_Bold: + case FDE_CSSPROPERTYVALUE_Bolder: + case FDE_CSSPROPERTYVALUE_Lighter: + if (pWeight == NULL) { + pWeight = NewEnumValue(pStaticStore, pValue->eName); + } + continue; + case FDE_CSSPROPERTYVALUE_Italic: + case FDE_CSSPROPERTYVALUE_Oblique: + if (pStyle == NULL) { + pStyle = NewEnumValue(pStaticStore, pValue->eName); + } + continue; + case FDE_CSSPROPERTYVALUE_SmallCaps: + if (pVariant == NULL) { + pVariant = NewEnumValue(pStaticStore, pValue->eName); + } + continue; + case FDE_CSSPROPERTYVALUE_Normal: + if (pStyle == NULL) { + pStyle = NewEnumValue(pStaticStore, pValue->eName); + } else if (pVariant == NULL) { + pVariant = NewEnumValue(pStaticStore, pValue->eName); + } else if (pWeight == NULL) { + pWeight = NewEnumValue(pStaticStore, pValue->eName); + } else if (pFontSize == NULL) { + pFontSize = NewEnumValue(pStaticStore, pValue->eName); + } else if (pLineHeight == NULL) { + pLineHeight = NewEnumValue(pStaticStore, pValue->eName); + } + continue; + default: + break; + } + } + if (pFontSize != NULL) { + familyList.Add(FDE_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(eType, CopyToLocal(pArgs, pszValue, iValueLen))); + } + parser.m_Separator = ','; + } + break; + case FDE_CSSPRIMITIVETYPE_Number: { + FX_FLOAT fValue; + if (!FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eType)) { + break; + } + if (eType == FDE_CSSPRIMITIVETYPE_Number) { + switch ((FX_INT32)fValue) { + case 100: + case 200: + case 300: + case 400: + case 500: + case 600: + case 700: + case 800: + case 900: + if (pWeight == NULL) { + pWeight = NewNumberValue(pStaticStore, FDE_CSSPRIMITIVETYPE_Number, fValue); + } + continue; + } + } + if (pFontSize == NULL) { + pFontSize = NewNumberValue(pStaticStore, eType, fValue); + } else if (pLineHeight == NULL) { + pLineHeight = NewNumberValue(pStaticStore, eType, fValue); + } + } + break; + default: + break; + } + } + if (pStyle == NULL) { + pStyle = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Normal); + } + if (pVariant == NULL) { + pVariant = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Normal); + } + if (pWeight == NULL) { + pWeight = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Normal); + } + if (pFontSize == NULL) { + pFontSize = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Medium); + } + if (pLineHeight == NULL) { + pLineHeight = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Normal); + } + AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_FontStyle, pStyle, bImportant); + AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_FontVariant, pVariant, bImportant); + AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_FontWeight, pWeight, bImportant); + AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_FontSize, pFontSize, bImportant); + AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_LineHeight, pLineHeight, bImportant); + if (familyList.GetSize() > 0) { + CFDE_CSSValueList *pList = FDE_NewWith(pStaticStore) CFDE_CSSValueList(pStaticStore, familyList); + AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_FontFamily, pList, bImportant); + } + return TRUE; +} +FX_BOOL CFDE_CSSDeclaration::ParseColumnRuleProperty(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen, FX_BOOL bImportant) +{ + IFX_MEMAllocator *pStaticStore = pArgs->pStaticStore; + CFDE_CSSValueListParser parser(pszValue, iValueLen, ' '); + IFDE_CSSPrimitiveValue *pColumnRuleWidth = NULL; + IFDE_CSSPrimitiveValue *pColumnRuleStyle = NULL; + IFDE_CSSPrimitiveValue *pColumnRuleColor = NULL; + FDE_CSSPRIMITIVETYPE eType; + while (parser.NextValue(eType, pszValue, iValueLen)) { + switch (eType) { + case FDE_CSSPRIMITIVETYPE_String: { + FDE_LPCCSSPROPERTYVALUETABLE pValue = FDE_GetCSSPropertyValueByName(pszValue, iValueLen); + if (pValue != NULL) { + switch (pValue->eName) { + case FDE_CSSPROPERTYVALUE_None: + case FDE_CSSPROPERTYVALUE_Hidden: + case FDE_CSSPROPERTYVALUE_Dotted: + case FDE_CSSPROPERTYVALUE_Dashed: + case FDE_CSSPROPERTYVALUE_Solid: + case FDE_CSSPROPERTYVALUE_Double: + case FDE_CSSPROPERTYVALUE_Groove: + case FDE_CSSPROPERTYVALUE_Ridge: + case FDE_CSSPROPERTYVALUE_Inset: + case FDE_CSSPROPERTYVALUE_Outset: + if (pColumnRuleStyle == NULL) { + pColumnRuleStyle = NewEnumValue(pStaticStore, pValue->eName); + } + break; + case FDE_CSSPROPERTYVALUE_Transparent: + if (pColumnRuleColor == NULL) { + pColumnRuleColor = NewEnumValue(pStaticStore, pValue->eName); + } + break; + case FDE_CSSPROPERTYVALUE_Thin: + case FDE_CSSPROPERTYVALUE_Medium: + case FDE_CSSPROPERTYVALUE_Thick: + if (pColumnRuleWidth == NULL) { + pColumnRuleWidth = NewEnumValue(pStaticStore, pValue->eName); + } + break; + default: + break; + } + continue; + } + FX_ARGB dwColor; + if (FDE_ParseCSSColor(pszValue, iValueLen, dwColor) && pColumnRuleColor == NULL) { + pColumnRuleColor = FDE_NewWith(pStaticStore) CFDE_CSSPrimitiveValue((FX_ARGB)dwColor); + continue; + } + } + break; + case FDE_CSSPRIMITIVETYPE_Number: { + FX_FLOAT fValue; + if (FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eType) && pColumnRuleWidth == NULL) { + pColumnRuleWidth = NewNumberValue(pStaticStore, eType, fValue); + } + } + break; + case FDE_CSSPRIMITIVETYPE_RGB: { + FX_ARGB dwColor; + if (pColumnRuleColor == NULL && FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) { + pColumnRuleColor = FDE_NewWith(pStaticStore) CFDE_CSSPrimitiveValue((FX_ARGB)dwColor); + } + } + break; + default: + break; + } + } + if (pColumnRuleColor == NULL && pColumnRuleStyle == NULL && pColumnRuleWidth == NULL) { + return FALSE; + } + if (pColumnRuleStyle == NULL) { + pColumnRuleStyle = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_None); + } + if (pColumnRuleWidth == NULL) { + pColumnRuleWidth = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Medium); + } + if (pColumnRuleColor == NULL) { + pColumnRuleColor = FDE_NewWith(pStaticStore) CFDE_CSSPrimitiveValue((FX_ARGB)0); + } + AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ColumnRuleStyle, pColumnRuleStyle, bImportant); + AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ColumnRuleWidth, pColumnRuleWidth, bImportant); + AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ColumnRuleColor, pColumnRuleColor, bImportant); + return TRUE; +} +FX_BOOL CFDE_CSSDeclaration::ParseTextEmphasisProperty(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen, FX_BOOL bImportant) +{ + IFX_MEMAllocator *pStaticStore = pArgs->pStaticStore; + CFDE_CSSValueListParser parser(pszValue, iValueLen, ' '); + CFDE_CSSValueArray arrEmphasisStyle; + FDE_CSSPRIMITIVETYPE eType; + IFDE_CSSPrimitiveValue *pEmphasisColor = NULL; + while (parser.NextValue(eType, pszValue, iValueLen)) { + switch (eType) { + case FDE_CSSPRIMITIVETYPE_String: { + FDE_LPCCSSPROPERTYVALUETABLE pValue = FDE_GetCSSPropertyValueByName(pszValue, iValueLen); + if (pValue != NULL) { + arrEmphasisStyle.Add(NewEnumValue(pStaticStore, pValue->eName)); + continue; + } + FX_ARGB dwColor; + if (FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) { + pEmphasisColor = FDE_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(dwColor); + continue; + } + pszValue = CopyToLocal(pArgs, pszValue, iValueLen); + arrEmphasisStyle.Add(FDE_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(FDE_CSSPRIMITIVETYPE_String, pszValue)); + } + break; + case FDE_CSSPRIMITIVETYPE_RGB: { + FX_ARGB dwColor; + if (FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) { + pEmphasisColor = FDE_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(dwColor); + } + } + break; + default: + break; + } + } + if (arrEmphasisStyle.GetSize() != 0) { + AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_TextEmphasisStyle, FDE_NewWith(pStaticStore) CFDE_CSSValueList(pStaticStore, arrEmphasisStyle), bImportant); + } + if (pEmphasisColor != NULL) { + AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_TextEmphasisColor, pEmphasisColor, bImportant); + } + return TRUE; +} +FX_BOOL CFDE_CSSDeclaration::ParseColumnsProperty(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen, FX_BOOL bImportant) +{ + IFX_MEMAllocator *pStaticStore = pArgs->pStaticStore; + CFDE_CSSValueListParser parser(pszValue, iValueLen, ' '); + IFDE_CSSPrimitiveValue *pColumnWidth = NULL; + IFDE_CSSPrimitiveValue *pColumnCount = NULL; + FDE_CSSPRIMITIVETYPE eType; + while (parser.NextValue(eType, pszValue, iValueLen)) { + switch (eType) { + case FDE_CSSPRIMITIVETYPE_String: { + FDE_LPCCSSPROPERTYVALUETABLE pValue = FDE_GetCSSPropertyValueByName(pszValue, iValueLen); + if (pValue == NULL && pValue->eName == FDE_CSSPROPERTYVALUE_Auto) { + pColumnWidth = NewEnumValue(pStaticStore, pValue->eName); + } + } + break; + case FDE_CSSPRIMITIVETYPE_Number: { + FX_FLOAT fValue; + if (FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eType)) { + switch (eType) { + case FDE_CSSPRIMITIVETYPE_Number: + if (pColumnCount == NULL) { + pColumnCount = NewNumberValue(pStaticStore, eType, fValue); + } + break; + default: + if (pColumnWidth == NULL) { + pColumnWidth = NewNumberValue(pStaticStore, eType, fValue); + } + break; + } + } + } + break; + default: + break; + } + } + if (pColumnWidth == NULL && pColumnCount == NULL) { + return FALSE; + } else if (pColumnWidth == NULL) { + pColumnWidth = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Auto); + } else if (pColumnCount == NULL) { + pColumnCount = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Auto); + } + AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ColumnWidth, pColumnWidth, bImportant); + AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ColumnCount, pColumnCount, bImportant); + return TRUE; +} +FX_BOOL CFDE_CSSDeclaration::ParseOverflowProperty(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen, FX_BOOL bImportant) +{ + IFX_MEMAllocator *pStaticStore = pArgs->pStaticStore; + CFDE_CSSValueListParser parser(pszValue, iValueLen, ' '); + IFDE_CSSPrimitiveValue *pOverflowX = NULL; + IFDE_CSSPrimitiveValue *pOverflowY = NULL; + FDE_CSSPRIMITIVETYPE eType; + while (parser.NextValue(eType, pszValue, iValueLen)) { + if (eType == FDE_CSSPRIMITIVETYPE_String) { + FDE_LPCCSSPROPERTYVALUETABLE pValue = FDE_GetCSSPropertyValueByName(pszValue, iValueLen); + if (pValue != NULL) { + switch (pValue->eName) { + case FDE_CSSOVERFLOW_Visible: + case FDE_CSSOVERFLOW_Hidden: + case FDE_CSSOVERFLOW_Scroll: + case FDE_CSSOVERFLOW_Auto: + case FDE_CSSOVERFLOW_NoDisplay: + case FDE_CSSOVERFLOW_NoContent: + if (pOverflowX != NULL && pOverflowY != NULL) { + return FALSE; + } else if (pOverflowX == NULL) { + pOverflowX = NewEnumValue(pStaticStore, pValue->eName); + } else if (pOverflowY == NULL) { + pOverflowY = NewEnumValue(pStaticStore, pValue->eName); + } + break; + default: + break; + } + } + } + } + if (pOverflowX == NULL && pOverflowY == NULL) { + return FALSE; + } else if (pOverflowY == NULL) { + pOverflowY = NewEnumValue(pStaticStore, pOverflowX->GetEnum()); + } + AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_OverflowX, pOverflowX, bImportant); + AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_OverflowY, pOverflowY, bImportant); + return TRUE; +} diff --git a/xfa/src/fdp/src/css/fde_cssdeclaration.h b/xfa/src/fdp/src/css/fde_cssdeclaration.h new file mode 100644 index 0000000000..ca0add9dea --- /dev/null +++ b/xfa/src/fdp/src/css/fde_cssdeclaration.h @@ -0,0 +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 _FDE_CSSDECLARATION +#define _FDE_CSSDECLARATION +#include "fde_cssdatatable.h" +typedef struct _FDE_CSSPROPERTYHOLDER : public CFX_Target { + FX_INT16 eProperty; + FX_INT16 bImportant; + IFDE_CSSValue *pValue; + _FDE_CSSPROPERTYHOLDER *pNext; +} FDE_CSSPROPERTYHOLDER, *FDE_LPCSSPROPERTYHOLDER; +typedef struct _FDE_CSSCUSTOMPROPERTY : public CFX_Target { + FX_LPCWSTR pwsName; + FX_LPCWSTR pwsValue; + _FDE_CSSCUSTOMPROPERTY *pNext; +} FDE_CSSCUSTOMPROPERTY, * FDE_LPCSSCUSTOMPROPERTY; +typedef struct _FDE_CSSPROPERTYARGS : public CFX_Target { + IFX_MEMAllocator *pStaticStore; + CFX_MapPtrToPtr *pStringCache; + FDE_LPCCSSPROPERTYTABLE pProperty; +} FDE_CSSPROPERTYARGS; +typedef FDE_CSSPROPERTYARGS const * FDE_LPCCSSPROPERTYARGS; +class CFDE_CSSDeclaration : public IFDE_CSSDeclaration, public CFX_Target +{ +public: + CFDE_CSSDeclaration() : m_pFirstProperty(NULL), m_pLastProperty(NULL), m_pFirstCustom(NULL), m_pLastCustom(NULL) { } + virtual IFDE_CSSValue* GetProperty(FDE_CSSPROPERTY eProperty, FX_BOOL &bImportant) const; + virtual FX_POSITION GetStartPosition() const; + virtual void GetNextProperty(FX_POSITION &pos, FDE_CSSPROPERTY &eProperty, IFDE_CSSValue *&pValue, FX_BOOL &bImportant) const; + virtual FX_POSITION GetStartCustom() const; + virtual void GetNextCustom(FX_POSITION &pos, CFX_WideString &wsName, CFX_WideString &wsValue) const; + FX_BOOL AddProperty(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen); + FX_BOOL AddProperty(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszName, FX_INT32 iNameLen, FX_LPCWSTR pszValue, FX_INT32 iValueLen); +protected: + FX_BOOL ParseTextEmphasisProperty(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen, FX_BOOL bImportant); + FX_BOOL ParseColumnsProperty(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen, FX_BOOL bImportant); + FX_BOOL ParseColumnRuleProperty(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen, FX_BOOL bImportant); + FX_BOOL ParseOverflowProperty(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen, FX_BOOL bImportant); + FX_BOOL ParseFontProperty(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen, FX_BOOL bImportant); + FX_BOOL ParseBackgroundProperty(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen, FX_BOOL bImportant); + FX_BOOL ParseListStyleProperty(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen, FX_BOOL bImportant); + FX_BOOL ParseBorderPropoerty(IFX_MEMAllocator *pStaticStore, FX_LPCWSTR pszValue, FX_INT32 iValueLen, + IFDE_CSSValue *&pColor, IFDE_CSSValue *&pStyle, IFDE_CSSValue *&pWidth) const; + void AddBorderProperty(IFX_MEMAllocator *pStaticStore, IFDE_CSSValue *pColor, IFDE_CSSValue *pStyle, IFDE_CSSValue *pWidth, FX_BOOL bImportant, + FDE_CSSPROPERTY eColor, FDE_CSSPROPERTY eStyle, FDE_CSSPROPERTY eWidth); + FX_BOOL ParseContentProperty(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen, FX_BOOL bImportant); + FX_BOOL ParseCounterProperty(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen, FX_BOOL bImportant); + FX_BOOL ParseValueListProperty(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen, FX_BOOL bImportant); + FX_BOOL Add4ValuesProperty(IFX_MEMAllocator *pStaticStore, const CFDE_CSSValueArray &list, FX_BOOL bImportant, + FDE_CSSPROPERTY eLeft, FDE_CSSPROPERTY eTop, FDE_CSSPROPERTY eRight, FDE_CSSPROPERTY eBottom); + IFDE_CSSValue* ParseNumber(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen); + IFDE_CSSValue* ParseEnum(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen); + IFDE_CSSValue* ParseColor(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen); + IFDE_CSSValue* ParseURI(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen); + IFDE_CSSValue* ParseString(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen); + IFDE_CSSValue* ParseFunction(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen); + FX_LPCWSTR CopyToLocal(FDE_LPCCSSPROPERTYARGS pArgs, FX_LPCWSTR pszValue, FX_INT32 iValueLen); + void AddPropertyHolder(IFX_MEMAllocator *pStaticStore, FDE_CSSPROPERTY eProperty, IFDE_CSSValue *pValue, FX_BOOL bImportant); + IFDE_CSSPrimitiveValue* NewNumberValue(IFX_MEMAllocator *pStaticStore, FDE_CSSPRIMITIVETYPE eUnit, FX_FLOAT fValue) const; + IFDE_CSSPrimitiveValue* NewEnumValue(IFX_MEMAllocator *pStaticStore, FDE_CSSPROPERTYVALUE eValue) const; + FDE_LPCSSPROPERTYHOLDER m_pFirstProperty; + FDE_LPCSSPROPERTYHOLDER m_pLastProperty; + FDE_LPCSSCUSTOMPROPERTY m_pFirstCustom; + FDE_LPCSSCUSTOMPROPERTY m_pLastCustom; +}; +#endif diff --git a/xfa/src/fdp/src/css/fde_cssstyleselector.cpp b/xfa/src/fdp/src/css/fde_cssstyleselector.cpp new file mode 100644 index 0000000000..6372a8cb20 --- /dev/null +++ b/xfa/src/fdp/src/css/fde_cssstyleselector.cpp @@ -0,0 +1,1715 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "fde_csscache.h" +#include "fde_cssdeclaration.h" +#include "fde_cssstyleselector.h" +FX_INT32 CFDE_CSSCounterStyle::FindIndex(FX_LPCWSTR pszIdentifier) +{ + FX_INT32 iCount = m_arrCounterData.GetSize(); + for (FX_INT32 i = 0; i < iCount; i++) { + if (FXSYS_wcscmp(pszIdentifier, m_arrCounterData.ElementAt(i).m_pszIdent) == 0) { + return i; + } + } + return -1; +} +void CFDE_CSSCounterStyle::DoUpdateIndex(IFDE_CSSValueList *pList) +{ + if (pList == NULL) { + return; + } + FX_INT32 iCount = pList->CountValues(); + FX_FLOAT fDefValue = 1.0; + FX_BOOL bDefIncrement = TRUE; + if (pList == m_pCounterReset) { + fDefValue = 0.0; + bDefIncrement = FALSE; + } + for (FX_INT32 i = 0; i < iCount; i++) { + IFDE_CSSValueList *pCounter = (IFDE_CSSValueList*)pList->GetValue(i); + FX_INT32 iLen; + FX_LPCWSTR pszIdentifier = ((IFDE_CSSPrimitiveValue*)(pCounter->GetValue(0)))->GetString(iLen); + FX_FLOAT fValue = fDefValue; + if (pCounter->CountValues() > 1) { + fValue = ((IFDE_CSSPrimitiveValue*)(pCounter->GetValue(1)))->GetFloat(); + } + FX_INT32 iIndex = FindIndex(pszIdentifier); + if (iIndex == -1) { + FDE_CSSCOUNTERDATA data; + data.m_pszIdent = pszIdentifier; + if (bDefIncrement) { + data.m_bIncrement = TRUE; + data.m_iIncVal = (FX_INT32)fValue; + } else { + data.m_iResetVal = (FX_INT32)fValue; + data.m_bReset = TRUE; + } + m_arrCounterData.Add(data); + } else { + FDE_CSSCOUNTERDATA &data = m_arrCounterData.ElementAt(iIndex); + if (bDefIncrement) { + data.m_bIncrement = TRUE; + data.m_iIncVal += (FX_INT32)fValue; + } else { + data.m_bReset = TRUE; + data.m_iResetVal = (FX_INT32)fValue; + } + } + } +} +void CFDE_CSSCounterStyle::UpdateIndex() +{ + if (!m_bIndexDirty) { + return; + } + m_arrCounterData.RemoveAll(); + DoUpdateIndex(m_pCounterInc); + DoUpdateIndex(m_pCounterReset); + m_bIndexDirty = FALSE; +} +FDE_CSSTEXTEMPHASISMARK CFDE_CSSComputedStyle::GetTextEmphasisMark() const +{ + if (m_InheritedData.m_eTextEmphasisMark != FDE_CSSTEXTEMPHASISMARK_Auto) { + return (FDE_CSSTEXTEMPHASISMARK)m_InheritedData.m_eTextEmphasisMark; + } + if (m_InheritedData.m_eWritingMode == FDE_CSSWRITINGMODE_HorizontalTb) { + return FDE_CSSTEXTEMPHASISMARK_Dot; + } + return FDE_CSSTEXTEMPHASISMARK_Sesame; +} +_FDE_CSSRULEDATA::_FDE_CSSRULEDATA(IFDE_CSSSelector *pSel, IFDE_CSSDeclaration *pDecl, FX_DWORD dwPos) + : pSelector(pSel) + , pDeclaration(pDecl) + , dwPriority(dwPos) + , pNext(NULL) +{ + static const FX_DWORD s_Specific[5] = {0x00010000, 0x00010000, 0x00100000, 0x00100000, 0x01000000}; + for (; pSel != NULL; pSel = pSel->GetNextSelector()) { + FDE_CSSSELECTORTYPE eType = pSel->GetType(); + if (eType > FDE_CSSSELECTORTYPE_Descendant || pSel->GetNameHash() != FDE_CSSUNIVERSALHASH) { + dwPriority += s_Specific[eType]; + } + } +} +void CFDE_CSSRuleCollection::Clear() +{ + m_IDRules.RemoveAll(); + m_TagRules.RemoveAll(); + m_ClassRules.RemoveAll(); + m_pUniversalRules = NULL; + m_pStaticStore = NULL; + m_iSelectors = 0; +} +void CFDE_CSSRuleCollection::AddRulesFrom(const CFDE_CSSStyleSheetArray &sheets, FX_DWORD dwMediaList, IFX_FontMgr *pFontMgr) +{ + FX_INT32 iSheets = sheets.GetSize(); + for (FX_INT32 i = 0; i < iSheets; ++i) { + IFDE_CSSStyleSheet *pSheet = sheets.GetAt(i); + if (FX_DWORD dwMatchMedia = pSheet->GetMediaList() & dwMediaList) { + FX_INT32 iRules = pSheet->CountRules(); + for (FX_INT32 j = 0; j < iRules; j++) { + AddRulesFrom(pSheet, pSheet->GetRule(j), dwMatchMedia, pFontMgr); + } + } + } +} +void CFDE_CSSRuleCollection::AddRulesFrom(IFDE_CSSStyleSheet *pStyleSheet, IFDE_CSSRule *pRule, FX_DWORD dwMediaList, IFX_FontMgr *pFontMgr) +{ + switch (pRule->GetType()) { + case FDE_CSSRULETYPE_Style: { + IFDE_CSSStyleRule *pStyleRule = (IFDE_CSSStyleRule*)pRule; + IFDE_CSSDeclaration *pDeclaration = pStyleRule->GetDeclaration(); + FX_INT32 iSelectors = pStyleRule->CountSelectorLists(); + for (FX_INT32 i = 0; i < iSelectors; ++i) { + IFDE_CSSSelector *pSelector = pStyleRule->GetSelectorList(i); + if (pSelector->GetType() == FDE_CSSSELECTORTYPE_Persudo) { + FDE_LPCSSRULEDATA pData = NewRuleData(pSelector, pDeclaration); + AddRuleTo(m_pPersudoRules, pData); + continue; + } + if (pSelector->GetNameHash() != FDE_CSSUNIVERSALHASH) { + AddRuleTo(m_TagRules, pSelector->GetNameHash(), pSelector, pDeclaration); + continue; + } + IFDE_CSSSelector *pNext = pSelector->GetNextSelector(); + if (pNext == NULL) { + FDE_LPCSSRULEDATA pData = NewRuleData(pSelector, pDeclaration); + AddRuleTo(m_pUniversalRules, pData); + continue; + } + switch (pNext->GetType()) { + case FDE_CSSSELECTORTYPE_ID: + AddRuleTo(m_IDRules, pNext->GetNameHash(), pSelector, pDeclaration); + break; + case FDE_CSSSELECTORTYPE_Class: + AddRuleTo(m_ClassRules, pNext->GetNameHash(), pSelector, pDeclaration); + break; + case FDE_CSSSELECTORTYPE_Descendant: + case FDE_CSSSELECTORTYPE_Element: + AddRuleTo(m_pUniversalRules, NewRuleData(pSelector, pDeclaration)); + break; + default: + FXSYS_assert(FALSE); + break; + } + } + } + break; + case FDE_CSSRULETYPE_Media: { + IFDE_CSSMediaRule *pMediaRule = (IFDE_CSSMediaRule*)pRule; + if (pMediaRule->GetMediaList() & dwMediaList) { + FX_INT32 iRules = pMediaRule->CountRules(); + for (FX_INT32 i = 0; i < iRules; ++i) { + AddRulesFrom(pStyleSheet, pMediaRule->GetRule(i), dwMediaList, pFontMgr); + } + } + } + break; + default: + break; + } +} +void CFDE_CSSRuleCollection::AddRuleTo(CFX_MapPtrToPtr &map, FX_DWORD dwKey, IFDE_CSSSelector *pSel, IFDE_CSSDeclaration *pDecl) +{ + FX_LPVOID pKey = (FX_LPVOID)(FX_UINTPTR)dwKey; + FDE_LPCSSRULEDATA pData = NewRuleData(pSel, pDecl); + FDE_LPCSSRULEDATA pList = NULL; + if (!map.Lookup(pKey, (FX_LPVOID&)pList)) { + map.SetAt(pKey, pData); + } else if (AddRuleTo(pList, pData)) { + map.SetAt(pKey, pList); + } +} +inline FX_BOOL CFDE_CSSRuleCollection::AddRuleTo(FDE_LPCSSRULEDATA &pList, FDE_LPCSSRULEDATA pData) +{ + if (pList == NULL) { + pList = pData; + return TRUE; + } else { + pData->pNext = pList->pNext; + pList->pNext = pData; + return FALSE; + } +} +inline FDE_LPCSSRULEDATA CFDE_CSSRuleCollection::NewRuleData(IFDE_CSSSelector *pSel, IFDE_CSSDeclaration *pDecl) +{ + return FDE_NewWith(m_pStaticStore) FDE_CSSRULEDATA(pSel, pDecl, ++m_iSelectors); +} +IFDE_CSSStyleSelector* IFDE_CSSStyleSelector::Create() +{ + return FDE_New CFDE_CSSStyleSelector; +} +CFDE_CSSStyleSelector::CFDE_CSSStyleSelector() + : m_pFontMgr(NULL) + , m_fDefFontSize(12.0f) + , m_pRuleDataStore(NULL) + , m_pInlineStyleStore(NULL) + , m_pFixedStyleStore(NULL) + , m_pAccelerator(NULL) +{ + m_ePriorities[FDE_CSSSTYLESHEETPRIORITY_High] = FDE_CSSSTYLESHEETGROUP_Author; + m_ePriorities[FDE_CSSSTYLESHEETPRIORITY_Mid] = FDE_CSSSTYLESHEETGROUP_User; + m_ePriorities[FDE_CSSSTYLESHEETPRIORITY_Low] = FDE_CSSSTYLESHEETGROUP_UserAgent; +} +CFDE_CSSStyleSelector::~CFDE_CSSStyleSelector() +{ + Reset(); + if (m_pInlineStyleStore != NULL) { + m_pInlineStyleStore->Release(); + } + if (m_pFixedStyleStore != NULL) { + m_pFixedStyleStore->Release(); + } + if (m_pAccelerator != NULL) { + FDE_Delete m_pAccelerator; + } +} +void CFDE_CSSStyleSelector::SetFontMgr(IFX_FontMgr *pFontMgr) +{ + m_pFontMgr = pFontMgr; +} +void CFDE_CSSStyleSelector::SetDefFontSize(FX_FLOAT fFontSize) +{ + FXSYS_assert(fFontSize > 0); + m_fDefFontSize = fFontSize; +} +IFDE_CSSAccelerator* CFDE_CSSStyleSelector::InitAccelerator() +{ + if (m_pAccelerator == NULL) { + m_pAccelerator = FDE_New CFDE_CSSAccelerator; + FXSYS_assert(m_pAccelerator != NULL); + } + m_pAccelerator->Clear(); + return m_pAccelerator; +} +IFDE_CSSComputedStyle* CFDE_CSSStyleSelector::CreateComputedStyle(IFDE_CSSComputedStyle *pParentStyle) +{ + if (m_pFixedStyleStore == NULL) { + m_pFixedStyleStore = FX_CreateAllocator(FX_ALLOCTYPE_Fixed, 16, sizeof(CFDE_CSSComputedStyle)); + FXSYS_assert(m_pFixedStyleStore != NULL); + } + CFDE_CSSComputedStyle *pStyle = FDE_NewWith(m_pFixedStyleStore) CFDE_CSSComputedStyle(m_pFixedStyleStore); + if (pParentStyle) { + pStyle->m_InheritedData = ((CFDE_CSSComputedStyle*)pParentStyle)->m_InheritedData; + } else { + pStyle->m_InheritedData.Reset(); + } + pStyle->m_NonInheritedData.Reset(); + return pStyle; +} +FX_BOOL CFDE_CSSStyleSelector::SetStyleSheet(FDE_CSSSTYLESHEETGROUP eType, IFDE_CSSStyleSheet *pSheet) +{ + FXSYS_assert(eType < FDE_CSSSTYLESHEETGROUP_MAX); + CFDE_CSSStyleSheetArray &dest = m_SheetGroups[eType]; + dest.RemoveAt(0, dest.GetSize()); + if (pSheet != NULL) { + dest.Add(pSheet); + } + return TRUE; +} +FX_BOOL CFDE_CSSStyleSelector::SetStyleSheets(FDE_CSSSTYLESHEETGROUP eType, const CFDE_CSSStyleSheetArray *pArray) +{ + FXSYS_assert(eType < FDE_CSSSTYLESHEETGROUP_MAX); + CFDE_CSSStyleSheetArray &dest = m_SheetGroups[eType]; + if (pArray == NULL) { + dest.RemoveAt(0, dest.GetSize()); + } else { + dest.Copy(*pArray); + } + return TRUE; +} +void CFDE_CSSStyleSelector::SetStylePriority(FDE_CSSSTYLESHEETGROUP eType, FDE_CSSSTYLESHEETPRIORITY ePriority) +{ + m_ePriorities[ePriority] = eType; +} +void CFDE_CSSStyleSelector::UpdateStyleIndex(FX_DWORD dwMediaList) +{ + Reset(); + m_pRuleDataStore = FX_CreateAllocator(FX_ALLOCTYPE_Static, 1024, 0); + FXSYS_assert(m_pRuleDataStore != NULL); + for (FX_INT32 iGroup = 0; iGroup < FDE_CSSSTYLESHEETGROUP_MAX; ++iGroup) { + CFDE_CSSRuleCollection &rules = m_RuleCollection[iGroup]; + rules.m_pStaticStore = m_pRuleDataStore; + rules.AddRulesFrom(m_SheetGroups[iGroup], dwMediaList, m_pFontMgr); + } +} +void CFDE_CSSStyleSelector::Reset() +{ + for (FX_INT32 iGroup = 0; iGroup < FDE_CSSSTYLESHEETGROUP_MAX; ++iGroup) { + m_RuleCollection[iGroup].Clear(); + } + if (m_pRuleDataStore != NULL) { + m_pRuleDataStore->Release(); + m_pRuleDataStore = NULL; + } +} +FX_INT32 CFDE_CSSStyleSelector::MatchDeclarations(IFDE_CSSTagProvider *pTag, CFDE_CSSDeclarationArray &matchedDecls, FDE_CSSPERSUDO ePersudoType) +{ + FXSYS_assert(m_pAccelerator != NULL && pTag != NULL); + FDE_LPCSSTAGCACHE pCache = m_pAccelerator->GetTopElement(); + FXSYS_assert(pCache != NULL && pCache->GetTag() == pTag); + matchedDecls.RemoveAt(0, matchedDecls.GetSize()); + for (FX_INT32 ePriority = FDE_CSSSTYLESHEETPRIORITY_MAX - 1; ePriority >= 0; --ePriority) { + FDE_CSSSTYLESHEETGROUP eGroup = m_ePriorities[ePriority]; + CFDE_CSSRuleCollection &rules = m_RuleCollection[eGroup]; + if (rules.CountSelectors() == 0) { + continue; + } + if (ePersudoType == FDE_CSSPERSUDO_NONE) { + MatchRules(pCache, rules.GetUniversalRuleData(), ePersudoType); + if (pCache->HashTag()) { + MatchRules(pCache, rules.GetTagRuleData(pCache->HashTag()), ePersudoType); + } + FX_INT32 iCount = pCache->CountHashClass(); + for (FX_INT32 i = 0; i < iCount; i++) { + pCache->SetClassIndex(i); + MatchRules(pCache, rules.GetClassRuleData(pCache->HashClass()), ePersudoType); + } + } else { + MatchRules(pCache, rules.GetPersudoRuleData(), ePersudoType); + } + if (m_MatchedRules.GetSize() > 0) { + SortRulesTo(matchedDecls); + m_MatchedRules.RemoveAt(0, m_MatchedRules.GetSize()); + } + } + return matchedDecls.GetSize(); +} +inline void CFDE_CSSStyleSelector::MatchRules(FDE_LPCSSTAGCACHE pCache, FDE_LPCSSRULEDATA pList, FDE_CSSPERSUDO ePersudoType) +{ + while (pList != NULL) { + if (MatchSelector(pCache, pList->pSelector, ePersudoType)) { + m_MatchedRules.Add(pList); + } + pList = pList->pNext; + } +} +FX_BOOL CFDE_CSSStyleSelector::MatchSelector(FDE_LPCSSTAGCACHE pCache, IFDE_CSSSelector *pSel, FDE_CSSPERSUDO ePersudoType) +{ + FX_DWORD dwHash; + while (pSel != NULL && pCache != NULL) { + switch (pSel->GetType()) { + case FDE_CSSSELECTORTYPE_Descendant: + dwHash = pSel->GetNameHash(); + while ((pCache = pCache->GetParent()) != NULL) { + if (dwHash != FDE_CSSUNIVERSALHASH && dwHash != pCache->HashTag()) { + continue; + } + if (MatchSelector(pCache, pSel->GetNextSelector(), ePersudoType)) { + return TRUE; + } + } + return FALSE; + case FDE_CSSSELECTORTYPE_ID: + dwHash = pCache->HashID(); + if (dwHash != pSel->GetNameHash()) { + return FALSE; + } + break; + case FDE_CSSSELECTORTYPE_Class: + dwHash = pCache->HashClass(); + if (dwHash != pSel->GetNameHash()) { + return FALSE; + } + break; + case FDE_CSSSELECTORTYPE_Element: + dwHash = pSel->GetNameHash(); + if (dwHash != FDE_CSSUNIVERSALHASH && dwHash != pCache->HashTag()) { + return FALSE; + } + break; + case FDE_CSSSELECTORTYPE_Persudo: + dwHash = FDE_GetCSSPersudoByEnum(ePersudoType)->dwHash; + if (dwHash != pSel->GetNameHash()) { + return FALSE; + } + break; + default: + FXSYS_assert(FALSE); + break; + } + pSel = pSel->GetNextSelector(); + } + return pSel == NULL && pCache != NULL; +} +void CFDE_CSSStyleSelector::SortRulesTo(CFDE_CSSDeclarationArray &matchDecls) +{ + for (FX_INT32 j = m_MatchedRules.GetUpperBound(); j >= 0; --j) { + FDE_LPCSSRULEDATA &pMin = m_MatchedRules.ElementAt(j); + FX_DWORD dwMin = pMin->dwPriority; + for (FX_INT32 i = j - 1; i >= 0; --i) { + FDE_LPCSSRULEDATA &pCur = m_MatchedRules.ElementAt(i); + if (dwMin > pCur->dwPriority) { + dwMin = pCur->dwPriority; + FDE_LPCSSRULEDATA p = pMin; + pMin = pCur; + pCur = p; + } + } + matchDecls.Add(pMin->pDeclaration); + } +} +void CFDE_CSSStyleSelector::ComputeStyle(IFDE_CSSTagProvider *pTag, const IFDE_CSSDeclaration **ppDeclArray, FX_INT32 iDeclCount, IFDE_CSSComputedStyle *pDestStyle) +{ + CFDE_CSSComputedStyle *pComputedStyle = (CFDE_CSSComputedStyle*)pDestStyle; + FXSYS_assert(pTag && iDeclCount >= 0 && pComputedStyle != NULL); + FX_POSITION pos = pTag->GetFirstAttribute(); + if (pos != NULL) { + if (m_pInlineStyleStore == NULL) { + m_pInlineStyleStore = FX_CreateAllocator(FX_ALLOCTYPE_Static, 2048, 0); + } + CFDE_CSSDeclaration *pDecl = NULL; + CFX_WideStringC wsAttri, wsValue; + FX_DWORD dwAttriHash; + do { + pTag->GetNextAttribute(pos, wsAttri, wsValue); + dwAttriHash = FX_HashCode_String_GetW(wsAttri.GetPtr(), wsAttri.GetLength(), TRUE); + static const FX_DWORD s_dwStyleHash = FX_HashCode_String_GetW((FX_LPCWSTR)L"style", 5, TRUE); + static const FX_DWORD s_dwAlignHash = FX_HashCode_String_GetW((FX_LPCWSTR)L"align", 5, TRUE); + if (dwAttriHash == s_dwStyleHash) { + if (pDecl == NULL) { + pDecl = FDE_NewWith(m_pInlineStyleStore) CFDE_CSSDeclaration; + } + AppendInlineStyle(pDecl, wsValue.GetPtr(), wsValue.GetLength()); + } else if (dwAttriHash == s_dwAlignHash) { + if (pDecl == NULL) { + pDecl = FDE_NewWith(m_pInlineStyleStore) CFDE_CSSDeclaration; + } + FDE_CSSPROPERTYARGS args; + args.pStringCache = NULL; + args.pStaticStore = m_pInlineStyleStore; + args.pProperty = FDE_GetCSSPropertyByEnum(FDE_CSSPROPERTY_TextAlign); + pDecl->AddProperty(&args, wsValue.GetPtr(), wsValue.GetLength()); + } + } while (pos != NULL); + if (pDecl != NULL) { + CFDE_CSSDeclarationArray decls; + decls.SetSize(iDeclCount + 1); + IFDE_CSSDeclaration **ppInline = decls.GetData(); + FXSYS_memcpy(ppInline, ppDeclArray, iDeclCount * sizeof(IFDE_CSSDeclaration*)); + ppInline[iDeclCount++] = pDecl; + ApplyDeclarations(TRUE, (const IFDE_CSSDeclaration **)ppInline, iDeclCount, pDestStyle); + ApplyDeclarations(FALSE, (const IFDE_CSSDeclaration **)ppInline, iDeclCount, pDestStyle); + return; + } + } + if (iDeclCount > 0) { + FXSYS_assert(ppDeclArray != NULL); + ApplyDeclarations(TRUE, ppDeclArray, iDeclCount, pDestStyle); + ApplyDeclarations(FALSE, ppDeclArray, iDeclCount, pDestStyle); + } +} +void CFDE_CSSStyleSelector::ApplyDeclarations(FX_BOOL bPriority, const IFDE_CSSDeclaration **ppDeclArray, FX_INT32 iDeclCount, IFDE_CSSComputedStyle *pDestStyle) +{ + CFDE_CSSComputedStyle *pComputedStyle = (CFDE_CSSComputedStyle*)pDestStyle; + IFDE_CSSValue *pVal; + FX_BOOL bImportant; + FX_INT32 i; + if (bPriority) { + IFDE_CSSValue *pLastest = NULL, *pImportant = NULL; + for (i = 0; i < iDeclCount; ++i) { + pVal = ppDeclArray[i]->GetProperty(FDE_CSSPROPERTY_FontSize, bImportant); + if (pVal == NULL) { + continue; + } else if (bImportant) { + pImportant = pVal; + } else { + pLastest = pVal; + } + } + if (pImportant) { + ApplyProperty(FDE_CSSPROPERTY_FontSize, pImportant, pComputedStyle); + } else if (pLastest) { + ApplyProperty(FDE_CSSPROPERTY_FontSize, pLastest, pComputedStyle); + } + } else { + CFDE_CSSDeclarationArray importants; + const IFDE_CSSDeclaration *pDecl = NULL; + FDE_CSSPROPERTY eProp; + FX_POSITION pos; + for (i = 0; i < iDeclCount; ++i) { + pDecl = ppDeclArray[i]; + pos = pDecl->GetStartPosition(); + while (pos != NULL) { + pDecl->GetNextProperty(pos, eProp, pVal, bImportant); + if (eProp == FDE_CSSPROPERTY_FontSize) { + continue; + } else if (!bImportant) { + ApplyProperty(eProp, pVal, pComputedStyle); + } else if (importants.GetSize() == 0 || importants[importants.GetUpperBound()] != pDecl) { + importants.Add((IFDE_CSSDeclaration*)pDecl); + } + } + } + iDeclCount = importants.GetSize(); + for (i = 0; i < iDeclCount; ++i) { + pDecl = importants[i]; + pos = pDecl->GetStartPosition(); + while (pos != NULL) { + pDecl->GetNextProperty(pos, eProp, pVal, bImportant); + if (bImportant && eProp != FDE_CSSPROPERTY_FontSize) { + ApplyProperty(eProp, pVal, pComputedStyle); + } + } + } + CFX_WideString wsName, wsValue; + pos = pDecl->GetStartCustom(); + while (pos) { + pDecl->GetNextCustom(pos, wsName, wsValue); + pComputedStyle->AddCustomStyle(wsName, wsValue); + } + } +} +void CFDE_CSSStyleSelector::AppendInlineStyle(CFDE_CSSDeclaration *pDecl, FX_LPCWSTR psz, FX_INT32 iLen) +{ + FXSYS_assert(pDecl != NULL && psz != NULL && iLen > 0); + IFDE_CSSSyntaxParser *pSyntax = IFDE_CSSSyntaxParser::Create(); + if (pSyntax == NULL) { + return; + } + if (pSyntax->Init(psz, iLen, 32, TRUE)) { + FX_INT32 iLen; + FX_LPCWSTR psz; + FDE_CSSPROPERTYARGS args; + args.pStringCache = NULL; + args.pStaticStore = m_pInlineStyleStore; + args.pProperty = NULL; + CFX_WideString wsName; + for (;;) { + FDE_CSSSYNTAXSTATUS eStatus = pSyntax->DoSyntaxParse(); + if (eStatus == FDE_CSSSYNTAXSTATUS_PropertyName) { + psz = pSyntax->GetCurrentString(iLen); + args.pProperty = FDE_GetCSSPropertyByName(psz, iLen); + if (args.pProperty == NULL) { + wsName = CFX_WideStringC(psz, iLen); + } + } else if (eStatus == FDE_CSSSYNTAXSTATUS_PropertyValue) { + if (args.pProperty != NULL) { + psz = pSyntax->GetCurrentString(iLen); + if (iLen > 0) { + pDecl->AddProperty(&args, psz, iLen); + } + } else if (iLen > 0) { + psz = pSyntax->GetCurrentString(iLen); + if (iLen > 0) { + pDecl->AddProperty(&args, wsName, wsName.GetLength(), psz, iLen); + } + } + } else { + break; + } + } + } + pSyntax->Release(); +} +void CFDE_CSSStyleSelector::ApplyProperty(FDE_CSSPROPERTY eProperty, IFDE_CSSValue *pValue, CFDE_CSSComputedStyle *pComputedStyle) +{ +#define FDE_CSSNONINHERITS (pComputedStyle->m_NonInheritedData) +#define FDE_CSSINHERITS (pComputedStyle->m_InheritedData) +#define FDE_CSSFONTSIZE (FDE_CSSINHERITS.m_fFontSize) + if (pComputedStyle->m_InheritedData.m_pFontFamily && *(FX_DWORD*)pComputedStyle->m_InheritedData.m_pFontFamily == 0xcdcdcdcd) { + pComputedStyle = pComputedStyle; + } + if (pValue->GetType() == FDE_CSSVALUETYPE_Primitive) { + IFDE_CSSPrimitiveValue *pPrimitive = (IFDE_CSSPrimitiveValue*)pValue; + FDE_CSSPRIMITIVETYPE eType = pPrimitive->GetPrimitiveType(); + switch (eProperty) { + case FDE_CSSPROPERTY_Display: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSNONINHERITS.m_eDisplay = ToDisplay(pPrimitive->GetEnum()); + } + break; + case FDE_CSSPROPERTY_FontSize: { + FX_FLOAT &fFontSize = FDE_CSSFONTSIZE; + if (eType >= FDE_CSSPRIMITIVETYPE_Number && eType <= FDE_CSSPRIMITIVETYPE_PC) { + fFontSize = ApplyNumber(eType, pPrimitive->GetFloat(), fFontSize); + } else if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + fFontSize = ToFontSize(pPrimitive->GetEnum(), fFontSize); + } + } + break; + case FDE_CSSPROPERTY_LineHeight: + if (eType == FDE_CSSPRIMITIVETYPE_Number) { + FDE_CSSINHERITS.m_fLineHeight = pPrimitive->GetFloat() * FDE_CSSFONTSIZE; + } else if (eType > FDE_CSSPRIMITIVETYPE_Number && eType <= FDE_CSSPRIMITIVETYPE_PC) { + FDE_CSSINHERITS.m_fLineHeight = ApplyNumber(eType, pPrimitive->GetFloat(), FDE_CSSFONTSIZE); + } + break; + case FDE_CSSPROPERTY_TextAlign: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSINHERITS.m_eTextAligh = ToTextAlign(pPrimitive->GetEnum()); + } + break; + case FDE_CSSPROPERTY_TextIndent: + SetLengthWithPercent(FDE_CSSINHERITS.m_TextIndent, eType, pPrimitive, FDE_CSSFONTSIZE); + break; + case FDE_CSSPROPERTY_FontWeight: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSINHERITS.m_wFontWeight = ToFontWeight(pPrimitive->GetEnum()); + } else if (eType == FDE_CSSPRIMITIVETYPE_Number) { + FX_INT32 iValue = (FX_INT32)pPrimitive->GetFloat() / 100; + if (iValue >= 1 && iValue <= 9) { + FDE_CSSINHERITS.m_wFontWeight = iValue * 100; + } + } + break; + case FDE_CSSPROPERTY_FontStyle: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSINHERITS.m_eFontStyle = ToFontStyle(pPrimitive->GetEnum()); + } + break; + case FDE_CSSPROPERTY_Color: + if (eType == FDE_CSSPRIMITIVETYPE_RGB) { + FDE_CSSINHERITS.m_dwFontColor = pPrimitive->GetRGBColor(); + } + break; + case FDE_CSSPROPERTY_MarginLeft: + FDE_CSSNONINHERITS.m_bHasMargin |= SetLengthWithPercent(FDE_CSSNONINHERITS.m_MarginWidth.left, eType, pPrimitive, FDE_CSSFONTSIZE); + break; + case FDE_CSSPROPERTY_MarginTop: + FDE_CSSNONINHERITS.m_bHasMargin |= SetLengthWithPercent(FDE_CSSNONINHERITS.m_MarginWidth.top, eType, pPrimitive, FDE_CSSFONTSIZE); + break; + case FDE_CSSPROPERTY_MarginRight: + FDE_CSSNONINHERITS.m_bHasMargin |= SetLengthWithPercent(FDE_CSSNONINHERITS.m_MarginWidth.right, eType, pPrimitive, FDE_CSSFONTSIZE); + break; + case FDE_CSSPROPERTY_MarginBottom: + FDE_CSSNONINHERITS.m_bHasMargin |= SetLengthWithPercent(FDE_CSSNONINHERITS.m_MarginWidth.bottom, eType, pPrimitive, FDE_CSSFONTSIZE); + break; + case FDE_CSSPROPERTY_PaddingLeft: + FDE_CSSNONINHERITS.m_bHasPadding |= SetLengthWithPercent(FDE_CSSNONINHERITS.m_PaddingWidth.left, eType, pPrimitive, FDE_CSSFONTSIZE); + break; + case FDE_CSSPROPERTY_PaddingTop: + FDE_CSSNONINHERITS.m_bHasPadding |= SetLengthWithPercent(FDE_CSSNONINHERITS.m_PaddingWidth.top, eType, pPrimitive, FDE_CSSFONTSIZE); + break; + case FDE_CSSPROPERTY_PaddingRight: + FDE_CSSNONINHERITS.m_bHasPadding |= SetLengthWithPercent(FDE_CSSNONINHERITS.m_PaddingWidth.right, eType, pPrimitive, FDE_CSSFONTSIZE); + break; + case FDE_CSSPROPERTY_PaddingBottom: + FDE_CSSNONINHERITS.m_bHasPadding |= SetLengthWithPercent(FDE_CSSNONINHERITS.m_PaddingWidth.bottom, eType, pPrimitive, FDE_CSSFONTSIZE); + break; + case FDE_CSSPROPERTY_BorderLeftWidth: + FDE_CSSNONINHERITS.m_bHasBorder |= SetLengthWithPercent(FDE_CSSNONINHERITS.m_BorderWidth.left, eType, pPrimitive, FDE_CSSFONTSIZE); + break; + case FDE_CSSPROPERTY_BorderTopWidth: + FDE_CSSNONINHERITS.m_bHasBorder |= SetLengthWithPercent(FDE_CSSNONINHERITS.m_BorderWidth.top, eType, pPrimitive, FDE_CSSFONTSIZE); + break; + case FDE_CSSPROPERTY_BorderRightWidth: + FDE_CSSNONINHERITS.m_bHasBorder |= SetLengthWithPercent(FDE_CSSNONINHERITS.m_BorderWidth.right, eType, pPrimitive, FDE_CSSFONTSIZE); + break; + case FDE_CSSPROPERTY_BorderBottomWidth: + FDE_CSSNONINHERITS.m_bHasBorder |= SetLengthWithPercent(FDE_CSSNONINHERITS.m_BorderWidth.bottom, eType, pPrimitive, FDE_CSSFONTSIZE); + break; + case FDE_CSSPROPERTY_BorderLeftStyle: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSNONINHERITS.m_eBDRLeftStyle = ToBorderStyle(pPrimitive->GetEnum()); + } + break; + case FDE_CSSPROPERTY_BorderTopStyle: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSNONINHERITS.m_eBDRTopStyle = ToBorderStyle(pPrimitive->GetEnum()); + } + break; + case FDE_CSSPROPERTY_BorderRightStyle: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSNONINHERITS.m_eBDRRightStyle = ToBorderStyle(pPrimitive->GetEnum()); + } + break; + case FDE_CSSPROPERTY_BorderBottomStyle: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSNONINHERITS.m_eBDRBottomStyle = ToBorderStyle(pPrimitive->GetEnum()); + } + break; + case FDE_CSSPROPERTY_BorderLeftColor: + if (eType == FDE_CSSPRIMITIVETYPE_RGB) { + FDE_CSSNONINHERITS.m_dwBDRLeftColor = pPrimitive->GetRGBColor(); + } + break; + case FDE_CSSPROPERTY_BorderTopColor: + if (eType == FDE_CSSPRIMITIVETYPE_RGB) { + FDE_CSSNONINHERITS.m_dwBDRTopColor = pPrimitive->GetRGBColor(); + } + break; + case FDE_CSSPROPERTY_BorderRightColor: + if (eType == FDE_CSSPRIMITIVETYPE_RGB) { + FDE_CSSNONINHERITS.m_dwBDRRightColor = pPrimitive->GetRGBColor(); + } + break; + case FDE_CSSPROPERTY_BorderBottomColor: + if (eType == FDE_CSSPRIMITIVETYPE_RGB) { + FDE_CSSNONINHERITS.m_dwBDRBottomColor = pPrimitive->GetRGBColor(); + } + break; + case FDE_CSSPROPERTY_ListStyleType: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSNONINHERITS.m_eListStyleType = ToListStyleType(pPrimitive->GetEnum()); + } + break; + case FDE_CSSPROPERTY_ListStylePosition: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSNONINHERITS.m_eListStylePosition = ToListStylePosition(pPrimitive->GetEnum()); + } + break; + case FDE_CSSPROPERTY_BackgroundColor: + if (eType == FDE_CSSPRIMITIVETYPE_RGB) { + FDE_CSSNONINHERITS.m_dwBKGColor = pPrimitive->GetRGBColor(); + } else if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSNONINHERITS.m_dwBKGColor = 0; + } + break; + case FDE_CSSPROPERTY_Visibility: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSINHERITS.m_eVisibility = ToVisibility(pPrimitive->GetEnum()); + } + break; + case FDE_CSSPROPERTY_Width: + SetLengthWithPercent(FDE_CSSNONINHERITS.m_BoxSize.cx, eType, pPrimitive, FDE_CSSFONTSIZE); + break; + case FDE_CSSPROPERTY_Height: + SetLengthWithPercent(FDE_CSSNONINHERITS.m_BoxSize.cy, eType, pPrimitive, FDE_CSSFONTSIZE); + break; + case FDE_CSSPROPERTY_MinWidth: + SetLengthWithPercent(FDE_CSSNONINHERITS.m_MinBoxSize.cx, eType, pPrimitive, FDE_CSSFONTSIZE); + break; + case FDE_CSSPROPERTY_MinHeight: + SetLengthWithPercent(FDE_CSSNONINHERITS.m_MinBoxSize.cy, eType, pPrimitive, FDE_CSSFONTSIZE); + break; + case FDE_CSSPROPERTY_MaxWidth: + SetLengthWithPercent(FDE_CSSNONINHERITS.m_MaxBoxSize.cx, eType, pPrimitive, FDE_CSSFONTSIZE); + break; + case FDE_CSSPROPERTY_MaxHeight: + SetLengthWithPercent(FDE_CSSNONINHERITS.m_MaxBoxSize.cy, eType, pPrimitive, FDE_CSSFONTSIZE); + break; + case FDE_CSSPROPERTY_VerticalAlign: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSNONINHERITS.m_eVerticalAlign = ToVerticalAlign(pPrimitive->GetEnum()); + } else if (eType >= FDE_CSSPRIMITIVETYPE_Number && eType <= FDE_CSSPRIMITIVETYPE_PC) { + FDE_CSSNONINHERITS.m_eVerticalAlign = FDE_CSSVERTICALALIGN_Number; + FDE_CSSNONINHERITS.m_fVerticalAlign = ApplyNumber(eType, pPrimitive->GetFloat(), FDE_CSSFONTSIZE); + } + break; + case FDE_CSSPROPERTY_WhiteSpace: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSINHERITS.m_eWhiteSpace = ToWhiteSpace(pPrimitive->GetEnum()); + } + break; + case FDE_CSSPROPERTY_TextTransform: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSINHERITS.m_eTextTransform = ToTextTransform(pPrimitive->GetEnum()); + } + break; + case FDE_CSSPROPERTY_FontVariant: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSINHERITS.m_eFontVariant = ToFontVariant(pPrimitive->GetEnum()); + } + break; + case FDE_CSSPROPERTY_LetterSpacing: + if (eType == FDE_CSSPRIMITIVETYPE_Percent) { + break; + } else if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSINHERITS.m_LetterSpacing.Set(FDE_CSSLENGTHUNIT_Normal); + } else if (eType >= FDE_CSSPRIMITIVETYPE_Number && eType <= FDE_CSSPRIMITIVETYPE_PC) { + SetLengthWithPercent(FDE_CSSINHERITS.m_LetterSpacing, eType, pPrimitive, FDE_CSSFONTSIZE); + } + break; + case FDE_CSSPROPERTY_WordSpacing: + if (eType == FDE_CSSPRIMITIVETYPE_Percent) { + break; + } else if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSINHERITS.m_WordSpacing.Set(FDE_CSSLENGTHUNIT_Normal); + } else if (eType >= FDE_CSSPRIMITIVETYPE_Number && eType <= FDE_CSSPRIMITIVETYPE_PC) { + SetLengthWithPercent(FDE_CSSINHERITS.m_WordSpacing, eType, pPrimitive, FDE_CSSFONTSIZE); + } + break; + case FDE_CSSPROPERTY_Float: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSNONINHERITS.m_eFloat = ToFloat(pPrimitive->GetEnum()); + } + break; + case FDE_CSSPROPERTY_Clear: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSNONINHERITS.m_eClear = ToClear(pPrimitive->GetEnum()); + } + break; + case FDE_CSSPROPERTY_WritingMode: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSINHERITS.m_eWritingMode = ToWritingMode(pPrimitive->GetEnum()); + } + break; + case FDE_CSSPROPERTY_WordBreak: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSINHERITS.m_eWordBreak = ToWordBreak(pPrimitive->GetEnum()); + } + break; + case FDE_CSSPROPERTY_Widows: + if (eType == FDE_CSSPRIMITIVETYPE_Number) { + FDE_CSSINHERITS.m_iWidows = (FX_INT32)pPrimitive->GetFloat(); + } + break; + case FDE_CSSPROPERTY_Orphans: + if (eType == FDE_CSSPRIMITIVETYPE_Number) { + FDE_CSSINHERITS.m_iOrphans = (FX_INT32)pPrimitive->GetFloat(); + } + break; + case FDE_CSSPROPERTY_TextEmphasisColor: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + switch (pPrimitive->GetEnum()) { + case FDE_CSSPROPERTYVALUE_Transparent: + FDE_CSSINHERITS.m_dwTextEmphasisColor = 0; + FDE_CSSINHERITS.m_bTextEmphasisColorCurrent = FALSE; + break; + case FDE_CSSPROPERTYVALUE_Currentcolor: + FDE_CSSINHERITS.m_bTextEmphasisColorCurrent = TRUE; + break; + default: + break; + } + } else if (eType == FDE_CSSPRIMITIVETYPE_RGB) { + FDE_CSSINHERITS.m_dwTextEmphasisColor = pPrimitive->GetRGBColor(); + FDE_CSSINHERITS.m_bTextEmphasisColorCurrent = FALSE; + } + break; + case FDE_CSSPROPERTY_PageBreakBefore: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSNONINHERITS.m_ePageBreakBefore = ToPageBreak(pPrimitive->GetEnum()); + } + break; + case FDE_CSSPROPERTY_PageBreakAfter: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSNONINHERITS.m_ePageBreakAfter = ToPageBreak(pPrimitive->GetEnum()); + } + break; + case FDE_CSSPROPERTY_PageBreakInside: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSNONINHERITS.m_ePageBreakInside = ToPageBreak(pPrimitive->GetEnum()); + } + break; + case FDE_CSSPROPERTY_OverflowX: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSNONINHERITS.m_eOverflowX = ToOverflow(pPrimitive->GetEnum()); + } + break; + case FDE_CSSPROPERTY_OverflowY: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSNONINHERITS.m_eOverflowY = ToOverflow(pPrimitive->GetEnum()); + } + break; + case FDE_CSSPROPERTY_LineBreak: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSINHERITS.m_eLineBreak = ToLineBreak(pPrimitive->GetEnum()); + } + break; + case FDE_CSSPROPERTY_ColumnCount: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSNONINHERITS.m_ColumnCount.Set(FDE_CSSLENGTHUNIT_Auto); + } else if (eType == FDE_CSSPRIMITIVETYPE_Number) { + FDE_CSSNONINHERITS.m_ColumnCount.Set(FDE_CSSLENGTHUNIT_Point, pPrimitive->GetFloat()); + } + break; + case FDE_CSSPROPERTY_ColumnGap: + SetLengthWithPercent(FDE_CSSNONINHERITS.m_ColumnGap, eType, pPrimitive, FDE_CSSFONTSIZE); + break; + case FDE_CSSPROPERTY_ColumnRuleColor: + if (eType == FDE_CSSPRIMITIVETYPE_RGB) { + FDE_CSSNONINHERITS.m_dwColumnRuleColor = pPrimitive->GetRGBColor(); + FDE_CSSNONINHERITS.m_bColumnRuleColorSame = FALSE; + } + break; + case FDE_CSSPROPERTY_ColumnRuleStyle: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSNONINHERITS.m_eColumnRuleStyle = ToBorderStyle(pPrimitive->GetEnum()); + } + break; + case FDE_CSSPROPERTY_ColumnRuleWidth: + SetLengthWithPercent(FDE_CSSNONINHERITS.m_ColumnRuleWidth, eType, pPrimitive, FDE_CSSFONTSIZE); + break; + case FDE_CSSPROPERTY_ColumnWidth: + SetLengthWithPercent(FDE_CSSNONINHERITS.m_ColumnWidth, eType, pPrimitive, FDE_CSSFONTSIZE); + break; + case FDE_CSSPROPERTY_BackgroundImage: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSNONINHERITS.m_pszBKGImage = NULL; + } else if (eType == FDE_CSSPRIMITIVETYPE_URI) { + FX_INT32 iLength; + FDE_CSSNONINHERITS.m_pszBKGImage = pPrimitive->GetString(iLength); + } + break; + case FDE_CSSPROPERTY_Position: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSNONINHERITS.m_ePosition = ToPosition(pPrimitive->GetEnum()); + } + break; + case FDE_CSSPROPERTY_Top: + SetLengthWithPercent(FDE_CSSNONINHERITS.m_Top, eType, pPrimitive, FDE_CSSFONTSIZE); + break; + case FDE_CSSPROPERTY_Bottom: + SetLengthWithPercent(FDE_CSSNONINHERITS.m_Bottom, eType, pPrimitive, FDE_CSSFONTSIZE); + break; + case FDE_CSSPROPERTY_Left: + SetLengthWithPercent(FDE_CSSNONINHERITS.m_Left, eType, pPrimitive, FDE_CSSFONTSIZE); + break; + case FDE_CSSPROPERTY_Right: + SetLengthWithPercent(FDE_CSSNONINHERITS.m_Right, eType, pPrimitive, FDE_CSSFONTSIZE); + break; + case FDE_CSSPROPERTY_ListStyleImage: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSINHERITS.m_pszListStyleImage = NULL; + } else if (eType == FDE_CSSPRIMITIVETYPE_URI) { + FX_INT32 iLength; + FDE_CSSINHERITS.m_pszListStyleImage = pPrimitive->GetString(iLength); + } + break; + case FDE_CSSPROPERTY_CaptionSide: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSINHERITS.m_eCaptionSide = ToCaptionSide(pPrimitive->GetEnum()); + } + break; + case FDE_CSSPROPERTY_BackgroundRepeat: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSNONINHERITS.m_eBKGRepeat = ToBKGRepeat(pPrimitive->GetEnum()); + } + break; + case FDE_CSSPROPERTY_BackgroundAttachment: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSNONINHERITS.m_eBKGAttachment = ToBKGAttachment(pPrimitive->GetEnum()); + } + break; + case FDE_CSSPROPERTY_RubyAlign: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSINHERITS.m_eRubyAlign = ToRubyAlign(pPrimitive->GetEnum()); + } + break; + case FDE_CSSPROPERTY_RubyOverhang: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSINHERITS.m_eRubyOverhang = ToRubyOverhang(pPrimitive->GetEnum()); + } + break; + case FDE_CSSPROPERTY_RubyPosition: + if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + FDE_CSSINHERITS.m_eRubyPosition = ToRubyPosition(pPrimitive->GetEnum()); + } + break; + case FDE_CSSPROPERTY_RubySpan: + FDE_CSSNONINHERITS.m_pRubySpan = pPrimitive; + break; + default: + break; + } + } else if (pValue->GetType() == FDE_CSSVALUETYPE_List) { + IFDE_CSSValueList *pList = (IFDE_CSSValueList*)pValue; + FX_INT32 iCount = pList->CountValues(); + if (iCount > 0) { + switch (eProperty) { + case FDE_CSSPROPERTY_FontFamily: + FDE_CSSINHERITS.m_pFontFamily = pList; + break; + case FDE_CSSPROPERTY_TextDecoration: + FDE_CSSNONINHERITS.m_dwTextDecoration = ToTextDecoration(pList); + break; + case FDE_CSSPROPERTY_CounterIncrement: { + if (FDE_CSSNONINHERITS.m_pCounterStyle == NULL) { + FDE_CSSNONINHERITS.m_pCounterStyle = FDE_New CFDE_CSSCounterStyle; + } + FDE_CSSNONINHERITS.m_pCounterStyle->SetCounterIncrementList(pList); + } + break; + case FDE_CSSPROPERTY_CounterReset: { + if (FDE_CSSNONINHERITS.m_pCounterStyle == NULL) { + FDE_CSSNONINHERITS.m_pCounterStyle = FDE_New CFDE_CSSCounterStyle; + } + FDE_CSSNONINHERITS.m_pCounterStyle->SetCounterResetList(pList); + } + break; + case FDE_CSSPROPERTY_Content: + FDE_CSSNONINHERITS.m_pContentList = pList; + break; + case FDE_CSSPROPERTY_Quotes: + FDE_CSSINHERITS.m_pQuotes = pList; + break; + case FDE_CSSPROPERTY_TextCombine: { + for (FX_INT32 i = 0; i < pList->CountValues(); i++) { + IFDE_CSSPrimitiveValue *pVal = (IFDE_CSSPrimitiveValue*)pList->GetValue(i); + switch (pVal->GetPrimitiveType()) { + case FDE_CSSPRIMITIVETYPE_Enum: { + switch (pVal->GetEnum()) { + case FDE_CSSPROPERTYVALUE_None: { + FDE_CSSNONINHERITS.m_eTextCombine = FDE_CSSTEXTCOMBINE_None; + FDE_CSSNONINHERITS.m_bHasTextCombineNumber = FALSE; + } + break; + case FDE_CSSPROPERTYVALUE_Horizontal: { + FDE_CSSNONINHERITS.m_eTextCombine = FDE_CSSTEXTCOMBINE_Horizontal; + FDE_CSSNONINHERITS.m_bHasTextCombineNumber = FALSE; + } + break; + default: + break; + } + } + break; + case FDE_CSSPRIMITIVETYPE_Number: + FDE_CSSNONINHERITS.m_fTextCombineNumber = pVal->GetFloat(); + break; + default: + break; + } + } + } + break; + case FDE_CSSPROPERTY_TextEmphasisStyle: { + FDE_CSSTEXTEMPHASISFILL eFill; + FDE_CSSTEXTEMPHASISMARK eMark; + for (FX_INT32 i = 0; i < pList->CountValues(); i++) { + IFDE_CSSPrimitiveValue *pVal = (IFDE_CSSPrimitiveValue*)pList->GetValue(i); + switch (pVal->GetPrimitiveType()) { + case FDE_CSSPRIMITIVETYPE_Enum: { + if (ToTextEmphasisFill(pVal->GetEnum(), eFill)) { + FDE_CSSINHERITS.m_eTextEmphasisFill = eFill; + continue; + } else if (ToTextEmphasisMark(pVal->GetEnum(), eMark)) { + FDE_CSSINHERITS.m_eTextEmphasisMark = eMark; + } + } + break; + case FDE_CSSPRIMITIVETYPE_String: { + FDE_CSSINHERITS.m_eTextEmphasisMark = FDE_CSSTEXTEMPHASISMARK_Custom; + FX_INT32 iLen; + FDE_CSSINHERITS.m_pszTextEmphasisCustomMark = pVal->GetString(iLen); + } + break; + default: + break; + } + } + } + break; + default: + break; + } + } + } else { + FXSYS_assert(FALSE); + } +} +FX_FLOAT CFDE_CSSStyleSelector::ApplyNumber(FDE_CSSPRIMITIVETYPE eUnit, FX_FLOAT fValue, FX_FLOAT fPercentBase) +{ + switch (eUnit) { + case FDE_CSSPRIMITIVETYPE_PX: + case FDE_CSSPRIMITIVETYPE_Number: + return fValue * 72 / 96; + case FDE_CSSPRIMITIVETYPE_PT: + return fValue; + case FDE_CSSPRIMITIVETYPE_EMS: + case FDE_CSSPRIMITIVETYPE_EXS: + return fValue * fPercentBase; + case FDE_CSSPRIMITIVETYPE_Percent: + return fValue * fPercentBase / 100.0f; + case FDE_CSSPRIMITIVETYPE_CM: + return fValue * 28.3464f; + case FDE_CSSPRIMITIVETYPE_MM: + return fValue * 2.8346f; + case FDE_CSSPRIMITIVETYPE_IN: + return fValue * 72.0f; + case FDE_CSSPRIMITIVETYPE_PC: + return fValue / 12.0f; + default: + return fValue; + } +} +FDE_CSSRUBYSPAN CFDE_CSSStyleSelector::ToRubySpan(FDE_CSSPROPERTYVALUE eValue) +{ + switch (eValue) { + case FDE_CSSPROPERTYVALUE_None: + default: + return FDE_CSSRUBYSPAN_None; + } +} +FDE_CSSRUBYPOSITION CFDE_CSSStyleSelector::ToRubyPosition(FDE_CSSPROPERTYVALUE eValue) +{ + switch (eValue) { + case FDE_CSSPROPERTYVALUE_Before: + return FDE_CSSRUBYPOSITION_Before; + case FDE_CSSPROPERTYVALUE_After: + return FDE_CSSRUBYPOSITION_After; + case FDE_CSSPROPERTYVALUE_Right: + return FDE_CSSRUBYPOSITION_Right; + case FDE_CSSPROPERTYVALUE_Inline: + return FDE_CSSRUBYPOSITION_Inline; + default: + return FDE_CSSRUBYPOSITION_Before; + } +} +FDE_CSSRUBYOVERHANG CFDE_CSSStyleSelector::ToRubyOverhang(FDE_CSSPROPERTYVALUE eValue) +{ + switch (eValue) { + case FDE_CSSPROPERTYVALUE_Auto: + return FDE_CSSRUBYOVERHANG_Auto; + case FDE_CSSPROPERTYVALUE_Start: + return FDE_CSSRUBYOVERHANG_Start; + case FDE_CSSPROPERTYVALUE_End: + return FDE_CSSRUBYOVERHANG_End; + case FDE_CSSPROPERTYVALUE_None: + default: + return FDE_CSSRUBYOVERHANG_None; + } +} +FDE_CSSRUBYALIGN CFDE_CSSStyleSelector::ToRubyAlign(FDE_CSSPROPERTYVALUE eValue) +{ + switch (eValue) { + case FDE_CSSPROPERTYVALUE_Auto: + return FDE_CSSRUBYALIGN_Auto; + case FDE_CSSPROPERTYVALUE_Start: + return FDE_CSSRUBYALIGN_Start; + case FDE_CSSPROPERTYVALUE_Left: + return FDE_CSSRUBYALIGN_End; + case FDE_CSSPROPERTYVALUE_Center: + return FDE_CSSRUBYALIGN_Center; + case FDE_CSSPROPERTYVALUE_End: + return FDE_CSSRUBYALIGN_End; + case FDE_CSSPROPERTYVALUE_Right: + return FDE_CSSRUBYALIGN_Right; + case FDE_CSSPROPERTYVALUE_DistributeLetter: + return FDE_CSSRUBYALIGN_DistributeLetter; + case FDE_CSSPROPERTYVALUE_DistributeSpace: + return FDE_CSSRUBYALIGN_DistributeSpace; + case FDE_CSSPROPERTYVALUE_LineEdge: + return FDE_CSSRUBYALIGN_LineEdge; + default: + return FDE_CSSRUBYALIGN_Auto; + } +} +FX_BOOL CFDE_CSSStyleSelector::ToTextEmphasisMark(FDE_CSSPROPERTYVALUE eValue, FDE_CSSTEXTEMPHASISMARK &eMark) +{ + switch (eValue) { + case FDE_CSSPROPERTYVALUE_None: + eMark = FDE_CSSTEXTEMPHASISMARK_None; + return TRUE; + case FDE_CSSPROPERTYVALUE_Dot: + eMark = FDE_CSSTEXTEMPHASISMARK_Dot; + return TRUE; + case FDE_CSSPROPERTYVALUE_Circle: + eMark = FDE_CSSTEXTEMPHASISMARK_Circle; + return TRUE; + case FDE_CSSPROPERTYVALUE_DoubleCircle: + eMark = FDE_CSSTEXTEMPHASISMARK_DoubleCircle; + return TRUE; + case FDE_CSSPROPERTYVALUE_Triangle: + eMark = FDE_CSSTEXTEMPHASISMARK_Triangle; + return TRUE; + case FDE_CSSPROPERTYVALUE_Sesame: + eMark = FDE_CSSTEXTEMPHASISMARK_Sesame; + return TRUE; + default: + return FALSE; + } +} +FX_BOOL CFDE_CSSStyleSelector::ToTextEmphasisFill(FDE_CSSPROPERTYVALUE eValue, FDE_CSSTEXTEMPHASISFILL &eFill) +{ + switch (eValue) { + case FDE_CSSPROPERTYVALUE_Filled: + eFill = FDE_CSSTEXTEMPHASISFILL_Filled; + return TRUE; + case FDE_CSSPROPERTYVALUE_Open: + eFill = FDE_CSSTEXTEMPHASISFILL_Open; + return TRUE; + default: + return FALSE; + } +} +FDE_CSSBKGATTACHMENT CFDE_CSSStyleSelector::ToBKGAttachment(FDE_CSSPROPERTYVALUE eValue) +{ + switch (eValue) { + case FDE_CSSPROPERTYVALUE_Fixed: + return FDE_CSSBKGATTACHMENT_Fixed; + case FDE_CSSPROPERTYVALUE_Scroll: + return FDE_CSSBKGATTACHMENT_Scroll; + default: + return FDE_CSSBKGATTACHMENT_Fixed; + } +} +FDE_CSSCAPTIONSIDE CFDE_CSSStyleSelector::ToCaptionSide(FDE_CSSPROPERTYVALUE eValue) +{ + switch (eValue) { + case FDE_CSSPROPERTYVALUE_Top: + return FDE_CSSCAPTIONSIDE_Top; + case FDE_CSSPROPERTYVALUE_Bottom: + return FDE_CSSCAPTIONSIDE_Bottom; + case FDE_CSSPROPERTYVALUE_Left: + return FDE_CSSCAPTIONSIDE_Left; + case FDE_CSSPROPERTYVALUE_Right: + return FDE_CSSCAPTIONSIDE_Right; + case FDE_CSSPROPERTYVALUE_Before: + return FDE_CSSCAPTIONSIDE_Before; + case FDE_CSSPROPERTYVALUE_After: + return FDE_CSSCAPTIONSIDE_After; + default: + return FDE_CSSCAPTIONSIDE_Top; + } +} +FDE_CSSPOSITION CFDE_CSSStyleSelector::ToPosition(FDE_CSSPROPERTYVALUE eValue) +{ + switch (eValue) { + case FDE_CSSPROPERTYVALUE_Static: + return FDE_CSSPOSITION_Static; + case FDE_CSSPROPERTYVALUE_Relative: + return FDE_CSSPOSITION_Relative; + case FDE_CSSPROPERTYVALUE_Fixed: + return FDE_CSSPOSITION_Fixed; + case FDE_CSSPROPERTYVALUE_Absolute: + return FDE_CSSPOSITION_Absolute; + default: + return FDE_CSSPOSITION_Static; + } +} +FDE_CSSCURSOR CFDE_CSSStyleSelector::ToCursor(FDE_CSSPROPERTYVALUE eValue) +{ + switch (eValue) { + case FDE_CSSPROPERTYVALUE_Auto: + return FDE_CSSCURSOR_Auto; + case FDE_CSSPROPERTYVALUE_Crosshair: + return FDE_CSSCURSOR_Crosshair; + case FDE_CSSPROPERTYVALUE_Default: + return FDE_CSSCURSOR_Default; + case FDE_CSSPROPERTYVALUE_Pointer: + return FDE_CSSCURSOR_Pointer; + case FDE_CSSPROPERTYVALUE_Move: + return FDE_CSSCURSOR_Move; + case FDE_CSSPROPERTYVALUE_EResize: + return FDE_CSSCURSOR_EResize; + case FDE_CSSPROPERTYVALUE_NeResize: + return FDE_CSSCURSOR_NeResize; + case FDE_CSSPROPERTYVALUE_NwResize: + return FDE_CSSCURSOR_NwResize; + case FDE_CSSPROPERTYVALUE_NResize: + return FDE_CSSCURSOR_NResize; + case FDE_CSSPROPERTYVALUE_SeResize: + return FDE_CSSCURSOR_SeResize; + case FDE_CSSPROPERTYVALUE_SwResize: + return FDE_CSSCURSOR_SwResize; + default: + return FDE_CSSCURSOR_Auto; + } +} +FDE_CSSBKGREPEAT CFDE_CSSStyleSelector::ToBKGRepeat(FDE_CSSPROPERTYVALUE eValue) +{ + switch (eValue) { + case FDE_CSSPROPERTYVALUE_Repeat: + return FDE_CSSBKGREPEAT_Repeat; + case FDE_CSSPROPERTYVALUE_RepeatX: + return FDE_CSSBKGREPEAT_RepeatX; + case FDE_CSSPROPERTYVALUE_RepeatY: + return FDE_CSSBKGREPEAT_RepeatY; + case FDE_CSSPROPERTYVALUE_NoRepeat: + return FDE_CSSBKGREPEAT_NoRepeat; + default: + return FDE_CSSBKGREPEAT_Repeat; + } +} +FDE_CSSTEXTCOMBINE CFDE_CSSStyleSelector::ToTextCombine(FDE_CSSPROPERTYVALUE eValue) +{ + switch (eValue) { + case FDE_CSSPROPERTYVALUE_Horizontal: + return FDE_CSSTEXTCOMBINE_Horizontal; + case FDE_CSSPROPERTYVALUE_None: + default: + return FDE_CSSTEXTCOMBINE_None; + } +} +FDE_CSSLINEBREAK CFDE_CSSStyleSelector::ToLineBreak(FDE_CSSPROPERTYVALUE eValue) +{ + switch (eValue) { + case FDE_CSSPROPERTYVALUE_Auto: + return FDE_CSSLINEBREAK_Auto; + case FDE_CSSPROPERTYVALUE_Loose: + return FDE_CSSLINEBREAK_Loose; + case FDE_CSSPROPERTYVALUE_Normal: + return FDE_CSSLINEBREAK_Normal; + case FDE_CSSPROPERTYVALUE_Strict: + return FDE_CSSLINEBREAK_Strict; + default: + return FDE_CSSLINEBREAK_Auto; + } +} +FDE_CSSOVERFLOW CFDE_CSSStyleSelector::ToOverflow(FDE_CSSPROPERTYVALUE eValue) +{ + switch (eValue) { + case FDE_CSSPROPERTYVALUE_Visible: + return FDE_CSSOVERFLOW_Visible; + case FDE_CSSPROPERTYVALUE_Hidden: + return FDE_CSSOVERFLOW_Hidden; + case FDE_CSSPROPERTYVALUE_Scroll: + return FDE_CSSOVERFLOW_Scroll; + case FDE_CSSPROPERTYVALUE_Auto: + return FDE_CSSOVERFLOW_Auto; + case FDE_CSSPROPERTYVALUE_NoDisplay: + return FDE_CSSOVERFLOW_NoDisplay; + case FDE_CSSPROPERTYVALUE_NoContent: + return FDE_CSSOVERFLOW_NoContent; + default: + return FDE_CSSOVERFLOW_Visible; + } +} +FDE_CSSWRITINGMODE CFDE_CSSStyleSelector::ToWritingMode(FDE_CSSPROPERTYVALUE eValue) +{ + switch (eValue) { + case FDE_CSSPROPERTYVALUE_HorizontalTb: + return FDE_CSSWRITINGMODE_HorizontalTb; + case FDE_CSSPROPERTYVALUE_VerticalRl: + return FDE_CSSWRITINGMODE_VerticalRl; + case FDE_CSSPROPERTYVALUE_VerticalLr: + return FDE_CSSWRITINGMODE_VerticalLr; + default: + return FDE_CSSWRITINGMODE_HorizontalTb; + } +} +FDE_CSSWORDBREAK CFDE_CSSStyleSelector::ToWordBreak(FDE_CSSPROPERTYVALUE eValue) +{ + switch (eValue) { + case FDE_CSSPROPERTYVALUE_Normal: + return FDE_CSSWORDBREAK_Normal; + case FDE_CSSPROPERTYVALUE_KeepAll: + return FDE_CSSWORDBREAK_KeepAll; + case FDE_CSSPROPERTYVALUE_BreakAll: + return FDE_CSSWORDBREAK_BreakAll; + case FDE_CSSPROPERTYVALUE_KeepWords: + return FDE_CSSWORDBREAK_KeepWords; + default: + return FDE_CSSWORDBREAK_Normal; + } +} +FDE_CSSFLOAT CFDE_CSSStyleSelector::ToFloat(FDE_CSSPROPERTYVALUE eValue) +{ + switch (eValue) { + case FDE_CSSPROPERTYVALUE_Left: + return FDE_CSSFLOAT_Left; + case FDE_CSSPROPERTYVALUE_Right: + return FDE_CSSFLOAT_Right; + case FDE_CSSPROPERTYVALUE_None: + return FDE_CSSFLOAT_None; + default: + return FDE_CSSFLOAT_None; + } +} +FDE_CSSCLEAR CFDE_CSSStyleSelector::ToClear(FDE_CSSPROPERTYVALUE eValue) +{ + switch (eValue) { + case FDE_CSSPROPERTYVALUE_None: + return FDE_CSSCLEAR_None; + case FDE_CSSPROPERTYVALUE_Left: + return FDE_CSSCLEAR_Left; + case FDE_CSSPROPERTYVALUE_Right: + return FDE_CSSCLEAR_Right; + case FDE_CSSPROPERTYVALUE_Both: + return FDE_CSSCLEAR_Both; + default: + return FDE_CSSCLEAR_None; + } +} +FDE_CSSPAGEBREAK CFDE_CSSStyleSelector::ToPageBreak(FDE_CSSPROPERTYVALUE eValue) +{ + switch (eValue) { + case FDE_CSSPROPERTYVALUE_Avoid: + return FDE_CSSPAGEBREAK_Avoid; + case FDE_CSSPROPERTYVALUE_Auto: + return FDE_CSSPAGEBREAK_Auto; + case FDE_CSSPROPERTYVALUE_Always: + return FDE_CSSPAGEBREAK_Always; + case FDE_CSSPROPERTYVALUE_Left: + return FDE_CSSPAGEBREAK_Left; + case FDE_CSSPROPERTYVALUE_Right: + return FDE_CSSPAGEBREAK_Right; + default: + return FDE_CSSPAGEBREAK_Auto; + } +} +FDE_CSSDISPLAY CFDE_CSSStyleSelector::ToDisplay(FDE_CSSPROPERTYVALUE eValue) +{ + switch (eValue) { + case FDE_CSSPROPERTYVALUE_Inline: + return FDE_CSSDISPLAY_Inline; + case FDE_CSSPROPERTYVALUE_Block: + return FDE_CSSDISPLAY_Block; + case FDE_CSSPROPERTYVALUE_None: + return FDE_CSSDISPLAY_None; + case FDE_CSSPROPERTYVALUE_ListItem: + return FDE_CSSDISPLAY_ListItem; + case FDE_CSSPROPERTYVALUE_TableCell: + return FDE_CSSDISPLAY_TableCell; + case FDE_CSSPROPERTYVALUE_TableRow: + return FDE_CSSDISPLAY_TableRow; + case FDE_CSSPROPERTYVALUE_Table: + return FDE_CSSDISPLAY_Table; + case FDE_CSSPROPERTYVALUE_TableCaption: + return FDE_CSSDISPLAY_TableCaption; + case FDE_CSSPROPERTYVALUE_TableRowGroup: + return FDE_CSSDISPLAY_TableRowGroup; + case FDE_CSSPROPERTYVALUE_TableHeaderGroup: + return FDE_CSSDISPLAY_TableHeaderGroup; + case FDE_CSSPROPERTYVALUE_TableFooterGroup: + return FDE_CSSDISPLAY_TableFooterGroup; + case FDE_CSSPROPERTYVALUE_TableColumnGroup: + return FDE_CSSDISPLAY_TableColumnGroup; + case FDE_CSSPROPERTYVALUE_TableColumn: + return FDE_CSSDISPLAY_TableColumn; + case FDE_CSSPROPERTYVALUE_InlineTable: + return FDE_CSSDISPLAY_InlineTable; + case FDE_CSSPROPERTYVALUE_InlineBlock: + return FDE_CSSDISPLAY_InlineBlock; + case FDE_CSSPROPERTYVALUE_RunIn: + return FDE_CSSDISPLAY_RunIn; + case FDE_CSSPROPERTYVALUE_Ruby: + return FDE_CSSDISPLAY_Ruby; + case FDE_CSSPROPERTYVALUE_RubyBase: + return FDE_CSSDISPLAY_RubyBase; + case FDE_CSSPROPERTYVALUE_RubyText: + return FDE_CSSDISPLAY_RubyText; + case FDE_CSSPROPERTYVALUE_RubyBaseGroup: + return FDE_CSSDISPLSY_RubyBaseGroup; + case FDE_CSSPROPERTYVALUE_RubyTextGroup: + return FDE_CSSDISPLAY_RubyTextGroup; + default: + return FDE_CSSDISPLAY_Inline; + } +} +FDE_CSSTEXTALIGN CFDE_CSSStyleSelector::ToTextAlign(FDE_CSSPROPERTYVALUE eValue) +{ + switch (eValue) { + case FDE_CSSPROPERTYVALUE_Left: + return FDE_CSSTEXTALIGN_Left; + case FDE_CSSPROPERTYVALUE_Center: + return FDE_CSSTEXTALIGN_Center; + case FDE_CSSPROPERTYVALUE_Right: + return FDE_CSSTEXTALIGN_Right; + case FDE_CSSPROPERTYVALUE_Justify: + return FDE_CSSTEXTALIGN_Justify; + default: + return FDE_CSSTEXTALIGN_Left; + } +} +FX_WORD CFDE_CSSStyleSelector::ToFontWeight(FDE_CSSPROPERTYVALUE eValue) +{ + switch (eValue) { + case FDE_CSSPROPERTYVALUE_Normal: + return 400; + case FDE_CSSPROPERTYVALUE_Bold: + return 700; + case FDE_CSSPROPERTYVALUE_Bolder: + return 900; + case FDE_CSSPROPERTYVALUE_Lighter: + return 200; + default: + return 400; + } +} +FDE_CSSFONTSTYLE CFDE_CSSStyleSelector::ToFontStyle(FDE_CSSPROPERTYVALUE eValue) +{ + switch (eValue) { + case FDE_CSSPROPERTYVALUE_Italic: + case FDE_CSSPROPERTYVALUE_Oblique: + return FDE_CSSFONTSTYLE_Italic; + default: + return FDE_CSSFONTSTYLE_Normal; + } +} +FDE_CSSBORDERSTYLE CFDE_CSSStyleSelector::ToBorderStyle(FDE_CSSPROPERTYVALUE eValue) +{ + switch (eValue) { + case FDE_CSSPROPERTYVALUE_None: + return FDE_CSSBORDERSTYLE_None; + case FDE_CSSPROPERTYVALUE_Solid: + return FDE_CSSBORDERSTYLE_Solid; + case FDE_CSSPROPERTYVALUE_Hidden: + return FDE_CSSBORDERSTYLE_Hidden; + case FDE_CSSPROPERTYVALUE_Dotted: + return FDE_CSSBORDERSTYLE_Dotted; + case FDE_CSSPROPERTYVALUE_Dashed: + return FDE_CSSBORDERSTYLE_Dashed; + case FDE_CSSPROPERTYVALUE_Double: + return FDE_CSSBORDERSTYLE_Double; + case FDE_CSSPROPERTYVALUE_Groove: + return FDE_CSSBORDERSTYLE_Groove; + case FDE_CSSPROPERTYVALUE_Ridge: + return FDE_CSSBORDERSTYLE_Ridge; + case FDE_CSSPROPERTYVALUE_Inset: + return FDE_CSSBORDERSTYLE_Inset; + case FDE_CSSPROPERTYVALUE_Outset: + return FDE_CSSBORDERSTYLE_outset; + default: + return FDE_CSSBORDERSTYLE_None; + } +} +FX_BOOL CFDE_CSSStyleSelector::SetLengthWithPercent(FDE_CSSLENGTH &width, FDE_CSSPRIMITIVETYPE eType, IFDE_CSSPrimitiveValue *pPrimitive, FX_FLOAT fFontSize) +{ + if (eType == FDE_CSSPRIMITIVETYPE_Percent) { + width.Set(FDE_CSSLENGTHUNIT_Percent, pPrimitive->GetFloat() / 100.0f); + return width.NonZero(); + } else if (eType >= FDE_CSSPRIMITIVETYPE_Number && eType <= FDE_CSSPRIMITIVETYPE_PC) { + FX_FLOAT fValue = ApplyNumber(eType, pPrimitive->GetFloat(), fFontSize); + width.Set(FDE_CSSLENGTHUNIT_Point, fValue); + return width.NonZero(); + } else if (eType == FDE_CSSPRIMITIVETYPE_Enum) { + switch (pPrimitive->GetEnum()) { + case FDE_CSSPROPERTYVALUE_Auto: + width.Set(FDE_CSSLENGTHUNIT_Auto); + return TRUE; + case FDE_CSSPROPERTYVALUE_None: + width.Set(FDE_CSSLENGTHUNIT_None); + return TRUE; + case FDE_CSSPROPERTYVALUE_Thin: + width.Set(FDE_CSSLENGTHUNIT_Point, 2); + return TRUE; + case FDE_CSSPROPERTYVALUE_Medium: + width.Set(FDE_CSSLENGTHUNIT_Point, 3); + return TRUE; + case FDE_CSSPROPERTYVALUE_Thick: + width.Set(FDE_CSSLENGTHUNIT_Point, 4); + return TRUE; + default: + return FALSE; + } + } + return FALSE; +} +FX_FLOAT CFDE_CSSStyleSelector::ToFontSize(FDE_CSSPROPERTYVALUE eValue, FX_FLOAT fCurFontSize) +{ + switch (eValue) { + case FDE_CSSPROPERTYVALUE_XxSmall: + return m_fDefFontSize / 1.2f / 1.2f / 1.2f; + case FDE_CSSPROPERTYVALUE_XSmall: + return m_fDefFontSize / 1.2f / 1.2f; + case FDE_CSSPROPERTYVALUE_Small: + return m_fDefFontSize / 1.2f; + case FDE_CSSPROPERTYVALUE_Medium: + return m_fDefFontSize; + case FDE_CSSPROPERTYVALUE_Large: + return m_fDefFontSize * 1.2f; + case FDE_CSSPROPERTYVALUE_XLarge: + return m_fDefFontSize * 1.2f * 1.2f; + case FDE_CSSPROPERTYVALUE_XxLarge: + return m_fDefFontSize * 1.2f * 1.2f * 1.2f; + case FDE_CSSPROPERTYVALUE_Larger: + return fCurFontSize * 1.2f; + case FDE_CSSPROPERTYVALUE_Smaller: + return fCurFontSize / 1.2f; + default: + return fCurFontSize; + } +} +FDE_CSSVERTICALALIGN CFDE_CSSStyleSelector::ToVerticalAlign(FDE_CSSPROPERTYVALUE eValue) +{ + switch (eValue) { + case FDE_CSSPROPERTYVALUE_Baseline: + return FDE_CSSVERTICALALIGN_Baseline; + case FDE_CSSPROPERTYVALUE_Middle: + return FDE_CSSVERTICALALIGN_Middle; + case FDE_CSSPROPERTYVALUE_Bottom: + return FDE_CSSVERTICALALIGN_Bottom; + case FDE_CSSPROPERTYVALUE_Super: + return FDE_CSSVERTICALALIGN_Super; + case FDE_CSSPROPERTYVALUE_Sub: + return FDE_CSSVERTICALALIGN_Sub; + case FDE_CSSPROPERTYVALUE_Top: + return FDE_CSSVERTICALALIGN_Top; + case FDE_CSSPROPERTYVALUE_TextTop: + return FDE_CSSVERTICALALIGN_TextTop; + case FDE_CSSPROPERTYVALUE_TextBottom: + return FDE_CSSVERTICALALIGN_TextBottom; + default: + return FDE_CSSVERTICALALIGN_Baseline; + } +} +FDE_CSSLISTSTYLETYPE CFDE_CSSStyleSelector::ToListStyleType(FDE_CSSPROPERTYVALUE eValue) +{ + switch (eValue) { + case FDE_CSSPROPERTYVALUE_None: + return FDE_CSSLISTSTYLETYPE_None; + case FDE_CSSPROPERTYVALUE_Disc: + return FDE_CSSLISTSTYLETYPE_Disc; + case FDE_CSSPROPERTYVALUE_Circle: + return FDE_CSSLISTSTYLETYPE_Circle; + case FDE_CSSPROPERTYVALUE_Square: + return FDE_CSSLISTSTYLETYPE_Square; + case FDE_CSSPROPERTYVALUE_Decimal: + return FDE_CSSLISTSTYLETYPE_Decimal; + case FDE_CSSPROPERTYVALUE_DecimalLeadingZero: + return FDE_CSSLISTSTYLETYPE_DecimalLeadingZero; + case FDE_CSSPROPERTYVALUE_LowerRoman: + return FDE_CSSLISTSTYLETYPE_LowerRoman; + case FDE_CSSPROPERTYVALUE_UpperRoman: + return FDE_CSSLISTSTYLETYPE_UpperRoman; + case FDE_CSSPROPERTYVALUE_LowerGreek: + return FDE_CSSLISTSTYLETYPE_LowerGreek; + case FDE_CSSPROPERTYVALUE_LowerLatin: + return FDE_CSSLISTSTYLETYPE_LowerLatin; + case FDE_CSSPROPERTYVALUE_UpperLatin: + return FDE_CSSLISTSTYLETYPE_UpperLatin; + case FDE_CSSPROPERTYVALUE_Armenian: + return FDE_CSSLISTSTYLETYPE_Armenian; + case FDE_CSSPROPERTYVALUE_Georgian: + return FDE_CSSLISTSTYLETYPE_Georgian; + case FDE_CSSPROPERTYVALUE_LowerAlpha: + return FDE_CSSLISTSTYLETYPE_LowerAlpha; + case FDE_CSSPROPERTYVALUE_UpperAlpha: + return FDE_CSSLISTSTYLETYPE_UpperAlpha; + case FDE_CSSPROPERTYVALUE_CjkIdeographic: + return FDE_CSSLISTSTYLETYPE_CjkIdeographic; + case FDE_CSSPROPERTYVALUE_Hebrew: + return FDE_CSSLISTSTYLETYPE_Hebrew; + case FDE_CSSLISTSTYLETYPE_Hiragana: + return FDE_CSSLISTSTYLETYPE_Hiragana; + case FDE_CSSLISTSTYLETYPE_HiraganaIroha: + return FDE_CSSLISTSTYLETYPE_HiraganaIroha; + case FDE_CSSLISTSTYLETYPE_Katakana: + return FDE_CSSLISTSTYLETYPE_Katakana; + case FDE_CSSLISTSTYLETYPE_KatakanaIroha: + return FDE_CSSLISTSTYLETYPE_KatakanaIroha; + default: + return FDE_CSSLISTSTYLETYPE_Disc; + } +} +FDE_CSSLISTSTYLEPOSITION CFDE_CSSStyleSelector::ToListStylePosition(FDE_CSSPROPERTYVALUE eValue) +{ + return eValue == FDE_CSSPROPERTYVALUE_Inside ? FDE_CSSLISTSTYLEPOSITION_Inside : FDE_CSSLISTSTYLEPOSITION_Outside; +} +FDE_CSSVISIBILITY CFDE_CSSStyleSelector::ToVisibility(FDE_CSSPROPERTYVALUE eValue) +{ + switch (eValue) { + case FDE_CSSPROPERTYVALUE_Visible: + return FDE_CSSVISIBILITY_Visible; + case FDE_CSSPROPERTYVALUE_Hidden: + return FDE_CSSVISIBILITY_Hidden; + case FDE_CSSPROPERTYVALUE_Collapse: + return FDE_CSSVISIBILITY_Collapse; + default: + return FDE_CSSVISIBILITY_Visible; + } +} +FDE_CSSWHITESPACE CFDE_CSSStyleSelector::ToWhiteSpace(FDE_CSSPROPERTYVALUE eValue) +{ + switch (eValue) { + case FDE_CSSPROPERTYVALUE_Normal: + return FDE_CSSWHITESPACE_Normal; + case FDE_CSSPROPERTYVALUE_Pre: + return FDE_CSSWHITESPACE_Pre; + case FDE_CSSPROPERTYVALUE_Nowrap: + return FDE_CSSWHITESPACE_Nowrap; + case FDE_CSSPROPERTYVALUE_PreWrap: + return FDE_CSSWHITESPACE_PreWrap; + case FDE_CSSPROPERTYVALUE_PreLine: + return FDE_CSSWHITESPACE_PreLine; + default: + return FDE_CSSWHITESPACE_Normal; + } +} +FX_DWORD CFDE_CSSStyleSelector::ToTextDecoration(IFDE_CSSValueList *pValue) +{ + FX_DWORD dwDecoration = 0; + for (FX_INT32 i = pValue->CountValues() - 1; i >= 0; --i) { + IFDE_CSSPrimitiveValue *pPrimitive = (IFDE_CSSPrimitiveValue*)pValue->GetValue(i); + if (pPrimitive->GetPrimitiveType() == FDE_CSSPRIMITIVETYPE_Enum) { + switch (pPrimitive->GetEnum()) { + case FDE_CSSPROPERTYVALUE_Underline: + dwDecoration |= FDE_CSSTEXTDECORATION_Underline; + break; + case FDE_CSSPROPERTYVALUE_LineThrough: + dwDecoration |= FDE_CSSTEXTDECORATION_LineThrough; + break; + case FDE_CSSPROPERTYVALUE_Overline: + dwDecoration |= FDE_CSSTEXTDECORATION_Overline; + break; + case FDE_CSSPROPERTYVALUE_Blink: + dwDecoration |= FDE_CSSTEXTDECORATION_Blink; + break; + case FDE_CSSPROPERTYVALUE_Double: + dwDecoration |= FDE_CSSTEXTDECORATION_Double; + break; + default: + break; + } + } + } + return dwDecoration; +} +FDE_CSSTEXTTRANSFORM CFDE_CSSStyleSelector::ToTextTransform(FDE_CSSPROPERTYVALUE eValue) +{ + switch (eValue) { + case FDE_CSSPROPERTYVALUE_None: + return FDE_CSSTEXTTRANSFORM_None; + case FDE_CSSPROPERTYVALUE_Capitalize: + return FDE_CSSTEXTTRANSFORM_Capitalize; + case FDE_CSSPROPERTYVALUE_Uppercase: + return FDE_CSSTEXTTRANSFORM_UpperCase; + case FDE_CSSPROPERTYVALUE_Lowercase: + return FDE_CSSTEXTTRANSFORM_LowerCase; + default: + return FDE_CSSTEXTTRANSFORM_None; + } +} +FDE_CSSFONTVARIANT CFDE_CSSStyleSelector::ToFontVariant(FDE_CSSPROPERTYVALUE eValue) +{ + return eValue == FDE_CSSPROPERTYVALUE_SmallCaps ? FDE_CSSFONTVARIANT_SmallCaps : FDE_CSSFONTVARIANT_Normal; +} diff --git a/xfa/src/fdp/src/css/fde_cssstyleselector.h b/xfa/src/fdp/src/css/fde_cssstyleselector.h new file mode 100644 index 0000000000..4100299664 --- /dev/null +++ b/xfa/src/fdp/src/css/fde_cssstyleselector.h @@ -0,0 +1,1000 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FDE_CSSSTYLESELECTOR +#define _FDE_CSSSTYLESELECTOR +#define FDE_CSSUNIVERSALHASH ('*') +typedef struct _FDE_CSSRULEDATA : public CFX_Target { +public: + _FDE_CSSRULEDATA(IFDE_CSSSelector *pSel, IFDE_CSSDeclaration *pDecl, FX_DWORD dwPos); + IFDE_CSSSelector *pSelector; + IFDE_CSSDeclaration *pDeclaration; + FX_DWORD dwPriority; + _FDE_CSSRULEDATA *pNext; +} FDE_CSSRULEDATA, * FDE_LPCSSRULEDATA; +typedef CFX_ArrayTemplate CFDE_CSSRuleDataArray; +class CFDE_CSSRuleCollection : public CFX_Target +{ +public: + CFDE_CSSRuleCollection() : m_pStaticStore(NULL), m_pUniversalRules(NULL) , m_iSelectors(0), m_pPersudoRules(NULL) { } + ~CFDE_CSSRuleCollection() + { + Clear(); + } + void AddRulesFrom(const CFDE_CSSStyleSheetArray &sheets, FX_DWORD dwMediaList, IFX_FontMgr *pFontMgr); + void Clear(); + + FX_INT32 CountSelectors() const + { + return m_iSelectors; + } + FDE_LPCSSRULEDATA GetIDRuleData(FX_DWORD dwIDHash) + { + FX_LPVOID pData; + return m_IDRules.Lookup((FX_LPVOID)(FX_UINTPTR)dwIDHash, pData) ? (FDE_LPCSSRULEDATA)pData : NULL; + } + FDE_LPCSSRULEDATA GetTagRuleData(FX_DWORD dwTagHasn) + { + FX_LPVOID pData; + return m_TagRules.Lookup((FX_LPVOID)(FX_UINTPTR)dwTagHasn, pData) ? (FDE_LPCSSRULEDATA)pData : NULL; + } + FDE_LPCSSRULEDATA GetClassRuleData(FX_DWORD dwIDHash) + { + FX_LPVOID pData; + return m_ClassRules.Lookup((FX_LPVOID)(FX_UINTPTR)dwIDHash, pData) ? (FDE_LPCSSRULEDATA)pData : NULL; + } + FDE_LPCSSRULEDATA GetUniversalRuleData() + { + return m_pUniversalRules; + } + FDE_LPCSSRULEDATA GetPersudoRuleData() + { + return m_pPersudoRules; + } + IFX_MEMAllocator *m_pStaticStore; +protected: + void AddRulesFrom(IFDE_CSSStyleSheet *pStyleSheet, IFDE_CSSRule *pRule, FX_DWORD dwMediaList, IFX_FontMgr *pFontMgr); + void AddRuleTo(CFX_MapPtrToPtr &map, FX_DWORD dwKey, IFDE_CSSSelector *pSel, IFDE_CSSDeclaration *pDecl); + FX_BOOL AddRuleTo(FDE_LPCSSRULEDATA &pList, FDE_LPCSSRULEDATA pData); + FDE_LPCSSRULEDATA NewRuleData(IFDE_CSSSelector *pSel, IFDE_CSSDeclaration *pDecl); + CFX_MapPtrToPtr m_IDRules; + CFX_MapPtrToPtr m_TagRules; + CFX_MapPtrToPtr m_ClassRules; + FDE_LPCSSRULEDATA m_pUniversalRules; + FDE_LPCSSRULEDATA m_pPersudoRules; + FX_INT32 m_iSelectors; +}; +class CFDE_CSSAccelerator; +class CFDE_CSSComputedStyle; +class CFDE_CSSStyleSelector : public IFDE_CSSStyleSelector, public CFX_Target +{ +public: + CFDE_CSSStyleSelector(); + ~CFDE_CSSStyleSelector(); + virtual void Release() + { + FDE_Delete this; + } + + virtual void SetFontMgr(IFX_FontMgr *pFontMgr); + virtual void SetDefFontSize(FX_FLOAT fFontSize); + + virtual FX_BOOL SetStyleSheet(FDE_CSSSTYLESHEETGROUP eType, IFDE_CSSStyleSheet *pSheet); + virtual FX_BOOL SetStyleSheets(FDE_CSSSTYLESHEETGROUP eType, const CFDE_CSSStyleSheetArray *pArray); + virtual void SetStylePriority(FDE_CSSSTYLESHEETGROUP eType, FDE_CSSSTYLESHEETPRIORITY ePriority); + virtual void UpdateStyleIndex(FX_DWORD dwMediaList); + virtual IFDE_CSSAccelerator* InitAccelerator(); + virtual IFDE_CSSComputedStyle* CreateComputedStyle(IFDE_CSSComputedStyle *pParentStyle); + virtual FX_INT32 MatchDeclarations(IFDE_CSSTagProvider *pTag, CFDE_CSSDeclarationArray &matchedDecls, FDE_CSSPERSUDO ePersudoType = FDE_CSSPERSUDO_NONE); + virtual void ComputeStyle(IFDE_CSSTagProvider *pTag, const IFDE_CSSDeclaration **ppDeclArray, FX_INT32 iDeclCount, IFDE_CSSComputedStyle *pDestStyle); +protected: + void Reset(); + void MatchRules(FDE_LPCSSTAGCACHE pCache, FDE_LPCSSRULEDATA pList, FDE_CSSPERSUDO ePersudoType); + void SortRulesTo(CFDE_CSSDeclarationArray &matchDecls); + FX_BOOL MatchSelector(FDE_LPCSSTAGCACHE pCache, IFDE_CSSSelector *pSel, FDE_CSSPERSUDO ePersudoType); + void AppendInlineStyle(CFDE_CSSDeclaration *pDecl, FX_LPCWSTR psz, FX_INT32 iLen); + void ApplyDeclarations(FX_BOOL bPriority, const IFDE_CSSDeclaration **ppDeclArray, FX_INT32 iDeclCount, IFDE_CSSComputedStyle *pDestStyle); + void ApplyProperty(FDE_CSSPROPERTY eProperty, IFDE_CSSValue *pValue, CFDE_CSSComputedStyle *pComputedStyle); + + FX_FLOAT ApplyNumber(FDE_CSSPRIMITIVETYPE eUnit, FX_FLOAT fValue, FX_FLOAT fPercentBase); + FX_BOOL SetLengthWithPercent(FDE_CSSLENGTH &width, FDE_CSSPRIMITIVETYPE eType, IFDE_CSSPrimitiveValue *pPrimitive, FX_FLOAT fFontSize); + FX_FLOAT ToFontSize(FDE_CSSPROPERTYVALUE eValue, FX_FLOAT fCurFontSize); + FDE_CSSDISPLAY ToDisplay(FDE_CSSPROPERTYVALUE eValue); + FDE_CSSTEXTALIGN ToTextAlign(FDE_CSSPROPERTYVALUE eValue); + FX_WORD ToFontWeight(FDE_CSSPROPERTYVALUE eValue); + FDE_CSSFONTSTYLE ToFontStyle(FDE_CSSPROPERTYVALUE eValue); + FDE_CSSBORDERSTYLE ToBorderStyle(FDE_CSSPROPERTYVALUE eValue); + FDE_CSSVERTICALALIGN ToVerticalAlign(FDE_CSSPROPERTYVALUE eValue); + FDE_CSSLISTSTYLETYPE ToListStyleType(FDE_CSSPROPERTYVALUE eValue); + FDE_CSSLISTSTYLEPOSITION ToListStylePosition(FDE_CSSPROPERTYVALUE eValue); + FDE_CSSVISIBILITY ToVisibility(FDE_CSSPROPERTYVALUE eValue); + FDE_CSSWHITESPACE ToWhiteSpace(FDE_CSSPROPERTYVALUE eValue); + FX_DWORD ToTextDecoration(IFDE_CSSValueList *pList); + FDE_CSSTEXTTRANSFORM ToTextTransform(FDE_CSSPROPERTYVALUE eValue); + FDE_CSSFONTVARIANT ToFontVariant(FDE_CSSPROPERTYVALUE eValue); + FDE_CSSFLOAT ToFloat(FDE_CSSPROPERTYVALUE eValue); + FDE_CSSCLEAR ToClear(FDE_CSSPROPERTYVALUE eValue); + FDE_CSSWRITINGMODE ToWritingMode(FDE_CSSPROPERTYVALUE eValue); + FDE_CSSWORDBREAK ToWordBreak(FDE_CSSPROPERTYVALUE eValue); + FDE_CSSPAGEBREAK ToPageBreak(FDE_CSSPROPERTYVALUE eValue); + FDE_CSSOVERFLOW ToOverflow(FDE_CSSPROPERTYVALUE eValue); + FDE_CSSLINEBREAK ToLineBreak(FDE_CSSPROPERTYVALUE eValue); + FDE_CSSTEXTCOMBINE ToTextCombine(FDE_CSSPROPERTYVALUE eValue); + FX_BOOL ToTextEmphasisMark(FDE_CSSPROPERTYVALUE eValue, FDE_CSSTEXTEMPHASISMARK &eMark); + FX_BOOL ToTextEmphasisFill(FDE_CSSPROPERTYVALUE eValue, FDE_CSSTEXTEMPHASISFILL &eFill); + FDE_CSSCURSOR ToCursor(FDE_CSSPROPERTYVALUE eValue); + FDE_CSSPOSITION ToPosition(FDE_CSSPROPERTYVALUE eValue); + FDE_CSSCAPTIONSIDE ToCaptionSide(FDE_CSSPROPERTYVALUE eValue); + FDE_CSSBKGREPEAT ToBKGRepeat(FDE_CSSPROPERTYVALUE eValue); + FDE_CSSBKGATTACHMENT ToBKGAttachment(FDE_CSSPROPERTYVALUE eValue); + FDE_CSSRUBYALIGN ToRubyAlign(FDE_CSSPROPERTYVALUE eValue); + FDE_CSSRUBYOVERHANG ToRubyOverhang(FDE_CSSPROPERTYVALUE eValue); + FDE_CSSRUBYPOSITION ToRubyPosition(FDE_CSSPROPERTYVALUE eValue); + FDE_CSSRUBYSPAN ToRubySpan(FDE_CSSPROPERTYVALUE eValue); + IFX_FontMgr *m_pFontMgr; + FX_FLOAT m_fDefFontSize; + IFX_MEMAllocator *m_pRuleDataStore; + CFDE_CSSStyleSheetArray m_SheetGroups[FDE_CSSSTYLESHEETGROUP_MAX]; + CFDE_CSSRuleCollection m_RuleCollection[FDE_CSSSTYLESHEETGROUP_MAX]; + FDE_CSSSTYLESHEETGROUP m_ePriorities[FDE_CSSSTYLESHEETPRIORITY_MAX]; + IFX_MEMAllocator *m_pInlineStyleStore; + IFX_MEMAllocator *m_pFixedStyleStore; + CFDE_CSSAccelerator *m_pAccelerator; + CFDE_CSSRuleDataArray m_MatchedRules; +}; +typedef struct _FDE_CSSCOUNTERDATA { +public: + _FDE_CSSCOUNTERDATA() + { + FX_memset(this, 0, sizeof(_FDE_CSSCOUNTERDATA)); + } + FX_BOOL GetCounterIncrement(FX_INT32 &iValue) + { + iValue = m_iIncVal; + return m_bIncrement; + } + FX_BOOL GetCounterReset(FX_INT32 &iValue) + { + iValue = m_iResetVal; + return m_bReset; + } + FX_LPCWSTR m_pszIdent; + FX_BOOL m_bIncrement; + FX_BOOL m_bReset; + FX_INT32 m_iIncVal; + FX_INT32 m_iResetVal; +} FDE_CSSCOUNTERDATA, *FDE_LPCSSCOUNTERDATA; +class CFDE_CSSCounterStyle +{ +public: + CFDE_CSSCounterStyle(): m_pCounterInc(NULL), m_pCounterReset(NULL) {} + void SetCounterIncrementList(IFDE_CSSValueList *pList) + { + m_pCounterInc = pList; + m_bIndexDirty = TRUE; + } + void SetCounterResetList(IFDE_CSSValueList *pList) + { + m_pCounterReset = pList; + m_bIndexDirty = TRUE; + } + FX_INT32 CountCounters() + { + UpdateIndex(); + return m_arrCounterData.GetSize(); + } + FX_BOOL GetCounterIncrement(FX_INT32 index, FX_INT32 &iValue) + { + UpdateIndex(); + return m_arrCounterData.ElementAt(index).GetCounterIncrement(iValue); + } + FX_BOOL GetCounterReset(FX_INT32 index, FX_INT32 &iValue) + { + UpdateIndex(); + return m_arrCounterData.ElementAt(index).GetCounterReset(iValue); + } + FX_LPCWSTR GetCounterIdentifier(FX_INT32 index) + { + UpdateIndex(); + return m_arrCounterData.ElementAt(index).m_pszIdent; + } +protected: + void UpdateIndex(); + void DoUpdateIndex(IFDE_CSSValueList *pList); + FX_INT32 FindIndex(FX_LPCWSTR pszIdentifier); + IFDE_CSSValueList *m_pCounterInc; + IFDE_CSSValueList *m_pCounterReset; + CFX_ArrayTemplate m_arrCounterData; + FX_BOOL m_bIndexDirty; +}; +class CFDE_CSSInheritedData +{ +public: + void Reset() + { + FX_memset(this, 0, sizeof(CFDE_CSSInheritedData)); + m_LetterSpacing.Set(FDE_CSSLENGTHUNIT_Normal); + m_WordSpacing.Set(FDE_CSSLENGTHUNIT_Normal); + m_TextIndent.Set(FDE_CSSLENGTHUNIT_Point, 0); + m_fFontSize = 12.0f; + m_fLineHeight = 14.0f; + m_wFontWeight = 400; + m_dwFontColor = 0xFF000000; + m_iWidows = 2; + m_bTextEmphasisColorCurrent = TRUE; + m_iOrphans = 2; + } + FX_LPCWSTR m_pszListStyleImage; + FDE_CSSLENGTH m_LetterSpacing; + FDE_CSSLENGTH m_WordSpacing; + FDE_CSSLENGTH m_TextIndent; + IFDE_CSSValueList *m_pFontFamily; + IFDE_CSSValueList *m_pQuotes; + IFDE_CSSValueList *m_pCursorUris; + FDE_CSSCURSOR m_eCursor; + FX_FLOAT m_fFontSize; + FX_FLOAT m_fLineHeight; + FX_ARGB m_dwFontColor; + FX_ARGB m_dwTextEmphasisColor; + FX_WORD m_wFontWeight; + FX_INT32 m_iWidows; + FX_INT32 m_iOrphans; + FX_LPCWSTR m_pszTextEmphasisCustomMark; + FX_WORD m_eFontVariant : 1; + FX_WORD m_eFontStyle : 1; + FX_WORD m_bTextEmphasisColorCurrent: 1; + FX_WORD m_eTextAligh : 2; + FX_WORD m_eVisibility : 2; + FX_WORD m_eWhiteSpace : 3; + FX_WORD m_eTextTransform : 2; + FX_WORD m_eWritingMode : 2; + FX_WORD m_eWordBreak : 2; + FX_WORD m_eLineBreak : 2; + FX_WORD m_eTextEmphasisFill : 1; + FX_WORD m_eTextEmphasisMark : 3; + FX_WORD m_eCaptionSide : 3; + + FX_WORD m_eRubyAlign : 4; + FX_WORD m_eRubyOverhang : 2; + FX_WORD m_eRubyPosition : 2; +}; +class CFDE_CSSNonInheritedData +{ +public: + void Reset() + { + FX_memset(this, 0, sizeof(CFDE_CSSNonInheritedData)); + m_MarginWidth = m_BorderWidth = m_PaddingWidth.Set(FDE_CSSLENGTHUNIT_Point, 0); + m_MinBoxSize.Set(FDE_CSSLENGTHUNIT_Point, 0); + m_MaxBoxSize.Set(FDE_CSSLENGTHUNIT_None); + m_eDisplay = FDE_CSSDISPLAY_Inline; + m_fVerticalAlign = 0.0f; + m_ColumnCount.Set(FDE_CSSLENGTHUNIT_Auto); + m_ColumnGap.Set(FDE_CSSLENGTHUNIT_Normal); + m_bColumnRuleColorSame = TRUE; + m_ColumnWidth.Set(FDE_CSSLENGTHUNIT_Auto); + m_ColumnRuleWidth.Set(FDE_CSSLENGTHUNIT_Auto); + m_eTextCombine = FDE_CSSTEXTCOMBINE_None; + } + + IFDE_CSSValueList *m_pContentList; + CFDE_CSSCounterStyle *m_pCounterStyle; + FDE_CSSRECT m_MarginWidth; + FDE_CSSRECT m_BorderWidth; + FDE_CSSRECT m_PaddingWidth; + FDE_CSSSIZE m_BoxSize; + FDE_CSSSIZE m_MinBoxSize; + FDE_CSSSIZE m_MaxBoxSize; + FDE_CSSPOINT m_BKGPosition; + FX_LPCWSTR m_pszBKGImage; + FX_ARGB m_dwBKGColor; + FX_ARGB m_dwBDRLeftColor; + FX_ARGB m_dwBDRTopColor; + FX_ARGB m_dwBDRRightColor; + FX_ARGB m_dwBDRBottomColor; + IFDE_CSSValue *m_pRubySpan; + FDE_CSSLENGTH m_ColumnCount; + FDE_CSSLENGTH m_ColumnGap; + FDE_CSSLENGTH m_ColumnRuleWidth; + FDE_CSSLENGTH m_ColumnWidth; + FX_ARGB m_dwColumnRuleColor; + FDE_CSSLENGTH m_Top; + FDE_CSSLENGTH m_Bottom; + FDE_CSSLENGTH m_Left; + FDE_CSSLENGTH m_Right; + + FX_FLOAT m_fVerticalAlign; + FX_FLOAT m_fTextCombineNumber; + FX_DWORD m_eBDRLeftStyle : 4; + FX_DWORD m_eBDRTopStyle : 4; + FX_DWORD m_eBDRRightStyle : 4; + FX_DWORD m_eBDRBottomStyle : 4; + FX_DWORD m_eDisplay : 5; + FX_DWORD m_eVerticalAlign : 4; + FX_DWORD m_eListStyleType : 5; + FX_DWORD m_eColumnRuleStyle : 4; + FX_DWORD m_ePageBreakInside : 3; + FX_DWORD m_ePageBreakAfter : 3; + FX_DWORD m_ePageBreakBefore : 3; + FX_DWORD m_ePosition : 2; + FX_DWORD m_eBKGRepeat : 2; + FX_DWORD m_eFloat : 2; + FX_DWORD m_eClear : 2; + FX_DWORD m_eOverflowX : 3; + FX_DWORD m_eOverflowY : 3; + FX_DWORD m_eListStylePosition: 1; + FX_DWORD m_eBKGAttachment : 1; + FX_DWORD m_bHasMargin : 1; + FX_DWORD m_bHasBorder : 1; + FX_DWORD m_bHasPadding : 1; + FX_DWORD m_dwTextDecoration : 5; + FX_DWORD m_eTextCombine : 1; + FX_DWORD m_bColumnRuleColorSame : 1; + FX_DWORD m_bHasTextCombineNumber : 1; +}; +class CFDE_CSSComputedStyle : public IFDE_CSSComputedStyle, public IFDE_CSSFontStyle, + public IFDE_CSSBoundaryStyle, public IFDE_CSSPositionStyle, + public IFDE_CSSParagraphStyle, public IFDE_CSSBackgroundStyle, + public IFDE_CSSVisualStyle, public IFDE_CSSListStyle, + public IFDE_CSSMultiColumnStyle, public IFDE_CSSGeneratedContentStyle, + public IFDE_CSSTableStyle, public IFDE_CSSRubyStyle, + public CFX_Target +{ +public: + CFDE_CSSComputedStyle(IFX_MEMAllocator *pAlloc) : m_dwRefCount(1), m_pAllocator(pAlloc) {} + ~CFDE_CSSComputedStyle() {} + virtual FX_DWORD AddRef() + { + return ++m_dwRefCount; + } + virtual FX_DWORD Release() + { + FX_DWORD dwRefCount = --m_dwRefCount; + if (dwRefCount == 0) { + if (m_NonInheritedData.m_pCounterStyle != NULL) { + FDE_Delete m_NonInheritedData.m_pCounterStyle; + } + FDE_DeleteWith(CFDE_CSSComputedStyle, m_pAllocator, this); + } + return dwRefCount; + } + + virtual void Reset() + { + m_InheritedData.Reset(); + m_NonInheritedData.Reset(); + } + virtual IFDE_CSSFontStyle* GetFontStyles() const + { + return (IFDE_CSSFontStyle * const)this; + } + virtual IFDE_CSSBoundaryStyle* GetBoundaryStyles() const + { + return (IFDE_CSSBoundaryStyle * const)this; + } + virtual IFDE_CSSPositionStyle* GetPositionStyles() const + { + return (IFDE_CSSPositionStyle * const)this; + } + virtual IFDE_CSSParagraphStyle* GetParagraphStyles() const + { + return (IFDE_CSSParagraphStyle * const)this; + } + virtual IFDE_CSSBackgroundStyle* GetBackgroundStyles() const + { + return (IFDE_CSSBackgroundStyle * const)this; + } + virtual IFDE_CSSVisualStyle* GetVisualStyles() const + { + return (IFDE_CSSVisualStyle * const)this; + } + virtual IFDE_CSSListStyle* GetListStyles() const + { + return (IFDE_CSSListStyle * const)this; + } + virtual IFDE_CSSTableStyle* GetTableStyle() const + { + return (IFDE_CSSTableStyle * const)this; + } + virtual IFDE_CSSMultiColumnStyle* GetMultiColumnStyle() const + { + return (IFDE_CSSMultiColumnStyle * const)this; + } + virtual IFDE_CSSGeneratedContentStyle* GetGeneratedContentStyle() const + { + return (IFDE_CSSGeneratedContentStyle * const)this; + } + virtual IFDE_CSSRubyStyle* GetRubyStyle() const + { + return (IFDE_CSSRubyStyle * const)this; + } + virtual FX_BOOL GetCustomStyle(FX_WSTR wsName, CFX_WideString &wsValue) const + { + for (FX_INT32 i = m_CustomProperties.GetSize() - 2; i > -1; i -= 2) { + if (wsName == m_CustomProperties[i]) { + wsValue = m_CustomProperties[i + 1]; + return TRUE; + } + } + return FALSE; + } + virtual FDE_CSSRUBYALIGN GetRubyAlign() const + { + return (FDE_CSSRUBYALIGN)m_InheritedData.m_eRubyAlign; + } + virtual FDE_CSSRUBYPOSITION GetRubyPosition() const + { + return (FDE_CSSRUBYPOSITION)m_InheritedData.m_eRubyPosition; + } + virtual FDE_CSSRUBYOVERHANG GetRubyOverhang() const + { + return (FDE_CSSRUBYOVERHANG)m_InheritedData.m_eRubyOverhang; + } + virtual FDE_CSSRUBYSPAN GetRubySpanType() const + { + return m_NonInheritedData.m_pRubySpan == NULL ? FDE_CSSRUBYSPAN_None : FDE_CSSRUBYSPAN_Attr; + } + virtual IFDE_CSSValue* GetRubySpanAttr() const + { + return m_NonInheritedData.m_pRubySpan; + } + virtual FDE_CSSCAPTIONSIDE GetCaptionSide() const + { + return (FDE_CSSCAPTIONSIDE)m_InheritedData.m_eCaptionSide; + } + virtual FX_INT32 CountCounters() + { + return (m_NonInheritedData.m_pCounterStyle == NULL) ? 0 : m_NonInheritedData.m_pCounterStyle->CountCounters(); + } + virtual FX_LPCWSTR GetCounterIdentifier(FX_INT32 index) + { + return m_NonInheritedData.m_pCounterStyle->GetCounterIdentifier(index); + } + virtual FX_BOOL GetCounterReset(FX_INT32 index, FX_INT32 &iValue) + { + return m_NonInheritedData.m_pCounterStyle->GetCounterReset(index, iValue); + } + virtual FX_BOOL GetCounterIncrement(FX_INT32 index, FX_INT32 &iValue) + { + return m_NonInheritedData.m_pCounterStyle->GetCounterIncrement(index, iValue); + } + virtual IFDE_CSSValueList* GetContent() const + { + return m_NonInheritedData.m_pContentList; + } + virtual FX_INT32 CountQuotes() const + { + return m_InheritedData.m_pQuotes == NULL ? 0 : m_InheritedData.m_pQuotes->CountValues(); + } + virtual FX_LPCWSTR GetQuotes(FX_INT32 index) const + { + FXSYS_assert(m_InheritedData.m_pQuotes != NULL && m_InheritedData.m_pQuotes->CountValues() > index); + return ((IFDE_CSSPrimitiveValue*)(m_InheritedData.m_pQuotes->GetValue(index)))->GetString(index); + } + virtual const FDE_CSSLENGTH& GetColumnCount() const + { + return m_NonInheritedData.m_ColumnCount; + } + virtual const FDE_CSSLENGTH& GetColumnGap() const + { + return m_NonInheritedData.m_ColumnGap; + } + virtual FX_ARGB GetColumnRuleColor() const + { + return m_NonInheritedData.m_bColumnRuleColorSame ? m_InheritedData.m_dwFontColor : m_NonInheritedData.m_dwColumnRuleColor; + } + virtual FDE_CSSBORDERSTYLE GetColumnRuleStyle() const + { + return (FDE_CSSBORDERSTYLE)m_NonInheritedData.m_eColumnRuleStyle; + } + virtual const FDE_CSSLENGTH& GetColumnRuleWidth() const + { + return m_NonInheritedData.m_ColumnRuleWidth; + } + virtual const FDE_CSSLENGTH& GetColumnWidth() const + { + return m_NonInheritedData.m_ColumnWidth; + } + virtual void SetColumnCount(const FDE_CSSLENGTH &columnCount) + { + m_NonInheritedData.m_ColumnCount = columnCount; + } + virtual void SetColumnGap(const FDE_CSSLENGTH &columnGap) + { + m_NonInheritedData.m_ColumnGap = columnGap; + } + virtual void SetColumnRuleColor(FX_ARGB dwColumnRuleColor) + { + m_NonInheritedData.m_dwColumnRuleColor = dwColumnRuleColor, m_NonInheritedData.m_bColumnRuleColorSame = FALSE; + } + virtual void SetColumnRuleStyle(FDE_CSSBORDERSTYLE eColumnRuleStyle) + { + m_NonInheritedData.m_eColumnRuleStyle = eColumnRuleStyle; + } + virtual void SetColumnRuleWidth(const FDE_CSSLENGTH &columnRuleWidth) + { + m_NonInheritedData.m_ColumnRuleWidth = columnRuleWidth; + } + virtual void SetColumnWidth(const FDE_CSSLENGTH &columnWidth) + { + m_NonInheritedData.m_ColumnWidth = columnWidth; + } + virtual FX_INT32 CountFontFamilies() const + { + return m_InheritedData.m_pFontFamily ? m_InheritedData.m_pFontFamily->CountValues() : 0; + } + virtual FX_LPCWSTR GetFontFamily(FX_INT32 index) const + { + return ((IFDE_CSSPrimitiveValue*)(m_InheritedData.m_pFontFamily->GetValue(index)))->GetString(index); + } + virtual FX_WORD GetFontWeight() const + { + return m_InheritedData.m_wFontWeight; + } + virtual FDE_CSSFONTVARIANT GetFontVariant() const + { + return (FDE_CSSFONTVARIANT)m_InheritedData.m_eFontVariant; + } + virtual FDE_CSSFONTSTYLE GetFontStyle() const + { + return (FDE_CSSFONTSTYLE)m_InheritedData.m_eFontStyle; + } + virtual FX_FLOAT GetFontSize() const + { + return m_InheritedData.m_fFontSize; + } + virtual FX_ARGB GetColor() const + { + return m_InheritedData.m_dwFontColor; + } + virtual void SetFontWeight(FX_WORD wFontWeight) + { + m_InheritedData.m_wFontWeight = wFontWeight; + } + virtual void SetFontVariant(FDE_CSSFONTVARIANT eFontVariant) + { + m_InheritedData.m_eFontVariant = eFontVariant; + } + virtual void SetFontStyle(FDE_CSSFONTSTYLE eFontStyle) + { + m_InheritedData.m_eFontStyle = eFontStyle; + } + virtual void SetFontSize(FX_FLOAT fFontSize) + { + m_InheritedData.m_fFontSize = fFontSize; + } + virtual void SetColor(FX_ARGB dwFontColor) + { + m_InheritedData.m_dwFontColor = dwFontColor; + } + virtual FX_ARGB GetBorderLeftColor() const + { + return m_NonInheritedData.m_dwBDRLeftColor; + } + virtual FX_ARGB GetBorderTopColor() const + { + return m_NonInheritedData.m_dwBDRTopColor; + } + virtual FX_ARGB GetBorderRightColor() const + { + return m_NonInheritedData.m_dwBDRRightColor; + } + virtual FX_ARGB GetBorderBottomColor() const + { + return m_NonInheritedData.m_dwBDRBottomColor; + } + + virtual FDE_CSSBORDERSTYLE GetBorderLeftStyle() const + { + return (FDE_CSSBORDERSTYLE)m_NonInheritedData.m_eBDRLeftStyle; + } + virtual FDE_CSSBORDERSTYLE GetBorderTopStyle() const + { + return (FDE_CSSBORDERSTYLE)m_NonInheritedData.m_eBDRTopStyle; + } + virtual FDE_CSSBORDERSTYLE GetBorderRightStyle() const + { + return (FDE_CSSBORDERSTYLE)m_NonInheritedData.m_eBDRRightStyle; + } + virtual FDE_CSSBORDERSTYLE GetBorderBottomStyle() const + { + return (FDE_CSSBORDERSTYLE)m_NonInheritedData.m_eBDRBottomStyle; + } + + virtual const FDE_CSSRECT* GetBorderWidth() const + { + return m_NonInheritedData.m_bHasBorder ? &(m_NonInheritedData.m_BorderWidth) : NULL; + } + virtual const FDE_CSSRECT* GetMarginWidth() const + { + return m_NonInheritedData.m_bHasMargin ? &(m_NonInheritedData.m_MarginWidth) : NULL; + } + virtual const FDE_CSSRECT* GetPaddingWidth() const + { + return m_NonInheritedData.m_bHasPadding ? &(m_NonInheritedData.m_PaddingWidth) : NULL; + } + virtual void SetBorderLeftColor(FX_ARGB dwBorderColor) + { + m_NonInheritedData.m_dwBDRLeftColor = dwBorderColor; + } + virtual void SetBorderTopColor(FX_ARGB dwBorderColor) + { + m_NonInheritedData.m_dwBDRTopColor = dwBorderColor; + } + virtual void SetBorderRightColor(FX_ARGB dwBorderColor) + { + m_NonInheritedData.m_dwBDRRightColor = dwBorderColor; + } + virtual void SetBorderBottomColor(FX_ARGB dwBorderColor) + { + m_NonInheritedData.m_dwBDRBottomColor = dwBorderColor; + } + + virtual void SetBorderLeftStyle(FDE_CSSBORDERSTYLE eBorderStyle) + { + m_NonInheritedData.m_eBDRLeftStyle = eBorderStyle; + } + virtual void SetBorderTopStyle(FDE_CSSBORDERSTYLE eBorderStyle) + { + m_NonInheritedData.m_eBDRTopStyle = eBorderStyle; + } + virtual void SetBorderRightStyle(FDE_CSSBORDERSTYLE eBorderStyle) + { + m_NonInheritedData.m_eBDRRightStyle = eBorderStyle; + } + virtual void SetBorderBottomStyle(FDE_CSSBORDERSTYLE eBorderStyle) + { + m_NonInheritedData.m_eBDRBottomStyle = eBorderStyle; + } + + virtual void SetBorderWidth(const FDE_CSSRECT &rect) + { + m_NonInheritedData.m_BorderWidth = rect; + m_NonInheritedData.m_bHasBorder = TRUE; + } + virtual void SetMarginWidth(const FDE_CSSRECT &rect) + { + m_NonInheritedData.m_MarginWidth = rect; + m_NonInheritedData.m_bHasMargin = TRUE; + } + virtual void SetPaddingWidth(const FDE_CSSRECT &rect) + { + m_NonInheritedData.m_PaddingWidth = rect; + m_NonInheritedData.m_bHasPadding = TRUE; + } + virtual FDE_CSSDISPLAY GetDisplay() const + { + return (FDE_CSSDISPLAY)m_NonInheritedData.m_eDisplay; + } + virtual const FDE_CSSSIZE& GetBoxSize() const + { + return m_NonInheritedData.m_BoxSize; + } + virtual const FDE_CSSSIZE& GetMinBoxSize() const + { + return m_NonInheritedData.m_MinBoxSize; + } + virtual const FDE_CSSSIZE& GetMaxBoxSize() const + { + return m_NonInheritedData.m_MaxBoxSize; + } + virtual FDE_CSSFLOAT GetFloat() const + { + return (FDE_CSSFLOAT)m_NonInheritedData.m_eFloat; + } + virtual FDE_CSSCLEAR GetClear() const + { + return (FDE_CSSCLEAR)m_NonInheritedData.m_eClear; + } + virtual FDE_CSSPOSITION GetPosition() const + { + return (FDE_CSSPOSITION)m_NonInheritedData.m_ePosition; + } + virtual FDE_CSSLENGTH GetTop() const + { + return m_NonInheritedData.m_Top; + } + virtual FDE_CSSLENGTH GetBottom() const + { + return m_NonInheritedData.m_Bottom; + } + virtual FDE_CSSLENGTH GetLeft() const + { + return m_NonInheritedData.m_Left; + } + virtual FDE_CSSLENGTH GetRight() const + { + return m_NonInheritedData.m_Right; + } + + virtual void SetDisplay(FDE_CSSDISPLAY eDisplay) + { + m_NonInheritedData.m_eDisplay = eDisplay; + } + virtual void SetBoxSize(const FDE_CSSSIZE &size) + { + m_NonInheritedData.m_BoxSize = size; + } + virtual void SetMinBoxSize(const FDE_CSSSIZE &size) + { + m_NonInheritedData.m_MinBoxSize = size; + } + virtual void SetMaxBoxSize(const FDE_CSSSIZE &size) + { + m_NonInheritedData.m_MaxBoxSize = size; + } + virtual void SetFloat(FDE_CSSFLOAT eFloat) + { + m_NonInheritedData.m_eFloat = eFloat; + } + virtual void SetClear(FDE_CSSCLEAR eClear) + { + m_NonInheritedData.m_eClear = eClear; + } + virtual FX_FLOAT GetLineHeight() const + { + return m_InheritedData.m_fLineHeight; + } + virtual FDE_CSSWHITESPACE GetWhiteSpace() const + { + return (FDE_CSSWHITESPACE)m_InheritedData.m_eWhiteSpace; + } + virtual const FDE_CSSLENGTH& GetTextIndent() const + { + return m_InheritedData.m_TextIndent; + } + virtual FDE_CSSTEXTALIGN GetTextAlign() const + { + return (FDE_CSSTEXTALIGN)m_InheritedData.m_eTextAligh; + } + virtual FDE_CSSVERTICALALIGN GetVerticalAlign() const + { + return (FDE_CSSVERTICALALIGN)m_NonInheritedData.m_eVerticalAlign; + } + virtual FX_FLOAT GetNumberVerticalAlign() const + { + return m_NonInheritedData.m_fVerticalAlign; + } + virtual FDE_CSSTEXTTRANSFORM GetTextTransform() const + { + return (FDE_CSSTEXTTRANSFORM)m_InheritedData.m_eTextTransform; + } + virtual FX_DWORD GetTextDecoration() const + { + return m_NonInheritedData.m_dwTextDecoration; + } + virtual const FDE_CSSLENGTH& GetLetterSpacing() const + { + return m_InheritedData.m_LetterSpacing; + } + virtual const FDE_CSSLENGTH& GetWordSpacing() const + { + return m_InheritedData.m_WordSpacing; + } + virtual FDE_CSSWRITINGMODE GetWritingMode() const + { + return (FDE_CSSWRITINGMODE)m_InheritedData.m_eWritingMode; + } + virtual FDE_CSSWORDBREAK GetWordBreak() const + { + return (FDE_CSSWORDBREAK)m_InheritedData.m_eWordBreak; + } + virtual FX_INT32 GetWidows() const + { + return m_InheritedData.m_iWidows; + } + virtual FX_ARGB GetTextEmphasisColor() const + { + return m_InheritedData.m_bTextEmphasisColorCurrent ? m_InheritedData.m_dwFontColor : m_InheritedData.m_dwTextEmphasisColor; + } + virtual FDE_CSSPAGEBREAK GetPageBreakBefore() const + { + return (FDE_CSSPAGEBREAK)m_NonInheritedData.m_ePageBreakBefore; + } + virtual FDE_CSSPAGEBREAK GetPageBreakAfter() const + { + return (FDE_CSSPAGEBREAK)m_NonInheritedData.m_ePageBreakAfter; + } + virtual FDE_CSSPAGEBREAK GetPageBreakInside() const + { + return (FDE_CSSPAGEBREAK)m_NonInheritedData.m_ePageBreakInside; + } + virtual FX_INT32 GetOrphans() const + { + return m_InheritedData.m_iOrphans; + } + virtual FDE_CSSLINEBREAK GetLineBreak() const + { + return (FDE_CSSLINEBREAK)m_InheritedData.m_eLineBreak; + } + virtual FDE_CSSTEXTEMPHASISMARK GetTextEmphasisMark() const; + virtual FDE_CSSTEXTEMPHASISFILL GetTextEmphasisFill() const + { + return (FDE_CSSTEXTEMPHASISFILL)m_InheritedData.m_eTextEmphasisFill; + } + virtual FX_LPCWSTR GetTextEmphasisCustom() const + { + FXSYS_assert(m_InheritedData.m_eTextEmphasisMark == FDE_CSSTEXTEMPHASISMARK_Custom); + return m_InheritedData.m_pszTextEmphasisCustomMark; + } + virtual FDE_CSSTEXTCOMBINE GetTextCombineType() const + { + return (FDE_CSSTEXTCOMBINE)m_NonInheritedData.m_eTextCombine; + } + virtual FX_BOOL HasTextCombineNumber() const + { + return m_NonInheritedData.m_bHasTextCombineNumber; + } + virtual FX_FLOAT GetTextCombineNumber() const + { + FXSYS_assert(m_NonInheritedData.m_eTextCombine == FDE_CSSTEXTCOMBINE_Horizontal); + return m_NonInheritedData.m_fTextCombineNumber; + } + virtual void SetLineHeight(FX_FLOAT fLineHeight) + { + m_InheritedData.m_fLineHeight = fLineHeight; + } + virtual void SetWhiteSpace(FDE_CSSWHITESPACE eWhiteSpace) + { + m_InheritedData.m_eWhiteSpace = eWhiteSpace; + } + virtual void SetTextIndent(const FDE_CSSLENGTH &textIndent) + { + m_InheritedData.m_TextIndent = textIndent; + } + virtual void SetTextAlign(FDE_CSSTEXTALIGN eTextAlign) + { + m_InheritedData.m_eTextAligh = eTextAlign; + } + virtual void SetVerticalAlign(FDE_CSSVERTICALALIGN eVerticalAlign) + { + m_NonInheritedData.m_eVerticalAlign = eVerticalAlign; + } + virtual void SetNumberVerticalAlign(FX_FLOAT fAlign) + { + m_NonInheritedData.m_eVerticalAlign = FDE_CSSVERTICALALIGN_Number, m_NonInheritedData.m_fVerticalAlign = fAlign; + } + virtual void SetTextTransform(FDE_CSSTEXTTRANSFORM eTextTransform) + { + m_InheritedData.m_eTextTransform = eTextTransform; + } + virtual void SetTextDecoration(FX_DWORD dwTextDecoration) + { + m_NonInheritedData.m_dwTextDecoration = dwTextDecoration; + } + virtual void SetLetterSpacing(const FDE_CSSLENGTH &letterSpacing) + { + m_InheritedData.m_LetterSpacing = letterSpacing; + } + virtual void SetWordSpacing(const FDE_CSSLENGTH &wordSpacing) + { + m_InheritedData.m_WordSpacing = wordSpacing; + } + virtual void SetWritingMode(FDE_CSSWRITINGMODE eWritingMode) + { + m_InheritedData.m_eWritingMode = eWritingMode; + } + virtual void SetWordBreak(FDE_CSSWORDBREAK eWordBreak) + { + m_InheritedData.m_eWordBreak = eWordBreak; + } + virtual void SetWidows(FX_INT32 iWidows) + { + m_InheritedData.m_iWidows = iWidows; + } + virtual void SetTextEmphasisColor(FX_ARGB dwTextEmphasisColor) + { + m_InheritedData.m_dwTextEmphasisColor = dwTextEmphasisColor, m_InheritedData.m_bTextEmphasisColorCurrent = FALSE; + } + virtual void SetPageBreakBefore(FDE_CSSPAGEBREAK ePageBreakBefore) + { + m_NonInheritedData.m_ePageBreakBefore = ePageBreakBefore; + } + virtual void SetPageBreakAfter(FDE_CSSPAGEBREAK ePageBreakAfter) + { + m_NonInheritedData.m_ePageBreakAfter = ePageBreakAfter; + } + virtual void SetPageBreakInside(FDE_CSSPAGEBREAK ePageBreakInside) + { + m_NonInheritedData.m_ePageBreakInside = ePageBreakInside; + } + virtual void SetOrphans(FX_INT32 iOrphans) + { + m_InheritedData.m_iOrphans = iOrphans; + } + virtual void SetLineBreak(FDE_CSSLINEBREAK eLineBreak) + { + m_InheritedData.m_eLineBreak = eLineBreak; + } + virtual FX_ARGB GetBKGColor() const + { + return m_NonInheritedData.m_dwBKGColor; + } + virtual FX_LPCWSTR GetBKGImage() const + { + return m_NonInheritedData.m_pszBKGImage; + } + virtual const FDE_CSSPOINT& GetBKGPosition() const + { + return m_NonInheritedData.m_BKGPosition; + } + virtual FDE_CSSBKGREPEAT GetBKGRepeat() const + { + return (FDE_CSSBKGREPEAT)m_NonInheritedData.m_eBKGRepeat; + } + virtual FDE_CSSBKGATTACHMENT GetBKGAttachment() const + { + return (FDE_CSSBKGATTACHMENT)m_NonInheritedData.m_eBKGAttachment; + } + virtual void SetBKGColor(FX_ARGB dwBKGColor) + { + m_NonInheritedData.m_dwBKGColor = dwBKGColor; + } + virtual void SetBKGPosition(const FDE_CSSPOINT &bkgPosition) + { + m_NonInheritedData.m_BKGPosition = bkgPosition; + } + virtual FDE_CSSVISIBILITY GetVisibility() const + { + return (FDE_CSSVISIBILITY)m_InheritedData.m_eVisibility; + } + virtual FDE_CSSOVERFLOW GetOverflowX() const + { + return (FDE_CSSOVERFLOW)m_NonInheritedData.m_eOverflowX; + } + virtual FDE_CSSOVERFLOW GetOverflowY() const + { + return (FDE_CSSOVERFLOW)m_NonInheritedData.m_eOverflowY; + } + virtual FX_INT32 CountCursorUrls() const + { + return m_InheritedData.m_pCursorUris == NULL ? 0 : m_InheritedData.m_pCursorUris->CountValues(); + } + virtual FX_LPCWSTR GetCursorUrl(FX_INT32 index) const + { + FXSYS_assert(m_InheritedData.m_pCursorUris != NULL); + return ((IFDE_CSSPrimitiveValue*)(m_InheritedData.m_pCursorUris->GetValue(index)))->GetString(index); + } + virtual FDE_CSSCURSOR GetCursorType() const + { + return m_InheritedData.m_eCursor; + } + virtual void SetVisibility(FDE_CSSVISIBILITY eVisibility) + { + m_InheritedData.m_eVisibility = eVisibility; + } + virtual FDE_CSSLISTSTYLETYPE GetListStyleType() const + { + return (FDE_CSSLISTSTYLETYPE)m_NonInheritedData.m_eListStyleType; + } + virtual FDE_CSSLISTSTYLEPOSITION GetListStylePosition() const + { + return (FDE_CSSLISTSTYLEPOSITION)m_NonInheritedData.m_eListStylePosition; + } + virtual FX_LPCWSTR GetListStyleImage() const + { + return m_InheritedData.m_pszListStyleImage; + } + virtual void SetListStyleType(FDE_CSSLISTSTYLETYPE eListStyleType) + { + m_NonInheritedData.m_eListStyleType = eListStyleType; + } + virtual void SetListStylePosition(FDE_CSSLISTSTYLEPOSITION eListStylePosition) + { + m_NonInheritedData.m_eListStylePosition = eListStylePosition; + } + void AddCustomStyle(const CFX_WideString &wsName, const CFX_WideString &wsValue) + { + m_CustomProperties.Add(wsName); + m_CustomProperties.Add(wsValue); + } + FX_DWORD m_dwRefCount; + IFX_MEMAllocator *m_pAllocator; + CFDE_CSSInheritedData m_InheritedData; + CFDE_CSSNonInheritedData m_NonInheritedData; + CFX_WideStringArray m_CustomProperties; +}; +#endif diff --git a/xfa/src/fdp/src/css/fde_cssstylesheet.cpp b/xfa/src/fdp/src/css/fde_cssstylesheet.cpp new file mode 100644 index 0000000000..19bef6632c --- /dev/null +++ b/xfa/src/fdp/src/css/fde_cssstylesheet.cpp @@ -0,0 +1,481 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "fde_csssyntax.h" +#include "fde_cssdatatable.h" +#include "fde_cssstylesheet.h" +IFDE_CSSStyleSheet* IFDE_CSSStyleSheet::LoadHTMLStandardStyleSheet() +{ + static const FX_LPCWSTR s_pStyle = (FX_LPCWSTR)L"html,address,blockquote,body,dd,div,dl,dt,fieldset,form,frame,frameset,h1,h2,h3,h4,h5,h6,noframes,ol,p,ul,center,dir,hr,menu,pre{display:block}" + L"li{display:list-item}head{display:none}table{display:table}tr{display:table-row}thead{display:table-header-group}tbody{display:table-row-group}tfoot{display:table-footer-group}" + L"col{display:table-column}colgroup{display:table-column-group}td,th{display:table-cell}caption{display:table-caption}th{font-weight:bolder;text-align:center}caption{text-align:center}" + L"body{margin:0}h1{font-size:2em;margin:.67em 0}h2{font-size:1.5em;margin:.75em 0}h3{font-size:1.17em;margin:.83em 0}h4,p,blockquote,ul,fieldset,form,ol,dl,dir,menu{margin:1.12em 0}" + L"h5{font-size:.83em;margin:1.5em 0}h6{font-size:.75em;margin:1.67em 0}h1,h2,h3,h4,h5,h6,b,strong{font-weight:bolder}blockquote{margin-left:40px;margin-right:40px}i,cite,em,var,address{font-style:italic}" + L"pre,tt,code,kbd,samp{font-family:monospace}pre{white-space:pre}button,textarea,input,select{display:inline-block}big{font-size:1.17em}small,sub,sup{font-size:.83em}sub{vertical-align:sub}" + L"sup{vertical-align:super}table{border-spacing:2px}thead,tbody,tfoot{vertical-align:middle}td,th,tr{vertical-align:inherit}s,strike,del{text-decoration:line-through}hr{border:1px inset silver}" + L"ol,ul,dir,menu,dd{margin-left:40px}ol{list-style-type:decimal}ol ul,ul ol,ul ul,ol ol{margin-top:0;margin-bottom:0}u,ins{text-decoration:underline}center{text-align:center}" + L"ruby{display:ruby}rt{display:ruby-text;font-size:.5em}rb{display:ruby-base}rbc{display:ruby-base-group}rtc{display:ruby-text-group}" + L"q:before{content:open-quote}q:after{content:close-quote}" + L"rp{display:none}"; + return IFDE_CSSStyleSheet::LoadFromBuffer(CFX_WideString(), s_pStyle, FXSYS_wcslen(s_pStyle), FX_CODEPAGE_UTF8); +} +IFDE_CSSStyleSheet* IFDE_CSSStyleSheet::LoadFromStream(const CFX_WideString &szUrl, IFX_Stream *pStream, FX_WORD wCodePage, FX_DWORD dwMediaList ) +{ + CFDE_CSSStyleSheet *pStyleSheet = FDE_New CFDE_CSSStyleSheet(dwMediaList); + if (pStyleSheet == NULL) { + return NULL; + } + if (!pStyleSheet->LoadFromStream(szUrl, pStream, wCodePage)) { + pStyleSheet->Release(); + pStyleSheet = NULL; + } + return pStyleSheet; +} +IFDE_CSSStyleSheet* IFDE_CSSStyleSheet::LoadFromBuffer(const CFX_WideString &szUrl, FX_LPCWSTR pBuffer, FX_INT32 iBufSize, FX_WORD wCodePage, FX_DWORD dwMediaList ) +{ + CFDE_CSSStyleSheet *pStyleSheet = FDE_New CFDE_CSSStyleSheet(dwMediaList); + if (pStyleSheet == NULL) { + return NULL; + } + if (!pStyleSheet->LoadFromBuffer(szUrl, pBuffer, iBufSize, wCodePage)) { + pStyleSheet->Release(); + pStyleSheet = NULL; + } + return pStyleSheet; +} +CFDE_CSSStyleSheet::CFDE_CSSStyleSheet(FX_DWORD dwMediaList) + : m_wCodePage(FX_CODEPAGE_UTF8) + , m_wRefCount(1) + , m_dwMediaList(dwMediaList) + , m_pAllocator(NULL) +{ + FXSYS_assert(m_dwMediaList > 0); +} +CFDE_CSSStyleSheet::~CFDE_CSSStyleSheet() +{ + Reset(); +} +void CFDE_CSSStyleSheet::Reset() +{ + for (FX_INT32 i = m_RuleArray.GetSize() - 1; i >= 0; --i) { + IFDE_CSSRule *pRule = m_RuleArray.GetAt(i); + switch (pRule->GetType()) { + case FDE_CSSRULETYPE_Style: + ((CFDE_CSSStyleRule*)pRule)->~CFDE_CSSStyleRule(); + break; + case FDE_CSSRULETYPE_Media: + ((CFDE_CSSMediaRule*)pRule)->~CFDE_CSSMediaRule(); + break; + case FDE_CSSRULETYPE_FontFace: + ((CFDE_CSSFontFaceRule*)pRule)->~CFDE_CSSFontFaceRule(); + break; + default: + FXSYS_assert(FALSE); + break; + } + } + m_RuleArray.RemoveAll(); + m_Selectors.RemoveAll(); + m_StringCache.RemoveAll(); + if (m_pAllocator) { + m_pAllocator->Release(); + m_pAllocator = NULL; + } +} +FX_DWORD CFDE_CSSStyleSheet::AddRef() +{ + return ++m_wRefCount; +} +FX_DWORD CFDE_CSSStyleSheet::Release() +{ + FX_DWORD dwRefCount = --m_wRefCount; + if (dwRefCount == 0) { + FDE_Delete this; + } + return dwRefCount; +} +FX_INT32 CFDE_CSSStyleSheet::CountRules() const +{ + return m_RuleArray.GetSize(); +} +IFDE_CSSRule* CFDE_CSSStyleSheet::GetRule(FX_INT32 index) +{ + return m_RuleArray.GetAt(index); +} +FX_BOOL CFDE_CSSStyleSheet::LoadFromStream(const CFX_WideString &szUrl, IFX_Stream *pStream, FX_WORD wCodePage) +{ + FXSYS_assert(pStream != NULL); + IFDE_CSSSyntaxParser *pSyntax = IFDE_CSSSyntaxParser::Create(); + if (pSyntax == NULL) { + return FALSE; + } + if (pStream->GetCodePage() != wCodePage) { + pStream->SetCodePage(wCodePage); + } + FX_BOOL bRet = pSyntax->Init(pStream, 4096) && LoadFromSyntax(pSyntax); + pSyntax->Release(); + m_wCodePage = wCodePage; + m_szUrl = szUrl; + return bRet; +} +FX_BOOL CFDE_CSSStyleSheet::LoadFromBuffer(const CFX_WideString &szUrl, FX_LPCWSTR pBuffer, FX_INT32 iBufSize, FX_WORD wCodePage) +{ + FXSYS_assert(pBuffer != NULL && iBufSize > 0); + IFDE_CSSSyntaxParser *pSyntax = IFDE_CSSSyntaxParser::Create(); + if (pSyntax == NULL) { + return FALSE; + } + FX_BOOL bRet = pSyntax->Init(pBuffer, iBufSize) && LoadFromSyntax(pSyntax); + pSyntax->Release(); + m_wCodePage = wCodePage; + m_szUrl = szUrl; + return bRet; +} +FX_BOOL CFDE_CSSStyleSheet::LoadFromSyntax(IFDE_CSSSyntaxParser *pSyntax) +{ + Reset(); + m_pAllocator = FX_CreateAllocator(FX_ALLOCTYPE_Static, 1024, 0); + if (m_pAllocator == NULL) { + return FALSE; + } + FDE_CSSSYNTAXSTATUS eStatus; + do { + switch (eStatus = pSyntax->DoSyntaxParse()) { + case FDE_CSSSYNTAXSTATUS_StyleRule: + eStatus = LoadStyleRule(pSyntax, m_RuleArray); + break; + case FDE_CSSSYNTAXSTATUS_MediaRule: + eStatus = LoadMediaRule(pSyntax); + break; + case FDE_CSSSYNTAXSTATUS_FontFaceRule: + eStatus = LoadFontFaceRule(pSyntax, m_RuleArray); + break; + case FDE_CSSSYNTAXSTATUS_ImportRule: + eStatus = LoadImportRule(pSyntax); + break; + case FDE_CSSSYNTAXSTATUS_PageRule: + eStatus = LoadPageRule(pSyntax); + break; + default: + break; + } + } while (eStatus >= FDE_CSSSYNTAXSTATUS_None); + m_Selectors.RemoveAll(); + m_StringCache.RemoveAll(); + return eStatus != FDE_CSSSYNTAXSTATUS_Error; +} +FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadMediaRule(IFDE_CSSSyntaxParser *pSyntax) +{ + FX_DWORD dwMediaList = 0; + CFDE_CSSMediaRule *pMediaRule = NULL; + for (;;) { + switch (pSyntax->DoSyntaxParse()) { + case FDE_CSSSYNTAXSTATUS_MediaType: { + FX_INT32 iLen; + FX_LPCWSTR psz = pSyntax->GetCurrentString(iLen); + FDE_LPCCSSMEDIATYPETABLE pMediaType = FDE_GetCSSMediaTypeByName(psz, iLen); + if (pMediaType != NULL) { + dwMediaList |= pMediaType->wValue; + } + } + break; + case FDE_CSSSYNTAXSTATUS_StyleRule: + if (pMediaRule == NULL) { + SkipRuleSet(pSyntax); + } else { + FDE_CSSSYNTAXSTATUS eStatus = LoadStyleRule(pSyntax, pMediaRule->GetArray()); + if (eStatus < FDE_CSSSYNTAXSTATUS_None) { + return eStatus; + } + } + break; + case FDE_CSSSYNTAXSTATUS_DeclOpen: + if ((dwMediaList & m_dwMediaList) > 0 && pMediaRule == NULL) { + pMediaRule = FDE_NewWith(m_pAllocator) CFDE_CSSMediaRule(dwMediaList); + m_RuleArray.Add(pMediaRule); + } + break; + case FDE_CSSSYNTAXSTATUS_DeclClose: + return FDE_CSSSYNTAXSTATUS_None; + FDE_CSSSWITCHDEFAULTS(); + } + } +} +FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadStyleRule(IFDE_CSSSyntaxParser *pSyntax, CFDE_CSSRuleArray &ruleArray) +{ + m_Selectors.RemoveAt(0, m_Selectors.GetSize()); + CFDE_CSSStyleRule *pStyleRule = NULL; + FX_LPCWSTR pszValue = NULL; + FX_INT32 iValueLen = 0; + FDE_CSSPROPERTYARGS propertyArgs; + propertyArgs.pStaticStore = m_pAllocator; + propertyArgs.pStringCache = &m_StringCache; + propertyArgs.pProperty = NULL; + CFX_WideString wsName; + for (;;) { + switch (pSyntax->DoSyntaxParse()) { + case FDE_CSSSYNTAXSTATUS_Selector: { + pszValue = pSyntax->GetCurrentString(iValueLen); + IFDE_CSSSelector *pSelector = CFDE_CSSSelector::FromString(m_pAllocator, pszValue, iValueLen); + if (pSelector != NULL) { + m_Selectors.Add(pSelector); + } + } + break; + case FDE_CSSSYNTAXSTATUS_PropertyName: + pszValue = pSyntax->GetCurrentString(iValueLen); + propertyArgs.pProperty = FDE_GetCSSPropertyByName(pszValue, iValueLen); + if (propertyArgs.pProperty == NULL) { + wsName = CFX_WideStringC(pszValue, iValueLen); + } + break; + case FDE_CSSSYNTAXSTATUS_PropertyValue: + if (propertyArgs.pProperty != NULL) { + pszValue = pSyntax->GetCurrentString(iValueLen); + if (iValueLen > 0) { + pStyleRule->GetDeclImp().AddProperty(&propertyArgs, pszValue, iValueLen); + } + } else if (iValueLen > 0) { + pszValue = pSyntax->GetCurrentString(iValueLen); + if (iValueLen > 0) { + pStyleRule->GetDeclImp().AddProperty(&propertyArgs, wsName, wsName.GetLength(), pszValue, iValueLen); + } + } + break; + case FDE_CSSSYNTAXSTATUS_DeclOpen: + if (pStyleRule == NULL && m_Selectors.GetSize() > 0) { + pStyleRule = FDE_NewWith(m_pAllocator) CFDE_CSSStyleRule; + pStyleRule->SetSelector(m_pAllocator, m_Selectors); + ruleArray.Add(pStyleRule); + } else { + SkipRuleSet(pSyntax); + return FDE_CSSSYNTAXSTATUS_None; + } + break; + case FDE_CSSSYNTAXSTATUS_DeclClose: + if (pStyleRule != NULL && pStyleRule->GetDeclImp().GetStartPosition() == NULL) { + pStyleRule->~CFDE_CSSStyleRule(); + ruleArray.RemoveLast(1); + } + return FDE_CSSSYNTAXSTATUS_None; + FDE_CSSSWITCHDEFAULTS(); + } + } +} +FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadFontFaceRule(IFDE_CSSSyntaxParser *pSyntax, CFDE_CSSRuleArray &ruleArray) +{ + CFDE_CSSFontFaceRule *pFontFaceRule = NULL; + FX_LPCWSTR pszValue = NULL; + FX_INT32 iValueLen = 0; + FDE_CSSPROPERTYARGS propertyArgs; + propertyArgs.pStaticStore = m_pAllocator; + propertyArgs.pStringCache = &m_StringCache; + propertyArgs.pProperty = NULL; + for (;;) { + switch (pSyntax->DoSyntaxParse()) { + case FDE_CSSSYNTAXSTATUS_PropertyName: + pszValue = pSyntax->GetCurrentString(iValueLen); + propertyArgs.pProperty = FDE_GetCSSPropertyByName(pszValue, iValueLen); + break; + case FDE_CSSSYNTAXSTATUS_PropertyValue: + if (propertyArgs.pProperty != NULL) { + pszValue = pSyntax->GetCurrentString(iValueLen); + if (iValueLen > 0) { + pFontFaceRule->GetDeclImp().AddProperty(&propertyArgs, pszValue, iValueLen); + } + } + break; + case FDE_CSSSYNTAXSTATUS_DeclOpen: + if (pFontFaceRule == NULL) { + pFontFaceRule = FDE_NewWith(m_pAllocator) CFDE_CSSFontFaceRule; + ruleArray.Add(pFontFaceRule); + } + break; + case FDE_CSSSYNTAXSTATUS_DeclClose: + return FDE_CSSSYNTAXSTATUS_None; + FDE_CSSSWITCHDEFAULTS(); + } + } + return FDE_CSSSYNTAXSTATUS_None; +} +FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadImportRule(IFDE_CSSSyntaxParser *pSyntax) +{ + for (;;) { + switch (pSyntax->DoSyntaxParse()) { + case FDE_CSSSYNTAXSTATUS_ImportClose: + return FDE_CSSSYNTAXSTATUS_None; + case FDE_CSSSYNTAXSTATUS_URI: + break; + FDE_CSSSWITCHDEFAULTS(); + } + } +} +FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadPageRule(IFDE_CSSSyntaxParser *pSyntax) +{ + return SkipRuleSet(pSyntax); +} +FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::SkipRuleSet(IFDE_CSSSyntaxParser *pSyntax) +{ + for (;;) { + switch (pSyntax->DoSyntaxParse()) { + case FDE_CSSSYNTAXSTATUS_Selector: + case FDE_CSSSYNTAXSTATUS_DeclOpen: + case FDE_CSSSYNTAXSTATUS_PropertyName: + case FDE_CSSSYNTAXSTATUS_PropertyValue: + break; + case FDE_CSSSYNTAXSTATUS_DeclClose: + return FDE_CSSSYNTAXSTATUS_None; + FDE_CSSSWITCHDEFAULTS(); + } + } + return FDE_CSSSYNTAXSTATUS_None; +} +void CFDE_CSSStyleRule::SetSelector(IFX_MEMAllocator *pStaticStore, const CFDE_CSSSelectorArray &list) +{ + FXSYS_assert(m_ppSelector == NULL); + m_iSelectors = list.GetSize(); + m_ppSelector = (IFDE_CSSSelector**)pStaticStore->Alloc(m_iSelectors * sizeof(IFDE_CSSSelector*)); + for (FX_INT32 i = 0; i < m_iSelectors; ++i) { + m_ppSelector[i] = list.GetAt(i); + } +} +CFDE_CSSMediaRule::~CFDE_CSSMediaRule() +{ + for (FX_INT32 i = m_RuleArray.GetSize() - 1; i >= 0; --i) { + IFDE_CSSRule *pRule = m_RuleArray.GetAt(i); + switch (pRule->GetType()) { + case FDE_CSSRULETYPE_Style: + ((CFDE_CSSStyleRule*)pRule)->~CFDE_CSSStyleRule(); + break; + default: + FXSYS_assert(FALSE); + break; + } + } +} +inline FX_BOOL FDE_IsCSSChar(FX_WCHAR wch) +{ + return (wch >= 'a' && wch <= 'z') || (wch >= 'A' && wch <= 'Z'); +} +FX_INT32 FDE_GetCSSPersudoLen(FX_LPCWSTR psz, FX_LPCWSTR pEnd) +{ + FXSYS_assert(*psz == ':'); + FX_LPCWSTR pStart = psz; + while (psz < pEnd) { + FX_WCHAR wch = *psz; + if (FDE_IsCSSChar(wch) || wch == ':') { + ++psz; + } else { + break; + } + } + return psz - pStart; +} +FX_INT32 FDE_GetCSSNameLen(FX_LPCWSTR psz, FX_LPCWSTR pEnd) +{ + FX_LPCWSTR pStart = psz; + while (psz < pEnd) { + FX_WCHAR wch = *psz; + if (FDE_IsCSSChar(wch) + || (wch >= '0' && wch <= '9') + || wch == '_' || wch == '-') { + ++psz; + } else { + break; + } + } + return psz - pStart; +} +IFDE_CSSSelector* CFDE_CSSSelector::FromString(IFX_MEMAllocator *pStaticStore, FX_LPCWSTR psz, FX_INT32 iLen) +{ + FXSYS_assert(pStaticStore != NULL && psz != NULL && iLen > 0); + FX_LPCWSTR pStart = psz; + FX_LPCWSTR pEnd = psz + iLen; + for (; psz < pEnd; ++psz) { + switch (*psz) { + case '>': + case '[': + case '+': + return NULL; + } + } + CFDE_CSSSelector *pFirst = NULL, *pLast = NULL; + CFDE_CSSSelector *pPersudoFirst = NULL, *pPersudoLast = NULL; + for (psz = pStart ; psz < pEnd; ) { + FX_WCHAR wch = *psz; + if (wch == '.' || wch == '#') { + if (psz == pStart || psz[-1] == ' ') { + CFDE_CSSSelector *p = FDE_NewWith(pStaticStore) CFDE_CSSSelector(FDE_CSSSELECTORTYPE_Element, (FX_LPCWSTR)L"*", 1, TRUE); + if (p == NULL) { + return NULL; + } + if (pFirst != NULL) { + pFirst->SetType(FDE_CSSSELECTORTYPE_Descendant); + p->SetNext(pFirst); + } + pFirst = pLast = p; + } + FXSYS_assert(pLast != NULL); + FX_INT32 iNameLen = FDE_GetCSSNameLen(++psz, pEnd); + if (iNameLen == 0) { + return NULL; + } + FDE_CSSSELECTORTYPE eType = wch == '.' ? FDE_CSSSELECTORTYPE_Class : FDE_CSSSELECTORTYPE_ID; + CFDE_CSSSelector *p = FDE_NewWith(pStaticStore) CFDE_CSSSelector(eType, psz, iNameLen, FALSE); + if (p == NULL) { + return NULL; + } + p->SetNext(pLast->GetNextSelector()); + pLast->SetNext(p); + pLast = p; + psz += iNameLen; + } else if (FDE_IsCSSChar(wch) || wch == '*') { + FX_INT32 iNameLen = wch == '*' ? 1 : FDE_GetCSSNameLen(psz, pEnd); + if (iNameLen == 0) { + return NULL; + } + CFDE_CSSSelector *p = FDE_NewWith(pStaticStore) CFDE_CSSSelector(FDE_CSSSELECTORTYPE_Element, psz, iNameLen, TRUE); + if (p == NULL) { + return NULL; + } + if (pFirst == NULL) { + pFirst = pLast = p; + } else { + pFirst->SetType(FDE_CSSSELECTORTYPE_Descendant); + p->SetNext(pFirst); + pFirst = pLast = p; + } + psz += iNameLen; + } else if (wch == ':') { + FX_INT32 iNameLen = FDE_GetCSSPersudoLen(psz, pEnd); + if (iNameLen == 0) { + return NULL; + } + CFDE_CSSSelector *p = FDE_NewWith(pStaticStore) CFDE_CSSSelector(FDE_CSSSELECTORTYPE_Persudo, psz, iNameLen, TRUE); + if (p == NULL) { + return NULL; + } + if (pPersudoFirst == NULL) { + pPersudoFirst = pPersudoLast = p; + } else { + pPersudoLast->SetNext(p); + pPersudoLast = p; + } + psz += iNameLen; + } else if (wch == ' ') { + psz++; + } else { + return NULL; + } + } + if (pPersudoFirst == NULL) { + return pFirst; + } else { + pPersudoLast->SetNext(pFirst); + return pPersudoFirst; + } +} diff --git a/xfa/src/fdp/src/css/fde_cssstylesheet.h b/xfa/src/fdp/src/css/fde_cssstylesheet.h new file mode 100644 index 0000000000..04251a0c6b --- /dev/null +++ b/xfa/src/fdp/src/css/fde_cssstylesheet.h @@ -0,0 +1,163 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FDE_CSSSTYLESHEET +#define _FDE_CSSSTYLESHEET +#include "fde_cssdeclaration.h" +class CFDE_CSSSelector : public IFDE_CSSSelector, public CFX_Target +{ +public: + CFDE_CSSSelector(FDE_CSSSELECTORTYPE eType, FX_LPCWSTR psz, FX_INT32 iLen, FX_BOOL bIgnoreCase) + : m_eType(eType), m_dwHash(FX_HashCode_String_GetW(psz, iLen, bIgnoreCase)), m_pNext(NULL) + { + } + virtual FDE_CSSSELECTORTYPE GetType() const + { + return m_eType; + } + + virtual FX_DWORD GetNameHash() const + { + return m_dwHash; + } + + virtual IFDE_CSSSelector* GetNextSelector() const + { + return m_pNext; + } + static IFDE_CSSSelector* FromString(IFX_MEMAllocator *pStaticStore, FX_LPCWSTR psz, FX_INT32 iLen); + void SetNext(IFDE_CSSSelector *pNext) + { + m_pNext = pNext; + } +protected: + static CFDE_CSSSelector* ParseSelector(IFX_MEMAllocator *pStaticStore, FX_LPCWSTR psz, FX_INT32 &iOff, FX_INT32 iLen, FDE_CSSSELECTORTYPE eType); + void SetType(FDE_CSSSELECTORTYPE eType) + { + m_eType = eType; + } + FDE_CSSSELECTORTYPE m_eType; + FX_DWORD m_dwHash; + IFDE_CSSSelector *m_pNext; +}; +typedef CFX_ArrayTemplate CFDE_CSSSelectorArray; +class CFDE_CSSStyleRule : public IFDE_CSSStyleRule, public CFX_Target +{ +public: + CFDE_CSSStyleRule() : m_ppSelector(NULL), m_iSelectors(0) { } + virtual FX_INT32 CountSelectorLists() const + { + return m_iSelectors; + } + virtual IFDE_CSSSelector* GetSelectorList(FX_INT32 index) const + { + return m_ppSelector[index]; + } + + virtual IFDE_CSSDeclaration* GetDeclaration() const + { + return (IFDE_CSSDeclaration*)&m_Declaration; + } + CFDE_CSSDeclaration& GetDeclImp() + { + return m_Declaration; + } + void SetSelector(IFX_MEMAllocator *pStaticStore, const CFDE_CSSSelectorArray &list); +protected: + CFDE_CSSDeclaration m_Declaration; + IFDE_CSSSelector **m_ppSelector; + FX_INT32 m_iSelectors; +}; +class CFDE_CSSMediaRule : public IFDE_CSSMediaRule, public CFX_Target +{ +public: + CFDE_CSSMediaRule(FX_DWORD dwMediaList) : m_dwMediaList(dwMediaList) { } + ~CFDE_CSSMediaRule(); + + virtual FX_DWORD GetMediaList() const + { + return m_dwMediaList; + } + + virtual FX_INT32 CountRules() const + { + return m_RuleArray.GetSize(); + } + virtual IFDE_CSSRule* GetRule(FX_INT32 index) + { + return m_RuleArray.GetAt(index); + } + CFDE_CSSRuleArray& GetArray() + { + return m_RuleArray; + } +protected: + FX_DWORD m_dwMediaList; + CFDE_CSSRuleArray m_RuleArray; +}; +class CFDE_CSSFontFaceRule : public IFDE_CSSFontFaceRule, public CFX_Target +{ +public: + virtual IFDE_CSSDeclaration* GetDeclaration() const + { + return (IFDE_CSSDeclaration*)&m_Declaration; + } + CFDE_CSSDeclaration& GetDeclImp() + { + return m_Declaration; + } +protected: + CFDE_CSSDeclaration m_Declaration; +}; +#define FDE_CSSSWITCHDEFAULTS() case FDE_CSSSYNTAXSTATUS_EOS: \ + return FDE_CSSSYNTAXSTATUS_EOS; \ + case FDE_CSSSYNTAXSTATUS_Error: \ + default: \ + return FDE_CSSSYNTAXSTATUS_Error; +class CFDE_CSSStyleSheet : public IFDE_CSSStyleSheet, public CFX_Target +{ +public: + CFDE_CSSStyleSheet(FX_DWORD dwMediaList); + ~CFDE_CSSStyleSheet(); + virtual FX_DWORD AddRef(); + virtual FX_DWORD Release(); + + virtual FX_BOOL GetUrl(CFX_WideString &szUrl) + { + szUrl = m_szUrl; + return szUrl.GetLength() > 0; + } + virtual FX_DWORD GetMediaList() const + { + return m_dwMediaList; + } + virtual FX_WORD GetCodePage() const + { + return m_wCodePage; + } + virtual FX_INT32 CountRules() const; + virtual IFDE_CSSRule* GetRule(FX_INT32 index); + FX_BOOL LoadFromStream(const CFX_WideString &szUrl, IFX_Stream *pStream, FX_WORD wCodePage); + FX_BOOL LoadFromBuffer(const CFX_WideString &szUrl, FX_LPCWSTR pBuffer, FX_INT32 iBufSize, FX_WORD wCodePage); +protected: + void Reset(); + FX_BOOL LoadFromSyntax(IFDE_CSSSyntaxParser *pSyntax); + FDE_CSSSYNTAXSTATUS LoadStyleRule(IFDE_CSSSyntaxParser *pSyntax, CFDE_CSSRuleArray &ruleArray); + FDE_CSSSYNTAXSTATUS LoadImportRule(IFDE_CSSSyntaxParser *pSyntax); + FDE_CSSSYNTAXSTATUS LoadPageRule(IFDE_CSSSyntaxParser *pSyntax); + FDE_CSSSYNTAXSTATUS LoadMediaRule(IFDE_CSSSyntaxParser *pSyntax); + FDE_CSSSYNTAXSTATUS LoadFontFaceRule(IFDE_CSSSyntaxParser *pSyntax, CFDE_CSSRuleArray &ruleArray); + FDE_CSSSYNTAXSTATUS SkipRuleSet(IFDE_CSSSyntaxParser *pSyntax); + FX_WORD m_wCodePage; + FX_WORD m_wRefCount; + FX_DWORD m_dwMediaList; + IFX_MEMAllocator *m_pAllocator; + CFDE_CSSRuleArray m_RuleArray; + CFX_WideString m_szUrl; + CFDE_CSSSelectorArray m_Selectors; + CFX_MapPtrToPtr m_StringCache; +}; +#endif diff --git a/xfa/src/fdp/src/css/fde_csssyntax.cpp b/xfa/src/fdp/src/css/fde_csssyntax.cpp new file mode 100644 index 0000000000..b7e5da9d6c --- /dev/null +++ b/xfa/src/fdp/src/css/fde_csssyntax.cpp @@ -0,0 +1,495 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "fde_csssyntax.h" +#include "fde_cssdatatable.h" +#ifdef _cplusplus +extern "C" { +#endif + inline FX_BOOL FDE_IsSelectorStart(FX_WCHAR wch) + { + return wch == '.' || wch == '#' || wch == '*' + || (wch >= 'a' && wch <= 'z') + || (wch >= 'A' && wch <= 'Z'); + } +#ifdef _cplusplus +}; +#endif +IFDE_CSSSyntaxParser* IFDE_CSSSyntaxParser::Create() +{ + return FDE_New CFDE_CSSSyntaxParser; +} +CFDE_CSSSyntaxParser::CFDE_CSSSyntaxParser() + : m_pStream(NULL) + , m_iStreamPos(0) + , m_iPlaneSize(0) + , m_iTextDatLen(0) + , m_dwCheck((FX_DWORD) - 1) + , m_eMode(FDE_CSSSYNTAXMODE_RuleSet) + , m_eStatus(FDE_CSSSYNTAXSTATUS_None) +{ +} +CFDE_CSSSyntaxParser::~CFDE_CSSSyntaxParser() +{ + m_TextData.Reset(); + m_TextPlane.Reset(); +} +FX_BOOL CFDE_CSSSyntaxParser::Init(IFX_Stream *pStream, FX_INT32 iCSSPlaneSize, FX_INT32 iTextDataSize , FX_BOOL bOnlyDeclaration ) +{ + FXSYS_assert(pStream != NULL && iCSSPlaneSize > 0 && iTextDataSize > 0); + Reset(bOnlyDeclaration); + if (!m_TextData.EstimateSize(iTextDataSize)) { + return FALSE; + } + FX_BYTE bom[4]; + m_pStream = pStream; + m_iStreamPos = m_pStream->GetBOM(bom); + m_iPlaneSize = iCSSPlaneSize; + return TRUE; +} +FX_BOOL CFDE_CSSSyntaxParser::Init(FX_LPCWSTR pBuffer, FX_INT32 iBufferSize, FX_INT32 iTextDatSize , FX_BOOL bOnlyDeclaration ) +{ + FXSYS_assert(pBuffer != NULL && iBufferSize > 0 && iTextDatSize > 0); + Reset(bOnlyDeclaration); + if (!m_TextData.EstimateSize(iTextDatSize)) { + return FALSE; + } + return m_TextPlane.AttachBuffer(pBuffer, iBufferSize); +} +void CFDE_CSSSyntaxParser::Reset(FX_BOOL bOnlyDeclaration) +{ + m_TextPlane.Reset(); + m_TextData.Reset(); + m_pStream = NULL; + m_iStreamPos = 0; + m_iTextDatLen = 0; + m_dwCheck = (FX_DWORD) - 1; + m_eStatus = FDE_CSSSYNTAXSTATUS_None; + m_eMode = bOnlyDeclaration ? FDE_CSSSYNTAXMODE_PropertyName : FDE_CSSSYNTAXMODE_RuleSet; +} +FDE_CSSSYNTAXSTATUS CFDE_CSSSyntaxParser::DoSyntaxParse() +{ + while (m_eStatus >= FDE_CSSSYNTAXSTATUS_None) { + if (m_TextPlane.IsEOF()) { + if (m_pStream == NULL) { + if (m_eMode == FDE_CSSSYNTAXMODE_PropertyValue && m_TextData.GetLength() > 0) { + SaveTextData(); + return m_eStatus = FDE_CSSSYNTAXSTATUS_PropertyValue; + } + return m_eStatus = FDE_CSSSYNTAXSTATUS_EOS; + } + FX_BOOL bEOS; + FX_INT32 iLen = m_TextPlane.LoadFromStream(m_pStream, m_iStreamPos, m_iPlaneSize, bEOS); + m_iStreamPos = m_pStream->GetPosition(); + if (iLen < 1) { + if (m_eMode == FDE_CSSSYNTAXMODE_PropertyValue && m_TextData.GetLength() > 0) { + SaveTextData(); + return m_eStatus = FDE_CSSSYNTAXSTATUS_PropertyValue; + } + return m_eStatus = FDE_CSSSYNTAXSTATUS_EOS; + } + } + FX_WCHAR wch; + while (!m_TextPlane.IsEOF()) { + wch = m_TextPlane.GetChar(); + switch (m_eMode) { + case FDE_CSSSYNTAXMODE_RuleSet: + switch (wch) { + case '@': + m_TextPlane.MoveNext(); + SwitchMode(FDE_CSSSYNTAXMODE_AtRule); + break; + case '}': + m_TextPlane.MoveNext(); + if (RestoreMode()) { + return FDE_CSSSYNTAXSTATUS_DeclClose; + } else { + return m_eStatus = FDE_CSSSYNTAXSTATUS_Error; + } + break; + case '/': + if (m_TextPlane.GetNextChar() == '*') { + m_ModeStack.Push(m_eMode); + SwitchMode(FDE_CSSSYNTAXMODE_Comment); + break; + } + default: + if (wch <= ' ') { + m_TextPlane.MoveNext(); + } else if (FDE_IsSelectorStart(wch)) { + SwitchMode(FDE_CSSSYNTAXMODE_Selector); + return FDE_CSSSYNTAXSTATUS_StyleRule; + } else { + return m_eStatus = FDE_CSSSYNTAXSTATUS_Error; + } + break; + } + break; + case FDE_CSSSYNTAXMODE_Selector: + switch (wch) { + case ',': + m_TextPlane.MoveNext(); + SwitchMode(FDE_CSSSYNTAXMODE_Selector); + if (m_iTextDatLen > 0) { + return FDE_CSSSYNTAXSTATUS_Selector; + } + break; + case '{': + if (m_TextData.GetLength() > 0) { + SaveTextData(); + return FDE_CSSSYNTAXSTATUS_Selector; + } else { + m_TextPlane.MoveNext(); + m_ModeStack.Push(FDE_CSSSYNTAXMODE_RuleSet); + SwitchMode(FDE_CSSSYNTAXMODE_PropertyName); + return FDE_CSSSYNTAXSTATUS_DeclOpen; + } + break; + case '/': + if (m_TextPlane.GetNextChar() == '*') { + if (SwitchToComment() > 0) { + return FDE_CSSSYNTAXSTATUS_Selector; + } + break; + } + default: + AppendChar(wch); + break; + } + break; + case FDE_CSSSYNTAXMODE_PropertyName: + switch (wch) { + case ':': + m_TextPlane.MoveNext(); + SwitchMode(FDE_CSSSYNTAXMODE_PropertyValue); + return FDE_CSSSYNTAXSTATUS_PropertyName; + case '}': + m_TextPlane.MoveNext(); + if (RestoreMode()) { + return FDE_CSSSYNTAXSTATUS_DeclClose; + } else { + return m_eStatus = FDE_CSSSYNTAXSTATUS_Error; + } + break; + case '/': + if (m_TextPlane.GetNextChar() == '*') { + if (SwitchToComment() > 0) { + return FDE_CSSSYNTAXSTATUS_PropertyName; + } + break; + } + default: + AppendChar(wch); + break; + } + break; + case FDE_CSSSYNTAXMODE_PropertyValue: + switch (wch) { + case ';': + m_TextPlane.MoveNext(); + case '}': + SwitchMode(FDE_CSSSYNTAXMODE_PropertyName); + return FDE_CSSSYNTAXSTATUS_PropertyValue; + case '/': + if (m_TextPlane.GetNextChar() == '*') { + if (SwitchToComment() > 0) { + return FDE_CSSSYNTAXSTATUS_PropertyValue; + } + break; + } + default: + AppendChar(wch); + break; + } + break; + case FDE_CSSSYNTAXMODE_Comment: + if (wch == '/' && m_TextData.GetLength() > 0 + && m_TextData.GetAt(m_TextData.GetLength() - 1) == '*') { + RestoreMode(); + } else { + m_TextData.AppendChar(wch); + } + m_TextPlane.MoveNext(); + break; + case FDE_CSSSYNTAXMODE_MediaType: + switch (wch) { + case ',': + m_TextPlane.MoveNext(); + SwitchMode(FDE_CSSSYNTAXMODE_MediaType); + if (m_iTextDatLen > 0) { + return FDE_CSSSYNTAXSTATUS_MediaType; + } + break; + case '{': { + FDE_CSSSYNTAXMODE *pMode = m_ModeStack.GetTopElement(); + if (pMode == NULL || *pMode != FDE_CSSSYNTAXMODE_MediaRule) { + return m_eStatus = FDE_CSSSYNTAXSTATUS_Error; + } + if (m_TextData.GetLength() > 0) { + SaveTextData(); + return FDE_CSSSYNTAXSTATUS_MediaType; + } else { + m_TextPlane.MoveNext(); + *pMode = FDE_CSSSYNTAXMODE_RuleSet; + SwitchMode(FDE_CSSSYNTAXMODE_RuleSet); + return FDE_CSSSYNTAXSTATUS_DeclOpen; + } + } + break; + case ';': { + FDE_CSSSYNTAXMODE *pMode = m_ModeStack.GetTopElement(); + if (pMode == NULL || *pMode != FDE_CSSSYNTAXMODE_Import) { + return m_eStatus = FDE_CSSSYNTAXSTATUS_Error; + } + if (m_TextData.GetLength() > 0) { + SaveTextData(); + if (IsImportEnabled()) { + return FDE_CSSSYNTAXSTATUS_MediaType; + } + } else { + FX_BOOL bEnabled = IsImportEnabled(); + m_TextPlane.MoveNext(); + m_ModeStack.Pop(); + SwitchMode(FDE_CSSSYNTAXMODE_RuleSet); + if (bEnabled) { + DisableImport(); + return FDE_CSSSYNTAXSTATUS_ImportClose; + } + } + } + break; + case '/': + if (m_TextPlane.GetNextChar() == '*') { + if (SwitchToComment() > 0) { + return FDE_CSSSYNTAXSTATUS_MediaType; + } + break; + } + default: + AppendChar(wch); + break; + } + break; + case FDE_CSSSYNTAXMODE_URI: { + FDE_CSSSYNTAXMODE *pMode = m_ModeStack.GetTopElement(); + if (pMode == NULL || *pMode != FDE_CSSSYNTAXMODE_Import) { + return m_eStatus = FDE_CSSSYNTAXSTATUS_Error; + } + if (wch <= ' ' || wch == ';') { + FX_INT32 iURIStart, iURILength = m_TextData.GetLength(); + if (iURILength > 0 && FDE_ParseCSSURI(m_TextData.GetBuffer(), iURILength, iURIStart, iURILength)) { + m_TextData.Subtract(iURIStart, iURILength); + SwitchMode(FDE_CSSSYNTAXMODE_MediaType); + if (IsImportEnabled()) { + return FDE_CSSSYNTAXSTATUS_URI; + } else { + break; + } + } + } + AppendChar(wch); + } + break; + case FDE_CSSSYNTAXMODE_AtRule: + if (wch > ' ') { + AppendChar(wch); + } else { + FX_INT32 iLen = m_TextData.GetLength(); + FX_LPCWSTR psz = m_TextData.GetBuffer(); + if (FXSYS_wcsncmp(L"charset", psz, iLen) == 0) { + SwitchMode(FDE_CSSSYNTAXMODE_Charset); + } else if (FXSYS_wcsncmp(L"import", psz, iLen) == 0) { + m_ModeStack.Push(FDE_CSSSYNTAXMODE_Import); + SwitchMode(FDE_CSSSYNTAXMODE_URI); + if (IsImportEnabled()) { + return FDE_CSSSYNTAXSTATUS_ImportRule; + } else { + break; + } + } else if (FXSYS_wcsncmp(L"media", psz, iLen) == 0) { + m_ModeStack.Push(FDE_CSSSYNTAXMODE_MediaRule); + SwitchMode(FDE_CSSSYNTAXMODE_MediaType); + return FDE_CSSSYNTAXSTATUS_MediaRule; + } else if (FXSYS_wcsncmp(L"font-face", psz, iLen) == 0) { + SwitchMode(FDE_CSSSYNTAXMODE_Selector); + return FDE_CSSSYNTAXSTATUS_FontFaceRule; + } else if (FXSYS_wcsncmp(L"page", psz, iLen) == 0) { + SwitchMode(FDE_CSSSYNTAXMODE_Selector); + return FDE_CSSSYNTAXSTATUS_PageRule; + } else { + SwitchMode(FDE_CSSSYNTAXMODE_UnknownRule); + } + } + break; + case FDE_CSSSYNTAXMODE_Charset: + if (wch == ';') { + m_TextPlane.MoveNext(); + SwitchMode(FDE_CSSSYNTAXMODE_RuleSet); + if (IsCharsetEnabled()) { + DisableCharset(); + if (m_iTextDatLen > 0) { + if (m_pStream != NULL) { + FX_WORD wCodePage = FX_GetCodePageFormStringW(m_TextData.GetBuffer(), m_iTextDatLen); + if (wCodePage < 0xFFFF && m_pStream->GetCodePage() != wCodePage) { + m_pStream->SetCodePage(wCodePage); + } + } + return FDE_CSSSYNTAXSTATUS_Charset; + } + } + } else { + AppendChar(wch); + } + break; + case FDE_CSSSYNTAXMODE_UnknownRule: + if (wch == ';') { + SwitchMode(FDE_CSSSYNTAXMODE_RuleSet); + } + m_TextPlane.MoveNext(); + break; + default: + FXSYS_assert(FALSE); + break; + } + } + } + return m_eStatus; +} +FX_BOOL CFDE_CSSSyntaxParser::IsImportEnabled() const +{ + if ((m_dwCheck & FDE_CSSSYNTAXCHECK_AllowImport) == 0) { + return FALSE; + } + if (m_ModeStack.GetSize() > 1) { + return FALSE; + } + return TRUE; +} +inline FX_BOOL CFDE_CSSSyntaxParser::AppendChar(FX_WCHAR wch) +{ + m_TextPlane.MoveNext(); + if (m_TextData.GetLength() > 0 || wch > ' ') { + m_TextData.AppendChar(wch); + return TRUE; + } + return FALSE; +} +inline FX_INT32 CFDE_CSSSyntaxParser::SaveTextData() +{ + m_iTextDatLen = m_TextData.TrimEnd(); + m_TextData.Clear(); + return m_iTextDatLen; +} +inline void CFDE_CSSSyntaxParser::SwitchMode(FDE_CSSSYNTAXMODE eMode) +{ + m_eMode = eMode; + SaveTextData(); +} +inline FX_INT32 CFDE_CSSSyntaxParser::SwitchToComment() +{ + FX_INT32 iLength = m_TextData.GetLength(); + m_ModeStack.Push(m_eMode); + SwitchMode(FDE_CSSSYNTAXMODE_Comment); + return iLength; +} +inline FX_BOOL CFDE_CSSSyntaxParser::RestoreMode() +{ + FDE_CSSSYNTAXMODE *pMode = m_ModeStack.GetTopElement(); + if (pMode == NULL) { + return FALSE; + } + SwitchMode(*pMode); + m_ModeStack.Pop(); + return TRUE; +} +FX_LPCWSTR CFDE_CSSSyntaxParser::GetCurrentString(FX_INT32 &iLength) const +{ + iLength = m_iTextDatLen; + return m_TextData.GetBuffer(); +} +CFDE_CSSTextBuf::CFDE_CSSTextBuf() + : m_bExtBuf(FALSE) + , m_pBuffer(NULL) + , m_iBufLen(0) + , m_iDatLen(0) + , m_iDatPos(0) +{ +} +CFDE_CSSTextBuf::~CFDE_CSSTextBuf() +{ + Reset(); +} +void CFDE_CSSTextBuf::Reset() +{ + if (!m_bExtBuf && m_pBuffer != NULL) { + FDE_Free(m_pBuffer); + m_pBuffer = NULL; + } + m_iDatPos = m_iDatLen = m_iBufLen; +} +FX_BOOL CFDE_CSSTextBuf::AttachBuffer(FX_LPCWSTR pBuffer, FX_INT32 iBufLen) +{ + Reset(); + m_pBuffer = (FX_LPWSTR)pBuffer; + m_iDatLen = m_iBufLen = iBufLen; + return m_bExtBuf = TRUE; +} +FX_BOOL CFDE_CSSTextBuf::EstimateSize(FX_INT32 iAllocSize) +{ + FXSYS_assert(iAllocSize > 0); + Clear(); + m_bExtBuf = FALSE; + return ExpandBuf(iAllocSize); +} +FX_INT32 CFDE_CSSTextBuf::LoadFromStream(IFX_Stream *pTxtStream, FX_INT32 iStreamOffset, FX_INT32 iMaxChars, FX_BOOL &bEOS) +{ + FXSYS_assert(iStreamOffset >= 0 && iMaxChars > 0); + Clear(); + m_bExtBuf = FALSE; + if (!ExpandBuf(iMaxChars)) { + return 0; + } + pTxtStream->Lock(); + if (pTxtStream->GetPosition() != iStreamOffset) { + pTxtStream->Seek(FX_STREAMSEEK_Begin, iStreamOffset); + } + m_iDatLen = pTxtStream->ReadString(m_pBuffer, iMaxChars, bEOS); + pTxtStream->Unlock(); + return m_iDatLen; +} +FX_BOOL CFDE_CSSTextBuf::ExpandBuf(FX_INT32 iDesiredSize) +{ + if (m_bExtBuf) { + return FALSE; + } else if (m_pBuffer == NULL) { + m_pBuffer = (FX_LPWSTR)FDE_Alloc(iDesiredSize * sizeof(FX_WCHAR)); + } else if (m_iBufLen != iDesiredSize) { + m_pBuffer = (FX_LPWSTR)FDE_Realloc(m_pBuffer, iDesiredSize * sizeof(FX_WCHAR)); + } else { + return TRUE; + } + if (m_pBuffer == NULL) { + m_iBufLen = 0; + return FALSE; + } else { + m_iBufLen = iDesiredSize; + return TRUE; + } +} +void CFDE_CSSTextBuf::Subtract(FX_INT32 iStart, FX_INT32 iLength) +{ + FXSYS_assert(iStart >= 0 && iLength > 0); + if (iLength > m_iDatLen - iStart) { + iLength = m_iDatLen - iStart; + } + if (iLength < 0) { + iLength = 0; + } else { + FXSYS_memmove(m_pBuffer, m_pBuffer + iStart, iLength * sizeof(FX_WCHAR)); + } + m_iDatLen = iLength; +} diff --git a/xfa/src/fdp/src/css/fde_csssyntax.h b/xfa/src/fdp/src/css/fde_csssyntax.h new file mode 100644 index 0000000000..c18e0f9717 --- /dev/null +++ b/xfa/src/fdp/src/css/fde_csssyntax.h @@ -0,0 +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 _FDE_CSSSYNTAX +#define _FDE_CSSSYNTAX +class CFDE_CSSTextBuf : public CFX_Target +{ +public: + CFDE_CSSTextBuf(); + ~CFDE_CSSTextBuf(); + FX_BOOL AttachBuffer(FX_LPCWSTR pBuffer, FX_INT32 iBufLen); + FX_BOOL EstimateSize(FX_INT32 iAllocSize); + FX_INT32 LoadFromStream(IFX_Stream *pTxtStream, FX_INT32 iStreamOffset, FX_INT32 iMaxChars, FX_BOOL &bEOS); + FX_BOOL AppendChar(FX_WCHAR wch) + { + if (m_iDatLen >= m_iBufLen && !ExpandBuf(m_iBufLen * 2)) { + return FALSE; + } + return (m_pBuffer[m_iDatLen++] = wch), TRUE; + } + void Clear() + { + m_iDatPos = m_iDatLen = 0; + } + void Reset(); + FX_INT32 TrimEnd() + { + while (m_iDatLen > 0 && m_pBuffer[m_iDatLen - 1] <= ' ') { + --m_iDatLen; + } + AppendChar(0); + return --m_iDatLen; + } + void Subtract(FX_INT32 iStart, FX_INT32 iLength); + FX_BOOL IsEOF() const + { + return m_iDatPos >= m_iDatLen; + } + FX_WCHAR GetAt(FX_INT32 index) const + { + return m_pBuffer[index]; + } + FX_WCHAR GetChar() const + { + return m_pBuffer[m_iDatPos]; + } + FX_WCHAR GetNextChar() const + { + return (m_iDatPos + 1 >= m_iDatLen) ? 0 : m_pBuffer[m_iDatPos + 1]; + } + void MoveNext() + { + m_iDatPos++; + } + FX_INT32 GetLength() const + { + return m_iDatLen; + } + FX_LPCWSTR GetBuffer() const + { + return m_pBuffer; + } +protected: + FX_BOOL ExpandBuf(FX_INT32 iDesiredSize); + FX_BOOL m_bExtBuf; + FX_LPWSTR m_pBuffer; + FX_INT32 m_iBufLen; + FX_INT32 m_iDatLen; + FX_INT32 m_iDatPos; +}; +#define FDE_CSSSYNTAXCHECK_AllowCharset 1 +#define FDE_CSSSYNTAXCHECK_AllowImport 2 +enum FDE_CSSSYNTAXMODE { + FDE_CSSSYNTAXMODE_RuleSet, + FDE_CSSSYNTAXMODE_Comment, + FDE_CSSSYNTAXMODE_AtRule, + FDE_CSSSYNTAXMODE_UnknownRule, + FDE_CSSSYNTAXMODE_Charset, + FDE_CSSSYNTAXMODE_Import, + FDE_CSSSYNTAXMODE_MediaRule, + FDE_CSSSYNTAXMODE_URI, + FDE_CSSSYNTAXMODE_MediaType, + FDE_CSSSYNTAXMODE_Selector, + FDE_CSSSYNTAXMODE_PropertyName, + FDE_CSSSYNTAXMODE_PropertyValue, +}; +class CFDE_CSSSyntaxParser : public IFDE_CSSSyntaxParser, public CFX_Target +{ +public: + CFDE_CSSSyntaxParser(); + ~CFDE_CSSSyntaxParser(); + virtual void Release() + { + FDE_Delete this; + } + virtual FX_BOOL Init(IFX_Stream *pStream, FX_INT32 iCSSPlaneSize, FX_INT32 iTextDataSize = 32, FX_BOOL bOnlyDeclaration = FALSE); + virtual FX_BOOL Init(FX_LPCWSTR pBuffer, FX_INT32 iBufferSize, FX_INT32 iTextDatSize = 32, FX_BOOL bOnlyDeclaration = FALSE); + virtual FDE_CSSSYNTAXSTATUS DoSyntaxParse(); + virtual FX_LPCWSTR GetCurrentString(FX_INT32 &iLength) const; +protected: + void Reset(FX_BOOL bOnlyDeclaration); + void SwitchMode(FDE_CSSSYNTAXMODE eMode); + FX_INT32 SwitchToComment(); + + FX_BOOL RestoreMode(); + FX_BOOL AppendChar(FX_WCHAR wch); + FX_INT32 SaveTextData(); + FX_BOOL IsCharsetEnabled() const + { + return (m_dwCheck & FDE_CSSSYNTAXCHECK_AllowCharset) != 0; + } + void DisableCharset() + { + m_dwCheck = FDE_CSSSYNTAXCHECK_AllowImport; + } + FX_BOOL IsImportEnabled() const; + void DisableImport() + { + m_dwCheck = 0; + } + IFX_Stream *m_pStream; + FX_INT32 m_iStreamPos; + FX_INT32 m_iPlaneSize; + CFDE_CSSTextBuf m_TextData; + CFDE_CSSTextBuf m_TextPlane; + FX_INT32 m_iTextDatLen; + FX_DWORD m_dwCheck; + FDE_CSSSYNTAXMODE m_eMode; + FDE_CSSSYNTAXSTATUS m_eStatus; + CFX_StackTemplate m_ModeStack; +}; +#endif diff --git a/xfa/src/fdp/src/fde/fde_devbasic.cpp b/xfa/src/fdp/src/fde/fde_devbasic.cpp new file mode 100644 index 0000000000..780f1188c8 --- /dev/null +++ b/xfa/src/fdp/src/fde/fde_devbasic.cpp @@ -0,0 +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 + +#include "../../../foxitlib.h" +#include "fde_devbasic.h" +static const FDE_HATCHDATA gs_HatchBitmapData[FDE_HATCHSTYLE_Total] = { + {16, 16, {0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}}, + {16, 16, {0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,}}, + {16, 16, {0x80, 0x80, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,}}, + {16, 16, {0x01, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,}}, + {16, 16, {0xff, 0xff, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,}}, + {16, 16, {0x81, 0x81, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00,}}, + {16, 16, {0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}}, + {16, 16, {0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}}, + {16, 16, {0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}}, + {16, 16, {0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,}}, + {16, 16, {0xaa, 0xaa, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00,}}, + {16, 16, {0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x51, 0x51, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x15, 0x15, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x51, 0x51, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x15, 0x15, 0x00, 0x00,}}, + {16, 16, {0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,}}, + {16, 16, {0xee, 0xee, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xbb, 0xbb, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xee, 0xee, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xbb, 0xbb, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xee, 0xee, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xbb, 0xbb, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xee, 0xee, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xbb, 0xbb, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,}}, + {16, 16, {0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00,}}, + {16, 16, {0x77, 0x77, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,}}, + {16, 16, {0xef, 0xef, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xef, 0xef, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xef, 0xef, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xef, 0xef, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,}}, + {16, 16, {0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xf7, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xf7, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x00,}}, + {16, 16, {0x88, 0x88, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00,}}, + {16, 16, {0x11, 0x11, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,}}, + {16, 16, {0xcc, 0xcc, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00,}}, + {16, 16, {0x33, 0x33, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00,}}, + {16, 16, {0xc1, 0xc1, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x83, 0x83, 0x00, 0x00, 0xc1, 0xc1, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x83, 0x83, 0x00, 0x00,}}, + {16, 16, {0x83, 0x83, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, 0xc1, 0xc1, 0x00, 0x00, 0x83, 0x83, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, 0xc1, 0xc1, 0x00, 0x00,}}, + {16, 16, {0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,}}, + {16, 16, {0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}}, + {16, 16, {0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,}}, + {16, 16, {0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}}, + {16, 16, {0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,}}, + {16, 16, {0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}}, + {16, 16, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}}, + {16, 16, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}}, + {16, 16, {0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}}, + {16, 16, {0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,}}, + {16, 16, {0x80, 0x80, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00,}}, + {16, 16, {0xb1, 0xb1, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x1b, 0x1b, 0x00, 0x00, 0xd8, 0xd8, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x8d, 0x8d, 0x00, 0x00, 0xb1, 0xb1, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x1b, 0x1b, 0x00, 0x00, 0xd8, 0xd8, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x8d, 0x8d, 0x00, 0x00,}}, + {16, 16, {0x81, 0x81, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,}}, + {16, 16, {0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x25, 0x25, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x25, 0x25, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x25, 0x25, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x25, 0x25, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00,}}, + {16, 16, {0x01, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00,}}, + {16, 16, {0xff, 0xff, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,}}, + {16, 16, {0x88, 0x88, 0x00, 0x00, 0x54, 0x54, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x45, 0x45, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x14, 0x14, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x51, 0x51, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x54, 0x54, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x45, 0x45, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x14, 0x14, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x51, 0x51, 0x00, 0x00,}}, + {16, 16, {0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00,}}, + {16, 16, {0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,}}, + {16, 16, {0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}}, + {16, 16, {0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}}, + {16, 16, {0x03, 0x03, 0x00, 0x00, 0x84, 0x84, 0x00, 0x00, 0x48, 0x48, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x84, 0x84, 0x00, 0x00, 0x48, 0x48, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,}}, + {16, 16, {0xff, 0xff, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00,}}, + {16, 16, {0x77, 0x77, 0x00, 0x00, 0x89, 0x89, 0x00, 0x00, 0x8f, 0x8f, 0x00, 0x00, 0x8f, 0x8f, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0x98, 0x98, 0x00, 0x00, 0xf8, 0xf8, 0x00, 0x00, 0xf8, 0xf8, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0x89, 0x89, 0x00, 0x00, 0x8f, 0x8f, 0x00, 0x00, 0x8f, 0x8f, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0x98, 0x98, 0x00, 0x00, 0xf8, 0xf8, 0x00, 0x00, 0xf8, 0xf8, 0x00, 0x00,}}, + {16, 16, {0xff, 0xff, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,}}, + {16, 16, {0x99, 0x99, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00,}}, + {16, 16, {0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00,}}, + {16, 16, {0x82, 0x82, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x28, 0x28, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x28, 0x28, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x82, 0x82, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x82, 0x82, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x28, 0x28, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x28, 0x28, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x82, 0x82, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,}}, + {16, 16, {0x10, 0x10, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x7c, 0x7c, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0x7c, 0x7c, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x7c, 0x7c, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0x7c, 0x7c, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}}, +}; +FDE_LPCHATCHDATA FDE_DEVGetHatchData(FX_INT32 iHatchStyle) +{ + if (iHatchStyle < FDE_HATCHSTYLE_Min || iHatchStyle > FDE_HATCHSTYLE_Max) { + return NULL; + } + return &gs_HatchBitmapData[iHatchStyle]; +} diff --git a/xfa/src/fdp/src/fde/fde_devbasic.h b/xfa/src/fdp/src/fde/fde_devbasic.h new file mode 100644 index 0000000000..36d2471b2c --- /dev/null +++ b/xfa/src/fdp/src/fde/fde_devbasic.h @@ -0,0 +1,16 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FDE_DEVICE_BASIC_IMP +#define _FDE_DEVICE_BASIC_IMP +struct FDE_HATCHDATA { + FX_INT32 iWidth; + FX_INT32 iHeight; + FX_BYTE MaskBits[64]; +}; +typedef FDE_HATCHDATA const * FDE_LPCHATCHDATA; +FDE_LPCHATCHDATA FDE_DEVGetHatchData(FX_INT32 iHatchStyle); +#endif diff --git a/xfa/src/fdp/src/fde/fde_gdidevice.cpp b/xfa/src/fdp/src/fde/fde_gdidevice.cpp new file mode 100644 index 0000000000..ad7f6cc9e5 --- /dev/null +++ b/xfa/src/fdp/src/fde/fde_gdidevice.cpp @@ -0,0 +1,555 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "stdafx.h" +#include "fde_gdidevice.h" +#include "fde_gdiobject.h" +#ifdef _FDEPLUS +#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || _FX_OS_ == _FX_WIN64_ +IFDE_RenderDevice* IFDE_RenderDevice::Create(CFX_DIBitmap *pBitmap, FX_BOOL bRgbByteOrder ) +{ + return FDE_New CFDE_GdiDevice(pBitmap); +} +IFDE_RenderDevice* IFDE_RenderDevice::Create(CFX_RenderDevice *pDevice) +{ + return NULL; +} +CFDE_GdiDevice::CFDE_GdiDevice(CFX_DIBitmap *pBitmap) + : m_dwGlyphLen(0) + , m_pGlyphBuf(NULL) + , m_pGraphics(NULL) + , m_pBitmap(NULL) + , m_pClipPath(NULL) +{ + FXSYS_assert(pBitmap != NULL); + BITMAPINFO bmi; + FXSYS_memset(&bmi, 0, sizeof(BITMAPINFOHEADER)); + bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bmi.bmiHeader.biWidth = pBitmap->GetWidth(); + bmi.bmiHeader.biHeight = -pBitmap->GetHeight(); + bmi.bmiHeader.biPlanes = 1; + bmi.bmiHeader.biBitCount = pBitmap->GetBPP(); + m_pBitmap = Gdiplus::Bitmap::FromBITMAPINFO(&bmi, pBitmap->GetBuffer()); + FXSYS_assert(m_pBitmap != NULL); + m_pGraphics = Gdiplus::Graphics::FromImage(m_pBitmap); + FXSYS_assert(m_pGraphics != NULL); + m_rtClipRect.Set(0, 0, (FX_FLOAT)pBitmap->GetWidth(), (FX_FLOAT)pBitmap->GetHeight()); + m_pGraphics->SetClip((const Gdiplus::RectF&)m_rtClipRect); +} +CFDE_GdiDevice::~CFDE_GdiDevice() +{ + delete m_pGraphics; + delete m_pBitmap; + if (m_pGlyphBuf) { + FDE_Free(m_pGlyphBuf); + } +} +FX_INT32 CFDE_GdiDevice::GetWidth() const +{ + return m_pBitmap->GetWidth(); +} +FX_INT32 CFDE_GdiDevice::GetHeight() const +{ + return m_pBitmap->GetHeight(); +} +FDE_HDEVICESTATE CFDE_GdiDevice::SaveState() +{ + return (FDE_HDEVICESTATE)m_pGraphics->Save(); +} +void CFDE_GdiDevice::RestoreState(FDE_HDEVICESTATE hState) +{ + Gdiplus::Status eRet = m_pGraphics->Restore((Gdiplus::GraphicsState)hState); + if (eRet == Gdiplus::Ok) { + Gdiplus::Rect rt; + eRet = m_pGraphics->GetClipBounds(&rt); + if (eRet == Gdiplus::Ok) { + m_rtClipRect.Set((FX_FLOAT)rt.X, (FX_FLOAT)rt.Y, (FX_FLOAT)rt.Width, (FX_FLOAT)rt.Height); + } + } +} +FX_BOOL CFDE_GdiDevice::SetClipRect(const CFX_RectF &rtClip) +{ + m_rtClipRect = rtClip; + return m_pGraphics->SetClip((const Gdiplus::RectF&)rtClip) == Gdiplus::Ok; +} +const CFX_RectF& CFDE_GdiDevice::GetClipRect() +{ + return m_rtClipRect; +} +FX_BOOL CFDE_GdiDevice::SetClipPath(const IFDE_Path *pClip) +{ + m_pClipPath = (CFDE_GdiPath*)pClip; + Gdiplus::GraphicsPath *pPath = m_pClipPath ? &m_pClipPath->m_Path : NULL; + return m_pGraphics->SetClip(pPath) == Gdiplus::Ok; +} +IFDE_Path* CFDE_GdiDevice::GetClipPath() const +{ + return m_pClipPath; +} +FX_FLOAT CFDE_GdiDevice::GetDpiX() const +{ + return m_pGraphics->GetDpiX(); +} +FX_FLOAT CFDE_GdiDevice::GetDpiY() const +{ + return m_pGraphics->GetDpiY(); +} +FX_BOOL CFDE_GdiDevice::DrawImage(IFDE_Image *pImg, const CFX_RectF *pSrcRect, const CFX_RectF &dstRect, const CFX_Matrix *pImgMatrix, const CFX_Matrix *pDevMatrix) +{ + CFDE_GdiImage *pGdiImg = (CFDE_GdiImage*)pImg; + FXSYS_assert(pGdiImg != NULL && pGdiImg->m_pImage != NULL); + CFX_RectF srcRect; + if (pSrcRect) { + srcRect = *pSrcRect; + } else { + srcRect.left = srcRect.top = 0; + srcRect.width = (FX_FLOAT)pImg->GetImageWidth(); + srcRect.height = (FX_FLOAT)pImg->GetImageHeight(); + } + CFX_Matrix matrix; + if (pImgMatrix) { + matrix = *pImgMatrix; + } else { + matrix.Reset(); + } + matrix.Translate(dstRect.left, dstRect.top); + matrix.Scale((dstRect.width / srcRect.width), (dstRect.height / srcRect.height), TRUE); + if (pDevMatrix) { + matrix.Concat(*pDevMatrix); + } + CFX_PointF dstPoints[3]; + dstPoints[0].Set(0, 0); + dstPoints[1].Set(srcRect.width, 0); + dstPoints[2].Set(0, srcRect.height); + matrix.TransformPoints(dstPoints, 3); + m_pGraphics->DrawImage(pGdiImg->m_pImage, (Gdiplus::PointF*)dstPoints, 3, + srcRect.left, srcRect.top, srcRect.width, srcRect.height, + Gdiplus::UnitPixel, NULL, NULL, NULL); + return TRUE; +} +FX_BOOL CFDE_GdiDevice::DrawImage(CFX_DIBSource *pDib, const CFX_RectF *pSrcRect, const CFX_RectF &dstRect, const CFX_Matrix *pImgMatrix, const CFX_Matrix *pDevMatrix) +{ + FXSYS_assert(pDib != NULL); + BITMAPINFO bmi; + FXSYS_memset(&bmi, 0, sizeof(BITMAPINFOHEADER)); + bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bmi.bmiHeader.biWidth = pDib->GetWidth(); + bmi.bmiHeader.biHeight = pDib->GetHeight(); + bmi.bmiHeader.biPlanes = 1; + bmi.bmiHeader.biBitCount = pDib->GetBPP(); + Gdiplus::Bitmap bmp(&bmi, pDib->GetBuffer()); + CFDE_GdiImage img(&bmp); + return DrawImage(&img, pSrcRect, dstRect, pImgMatrix, pDevMatrix); +} +FX_BOOL CFDE_GdiDevice::DrawString(IFDE_Brush *pBrush, IFX_Font *pFont, const FXTEXT_CHARPOS *pCharPos, FX_INT32 iCount, FX_FLOAT fFontSize, const CFX_Matrix *pMatrix) +{ + FXSYS_assert(pBrush != NULL && pFont != NULL && pCharPos != NULL); + FX_ARGB argb = 0xFF000000; + if (pBrush->GetType() == FDE_BRUSHTYPE_Solid) { + argb = ((IFDE_SolidBrush*)pBrush)->GetColor(); + } + CFDE_GdiFont *pGdiFont = (CFDE_GdiFont*)pFont; + GLYPHMETRICS gm; + MAT2 mat2; + FX_FLOAT fScale = fFontSize / 1000.0f; + FX_FLOAT ma, mb, mc, md; + FX_FLOAT fx, fy; + while (--iCount >= 0) { + mb = mc = 0; + ma = md = fScale; + if (pCharPos->m_bGlyphAdjust) { + FX_FLOAT aa = ma * -pCharPos->m_AdjustMatrix[0] + mb * pCharPos->m_AdjustMatrix[2]; + FX_FLOAT bb = -ma * pCharPos->m_AdjustMatrix[1] + mb * pCharPos->m_AdjustMatrix[3]; + FX_FLOAT cc = mc * -pCharPos->m_AdjustMatrix[0] + md * pCharPos->m_AdjustMatrix[2]; + FX_FLOAT dd = -mc * pCharPos->m_AdjustMatrix[1] + md * pCharPos->m_AdjustMatrix[3]; + ma = aa; + mb = bb; + mc = cc; + md = dd; + } + if (pMatrix) { + FX_FLOAT aa = ma * pMatrix->a + mb * pMatrix->c; + FX_FLOAT bb = ma * pMatrix->b + mb * pMatrix->d; + FX_FLOAT cc = mc * pMatrix->a + md * pMatrix->c; + FX_FLOAT dd = mc * pMatrix->b + md * pMatrix->d; + ma = aa; + mb = bb; + mc = cc; + md = dd; + } + *(long*)(&mat2.eM11) = (long)(ma * 65536); + *(long*)(&mat2.eM21) = (long)(mb * 65536); + *(long*)(&mat2.eM12) = (long)(mc * 65536); + *(long*)(&mat2.eM22) = (long)(md * 65536); + FX_DWORD dwSize = pGdiFont->GetGlyphDIBits(pCharPos->m_GlyphIndex, argb, &mat2, gm, NULL, 0); + if (dwSize > 0) { + if (m_pGlyphBuf == NULL) { + m_pGlyphBuf = FDE_Alloc(dwSize); + m_dwGlyphLen = dwSize; + } else if (m_dwGlyphLen < dwSize) { + m_pGlyphBuf = FDE_Realloc(m_pGlyphBuf, dwSize); + m_dwGlyphLen = dwSize; + } + pGdiFont->GetGlyphDIBits(pCharPos->m_GlyphIndex, argb, &mat2, gm, m_pGlyphBuf, m_dwGlyphLen); + Gdiplus::Bitmap bmp(gm.gmBlackBoxX, gm.gmBlackBoxY, gm.gmBlackBoxX * 4, PixelFormat32bppARGB, m_pGlyphBuf); + if (pMatrix) { + fx = pMatrix->a * pCharPos->m_OriginX + pMatrix->c * pCharPos->m_OriginY + pMatrix->e; + fy = pMatrix->b * pCharPos->m_OriginX + pMatrix->d * pCharPos->m_OriginY + pMatrix->f; + } else { + fx = pCharPos->m_OriginX; + fy = pCharPos->m_OriginY; + } + m_pGraphics->DrawImage(&bmp, (FXSYS_round(fx) + gm.gmptGlyphOrigin.x), (FXSYS_round(fy) - gm.gmptGlyphOrigin.y)); + } + pCharPos++; + } + return TRUE; +} +FX_BOOL CFDE_GdiDevice::DrawArc(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_RectF &rect, FX_FLOAT startAngle, FX_FLOAT sweepAngle, const CFX_Matrix *pMatrix ) +{ + startAngle = FX_RAD2DEG(startAngle); + sweepAngle = FX_RAD2DEG(sweepAngle); + Gdiplus::Pen *pGdiPen = CreateGdiPen(pPen, fPenWidth); + if (pGdiPen == NULL) { + return FALSE; + } + ApplyMatrix(pMatrix); + Gdiplus::Status ret = m_pGraphics->DrawArc(pGdiPen, rect.left, rect.top, rect.width, rect.height, startAngle, sweepAngle); + RestoreMatrix(pMatrix); + ReleaseGdiPen(pGdiPen); + return ret == Gdiplus::Ok; +} +FX_BOOL CFDE_GdiDevice::DrawBezier(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_PointF &pt1, const CFX_PointF &pt2, const CFX_PointF &pt3, const CFX_PointF &pt4, const CFX_Matrix *pMatrix ) +{ + Gdiplus::Pen *pGdiPen = CreateGdiPen(pPen, fPenWidth); + if (pGdiPen == NULL) { + return FALSE; + } + ApplyMatrix(pMatrix); + Gdiplus::Status ret = m_pGraphics->DrawBezier(pGdiPen, pt1.x, pt1.y, pt2.x, pt2.y, pt3.x, pt3.y, pt4.x, pt4.y); + RestoreMatrix(pMatrix); + ReleaseGdiPen(pGdiPen); + return ret == Gdiplus::Ok; +} +FX_BOOL CFDE_GdiDevice::DrawCurve(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_PointsF &points, FX_BOOL bClosed, FX_FLOAT fTension , const CFX_Matrix *pMatrix ) +{ + Gdiplus::Pen *pGdiPen = CreateGdiPen(pPen, fPenWidth); + if (pGdiPen == NULL) { + return FALSE; + } + ApplyMatrix(pMatrix); + Gdiplus::Status ret = bClosed + ? m_pGraphics->DrawClosedCurve(pGdiPen, (const Gdiplus::PointF*)points.GetData(), points.GetSize(), fTension) + : m_pGraphics->DrawCurve(pGdiPen, (const Gdiplus::PointF*)points.GetData(), points.GetSize(), fTension); + RestoreMatrix(pMatrix); + ReleaseGdiPen(pGdiPen); + return ret == Gdiplus::Ok; +} +FX_BOOL CFDE_GdiDevice::DrawEllipse(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_RectF &rect, const CFX_Matrix *pMatrix ) +{ + Gdiplus::Pen *pGdiPen = CreateGdiPen(pPen, fPenWidth); + if (pGdiPen == NULL) { + return FALSE; + } + ApplyMatrix(pMatrix); + Gdiplus::Status ret = m_pGraphics->DrawEllipse(pGdiPen, rect.left, rect.top, rect.width, rect.height); + RestoreMatrix(pMatrix); + ReleaseGdiPen(pGdiPen); + return ret == Gdiplus::Ok; +} +FX_BOOL CFDE_GdiDevice::DrawLines(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_PointsF &points, const CFX_Matrix *pMatrix ) +{ + Gdiplus::Pen *pGdiPen = CreateGdiPen(pPen, fPenWidth); + if (pGdiPen == NULL) { + return FALSE; + } + ApplyMatrix(pMatrix); + Gdiplus::Status ret = m_pGraphics->DrawLines(pGdiPen, (const Gdiplus::PointF*)points.GetData(), points.GetSize()); + ApplyMatrix(pMatrix); + ReleaseGdiPen(pGdiPen); + return ret == Gdiplus::Ok; +} +FX_BOOL CFDE_GdiDevice::DrawLine(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_PointF &pt1, const CFX_PointF &pt2, const CFX_Matrix *pMatrix ) +{ + Gdiplus::Pen *pGdiPen = CreateGdiPen(pPen, fPenWidth); + if (pGdiPen == NULL) { + return FALSE; + } + ApplyMatrix(pMatrix); + Gdiplus::Status ret = m_pGraphics->DrawLine(pGdiPen, pt1.x, pt1.y, pt2.x, pt2.y); + RestoreMatrix(pMatrix); + ReleaseGdiPen(pGdiPen); + return ret == Gdiplus::Ok; +} +FX_BOOL CFDE_GdiDevice::DrawPath(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const IFDE_Path *pPath, const CFX_Matrix *pMatrix ) +{ + CFDE_GdiPath *pGdiPath = (CFDE_GdiPath*)pPath; + if (pGdiPath == NULL) { + return FALSE; + } + Gdiplus::Pen *pGdiPen = CreateGdiPen(pPen, fPenWidth); + if (pGdiPen == NULL) { + return FALSE; + } + ApplyMatrix(pMatrix); + Gdiplus::Status ret = m_pGraphics->DrawPath(pGdiPen, &pGdiPath->m_Path); + RestoreMatrix(pMatrix); + ReleaseGdiPen(pGdiPen); + return ret == Gdiplus::Ok; +} +FX_BOOL CFDE_GdiDevice::DrawPie(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_RectF &rect, FX_FLOAT startAngle, FX_FLOAT sweepAngle, const CFX_Matrix *pMatrix ) +{ + startAngle = FX_RAD2DEG(startAngle); + sweepAngle = FX_RAD2DEG(sweepAngle); + Gdiplus::Pen *pGdiPen = CreateGdiPen(pPen, fPenWidth); + if (pGdiPen == NULL) { + return FALSE; + } + ApplyMatrix(pMatrix); + Gdiplus::Status ret = m_pGraphics->DrawPie(pGdiPen, rect.left, rect.top, rect.width, rect.height, startAngle, sweepAngle); + RestoreMatrix(pMatrix); + ReleaseGdiPen(pGdiPen); + return ret == Gdiplus::Ok; +} +FX_BOOL CFDE_GdiDevice::DrawChord(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_RectF &rect, FX_FLOAT startAngle, FX_FLOAT sweepAngle, const CFX_Matrix *pMatrix ) +{ + CFX_ArcF chord; + chord.Set(rect, startAngle, sweepAngle); + CFDE_GdiPath path; + path.AddChord(chord); + return DrawPath(pPen, fPenWidth, &path, pMatrix); +} +FX_BOOL CFDE_GdiDevice::DrawPolygon(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_PointsF &points, const CFX_Matrix *pMatrix ) +{ + Gdiplus::Pen *pGdiPen = CreateGdiPen(pPen, fPenWidth); + if (pGdiPen == NULL) { + return FALSE; + } + ApplyMatrix(pMatrix); + Gdiplus::Status ret = m_pGraphics->DrawPolygon(pGdiPen, (const Gdiplus::PointF*)points.GetData(), points.GetSize()); + RestoreMatrix(pMatrix); + ReleaseGdiPen(pGdiPen); + return ret == Gdiplus::Ok; +} +FX_BOOL CFDE_GdiDevice::DrawRectangle(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_RectF &rect, const CFX_Matrix *pMatrix ) +{ + Gdiplus::Pen *pGdiPen = CreateGdiPen(pPen, fPenWidth); + if (pGdiPen == NULL) { + return FALSE; + } + ApplyMatrix(pMatrix); + Gdiplus::Status ret = m_pGraphics->DrawRectangle(pGdiPen, rect.left, rect.top, rect.width, rect.height); + RestoreMatrix(pMatrix); + ReleaseGdiPen(pGdiPen); + return ret == Gdiplus::Ok; +} +FX_BOOL CFDE_GdiDevice::DrawRoundRectangle(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_RectF &rect, const CFX_SizeF &round, const CFX_Matrix *pMatrix ) +{ + CFDE_GdiPath path; + path.AddRoundRectangle(rect, round); + return DrawPath(pPen, fPenWidth, &path, pMatrix); +} +FX_BOOL CFDE_GdiDevice::FillClosedCurve(IFDE_Brush *pBrush, const CFX_PointsF &points, FX_FLOAT fTension , const CFX_Matrix *pMatrix ) +{ + Gdiplus::Brush *pGdiBrush = CreateGdiBrush(pBrush); + if (pGdiBrush == NULL) { + return FALSE; + } + ApplyMatrix(pMatrix); + Gdiplus::Status ret = m_pGraphics->FillClosedCurve(pGdiBrush, (const Gdiplus::PointF*)points.GetData(), points.GetSize(), Gdiplus::FillModeAlternate, fTension); + RestoreMatrix(pMatrix); + ReleaseGdiBrush(pGdiBrush); + return ret == Gdiplus::Ok; +} +FX_BOOL CFDE_GdiDevice::FillEllipse(IFDE_Brush* pBrush, const CFX_RectF& rect, const CFX_Matrix *pMatrix ) +{ + Gdiplus::Brush *pGdiBrush = CreateGdiBrush(pBrush); + if (pGdiBrush == NULL) { + return FALSE; + } + ApplyMatrix(pMatrix); + Gdiplus::Status ret = m_pGraphics->FillEllipse(pGdiBrush, rect.left, rect.top, rect.width, rect.height); + RestoreMatrix(pMatrix); + ReleaseGdiBrush(pGdiBrush); + return ret == Gdiplus::Ok; +} +FX_BOOL CFDE_GdiDevice::FillPath(IFDE_Brush *pBrush, const IFDE_Path *pPath, const CFX_Matrix *pMatrix ) +{ + CFDE_GdiPath *pGdiPath = (CFDE_GdiPath*)pPath; + if (pGdiPath == NULL) { + return FALSE; + } + Gdiplus::Brush *pGdiBrush = CreateGdiBrush(pBrush); + if (pGdiBrush == NULL) { + return FALSE; + } + ApplyMatrix(pMatrix); + Gdiplus::Status ret = m_pGraphics->FillPath(pGdiBrush, &pGdiPath->m_Path); + RestoreMatrix(pMatrix); + ReleaseGdiBrush(pGdiBrush); + return ret == Gdiplus::Ok; +} +FX_BOOL CFDE_GdiDevice::FillPie(IFDE_Brush *pBrush, const CFX_RectF &rect, FX_FLOAT startAngle, FX_FLOAT sweepAngle, const CFX_Matrix *pMatrix ) +{ + startAngle = FX_RAD2DEG(startAngle); + sweepAngle = FX_RAD2DEG(sweepAngle); + Gdiplus::Brush *pGdiBrush = CreateGdiBrush(pBrush); + if (pGdiBrush == NULL) { + return FALSE; + } + ApplyMatrix(pMatrix); + Gdiplus::Status ret = m_pGraphics->FillPie(pGdiBrush, rect.left, rect.top, rect.width, rect.height, startAngle, sweepAngle); + RestoreMatrix(pMatrix); + ReleaseGdiBrush(pGdiBrush); + return ret == Gdiplus::Ok; +} +FX_BOOL CFDE_GdiDevice::FillChord(IFDE_Brush *pBrush, const CFX_RectF &rect, FX_FLOAT startAngle, FX_FLOAT sweepAngle, const CFX_Matrix *pMatrix ) +{ + CFX_ArcF chord; + chord.Set(rect, startAngle, sweepAngle); + CFDE_GdiPath path; + path.AddChord(chord); + return FillPath(pBrush, &path, pMatrix); +} +FX_BOOL CFDE_GdiDevice::FillPolygon(IFDE_Brush *pBrush, const CFX_PointsF &points, const CFX_Matrix *pMatrix ) +{ + Gdiplus::Brush *pGdiBrush = CreateGdiBrush(pBrush); + if (pGdiBrush == NULL) { + return FALSE; + } + ApplyMatrix(pMatrix); + Gdiplus::Status ret = m_pGraphics->FillPolygon(pGdiBrush, (const Gdiplus::PointF*)points.GetData(), points.GetSize()); + RestoreMatrix(pMatrix); + ReleaseGdiBrush(pGdiBrush); + return ret == Gdiplus::Ok; +} +FX_BOOL CFDE_GdiDevice::FillRectangle(IFDE_Brush *pBrush, const CFX_RectF &rect, const CFX_Matrix *pMatrix ) +{ + Gdiplus::Brush *pGdiBrush = CreateGdiBrush(pBrush); + if (pGdiBrush == NULL) { + return FALSE; + } + ApplyMatrix(pMatrix); + Gdiplus::Status ret = m_pGraphics->FillRectangle(pGdiBrush, rect.left, rect.top, rect.width, rect.height); + RestoreMatrix(pMatrix); + ReleaseGdiBrush(pGdiBrush); + return ret == Gdiplus::Ok; +} +FX_BOOL CFDE_GdiDevice::FillRoundRectangle(IFDE_Brush *pBrush, const CFX_RectF &rect, const CFX_SizeF &round, const CFX_Matrix *pMatrix ) +{ + CFDE_GdiPath path; + path.AddRoundRectangle(rect, round); + return FillPath(pBrush, &path, pMatrix); +} +Gdiplus::Pen* CFDE_GdiDevice::CreateGdiPen(IFDE_Pen *pPen, FX_FLOAT fPenWidth) +{ + if (pPen == NULL || fPenWidth < 0.01f) { + return NULL; + } + Gdiplus::Pen *pGdiPen = NULL; + switch (pPen->GetType()) { + case FDE_PENTYPE_SolidColor: { + Gdiplus::Color gdiColor((Gdiplus::ARGB)pPen->GetColor()); + pGdiPen = new Gdiplus::Pen(gdiColor, fPenWidth); + } + break; + case FDE_PENTYPE_HatchBrush: + case FDE_PENTYPE_TextureBrush: + case FDE_PENTYPE_LinearGradient: { + Gdiplus::Brush *pGdiBrush = CreateGdiBrush(pPen->GetBrush()); + if (pGdiBrush) { + pGdiPen = new Gdiplus::Pen(pGdiBrush, fPenWidth); + } + } + break; + } + if (pGdiPen) { + CFX_FloatArray dashArray; + pPen->GetDashArray(dashArray); + pGdiPen->SetDashPattern(dashArray.GetData(), dashArray.GetSize()); + pGdiPen->SetDashOffset(pPen->GetDashPhase()); + pGdiPen->SetDashStyle((Gdiplus::DashStyle)pPen->GetDashStyle()); + pGdiPen->SetStartCap((Gdiplus::LineCap)pPen->GetLineCap()); + pGdiPen->SetEndCap((Gdiplus::LineCap)pPen->GetLineCap()); + pGdiPen->SetLineJoin((Gdiplus::LineJoin)pPen->GetLineJoin()); + pGdiPen->SetMiterLimit(pPen->GetMiterLimit()); + } + return pGdiPen; +} +void CFDE_GdiDevice::ReleaseGdiPen(Gdiplus::Pen *pGdiPen) +{ + if (pGdiPen) { + ReleaseGdiBrush(pGdiPen->GetBrush()); + delete pGdiPen; + } +} +Gdiplus::Brush* CFDE_GdiDevice::CreateGdiBrush(IFDE_Brush *pBrush) +{ + if (pBrush == NULL) { + return NULL; + } + Gdiplus::Brush *pGdiBrush = NULL; + switch (pBrush->GetType()) { + case FDE_BRUSHTYPE_Solid: { + IFDE_SolidBrush *pSolidBrush = (IFDE_SolidBrush*)pBrush; + Gdiplus::Color gdiColor((Gdiplus::ARGB)pSolidBrush->GetColor()); + pGdiBrush = new Gdiplus::SolidBrush(gdiColor); + } + break; + case FDE_BRUSHTYPE_Hatch: { + IFDE_HatchBrush *pHatchBrush = (IFDE_HatchBrush*)pBrush; + Gdiplus::Color foreColor((Gdiplus::ARGB)pHatchBrush->GetColor(TRUE)); + Gdiplus::Color backColor((Gdiplus::ARGB)pHatchBrush->GetColor(FALSE)); + Gdiplus::HatchStyle hatchStyle = (Gdiplus::HatchStyle)pHatchBrush->GetHatchStyle(); + pGdiBrush = new Gdiplus::HatchBrush(hatchStyle, foreColor, backColor); + } + break; + case FDE_BRUSHTYPE_Texture: { + IFDE_TextureBrush *pTextureBrush = (IFDE_TextureBrush*)pBrush; + CFDE_GdiImage *pImgHolder = (CFDE_GdiImage*)pTextureBrush->GetImage(); + Gdiplus::Image *pGdiImage = pImgHolder ? pImgHolder->m_pImage : NULL; + Gdiplus::WrapMode wrapMode = (Gdiplus::WrapMode)pTextureBrush->GetWrapMode(); + pGdiBrush = new Gdiplus::TextureBrush(pGdiImage, wrapMode); + } + break; + case FDE_BRUSHTYPE_LinearGradient: { + IFDE_LinearGradientBrush *pLinearBrush = (IFDE_LinearGradientBrush*)pBrush; + Gdiplus::WrapMode wrapMode = (Gdiplus::WrapMode)pLinearBrush->GetWrapMode(); + CFX_PointF ptStart, ptEnd; + pLinearBrush->GetLinearPoints(ptStart, ptEnd); + FX_ARGB crStart, crEnd; + pLinearBrush->GetLinearColors(crStart, crEnd); + pGdiBrush = new Gdiplus::LinearGradientBrush((const Gdiplus::PointF&)ptStart, + (const Gdiplus::PointF&)ptEnd, + (const Gdiplus::Color&)crStart, + (const Gdiplus::Color&)crEnd); + } + break; + } + return pGdiBrush; +} +void CFDE_GdiDevice::ReleaseGdiBrush(Gdiplus::Brush *pGdiBrush) +{ + if (pGdiBrush) { + delete pGdiBrush; + } +} +void CFDE_GdiDevice::ApplyMatrix(const CFX_Matrix *pMatrix) +{ + if (pMatrix) { + m_GraphicsState = m_pGraphics->Save(); + Gdiplus::Matrix gdiMatrix(pMatrix->a, pMatrix->b, pMatrix->c, pMatrix->d, pMatrix->e, pMatrix->f); + m_pGraphics->SetTransform(&gdiMatrix); + } +} +void CFDE_GdiDevice::RestoreMatrix(const CFX_Matrix *pMatrix) +{ + if (pMatrix) { + m_pGraphics->Restore(m_GraphicsState); + } +} +#endif +#endif diff --git a/xfa/src/fdp/src/fde/fde_gdidevice.h b/xfa/src/fdp/src/fde/fde_gdidevice.h new file mode 100644 index 0000000000..c22ed2b4ba --- /dev/null +++ b/xfa/src/fdp/src/fde/fde_gdidevice.h @@ -0,0 +1,76 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FDE_GDIPLUSDEVICE_IMP +#define _FDE_GDIPLUSDEVICE_IMP +#ifdef _FDEPLUS +#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || _FX_OS_ == _FX_WIN64_ +class CFDE_GdiPath; +class CFDE_GdiDevice : public IFDE_RenderDevice, public CFX_Target +{ +public: + CFDE_GdiDevice(CFX_DIBitmap *pDib); + ~CFDE_GdiDevice(); + + virtual void Release() + { + FDE_Delete this; + } + + virtual FX_INT32 GetWidth() const; + virtual FX_INT32 GetHeight() const; + virtual FDE_HDEVICESTATE SaveState(); + virtual void RestoreState(FDE_HDEVICESTATE hState); + virtual FX_BOOL SetClipPath(const IFDE_Path *pClip); + virtual IFDE_Path* GetClipPath() const; + virtual FX_BOOL SetClipRect(const CFX_RectF &rtClip); + virtual const CFX_RectF& GetClipRect(); + + virtual FX_FLOAT GetDpiX() const; + virtual FX_FLOAT GetDpiY() const; + + virtual FX_BOOL DrawImage(CFX_DIBSource *pDib, const CFX_RectF *pSrcRect, const CFX_RectF &dstRect, const CFX_Matrix *pImgMatrix = NULL, const CFX_Matrix *pDevMatrix = NULL); + virtual FX_BOOL DrawImage(IFDE_Image *pImg, const CFX_RectF *pSrcRect, const CFX_RectF &dstRect, const CFX_Matrix *pImgMatrix = NULL, const CFX_Matrix *pDevMatrix = NULL); + virtual FX_BOOL DrawString(IFDE_Brush *pBrush, IFX_Font *pFont, const FXTEXT_CHARPOS *pCharPos, FX_INT32 iCount, FX_FLOAT fFontSize, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL DrawArc(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_RectF &rect, FX_FLOAT startAngle, FX_FLOAT sweepAngle, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL DrawBezier(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_PointF &pt1, const CFX_PointF &pt2, const CFX_PointF &pt3, const CFX_PointF &pt4, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL DrawCurve(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_PointsF &points, FX_BOOL bClosed, FX_FLOAT fTension = 0.5f, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL DrawEllipse(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_RectF &rect, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL DrawLines(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_PointsF &points, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL DrawLine(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_PointF &pt1, const CFX_PointF &pt2, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL DrawPath(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const IFDE_Path *pPath, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL DrawPie(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_RectF &rect, FX_FLOAT startAngle, FX_FLOAT sweepAngle, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL DrawChord(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_RectF &rect, FX_FLOAT startAngle, FX_FLOAT sweepAngle, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL DrawPolygon(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_PointsF &points, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL DrawRectangle(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_RectF &rect, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL DrawRoundRectangle(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_RectF &rect, const CFX_SizeF &round, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL FillClosedCurve(IFDE_Brush *pBrush, const CFX_PointsF &points, FX_FLOAT fTension = 0.5f, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL FillEllipse(IFDE_Brush* pBrush, const CFX_RectF& rect, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL FillPath(IFDE_Brush *pBrush, const IFDE_Path *pPath, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL FillPie(IFDE_Brush *pBrush, const CFX_RectF &rect, FX_FLOAT startAngle, FX_FLOAT sweepAngle, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL FillChord(IFDE_Brush *pBrush, const CFX_RectF &rect, FX_FLOAT startAngle, FX_FLOAT sweepAngle, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL FillPolygon(IFDE_Brush *pBrush, const CFX_PointsF &points, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL FillRectangle(IFDE_Brush *pBrush, const CFX_RectF &rect, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL FillRoundRectangle(IFDE_Brush *pBrush, const CFX_RectF &rect, const CFX_SizeF &round, const CFX_Matrix *pMatrix = NULL); + +protected: + Gdiplus::Pen* CreateGdiPen(IFDE_Pen *pPen, FX_FLOAT fPenWidth); + void ReleaseGdiPen(Gdiplus::Pen *pGdiPen); + Gdiplus::Brush* CreateGdiBrush(IFDE_Brush *pBrush); + void ReleaseGdiBrush(Gdiplus::Brush *pGdiBrush); + void ApplyMatrix(const CFX_Matrix *pMatrix); + void RestoreMatrix(const CFX_Matrix *pMatrix); + Gdiplus::GraphicsState m_GraphicsState; + Gdiplus::Graphics *m_pGraphics; + Gdiplus::Bitmap *m_pBitmap; + FX_LPBYTE m_pGlyphBuf; + FX_DWORD m_dwGlyphLen; + CFX_RectF m_rtClipRect; + CFDE_GdiPath *m_pClipPath; +}; +#endif +#endif +#endif diff --git a/xfa/src/fdp/src/fde/fde_gedevice.cpp b/xfa/src/fdp/src/fde/fde_gedevice.cpp new file mode 100644 index 0000000000..81d7ef5a0c --- /dev/null +++ b/xfa/src/fdp/src/fde/fde_gedevice.cpp @@ -0,0 +1,532 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "fde_gedevice.h" +#include "fde_geobject.h" +#include "fde_devbasic.h" +#ifndef _FDEPLUS +#ifdef _cplusplus +exten "C" { +#endif + FX_BOOL FDE_GetStockHatchMask(FX_INT32 iHatchStyle, CFX_DIBitmap & hatchMask) + { + FDE_LPCHATCHDATA pData = FDE_DEVGetHatchData(iHatchStyle); + if (!pData) { + return FALSE; + } + hatchMask.Create(pData->iWidth, pData->iHeight, FXDIB_1bppMask); + FXSYS_memcpy(hatchMask.GetBuffer(), pData->MaskBits, hatchMask.GetPitch() * pData->iHeight); + return TRUE; + } +#ifdef _cplusplus +} +#endif +IFDE_RenderDevice* IFDE_RenderDevice::Create(CFX_DIBitmap *pBitmap, FX_BOOL bRgbByteOrder ) +{ + if (pBitmap == NULL) { + return NULL; + } + CFX_FxgeDevice *pDevice = FX_NEW CFX_FxgeDevice; + if (pDevice == NULL) { + return NULL; + } + pDevice->Attach(pBitmap, 0, bRgbByteOrder); + return FDE_New CFDE_FxgeDevice(pDevice, TRUE); +} +IFDE_RenderDevice* IFDE_RenderDevice::Create(CFX_RenderDevice *pDevice) +{ + if (pDevice == NULL) { + return NULL; + } + return FDE_New CFDE_FxgeDevice(pDevice, FALSE); +} +CFDE_FxgeDevice::CFDE_FxgeDevice(CFX_RenderDevice *pDevice, FX_BOOL bOwnerDevice) + : m_pDevice(pDevice) + , m_bOwnerDevice(bOwnerDevice) + , m_pCharPos(NULL) + , m_iCharCount(0) +{ + FXSYS_assert(pDevice != NULL); + FX_RECT rt = m_pDevice->GetClipBox(); + m_rtClip.Set((FX_FLOAT)rt.left, (FX_FLOAT)rt.top, (FX_FLOAT)rt.Width(), (FX_FLOAT)rt.Height()); +} +CFDE_FxgeDevice::~CFDE_FxgeDevice() +{ + if (m_pCharPos != NULL) { + FDE_Free(m_pCharPos); + } + if (m_bOwnerDevice && m_pDevice) { + delete m_pDevice; + } +} +FX_INT32 CFDE_FxgeDevice::GetWidth() const +{ + return m_pDevice->GetWidth(); +} +FX_INT32 CFDE_FxgeDevice::GetHeight() const +{ + return m_pDevice->GetHeight(); +} +FDE_HDEVICESTATE CFDE_FxgeDevice::SaveState() +{ + m_pDevice->SaveState(); + return NULL; +} +void CFDE_FxgeDevice::RestoreState(FDE_HDEVICESTATE hState) +{ + m_pDevice->RestoreState(); + const FX_RECT &rt = m_pDevice->GetClipBox(); + m_rtClip.Set((FX_FLOAT)rt.left, (FX_FLOAT)rt.top, (FX_FLOAT)rt.Width(), (FX_FLOAT)rt.Height()); +} +FX_BOOL CFDE_FxgeDevice::SetClipRect(const CFX_RectF &rtClip) +{ + m_rtClip = rtClip; + FX_RECT rt((FX_INT32)FXSYS_floor(rtClip.left), (FX_INT32)FXSYS_floor(rtClip.top), + (FX_INT32)FXSYS_ceil(rtClip.right()), (FX_INT32)FXSYS_ceil(rtClip.bottom())); + return m_pDevice->SetClip_Rect(&rt); +} +const CFX_RectF& CFDE_FxgeDevice::GetClipRect() +{ + return m_rtClip; +} +FX_BOOL CFDE_FxgeDevice::SetClipPath(const IFDE_Path *pClip) +{ + return FALSE; +} +IFDE_Path* CFDE_FxgeDevice::GetClipPath() const +{ + return NULL; +} +FX_FLOAT CFDE_FxgeDevice::GetDpiX() const +{ + return 96; +} +FX_FLOAT CFDE_FxgeDevice::GetDpiY() const +{ + return 96; +} +FX_BOOL CFDE_FxgeDevice::DrawImage(CFX_DIBSource *pDib, const CFX_RectF *pSrcRect, const CFX_RectF &dstRect, const CFX_Matrix *pImgMatrix, const CFX_Matrix *pDevMatrix) +{ + FXSYS_assert(pDib != NULL); + CFX_RectF srcRect; + if (pSrcRect) { + srcRect = *pSrcRect; + } else { + srcRect.Set(0, 0, (FX_FLOAT)pDib->GetWidth(), (FX_FLOAT)pDib->GetHeight()); + } + if (srcRect.IsEmpty()) { + return FALSE; + } + CFX_Matrix dib2fxdev; + if (pImgMatrix) { + dib2fxdev = *pImgMatrix; + } else { + dib2fxdev.Reset(); + } + dib2fxdev.a = dstRect.width; + dib2fxdev.d = -dstRect.height; + dib2fxdev.e = dstRect.left; + dib2fxdev.f = dstRect.bottom(); + if (pDevMatrix) { + dib2fxdev.Concat(*pDevMatrix); + } + FX_LPVOID handle = NULL; + m_pDevice->StartDIBits(pDib, 255, 0, (const CFX_AffineMatrix*)&dib2fxdev, 0, handle); + while (m_pDevice->ContinueDIBits(handle, NULL)) { } + m_pDevice->CancelDIBits(handle); + return handle != NULL; +} +FX_BOOL CFDE_FxgeDevice::DrawString(IFDE_Brush *pBrush, IFX_Font *pFont, const FXTEXT_CHARPOS *pCharPos, FX_INT32 iCount, FX_FLOAT fFontSize, const CFX_Matrix *pMatrix) +{ + FXSYS_assert(pBrush != NULL && pFont != NULL && pCharPos != NULL && iCount > 0); + CFX_FontCache *pCache = CFX_GEModule::Get()->GetFontCache(); + CFX_Font *pFxFont = (CFX_Font*)pFont->GetDevFont(); + switch (pBrush->GetType()) { + case FDE_BRUSHTYPE_Solid: { + FX_ARGB argb = ((IFDE_SolidBrush*)pBrush)->GetColor(); + if ((pFont->GetFontStyles() & FX_FONTSTYLE_Italic) != 0 && !pFxFont->IsItalic()) { + FXTEXT_CHARPOS *pCP = (FXTEXT_CHARPOS*)pCharPos; + FX_FLOAT *pAM; + for (FX_INT32 i = 0; i < iCount; ++i) { + static const FX_FLOAT mc = 0.267949f; + pAM = pCP->m_AdjustMatrix; + pAM[2] = mc * pAM[0] + pAM[2]; + pAM[3] = mc * pAM[1] + pAM[3]; + pCP ++; + } + } + FXTEXT_CHARPOS *pCP = (FXTEXT_CHARPOS*)pCharPos; + IFX_Font *pCurFont = NULL; + IFX_Font *pSTFont = NULL; + FXTEXT_CHARPOS *pCurCP = NULL; + FX_INT32 iCurCount = 0; +#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ + FX_DWORD dwFontStyle = pFont->GetFontStyles(); + CFX_Font FxFont; + CFX_SubstFont SubstFxFont; + FxFont.m_pSubstFont = &SubstFxFont; + SubstFxFont.m_Weight = dwFontStyle & FX_FONTSTYLE_Bold ? 700 : 400; + SubstFxFont.m_WeightCJK = SubstFxFont.m_Weight; + SubstFxFont.m_ItalicAngle = dwFontStyle & FX_FONTSTYLE_Italic ? -12 : 0; + SubstFxFont.m_bItlicCJK = dwFontStyle & FX_FONTSTYLE_Italic ? TRUE : FALSE; +#endif + for (FX_INT32 i = 0; i < iCount; ++i) { + pSTFont = pFont->GetSubstFont((FX_INT32)pCP->m_GlyphIndex); + pCP->m_GlyphIndex &= 0x00FFFFFF; + pCP->m_bFontStyle = FALSE; + if (pCurFont != pSTFont) { + if (pCurFont != NULL) { + pFxFont = (CFX_Font*)pCurFont->GetDevFont(); +#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ + FxFont.m_Face = pFxFont->m_Face; + m_pDevice->DrawNormalText(iCurCount, pCurCP, &FxFont, pCache, -fFontSize, (const CFX_AffineMatrix*)pMatrix, argb, FXTEXT_CLEARTYPE); +#else + m_pDevice->DrawNormalText(iCurCount, pCurCP, pFxFont, pCache, -fFontSize, (const CFX_AffineMatrix*)pMatrix, argb, FXTEXT_CLEARTYPE); +#endif + } + pCurFont = pSTFont; + pCurCP = pCP; + iCurCount = 1; + } else { + iCurCount ++; + } + pCP ++; + } + if (pCurFont != NULL && iCurCount) { + pFxFont = (CFX_Font*)pCurFont->GetDevFont(); +#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ + FxFont.m_Face = pFxFont->m_Face; + FX_BOOL bRet = m_pDevice->DrawNormalText(iCurCount, pCurCP, &FxFont, pCache, -fFontSize, (const CFX_AffineMatrix*)pMatrix, argb, FXTEXT_CLEARTYPE); + FxFont.m_pSubstFont = NULL; + FxFont.m_Face = NULL; + return bRet; +#else + return m_pDevice->DrawNormalText(iCurCount, pCurCP, pFxFont, pCache, -fFontSize, (const CFX_AffineMatrix*)pMatrix, argb, FXTEXT_CLEARTYPE); +#endif + } +#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ + FxFont.m_pSubstFont = NULL; + FxFont.m_Face = NULL; +#endif + return TRUE; + } + break; + default: + return FALSE; + } +} +FX_BOOL CFDE_FxgeDevice::DrawBezier(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_PointF &pt1, const CFX_PointF &pt2, const CFX_PointF &pt3, const CFX_PointF &pt4, const CFX_Matrix *pMatrix ) +{ + CFX_PointsF points; + points.Add(pt1); + points.Add(pt2); + points.Add(pt3); + points.Add(pt4); + CFDE_Path path; + path.AddBezier(points); + return DrawPath(pPen, fPenWidth, &path, pMatrix); +} +FX_BOOL CFDE_FxgeDevice::DrawCurve(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_PointsF &points, FX_BOOL bClosed, FX_FLOAT fTension , const CFX_Matrix *pMatrix ) +{ + CFDE_Path path; + path.AddCurve(points, bClosed, fTension); + return DrawPath(pPen, fPenWidth, &path, pMatrix); +} +FX_BOOL CFDE_FxgeDevice::DrawEllipse(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_RectF &rect, const CFX_Matrix *pMatrix ) +{ + CFDE_Path path; + path.AddEllipse(rect); + return DrawPath(pPen, fPenWidth, &path, pMatrix); +} +FX_BOOL CFDE_FxgeDevice::DrawLines(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_PointsF &points, const CFX_Matrix *pMatrix ) +{ + CFDE_Path path; + path.AddLines(points); + return DrawPath(pPen, fPenWidth, &path, pMatrix); +} +FX_BOOL CFDE_FxgeDevice::DrawLine(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_PointF &pt1, const CFX_PointF &pt2, const CFX_Matrix *pMatrix ) +{ + CFDE_Path path; + path.AddLine(pt1, pt2); + return DrawPath(pPen, fPenWidth, &path, pMatrix); +} +FX_BOOL CFDE_FxgeDevice::DrawPath(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const IFDE_Path *pPath, const CFX_Matrix *pMatrix ) +{ + CFDE_Path *pGePath = (CFDE_Path*)pPath; + if (pGePath == NULL) { + return FALSE; + } + CFX_GraphStateData graphState; + if (!CreatePen(pPen, fPenWidth, graphState)) { + return FALSE; + } + return m_pDevice->DrawPath(&pGePath->m_Path, (const CFX_AffineMatrix*)pMatrix, &graphState, 0, pPen->GetColor(), 0); +} +FX_BOOL CFDE_FxgeDevice::DrawPolygon(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_PointsF &points, const CFX_Matrix *pMatrix ) +{ + CFDE_Path path; + path.AddPolygon(points); + return DrawPath(pPen, fPenWidth, &path, pMatrix); +} +FX_BOOL CFDE_FxgeDevice::DrawRectangle(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_RectF &rect, const CFX_Matrix *pMatrix ) +{ + CFDE_Path path; + path.AddRectangle(rect); + return DrawPath(pPen, fPenWidth, &path, pMatrix); +} +FX_BOOL CFDE_FxgeDevice::FillClosedCurve(IFDE_Brush *pBrush, const CFX_PointsF &points, FX_FLOAT fTension , const CFX_Matrix *pMatrix ) +{ + CFDE_Path path; + path.AddCurve(points, TRUE, fTension); + return FillPath(pBrush, &path, pMatrix); +} +FX_BOOL CFDE_FxgeDevice::FillEllipse(IFDE_Brush* pBrush, const CFX_RectF& rect, const CFX_Matrix *pMatrix ) +{ + CFDE_Path path; + path.AddEllipse(rect); + return FillPath(pBrush, &path, pMatrix); +} +FX_BOOL CFDE_FxgeDevice::FillPolygon(IFDE_Brush *pBrush, const CFX_PointsF &points, const CFX_Matrix *pMatrix ) +{ + CFDE_Path path; + path.AddPolygon(points); + return FillPath(pBrush, &path, pMatrix); +} +FX_BOOL CFDE_FxgeDevice::FillRectangle(IFDE_Brush *pBrush, const CFX_RectF &rect, const CFX_Matrix *pMatrix ) +{ + CFDE_Path path; + path.AddRectangle(rect); + return FillPath(pBrush, &path, pMatrix); +} +FX_BOOL CFDE_FxgeDevice::CreatePen(IFDE_Pen *pPen, FX_FLOAT fPenWidth, CFX_GraphStateData &graphState) +{ + if (pPen == NULL) { + return FALSE; + } + graphState.m_LineCap = (CFX_GraphStateData::LineCap)pPen->GetLineCap(); + graphState.m_LineJoin = (CFX_GraphStateData::LineJoin)pPen->GetLineJoin(); + graphState.m_LineWidth = fPenWidth; + graphState.m_MiterLimit = pPen->GetMiterLimit(); + graphState.m_DashPhase = pPen->GetDashPhase(); + CFX_FloatArray dashArray; + switch (pPen->GetDashStyle()) { + case FDE_DASHSTYLE_Dash: + dashArray.Add(3); + dashArray.Add(1); + break; + case FDE_DASHSTYLE_Dot: + dashArray.Add(1); + dashArray.Add(1); + break; + case FDE_DASHSTYLE_DashDot: + dashArray.Add(3); + dashArray.Add(1); + dashArray.Add(1); + dashArray.Add(1); + break; + case FDE_DASHSTYLE_DashDotDot: + dashArray.Add(3); + dashArray.Add(1); + dashArray.Add(1); + dashArray.Add(1); + dashArray.Add(1); + dashArray.Add(1); + break; + case FDE_DASHSTYLE_Customized: + pPen->GetDashArray(dashArray); + break; + } + FX_INT32 iDashCount = dashArray.GetSize(); + if (iDashCount > 0) { + graphState.SetDashCount(iDashCount); + for (FX_INT32 i = 0; i < iDashCount; ++i) { + graphState.m_DashArray[i] = dashArray[i] * fPenWidth; + } + } + return TRUE; +} +typedef FX_BOOL (CFDE_FxgeDevice::*pfFillPath)(IFDE_Brush *pBrush, const CFX_PathData *pPath, const CFX_Matrix *pMatrix); +static const pfFillPath gs_FillPath[] = { + &CFDE_FxgeDevice::FillSolidPath, + &CFDE_FxgeDevice::FillHatchPath, + &CFDE_FxgeDevice::FillTexturePath, + &CFDE_FxgeDevice::FillLinearGradientPath, +}; +FX_BOOL CFDE_FxgeDevice::FillPath(IFDE_Brush *pBrush, const IFDE_Path *pPath, const CFX_Matrix *pMatrix) +{ + CFDE_Path *pGePath = (CFDE_Path*)pPath; + if (pGePath == NULL) { + return FALSE; + } + if (pBrush == NULL) { + return FALSE; + } + FX_INT32 iType = pBrush->GetType(); + if (iType < 0 || iType > FDE_BRUSHTYPE_MAX) { + return FALSE; + } + return (this->*gs_FillPath[iType])(pBrush, &pGePath->m_Path, pMatrix); +} +FX_BOOL CFDE_FxgeDevice::FillSolidPath(IFDE_Brush *pBrush, const CFX_PathData *pPath, const CFX_Matrix *pMatrix) +{ + FXSYS_assert(pPath && pBrush && pBrush->GetType() == FDE_BRUSHTYPE_Solid); + IFDE_SolidBrush *pSolidBrush = (IFDE_SolidBrush*)pBrush; + return m_pDevice->DrawPath(pPath, (const CFX_AffineMatrix*)pMatrix, NULL, pSolidBrush->GetColor(), 0, FXFILL_WINDING); +} +FX_BOOL CFDE_FxgeDevice::FillHatchPath(IFDE_Brush *pBrush, const CFX_PathData *pPath, const CFX_Matrix *pMatrix) +{ + FXSYS_assert(pPath && pBrush && pBrush->GetType() == FDE_BRUSHTYPE_Hatch); + IFDE_HatchBrush *pHatchBrush = (IFDE_HatchBrush*)pBrush; + FX_INT32 iStyle = pHatchBrush->GetHatchStyle(); + if (iStyle < FDE_HATCHSTYLE_Min || iStyle > FDE_HATCHSTYLE_Max) { + return FALSE; + } + CFX_DIBitmap mask; + if (!FDE_GetStockHatchMask(iStyle, mask)) { + return FALSE; + } + FX_ARGB dwForeColor = pHatchBrush->GetColor(TRUE); + FX_ARGB dwBackColor = pHatchBrush->GetColor(FALSE); + CFX_FloatRect rectf = pPath->GetBoundingBox(); + if (pMatrix) { + rectf.Transform((const CFX_AffineMatrix*)pMatrix); + } + FX_RECT rect(FXSYS_round(rectf.left), FXSYS_round(rectf.top), + FXSYS_round(rectf.right), FXSYS_round(rectf.bottom)); + m_pDevice->SaveState(); + m_pDevice->StartRendering(); + m_pDevice->SetClip_PathFill(pPath, (const CFX_AffineMatrix*)pMatrix, FXFILL_WINDING); + m_pDevice->FillRect(&rect, dwBackColor); + for (FX_INT32 j = rect.bottom; j < rect.top; j += mask.GetHeight()) + for (FX_INT32 i = rect.left; i < rect.right; i += mask.GetWidth()) { + m_pDevice->SetBitMask(&mask, i, j, dwForeColor); + } + m_pDevice->EndRendering(); + m_pDevice->RestoreState(); + return TRUE; +} +FX_BOOL CFDE_FxgeDevice::FillTexturePath(IFDE_Brush *pBrush, const CFX_PathData *pPath, const CFX_Matrix *pMatrix) +{ + FXSYS_assert(pPath && pBrush && pBrush->GetType() == FDE_BRUSHTYPE_Texture); + IFDE_TextureBrush *pTextureBrush = (IFDE_TextureBrush*)pBrush; + IFDE_Image *pImage = (IFDE_Image*)pTextureBrush->GetImage(); + if (pImage == NULL) { + return FALSE; + } + CFX_Size size; + size.Set(pImage->GetImageWidth(), pImage->GetImageHeight()); + CFX_DIBitmap bmp; + bmp.Create(size.x, size.y, FXDIB_Argb); + if (!pImage->StartLoadImage(&bmp, 0, 0, size.x, size.y, 0, 0, size.x, size.y)) { + return FALSE; + } + if (pImage->DoLoadImage() < 100) { + return FALSE; + } + pImage->StopLoadImage(); + return WrapTexture(pTextureBrush->GetWrapMode(), &bmp, pPath, pMatrix); +} +FX_BOOL CFDE_FxgeDevice::WrapTexture(FX_INT32 iWrapMode, const CFX_DIBitmap *pBitmap, const CFX_PathData *pPath, const CFX_Matrix *pMatrix) +{ + CFX_FloatRect rectf = pPath->GetBoundingBox(); + if (pMatrix) { + rectf.Transform((const CFX_AffineMatrix*)pMatrix); + } + FX_RECT rect(FXSYS_round(rectf.left), FXSYS_round(rectf.top), + FXSYS_round(rectf.right), FXSYS_round(rectf.bottom)); + rect.Normalize(); + if (rect.IsEmpty()) { + return FALSE; + } + m_pDevice->SaveState(); + m_pDevice->StartRendering(); + m_pDevice->SetClip_PathFill(pPath, (const CFX_AffineMatrix*)pMatrix, FXFILL_WINDING); + switch (iWrapMode) { + case FDE_WRAPMODE_Tile: + case FDE_WRAPMODE_TileFlipX: + case FDE_WRAPMODE_TileFlipY: + case FDE_WRAPMODE_TileFlipXY: { + FX_BOOL bFlipX = iWrapMode == FDE_WRAPMODE_TileFlipXY || iWrapMode == FDE_WRAPMODE_TileFlipX; + FX_BOOL bFlipY = iWrapMode == FDE_WRAPMODE_TileFlipXY || iWrapMode == FDE_WRAPMODE_TileFlipY; + const CFX_DIBitmap *pFlip[2][2]; + pFlip[0][0] = pBitmap; + pFlip[0][1] = bFlipX ? pBitmap->FlipImage(TRUE, FALSE) : pBitmap; + pFlip[1][0] = bFlipY ? pBitmap->FlipImage(FALSE, TRUE) : pBitmap; + pFlip[1][1] = (bFlipX || bFlipY) ? pBitmap->FlipImage(bFlipX, bFlipY) : pBitmap; + FX_INT32 iCounterY = 0; + for (FX_INT32 j = rect.top; j < rect.bottom; j += pBitmap->GetHeight()) { + FX_INT32 indexY = iCounterY++ % 2; + FX_INT32 iCounterX = 0; + for (FX_INT32 i = rect.left; i < rect.right; i += pBitmap->GetWidth()) { + FX_INT32 indexX = iCounterX++ % 2; + m_pDevice->SetDIBits(pFlip[indexY][indexX], i, j); + } + } + if (pFlip[0][1] != pFlip[0][0]) { + delete pFlip[0][1]; + } + if (pFlip[1][0] != pFlip[0][0]) { + delete pFlip[1][0]; + } + if (pFlip[1][1] != pFlip[0][0]) { + delete pFlip[1][1]; + } + } + break; + case FDE_WRAPMODE_Clamp: { + m_pDevice->SetDIBits(pBitmap, rect.left, rect.bottom); + } + break; + } + m_pDevice->EndRendering(); + m_pDevice->RestoreState(); + return TRUE; +} +FX_BOOL CFDE_FxgeDevice::FillLinearGradientPath(IFDE_Brush *pBrush, const CFX_PathData *pPath, const CFX_Matrix *pMatrix) +{ + FXSYS_assert(pPath && pBrush && pBrush->GetType() == FDE_BRUSHTYPE_LinearGradient); + IFDE_LinearGradientBrush *pLinearBrush = (IFDE_LinearGradientBrush*)pBrush; + CFX_PointF pt0, pt1; + pLinearBrush->GetLinearPoints(pt0, pt1); + CFX_VectorF fDiagonal; + fDiagonal.Set(pt0, pt1); + FX_FLOAT fTheta = FXSYS_atan2(fDiagonal.y, fDiagonal.x); + FX_FLOAT fLength = fDiagonal.Length(); + FX_FLOAT fTotalX = fLength / FXSYS_cos(fTheta); + FX_FLOAT fTotalY = fLength / FXSYS_cos(FX_PI / 2 - fTheta); + FX_FLOAT fSteps = FX_MAX(fTotalX, fTotalY); + FX_FLOAT dx = fTotalX / fSteps; + FX_FLOAT dy = fTotalY / fSteps; + FX_ARGB cr0, cr1; + pLinearBrush->GetLinearColors(cr0, cr1); + FX_FLOAT a0 = FXARGB_A(cr0); + FX_FLOAT r0 = FXARGB_R(cr0); + FX_FLOAT g0 = FXARGB_G(cr0); + FX_FLOAT b0 = FXARGB_B(cr0); + FX_FLOAT da = (FXARGB_A(cr1) - a0) / fSteps; + FX_FLOAT dr = (FXARGB_R(cr1) - r0) / fSteps; + FX_FLOAT dg = (FXARGB_G(cr1) - g0) / fSteps; + FX_FLOAT db = (FXARGB_B(cr1) - b0) / fSteps; + CFX_DIBitmap bmp; + bmp.Create(FXSYS_round(FXSYS_fabs(fDiagonal.x)), FXSYS_round(FXSYS_fabs(fDiagonal.y)), FXDIB_Argb); + CFX_FxgeDevice dev; + dev.Attach(&bmp); + pt1 = pt0; + FX_INT32 iSteps = FXSYS_round(FXSYS_ceil(fSteps)); + while (--iSteps >= 0) { + cr0 = ArgbEncode(FXSYS_round(a0), FXSYS_round(r0), FXSYS_round(g0), FXSYS_round(b0)); + dev.DrawCosmeticLine(pt0.x, pt0.y, pt1.x, pt1.y, cr0); + pt1.x += dx; + pt0.y += dy; + a0 += da; + r0 += dr; + g0 += dg; + b0 += db; + } + return WrapTexture(pLinearBrush->GetWrapMode(), &bmp, pPath, pMatrix); +} +#endif diff --git a/xfa/src/fdp/src/fde/fde_gedevice.h b/xfa/src/fdp/src/fde/fde_gedevice.h new file mode 100644 index 0000000000..6290e53390 --- /dev/null +++ b/xfa/src/fdp/src/fde/fde_gedevice.h @@ -0,0 +1,63 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FDE_FXGEDEVICE_IMP +#define _FDE_FXGEDEVICE_IMP +#ifndef _FDEPLUS +class CFDE_FxgeDevice : public IFDE_RenderDevice, public CFX_Target +{ +public: + CFDE_FxgeDevice(CFX_RenderDevice *pDevice, FX_BOOL bOwnerDevice); + ~CFDE_FxgeDevice(); + virtual void Release() + { + FDE_Delete this; + } + + virtual FX_INT32 GetWidth() const; + virtual FX_INT32 GetHeight() const; + virtual FDE_HDEVICESTATE SaveState(); + virtual void RestoreState(FDE_HDEVICESTATE hState); + virtual FX_BOOL SetClipPath(const IFDE_Path *pClip); + virtual IFDE_Path* GetClipPath() const; + virtual FX_BOOL SetClipRect(const CFX_RectF &rtClip); + virtual const CFX_RectF& GetClipRect(); + + virtual FX_FLOAT GetDpiX() const; + virtual FX_FLOAT GetDpiY() const; + + virtual FX_BOOL DrawImage(CFX_DIBSource *pDib, const CFX_RectF *pSrcRect, const CFX_RectF &dstRect, const CFX_Matrix *pImgMatrix = NULL, const CFX_Matrix *pDevMatrix = NULL); + virtual FX_BOOL DrawString(IFDE_Brush *pBrush, IFX_Font *pFont, const FXTEXT_CHARPOS *pCharPos, FX_INT32 iCount, FX_FLOAT fFontSize, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL DrawBezier(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_PointF &pt1, const CFX_PointF &pt2, const CFX_PointF &pt3, const CFX_PointF &pt4, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL DrawCurve(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_PointsF &points, FX_BOOL bClosed, FX_FLOAT fTension = 0.5f, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL DrawEllipse(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_RectF &rect, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL DrawLines(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_PointsF &points, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL DrawLine(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_PointF &pt1, const CFX_PointF &pt2, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL DrawPath(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const IFDE_Path *pPath, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL DrawPolygon(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_PointsF &points, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL DrawRectangle(IFDE_Pen *pPen, FX_FLOAT fPenWidth, const CFX_RectF &rect, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL FillClosedCurve(IFDE_Brush *pBrush, const CFX_PointsF &points, FX_FLOAT fTension = 0.5f, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL FillEllipse(IFDE_Brush* pBrush, const CFX_RectF& rect, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL FillPath(IFDE_Brush *pBrush, const IFDE_Path *pPath, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL FillPolygon(IFDE_Brush *pBrush, const CFX_PointsF &points, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL FillRectangle(IFDE_Brush *pBrush, const CFX_RectF &rect, const CFX_Matrix *pMatrix = NULL); + FX_BOOL FillSolidPath(IFDE_Brush *pBrush, const CFX_PathData *pPath, const CFX_Matrix *pMatrix); + FX_BOOL FillHatchPath(IFDE_Brush *pBrush, const CFX_PathData *pPath, const CFX_Matrix *pMatrix); + FX_BOOL FillTexturePath(IFDE_Brush *pBrush, const CFX_PathData *pPath, const CFX_Matrix *pMatrix); + FX_BOOL FillLinearGradientPath(IFDE_Brush *pBrush, const CFX_PathData *pPath, const CFX_Matrix *pMatrix); + FX_BOOL DrawSolidString(IFDE_Brush *pBrush, IFX_Font *pFont, const FXTEXT_CHARPOS *pCharPos, FX_INT32 iCount, FX_FLOAT fFontSize, const CFX_Matrix *pMatrix); + FX_BOOL DrawStringPath(IFDE_Brush *pBrush, IFX_Font *pFont, const FXTEXT_CHARPOS *pCharPos, FX_INT32 iCount, FX_FLOAT fFontSize, const CFX_Matrix *pMatrix); +protected: + FX_BOOL CreatePen(IFDE_Pen *pPen, FX_FLOAT fPenWidth, CFX_GraphStateData &graphState); + FX_BOOL WrapTexture(FX_INT32 iWrapMode, const CFX_DIBitmap *pBitmap, const CFX_PathData *pPath, const CFX_Matrix *pMatrix); + CFX_RenderDevice *m_pDevice; + CFX_RectF m_rtClip; + FX_BOOL m_bOwnerDevice; + FXTEXT_CHARPOS *m_pCharPos; + FX_INT32 m_iCharCount; +}; +#endif +#endif diff --git a/xfa/src/fdp/src/fde/fde_geobject.cpp b/xfa/src/fdp/src/fde/fde_geobject.cpp new file mode 100644 index 0000000000..9f34cf3051 --- /dev/null +++ b/xfa/src/fdp/src/fde/fde_geobject.cpp @@ -0,0 +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 "../../../foxitlib.h" +#include "fde_object.h" +#include "fde_geobject.h" +#ifndef _FDEPLUS +IFDE_Path* IFDE_Path::Create() +{ + return FDE_New CFDE_Path; +} +FX_BOOL CFDE_Path::StartFigure() +{ + return CloseFigure(); +} +FX_BOOL CFDE_Path::CloseFigure() +{ + FX_PATHPOINT *pPoint = GetLastPoint(); + if (pPoint) { + pPoint->m_Flag |= FXPT_CLOSEFIGURE; + } + return TRUE; +} +FX_PATHPOINT* CFDE_Path::GetLastPoint(FX_INT32 iCount ) const +{ + if (iCount < 1) { + return NULL; + } + FX_INT32 iPoints = m_Path.GetPointCount(); + if (iCount > iPoints) { + return NULL; + } + return m_Path.GetPoints() + iPoints - iCount; +} +FX_BOOL CFDE_Path::FigureClosed() const +{ + FX_PATHPOINT *pPoint = GetLastPoint(); + return pPoint ? (pPoint->m_Flag & FXPT_CLOSEFIGURE) : TRUE; +} +FX_PATHPOINT* CFDE_Path::AddPoints(FX_INT32 iCount) +{ + if (iCount < 1) { + return NULL; + } + FX_INT32 iPoints = m_Path.GetPointCount(); + m_Path.AddPointCount(iCount); + return m_Path.GetPoints() + iPoints; +} +void CFDE_Path::MoveTo(FX_FLOAT fx, FX_FLOAT fy) +{ + FX_PATHPOINT *pPoint = AddPoints(1); + pPoint->m_PointX = fx; + pPoint->m_PointY = fy; + pPoint->m_Flag = FXPT_MOVETO; +} +void CFDE_Path::LineTo(FX_FLOAT fx, FX_FLOAT fy) +{ + FX_PATHPOINT *pPoint = AddPoints(1); + pPoint->m_PointX = fx; + pPoint->m_PointY = fy; + pPoint->m_Flag = FXPT_LINETO; +} +void CFDE_Path::BezierTo(const CFX_PointF &p1, const CFX_PointF &p2, const CFX_PointF &p3) +{ + FX_PATHPOINT *p = AddPoints(3); + p[0].m_PointX = p1.x; + p[0].m_PointY = p1.y; + p[0].m_Flag = FXPT_BEZIERTO; + p[1].m_PointX = p2.x; + p[1].m_PointY = p2.y; + p[1].m_Flag = FXPT_BEZIERTO; + p[2].m_PointX = p3.x; + p[2].m_PointY = p3.y; + p[2].m_Flag = FXPT_BEZIERTO; +} +void CFDE_Path::ArcTo(FX_BOOL bStart, const CFX_RectF &rect, FX_FLOAT startAngle, FX_FLOAT endAngle) +{ + FX_FLOAT rx = rect.width / 2; + FX_FLOAT ry = rect.height / 2; + FX_FLOAT cx = rect.left + rx; + FX_FLOAT cy = rect.top + ry; + FX_FLOAT alpha = FXSYS_atan2(rx * FXSYS_sin(startAngle), ry * FXSYS_cos(startAngle)); + FX_FLOAT beta = FXSYS_atan2(rx * FXSYS_sin(endAngle), ry * FXSYS_cos(endAngle)); + if (FXSYS_fabs(beta - alpha) > FX_PI) { + if (beta > alpha) { + beta -= 2 * FX_PI; + } else { + alpha -= 2 * FX_PI; + } + } + FX_FLOAT half_delta = (beta - alpha) / 2; + FX_FLOAT bcp = 4.0f / 3 * (1 - FXSYS_cos(half_delta)) / FXSYS_sin(half_delta); + FX_FLOAT sin_alpha = FXSYS_sin(alpha); + FX_FLOAT sin_beta = FXSYS_sin(beta); + FX_FLOAT cos_alpha = FXSYS_cos(alpha); + FX_FLOAT cos_beta = FXSYS_cos(beta); + if (bStart) { + CFX_PointF p0; + p0.Set(cx + rx * cos_alpha, cy + ry * sin_alpha); + MoveTo(p0); + } + CFX_PointF p1; + p1.Set(cx + rx * (cos_alpha - bcp * sin_alpha), cy + ry * (sin_alpha + bcp * cos_alpha)); + CFX_PointF p2; + p2.Set(cx + rx * (cos_beta + bcp * sin_beta), cy + ry * (sin_beta - bcp * cos_beta)); + CFX_PointF p3; + p3.Set(cx + rx * cos_beta, cy + ry * sin_beta); + BezierTo(p1, p2, p3); +} +void CFDE_Path::AddBezier(const CFX_PointsF &points) +{ + if (points.GetSize() != 4) { + return; + } + FX_LPCPOINTF p = points.GetData(); + MoveTo(p[0]); + BezierTo(p[1], p[2], p[3]); +} +void CFDE_Path::AddBeziers(const CFX_PointsF &points) +{ + FX_INT32 iCount = points.GetSize(); + if (iCount < 4) { + return; + } + FX_LPCPOINTF p = points.GetData(); + FX_LPCPOINTF pEnd = p + iCount; + MoveTo(p[0]); + for (++p; p <= pEnd - 3; p += 3) { + BezierTo(p[0], p[1], p[2]); + } +} +void CFDE_Path::GetCurveTangents(const CFX_PointsF &points, CFX_PointsF &tangents, FX_BOOL bClosed, FX_FLOAT fTension) const +{ + FX_INT32 iCount = points.GetSize(); + tangents.SetSize(iCount); + if (iCount < 3) { + return; + } + FX_FLOAT fCoefficient = fTension / 3.0f; + FX_LPCPOINTF pPoints = points.GetData(); + FX_LPPOINTF pTangents = tangents.GetData(); + for (FX_INT32 i = 0; i < iCount; ++i) { + FX_INT32 r = i + 1; + FX_INT32 s = i - 1; + if (r >= iCount) { + r = bClosed ? (r - iCount) : (iCount - 1); + } + if (s < 0) { + s = bClosed ? (s + iCount) : 0; + } + pTangents[i].x += (fCoefficient * (pPoints[r].x - pPoints[s].x)); + pTangents[i].y += (fCoefficient * (pPoints[r].y - pPoints[s].y)); + } +} +void CFDE_Path::AddCurve(const CFX_PointsF &points, FX_BOOL bClosed, FX_FLOAT fTension) +{ + FX_INT32 iLast = points.GetUpperBound(); + if (iLast < 1) { + return; + } + CFX_PointsF tangents; + GetCurveTangents(points, tangents, bClosed, fTension); + FX_LPCPOINTF pPoints = points.GetData(); + FX_LPPOINTF pTangents = tangents.GetData(); + MoveTo(pPoints[0]); + for (FX_INT32 i = 0; i < iLast; ++i) { + FX_INT32 j = i + 1; + CFX_PointF p1; + p1.Set(pPoints[i].x + pTangents[i].x, pPoints[i].y + pTangents[i].y); + CFX_PointF p2; + p2.Set(pPoints[j].x - pTangents[j].x, pPoints[j].y - pTangents[j].y); + CFX_PointF p3; + p3.Set(pPoints[j].x, pPoints[j].y); + BezierTo(p1, p2, p3); + } + if (bClosed) { + CFX_PointF p1; + p1.Set(pPoints[iLast].x + pTangents[iLast].x, pPoints[iLast].y + pTangents[iLast].y); + CFX_PointF p2; + p2.Set(pPoints[0].x - pTangents[0].x, pPoints[0].y - pTangents[0].y); + CFX_PointF p3; + p3.Set(pPoints[0].x, pPoints[0].y); + BezierTo(p1, p2, p3); + CloseFigure(); + } +} +void CFDE_Path::AddEllipse(const CFX_RectF &rect) +{ + FX_FLOAT fStartAngle = 0; + FX_FLOAT fEndAngle = FX_PI / 2; + for (FX_INT32 i = 0; i < 4; ++i) { + ArcTo(i == 0, rect, fStartAngle, fEndAngle); + fStartAngle += FX_PI / 2; + fEndAngle += FX_PI / 2; + } + CloseFigure(); +} +void CFDE_Path::AddLine(const CFX_PointF &pt1, const CFX_PointF &pt2) +{ + FX_PATHPOINT *pLast = GetLastPoint(); + if (pLast == NULL || FXSYS_fabs(pLast->m_PointX - pt1.x) > 0.001 || FXSYS_fabs(pLast->m_PointY - pt1.y) > 0.001) { + MoveTo(pt1); + } + LineTo(pt2); +} +void CFDE_Path::AddPath(const IFDE_Path *pSrc, FX_BOOL bConnect) +{ + CFDE_Path *pPath = (CFDE_Path*)pSrc; + if (pPath == NULL) { + return; + } + FX_INT32 iCount = pPath->m_Path.GetPointCount(); + if (iCount < 1) { + return; + } + if (bConnect) { + LineTo(pPath->m_Path.GetPointX(0), pPath->m_Path.GetPointY(0)); + } + m_Path.Append(&pPath->m_Path, NULL); +} +void CFDE_Path::AddPolygon(const CFX_PointsF &points) +{ + FX_INT32 iCount = points.GetSize(); + if (iCount < 2) { + return; + } + AddLines(points); + FX_LPCPOINTF p = points.GetData(); + if (FXSYS_fabs(p[0].x - p[iCount - 1].x) < 0.01f || FXSYS_fabs(p[0].y - p[iCount - 1].y) < 0.01f) { + LineTo(p[0]); + } + CloseFigure(); +} +void CFDE_Path::AddLines(const CFX_PointsF &points) +{ + FX_INT32 iCount = points.GetSize(); + if (iCount < 2) { + return; + } + FX_LPCPOINTF p = points.GetData(); + FX_LPCPOINTF pEnd = p + iCount; + MoveTo(p[0]); + for (++p; p < pEnd; ++p) { + LineTo(*p); + } +} +void CFDE_Path::AddRectangle(const CFX_RectF &rect) +{ + MoveTo(rect.TopLeft()); + LineTo(rect.TopRight()); + LineTo(rect.BottomRight()); + LineTo(rect.BottomLeft()); + CloseFigure(); +} +void CFDE_Path::GetBBox(CFX_RectF &bbox) const +{ + CFX_FloatRect rect = m_Path.GetBoundingBox(); + bbox.Set(rect.left, rect.top, rect.Width(), rect.Height()); + bbox.Normalize(); +} +void CFDE_Path::GetBBox(CFX_RectF &bbox, FX_FLOAT fLineWidth, FX_FLOAT fMiterLimit) const +{ + CFX_FloatRect rect = m_Path.GetBoundingBox(fLineWidth, fMiterLimit); + bbox.Set(rect.left, rect.top, rect.Width(), rect.Height()); + bbox.Normalize(); +} +#endif diff --git a/xfa/src/fdp/src/fde/fde_geobject.h b/xfa/src/fdp/src/fde/fde_geobject.h new file mode 100644 index 0000000000..8552b6f7b8 --- /dev/null +++ b/xfa/src/fdp/src/fde/fde_geobject.h @@ -0,0 +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 + +#ifndef _FDE_GRAPHOBJS_IMP +#define _FDE_GRAPHOBJS_IMP +#ifndef _FDEPLUS +#include "../../../foxitlib.h" +class CFDE_GEFontMgr; +class CFDE_Path : public IFDE_Path, public CFX_Target +{ +public: + virtual void Release() + { + FDE_Delete this; + } + + virtual FX_BOOL StartFigure(); + virtual FX_BOOL CloseFigure(); + + virtual void AddBezier(const CFX_PointsF &points); + virtual void AddBeziers(const CFX_PointsF &points); + virtual void AddCurve(const CFX_PointsF &points, FX_BOOL bClosed, FX_FLOAT fTension = 0.5f); + virtual void AddEllipse(const CFX_RectF &rect); + virtual void AddLines(const CFX_PointsF &points); + virtual void AddLine(const CFX_PointF &pt1, const CFX_PointF &pt2); + virtual void AddPath(const IFDE_Path *pSrc, FX_BOOL bConnect); + virtual void AddPolygon(const CFX_PointsF &points); + virtual void AddRectangle(const CFX_RectF &rect); + virtual void GetBBox(CFX_RectF &bbox) const; + virtual void GetBBox(CFX_RectF &bbox, FX_FLOAT fLineWidth, FX_FLOAT fMiterLimit) const; + FX_PATHPOINT* AddPoints(FX_INT32 iCount); + FX_PATHPOINT* GetLastPoint(FX_INT32 iCount = 1) const; + FX_BOOL FigureClosed() const; + void MoveTo(FX_FLOAT fx, FX_FLOAT fy); + void LineTo(FX_FLOAT fx, FX_FLOAT fy); + void BezierTo(const CFX_PointF &p1, const CFX_PointF &p2, const CFX_PointF &p3); + void ArcTo(FX_BOOL bStart, const CFX_RectF &rect, FX_FLOAT startAngle, FX_FLOAT endAngle); + void MoveTo(const CFX_PointF &p0) + { + MoveTo(p0.x, p0.y); + } + void LineTo(const CFX_PointF &p1) + { + LineTo(p1.x, p1.y); + } + void GetCurveTangents(const CFX_PointsF &points, CFX_PointsF &tangents, FX_BOOL bClosed, FX_FLOAT fTension) const; + CFX_PathData m_Path; +}; +#endif +#endif diff --git a/xfa/src/fdp/src/fde/fde_iterator.cpp b/xfa/src/fdp/src/fde/fde_iterator.cpp new file mode 100644 index 0000000000..5f6e0aa7e8 --- /dev/null +++ b/xfa/src/fdp/src/fde/fde_iterator.cpp @@ -0,0 +1,101 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "fde_iterator.h" +IFDE_VisualSetIterator* IFDE_VisualSetIterator::Create() +{ + return FDE_New CFDE_VisualSetIterator; +} +CFDE_VisualSetIterator::CFDE_VisualSetIterator() + : m_dwFilter(0) +{ +} +CFDE_VisualSetIterator::~CFDE_VisualSetIterator() +{ + m_CanvasStack.RemoveAll(); +} +FX_BOOL CFDE_VisualSetIterator::AttachCanvas(IFDE_CanvasSet *pCanvas) +{ + FXSYS_assert(pCanvas != NULL); + m_CanvasStack.RemoveAll(); + FDE_CANVASITEM canvas; + canvas.hCanvas = NULL; + canvas.pCanvas = pCanvas; + canvas.hPos = pCanvas->GetFirstPosition(NULL); + if (canvas.hPos == NULL) { + return FALSE; + } + return m_CanvasStack.Push(canvas) == 0; +} +FX_BOOL CFDE_VisualSetIterator::FilterObjects(FX_DWORD dwObjects ) +{ + if (m_CanvasStack.GetSize() == 0) { + return FALSE; + } + while (m_CanvasStack.GetSize() > 1) { + m_CanvasStack.Pop(); + } + m_dwFilter = dwObjects & ~(FX_DWORD)FDE_VISUALOBJ_Widget; + if (dwObjects & FDE_VISUALOBJ_Widget) { + m_dwFilter |= 0xFF00; + } + FDE_LPCANVASITEM pCanvas = m_CanvasStack.GetTopElement(); + FXSYS_assert(pCanvas != NULL && pCanvas->pCanvas != NULL); + pCanvas->hPos = pCanvas->pCanvas->GetFirstPosition(NULL); + return pCanvas->hPos != NULL; +} +void CFDE_VisualSetIterator::Reset() +{ + FilterObjects(m_dwFilter); +} +FDE_HVISUALOBJ CFDE_VisualSetIterator::GetNext(IFDE_VisualSet *&pVisualSet, FDE_HVISUALOBJ *phCanvasObj , IFDE_CanvasSet **ppCanvasSet ) +{ + while (m_CanvasStack.GetSize() > 0) { + FDE_LPCANVASITEM pCanvas = m_CanvasStack.GetTopElement(); + FXSYS_assert(pCanvas != NULL && pCanvas->pCanvas != NULL); + if (pCanvas->hPos == NULL) { + if (m_CanvasStack.GetSize() == 1) { + break; + } + m_CanvasStack.Pop(); + continue; + } + do { + FDE_HVISUALOBJ hObj = pCanvas->pCanvas->GetNext(pCanvas->hCanvas, pCanvas->hPos, pVisualSet); + FXSYS_assert(hObj != NULL); + FDE_VISUALOBJTYPE eType = pVisualSet->GetType(); + if (eType == FDE_VISUALOBJ_Canvas) { + FDE_CANVASITEM canvas; + canvas.hCanvas = hObj; + canvas.pCanvas = (IFDE_CanvasSet*)pVisualSet; + canvas.hPos = canvas.pCanvas->GetFirstPosition(hObj); + m_CanvasStack.Push(canvas); + break; + } + FX_DWORD dwObj = (eType == FDE_VISUALOBJ_Widget) + ? (FX_DWORD)((IFDE_WidgetSet*)pVisualSet)->GetWidgetType(hObj) + : (FX_DWORD)eType; + if ((m_dwFilter & dwObj) != 0) { + if (ppCanvasSet) { + *ppCanvasSet = pCanvas->pCanvas; + } + if (phCanvasObj) { + *phCanvasObj = pCanvas->hCanvas; + } + return hObj; + } + } while (pCanvas->hPos != NULL); + } + if (ppCanvasSet) { + *ppCanvasSet = NULL; + } + if (phCanvasObj) { + *phCanvasObj = NULL; + } + pVisualSet = NULL; + return NULL; +} diff --git a/xfa/src/fdp/src/fde/fde_iterator.h b/xfa/src/fdp/src/fde/fde_iterator.h new file mode 100644 index 0000000000..6ebd5c566f --- /dev/null +++ b/xfa/src/fdp/src/fde/fde_iterator.h @@ -0,0 +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 _FDE_ITERATOR_IMP +#define _FDE_ITERATOR_IMP +typedef struct _FDE_CANVASITEM : public CFX_Target { + IFDE_CanvasSet *pCanvas; + FDE_HVISUALOBJ hCanvas; + FX_POSITION hPos; +} FDE_CANVASITEM, * FDE_LPCANVASITEM; +class CFDE_VisualSetIterator : public IFDE_VisualSetIterator, public CFX_Target +{ +public: + CFDE_VisualSetIterator(); + ~CFDE_VisualSetIterator(); + virtual void Release() + { + FDE_Delete this; + } + + virtual FX_BOOL AttachCanvas(IFDE_CanvasSet *pCanvas); + virtual FX_BOOL FilterObjects(FX_DWORD dwObjects = 0xFFFFFFFF); + + virtual void Reset(); + virtual FDE_HVISUALOBJ GetNext(IFDE_VisualSet *&pVisualSet, FDE_HVISUALOBJ *phCanvasObj = NULL, IFDE_CanvasSet **ppCanvasSet = NULL); +protected: + FX_DWORD m_dwFilter; + CFX_StackTemplate m_CanvasStack; +}; +#endif diff --git a/xfa/src/fdp/src/fde/fde_object.cpp b/xfa/src/fdp/src/fde/fde_object.cpp new file mode 100644 index 0000000000..d8a555a7bd --- /dev/null +++ b/xfa/src/fdp/src/fde/fde_object.cpp @@ -0,0 +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 + +#include "../../../foxitlib.h" +#include "fde_object.h" +IFDE_Pen* IFDE_Pen::Create() +{ + return FDE_New CFDE_Pen(); +} +IFDE_Brush* IFDE_Brush::Create(FX_INT32 iType) +{ + switch (iType) { + case FDE_BRUSHTYPE_Solid: + return FDE_New CFDE_SolidBrush; + case FDE_BRUSHTYPE_Hatch: + return FDE_New CFDE_HatchBrush; + case FDE_BRUSHTYPE_Texture: + return FDE_New CFDE_TextureBrush; + case FDE_BRUSHTYPE_LinearGradient: + return FDE_New CFDE_LinearBrush; + default: + return NULL; + } +} diff --git a/xfa/src/fdp/src/fde/fde_object.h b/xfa/src/fdp/src/fde/fde_object.h new file mode 100644 index 0000000000..553d77fb21 --- /dev/null +++ b/xfa/src/fdp/src/fde/fde_object.h @@ -0,0 +1,427 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FDE_BASEOBJECT_IMP +#define _FDE_BASEOBJECT_IMP +class CFDE_Pen : public IFDE_Pen, public CFX_Target +{ +public: + CFDE_Pen() + : m_Color(0) + , m_iLineCap(0) + , m_iLineJoin(0) + , m_iDashStyle(0) + , m_fDashPhase(0) + , m_fMiterLimit(10) + , m_bAutoRelease(FALSE) + , m_pBrush(NULL) + { + } + + ~CFDE_Pen() + { + if (m_pBrush && m_bAutoRelease) { + m_pBrush->Release(); + } + } + virtual void Release() + { + FDE_Delete this; + } + + virtual FX_INT32 GetType() const + { + return m_pBrush ? m_pBrush->GetType() : FDE_PENTYPE_SolidColor; + } + + virtual FX_ARGB GetColor() const + { + return m_Color; + } + virtual void SetColor(FX_ARGB color) + { + m_Color = color; + } + virtual IFDE_Brush* GetBrush() const + { + return m_pBrush; + } + virtual void SetBrush(IFDE_Brush *pBrush, FX_BOOL bAutoRelease) + { + m_bAutoRelease = bAutoRelease; + m_pBrush = pBrush; + if (m_pBrush && m_pBrush->GetType() == FDE_BRUSHTYPE_Solid) { + m_Color = ((IFDE_SolidBrush*)m_pBrush)->GetColor(); + } + } + virtual FX_INT32 GetLineCap() const + { + return m_iLineCap; + } + virtual void SetLineCap(FX_INT32 iLineCap) + { + m_iLineCap = iLineCap; + } + virtual FX_INT32 GetDashStyle() const + { + return m_iDashStyle; + } + virtual void SetDashStyle(FX_INT32 iDashStyle) + { + m_iDashStyle = iDashStyle; + } + virtual FX_FLOAT GetDashPhase() const + { + return m_fDashPhase; + } + virtual void SetDashPhase(FX_FLOAT fPhase) + { + m_fDashPhase = fPhase; + } + virtual FX_INT32 CountDashArray() const + { + return m_DashArray.GetSize(); + } + virtual FX_INT32 GetDashArray(CFX_FloatArray &dashArray) const + { + dashArray.Copy(m_DashArray); + return dashArray.GetSize(); + } + virtual void SetDashArray(const CFX_FloatArray &dashArray) + { + m_DashArray.Copy(dashArray); + } + virtual FX_INT32 GetLineJoin() const + { + return m_iLineJoin; + } + virtual void SetLineJoin(FX_INT32 iLineJoin) + { + m_iLineJoin = iLineJoin; + } + virtual FX_FLOAT GetMiterLimit() const + { + return m_fMiterLimit; + } + virtual void SetMiterLimit(FX_FLOAT fMiterLimit) + { + m_fMiterLimit = fMiterLimit; + } + virtual FX_INT32 CountCompoundPatterns() const + { + return m_CompoundPatterns.GetSize(); + } + virtual FX_BOOL GetCompoundPatterns(CFDE_CompoundPatterns &compoundPatterns) const + { + return compoundPatterns.Copy(m_CompoundPatterns), TRUE; + } + virtual FX_BOOL SetCompoundPatterns(const CFDE_CompoundPatterns &compoundPatterns) + { + return m_CompoundPatterns.Copy(compoundPatterns), TRUE; + } + + FX_ARGB m_Color; + FX_INT32 m_iLineCap; + FX_INT32 m_iLineJoin; + FX_INT32 m_iDashStyle; + FX_FLOAT m_fDashPhase; + FX_FLOAT m_fMiterLimit; + FX_BOOL m_bAutoRelease; + IFDE_Brush *m_pBrush; + CFX_FloatArray m_DashArray; + CFDE_CompoundPatterns m_CompoundPatterns; +}; +class CFDE_SolidBrush : public IFDE_SolidBrush, public CFX_Target +{ +public: + CFDE_SolidBrush() : m_Color(0xFF000000) + { + m_Matrix.Reset(); + } + + virtual void Release() + { + FDE_Delete this; + } + virtual FX_INT32 GetType() const + { + return FDE_BRUSHTYPE_Solid; + } + virtual const CFX_Matrix& GetMatrix() const + { + return m_Matrix; + } + virtual void ResetMatrix() + { + m_Matrix.Reset(); + } + virtual void TranslateMatrix(FX_FLOAT dx, FX_FLOAT dy) + { + m_Matrix.Translate(dx, dy); + } + virtual void RotateMatrix(FX_FLOAT fRadian) + { + m_Matrix.Rotate(fRadian); + } + virtual void ScaleMatrix(FX_FLOAT sx, FX_FLOAT sy) + { + m_Matrix.Scale(sx, sy); + } + virtual void ConcatMatrix(const CFX_Matrix &matrix) + { + m_Matrix.Concat(matrix); + } + virtual void SetMatrix(const CFX_Matrix &matrix) + { + m_Matrix = matrix; + } + virtual FX_ARGB GetColor() const + { + return m_Color; + } + virtual void SetColor(FX_ARGB color) + { + m_Color = color; + } + + FX_ARGB m_Color; + CFX_Matrix m_Matrix; +}; +class CFDE_HatchBrush : public IFDE_HatchBrush, public CFX_Target +{ +public: + CFDE_HatchBrush() : m_iStyle(-1), m_BackColor(0), m_ForeColor(0) + { + m_Matrix.Reset(); + } + + virtual void Release() + { + FDE_Delete this; + } + virtual FX_INT32 GetType() const + { + return FDE_BRUSHTYPE_Hatch; + } + virtual const CFX_Matrix& GetMatrix() const + { + return m_Matrix; + } + virtual void ResetMatrix() + { + m_Matrix.Reset(); + } + virtual void TranslateMatrix(FX_FLOAT dx, FX_FLOAT dy) + { + m_Matrix.Translate(dx, dy); + } + virtual void RotateMatrix(FX_FLOAT fRadian) + { + m_Matrix.Rotate(fRadian); + } + virtual void ScaleMatrix(FX_FLOAT sx, FX_FLOAT sy) + { + m_Matrix.Scale(sx, sy); + } + virtual void ConcatMatrix(const CFX_Matrix &matrix) + { + m_Matrix.Concat(matrix); + } + virtual void SetMatrix(const CFX_Matrix &matrix) + { + m_Matrix = matrix; + } + virtual FX_ARGB GetColor(FX_BOOL bForegroundColor) const + { + return bForegroundColor ? m_ForeColor : m_BackColor; + } + virtual void SetColor(FX_ARGB color, FX_BOOL bForegroundColor) + { + if (bForegroundColor) { + m_ForeColor = color; + } else { + m_BackColor = color; + } + } + + virtual FX_INT32 GetHatchStyle() const + { + return m_iStyle; + }; + virtual FX_BOOL SetHatchStyle(FX_INT32 iHatchStyle) + { + m_iStyle = iHatchStyle; + return m_iStyle >= FDE_HATCHSTYLE_Min && m_iStyle <= FDE_HATCHSTYLE_Max; + } + FX_INT32 m_iStyle; + FX_ARGB m_BackColor; + FX_ARGB m_ForeColor; + CFX_Matrix m_Matrix; +}; +class CFDE_TextureBrush : public IFDE_TextureBrush, public CFX_Target +{ +public: + CFDE_TextureBrush() + : m_iWrap(0) + , m_pImage(NULL) + , m_bAutoRelease(FALSE) + { + m_Matrix.Reset(); + } + + virtual void Release() + { + FDE_Delete this; + } + virtual FX_INT32 GetType() const + { + return FDE_BRUSHTYPE_Texture; + } + virtual const CFX_Matrix& GetMatrix() const + { + return m_Matrix; + } + virtual void ResetMatrix() + { + m_Matrix.Reset(); + } + virtual void TranslateMatrix(FX_FLOAT dx, FX_FLOAT dy) + { + m_Matrix.Translate(dx, dy); + } + virtual void RotateMatrix(FX_FLOAT fRadian) + { + m_Matrix.Rotate(fRadian); + } + virtual void ScaleMatrix(FX_FLOAT sx, FX_FLOAT sy) + { + m_Matrix.Scale(sx, sy); + } + virtual void ConcatMatrix(const CFX_Matrix &matrix) + { + m_Matrix.Concat(matrix); + } + virtual void SetMatrix(const CFX_Matrix &matrix) + { + m_Matrix = matrix; + } + virtual IFDE_Image* GetImage() const + { + return m_pImage; + } + virtual void SetImage(IFDE_Image *pImage, FX_BOOL bAutoRelease) + { + m_pImage = pImage; + m_bAutoRelease = bAutoRelease; + } + virtual FX_INT32 GetWrapMode() const + { + return m_iWrap; + } + virtual void SetWrapMode(FX_INT32 iWrapMode) + { + m_iWrap = iWrapMode; + } + FX_INT32 m_iWrap; + IFDE_Image *m_pImage; + FX_BOOL m_bAutoRelease; + CFX_Matrix m_Matrix; +}; +class CFDE_LinearBrush : public IFDE_LinearGradientBrush, public CFX_Target +{ +public: + CFDE_LinearBrush() : m_EndColor(0), m_StartColor(0), m_iWrapMode(0) + { + m_StartPoint.x = m_StartPoint.y = m_EndPoint.x = m_EndPoint.y = 0; + m_Matrix.Reset(); + } + + virtual void Release() + { + FDE_Delete this; + } + virtual FX_INT32 GetType() const + { + return FDE_BRUSHTYPE_LinearGradient; + } + virtual const CFX_Matrix& GetMatrix() const + { + return m_Matrix; + } + virtual void ResetMatrix() + { + m_Matrix.Reset(); + } + virtual void TranslateMatrix(FX_FLOAT dx, FX_FLOAT dy) + { + m_Matrix.Translate(dx, dy); + } + virtual void RotateMatrix(FX_FLOAT fRadian) + { + m_Matrix.Rotate(fRadian); + } + virtual void ScaleMatrix(FX_FLOAT sx, FX_FLOAT sy) + { + m_Matrix.Scale(sx, sy); + } + virtual void ConcatMatrix(const CFX_Matrix &matrix) + { + m_Matrix.Concat(matrix); + } + virtual void SetMatrix(const CFX_Matrix &matrix) + { + m_Matrix = matrix; + } + virtual void GetLinearPoints(CFX_PointF &startingPoint, CFX_PointF &endingPoint) const + { + startingPoint = m_StartPoint; + endingPoint = m_EndPoint; + } + virtual void SetLinearPoints(const CFX_PointF &startingPoint, const CFX_PointF &endingPoint) + { + m_StartPoint = startingPoint; + m_EndPoint = endingPoint; + } + virtual void GetLinearColors(FX_ARGB &startingColor, FX_ARGB &endingColor) const + { + startingColor = m_StartColor; + endingColor = m_EndColor; + } + virtual void SetLinearColors(const FX_ARGB &startingColor, const FX_ARGB &endingColor) + { + m_StartColor = startingColor; + m_EndColor = endingColor; + } + virtual FX_INT32 CountGradientColors() const + { + return m_GradColors.GetSize(); + } + virtual FX_BOOL GetGradientColors(CFDE_GradientColors &colors) const + { + return colors.Copy(m_GradColors), TRUE; + } + virtual FX_BOOL SetGradientColors(const CFDE_GradientColors &colors) + { + return m_GradColors.Copy(colors), TRUE; + } + + virtual FX_INT32 GetWrapMode() const + { + return m_iWrapMode; + } + virtual void SetWrapMode(FX_INT32 iWrapMode) + { + m_iWrapMode = iWrapMode; + } + CFX_PointF m_EndPoint; + CFX_PointF m_StartPoint; + FX_ARGB m_EndColor; + FX_ARGB m_StartColor; + CFDE_GradientColors m_GradColors; + FX_INT32 m_iWrapMode; + CFX_Matrix m_Matrix; +}; +#endif diff --git a/xfa/src/fdp/src/fde/fde_render.cpp b/xfa/src/fdp/src/fde/fde_render.cpp new file mode 100644 index 0000000000..e8e9149e02 --- /dev/null +++ b/xfa/src/fdp/src/fde/fde_render.cpp @@ -0,0 +1,253 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "fde_render.h" +void FDE_GetPageMatrix(CFX_Matrix &pageMatrix, const CFX_RectF &docPageRect, const CFX_Rect &devicePageRect, FX_INT32 iRotate, FX_DWORD dwCoordinatesType) +{ + FXSYS_assert(iRotate >= 0 && iRotate <= 3); + FX_BOOL bFlipX = (dwCoordinatesType & 0x01) != 0; + FX_BOOL bFlipY = (dwCoordinatesType & 0x02) != 0; + CFX_Matrix m; + m.Set((bFlipX ? -1.0f : 1.0f), 0, 0, (bFlipY ? -1.0f : 1.0f), 0, 0); + if (iRotate == 0 || iRotate == 2) { + m.a *= (FX_FLOAT)devicePageRect.width / docPageRect.width; + m.d *= (FX_FLOAT)devicePageRect.height / docPageRect.height; + } else { + m.a *= (FX_FLOAT)devicePageRect.height / docPageRect.width; + m.d *= (FX_FLOAT)devicePageRect.width / docPageRect.height; + } + m.Rotate(iRotate * 1.57079632675f); + switch (iRotate) { + case 0: + m.e = bFlipX ? (FX_FLOAT)devicePageRect.right() : (FX_FLOAT)devicePageRect.left; + m.f = bFlipY ? (FX_FLOAT)devicePageRect.bottom() : (FX_FLOAT)devicePageRect.top; + break; + case 1: + m.e = bFlipY ? (FX_FLOAT)devicePageRect.left : (FX_FLOAT)devicePageRect.right(); + m.f = bFlipX ? (FX_FLOAT)devicePageRect.bottom() : (FX_FLOAT)devicePageRect.top; + break; + case 2: + m.e = bFlipX ? (FX_FLOAT)devicePageRect.left : (FX_FLOAT)devicePageRect.right(); + m.f = bFlipY ? (FX_FLOAT)devicePageRect.top : (FX_FLOAT)devicePageRect.bottom(); + break; + case 3: + m.e = bFlipY ? (FX_FLOAT)devicePageRect.right() : (FX_FLOAT)devicePageRect.left; + m.f = bFlipX ? (FX_FLOAT)devicePageRect.top : (FX_FLOAT)devicePageRect.bottom(); + break; + default: + break; + } + pageMatrix = m; +} +IFDE_RenderContext* IFDE_RenderContext::Create() +{ + return FDE_New CFDE_RenderContext; +} +CFDE_RenderContext::CFDE_RenderContext() + : CFX_ThreadLock() + , m_eStatus(FDE_RENDERSTATUS_Reset) + , m_pRenderDevice(NULL) + , m_pSolidBrush(NULL) + , m_Transform() + , m_pCharPos(NULL) + , m_iCharPosCount(0) + , m_pIterator(NULL) +{ + m_Transform.Reset(); +} +CFDE_RenderContext::~CFDE_RenderContext() +{ + StopRender(); +} +FX_BOOL CFDE_RenderContext::StartRender(IFDE_RenderDevice *pRenderDevice, IFDE_CanvasSet *pCanvasSet, const CFX_Matrix &tmDoc2Device ) +{ + if (m_pRenderDevice != NULL) { + return FALSE; + } + if (pRenderDevice == NULL) { + return FALSE; + } + if (pCanvasSet == NULL) { + return FALSE; + } + Lock(); + m_eStatus = FDE_RENDERSTATUS_Paused; + m_pRenderDevice = pRenderDevice; + m_Transform = tmDoc2Device; + if (m_pIterator == NULL) { + m_pIterator = IFDE_VisualSetIterator::Create(); + FXSYS_assert(m_pIterator != NULL); + } + FX_BOOL bAttach = m_pIterator->AttachCanvas(pCanvasSet) && m_pIterator->FilterObjects(); + Unlock(); + return bAttach; +} +FDE_RENDERSTATUS CFDE_RenderContext::DoRender(IFX_Pause *pPause) +{ + if (m_pRenderDevice == NULL) { + return FDE_RENDERSTATUS_Failed; + } + if (m_pIterator == NULL) { + return FDE_RENDERSTATUS_Failed; + } + Lock(); + FDE_RENDERSTATUS eStatus = FDE_RENDERSTATUS_Paused; + CFX_Matrix rm; + rm.SetReverse(m_Transform); + CFX_RectF rtDocClip = m_pRenderDevice->GetClipRect(); + if (rtDocClip.IsEmpty()) { + rtDocClip.left = rtDocClip.top = 0; + rtDocClip.width = (FX_FLOAT)m_pRenderDevice->GetWidth(); + rtDocClip.height = (FX_FLOAT)m_pRenderDevice->GetHeight(); + } + rm.TransformRect(rtDocClip); + IFDE_VisualSet *pVisualSet; + FDE_HVISUALOBJ hVisualObj; + CFX_RectF rtObj; + FX_INT32 iCount = 0; + while(TRUE) { + hVisualObj = m_pIterator->GetNext(pVisualSet); + if (hVisualObj == NULL || pVisualSet == NULL) { + eStatus = FDE_RENDERSTATUS_Done; + break; + } + rtObj.Empty(); + pVisualSet->GetRect(hVisualObj, rtObj); + if (!rtDocClip.IntersectWith(rtObj)) { + continue; + } + switch (pVisualSet->GetType()) { + case FDE_VISUALOBJ_Text: + RenderText((IFDE_TextSet*)pVisualSet, hVisualObj); + iCount += 5; + break; + case FDE_VISUALOBJ_Path: + RenderPath((IFDE_PathSet*)pVisualSet, hVisualObj); + iCount += 20; + break; + case FDE_VISUALOBJ_Widget: + iCount += 10; + break; + case FDE_VISUALOBJ_Canvas: + FXSYS_assert(FALSE); + break; + default: + break; + } + if (iCount >= 100 && pPause != NULL && pPause->NeedToPauseNow()) { + eStatus = FDE_RENDERSTATUS_Paused; + break; + } + } + Unlock(); + return m_eStatus = eStatus; +} +void CFDE_RenderContext::StopRender() +{ + Lock(); + m_eStatus = FDE_RENDERSTATUS_Reset; + m_pRenderDevice = NULL; + m_Transform.Reset(); + if (m_pIterator != NULL) { + m_pIterator->Release(); + m_pIterator = NULL; + } + if (m_pSolidBrush != NULL) { + m_pSolidBrush->Release(); + m_pSolidBrush = NULL; + } + if (m_pCharPos != NULL) { + FDE_Free(m_pCharPos); + m_pCharPos = NULL; + } + m_iCharPosCount = 0; + Unlock(); +} +void CFDE_RenderContext::RenderText(IFDE_TextSet *pTextSet, FDE_HVISUALOBJ hText) +{ + FXSYS_assert(m_pRenderDevice != NULL); + FXSYS_assert(pTextSet != NULL && hText != NULL); + IFX_Font *pFont = pTextSet->GetFont(hText); + if (pFont == NULL) { + return; + } + FX_INT32 iCount = pTextSet->GetDisplayPos(hText, NULL, FALSE); + if (iCount < 1) { + return; + } + if (m_pSolidBrush == NULL) { + m_pSolidBrush = (IFDE_SolidBrush*)IFDE_Brush::Create(FDE_BRUSHTYPE_Solid); + if (m_pSolidBrush == NULL) { + return; + } + } + if (m_pCharPos == NULL) { + m_pCharPos = (FXTEXT_CHARPOS*)FDE_Alloc(sizeof(FXTEXT_CHARPOS) * iCount); + } else if (m_iCharPosCount < iCount) { + m_pCharPos = (FXTEXT_CHARPOS*)FDE_Realloc(m_pCharPos, sizeof(FXTEXT_CHARPOS) * iCount); + } + if (m_iCharPosCount < iCount) { + m_iCharPosCount = iCount; + } + iCount = pTextSet->GetDisplayPos(hText, m_pCharPos, FALSE); + FX_FLOAT fFontSize = pTextSet->GetFontSize(hText); + FX_ARGB dwColor = pTextSet->GetFontColor(hText); + m_pSolidBrush->SetColor(dwColor); + FDE_HDEVICESTATE hState; + FX_BOOL bClip = ApplyClip(pTextSet, hText, hState); + m_pRenderDevice->DrawString(m_pSolidBrush, pFont, m_pCharPos, iCount, fFontSize, &m_Transform); + if (bClip) { + RestoreClip(hState); + } +} +void CFDE_RenderContext::RenderPath(IFDE_PathSet *pPathSet, FDE_HVISUALOBJ hPath) +{ + FXSYS_assert(m_pRenderDevice != NULL); + FXSYS_assert(pPathSet != NULL && hPath != NULL); + IFDE_Path *pPath = pPathSet->GetPath(hPath); + if (pPath == NULL) { + return; + } + FDE_HDEVICESTATE hState; + FX_BOOL bClip = ApplyClip(pPathSet, hPath, hState); + FX_INT32 iRenderMode = pPathSet->GetRenderMode(hPath); + if (iRenderMode & FDE_PATHRENDER_Stroke) { + IFDE_Pen *pPen = pPathSet->GetPen(hPath); + FX_FLOAT fWidth = pPathSet->GetPenWidth(hPath); + if (pPen != NULL && fWidth > 0) { + m_pRenderDevice->DrawPath(pPen, fWidth, pPath, &m_Transform); + } + } + if (iRenderMode & FDE_PATHRENDER_Fill) { + IFDE_Brush *pBrush = pPathSet->GetBrush(hPath); + if (pBrush != NULL) { + m_pRenderDevice->FillPath(pBrush, pPath, &m_Transform); + } + } + if (bClip) { + RestoreClip(hState); + } +} +FX_BOOL CFDE_RenderContext::ApplyClip(IFDE_VisualSet *pVisualSet, FDE_HVISUALOBJ hObj, FDE_HDEVICESTATE &hState) +{ + CFX_RectF rtClip; + if (!pVisualSet->GetClip(hObj, rtClip)) { + return FALSE; + } + CFX_RectF rtObj; + pVisualSet->GetRect(hObj, rtObj); + rtClip.Offset(rtObj.left, rtObj.top); + m_Transform.TransformRect(rtClip); + const CFX_RectF &rtDevClip = m_pRenderDevice->GetClipRect(); + rtClip.Intersect(rtDevClip); + hState = m_pRenderDevice->SaveState(); + return m_pRenderDevice->SetClipRect(rtClip); +} +void CFDE_RenderContext::RestoreClip(FDE_HDEVICESTATE hState) +{ + m_pRenderDevice->RestoreState(hState); +} diff --git a/xfa/src/fdp/src/fde/fde_render.h b/xfa/src/fdp/src/fde/fde_render.h new file mode 100644 index 0000000000..909987a032 --- /dev/null +++ b/xfa/src/fdp/src/fde/fde_render.h @@ -0,0 +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 _FDE_RENDER_IMP +#define _FDE_RENDER_IMP +class CFDE_RenderContext; +class CFDE_RenderContext : public IFDE_RenderContext, public CFX_ThreadLock, public CFX_Target +{ +public: + CFDE_RenderContext(); + virtual ~CFDE_RenderContext(); + virtual void Release() + { + FDE_Delete this; + } + virtual FX_BOOL StartRender(IFDE_RenderDevice *pRenderDevice, + IFDE_CanvasSet *pCanvasSet, + const CFX_Matrix &tmDoc2Device + ); + virtual FDE_RENDERSTATUS GetStatus() const + { + return m_eStatus; + } + virtual FDE_RENDERSTATUS DoRender(IFX_Pause *pPause = NULL); + virtual void StopRender(); + void RenderPath(IFDE_PathSet *pPathSet, FDE_HVISUALOBJ hPath); + void RenderText(IFDE_TextSet *pTextSet, FDE_HVISUALOBJ hText); + FX_BOOL ApplyClip(IFDE_VisualSet *pVisualSet, FDE_HVISUALOBJ hObj, FDE_HDEVICESTATE &hState); + void RestoreClip(FDE_HDEVICESTATE hState); +protected: + FDE_RENDERSTATUS m_eStatus; + IFDE_RenderDevice *m_pRenderDevice; + IFDE_SolidBrush *m_pSolidBrush; + CFX_Matrix m_Transform; + FXTEXT_CHARPOS *m_pCharPos; + FX_INT32 m_iCharPosCount; + IFDE_VisualSetIterator *m_pIterator; +}; +#endif diff --git a/xfa/src/fdp/src/tto/fde_textout.cpp b/xfa/src/fdp/src/tto/fde_textout.cpp new file mode 100644 index 0000000000..e03620244f --- /dev/null +++ b/xfa/src/fdp/src/tto/fde_textout.cpp @@ -0,0 +1,952 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "fde_textout.h" +IFDE_TextOut* IFDE_TextOut::Create() +{ + return FDE_New CFDE_TextOut; +} +CFDE_TextOut::CFDE_TextOut() + : m_pFont(NULL) + , m_fFontSize(12.0f) + , m_fLineSpace(m_fFontSize) + , m_fLinePos(0.0f) + , m_fTolerance(0.0f) + , m_iAlignment(0) + , m_iTxtBkAlignment(0) + , m_pCharWidths(NULL) + , m_iChars(0) + , m_pEllCharWidths(NULL) + , m_iEllChars(0) + , m_wParagraphBkChar(L'\n') + , m_TxtColor(0xFF000000) + , m_dwStyles(0) + , m_dwTxtBkStyles(0) + , m_bElliChanged(FALSE) + , m_iEllipsisWidth(0) + , m_ttoLines(5) + , m_iCurLine(0) + , m_iTotalLines(0) + , m_iCurPiece(0) + , m_pCharPos(NULL) + , m_iCharPosSize(0) + , m_pRenderDevice(NULL) +{ + m_pTxtBreak = IFX_TxtBreak::Create(FX_TXTBREAKPOLICY_None); + FXSYS_assert(m_pTxtBreak != NULL); + m_Matrix.Reset(); + m_rtClip.Reset(); + m_rtLogicClip.Reset(); +} +CFDE_TextOut::~CFDE_TextOut() +{ + if (m_pTxtBreak != NULL) { + m_pTxtBreak->Release(); + } + if (m_pCharWidths != NULL) { + FDE_Free(m_pCharWidths); + } + if (m_pEllCharWidths != NULL) { + FDE_Free(m_pEllCharWidths); + } + if (m_pRenderDevice != NULL) { + m_pRenderDevice->Release(); + } + if (m_pCharPos != NULL) { + FDE_Free(m_pCharPos); + } + m_ttoLines.RemoveAll(); +} +void CFDE_TextOut::SetFont(IFX_Font *pFont) +{ + FXSYS_assert(pFont != NULL); + m_pFont = pFont; + m_pTxtBreak->SetFont(pFont); +} +void CFDE_TextOut::SetFontSize(FX_FLOAT fFontSize) +{ + FXSYS_assert(fFontSize > 0); + m_fFontSize = fFontSize; + m_pTxtBreak->SetFontSize(fFontSize); +} +void CFDE_TextOut::SetTextColor(FX_ARGB color) +{ + m_TxtColor = color; +} +void CFDE_TextOut::SetStyles(FX_DWORD dwStyles) +{ + m_dwStyles = dwStyles; + m_dwTxtBkStyles = 0; + if (dwStyles & FDE_TTOSTYLE_SingleLine) { + m_dwTxtBkStyles |= FX_TXTLAYOUTSTYLE_SingleLine; + } + if (dwStyles & FDE_TTOSTYLE_ExpandTab) { + m_dwTxtBkStyles |= FX_TXTLAYOUTSTYLE_ExpandTab; + } + if (dwStyles & FDE_TTOSTYLE_ArabicShapes) { + m_dwTxtBkStyles |= FX_TXTLAYOUTSTYLE_ArabicShapes; + } + if (dwStyles & FDE_TTOSTYLE_RTL) { + m_dwTxtBkStyles |= FX_TXTLAYOUTSTYLE_RTLReadingOrder; + } + if (dwStyles & FDE_TTOSTYLE_ArabicContext) { + m_dwTxtBkStyles |= FX_TXTLAYOUTSTYLE_ArabicContext; + } + if (dwStyles & FDE_TTOSTYLE_VerticalLayout) { + m_dwTxtBkStyles |= (FX_TXTLAYOUTSTYLE_VerticalChars | FX_TXTLAYOUTSTYLE_VerticalLayout); + } + m_pTxtBreak->SetLayoutStyles(m_dwTxtBkStyles); +} +void CFDE_TextOut::SetTabWidth(FX_FLOAT fTabWidth) +{ + FXSYS_assert(fTabWidth > 1.0f); + m_pTxtBreak->SetTabWidth(fTabWidth, FALSE); +} +void CFDE_TextOut::SetEllipsisString(const CFX_WideString &wsEllipsis) +{ + m_bElliChanged = TRUE; + m_wsEllipsis = wsEllipsis; +} +void CFDE_TextOut::SetParagraphBreakChar(FX_WCHAR wch) +{ + m_wParagraphBkChar = wch; + m_pTxtBreak->SetParagraphBreakChar(wch); +} +void CFDE_TextOut::SetAlignment(FX_INT32 iAlignment) +{ + m_iAlignment = iAlignment; + switch (m_iAlignment) { + case FDE_TTOALIGNMENT_TopCenter: + case FDE_TTOALIGNMENT_Center: + case FDE_TTOALIGNMENT_BottomCenter: + m_iTxtBkAlignment = FX_TXTLINEALIGNMENT_Center; + break; + case FDE_TTOALIGNMENT_TopRight: + case FDE_TTOALIGNMENT_CenterRight: + case FDE_TTOALIGNMENT_BottomRight: + m_iTxtBkAlignment = FX_TXTLINEALIGNMENT_Right; + break; + default: + m_iTxtBkAlignment = FX_TXTLINEALIGNMENT_Left; + break; + } + m_pTxtBreak->SetAlignment(m_iTxtBkAlignment); +} +void CFDE_TextOut::SetLineSpace(FX_FLOAT fLineSpace) +{ + FXSYS_assert(fLineSpace > 1.0f); + m_fLineSpace = fLineSpace; +} +void CFDE_TextOut::SetDIBitmap(CFX_DIBitmap *pDIB) +{ + FXSYS_assert(pDIB != NULL); + if (m_pRenderDevice != NULL) { + m_pRenderDevice->Release(); + } + m_pRenderDevice = IFDE_RenderDevice::Create(pDIB); +} +void CFDE_TextOut::SetRenderDevice(CFX_RenderDevice *pDevice) +{ + FXSYS_assert(pDevice != NULL); + if (m_pRenderDevice != NULL) { + m_pRenderDevice->Release(); + } + m_pRenderDevice = IFDE_RenderDevice::Create(pDevice); +} +void CFDE_TextOut::SetClipRect(const CFX_Rect &rtClip) +{ + m_rtClip.Set((FX_FLOAT)rtClip.left, (FX_FLOAT)rtClip.top, (FX_FLOAT)rtClip.Width(), (FX_FLOAT)rtClip.Height()); +} +void CFDE_TextOut::SetClipRect(const CFX_RectF &rtClip) +{ + m_rtClip = rtClip; +} +void CFDE_TextOut::SetLogicClipRect(const CFX_RectF &rtClip) +{ + m_rtLogicClip = rtClip; +} +void CFDE_TextOut::SetMatrix(const CFX_Matrix &matrix) +{ + m_Matrix = matrix; +} +void CFDE_TextOut::SetLineBreakTolerance(FX_FLOAT fTolerance) +{ + m_fTolerance = fTolerance; + m_pTxtBreak->SetLineBreakTolerance(m_fTolerance); +} +FX_INT32 CFDE_TextOut::GetTotalLines() +{ + return m_iTotalLines; +} +void CFDE_TextOut::CalcSize(FX_LPCWSTR pwsStr, FX_INT32 iLength, CFX_Size &size) +{ + CFX_RectF rtText; + rtText.Set(0.0f, 0.0f, (FX_FLOAT)size.x, (FX_FLOAT)size.y); + CalcSize(pwsStr, iLength, rtText); + size.x = (FX_INT32)rtText.Width(); + size.y = (FX_INT32)rtText.Height(); +} +void CFDE_TextOut::CalcSize(FX_LPCWSTR pwsStr, FX_INT32 iLength, CFX_SizeF &size) +{ + CFX_RectF rtText; + rtText.Set(0.0f, 0.0f, size.x, size.y); + CalcSize(pwsStr, iLength, rtText); + size.x = rtText.Width(); + size.y = rtText.Height(); +} +void CFDE_TextOut::CalcSize(FX_LPCWSTR pwsStr, FX_INT32 iLength, CFX_Rect &rect) +{ + CFX_RectF rtText; + rtText.Set((FX_FLOAT)rect.left, (FX_FLOAT)rect.top, (FX_FLOAT)rect.Width(), (FX_FLOAT)rect.Height()); + CalcSize(pwsStr, iLength, rtText); + rect.Set((FX_INT32)rtText.left, (FX_INT32)rtText.top, (FX_INT32)rtText.Width(), (FX_INT32)rtText.Height()); +} +void CFDE_TextOut::CalcSize(FX_LPCWSTR pwsStr, FX_INT32 iLength, CFX_RectF &rect) +{ + if (pwsStr == NULL || iLength < 1) { + rect.width = 0.0f; + rect.height = 0.0f; + } else { + CFX_Matrix rm; + rm.SetReverse(m_Matrix); + rm.TransformRect(rect); + CalcTextSize(pwsStr, iLength, rect); + m_Matrix.TransformRect(rect); + } +} +void CFDE_TextOut::CalcLogicSize(FX_LPCWSTR pwsStr, FX_INT32 iLength, CFX_SizeF &size) +{ + CFX_RectF rtText; + rtText.Set(0.0f, 0.0f, size.x, size.y); + CalcLogicSize(pwsStr, iLength, rtText); + size.x = rtText.Width(); + size.y = rtText.Height(); +} +void CFDE_TextOut::CalcLogicSize(FX_LPCWSTR pwsStr, FX_INT32 iLength, CFX_RectF &rect) +{ + if (pwsStr == NULL || iLength < 1) { + rect.width = 0.0f; + rect.height = 0.0f; + } else { + CalcTextSize(pwsStr, iLength, rect); + } +} +void CFDE_TextOut::CalcTextSize(FX_LPCWSTR pwsStr, FX_INT32 iLength, CFX_RectF &rect) +{ + FXSYS_assert(m_pFont != NULL && m_fFontSize >= 1.0f); + SetLineWidth(rect); + m_iTotalLines = 0; + FX_LPCWSTR pStr = pwsStr; + FX_BOOL bHotKey = (m_dwStyles & FDE_TTOSTYLE_HotKey) ? TRUE : FALSE; + FX_BOOL bVertical = (m_dwStyles & FDE_TTOSTYLE_VerticalLayout) ? TRUE : FALSE; + FX_FLOAT fWidth = 0.0f; + FX_FLOAT fHeight = 0.0f; + FX_FLOAT fStartPos = bVertical ? rect.bottom() : rect.right(); + FX_DWORD dwBreakStatus = 0; + FX_WCHAR wPreChar = 0; + FX_WCHAR wch; + FX_WCHAR wBreak = 0; + while (iLength-- > 0) { + wch = *pStr++; + if (wBreak == 0 && (wch == L'\n' || wch == L'\r')) { + wBreak = wch; + m_pTxtBreak->SetParagraphBreakChar(wch); + } + if (bHotKey && wch == L'&' && wPreChar != L'&') { + wPreChar = wch; + continue; + } + dwBreakStatus = m_pTxtBreak->AppendChar(wch); + if (dwBreakStatus > FX_TXTBREAK_PieceBreak) { + RetrieveLineWidth(dwBreakStatus, fStartPos, fWidth, fHeight); + } + wPreChar = 0; + } + dwBreakStatus = m_pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak); + if (dwBreakStatus > FX_TXTBREAK_PieceBreak) { + RetrieveLineWidth(dwBreakStatus, fStartPos, fWidth, fHeight); + } + m_pTxtBreak->Reset(); + FX_FLOAT fInc = rect.Height() - fHeight; + if (bVertical) { + fInc = rect.Width() - fHeight; + } + if (m_iAlignment >= FDE_TTOALIGNMENT_CenterLeft && m_iAlignment < FDE_TTOALIGNMENT_BottomLeft) { + fInc /= 2.0f; + } else if (m_iAlignment < FDE_TTOALIGNMENT_CenterLeft) { + fInc = 0.0f; + } + if (bVertical) { + rect.top += fStartPos; + rect.left += fInc; + rect.width = fHeight; + rect.height = FX_MIN(fWidth, rect.Height()); + } else { + rect.left += fStartPos; + rect.top += fInc; + rect.width = FX_MIN(fWidth, rect.Width()); + rect.height = fHeight; + if (m_dwStyles & FDE_TTOSTYLE_LastLineHeight) { + rect.height -= m_fLineSpace - m_fFontSize; + } + } +} +void CFDE_TextOut::SetLineWidth(CFX_RectF &rect) +{ + if ((m_dwStyles & FDE_TTOSTYLE_SingleLine) == 0) { + FX_FLOAT fLineWidth = 0.0f; + if (m_dwStyles & FDE_TTOSTYLE_VerticalLayout) { + if (rect.Height() < 1.0f) { + rect.height = m_fFontSize * 1000.0f; + } + fLineWidth = rect.Height(); + } else { + if (rect.Width() < 1.0f) { + rect.width = m_fFontSize * 1000.0f; + } + fLineWidth = rect.Width(); + } + m_pTxtBreak->SetLineWidth(fLineWidth); + } +} +FX_BOOL CFDE_TextOut::RetrieveLineWidth(FX_DWORD dwBreakStatus, FX_FLOAT &fStartPos, FX_FLOAT &fWidth, FX_FLOAT &fHeight) +{ + if (dwBreakStatus <= FX_TXTBREAK_PieceBreak) { + return FALSE; + } + FX_FLOAT fLineStep = (m_fLineSpace > m_fFontSize) ? m_fLineSpace : m_fFontSize; + FX_BOOL bLineWrap = (m_dwStyles & FDE_TTOSTYLE_LineWrap) ? TRUE : FALSE; + FX_FLOAT fLineWidth = 0.0f; + FX_INT32 iCount = m_pTxtBreak->CountBreakPieces(); + for (FX_INT32 i = 0; i < iCount; i++) { + const CFX_TxtPiece *pPiece = m_pTxtBreak->GetBreakPiece(i); + fLineWidth += (FX_FLOAT)pPiece->m_iWidth / 20000.0f; + fStartPos = FX_MIN(fStartPos, (FX_FLOAT)pPiece->m_iStartPos / 20000.0f); + } + m_pTxtBreak->ClearBreakPieces(); + if (dwBreakStatus == FX_TXTBREAK_ParagraphBreak) { + m_pTxtBreak->Reset(); + } + if (!bLineWrap && dwBreakStatus == FX_TXTBREAK_LineBreak) { + fWidth += fLineWidth; + } else { + fWidth = FX_MAX(fWidth, fLineWidth); + fHeight += fLineStep; + } + m_iTotalLines++; + return TRUE; +} +void CFDE_TextOut::DrawText(FX_LPCWSTR pwsStr, FX_INT32 iLength, FX_INT32 x, FX_INT32 y) +{ + CFX_RectF rtText; + rtText.Set((FX_FLOAT)x, (FX_FLOAT)y, m_fFontSize * 1000.0f, m_fFontSize * 1000.0f); + DrawText(pwsStr, iLength, rtText); +} +void CFDE_TextOut::DrawText(FX_LPCWSTR pwsStr, FX_INT32 iLength, FX_FLOAT x, FX_FLOAT y) +{ + CFX_RectF rtText; + rtText.Set(x, y, m_fFontSize * 1000.0f, m_fFontSize * 1000.0f); + DrawText(pwsStr, iLength, rtText); +} +void CFDE_TextOut::DrawText(FX_LPCWSTR pwsStr, FX_INT32 iLength, const CFX_Rect &rect) +{ + CFX_RectF rtText; + rtText.Set((FX_FLOAT)rect.left, (FX_FLOAT)rect.top, (FX_FLOAT)rect.width, (FX_FLOAT)rect.height); + DrawText(pwsStr, iLength, rtText); +} +void CFDE_TextOut::DrawText(FX_LPCWSTR pwsStr, FX_INT32 iLength, const CFX_RectF &rect) +{ + CFX_RectF rtText; + rtText.Set(rect.left, rect.top, rect.width, rect.height); + CFX_Matrix rm; + rm.SetReverse(m_Matrix); + rm.TransformRect(rtText); + DrawText(pwsStr, iLength, rtText, m_rtClip); +} +void CFDE_TextOut::DrawLogicText(FX_LPCWSTR pwsStr, FX_INT32 iLength, FX_FLOAT x, FX_FLOAT y) +{ + CFX_RectF rtText; + rtText.Set(x, y, m_fFontSize * 1000.0f, m_fFontSize * 1000.0f); + DrawLogicText(pwsStr, iLength, rtText); +} +void CFDE_TextOut::DrawLogicText(FX_LPCWSTR pwsStr, FX_INT32 iLength, const CFX_RectF &rect) +{ + CFX_RectF rtClip; + rtClip.Set(m_rtLogicClip.left, m_rtLogicClip.top, m_rtLogicClip.width, m_rtLogicClip.height); + m_Matrix.TransformRect(rtClip); + DrawText(pwsStr, iLength, rect, rtClip); +} +void CFDE_TextOut::DrawText(FX_LPCWSTR pwsStr, FX_INT32 iLength, const CFX_RectF &rect, const CFX_RectF &rtClip) +{ + FXSYS_assert(m_pFont != NULL && m_fFontSize >= 1.0f); + if (pwsStr == NULL || iLength < 1) { + return; + } + if (rect.width < m_fFontSize || rect.height < m_fFontSize) { + return; + } + FX_FLOAT fLineWidth = rect.width; + if (m_dwStyles & FDE_TTOSTYLE_VerticalLayout) { + fLineWidth = rect.height; + } + m_pTxtBreak->SetLineWidth(fLineWidth); + m_ttoLines.RemoveAll(TRUE); + m_wsText.Empty(); + LoadText(pwsStr, iLength, rect); + if (m_dwStyles & FDE_TTOSTYLE_Ellipsis) { + ReplaceWidthEllipsis(); + } + Reload(rect); + DoAlignment(rect); + OnDraw(rtClip); +} +void CFDE_TextOut::ExpandBuffer(FX_INT32 iSize, FX_INT32 iType) +{ + switch (iType) { + case 0: + if (m_pCharWidths == NULL) { + m_pCharWidths = (FX_INT32*)FDE_Alloc(iSize * sizeof(FX_INT32)); + m_iChars = iSize; + } else if (m_iChars < iSize) { + m_pCharWidths = (FX_INT32*)FDE_Realloc(m_pCharWidths, iSize * sizeof(FX_INT32)); + m_iChars = iSize; + } + FXSYS_memset(m_pCharWidths, 0, iSize); + break; + case 1: + if (m_pEllCharWidths == NULL) { + m_pEllCharWidths = (FX_INT32*)FDE_Alloc(iSize * sizeof(FX_INT32)); + m_iEllChars = iSize; + } else if (m_iEllChars < iSize) { + m_pEllCharWidths = (FX_INT32*)FDE_Realloc(m_pEllCharWidths, iSize * sizeof(FX_INT32)); + m_iEllChars = iSize; + } + FXSYS_memset(m_pEllCharWidths, 0, iSize); + break; + case 2: + if (m_pCharPos == NULL) { + m_pCharPos = (FXTEXT_CHARPOS*)FDE_Alloc(iSize * sizeof(FXTEXT_CHARPOS)); + m_iCharPosSize = iSize; + } else if (m_iCharPosSize < iSize) { + m_pCharPos = (FXTEXT_CHARPOS*)FDE_Realloc(m_pCharPos, iSize * sizeof(FXTEXT_CHARPOS)); + m_iCharPosSize = iSize; + } + break; + } +} +void CFDE_TextOut::LoadEllipsis() +{ + if (!m_bElliChanged) { + return; + } + m_bElliChanged = FALSE; + m_iEllipsisWidth = 0; + FX_INT32 iLength = m_wsEllipsis.GetLength(); + if (iLength < 1) { + return; + } + ExpandBuffer(iLength, 1); + FX_LPCWSTR pStr = (FX_LPCWSTR)m_wsEllipsis; + FX_INT32 *pCharWidths = m_pEllCharWidths; + FX_DWORD dwBreakStatus; + FX_WCHAR wch; + while (iLength-- > 0) { + wch = *pStr++; + dwBreakStatus = m_pTxtBreak->AppendChar(wch); + if (dwBreakStatus > FX_TXTBREAK_PieceBreak) { + RetrieveEllPieces(pCharWidths); + } + } + dwBreakStatus = m_pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak); + if (dwBreakStatus > FX_TXTBREAK_PieceBreak) { + RetrieveEllPieces(pCharWidths); + } + m_pTxtBreak->Reset(); +} +void CFDE_TextOut::RetrieveEllPieces(FX_INT32 *&pCharWidths) +{ + FX_INT32 iCount = m_pTxtBreak->CountBreakPieces(); + CFX_Char *pTC; + for (FX_INT32 i = 0; i < iCount; i++) { + const CFX_TxtPiece *pPiece = m_pTxtBreak->GetBreakPiece(i); + FX_INT32 iPieceChars = pPiece->GetLength(); + for (FX_INT32 j = 0; j < iPieceChars; j++) { + pTC = pPiece->GetCharPtr(j); + if (pTC->m_iCharWidth <= 0) { + *pCharWidths = 0; + } else { + *pCharWidths = pTC->m_iCharWidth; + } + m_iEllipsisWidth += *pCharWidths; + pCharWidths++; + } + } + m_pTxtBreak->ClearBreakPieces(); +} +void CFDE_TextOut::LoadText(FX_LPCWSTR pwsStr, FX_INT32 iLength, const CFX_RectF &rect) +{ + FX_LPWSTR pStr = m_wsText.GetBuffer(iLength); + FX_INT32 iTxtLength = iLength; + ExpandBuffer(iTxtLength, 0); + FX_BOOL bHotKey = (m_dwStyles & FDE_TTOSTYLE_HotKey) ? TRUE : FALSE; + FX_BOOL bVertical = (m_dwStyles & FDE_TTOSTYLE_VerticalLayout) ? TRUE : FALSE; + FX_BOOL bLineWrap = (m_dwStyles & FDE_TTOSTYLE_LineWrap) ? TRUE : FALSE; + FX_FLOAT fLineStep = (m_fLineSpace > m_fFontSize) ? m_fLineSpace : m_fFontSize; + FX_FLOAT fLineStop = bVertical ? rect.left : rect.bottom(); + m_fLinePos = bVertical ? rect.right() : rect.top; + if (bVertical) { + fLineStep = -fLineStep; + } + m_hotKeys.RemoveAll(); + FX_INT32 iStartChar = 0; + FX_INT32 iChars = 0; + FX_INT32 iPieceWidths = 0; + FX_DWORD dwBreakStatus; + FX_WCHAR wch; + FX_BOOL bRet = FALSE; + while (iTxtLength-- > 0) { + wch = *pwsStr++; + if (wch == L'&' && bHotKey && (pStr - 1) != NULL && *(pStr - 1) != L'&') { + if (iTxtLength > 0) { + m_hotKeys.Add(iChars); + } + continue; + } + *pStr++ = wch; + iChars++; + dwBreakStatus = m_pTxtBreak->AppendChar(wch); + if (dwBreakStatus > FX_TXTBREAK_PieceBreak) { + FX_BOOL bEndofLine = RetriecePieces(dwBreakStatus, iStartChar, iPieceWidths, FALSE, rect); + if (bEndofLine && (bLineWrap || (dwBreakStatus > FX_TXTBREAK_LineBreak && !bLineWrap))) { + iPieceWidths = 0; + m_iCurLine++; + m_fLinePos += fLineStep; + } + if ((bVertical && m_fLinePos + fLineStep < fLineStop) || (!bVertical && m_fLinePos + fLineStep > fLineStop)) { + FX_INT32 iCurLine = m_iCurLine; + if (bEndofLine) { + iCurLine--; + } + CFDE_TTOLine *pLine = m_ttoLines.GetPtrAt(iCurLine); + pLine->m_bNewReload = TRUE; + bRet = TRUE; + break; + } + } + } + dwBreakStatus = m_pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak); + if (dwBreakStatus > FX_TXTBREAK_PieceBreak && !bRet) { + RetriecePieces(dwBreakStatus, iStartChar, iPieceWidths, FALSE, rect); + } + m_pTxtBreak->ClearBreakPieces(); + m_pTxtBreak->Reset(); + m_wsText.ReleaseBuffer(iLength); +} +FX_BOOL CFDE_TextOut::RetriecePieces(FX_DWORD dwBreakStatus, FX_INT32 &iStartChar, FX_INT32 &iPieceWidths, FX_BOOL bReload, + const CFX_RectF &rect) +{ + FX_BOOL bSingleLine = (m_dwStyles & FDE_TTOSTYLE_SingleLine) ? TRUE : FALSE; + FX_BOOL bLineWrap = (m_dwStyles & FDE_TTOSTYLE_LineWrap) ? TRUE : FALSE; + FX_BOOL bVertical = (m_dwStyles & FDE_TTOSTYLE_VerticalLayout) ? TRUE : FALSE; + FX_FLOAT fLineStep = (m_fLineSpace > m_fFontSize) ? m_fLineSpace : m_fFontSize; + if (bVertical) { + fLineStep = -fLineStep; + } + CFX_Char *pTC = NULL; + FX_BOOL bNeedReload = FALSE; + FX_FLOAT fLineWidth = bVertical ? rect.Height() : rect.Width(); + FX_INT32 iLineWidth = FXSYS_round(fLineWidth * 20000.0f); + FX_INT32 iCount = m_pTxtBreak->CountBreakPieces(); + for (FX_INT32 i = 0; i < iCount; i++) { + const CFX_TxtPiece *pPiece = m_pTxtBreak->GetBreakPiece(i); + FX_INT32 iPieceChars = pPiece->GetLength(); + FX_INT32 iChar = iStartChar; + FX_INT32 iWidth = 0; + FX_INT32 j = 0; + for (; j < iPieceChars; j++) { + pTC = pPiece->GetCharPtr(j); + FX_INT32 iCurCharWidth = pTC->m_iCharWidth > 0 ? pTC->m_iCharWidth : 0; + if (bSingleLine || !bLineWrap) { + if (iLineWidth - iPieceWidths - iWidth < iCurCharWidth) { + bNeedReload = TRUE; + break; + } + } + iWidth += iCurCharWidth; + m_pCharWidths[iChar++] = iCurCharWidth; + } + if (j == 0 && !bReload) { + CFDE_TTOLine *pLine = m_ttoLines.GetPtrAt(m_iCurLine); + pLine->m_bNewReload = TRUE; + } else if (j > 0) { + CFX_RectF rtPiece; + if (bVertical) { + rtPiece.left = m_fLinePos; + rtPiece.top = rect.top + (FX_FLOAT)pPiece->m_iStartPos / 20000.0f; + rtPiece.width = fLineStep; + rtPiece.height = iWidth / 20000.0f; + } else { + rtPiece.left = rect.left + (FX_FLOAT)pPiece->m_iStartPos / 20000.0f; + rtPiece.top = m_fLinePos; + rtPiece.width = iWidth / 20000.0f; + rtPiece.height = fLineStep; + } + FDE_TTOPIECE ttoPiece; + ttoPiece.iStartChar = iStartChar; + ttoPiece.iChars = j; + ttoPiece.rtPiece = rtPiece; + ttoPiece.dwCharStyles = pPiece->m_dwCharStyles; + if (FX_IsOdd(pPiece->m_iBidiLevel)) { + ttoPiece.dwCharStyles |= FX_TXTCHARSTYLE_OddBidiLevel; + } + AppendPiece(ttoPiece, bNeedReload, (bReload && i == iCount - 1)); + } + iStartChar += iPieceChars; + iPieceWidths += iWidth; + } + m_pTxtBreak->ClearBreakPieces(); + FX_BOOL bRet = bSingleLine || bLineWrap || (!bLineWrap && bNeedReload) || dwBreakStatus == FX_TXTBREAK_ParagraphBreak; + return bRet; +} +void CFDE_TextOut::AppendPiece(const FDE_TTOPIECE &ttoPiece, FX_BOOL bNeedReload, FX_BOOL bEnd) +{ + if (m_iCurLine >= m_ttoLines.GetSize()) { + CFDE_TTOLine ttoLine; + ttoLine.m_bNewReload = bNeedReload; + m_iCurPiece = ttoLine.AddPiece(m_iCurPiece, ttoPiece); + m_iCurLine = m_ttoLines.Add(ttoLine); + } else { + CFDE_TTOLine *pLine = m_ttoLines.GetPtrAt(m_iCurLine); + pLine->m_bNewReload = bNeedReload; + m_iCurPiece = pLine->AddPiece(m_iCurPiece, ttoPiece); + if (bEnd) { + FX_INT32 iPieces = pLine->GetSize(); + if (m_iCurPiece < iPieces) { + pLine->RemoveLast(iPieces - m_iCurPiece - 1); + } + } + } + if (!bEnd && bNeedReload) { + m_iCurPiece = 0; + } +} +void CFDE_TextOut::ReplaceWidthEllipsis() +{ + LoadEllipsis(); + FX_INT32 iLength = m_wsEllipsis.GetLength(); + if (iLength < 1) { + return; + } + FX_INT32 iLines = m_ttoLines.GetSize(); + for (FX_INT32 i = 0; i < iLines; i++) { + CFDE_TTOLine *pLine = m_ttoLines.GetPtrAt(i); + if (!pLine->m_bNewReload) { + continue; + } + FX_INT32 iEllipsisCharIndex = iLength - 1; + FX_INT32 iCharWidth = 0; + FX_INT32 iCharCount = 0; + FX_INT32 iPiece = pLine->GetSize(); + while (iPiece-- > 0) { + FDE_LPTTOPIECE pPiece = pLine->GetPtrAt(iPiece); + if (pPiece == NULL) { + break; + } + for (FX_INT32 j = pPiece->iChars - 1; j >= 0; j--) { + if (iEllipsisCharIndex < 0) { + break; + } + FX_INT32 index = pPiece->iStartChar + j; + iCharWidth += m_pCharWidths[index]; + iCharCount++; + if (iCharCount <= iLength) { + m_wsText.SetAt(index, m_wsEllipsis.GetAt(iEllipsisCharIndex)); + m_pCharWidths[index] = m_pEllCharWidths[iEllipsisCharIndex]; + } else if (iCharWidth <= m_iEllipsisWidth) { + m_wsText.SetAt(index, 0); + m_pCharWidths[index] = 0; + } + iEllipsisCharIndex--; + } + if (iEllipsisCharIndex < 0) { + break; + } + } + } +} +void CFDE_TextOut::Reload(const CFX_RectF &rect) +{ + FX_INT32 iCount = m_ttoLines.GetSize(); + for (FX_INT32 i = 0; i < iCount; i++) { + CFDE_TTOLine *pLine = m_ttoLines.GetPtrAt(i); + if (pLine == NULL || !pLine->m_bNewReload) { + continue; + } + m_iCurLine = i; + m_iCurPiece = 0; + ReloadLinePiece(pLine, rect); + } +} +void CFDE_TextOut::ReloadLinePiece(CFDE_TTOLine *pLine, const CFX_RectF &rect) +{ + FX_LPCWSTR pwsStr = (FX_LPCWSTR)m_wsText; + FX_BOOL bVertical = (m_dwStyles & FDE_TTOSTYLE_VerticalLayout) ? TRUE : FALSE; + FX_INT32 iPieceWidths = 0; + FDE_LPTTOPIECE pPiece = pLine->GetPtrAt(0); + FX_INT32 iStartChar = pPiece->iStartChar; + m_fLinePos = bVertical ? pPiece->rtPiece.left : pPiece->rtPiece.top; + FX_INT32 iPieceCount = pLine->GetSize(); + FX_INT32 iPieceIndex = 0; + FX_DWORD dwBreakStatus = 0; + FX_WCHAR wch; + while (iPieceIndex < iPieceCount) { + FX_INT32 iStar = iStartChar; + FX_INT32 iEnd = pPiece->iChars + iStar; + while (iStar < iEnd) { + wch = *(pwsStr + iStar); + dwBreakStatus = m_pTxtBreak->AppendChar(wch); + if (dwBreakStatus > FX_TXTBREAK_PieceBreak) { + RetriecePieces(dwBreakStatus, iStartChar, iPieceWidths, TRUE, rect); + } + iStar++; + } + iPieceIndex++; + pPiece = pLine->GetPtrAt(iPieceIndex); + } + dwBreakStatus = m_pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak); + if (dwBreakStatus > FX_TXTBREAK_PieceBreak) { + RetriecePieces(dwBreakStatus, iStartChar, iPieceWidths, TRUE, rect); + } + m_pTxtBreak->Reset(); +} +void CFDE_TextOut::DoAlignment(const CFX_RectF &rect) +{ + FX_BOOL bVertical = (m_dwStyles & FDE_TTOSTYLE_VerticalLayout) ? TRUE : FALSE; + FX_FLOAT fLineStopS = bVertical ? rect.right() : rect.bottom(); + FX_INT32 iLines = m_ttoLines.GetSize(); + if (iLines < 1) { + return; + } + CFDE_TTOLine *pLine = m_ttoLines.GetPtrAt(iLines - 1); + FDE_LPTTOPIECE pPiece = pLine->GetPtrAt(0); + if (pPiece == NULL) { + return; + } + FX_FLOAT fLineStopD = bVertical ? pPiece->rtPiece.right() : pPiece->rtPiece.bottom(); + FX_FLOAT fInc = fLineStopS - fLineStopD; + if (m_iAlignment >= FDE_TTOALIGNMENT_CenterLeft && m_iAlignment < FDE_TTOALIGNMENT_BottomLeft) { + fInc /= 2.0f; + } else if (m_iAlignment < FDE_TTOALIGNMENT_CenterLeft) { + fInc = 0.0f; + } + if (fInc < 1.0f) { + return; + } + for (FX_INT32 i = 0; i < iLines; i++) { + CFDE_TTOLine *pLine = m_ttoLines.GetPtrAt(i); + FX_INT32 iPieces = pLine->GetSize(); + for (FX_INT32 j = 0; j < iPieces; j++) { + FDE_LPTTOPIECE pPiece = pLine->GetPtrAt(j); + if (bVertical) { + pPiece->rtPiece.left += fInc; + } else { + pPiece->rtPiece.top += fInc; + } + } + } +} +void CFDE_TextOut::OnDraw(const CFX_RectF &rtClip) +{ + if (m_pRenderDevice == NULL) { + return; + } + FX_INT32 iLines = m_ttoLines.GetSize(); + if (iLines < 1) { + return; + } + IFDE_SolidBrush *pBrush = (IFDE_SolidBrush*)IFDE_Brush::Create(FDE_BRUSHTYPE_Solid); + pBrush->SetColor(m_TxtColor); + IFDE_Pen *pPen = NULL; + FDE_HDEVICESTATE hDev = m_pRenderDevice->SaveState(); + if (rtClip.Width() > 0.0f && rtClip.Height() > 0.0f) { + m_pRenderDevice->SetClipRect(rtClip); + } + for (FX_INT32 i = 0; i < iLines; i++) { + CFDE_TTOLine *pLine = m_ttoLines.GetPtrAt(i); + FX_INT32 iPieces = pLine->GetSize(); + for (FX_INT32 j = 0; j < iPieces; j++) { + FDE_LPTTOPIECE pPiece = pLine->GetPtrAt(j); + if (pPiece == NULL) { + continue; + } + FX_INT32 iCount = GetDisplayPos(pPiece); + if (iCount > 0) { + m_pRenderDevice->DrawString(pBrush, m_pFont, m_pCharPos, iCount, m_fFontSize, &m_Matrix); + } + DrawLine(pPiece, pPen); + } + } + m_pRenderDevice->RestoreState(hDev); + if (pBrush) { + pBrush->Release(); + } + if (pPen) { + pPen->Release(); + } +} +FX_INT32 CFDE_TextOut::GetDisplayPos(FDE_LPTTOPIECE pPiece) +{ + FX_TXTRUN tr; + ToTextRun(pPiece, tr); + ExpandBuffer(tr.iLength, 2); + return m_pTxtBreak->GetDisplayPos(&tr, m_pCharPos); +} +FX_INT32 CFDE_TextOut::GetCharRects(FDE_LPTTOPIECE pPiece) +{ + FX_TXTRUN tr; + ToTextRun(pPiece, tr); + m_rectArray.RemoveAll(); + return m_pTxtBreak->GetCharRects(&tr, m_rectArray); +} +void CFDE_TextOut::ToTextRun(const FDE_LPTTOPIECE pPiece, FX_TXTRUN &tr) +{ + tr.pAccess = NULL; + tr.pIdentity = NULL; + tr.pStr = (FX_LPCWSTR)m_wsText + pPiece->iStartChar; + tr.pWidths = m_pCharWidths + pPiece->iStartChar; + tr.iLength = pPiece->iChars; + tr.pFont = m_pFont; + tr.fFontSize = m_fFontSize; + tr.dwStyles = m_dwTxtBkStyles; + tr.iCharRotation = 0; + tr.dwCharStyles = pPiece->dwCharStyles; + tr.wLineBreakChar = m_wParagraphBkChar; + tr.pRect = &pPiece->rtPiece; +} +void CFDE_TextOut::DrawLine(const FDE_LPTTOPIECE pPiece, IFDE_Pen *&pPen) +{ + FX_BOOL bUnderLine = (m_dwStyles & FDE_TTOSTYLE_Underline) ? TRUE : FALSE; + FX_BOOL bStrikeOut = (m_dwStyles & FDE_TTOSTYLE_Strikeout) ? TRUE : FALSE; + FX_BOOL bHotKey = (m_dwStyles & FDE_TTOSTYLE_HotKey) ? TRUE : FALSE; + FX_BOOL bVertical = (m_dwStyles & FDE_TTOSTYLE_VerticalLayout) ? TRUE : FALSE; + if (!bUnderLine && !bStrikeOut && !bHotKey) { + return; + } + if (pPen == NULL) { + pPen = IFDE_Pen::Create(); + pPen->SetColor(m_TxtColor); + } + IFDE_Path *pPath = IFDE_Path::Create(); + FX_INT32 iLineCount = 0; + CFX_RectF rtText = pPiece->rtPiece; + CFX_PointF pt1, pt2; + if (bUnderLine) { + if (bVertical) { + pt1.x = rtText.left; + pt1.y = rtText.top; + pt2.x = rtText.left; + pt2.y = rtText.bottom(); + } else { + pt1.x = rtText.left; + pt1.y = rtText.bottom(); + pt2.x = rtText.right(); + pt2.y = rtText.bottom(); + } + pPath->AddLine(pt1, pt2); + iLineCount++; + } + if (bStrikeOut) { + if (bVertical) { + pt1.x = rtText.left + rtText.width * 2.0f / 5.0f; + pt1.y = rtText.top;; + pt2.x = pt1.x; + pt2.y = rtText.bottom(); + } else { + pt1.x = rtText.left; + pt1.y = rtText.bottom() - rtText.height * 2.0f / 5.0f; + pt2.x = rtText.right(); + pt2.y = pt1.y; + } + pPath->AddLine(pt1, pt2); + iLineCount++; + } + if (bHotKey) { + FX_INT32 iHotKeys = m_hotKeys.GetSize(); + FX_INT32 iCount = GetCharRects(pPiece); + if (iCount > 0) { + for (FX_INT32 i = 0; i < iHotKeys; i++) { + FX_INT32 iCharIndex = m_hotKeys.GetAt(i); + if (iCharIndex >= pPiece->iStartChar && iCharIndex < pPiece->iStartChar + pPiece->iChars) { + CFX_RectF rect = m_rectArray.GetAt(iCharIndex - pPiece->iStartChar); + if (bVertical) { + pt1.x = rect.left; + pt1.y = rect.top; + pt2.x = rect.left; + pt2.y = rect.bottom(); + } else { + pt1.x = rect.left; + pt1.y = rect.bottom(); + pt2.x = rect.right(); + pt2.y = rect.bottom(); + } + pPath->AddLine(pt1, pt2); + iLineCount++; + } + } + } + } + if (iLineCount > 0) { + m_pRenderDevice->DrawPath(pPen, 1, pPath, &m_Matrix); + } + pPath->Release(); +} +CFDE_TTOLine::CFDE_TTOLine() + : m_bNewReload(FALSE) + , m_pieces(5) + , m_iPieceCount(0) +{ +} +CFDE_TTOLine::CFDE_TTOLine(const CFDE_TTOLine &ttoLine) + : m_pieces(5) +{ + m_bNewReload = ttoLine.m_bNewReload; + m_iPieceCount = ttoLine.m_iPieceCount; + m_pieces.Copy(ttoLine.m_pieces); +} +CFDE_TTOLine::~CFDE_TTOLine() +{ +} +FX_INT32 CFDE_TTOLine::AddPiece(FX_INT32 index, const FDE_TTOPIECE &ttoPiece) +{ + if (index >= m_iPieceCount) { + index = m_pieces.Add(ttoPiece) + 1; + m_iPieceCount++; + } else { + FDE_TTOPIECE &piece = m_pieces.GetAt(index); + piece = ttoPiece; + } + return index; +} +FX_INT32 CFDE_TTOLine::GetSize() const +{ + return m_iPieceCount; +} +FDE_LPTTOPIECE CFDE_TTOLine::GetPtrAt(FX_INT32 index) +{ + if (index >= m_iPieceCount) { + return NULL; + } + return m_pieces.GetPtrAt(index); +} +void CFDE_TTOLine::RemoveLast(FX_INT32 iCount) +{ + m_pieces.RemoveLast(iCount); +} +void CFDE_TTOLine::RemoveAll(FX_BOOL bLeaveMemory) +{ + m_pieces.RemoveAll(bLeaveMemory); +} diff --git a/xfa/src/fdp/src/tto/fde_textout.h b/xfa/src/fdp/src/tto/fde_textout.h new file mode 100644 index 0000000000..116ad89d5d --- /dev/null +++ b/xfa/src/fdp/src/tto/fde_textout.h @@ -0,0 +1,132 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FDE_TEXTOUT_IMP +#define _FDE_TEXTOUT_IMP +struct FDE_TTOPIECE { +public: + FX_INT32 iStartChar; + FX_INT32 iChars; + FX_DWORD dwCharStyles; + CFX_RectF rtPiece; +}; +typedef FDE_TTOPIECE * FDE_LPTTOPIECE; +typedef CFX_MassArrayTemplate CFDE_TTOPieceArray; +class CFDE_TTOLine : public CFX_Target +{ +public: + CFDE_TTOLine(); + CFDE_TTOLine(const CFDE_TTOLine &ttoLine); + ~CFDE_TTOLine(); + FX_INT32 AddPiece(FX_INT32 index, const FDE_TTOPIECE &ttoPiece); + FX_INT32 GetSize() const; + FDE_LPTTOPIECE GetPtrAt(FX_INT32 index); + void RemoveLast(FX_INT32 iCount); + void RemoveAll(FX_BOOL bLeaveMemory); + FX_BOOL m_bNewReload; + CFDE_TTOPieceArray m_pieces; +protected: + FX_INT32 m_iPieceCount; +}; +typedef CFX_ObjectMassArrayTemplate CFDE_TTOLineArray; +class CFDE_TextOut : public IFDE_TextOut, public CFX_Target +{ +public: + CFDE_TextOut(); + ~CFDE_TextOut(); + virtual void Release() + { + FDE_Delete this; + } + virtual void SetFont(IFX_Font *pFont); + virtual void SetFontSize(FX_FLOAT fFontSize); + virtual void SetTextColor(FX_ARGB color); + virtual void SetStyles(FX_DWORD dwStyles); + virtual void SetTabWidth(FX_FLOAT fTabWidth); + virtual void SetEllipsisString(const CFX_WideString &wsEllipsis); + virtual void SetParagraphBreakChar(FX_WCHAR wch); + virtual void SetAlignment(FX_INT32 iAlignment); + virtual void SetLineSpace(FX_FLOAT fLineSpace); + virtual void SetDIBitmap(CFX_DIBitmap *pDIB); + virtual void SetRenderDevice(CFX_RenderDevice *pDevice); + virtual void SetClipRect(const CFX_Rect &rtClip); + virtual void SetClipRect(const CFX_RectF &rtClip); + virtual void SetMatrix(const CFX_Matrix &matrix); + virtual void SetLineBreakTolerance(FX_FLOAT fTolerance); + virtual void CalcSize(FX_LPCWSTR pwsStr, FX_INT32 iLength, CFX_Size &size); + virtual void CalcSize(FX_LPCWSTR pwsStr, FX_INT32 iLength, CFX_SizeF &size); + virtual void CalcSize(FX_LPCWSTR pwsStr, FX_INT32 iLength, CFX_Rect &rect); + virtual void CalcSize(FX_LPCWSTR pwsStr, FX_INT32 iLength, CFX_RectF &rect); + + virtual void DrawText(FX_LPCWSTR pwsStr, FX_INT32 iLength, FX_INT32 x, FX_INT32 y); + virtual void DrawText(FX_LPCWSTR pwsStr, FX_INT32 iLength, FX_FLOAT x, FX_FLOAT y); + virtual void DrawText(FX_LPCWSTR pwsStr, FX_INT32 iLength, const CFX_Rect &rect); + virtual void DrawText(FX_LPCWSTR pwsStr, FX_INT32 iLength, const CFX_RectF &rect); + + virtual void SetLogicClipRect(const CFX_RectF &rtClip); + virtual void CalcLogicSize(FX_LPCWSTR pwsStr, FX_INT32 iLength, CFX_SizeF &size); + virtual void CalcLogicSize(FX_LPCWSTR pwsStr, FX_INT32 iLength, CFX_RectF &rect); + virtual void DrawLogicText(FX_LPCWSTR pwsStr, FX_INT32 iLength, FX_FLOAT x, FX_FLOAT y); + virtual void DrawLogicText(FX_LPCWSTR pwsStr, FX_INT32 iLength, const CFX_RectF &rect); + virtual FX_INT32 GetTotalLines(); +protected: + void CalcTextSize(FX_LPCWSTR pwsStr, FX_INT32 iLength, CFX_RectF &rect); + FX_BOOL RetrieveLineWidth(FX_DWORD dwBreakStatus, FX_FLOAT &fStartPos, FX_FLOAT &fWidth, FX_FLOAT &fHeight); + void SetLineWidth(CFX_RectF &rect); + void DrawText(FX_LPCWSTR pwsStr, FX_INT32 iLength, const CFX_RectF &rect, const CFX_RectF &rtClip); + void LoadText(FX_LPCWSTR pwsStr, FX_INT32 iLength, const CFX_RectF &rect); + void LoadEllipsis(); + void ExpandBuffer(FX_INT32 iSize, FX_INT32 iType); + void RetrieveEllPieces(FX_INT32 *&pCharWidths); + + void Reload(const CFX_RectF &rect); + void ReloadLinePiece(CFDE_TTOLine *pLine, const CFX_RectF &rect); + FX_BOOL RetriecePieces(FX_DWORD dwBreakStatus, FX_INT32 &iStartChar, FX_INT32 &iPieceWidths, FX_BOOL bReload, const CFX_RectF &rect); + void AppendPiece(const FDE_TTOPIECE &ttoPiece, FX_BOOL bNeedReload, FX_BOOL bEnd); + void ReplaceWidthEllipsis(); + void DoAlignment(const CFX_RectF &rect); + void OnDraw(const CFX_RectF &rtClip); + FX_INT32 GetDisplayPos(FDE_LPTTOPIECE pPiece); + FX_INT32 GetCharRects(FDE_LPTTOPIECE pPiece); + + void ToTextRun(const FDE_LPTTOPIECE pPiece, FX_TXTRUN &tr); + void DrawLine(const FDE_LPTTOPIECE pPiece, IFDE_Pen *&pPen); + + IFX_TxtBreak *m_pTxtBreak; + IFX_Font *m_pFont; + FX_FLOAT m_fFontSize; + FX_FLOAT m_fLineSpace; + FX_FLOAT m_fLinePos; + FX_FLOAT m_fTolerance; + + FX_INT32 m_iAlignment; + FX_INT32 m_iTxtBkAlignment; + FX_INT32 *m_pCharWidths; + FX_INT32 m_iChars; + FX_INT32 *m_pEllCharWidths; + FX_INT32 m_iEllChars; + FX_WCHAR m_wParagraphBkChar; + FX_ARGB m_TxtColor; + FX_DWORD m_dwStyles; + FX_DWORD m_dwTxtBkStyles; + CFX_WideString m_wsEllipsis; + FX_BOOL m_bElliChanged; + FX_INT32 m_iEllipsisWidth; + CFX_WideString m_wsText; + CFX_RectF m_rtClip; + CFX_RectF m_rtLogicClip; + CFX_Matrix m_Matrix; + CFDE_TTOLineArray m_ttoLines; + FX_INT32 m_iCurLine; + FX_INT32 m_iCurPiece; + FX_INT32 m_iTotalLines; + FXTEXT_CHARPOS *m_pCharPos; + FX_INT32 m_iCharPosSize; + IFDE_RenderDevice *m_pRenderDevice; + CFX_Int32Array m_hotKeys; + CFX_RectFArray m_rectArray; +}; +#endif diff --git a/xfa/src/fdp/src/xml/fde_xml.cpp b/xfa/src/fdp/src/xml/fde_xml.cpp new file mode 100644 index 0000000000..3ee4b4028c --- /dev/null +++ b/xfa/src/fdp/src/xml/fde_xml.cpp @@ -0,0 +1,2712 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "fde_xml.h" +#ifdef __cplusplus +extern "C" { +#endif +#define FDE_XMLVALIDCHARRANGENUM 5 +static FX_WCHAR g_XMLValidCharRange[FDE_XMLVALIDCHARRANGENUM][2] = {{0x09, 0x09}, {0x0A, 0x0A}, {0x0D, 0x0D}, {0x20, 0xD7FF}, {0xE000, 0xFFFD}}; +FX_BOOL FDE_IsXMLValidChar(FX_WCHAR ch) +{ + FX_INT32 iStart = 0, iEnd = FDE_XMLVALIDCHARRANGENUM - 1, iMid; + while (iStart <= iEnd) { + iMid = (iStart + iEnd) / 2; + if (ch < g_XMLValidCharRange[iMid][0]) { + iEnd = iMid - 1; + } else if (ch > g_XMLValidCharRange[iMid][1]) { + iStart = iMid + 1; + } else { + return TRUE; + } + } + return FALSE; +} +FX_BOOL FDE_IsXMLWhiteSpace(FX_WCHAR ch) +{ + return ch == L' ' || ch == 0x0A || ch == 0x0D || ch == 0x09; +} +typedef struct _FDE_XMLNAMECHAR { + FX_WCHAR wStart; + FX_WCHAR wEnd; + FX_BOOL bStartChar; +} FDE_XMLNAMECHAR; +#define FDE_XMLNAMECHARSNUM 20 +static FDE_XMLNAMECHAR g_XMLNameChars[FDE_XMLNAMECHARSNUM] = { + {L'-', L'.', FALSE}, {L'0', L'9', FALSE}, {L':', L':', FALSE}, {L'A', L'Z', TRUE}, + {L'_', L'_', TRUE}, {L'a', L'z', TRUE}, {0xB7, 0xB7, FALSE}, {0xC0, 0xD6, TRUE}, + {0xD8, 0xF6, TRUE}, {0xF8, 0x02FF, TRUE}, {0x0300, 0x036F, FALSE}, {0x0370, 0x037D, TRUE}, + {0x037F, 0x1FFF, TRUE}, {0x200C, 0x200D, TRUE}, {0x203F, 0x2040, FALSE}, {0x2070, 0x218F, TRUE}, + {0x2C00, 0x2FEF, TRUE}, {0x3001, 0xD7FF, TRUE}, {0xF900, 0xFDCF, TRUE}, {0xFDF0, 0xFFFD, TRUE}, +}; +FX_BOOL FDE_IsXMLNameChar(FX_WCHAR ch, FX_BOOL bFirstChar) +{ + FX_INT32 iStart = 0, iEnd = FDE_XMLNAMECHARSNUM - 1, iMid; + while (iStart <= iEnd) { + iMid = (iStart + iEnd) / 2; + if (ch < g_XMLNameChars[iMid].wStart) { + iEnd = iMid - 1; + } else if (ch > g_XMLNameChars[iMid].wEnd) { + iStart = iMid + 1; + } else { + if (bFirstChar) { + return g_XMLNameChars[iMid].bStartChar; + } + return TRUE; + } + } + return FALSE; +} +#ifdef __cplusplus +} +#endif +CFDE_XMLNode::CFDE_XMLNode() + : m_pParent(NULL) + , m_pChild(NULL) + , m_pPrior(NULL) + , m_pNext(NULL) +{ +} +CFDE_XMLNode::~CFDE_XMLNode() +{ + DeleteChildren(); +} +void CFDE_XMLNode::DeleteChildren() +{ + CFDE_XMLNode *pChild = m_pChild, *pTemp; + while (pChild != NULL) { + pTemp = pChild->m_pNext; + pChild->Release(); + pChild = pTemp; + } + m_pChild = NULL; +} +FX_INT32 CFDE_XMLNode::CountChildNodes() const +{ + FX_INT32 iCount = 0; + CFDE_XMLNode *pChild = m_pChild; + while (pChild != NULL) { + iCount ++; + pChild = pChild->m_pNext; + } + return iCount; +} +CFDE_XMLNode* CFDE_XMLNode::GetChildNode(FX_INT32 index) const +{ + CFDE_XMLNode *pChild = m_pChild; + while (pChild != NULL) { + if (index == 0) { + return pChild; + } + index --; + pChild = pChild->m_pNext; + } + return NULL; +} +FX_INT32 CFDE_XMLNode::GetChildNodeIndex(CFDE_XMLNode *pNode) const +{ + FX_INT32 index = 0; + CFDE_XMLNode *pChild = m_pChild; + while (pChild != NULL) { + if (pChild == pNode) { + return index; + } + index ++; + pChild = pChild->m_pNext; + } + return -1; +} +CFDE_XMLNode* CFDE_XMLNode::GetPath(FX_LPCWSTR pPath, FX_INT32 iLength, FX_BOOL bQualifiedName) const +{ + FXSYS_assert(pPath != NULL); + if (iLength < 0) { + iLength = FXSYS_wcslen(pPath); + } + if (iLength == 0) { + return NULL; + } + CFX_WideString csPath; + FX_LPCWSTR pStart = pPath, pEnd = pPath + iLength; + FX_WCHAR ch; + while (pStart < pEnd) { + ch = *pStart ++; + if (ch == L'/') { + break; + } else { + csPath += ch; + } + } + iLength -= pStart - pPath; + CFDE_XMLNode *pFind = NULL; + if (csPath.GetLength() < 1) { + pFind = GetNodeItem(IFDE_XMLNode::Root); + } else if (csPath.Compare(L"..") == 0) { + pFind = m_pParent; + } else if (csPath.Compare(L".") == 0) { + pFind = (CFDE_XMLNode*)this; + } else { + CFX_WideString wsTag; + CFDE_XMLNode *pNode = m_pChild; + while (pNode != NULL) { + if (pNode->GetType() == FDE_XMLNODE_Element) { + if (bQualifiedName) { + ((CFDE_XMLElement*)pNode)->GetTagName(wsTag); + } else { + ((CFDE_XMLElement*)pNode)->GetLocalTagName(wsTag); + } + if (wsTag.Compare(csPath) == 0) { + if (iLength < 1) { + pFind = pNode; + } else { + pFind = pNode->GetPath(pStart, iLength, bQualifiedName); + } + if (pFind != NULL) { + return pFind; + } + } + } + pNode = pNode->m_pNext; + } + } + if (pFind == NULL || iLength < 1) { + return pFind; + } + return pFind->GetPath(pStart, iLength, bQualifiedName); +} +FX_INT32 CFDE_XMLNode::InsertChildNode(CFDE_XMLNode *pNode, FX_INT32 index) +{ + FXSYS_assert(pNode != NULL); + pNode->m_pParent = this; + if (m_pChild == NULL) { + m_pChild = pNode; + pNode->m_pPrior = NULL; + pNode->m_pNext = NULL; + return 0; + } else if (index == 0) { + pNode->m_pNext = m_pChild; + pNode->m_pPrior = NULL; + m_pChild->m_pPrior = pNode; + m_pChild = pNode; + return 0; + } + FX_INT32 iCount = 0; + CFDE_XMLNode *pFind = m_pChild; + while (++iCount != index && pFind->m_pNext != NULL) { + pFind = pFind->m_pNext; + } + pNode->m_pPrior = pFind; + pNode->m_pNext = pFind->m_pNext; + if (pFind->m_pNext != NULL) { + pFind->m_pNext->m_pPrior = pNode; + } + pFind->m_pNext = pNode; + return iCount; +} +void CFDE_XMLNode::RemoveChildNode(CFDE_XMLNode *pNode) +{ + FXSYS_assert(m_pChild != NULL && pNode != NULL); + if (m_pChild == pNode) { + m_pChild = pNode->m_pNext; + } else { + pNode->m_pPrior->m_pNext = pNode->m_pNext; + } + if (pNode->m_pNext != NULL) { + pNode->m_pNext->m_pPrior = pNode->m_pPrior; + } + pNode->m_pParent = NULL; + pNode->m_pNext = NULL; + pNode->m_pPrior = NULL; +} +CFDE_XMLNode* CFDE_XMLNode::GetNodeItem(IFDE_XMLNode::NodeItem eItem) const +{ + switch (eItem) { + case IFDE_XMLNode::Root: { + CFDE_XMLNode *pParent = (CFDE_XMLNode*)this; + while (pParent->m_pParent != NULL) { + pParent = pParent->m_pParent; + } + return pParent; + } + case IFDE_XMLNode::Parent: + return m_pParent; + case IFDE_XMLNode::FirstSibling: { + CFDE_XMLNode *pItem = (CFDE_XMLNode*)this; + while (pItem->m_pPrior != NULL) { + pItem = pItem->m_pPrior; + } + return pItem == (CFDE_XMLNode*)this ? NULL : pItem; + } + case IFDE_XMLNode::PriorSibling: + return m_pPrior; + case IFDE_XMLNode::NextSibling: + return m_pNext; + case IFDE_XMLNode::LastSibling: { + CFDE_XMLNode *pItem = (CFDE_XMLNode*)this; + while (pItem->m_pNext != NULL) { + pItem = pItem->m_pNext; + } + return pItem == (CFDE_XMLNode*)this ? NULL : pItem; + } + case IFDE_XMLNode::FirstNeighbor: { + CFDE_XMLNode *pParent = (CFDE_XMLNode*)this; + while (pParent->m_pParent != NULL) { + pParent = pParent->m_pParent; + } + return pParent == (CFDE_XMLNode*)this ? NULL : pParent; + } + case IFDE_XMLNode::PriorNeighbor: { + if (m_pPrior == NULL) { + return m_pParent; + } + CFDE_XMLNode *pItem = m_pPrior; + while (CFDE_XMLNode *pTemp = pItem->m_pChild) { + pItem = pTemp; + while ((pTemp = pItem->m_pNext) != NULL) { + pItem = pTemp; + } + } + return pItem; + } + case IFDE_XMLNode::NextNeighbor: { + if (m_pChild != NULL) { + return m_pChild; + } + if (m_pNext != NULL) { + return m_pNext; + } + CFDE_XMLNode *pItem = m_pParent; + while (pItem != NULL) { + if (pItem->m_pNext != NULL) { + return pItem->m_pNext; + } + pItem = pItem->m_pParent; + } + return NULL; + } + case IFDE_XMLNode::LastNeighbor: { + CFDE_XMLNode *pItem = (CFDE_XMLNode*)this; + while (pItem->m_pParent != NULL) { + pItem = pItem->m_pParent; + } + while (TRUE) { + while (pItem->m_pNext != NULL) { + pItem = pItem->m_pNext; + } + if (pItem->m_pChild == NULL) { + break; + } + pItem = pItem->m_pChild; + } + return pItem == (CFDE_XMLNode*)this ? NULL : pItem; + } + case IFDE_XMLNode::FirstChild: + return m_pChild; + case IFDE_XMLNode::LastChild: { + if (m_pChild == NULL) { + return NULL; + } + CFDE_XMLNode *pChild = m_pChild; + while (pChild->m_pNext != NULL) { + pChild = pChild->m_pNext; + } + return pChild; + } + default: + break; + } + return NULL; +} +FX_INT32 CFDE_XMLNode::GetNodeLevel() const +{ + FX_INT32 iLevel = 0; + CFDE_XMLNode *pItem = (CFDE_XMLNode*)this; + while ((pItem = pItem->m_pParent) != NULL) { + iLevel ++; + } + return iLevel; +} +FX_BOOL CFDE_XMLNode::InsertNodeItem(IFDE_XMLNode::NodeItem eItem, CFDE_XMLNode *pNode) +{ + FXSYS_assert(pNode != NULL); + switch (eItem) { + case IFDE_XMLNode::NextSibling: { + pNode->m_pParent = m_pParent; + pNode->m_pNext = m_pNext; + pNode->m_pPrior = this; + if (m_pNext) { + m_pNext->m_pPrior = pNode; + } + m_pNext = pNode; + return TRUE; + } + case IFDE_XMLNode::PriorSibling: { + pNode->m_pParent = m_pParent; + pNode->m_pNext = this; + pNode->m_pPrior = m_pPrior; + if (m_pPrior) { + m_pPrior->m_pNext = pNode; + } else if (m_pParent) { + m_pParent->m_pChild = pNode; + } + m_pPrior = pNode; + return TRUE; + } + default: + return FALSE; + } + return FALSE; +} +CFDE_XMLNode* CFDE_XMLNode::RemoveNodeItem(IFDE_XMLNode::NodeItem eItem) +{ + CFDE_XMLNode* pNode = NULL; + switch (eItem) { + case IFDE_XMLNode::NextSibling: + if (m_pNext) { + pNode = m_pNext; + m_pNext = pNode->m_pNext; + if (m_pNext) { + m_pNext->m_pPrior = this; + } + pNode->m_pParent = NULL; + pNode->m_pNext = NULL; + pNode->m_pPrior = NULL; + } + break; + default: + break; + } + return pNode; +} +CFDE_XMLNode* CFDE_XMLNode::Clone(FX_BOOL bRecursive) +{ + return NULL; +} +void CFDE_XMLNode::SaveXMLNode(IFX_Stream *pXMLStream) +{ + CFDE_XMLNode *pNode = (CFDE_XMLNode*)this; + FXSYS_assert(pXMLStream != NULL && pNode != NULL); + switch (pNode->GetType()) { + case FDE_XMLNODE_Instruction: { + CFX_WideString ws; + CFDE_XMLInstruction *pInstruction = (CFDE_XMLInstruction*)pNode; + if (pInstruction->m_wsTarget.CompareNoCase(L"xml") == 0) { + ws = L"GetCodePage(); + if (wCodePage == FX_CODEPAGE_UTF16LE) { + ws += L"UTF-16"; + } else if (wCodePage == FX_CODEPAGE_UTF16BE) { + ws += L"UTF-16be"; + } else { + ws += L"UTF-8"; + } + ws += L"\"?>"; + pXMLStream->WriteString(ws, ws.GetLength()); + } else { + ws.Format((FX_LPCWSTR)L"m_wsTarget); + pXMLStream->WriteString(ws, ws.GetLength()); + CFX_WideStringArray &attributes = pInstruction->m_Attributes; + FX_INT32 i, iCount = attributes.GetSize(); + CFX_WideString wsValue; + for (i = 0; i < iCount; i += 2) { + ws = L" "; + ws += attributes[i]; + ws += L"=\""; + wsValue = attributes[i + 1]; + wsValue.Replace((FX_LPCWSTR)L"&", (FX_LPCWSTR)L"&"); + wsValue.Replace((FX_LPCWSTR)L"<", (FX_LPCWSTR)L"<"); + wsValue.Replace((FX_LPCWSTR)L">", (FX_LPCWSTR)L">"); + wsValue.Replace((FX_LPCWSTR)L"\'", (FX_LPCWSTR)L"'"); + wsValue.Replace((FX_LPCWSTR)L"\"", (FX_LPCWSTR)L"""); + ws += wsValue; + ws += L"\""; + pXMLStream->WriteString(ws, ws.GetLength()); + } + CFX_WideStringArray &targetdata = pInstruction->m_TargetData; + iCount = targetdata.GetSize(); + for (i = 0; i < iCount; i++) { + ws = L" \""; + ws += targetdata[i]; + ws += L"\""; + pXMLStream->WriteString(ws, ws.GetLength()); + } + ws = L"?>"; + pXMLStream->WriteString(ws, ws.GetLength()); + } + } + break; + case FDE_XMLNODE_Element: { + CFX_WideString ws; + ws = L"<"; + ws += ((CFDE_XMLElement*)pNode)->m_wsTag; + pXMLStream->WriteString(ws, ws.GetLength()); + CFX_WideStringArray &attributes = ((CFDE_XMLElement*)pNode)->m_Attributes; + FX_INT32 iCount = attributes.GetSize(); + CFX_WideString wsValue; + for (FX_INT32 i = 0; i < iCount; i += 2) { + ws = L" "; + ws += attributes[i]; + ws += L"=\""; + wsValue = attributes[i + 1]; + wsValue.Replace((FX_LPCWSTR)L"&", (FX_LPCWSTR)L"&"); + wsValue.Replace((FX_LPCWSTR)L"<", (FX_LPCWSTR)L"<"); + wsValue.Replace((FX_LPCWSTR)L">", (FX_LPCWSTR)L">"); + wsValue.Replace((FX_LPCWSTR)L"\'", (FX_LPCWSTR)L"'"); + wsValue.Replace((FX_LPCWSTR)L"\"", (FX_LPCWSTR)L"""); + ws += wsValue; + ws += L"\""; + pXMLStream->WriteString(ws, ws.GetLength()); + } + if (pNode->m_pChild == NULL) { + ws = L"\n/>"; + pXMLStream->WriteString(ws, ws.GetLength()); + } else { + ws = L"\n>"; + pXMLStream->WriteString(ws, ws.GetLength()); + CFDE_XMLNode *pChild = pNode->m_pChild; + while (pChild != NULL) { + pChild->SaveXMLNode(pXMLStream); + pChild = pChild->m_pNext; + } + ws = L"m_wsTag; + ws += L"\n>"; + pXMLStream->WriteString(ws, ws.GetLength()); + } + } + break; + case FDE_XMLNODE_Text: { + CFX_WideString ws = ((CFDE_XMLText*)pNode)->m_wsText; + ws.Replace((FX_LPCWSTR)L"&", (FX_LPCWSTR)L"&"); + ws.Replace((FX_LPCWSTR)L"<", (FX_LPCWSTR)L"<"); + ws.Replace((FX_LPCWSTR)L">", (FX_LPCWSTR)L">"); + ws.Replace((FX_LPCWSTR)L"\'", (FX_LPCWSTR)L"'"); + ws.Replace((FX_LPCWSTR)L"\"", (FX_LPCWSTR)L"""); + pXMLStream->WriteString(ws, ws.GetLength()); + } + break; + case FDE_XMLNODE_CharData: { + CFX_WideString ws = L"m_wsCharData; + ws += L"]]>"; + pXMLStream->WriteString(ws, ws.GetLength()); + } + break; + case FDE_XMLNODE_Unknown: + break; + default: + break; + } +} +void CFDE_XMLNode::CloneChildren(CFDE_XMLNode* pClone) +{ + if (!m_pChild) { + return; + } + CFDE_XMLNode* pNext = m_pChild; + CFDE_XMLNode* pCloneNext = pNext->Clone(TRUE); + pClone->InsertChildNode(pCloneNext); + pNext = pNext->m_pNext; + while (pNext) { + CFDE_XMLNode* pChild = pNext->Clone(TRUE); + pCloneNext->InsertNodeItem(IFDE_XMLNode::NextSibling, pChild); + pCloneNext = pChild; + pNext = pNext->m_pNext; + } +} +IFDE_XMLInstruction* IFDE_XMLInstruction::Create(const CFX_WideString &wsTarget) +{ + return (IFDE_XMLInstruction*)FDE_New CFDE_XMLInstruction(wsTarget); +} +CFDE_XMLInstruction::CFDE_XMLInstruction(const CFX_WideString &wsTarget) + : CFDE_XMLNode() + , m_wsTarget(wsTarget) + , m_TargetData() + , m_Attributes() +{ + FXSYS_assert(m_wsTarget.GetLength() > 0); +} +CFDE_XMLNode* CFDE_XMLInstruction::Clone(FX_BOOL bRecursive) +{ + CFDE_XMLInstruction* pClone = FDE_New CFDE_XMLInstruction(m_wsTarget); + if (!pClone) { + return pClone; + } + pClone->m_Attributes.Copy(m_Attributes); + pClone->m_TargetData.Copy(m_TargetData); + if (bRecursive) { + CloneChildren(pClone); + } + return pClone; +} +FX_INT32 CFDE_XMLInstruction::CountAttributes() const +{ + return m_Attributes.GetSize() / 2; +} +FX_BOOL CFDE_XMLInstruction::GetAttribute(FX_INT32 index, CFX_WideString &wsAttriName, CFX_WideString &wsAttriValue) const +{ + FX_INT32 iCount = m_Attributes.GetSize(); + FXSYS_assert(index > -1 && index < iCount / 2); + for (FX_INT32 i = 0; i < iCount; i += 2) { + if (index == 0) { + wsAttriName = m_Attributes[i]; + wsAttriValue = m_Attributes[i + 1]; + return TRUE; + } + index --; + } + return FALSE; +} +FX_BOOL CFDE_XMLInstruction::HasAttribute(FX_LPCWSTR pwsAttriName) const +{ + FX_INT32 iCount = m_Attributes.GetSize(); + for (FX_INT32 i = 0; i < iCount; i += 2) { + if (m_Attributes[i].Compare(pwsAttriName) == 0) { + return TRUE; + } + } + return FALSE; +} +void CFDE_XMLInstruction::GetString(FX_LPCWSTR pwsAttriName, CFX_WideString &wsAttriValue, FX_LPCWSTR pwsDefValue) const +{ + FX_INT32 iCount = m_Attributes.GetSize(); + for (FX_INT32 i = 0; i < iCount; i += 2) { + if (m_Attributes[i].Compare(pwsAttriName) == 0) { + wsAttriValue = m_Attributes[i + 1]; + return; + } + } + wsAttriValue = pwsDefValue; +} +void CFDE_XMLInstruction::SetString(const CFX_WideString &wsAttriName, const CFX_WideString &wsAttriValue) +{ + FXSYS_assert(wsAttriName.GetLength() > 0); + FX_INT32 iCount = m_Attributes.GetSize(); + for (FX_INT32 i = 0; i < iCount; i += 2) { + if (m_Attributes[i].Compare(wsAttriName) == 0) { + m_Attributes[i] = wsAttriName; + m_Attributes[i + 1] = wsAttriValue; + return; + } + } + m_Attributes.Add(wsAttriName); + m_Attributes.Add(wsAttriValue); +} +FX_INT32 CFDE_XMLInstruction::GetInteger(FX_LPCWSTR pwsAttriName, FX_INT32 iDefValue) const +{ + FX_INT32 iCount = m_Attributes.GetSize(); + for (FX_INT32 i = 0; i < iCount; i += 2) { + if (m_Attributes[i].Compare(pwsAttriName) == 0) { + return FXSYS_wtoi((FX_LPCWSTR)m_Attributes[i + 1]); + } + } + return iDefValue; +} +void CFDE_XMLInstruction::SetInteger(FX_LPCWSTR pwsAttriName, FX_INT32 iAttriValue) +{ + CFX_WideString wsValue; + wsValue.Format((FX_LPCWSTR)L"%d", iAttriValue); + SetString(pwsAttriName, wsValue); +} +FX_FLOAT CFDE_XMLInstruction::GetFloat(FX_LPCWSTR pwsAttriName, FX_FLOAT fDefValue) const +{ + FX_INT32 iCount = m_Attributes.GetSize(); + for (FX_INT32 i = 0; i < iCount; i += 2) { + if (m_Attributes[i].Compare(pwsAttriName) == 0) { + return FX_wcstof((FX_LPCWSTR)m_Attributes[i + 1]); + } + } + return fDefValue; +} +void CFDE_XMLInstruction::SetFloat(FX_LPCWSTR pwsAttriName, FX_FLOAT fAttriValue) +{ + CFX_WideString wsValue; + wsValue.Format((FX_LPCWSTR)L"%f", fAttriValue); + SetString(pwsAttriName, wsValue); +} +void CFDE_XMLInstruction::RemoveAttribute(FX_LPCWSTR pwsAttriName) +{ + FX_INT32 iCount = m_Attributes.GetSize(); + for (FX_INT32 i = 0; i < iCount; i += 2) { + if (m_Attributes[i].Compare(pwsAttriName) == 0) { + m_Attributes.RemoveAt(i + 1); + m_Attributes.RemoveAt(i); + return; + } + } +} +FX_INT32 CFDE_XMLInstruction::CountData() const +{ + return m_TargetData.GetSize(); +} +FX_BOOL CFDE_XMLInstruction::GetData(FX_INT32 index, CFX_WideString &wsData) const +{ + if (index < 0 || index >= m_TargetData.GetSize()) { + return FALSE; + } + wsData = m_TargetData[index]; + return TRUE; +} +void CFDE_XMLInstruction::AppendData(const CFX_WideString &wsData) +{ + m_TargetData.Add(wsData); +} +void CFDE_XMLInstruction::RemoveData(FX_INT32 index) +{ + m_TargetData.RemoveAt(index); +} +IFDE_XMLElement* IFDE_XMLElement::Create(const CFX_WideString &wsTag) +{ + return (IFDE_XMLElement*)FDE_New CFDE_XMLElement(wsTag); +} +CFDE_XMLElement::CFDE_XMLElement(const CFX_WideString &wsTag) + : CFDE_XMLNode() + , m_wsTag(wsTag) + , m_Attributes() +{ + FXSYS_assert(m_wsTag.GetLength() > 0); +} +CFDE_XMLElement::~CFDE_XMLElement() +{ + m_Attributes.RemoveAll(); +} +CFDE_XMLNode* CFDE_XMLElement::Clone(FX_BOOL bRecursive) +{ + CFDE_XMLElement* pClone = FDE_New CFDE_XMLElement(m_wsTag); + if (!pClone) { + return NULL; + } + pClone->m_Attributes.Copy(m_Attributes); + if (bRecursive) { + CloneChildren(pClone); + } else { + CFX_WideString wsText; + CFDE_XMLNode *pChild = m_pChild; + while (pChild != NULL) { + switch (pChild->GetType()) { + case FDE_XMLNODE_Text: + wsText += ((CFDE_XMLText*)pChild)->m_wsText; + break; + default: + break; + } + pChild = pChild->m_pNext; + } + pClone->SetTextData(wsText); + } + return pClone; +} +void CFDE_XMLElement::GetTagName(CFX_WideString &wsTag) const +{ + wsTag = m_wsTag; +} +void CFDE_XMLElement::GetLocalTagName(CFX_WideString &wsTag) const +{ + FX_STRSIZE iFind = m_wsTag.Find(L':', 0); + if (iFind < 0) { + wsTag = m_wsTag; + } else { + wsTag = m_wsTag.Right(m_wsTag.GetLength() - iFind - 1); + } +} +void CFDE_XMLElement::GetNamespacePrefix(CFX_WideString &wsPrefix) const +{ + FX_STRSIZE iFind = m_wsTag.Find(L':', 0); + if (iFind < 0) { + wsPrefix.Empty(); + } else { + wsPrefix = m_wsTag.Left(iFind); + } +} +void CFDE_XMLElement::GetNamespaceURI(CFX_WideString &wsNamespace) const +{ + CFX_WideString wsAttri(L"xmlns"), wsPrefix; + GetNamespacePrefix(wsPrefix); + if (wsPrefix.GetLength() > 0) { + wsAttri += L":"; + wsAttri += wsPrefix; + } + wsNamespace.Empty(); + CFDE_XMLNode *pNode = (CFDE_XMLNode*)this; + while (pNode != NULL) { + if (pNode->GetType() != FDE_XMLNODE_Element) { + break; + } + CFDE_XMLElement *pElement = (CFDE_XMLElement*)pNode; + if (!pElement->HasAttribute(wsAttri)) { + pNode = pNode->GetNodeItem(IFDE_XMLNode::Parent); + continue; + } + pElement->GetString(wsAttri, wsNamespace); + break; + } +} +FX_INT32 CFDE_XMLElement::CountAttributes() const +{ + return m_Attributes.GetSize() / 2; +} +FX_BOOL CFDE_XMLElement::GetAttribute(FX_INT32 index, CFX_WideString &wsAttriName, CFX_WideString &wsAttriValue) const +{ + FX_INT32 iCount = m_Attributes.GetSize(); + FXSYS_assert(index > -1 && index < iCount / 2); + for (FX_INT32 i = 0; i < iCount; i += 2) { + if (index == 0) { + wsAttriName = m_Attributes[i]; + wsAttriValue = m_Attributes[i + 1]; + return TRUE; + } + index --; + } + return FALSE; +} +FX_BOOL CFDE_XMLElement::HasAttribute(FX_LPCWSTR pwsAttriName) const +{ + FX_INT32 iCount = m_Attributes.GetSize(); + for (FX_INT32 i = 0; i < iCount; i += 2) { + if (m_Attributes[i].Compare(pwsAttriName) == 0) { + return TRUE; + } + } + return FALSE; +} +void CFDE_XMLElement::GetString(FX_LPCWSTR pwsAttriName, CFX_WideString &wsAttriValue, FX_LPCWSTR pwsDefValue) const +{ + FX_INT32 iCount = m_Attributes.GetSize(); + for (FX_INT32 i = 0; i < iCount; i += 2) { + if (m_Attributes[i].Compare(pwsAttriName) == 0) { + wsAttriValue = m_Attributes[i + 1]; + return; + } + } + wsAttriValue = pwsDefValue; +} +void CFDE_XMLElement::SetString(const CFX_WideString &wsAttriName, const CFX_WideString &wsAttriValue) +{ + FXSYS_assert(wsAttriName.GetLength() > 0); + FX_INT32 iCount = m_Attributes.GetSize(); + for (FX_INT32 i = 0; i < iCount; i += 2) { + if (m_Attributes[i].Compare(wsAttriName) == 0) { + m_Attributes[i] = wsAttriName; + m_Attributes[i + 1] = wsAttriValue; + return; + } + } + m_Attributes.Add(wsAttriName); + m_Attributes.Add(wsAttriValue); +} +FX_INT32 CFDE_XMLElement::GetInteger(FX_LPCWSTR pwsAttriName, FX_INT32 iDefValue) const +{ + FX_INT32 iCount = m_Attributes.GetSize(); + for (FX_INT32 i = 0; i < iCount; i += 2) { + if (m_Attributes[i].Compare(pwsAttriName) == 0) { + return FXSYS_wtoi((FX_LPCWSTR)m_Attributes[i + 1]); + } + } + return iDefValue; +} +void CFDE_XMLElement::SetInteger(FX_LPCWSTR pwsAttriName, FX_INT32 iAttriValue) +{ + CFX_WideString wsValue; + wsValue.Format((FX_LPCWSTR)L"%d", iAttriValue); + SetString(pwsAttriName, wsValue); +} +FX_FLOAT CFDE_XMLElement::GetFloat(FX_LPCWSTR pwsAttriName, FX_FLOAT fDefValue) const +{ + FX_INT32 iCount = m_Attributes.GetSize(); + for (FX_INT32 i = 0; i < iCount; i += 2) { + if (m_Attributes[i].Compare(pwsAttriName) == 0) { + return FX_wcstof((FX_LPCWSTR)m_Attributes[i + 1]); + } + } + return fDefValue; +} +void CFDE_XMLElement::SetFloat(FX_LPCWSTR pwsAttriName, FX_FLOAT fAttriValue) +{ + CFX_WideString wsValue; + wsValue.Format((FX_LPCWSTR)L"%f", fAttriValue); + SetString(pwsAttriName, wsValue); +} +void CFDE_XMLElement::RemoveAttribute(FX_LPCWSTR pwsAttriName) +{ + FX_INT32 iCount = m_Attributes.GetSize(); + for (FX_INT32 i = 0; i < iCount; i += 2) { + if (m_Attributes[i].Compare(pwsAttriName) == 0) { + m_Attributes.RemoveAt(i + 1); + m_Attributes.RemoveAt(i); + return; + } + } +} +void CFDE_XMLElement::GetTextData(CFX_WideString &wsText) const +{ + CFX_WideTextBuf buffer; + CFDE_XMLNode *pChild = m_pChild; + while (pChild != NULL) { + switch (pChild->GetType()) { + case FDE_XMLNODE_Text: + buffer << ((CFDE_XMLText*)pChild)->m_wsText; + break; + case FDE_XMLNODE_CharData: + buffer << ((CFDE_XMLCharData*)pChild)->m_wsCharData; + break; + default: + break; + } + pChild = pChild->m_pNext; + } + wsText = buffer.GetWideString(); +} +void CFDE_XMLElement::SetTextData(const CFX_WideString &wsText) +{ + if (wsText.GetLength() < 1) { + return; + } + InsertChildNode(FDE_New CFDE_XMLText(wsText)); +} +IFDE_XMLText* IFDE_XMLText::Create(const CFX_WideString &wsText) +{ + return (IFDE_XMLText*)FDE_New CFDE_XMLText(wsText); +} +CFDE_XMLText::CFDE_XMLText(const CFX_WideString &wsText) + : CFDE_XMLNode() + , m_wsText(wsText) +{ +} +CFDE_XMLNode* CFDE_XMLText::Clone(FX_BOOL bRecursive) +{ + CFDE_XMLText* pClone = FDE_New CFDE_XMLText(m_wsText); + return pClone; +} +IFDE_XMLCharData* IFDE_XMLCharData::Create(const CFX_WideString &wsCData) +{ + return (IFDE_XMLCharData*)FDE_New CFDE_XMLCharData(wsCData); +} +CFDE_XMLCharData::CFDE_XMLCharData(const CFX_WideString &wsCData) + : CFDE_XMLDeclaration() + , m_wsCharData(wsCData) +{ +} +CFDE_XMLNode* CFDE_XMLCharData::Clone(FX_BOOL bRecursive) +{ + CFDE_XMLCharData* pClone = FDE_New CFDE_XMLCharData(m_wsCharData); + return pClone; +} +IFDE_XMLDoc* IFDE_XMLDoc::Create() +{ + return (IFDE_XMLDoc*)FDE_New CFDE_XMLDoc; +} +CFDE_XMLDoc::CFDE_XMLDoc() + : m_pRoot(NULL) + , m_pSyntaxParser(NULL) + , m_pXMLParser(NULL) +{ + Reset(TRUE); + CFDE_XMLInstruction *pXML = FDE_New CFDE_XMLInstruction((FX_LPCWSTR)L"xml"); + m_pRoot->InsertChildNode(pXML); +} +CFDE_XMLDoc::~CFDE_XMLDoc() +{ + Reset(FALSE); +} +void CFDE_XMLDoc::Reset(FX_BOOL bInitRoot) +{ + m_iStatus = 0; + m_pStream = NULL; + if (bInitRoot) { + if (m_pRoot == NULL) { + m_pRoot = FDE_New CFDE_XMLNode; + } else { + m_pRoot->DeleteChildren(); + } + } else { + if (m_pRoot != NULL) { + m_pRoot->Release(); + m_pRoot = NULL; + } + } + ReleaseParser(); +} +void CFDE_XMLDoc::ReleaseParser() +{ + if (m_pXMLParser != NULL) { + m_pXMLParser->Release(); + m_pXMLParser = NULL; + } + if (m_pSyntaxParser != NULL) { + m_pSyntaxParser->Release(); + m_pSyntaxParser = NULL; + } +} +FX_BOOL CFDE_XMLDoc::LoadXML(IFX_Stream *pXMLStream, FX_INT32 iXMLPlaneSize , FX_INT32 iTextDataSize , FDE_LPXMLREADERHANDLER pHandler ) +{ + if (pXMLStream == NULL) { + return FALSE; + } + Reset(TRUE); + iXMLPlaneSize = iXMLPlaneSize / 1024; + if (iXMLPlaneSize < 1) { + iXMLPlaneSize = 1; + } + iXMLPlaneSize *= 1024; + if (iXMLPlaneSize < 4096) { + iXMLPlaneSize = 4096; + } + iTextDataSize = iTextDataSize / 128; + if (iTextDataSize < 1) { + iTextDataSize = 1; + } + iTextDataSize *= 128; + if (iTextDataSize < 128) { + iTextDataSize = 128; + } + m_pStream = pXMLStream; + FX_WORD wCodePage = m_pStream->GetCodePage(); + if (wCodePage != FX_CODEPAGE_UTF16LE && wCodePage != FX_CODEPAGE_UTF16BE && wCodePage != FX_CODEPAGE_UTF8) { + m_pStream->SetCodePage(FX_CODEPAGE_UTF8); + } + m_pSyntaxParser = IFDE_XMLSyntaxParser::Create(); + if (m_pSyntaxParser == NULL) { + return FALSE; + } + m_pSyntaxParser->Init(m_pStream, iXMLPlaneSize, iTextDataSize); + if (pHandler == NULL) { + m_pXMLParser = FDE_New CFDE_XMLDOMParser(m_pRoot, m_pSyntaxParser); + } else { + m_pXMLParser = FDE_New CFDE_XMLSAXParser(pHandler, m_pSyntaxParser); + } + return m_pXMLParser != NULL; +} +FX_BOOL CFDE_XMLDoc::LoadXML(IFDE_XMLParser *pXMLParser) +{ + if (pXMLParser == NULL) { + return FALSE; + } + Reset(TRUE); + m_pXMLParser = pXMLParser; + return m_pXMLParser != NULL; +} +FX_INT32 CFDE_XMLDoc::DoLoad(IFX_Pause *pPause) +{ + if (m_iStatus >= 100) { + return m_iStatus; + } + FXSYS_assert(m_pXMLParser != NULL); + return m_iStatus = m_pXMLParser->DoParser(pPause); +} +void CFDE_XMLDoc::CloseXML() +{ + ReleaseParser(); +} +void CFDE_XMLDoc::SaveXMLNode(IFX_Stream *pXMLStream, IFDE_XMLNode *pINode) +{ + CFDE_XMLNode *pNode = (CFDE_XMLNode*)pINode; + FXSYS_assert(pXMLStream != NULL && pNode != NULL); + switch (pNode->GetType()) { + case FDE_XMLNODE_Instruction: { + CFX_WideString ws; + CFDE_XMLInstruction *pInstruction = (CFDE_XMLInstruction*)pNode; + if (pInstruction->m_wsTarget.CompareNoCase(L"xml") == 0) { + ws = L"GetCodePage(); + if (wCodePage == FX_CODEPAGE_UTF16LE) { + ws += L"UTF-16"; + } else if (wCodePage == FX_CODEPAGE_UTF16BE) { + ws += L"UTF-16be"; + } else { + ws += L"UTF-8"; + } + ws += L"\"?>"; + pXMLStream->WriteString(ws, ws.GetLength()); + } else { + ws.Format((FX_LPCWSTR)L"m_wsTarget); + pXMLStream->WriteString(ws, ws.GetLength()); + CFX_WideStringArray &attributes = pInstruction->m_Attributes; + FX_INT32 i, iCount = attributes.GetSize(); + CFX_WideString wsValue; + for (i = 0; i < iCount; i += 2) { + ws = L" "; + ws += attributes[i]; + ws += L"=\""; + wsValue = attributes[i + 1]; + wsValue.Replace((FX_LPCWSTR)L"&", (FX_LPCWSTR)L"&"); + wsValue.Replace((FX_LPCWSTR)L"<", (FX_LPCWSTR)L"<"); + wsValue.Replace((FX_LPCWSTR)L">", (FX_LPCWSTR)L">"); + wsValue.Replace((FX_LPCWSTR)L"\'", (FX_LPCWSTR)L"'"); + wsValue.Replace((FX_LPCWSTR)L"\"", (FX_LPCWSTR)L"""); + ws += wsValue; + ws += L"\""; + pXMLStream->WriteString(ws, ws.GetLength()); + } + CFX_WideStringArray &targetdata = pInstruction->m_TargetData; + iCount = targetdata.GetSize(); + for (i = 0; i < iCount; i++) { + ws = L" \""; + ws += targetdata[i]; + ws += L"\""; + pXMLStream->WriteString(ws, ws.GetLength()); + } + ws = L"?>"; + pXMLStream->WriteString(ws, ws.GetLength()); + } + } + break; + case FDE_XMLNODE_Element: { + CFX_WideString ws; + ws = L"<"; + ws += ((CFDE_XMLElement*)pNode)->m_wsTag; + pXMLStream->WriteString(ws, ws.GetLength()); + CFX_WideStringArray &attributes = ((CFDE_XMLElement*)pNode)->m_Attributes; + FX_INT32 iCount = attributes.GetSize(); + CFX_WideString wsValue; + for (FX_INT32 i = 0; i < iCount; i += 2) { + ws = L" "; + ws += attributes[i]; + ws += L"=\""; + wsValue = attributes[i + 1]; + wsValue.Replace((FX_LPCWSTR)L"&", (FX_LPCWSTR)L"&"); + wsValue.Replace((FX_LPCWSTR)L"<", (FX_LPCWSTR)L"<"); + wsValue.Replace((FX_LPCWSTR)L">", (FX_LPCWSTR)L">"); + wsValue.Replace((FX_LPCWSTR)L"\'", (FX_LPCWSTR)L"'"); + wsValue.Replace((FX_LPCWSTR)L"\"", (FX_LPCWSTR)L"""); + ws += wsValue; + ws += L"\""; + pXMLStream->WriteString(ws, ws.GetLength()); + } + if (pNode->m_pChild == NULL) { + ws = L"\n/>"; + pXMLStream->WriteString(ws, ws.GetLength()); + } else { + ws = L"\n>"; + pXMLStream->WriteString(ws, ws.GetLength()); + CFDE_XMLNode *pChild = pNode->m_pChild; + while (pChild != NULL) { + SaveXMLNode(pXMLStream, (IFDE_XMLNode*)pChild); + pChild = pChild->m_pNext; + } + ws = L"m_wsTag; + ws += L"\n>"; + pXMLStream->WriteString(ws, ws.GetLength()); + } + } + break; + case FDE_XMLNODE_Text: { + CFX_WideString ws = ((CFDE_XMLText*)pNode)->m_wsText; + ws.Replace((FX_LPCWSTR)L"&", (FX_LPCWSTR)L"&"); + ws.Replace((FX_LPCWSTR)L"<", (FX_LPCWSTR)L"<"); + ws.Replace((FX_LPCWSTR)L">", (FX_LPCWSTR)L">"); + ws.Replace((FX_LPCWSTR)L"\'", (FX_LPCWSTR)L"'"); + ws.Replace((FX_LPCWSTR)L"\"", (FX_LPCWSTR)L"""); + pXMLStream->WriteString(ws, ws.GetLength()); + } + break; + case FDE_XMLNODE_CharData: { + CFX_WideString ws = L"m_wsCharData; + ws += L"]]>"; + pXMLStream->WriteString(ws, ws.GetLength()); + } + break; + case FDE_XMLNODE_Unknown: + break; + default: + break; + } +} +void CFDE_XMLDoc::SaveXML(IFX_Stream *pXMLStream, FX_BOOL bSaveBOM) +{ + if (pXMLStream == NULL || pXMLStream == m_pStream) { + m_pStream->Seek(FX_STREAMSEEK_Begin, 0); + pXMLStream = m_pStream; + } + FXSYS_assert((pXMLStream->GetAccessModes() & FX_STREAMACCESS_Text) != 0); + FXSYS_assert((pXMLStream->GetAccessModes() & FX_STREAMACCESS_Write) != 0); + FX_WORD wCodePage = pXMLStream->GetCodePage(); + if (wCodePage != FX_CODEPAGE_UTF16LE && wCodePage != FX_CODEPAGE_UTF16BE && wCodePage != FX_CODEPAGE_UTF8) { + wCodePage = FX_CODEPAGE_UTF8; + pXMLStream->SetCodePage(wCodePage); + } + if (bSaveBOM) { + pXMLStream->WriteString((FX_LPCWSTR)L"\xFEFF", 1); + } + CFDE_XMLNode *pNode = m_pRoot->m_pChild; + while (pNode != NULL) { + SaveXMLNode(pXMLStream, (IFDE_XMLNode*)pNode); + pNode = pNode->m_pNext; + } + if (pXMLStream == m_pStream) { + FX_INT32 iPos = pXMLStream->GetPosition(); + pXMLStream->SetLength(iPos); + } +} +CFDE_XMLDOMParser::CFDE_XMLDOMParser(CFDE_XMLNode *pRoot, IFDE_XMLSyntaxParser *pParser) + : m_pRoot(pRoot) + , m_pParser(pParser) + , m_pParent(pRoot) + , m_pChild(NULL) + , m_NodeStack(16) + , m_ws1() + , m_ws2() +{ + m_NodeStack.Push(m_pParent); +} +CFDE_XMLDOMParser::~CFDE_XMLDOMParser() +{ + m_NodeStack.RemoveAll(); + m_ws1.Empty(); + m_ws2.Empty(); +} +FX_INT32 CFDE_XMLDOMParser::DoParser(IFX_Pause *pPause) +{ + FX_DWORD dwRet; + FX_INT32 iCount = 0; + while (TRUE) { + dwRet = m_pParser->DoSyntaxParse(); + switch (dwRet) { + case FDE_XMLSYNTAXSTATUS_InstructionOpen: + break; + case FDE_XMLSYNTAXSTATUS_InstructionClose: + if (m_pChild->GetType() != FDE_XMLNODE_Instruction) { + dwRet = FDE_XMLSYNTAXSTATUS_Error; + break; + } + m_pChild = m_pParent; + break; + case FDE_XMLSYNTAXSTATUS_ElementOpen: + case FDE_XMLSYNTAXSTATUS_ElementBreak: + break; + case FDE_XMLSYNTAXSTATUS_ElementClose: + if (m_pChild->GetType() != FDE_XMLNODE_Element) { + dwRet = FDE_XMLSYNTAXSTATUS_Error; + break; + } + m_pParser->GetTagName(m_ws1); + ((CFDE_XMLElement*)m_pChild)->GetTagName(m_ws2); + if (m_ws1.GetLength() > 0 && m_ws1.Compare(m_ws2) != 0) { + dwRet = FDE_XMLSYNTAXSTATUS_Error; + break; + } + m_NodeStack.Pop(); + if (m_NodeStack.GetSize() < 1) { + dwRet = FDE_XMLSYNTAXSTATUS_Error; + break; + } + m_pParent = (CFDE_XMLNode*)*m_NodeStack.GetTopElement(); + m_pChild = m_pParent; + iCount++; + break; + case FDE_XMLSYNTAXSTATUS_TargetName: + m_pParser->GetTargetName(m_ws1); + m_pChild = FDE_New CFDE_XMLInstruction(m_ws1); + m_pParent->InsertChildNode(m_pChild); + m_ws1.Empty(); + break; + case FDE_XMLSYNTAXSTATUS_TagName: + m_pParser->GetTagName(m_ws1); + m_pChild = FDE_New CFDE_XMLElement(m_ws1); + m_pParent->InsertChildNode(m_pChild); + m_NodeStack.Push(m_pChild); + m_pParent = m_pChild; + break; + case FDE_XMLSYNTAXSTATUS_AttriName: + m_pParser->GetAttributeName(m_ws1); + break; + case FDE_XMLSYNTAXSTATUS_AttriValue: + if (m_pChild == NULL) { + dwRet = FDE_XMLSYNTAXSTATUS_Error; + break; + } + m_pParser->GetAttributeName(m_ws2); + if (m_pChild->GetType() == FDE_XMLNODE_Element) { + ((CFDE_XMLElement*)m_pChild)->SetString(m_ws1, m_ws2); + } else if (m_pChild->GetType() == FDE_XMLNODE_Instruction) { + ((CFDE_XMLInstruction*)m_pChild)->SetString(m_ws1, m_ws2); + } + m_ws1.Empty(); + break; + case FDE_XMLSYNTAXSTATUS_Text: + m_pParser->GetTextData(m_ws1); + m_pChild = FDE_New CFDE_XMLText(m_ws1); + m_pParent->InsertChildNode(m_pChild); + m_pChild = m_pParent; + break; + case FDE_XMLSYNTAXSTATUS_CData: + m_pParser->GetTextData(m_ws1); + m_pChild = FDE_New CFDE_XMLCharData(m_ws1); + m_pParent->InsertChildNode(m_pChild); + m_pChild = m_pParent; + break; + case FDE_XMLSYNTAXSTATUS_TargetData: + if (m_pChild == NULL || m_pChild->GetType() != FDE_XMLNODE_Instruction) { + dwRet = FDE_XMLSYNTAXSTATUS_Error; + break; + } + if (!m_ws1.IsEmpty()) { + ((CFDE_XMLInstruction*)m_pChild)->AppendData(m_ws1); + } + m_pParser->GetTargetData(m_ws1); + ((CFDE_XMLInstruction*)m_pChild)->AppendData(m_ws1); + m_ws1.Empty(); + break; + default: + break; + } + if (dwRet == FDE_XMLSYNTAXSTATUS_Error || dwRet == FDE_XMLSYNTAXSTATUS_EOS) { + break; + } + if (pPause != NULL && iCount > 500 && pPause->NeedToPauseNow()) { + break; + } + } + return m_pParser->GetStatus(); +} +CFDE_XMLSAXParser::CFDE_XMLSAXParser(FDE_LPXMLREADERHANDLER pHandler, IFDE_XMLSyntaxParser *pParser) + : m_pHandler(pHandler) + , m_pParser(pParser) + , m_TagStack(16) + , m_pTagTop(NULL) + , m_ws1() + , m_ws2() +{ +} +CFDE_XMLSAXParser::~CFDE_XMLSAXParser() +{ + m_TagStack.RemoveAll(); + m_ws1.Empty(); + m_ws2.Empty(); +} +FX_INT32 CFDE_XMLSAXParser::DoParser(IFX_Pause *pPause) +{ + FX_DWORD dwRet = 0; + FX_INT32 iCount = 0; + while (TRUE) { + dwRet = m_pParser->DoSyntaxParse(); + switch (dwRet) { + case FDE_XMLSYNTAXSTATUS_ElementBreak: + if (m_pTagTop == NULL) { + dwRet = FDE_XMLSYNTAXSTATUS_Error; + break; + } + if (m_pTagTop->eType == FDE_XMLNODE_Element) { + m_pHandler->OnTagBreak(m_pHandler, m_pTagTop->wsTagName); + } + break; + case FDE_XMLSYNTAXSTATUS_ElementClose: + if (m_pTagTop == NULL || m_pTagTop->eType != FDE_XMLNODE_Element) { + dwRet = FDE_XMLSYNTAXSTATUS_Error; + break; + } + m_pParser->GetTagName(m_ws1); + if (m_ws1.GetLength() > 0 && m_ws1.Compare(m_pTagTop->wsTagName) != 0) { + dwRet = FDE_XMLSYNTAXSTATUS_Error; + break; + } else if (m_ws1.GetLength() == 0) { + m_pHandler->OnTagBreak(m_pHandler, m_pTagTop->wsTagName); + } + m_pHandler->OnTagClose(m_pHandler, m_pTagTop->wsTagName); + Pop(); + iCount++; + break; + case FDE_XMLSYNTAXSTATUS_TargetName: { + m_pParser->GetTargetName(m_ws1); + CFDE_XMLTAG xmlTag; + xmlTag.wsTagName = m_ws1; + xmlTag.eType = FDE_XMLNODE_Instruction; + Push(xmlTag); + m_pHandler->OnTagEnter(m_pHandler, FDE_XMLNODE_Instruction, m_pTagTop->wsTagName); + m_ws1.Empty(); + } + break; + case FDE_XMLSYNTAXSTATUS_TagName: { + m_pParser->GetTargetName(m_ws1); + CFDE_XMLTAG xmlTag; + xmlTag.wsTagName = m_ws1; + xmlTag.eType = FDE_XMLNODE_Element; + Push(xmlTag); + m_pHandler->OnTagEnter(m_pHandler, FDE_XMLNODE_Element, m_pTagTop->wsTagName); + } + break; + case FDE_XMLSYNTAXSTATUS_AttriName: + m_pParser->GetTargetName(m_ws1); + break; + case FDE_XMLSYNTAXSTATUS_AttriValue: + m_pParser->GetAttributeName(m_ws2); + if (m_pTagTop == NULL) { + dwRet = FDE_XMLSYNTAXSTATUS_Error; + break; + } + if (m_pTagTop->eType == FDE_XMLNODE_Element) { + m_pHandler->OnAttribute(m_pHandler, m_ws1, m_ws2); + } + m_ws1.Empty(); + break; + case FDE_XMLSYNTAXSTATUS_CData: + m_pParser->GetTextData(m_ws1); + m_pHandler->OnData(m_pHandler, FDE_XMLNODE_CharData, m_ws1); + break; + case FDE_XMLSYNTAXSTATUS_Text: + m_pParser->GetTextData(m_ws1); + m_pHandler->OnData(m_pHandler, FDE_XMLNODE_Text, m_ws1); + break; + case FDE_XMLSYNTAXSTATUS_TargetData: + m_pParser->GetTargetData(m_ws1); + m_pHandler->OnData(m_pHandler, FDE_XMLNODE_Instruction, m_ws1); + m_ws1.Empty(); + break; + default: + break; + } + if (dwRet == FDE_XMLSYNTAXSTATUS_Error || dwRet == FDE_XMLSYNTAXSTATUS_EOS) { + break; + } + if (pPause != NULL && iCount > 500 && pPause->NeedToPauseNow()) { + break; + } + } + return m_pParser->GetStatus(); +} +inline void CFDE_XMLSAXParser::Push(const CFDE_XMLTAG &xmlTag) +{ + m_TagStack.Push(xmlTag); + m_pTagTop = m_TagStack.GetTopElement(); +} +inline void CFDE_XMLSAXParser::Pop() +{ + m_TagStack.Pop(); + m_pTagTop = m_TagStack.GetTopElement(); +} +#ifdef _FDE_BLOCK_BUFFER +CFDE_BlockBuffer::CFDE_BlockBuffer(FX_INT32 iAllocStep) + : m_iAllocStep(iAllocStep), + m_iStartPosition(0), + m_iBufferSize(0), + m_iDataLength(0) +{ +} +CFDE_BlockBuffer::~CFDE_BlockBuffer() +{ + ClearBuffer(); +} +FX_LPWSTR CFDE_BlockBuffer::GetAvailableBlock(FX_INT32& iIndexInBlock) +{ + iIndexInBlock = 0; + FX_INT32 iBlockNum = m_BlockArray.GetSize(); + if (iBlockNum == 0) { + return NULL; + } + FX_INT32 iRealIndex = m_iStartPosition + m_iDataLength; + FX_LPWSTR pDataBlock = NULL; + if(iRealIndex == m_iBufferSize) { + FX_LPWSTR pBlock = (FX_LPWSTR)FDE_Alloc(m_iAllocStep * sizeof(FX_WCHAR)); + if (pBlock) { + m_BlockArray.Add(pBlock); + m_iBufferSize += m_iAllocStep; + } + iIndexInBlock = 0; + pDataBlock = pBlock; + } else { + FX_INT32 iBlockIndex = iRealIndex / m_iAllocStep; + FX_INT32 iInnerIndex = iRealIndex % m_iAllocStep; + iIndexInBlock = iInnerIndex; + pDataBlock = (FX_LPWSTR)m_BlockArray[iBlockIndex]; + } + return pDataBlock; +} +FX_BOOL CFDE_BlockBuffer::InitBuffer(FX_INT32 iBufferSize) +{ + ClearBuffer(); + FX_INT32 iNumOfBlock = (iBufferSize - 1) / m_iAllocStep + 1; + for (FX_INT32 i = 0; i < iNumOfBlock; i++) { + FX_LPWSTR pBlockBuffer = (FX_LPWSTR)FDE_Alloc(m_iAllocStep * sizeof(FX_WCHAR)); + if (pBlockBuffer == NULL) { + ClearBuffer(); + return FALSE; + } + m_BlockArray.Add(pBlockBuffer); + } + m_iBufferSize = iNumOfBlock * m_iAllocStep; + return TRUE; +} +void CFDE_BlockBuffer::SetTextChar(FX_INT32 iIndex, FX_WCHAR ch) +{ + if (iIndex < 0) { + return; + } + FX_INT32 iRealIndex = m_iStartPosition + iIndex; + FX_INT32 iBlockIndex = iRealIndex / m_iAllocStep; + FX_INT32 iInnerIndex = iRealIndex % m_iAllocStep; + FX_INT32 iBlockSize = m_BlockArray.GetSize(); + if (iBlockIndex >= iBlockSize) { + FX_INT32 iNewBlocks = iBlockIndex - iBlockSize + 1; + do { + FX_LPWSTR pBlock = (FX_LPWSTR)FDE_Alloc(m_iAllocStep * sizeof(FX_WCHAR)); + if (!pBlock) { + return; + } + m_BlockArray.Add(pBlock); + m_iBufferSize += m_iAllocStep; + } while (--iNewBlocks); + } + FX_LPWSTR pTextData = (FX_LPWSTR)m_BlockArray[iBlockIndex]; + *(pTextData + iInnerIndex) = ch; + if (m_iDataLength <= iIndex) { + m_iDataLength = iIndex + 1; + } +} +FX_INT32 CFDE_BlockBuffer::DeleteTextChars(FX_INT32 iCount, FX_BOOL bDirection ) +{ + if (iCount <= 0) { + return m_iDataLength; + } + if (iCount >= m_iDataLength) { + Reset(FALSE); + return 0; + } + if (bDirection) { + m_iStartPosition += iCount; + m_iDataLength -= iCount; + } else { + m_iDataLength -= iCount; + } + return m_iDataLength; +} +void CFDE_BlockBuffer::GetTextData(CFX_WideString& wsTextData, FX_INT32 iStart, FX_INT32 iLength) const +{ + wsTextData.Empty(); + FX_INT32 iMaybeDataLength = m_iBufferSize - 1 - m_iStartPosition; + if (iStart < 0 || iStart > iMaybeDataLength) { + return; + } + if (iLength == -1 || iLength > iMaybeDataLength) { + iLength = iMaybeDataLength; + } + if (iLength <= 0) { + return; + } + FX_LPWSTR pBuf = wsTextData.GetBuffer(iLength); + if (!pBuf) { + return; + } + FX_INT32 iStartBlockIndex = 0; + FX_INT32 iStartInnerIndex = 0; + TextDataIndex2BufIndex(iStart, iStartBlockIndex, iStartInnerIndex); + FX_INT32 iEndBlockIndex = 0; + FX_INT32 iEndInnerIndex = 0; + TextDataIndex2BufIndex(iStart + iLength, iEndBlockIndex, iEndInnerIndex); + FX_INT32 iPointer = 0; + for (FX_INT32 i = iStartBlockIndex; i <= iEndBlockIndex; i++) { + FX_INT32 iBufferPointer = 0; + FX_INT32 iCopyLength = m_iAllocStep; + if (i == iStartBlockIndex) { + iCopyLength -= iStartInnerIndex; + iBufferPointer = iStartInnerIndex; + } + if (i == iEndBlockIndex) { + iCopyLength -= ((m_iAllocStep - 1) - iEndInnerIndex); + } + FX_LPWSTR pBlockBuf = (FX_LPWSTR)m_BlockArray[i]; + FXSYS_memcpy(pBuf + iPointer, pBlockBuf + iBufferPointer, iCopyLength * sizeof(FX_WCHAR)); + iPointer += iCopyLength; + } + wsTextData.ReleaseBuffer(iLength); +} +void CFDE_BlockBuffer::TextDataIndex2BufIndex(const FX_INT32 iIndex, FX_INT32& iBlockIndex, FX_INT32& iInnerIndex) const +{ + FXSYS_assert(iIndex >= 0); + FX_INT32 iRealIndex = m_iStartPosition + iIndex; + iBlockIndex = iRealIndex / m_iAllocStep; + iInnerIndex = iRealIndex % m_iAllocStep; +} +void CFDE_BlockBuffer::ClearBuffer() +{ + m_iBufferSize = 0; + FX_INT32 iSize = m_BlockArray.GetSize(); + for (FX_INT32 i = 0; i < iSize; i++) { + FDE_Free(m_BlockArray[i]); + m_BlockArray[i] = NULL; + } + m_BlockArray.RemoveAll(); +} +#endif +IFDE_XMLSyntaxParser* IFDE_XMLSyntaxParser::Create() +{ + return FDE_New CFDE_XMLSyntaxParser; +} +#ifdef _FDE_BLOCK_BUFFER +CFDE_XMLSyntaxParser::CFDE_XMLSyntaxParser() + : m_pStream(NULL) + , m_iXMLPlaneSize(-1) + , m_iCurrentPos(0) + , m_iCurrentNodeNum(-1) + , m_iLastNodeNum(-1) + , m_iParsedChars(0) + , m_iParsedBytes(0) + , m_pBuffer(NULL) + , m_iBufferChars(0) + , m_bEOS(FALSE) + , m_pStart(NULL) + , m_pEnd(NULL) + , m_XMLNodeStack(16) + , m_dwStatus(FDE_XMLSYNTAXSTATUS_None) + , m_dwMode(FDE_XMLSYNTAXMODE_Text) + , m_wQuotationMark(0) + , m_BlockBuffer() + , m_pCurrentBlock(NULL) + , m_iIndexInBlock(0) + , m_iDataLength(m_BlockBuffer.GetDataLengthRef()) + , m_iAllocStep(m_BlockBuffer.GetAllocStep()) + , m_iTextDataLength(0) + , m_iEntityStart(-1) + , m_SkipStack(16) +{ + m_CurNode.iNodeNum = -1; + m_CurNode.eNodeType = FDE_XMLNODE_Unknown; +} +void CFDE_XMLSyntaxParser::Init(IFX_Stream *pStream, FX_INT32 iXMLPlaneSize, FX_INT32 iTextDataSize ) +{ + FXSYS_assert(m_pStream == NULL && m_pBuffer == NULL); + FXSYS_assert(pStream != NULL && iXMLPlaneSize > 0); + FX_INT32 iStreamLength = pStream->GetLength(); + FXSYS_assert(iStreamLength > 0); + m_pStream = pStream; + m_iXMLPlaneSize = FX_MIN(iXMLPlaneSize, iStreamLength); + FX_BYTE bom[4]; + m_iCurrentPos = m_pStream->GetBOM(bom); + FXSYS_assert(m_pBuffer == NULL); + m_pBuffer = (FX_LPWSTR)FDE_Alloc(m_iXMLPlaneSize * sizeof(FX_WCHAR)); + m_pStart = m_pEnd = m_pBuffer; + FXSYS_assert(!m_BlockBuffer.IsInitialized()); + m_BlockBuffer.InitBuffer(); + m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); + m_iParsedBytes = m_iParsedChars = 0; + m_iBufferChars = 0; +} +FX_DWORD CFDE_XMLSyntaxParser::DoSyntaxParse() +{ + if (m_dwStatus == FDE_XMLSYNTAXSTATUS_Error || m_dwStatus == FDE_XMLSYNTAXSTATUS_EOS) { + return m_dwStatus; + } + FXSYS_assert(m_pStream != NULL && m_pBuffer != NULL && m_BlockBuffer.IsInitialized()); + FX_INT32 iStreamLength = m_pStream->GetLength(); + FX_INT32 iPos; + FX_WCHAR ch; + FX_DWORD dwStatus = FDE_XMLSYNTAXSTATUS_None; + while (TRUE) { + if (m_pStart >= m_pEnd) { + if (m_bEOS || m_iCurrentPos >= iStreamLength) { + m_dwStatus = FDE_XMLSYNTAXSTATUS_EOS; + return m_dwStatus; + } + m_iParsedChars += (m_pEnd - m_pBuffer); + m_iParsedBytes = m_iCurrentPos; + m_pStream->Lock(); + if (m_pStream->GetPosition() != m_iCurrentPos) { + m_pStream->Seek(FX_STREAMSEEK_Begin, m_iCurrentPos); + } + m_iBufferChars = m_pStream->ReadString(m_pBuffer, m_iXMLPlaneSize, m_bEOS); + iPos = m_pStream->GetPosition(); + m_pStream->Unlock(); + if (m_iBufferChars < 1) { + m_iCurrentPos = iStreamLength; + m_dwStatus = FDE_XMLSYNTAXSTATUS_EOS; + return m_dwStatus; + } + m_iCurrentPos = iPos; + m_pStart = m_pBuffer; + m_pEnd = m_pBuffer + m_iBufferChars; + } + while (m_pStart < m_pEnd) { + ch = *m_pStart; + switch (m_dwMode) { + case FDE_XMLSYNTAXMODE_Text: + if (ch == L'<') { + if (m_iDataLength > 0) { + m_iTextDataLength = m_iDataLength; + m_BlockBuffer.Reset(); + m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); + m_iEntityStart = -1; + dwStatus = FDE_XMLSYNTAXSTATUS_Text; + } else { + m_pStart ++; + m_dwMode = FDE_XMLSYNTAXMODE_Node; + } + } else { + ParseTextChar(ch); + } + break; + case FDE_XMLSYNTAXMODE_Node: + if (ch == L'!') { + m_pStart ++; + m_dwMode = FDE_XMLSYNTAXMODE_SkipCommentOrDecl; + } else if (ch == L'/') { + m_pStart ++; + m_dwMode = FDE_XMLSYNTAXMODE_CloseElement; + } else if (ch == L'?') { + m_iLastNodeNum ++; + m_iCurrentNodeNum = m_iLastNodeNum; + m_CurNode.iNodeNum = m_iLastNodeNum; + m_CurNode.eNodeType = FDE_XMLNODE_Instruction; + m_XMLNodeStack.Push(m_CurNode); + m_pStart ++; + m_dwMode = FDE_XMLSYNTAXMODE_Target; + dwStatus = FDE_XMLSYNTAXSTATUS_InstructionOpen; + } else { + m_iLastNodeNum ++; + m_iCurrentNodeNum = m_iLastNodeNum; + m_CurNode.iNodeNum = m_iLastNodeNum; + m_CurNode.eNodeType = FDE_XMLNODE_Element; + m_XMLNodeStack.Push(m_CurNode); + m_dwMode = FDE_XMLSYNTAXMODE_Tag; + dwStatus = FDE_XMLSYNTAXSTATUS_ElementOpen; + } + break; + case FDE_XMLSYNTAXMODE_Target: + case FDE_XMLSYNTAXMODE_Tag: + if (!FDE_IsXMLNameChar(ch, m_iDataLength < 1)) { + if (m_iDataLength < 1) { + m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; + return m_dwStatus; + } else { + m_iTextDataLength = m_iDataLength; + m_BlockBuffer.Reset(); + m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); + if (m_dwMode != FDE_XMLSYNTAXMODE_Target) { + dwStatus = FDE_XMLSYNTAXSTATUS_TagName; + } else { + dwStatus = FDE_XMLSYNTAXSTATUS_TargetName; + } + m_dwMode = FDE_XMLSYNTAXMODE_AttriName; + } + } else { + if (m_iIndexInBlock == m_iAllocStep) { + m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); + if (!m_pCurrentBlock) { + return FDE_XMLSYNTAXSTATUS_Error; + } + } + m_pCurrentBlock[m_iIndexInBlock++] = ch; + m_iDataLength++; + m_pStart ++; + } + break; + case FDE_XMLSYNTAXMODE_AttriName: + if (m_iDataLength < 1 && FDE_IsXMLWhiteSpace(ch)) { + m_pStart ++; + break; + } + if (!FDE_IsXMLNameChar(ch, m_iDataLength < 1)) { + if (m_iDataLength < 1) { + if (m_CurNode.eNodeType == FDE_XMLNODE_Element) { + if (ch == L'>' || ch == L'/') { + m_dwMode = FDE_XMLSYNTAXMODE_BreakElement; + break; + } + } else if (m_CurNode.eNodeType == FDE_XMLNODE_Instruction) { + if (ch == L'?') { + m_dwMode = FDE_XMLSYNTAXMODE_CloseInstruction; + m_pStart++; + } else { + m_dwMode = FDE_XMLSYNTAXMODE_TargetData; + } + break; + } + m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; + return m_dwStatus; + } else { + if (m_CurNode.eNodeType == FDE_XMLNODE_Instruction) { + if (ch != '=' && !FDE_IsXMLWhiteSpace(ch)) { + m_dwMode = FDE_XMLSYNTAXMODE_TargetData; + break; + } + } + m_iTextDataLength = m_iDataLength; + m_BlockBuffer.Reset(); + m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); + m_dwMode = FDE_XMLSYNTAXMODE_AttriEqualSign; + dwStatus = FDE_XMLSYNTAXSTATUS_AttriName; + } + } else { + if (m_iIndexInBlock == m_iAllocStep) { + m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); + if (!m_pCurrentBlock) { + return FDE_XMLSYNTAXSTATUS_Error; + } + } + m_pCurrentBlock[m_iIndexInBlock++] = ch; + m_iDataLength++; + m_pStart ++; + } + break; + case FDE_XMLSYNTAXMODE_AttriEqualSign: + if (FDE_IsXMLWhiteSpace(ch)) { + m_pStart ++; + break; + } + if (ch != L'=') { + if (m_CurNode.eNodeType == FDE_XMLNODE_Instruction) { + m_dwMode = FDE_XMLSYNTAXMODE_TargetData; + break; + } + m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; + return m_dwStatus; + } else { + m_dwMode = FDE_XMLSYNTAXMODE_AttriQuotation; + m_pStart ++; + } + break; + case FDE_XMLSYNTAXMODE_AttriQuotation: + if (FDE_IsXMLWhiteSpace(ch)) { + m_pStart ++; + break; + } + if (ch != L'\"' && ch != L'\'') { + m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; + return m_dwStatus; + } else { + m_wQuotationMark = ch; + m_dwMode = FDE_XMLSYNTAXMODE_AttriValue; + m_pStart ++; + } + break; + case FDE_XMLSYNTAXMODE_AttriValue: + if (ch == m_wQuotationMark) { + if (m_iEntityStart > -1) { + m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; + return m_dwStatus; + } + m_iTextDataLength = m_iDataLength; + m_wQuotationMark = 0; + m_BlockBuffer.Reset(); + m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); + m_pStart ++; + m_dwMode = FDE_XMLSYNTAXMODE_AttriName; + dwStatus = FDE_XMLSYNTAXSTATUS_AttriValue; + } else { + ParseTextChar(ch); + } + break; + case FDE_XMLSYNTAXMODE_CloseInstruction: + if (ch != L'>') { + if (m_iIndexInBlock == m_iAllocStep) { + m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); + if (!m_pCurrentBlock) { + return FDE_XMLSYNTAXSTATUS_Error; + } + } + m_pCurrentBlock[m_iIndexInBlock++] = ch; + m_iDataLength++; + m_dwMode = FDE_XMLSYNTAXMODE_TargetData; + } else if (m_iDataLength > 0) { + m_iTextDataLength = m_iDataLength; + m_BlockBuffer.Reset(); + m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); + dwStatus = FDE_XMLSYNTAXSTATUS_TargetData; + } else { + m_pStart ++; + FDE_LPXMLNODE pXMLNode = m_XMLNodeStack.GetTopElement(); + if (pXMLNode == NULL) { + m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; + return m_dwStatus; + } + m_XMLNodeStack.Pop(); + pXMLNode = m_XMLNodeStack.GetTopElement(); + if (pXMLNode == NULL) { + m_CurNode.iNodeNum = -1; + m_CurNode.eNodeType = FDE_XMLNODE_Unknown; + } else { + m_CurNode = *pXMLNode; + } + m_iCurrentNodeNum = m_CurNode.iNodeNum; + m_BlockBuffer.Reset(); + m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); + m_dwMode = FDE_XMLSYNTAXMODE_Text; + dwStatus = FDE_XMLSYNTAXSTATUS_InstructionClose; + } + break; + case FDE_XMLSYNTAXMODE_BreakElement: + if (ch == L'>') { + m_dwMode = FDE_XMLSYNTAXMODE_Text; + dwStatus = FDE_XMLSYNTAXSTATUS_ElementBreak; + } else if (ch == L'/') { + m_dwMode = FDE_XMLSYNTAXMODE_CloseElement; + } else { + m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; + return m_dwStatus; + } + m_pStart ++; + break; + case FDE_XMLSYNTAXMODE_CloseElement: + if (!FDE_IsXMLNameChar(ch, m_iDataLength < 1)) { + if (ch == L'>') { + FDE_LPXMLNODE pXMLNode = m_XMLNodeStack.GetTopElement(); + if (pXMLNode == NULL) { + m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; + return m_dwStatus; + } + m_XMLNodeStack.Pop(); + pXMLNode = m_XMLNodeStack.GetTopElement(); + if (pXMLNode == NULL) { + m_CurNode.iNodeNum = -1; + m_CurNode.eNodeType = FDE_XMLNODE_Unknown; + } else { + m_CurNode = *pXMLNode; + } + m_iCurrentNodeNum = m_CurNode.iNodeNum; + m_iTextDataLength = m_iDataLength; + m_BlockBuffer.Reset(); + m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); + m_dwMode = FDE_XMLSYNTAXMODE_Text; + dwStatus = FDE_XMLSYNTAXSTATUS_ElementClose; + } else if (!FDE_IsXMLWhiteSpace(ch)) { + m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; + return m_dwStatus; + } + } else { + if (m_iIndexInBlock == m_iAllocStep) { + m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); + if (!m_pCurrentBlock) { + return FDE_XMLSYNTAXSTATUS_Error; + } + } + m_pCurrentBlock[m_iIndexInBlock++] = ch; + m_iDataLength++; + } + m_pStart ++; + break; + case FDE_XMLSYNTAXMODE_SkipCommentOrDecl: + if (ch == '-') { + m_dwMode = FDE_XMLSYNTAXMODE_SkipComment; + } else { + m_dwMode = FDE_XMLSYNTAXMODE_SkipDeclNode; + m_SkipChar = L'>'; + m_SkipStack.Push(L'>'); + } + break; + case FDE_XMLSYNTAXMODE_SkipDeclNode: + if (m_SkipChar == L'\'' || m_SkipChar == L'\"') { + m_pStart ++; + if (ch != m_SkipChar) { + break; + } + m_SkipStack.Pop(); + FX_LPDWORD pDWord = m_SkipStack.GetTopElement(); + if (pDWord == NULL) { + m_dwMode = FDE_XMLSYNTAXMODE_Text; + } else { + m_SkipChar = (FX_WCHAR) * pDWord; + } + } else { + switch (ch) { + case L'<': + m_SkipChar = L'>'; + m_SkipStack.Push(L'>'); + break; + case L'[': + m_SkipChar = L']'; + m_SkipStack.Push(L']'); + break; + case L'(': + m_SkipChar = L')'; + m_SkipStack.Push(L')'); + break; + case L'\'': + m_SkipChar = L'\''; + m_SkipStack.Push(L'\''); + break; + case L'\"': + m_SkipChar = L'\"'; + m_SkipStack.Push(L'\"'); + break; + default: + if (ch == m_SkipChar) { + m_SkipStack.Pop(); + FX_LPDWORD pDWord = m_SkipStack.GetTopElement(); + if (pDWord == NULL) { + if (m_iDataLength >= 9) { + CFX_WideString wsHeader; + m_BlockBuffer.GetTextData(wsHeader, 0, 7); + if (wsHeader.Equal(FX_WSTRC(L"[CDATA["))) { + CFX_WideString wsTailer; + m_BlockBuffer.GetTextData(wsTailer, m_iDataLength - 2, 2); + if (wsTailer.Equal(FX_WSTRC(L"]]"))) { + m_BlockBuffer.DeleteTextChars(7, TRUE); + m_BlockBuffer.DeleteTextChars(2, FALSE); + dwStatus = FDE_XMLSYNTAXSTATUS_CData; + } + } + } + m_iTextDataLength = m_iDataLength; + m_BlockBuffer.Reset(); + m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); + m_dwMode = FDE_XMLSYNTAXMODE_Text; + } else { + m_SkipChar = (FX_WCHAR) * pDWord; + } + } + break; + } + if (m_SkipStack.GetSize() > 0) { + if (m_iIndexInBlock == m_iAllocStep) { + m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); + if (!m_pCurrentBlock) { + return FDE_XMLSYNTAXSTATUS_Error; + } + } + m_pCurrentBlock[m_iIndexInBlock++] = ch; + m_iDataLength++; + } + m_pStart ++; + } + break; + case FDE_XMLSYNTAXMODE_SkipComment: + if (ch == L'-') { + if (m_iIndexInBlock == m_iAllocStep) { + m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); + if (!m_pCurrentBlock) { + return FDE_XMLSYNTAXSTATUS_Error; + } + } + m_pCurrentBlock[m_iIndexInBlock++] = L'-'; + m_iDataLength++; + } else if (ch == L'>') { + if (m_iDataLength > 1) { + m_BlockBuffer.Reset(); + m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); + m_dwMode = FDE_XMLSYNTAXMODE_Text; + } + } else { + m_BlockBuffer.Reset(); + m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); + } + m_pStart++; + break; + case FDE_XMLSYNTAXMODE_TargetData: + if (FDE_IsXMLWhiteSpace(ch)) { + if (m_iDataLength < 1) { + m_pStart ++; + break; + } else if (m_wQuotationMark == 0) { + m_iTextDataLength = m_iDataLength; + m_wQuotationMark = 0; + m_BlockBuffer.Reset(); + m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); + m_pStart ++; + dwStatus = FDE_XMLSYNTAXSTATUS_TargetData; + break; + } + } + if (ch == '?') { + m_dwMode = FDE_XMLSYNTAXMODE_CloseInstruction; + m_pStart++; + } else if (ch == '\"') { + if (m_wQuotationMark == 0) { + m_wQuotationMark = ch; + m_pStart++; + } else if (ch == m_wQuotationMark) { + m_iTextDataLength = m_iDataLength; + m_wQuotationMark = 0; + m_BlockBuffer.Reset(); + m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); + m_pStart ++; + dwStatus = FDE_XMLSYNTAXSTATUS_TargetData; + } else { + m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; + return m_dwStatus; + } + } else { + if (m_iIndexInBlock == m_iAllocStep) { + m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); + if (!m_pCurrentBlock) { + return FDE_XMLSYNTAXSTATUS_Error; + } + } + m_pCurrentBlock[m_iIndexInBlock++] = ch; + m_iDataLength++; + m_pStart ++; + } + break; + default: + break; + } + if (dwStatus != FDE_XMLSYNTAXSTATUS_None) { + return dwStatus; + } + } + } + return 0; +} +#else +CFDE_XMLSyntaxParser::CFDE_XMLSyntaxParser() + : m_pStream(NULL) + , m_iXMLPlaneSize(-1) + , m_iTextDataSize(256) + , m_iCurrentPos(0) + , m_iCurrentNodeNum(-1) + , m_iLastNodeNum(-1) + , m_iParsedChars(0) + , m_iParsedBytes(0) + , m_pBuffer(NULL) + , m_iBufferChars(0) + , m_bEOS(FALSE) + , m_pStart(NULL) + , m_pEnd(NULL) + , m_XMLNodeStack(16) + , m_pwsTextData(NULL) + , m_iDataPos(0) + , m_dwStatus(FDE_XMLSYNTAXSTATUS_None) + , m_dwMode(FDE_XMLSYNTAXMODE_Text) + , m_wQuotationMark(0) + , m_iTextDataLength(0) + , m_iEntityStart(-1) + , m_SkipStack(16) +{ + m_CurNode.iNodeNum = -1; + m_CurNode.eNodeType = FDE_XMLNODE_Unknown; +} +void CFDE_XMLSyntaxParser::Init(IFX_Stream *pStream, FX_INT32 iXMLPlaneSize, FX_INT32 iTextDataSize ) +{ + FXSYS_assert(m_pStream == NULL && m_pBuffer == NULL); + FXSYS_assert(pStream != NULL && iXMLPlaneSize > 0 && iTextDataSize > 0); + FX_INT32 iStreamLength = pStream->GetLength(); + FXSYS_assert(iStreamLength > 0); + m_pStream = pStream; + m_iXMLPlaneSize = FX_MIN(iXMLPlaneSize, iStreamLength); + m_iTextDataSize = iTextDataSize; + FX_BYTE bom[4]; + m_iCurrentPos = m_pStream->GetBOM(bom); + FXSYS_assert(m_pBuffer == NULL); + m_pBuffer = (FX_LPWSTR)FDE_Alloc(m_iXMLPlaneSize * sizeof(FX_WCHAR)); + m_pStart = m_pEnd = m_pBuffer; + FXSYS_assert(m_pwsTextData == NULL); + m_pwsTextData = (FX_LPWSTR)FDE_Alloc(m_iTextDataSize * sizeof(FX_WCHAR)); + m_iParsedBytes = m_iParsedChars = 0; + m_iBufferChars = 0; +} +FX_DWORD CFDE_XMLSyntaxParser::DoSyntaxParse() +{ + if (m_dwStatus == FDE_XMLSYNTAXSTATUS_Error || m_dwStatus == FDE_XMLSYNTAXSTATUS_EOS) { + return m_dwStatus; + } + FXSYS_assert(m_pStream != NULL && m_pBuffer != NULL && m_pwsTextData != NULL); + FX_INT32 iStreamLength = m_pStream->GetLength(); + FX_INT32 iPos; + FX_WCHAR ch; + FX_DWORD dwStatus = FDE_XMLSYNTAXSTATUS_None; + while (TRUE) { + if (m_pStart >= m_pEnd) { + if (m_bEOS || m_iCurrentPos >= iStreamLength) { + m_dwStatus = FDE_XMLSYNTAXSTATUS_EOS; + return m_dwStatus; + } + m_iParsedChars += (m_pEnd - m_pBuffer); + m_iParsedBytes = m_iCurrentPos; + m_pStream->Lock(); + if (m_pStream->GetPosition() != m_iCurrentPos) { + m_pStream->Seek(FX_STREAMSEEK_Begin, m_iCurrentPos); + } + m_iBufferChars = m_pStream->ReadString(m_pBuffer, m_iXMLPlaneSize, m_bEOS); + iPos = m_pStream->GetPosition(); + m_pStream->Unlock(); + if (m_iBufferChars < 1) { + m_iCurrentPos = iStreamLength; + m_dwStatus = FDE_XMLSYNTAXSTATUS_EOS; + return m_dwStatus; + } + m_iCurrentPos = iPos; + m_pStart = m_pBuffer; + m_pEnd = m_pBuffer + m_iBufferChars; + } + while (m_pStart < m_pEnd) { + ch = *m_pStart; + switch (m_dwMode) { + case FDE_XMLSYNTAXMODE_Text: + if (ch == L'<') { + if (m_iDataPos > 0) { + m_iTextDataLength = m_iDataPos; + m_iDataPos = 0; + m_iEntityStart = -1; + dwStatus = FDE_XMLSYNTAXSTATUS_Text; + } else { + m_pStart ++; + m_dwMode = FDE_XMLSYNTAXMODE_Node; + } + } else { + ParseTextChar(ch); + } + break; + case FDE_XMLSYNTAXMODE_Node: + if (ch == L'!') { + m_pStart ++; + m_dwMode = FDE_XMLSYNTAXMODE_SkipCommentOrDecl; + } else if (ch == L'/') { + m_pStart ++; + m_dwMode = FDE_XMLSYNTAXMODE_CloseElement; + } else if (ch == L'?') { + m_iLastNodeNum ++; + m_iCurrentNodeNum = m_iLastNodeNum; + m_CurNode.iNodeNum = m_iLastNodeNum; + m_CurNode.eNodeType = FDE_XMLNODE_Instruction; + m_XMLNodeStack.Push(m_CurNode); + m_pStart ++; + m_dwMode = FDE_XMLSYNTAXMODE_Target; + dwStatus = FDE_XMLSYNTAXSTATUS_InstructionOpen; + } else { + m_iLastNodeNum ++; + m_iCurrentNodeNum = m_iLastNodeNum; + m_CurNode.iNodeNum = m_iLastNodeNum; + m_CurNode.eNodeType = FDE_XMLNODE_Element; + m_XMLNodeStack.Push(m_CurNode); + m_dwMode = FDE_XMLSYNTAXMODE_Tag; + dwStatus = FDE_XMLSYNTAXSTATUS_ElementOpen; + } + break; + case FDE_XMLSYNTAXMODE_Target: + case FDE_XMLSYNTAXMODE_Tag: + if (!FDE_IsXMLNameChar(ch, m_iDataPos < 1)) { + if (m_iDataPos < 1) { + m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; + return m_dwStatus; + } else { + m_iTextDataLength = m_iDataPos; + m_iDataPos = 0; + if (m_dwMode != FDE_XMLSYNTAXMODE_Target) { + dwStatus = FDE_XMLSYNTAXSTATUS_TagName; + } else { + dwStatus = FDE_XMLSYNTAXSTATUS_TargetName; + } + m_dwMode = FDE_XMLSYNTAXMODE_AttriName; + } + } else { + if (m_iDataPos >= m_iTextDataSize) { + ReallocTextDataBuffer(); + } + m_pwsTextData[m_iDataPos ++] = ch; + m_pStart ++; + } + break; + case FDE_XMLSYNTAXMODE_AttriName: + if (m_iDataPos < 1 && FDE_IsXMLWhiteSpace(ch)) { + m_pStart ++; + break; + } + if (!FDE_IsXMLNameChar(ch, m_iDataPos < 1)) { + if (m_iDataPos < 1) { + if (m_CurNode.eNodeType == FDE_XMLNODE_Element) { + if (ch == L'>' || ch == L'/') { + m_dwMode = FDE_XMLSYNTAXMODE_BreakElement; + break; + } + } else if (m_CurNode.eNodeType == FDE_XMLNODE_Instruction) { + if (ch == L'?') { + m_dwMode = FDE_XMLSYNTAXMODE_CloseInstruction; + m_pStart++; + } else { + m_dwMode = FDE_XMLSYNTAXMODE_TargetData; + } + break; + } + m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; + return m_dwStatus; + } else { + if (m_CurNode.eNodeType == FDE_XMLNODE_Instruction) { + if (ch != '=' && !FDE_IsXMLWhiteSpace(ch)) { + m_dwMode = FDE_XMLSYNTAXMODE_TargetData; + break; + } + } + m_iTextDataLength = m_iDataPos; + m_iDataPos = 0; + m_dwMode = FDE_XMLSYNTAXMODE_AttriEqualSign; + dwStatus = FDE_XMLSYNTAXSTATUS_AttriName; + } + } else { + if (m_iDataPos >= m_iTextDataSize) { + ReallocTextDataBuffer(); + } + m_pwsTextData[m_iDataPos ++] = ch; + m_pStart ++; + } + break; + case FDE_XMLSYNTAXMODE_AttriEqualSign: + if (FDE_IsXMLWhiteSpace(ch)) { + m_pStart ++; + break; + } + if (ch != L'=') { + if (m_CurNode.eNodeType == FDE_XMLNODE_Instruction) { + m_dwMode = FDE_XMLSYNTAXMODE_TargetData; + break; + } + m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; + return m_dwStatus; + } else { + m_dwMode = FDE_XMLSYNTAXMODE_AttriQuotation; + m_pStart ++; + } + break; + case FDE_XMLSYNTAXMODE_AttriQuotation: + if (FDE_IsXMLWhiteSpace(ch)) { + m_pStart ++; + break; + } + if (ch != L'\"' && ch != L'\'') { + m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; + return m_dwStatus; + } else { + m_wQuotationMark = ch; + m_dwMode = FDE_XMLSYNTAXMODE_AttriValue; + m_pStart ++; + } + break; + case FDE_XMLSYNTAXMODE_AttriValue: + if (ch == m_wQuotationMark) { + if (m_iEntityStart > -1) { + m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; + return m_dwStatus; + } + m_iTextDataLength = m_iDataPos; + m_wQuotationMark = 0; + m_iDataPos = 0; + m_pStart ++; + m_dwMode = FDE_XMLSYNTAXMODE_AttriName; + dwStatus = FDE_XMLSYNTAXSTATUS_AttriValue; + } else { + ParseTextChar(ch); + } + break; + case FDE_XMLSYNTAXMODE_CloseInstruction: + if (ch != L'>') { + if (m_iDataPos >= m_iTextDataSize) { + ReallocTextDataBuffer(); + } + m_pwsTextData[m_iDataPos ++] = ch; + m_dwMode = FDE_XMLSYNTAXMODE_TargetData; + } else if (m_iDataPos > 0) { + m_iTextDataLength = m_iDataPos; + m_iDataPos = 0; + dwStatus = FDE_XMLSYNTAXSTATUS_TargetData; + } else { + m_pStart ++; + FDE_LPXMLNODE pXMLNode = m_XMLNodeStack.GetTopElement(); + if (pXMLNode == NULL) { + m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; + return m_dwStatus; + } + m_XMLNodeStack.Pop(); + pXMLNode = m_XMLNodeStack.GetTopElement(); + if (pXMLNode == NULL) { + m_CurNode.iNodeNum = -1; + m_CurNode.eNodeType = FDE_XMLNODE_Unknown; + } else { + m_CurNode = *pXMLNode; + } + m_iCurrentNodeNum = m_CurNode.iNodeNum; + m_iDataPos = 0; + m_dwMode = FDE_XMLSYNTAXMODE_Text; + dwStatus = FDE_XMLSYNTAXSTATUS_InstructionClose; + } + break; + case FDE_XMLSYNTAXMODE_BreakElement: + if (ch == L'>') { + m_dwMode = FDE_XMLSYNTAXMODE_Text; + dwStatus = FDE_XMLSYNTAXSTATUS_ElementBreak; + } else if (ch == L'/') { + m_dwMode = FDE_XMLSYNTAXMODE_CloseElement; + } else { + m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; + return m_dwStatus; + } + m_pStart ++; + break; + case FDE_XMLSYNTAXMODE_CloseElement: + if (!FDE_IsXMLNameChar(ch, m_iDataPos < 1)) { + if (ch == L'>') { + FDE_LPXMLNODE pXMLNode = m_XMLNodeStack.GetTopElement(); + if (pXMLNode == NULL) { + m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; + return m_dwStatus; + } + m_XMLNodeStack.Pop(); + pXMLNode = m_XMLNodeStack.GetTopElement(); + if (pXMLNode == NULL) { + m_CurNode.iNodeNum = -1; + m_CurNode.eNodeType = FDE_XMLNODE_Unknown; + } else { + m_CurNode = *pXMLNode; + } + m_iCurrentNodeNum = m_CurNode.iNodeNum; + m_iTextDataLength = m_iDataPos; + m_iDataPos = 0; + m_dwMode = FDE_XMLSYNTAXMODE_Text; + dwStatus = FDE_XMLSYNTAXSTATUS_ElementClose; + } else if (!FDE_IsXMLWhiteSpace(ch)) { + m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; + return m_dwStatus; + } + } else { + if (m_iDataPos >= m_iTextDataSize) { + ReallocTextDataBuffer(); + } + m_pwsTextData[m_iDataPos ++] = ch; + } + m_pStart ++; + break; + case FDE_XMLSYNTAXMODE_SkipCommentOrDecl: + if (ch == '-') { + m_dwMode = FDE_XMLSYNTAXMODE_SkipComment; + } else { + m_dwMode = FDE_XMLSYNTAXMODE_SkipDeclNode; + m_SkipChar = L'>'; + m_SkipStack.Push(L'>'); + } + break; + case FDE_XMLSYNTAXMODE_SkipDeclNode: + if (m_SkipChar == L'\'' || m_SkipChar == L'\"') { + m_pStart ++; + if (ch != m_SkipChar) { + break; + } + m_SkipStack.Pop(); + FX_LPDWORD pDWord = m_SkipStack.GetTopElement(); + if (pDWord == NULL) { + m_dwMode = FDE_XMLSYNTAXMODE_Text; + } else { + m_SkipChar = (FX_WCHAR) * pDWord; + } + } else { + switch (ch) { + case L'<': + m_SkipChar = L'>'; + m_SkipStack.Push(L'>'); + break; + case L'[': + m_SkipChar = L']'; + m_SkipStack.Push(L']'); + break; + case L'(': + m_SkipChar = L')'; + m_SkipStack.Push(L')'); + break; + case L'\'': + m_SkipChar = L'\''; + m_SkipStack.Push(L'\''); + break; + case L'\"': + m_SkipChar = L'\"'; + m_SkipStack.Push(L'\"'); + break; + default: + if (ch == m_SkipChar) { + m_SkipStack.Pop(); + FX_LPDWORD pDWord = m_SkipStack.GetTopElement(); + if (pDWord == NULL) { + m_iTextDataLength = m_iDataPos; + m_iDataPos = 0; + if (m_iTextDataLength >= 9 + && FXSYS_memcmp(m_pwsTextData, L"[CDATA[", 7 * sizeof(FX_WCHAR)) == 0 + && FXSYS_memcmp(m_pwsTextData + m_iTextDataLength - 2, L"]]", 2 * sizeof(FX_WCHAR)) == 0) { + m_iTextDataLength -= 9; + FXSYS_memmove(m_pwsTextData, m_pwsTextData + 7, m_iTextDataLength * sizeof(FX_WCHAR)); + dwStatus = FDE_XMLSYNTAXSTATUS_CData; + } + m_dwMode = FDE_XMLSYNTAXMODE_Text; + } else { + m_SkipChar = (FX_WCHAR) * pDWord; + } + } + break; + } + if (m_SkipStack.GetSize() > 0) { + if (m_iDataPos >= m_iTextDataSize) { + ReallocTextDataBuffer(); + } + m_pwsTextData[m_iDataPos ++] = ch; + } + m_pStart ++; + } + break; + case FDE_XMLSYNTAXMODE_SkipComment: + if (ch == L'-') { + m_iDataPos++; + } else if (ch == L'>') { + if (m_iDataPos > 1) { + m_iDataPos = 0; + m_dwMode = FDE_XMLSYNTAXMODE_Text; + } + } else { + m_iDataPos = 0; + } + m_pStart++; + break; + case FDE_XMLSYNTAXMODE_TargetData: + if (FDE_IsXMLWhiteSpace(ch)) { + if (m_iDataPos < 1) { + m_pStart ++; + break; + } else if (m_wQuotationMark == 0) { + m_iTextDataLength = m_iDataPos; + m_wQuotationMark = 0; + m_iDataPos = 0; + m_pStart ++; + dwStatus = FDE_XMLSYNTAXSTATUS_TargetData; + break; + } + } + if (ch == '?') { + m_dwMode = FDE_XMLSYNTAXMODE_CloseInstruction; + m_pStart++; + } else if (ch == '\"') { + if (m_wQuotationMark == 0) { + m_wQuotationMark = ch; + m_pStart++; + } else if (ch == m_wQuotationMark) { + m_iTextDataLength = m_iDataPos; + m_wQuotationMark = 0; + m_iDataPos = 0; + m_pStart ++; + dwStatus = FDE_XMLSYNTAXSTATUS_TargetData; + } else { + m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; + return m_dwStatus; + } + } else { + if (m_iDataPos >= m_iTextDataSize) { + ReallocTextDataBuffer(); + } + m_pwsTextData[m_iDataPos ++] = ch; + m_pStart ++; + } + break; + default: + break; + } + if (dwStatus != FDE_XMLSYNTAXSTATUS_None) { + return dwStatus; + } + } + } + return 0; +} +#endif +CFDE_XMLSyntaxParser::~CFDE_XMLSyntaxParser() +{ +#ifdef _FDE_BLOCK_BUFFER + if (m_pCurrentBlock) { + m_pCurrentBlock = NULL; + } +#else + if (m_pwsTextData != NULL) { + FDE_Free(m_pwsTextData); + } +#endif + if (m_pBuffer != NULL) { + FDE_Free(m_pBuffer); + } +} +FX_INT32 CFDE_XMLSyntaxParser::GetStatus() const +{ + if (m_pStream == NULL) { + return -1; + } + FX_INT32 iStreamLength = m_pStream->GetLength(); + if (iStreamLength < 1) { + return 100; + } + if (m_dwStatus == FDE_XMLSYNTAXSTATUS_Error) { + return -1; + } + if (m_dwStatus == FDE_XMLSYNTAXSTATUS_EOS) { + return 100; + } + return m_iParsedBytes * 100 / iStreamLength; +} +static FX_INT32 FX_GetUTF8EncodeLength(FX_LPCWSTR pSrc, FX_INT32 iSrcLen) +{ + FX_DWORD unicode = 0; + FX_INT32 iDstNum = 0; + while (iSrcLen -- > 0) { + unicode = *pSrc ++; + int nbytes = 0; + if ((FX_DWORD)unicode < 0x80) { + nbytes = 1; + } else 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; + } + iDstNum += nbytes; + } + return iDstNum; +} +FX_FILESIZE CFDE_XMLSyntaxParser::GetCurrentBinaryPos() const +{ + if (m_pStream == NULL) { + return 0; + } + FX_INT32 nSrcLen = m_pStart - m_pBuffer; + FX_INT32 nDstLen = FX_GetUTF8EncodeLength(m_pBuffer, nSrcLen); + return m_iParsedBytes + nDstLen; +} +#ifdef _FDE_BLOCK_BUFFER +void CFDE_XMLSyntaxParser::ParseTextChar(FX_WCHAR ch) +{ + if (m_iIndexInBlock == m_iAllocStep) { + m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); + if (!m_pCurrentBlock) { + return; + } + } + m_pCurrentBlock[m_iIndexInBlock++] = ch; + m_iDataLength++; + if (m_iEntityStart > -1 && ch == L';') { + CFX_WideString csEntity; + m_BlockBuffer.GetTextData(csEntity, m_iEntityStart + 1, (m_iDataLength - 1) - m_iEntityStart - 1); + FX_INT32 iLen = csEntity.GetLength(); + if (iLen > 0) { + if (csEntity[0] == L'#') { + ch = 0; + FX_WCHAR w; + if (iLen > 1 && csEntity[1] == L'x') { + for (FX_INT32 i = 2; i < iLen; i ++) { + w = csEntity[i]; + if (w >= L'0' && w <= L'9') { + ch = (ch << 4) + w - L'0'; + } else if (w >= L'A' && w <= L'F') { + ch = (ch << 4) + w - 55; + } else if (w >= L'a' && w <= L'f') { + ch = (ch << 4) + w - 87; + } else { + break; + } + } + } else { + for (FX_INT32 i = 1; i < iLen; i ++) { + w = csEntity[i]; + if (w < L'0' || w > L'9') { + break; + } + ch = ch * 10 + w - L'0'; + } + } + if (ch != 0) { + m_BlockBuffer.SetTextChar(m_iEntityStart, ch); + m_iEntityStart ++; + } + } else { + if (csEntity.Compare(L"amp") == 0) { + m_BlockBuffer.SetTextChar(m_iEntityStart, L'&'); + m_iEntityStart ++; + } else if (csEntity.Compare(L"lt") == 0) { + m_BlockBuffer.SetTextChar(m_iEntityStart, L'<'); + m_iEntityStart ++; + } else if (csEntity.Compare(L"gt") == 0) { + m_BlockBuffer.SetTextChar(m_iEntityStart, L'>'); + m_iEntityStart ++; + } else if (csEntity.Compare(L"apos") == 0) { + m_BlockBuffer.SetTextChar(m_iEntityStart, L'\''); + m_iEntityStart ++; + } else if (csEntity.Compare(L"quot") == 0) { + m_BlockBuffer.SetTextChar(m_iEntityStart, L'\"'); + m_iEntityStart ++; + } + } + } + m_BlockBuffer.DeleteTextChars(m_iDataLength - m_iEntityStart, FALSE); + m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); + m_iEntityStart = -1; + } else { + if (m_iEntityStart < 0 && ch == L'&') { + m_iEntityStart = m_iDataLength - 1; + } + } + m_pStart ++; +} +#else +void CFDE_XMLSyntaxParser::ParseTextChar(FX_WCHAR ch) +{ + if (m_iDataPos >= m_iTextDataSize) { + ReallocTextDataBuffer(); + } + m_pwsTextData[m_iDataPos] = ch; + if (m_iEntityStart > -1 && ch == L';') { + CFX_WideString csEntity(m_pwsTextData + m_iEntityStart + 1, m_iDataPos - m_iEntityStart - 1); + FX_INT32 iLen = csEntity.GetLength(); + if (iLen > 0) { + if (csEntity[0] == L'#') { + ch = 0; + FX_WCHAR w; + if (iLen > 1 && csEntity[1] == L'x') { + for (FX_INT32 i = 2; i < iLen; i ++) { + w = csEntity[i]; + if (w >= L'0' && w <= L'9') { + ch = (ch << 4) + w - L'0'; + } else if (w >= L'A' && w <= L'F') { + ch = (ch << 4) + w - 55; + } else if (w >= L'a' && w <= L'f') { + ch = (ch << 4) + w - 87; + } else { + break; + } + } + } else { + for (FX_INT32 i = 1; i < iLen; i ++) { + w = csEntity[i]; + if (w < L'0' || w > L'9') { + break; + } + ch = ch * 10 + w - L'0'; + } + } + if (ch != 0) { + m_pwsTextData[m_iEntityStart ++] = ch; + } + } else { + if (csEntity.Compare(L"amp") == 0) { + m_pwsTextData[m_iEntityStart ++] = L'&'; + } else if (csEntity.Compare(L"lt") == 0) { + m_pwsTextData[m_iEntityStart ++] = L'<'; + } else if (csEntity.Compare(L"gt") == 0) { + m_pwsTextData[m_iEntityStart ++] = L'>'; + } else if (csEntity.Compare(L"apos") == 0) { + m_pwsTextData[m_iEntityStart ++] = L'\''; + } else if (csEntity.Compare(L"quot") == 0) { + m_pwsTextData[m_iEntityStart ++] = L'\"'; + } + } + } + m_iDataPos = m_iEntityStart; + m_iEntityStart = -1; + } else { + if (m_iEntityStart < 0 && ch == L'&') { + m_iEntityStart = m_iDataPos; + } + m_iDataPos ++; + } + m_pStart ++; +} +void CFDE_XMLSyntaxParser::ReallocTextDataBuffer() +{ + FXSYS_assert(m_pwsTextData != NULL); + if (m_iTextDataSize <= 1024 * 1024) { + m_iTextDataSize *= 2; + } else { + m_iTextDataSize += 1024 * 1024; + } + m_pwsTextData = (FX_LPWSTR)FDE_Realloc(m_pwsTextData, m_iTextDataSize * sizeof(FX_WCHAR)); +} +void CFDE_XMLSyntaxParser::GetData(CFX_WideString &wsData) const +{ + FX_LPWSTR pBuf = wsData.GetBuffer(m_iTextDataLength); + FXSYS_memcpy(pBuf, m_pwsTextData, m_iTextDataLength * sizeof(FX_WCHAR)); + wsData.ReleaseBuffer(m_iTextDataLength); +} +#endif diff --git a/xfa/src/fdp/src/xml/fde_xml.h b/xfa/src/fdp/src/xml/fde_xml.h new file mode 100644 index 0000000000..edbf01584a --- /dev/null +++ b/xfa/src/fdp/src/xml/fde_xml.h @@ -0,0 +1,443 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FDE_XML_IMP +#define _FDE_XML_IMP +#define _FDE_BLOCK_BUFFER +#ifdef _FDE_BLOCK_BUFFER +class CFDE_BlockBuffer; +#endif +class CFDE_XMLNode; +class CFDE_XMLInstruction; +class CFDE_XMLElement; +class CFDE_XMLText; +class CFDE_XMLDoc; +class IFDE_XMLParser; +class CFDE_XMLDOMParser; +class CFDE_XMLSAXParser; +class CFDE_XMLSyntaxParser; +class CFDE_XMLNode : public CFX_Target +{ +public: + CFDE_XMLNode(); + virtual void Release() + { + FDE_Delete this; + } + virtual FDE_XMLNODETYPE GetType() const + { + return FDE_XMLNODE_Unknown; + } + virtual FX_INT32 CountChildNodes() const; + virtual CFDE_XMLNode* GetChildNode(FX_INT32 index) const; + virtual FX_INT32 GetChildNodeIndex(CFDE_XMLNode *pNode) const; + virtual CFDE_XMLNode* GetPath(FX_LPCWSTR pPath, FX_INT32 iLength = -1, FX_BOOL bQualifiedName = TRUE) const; + virtual FX_INT32 InsertChildNode(CFDE_XMLNode *pNode, FX_INT32 index = -1); + virtual void RemoveChildNode(CFDE_XMLNode *pNode); + virtual void DeleteChildren(); + virtual CFDE_XMLNode* GetNodeItem(IFDE_XMLNode::NodeItem eItem) const; + virtual FX_INT32 GetNodeLevel() const; + virtual FX_BOOL InsertNodeItem(IFDE_XMLNode::NodeItem eItem, CFDE_XMLNode *pNode); + virtual CFDE_XMLNode* RemoveNodeItem(IFDE_XMLNode::NodeItem eItem); + virtual CFDE_XMLNode* Clone(FX_BOOL bRecursive); + virtual void SaveXMLNode(IFX_Stream *pXMLStream); +public: + ~CFDE_XMLNode(); + void CloneChildren(CFDE_XMLNode* pClone); + CFDE_XMLNode *m_pParent; + CFDE_XMLNode *m_pChild; + CFDE_XMLNode *m_pPrior; + CFDE_XMLNode *m_pNext; +}; +class CFDE_XMLInstruction : public CFDE_XMLNode +{ +public: + CFDE_XMLInstruction(const CFX_WideString &wsTarget); + virtual void Release() + { + FDE_Delete this; + } + virtual FDE_XMLNODETYPE GetType() const + { + return FDE_XMLNODE_Instruction; + } + virtual CFDE_XMLNode* Clone(FX_BOOL bRecursive); + virtual void GetTargetName(CFX_WideString &wsTarget) const + { + wsTarget = m_wsTarget; + } + virtual FX_INT32 CountAttributes() const; + virtual FX_BOOL GetAttribute(FX_INT32 index, CFX_WideString &wsAttriName, CFX_WideString &wsAttriValue) const; + virtual FX_BOOL HasAttribute(FX_LPCWSTR pwsAttriName) const; + virtual void GetString(FX_LPCWSTR pwsAttriName, CFX_WideString &wsAttriValue, FX_LPCWSTR pwsDefValue = NULL) const; + virtual void SetString(const CFX_WideString &wsAttriName, const CFX_WideString &wsAttriValue); + virtual FX_INT32 GetInteger(FX_LPCWSTR pwsAttriName, FX_INT32 iDefValue = 0) const; + virtual void SetInteger(FX_LPCWSTR pwsAttriName, FX_INT32 iAttriValue); + virtual FX_FLOAT GetFloat(FX_LPCWSTR pwsAttriName, FX_FLOAT fDefValue = 0) const; + virtual void SetFloat(FX_LPCWSTR pwsAttriName, FX_FLOAT fAttriValue); + virtual void RemoveAttribute(FX_LPCWSTR pwsAttriName); + virtual FX_INT32 CountData() const; + virtual FX_BOOL GetData(FX_INT32 index, CFX_WideString &wsData) const; + virtual void AppendData(const CFX_WideString &wsData); + virtual void RemoveData(FX_INT32 index); +public: + ~CFDE_XMLInstruction() {} + CFX_WideString m_wsTarget; + CFX_WideStringArray m_Attributes; + CFX_WideStringArray m_TargetData; +}; +class CFDE_XMLElement : public CFDE_XMLNode +{ +public: + CFDE_XMLElement(const CFX_WideString &wsTag); + virtual void Release() + { + FDE_Delete this; + } + virtual FDE_XMLNODETYPE GetType() const + { + return FDE_XMLNODE_Element; + } + virtual CFDE_XMLNode* Clone(FX_BOOL bRecursive); + virtual void GetTagName(CFX_WideString &wsTag) const; + virtual void GetLocalTagName(CFX_WideString &wsTag) const; + virtual void GetNamespacePrefix(CFX_WideString &wsPrefix) const; + virtual void GetNamespaceURI(CFX_WideString &wsNamespace) const; + virtual FX_INT32 CountAttributes() const; + virtual FX_BOOL GetAttribute(FX_INT32 index, CFX_WideString &wsAttriName, CFX_WideString &wsAttriValue) const; + virtual FX_BOOL HasAttribute(FX_LPCWSTR pwsAttriName) const; + virtual void GetString(FX_LPCWSTR pwsAttriName, CFX_WideString &wsAttriValue, FX_LPCWSTR pwsDefValue = NULL) const; + virtual void SetString(const CFX_WideString &wsAttriName, const CFX_WideString &wsAttriValue); + virtual FX_INT32 GetInteger(FX_LPCWSTR pwsAttriName, FX_INT32 iDefValue = 0) const; + virtual void SetInteger(FX_LPCWSTR pwsAttriName, FX_INT32 iAttriValue); + virtual FX_FLOAT GetFloat(FX_LPCWSTR pwsAttriName, FX_FLOAT fDefValue = 0) const; + virtual void SetFloat(FX_LPCWSTR pwsAttriName, FX_FLOAT fAttriValue); + virtual void RemoveAttribute(FX_LPCWSTR pwsAttriName); + virtual void GetTextData(CFX_WideString &wsText) const; + virtual void SetTextData(const CFX_WideString &wsText); +public: + ~CFDE_XMLElement(); + CFX_WideString m_wsTag; + CFX_WideStringArray m_Attributes; +}; +class CFDE_XMLText : public CFDE_XMLNode +{ +public: + CFDE_XMLText(const CFX_WideString &wsText); + virtual void Release() + { + FDE_Delete this; + } + virtual FDE_XMLNODETYPE GetType() const + { + return FDE_XMLNODE_Text; + } + virtual CFDE_XMLNode* Clone(FX_BOOL bRecursive); + virtual void GetText(CFX_WideString &wsText) const + { + wsText = m_wsText; + } + virtual void SetText(const CFX_WideString &wsText) + { + m_wsText = wsText; + } +public: + ~CFDE_XMLText() {} + CFX_WideString m_wsText; +}; +class CFDE_XMLDeclaration : public CFDE_XMLNode +{ +public: + CFDE_XMLDeclaration() : CFDE_XMLNode() { } +}; +class CFDE_XMLCharData : public CFDE_XMLDeclaration +{ +public: + CFDE_XMLCharData(const CFX_WideString &wsCData); + + virtual void Release() + { + FDE_Delete this; + } + virtual FDE_XMLNODETYPE GetType() const + { + return FDE_XMLNODE_CharData; + } + virtual CFDE_XMLNode* Clone(FX_BOOL bRecursive); + virtual void GetCharData(CFX_WideString &wsCharData) const + { + wsCharData = m_wsCharData; + } + virtual void SetCharData(const CFX_WideString &wsCData) + { + m_wsCharData = wsCData; + } + +public: + ~CFDE_XMLCharData() {} + + CFX_WideString m_wsCharData; +}; +class CFDE_XMLDoc : public CFX_Target +{ +public: + CFDE_XMLDoc(); + ~CFDE_XMLDoc(); + virtual void Release() + { + FDE_Delete this; + } + virtual FX_BOOL LoadXML(IFX_Stream *pXMLStream, FX_INT32 iXMLPlaneSize = 8192, FX_INT32 iTextDataSize = 256, FDE_LPXMLREADERHANDLER pHandler = NULL); + virtual FX_BOOL LoadXML(IFDE_XMLParser *pXMLParser); + virtual FX_INT32 DoLoad(IFX_Pause *pPause = NULL); + virtual void CloseXML(); + virtual CFDE_XMLNode* GetRoot() const + { + return m_pRoot; + } + virtual void SaveXML(IFX_Stream *pXMLStream = NULL, FX_BOOL bSaveBOM = TRUE); + virtual void SaveXMLNode(IFX_Stream *pXMLStream, IFDE_XMLNode *pNode); +protected: + IFX_Stream *m_pStream; + FX_INT32 m_iStatus; + CFDE_XMLNode *m_pRoot; + IFDE_XMLSyntaxParser *m_pSyntaxParser; + IFDE_XMLParser *m_pXMLParser; + void Reset(FX_BOOL bInitRoot); + void ReleaseParser(); +}; +typedef CFX_StackTemplate CFDE_XMLDOMNodeStack; +class CFDE_XMLDOMParser : public IFDE_XMLParser, public CFX_Target +{ +public: + CFDE_XMLDOMParser(CFDE_XMLNode *pRoot, IFDE_XMLSyntaxParser *pParser); + ~CFDE_XMLDOMParser(); + + virtual void Release() + { + FDE_Delete this; + } + virtual FX_INT32 DoParser(IFX_Pause *pPause); +private: + CFDE_XMLNode *m_pRoot; + IFDE_XMLSyntaxParser *m_pParser; + CFDE_XMLNode *m_pParent; + CFDE_XMLNode *m_pChild; + CFDE_XMLDOMNodeStack m_NodeStack; + CFX_WideString m_ws1; + CFX_WideString m_ws2; +}; +class CFDE_XMLTAG : public CFX_Target +{ +public: + CFDE_XMLTAG() : eType(FDE_XMLNODE_Unknown) {} + CFDE_XMLTAG(const CFDE_XMLTAG &src) : wsTagName(src.wsTagName), eType(src.eType) {} + CFX_WideString wsTagName; + FDE_XMLNODETYPE eType; +}; +typedef CFX_ObjectStackTemplate CFDE_XMLTagStack; +class CFDE_XMLSAXParser : public IFDE_XMLParser, public CFX_Target +{ +public: + CFDE_XMLSAXParser(FDE_LPXMLREADERHANDLER pHandler, IFDE_XMLSyntaxParser *pParser); + ~CFDE_XMLSAXParser(); + + virtual void Release() + { + FDE_Delete this; + } + virtual FX_INT32 DoParser(IFX_Pause *pPause); +private: + void Push(const CFDE_XMLTAG &xmlTag); + void Pop(); + FDE_LPXMLREADERHANDLER m_pHandler; + IFDE_XMLSyntaxParser *m_pParser; + CFDE_XMLTagStack m_TagStack; + CFDE_XMLTAG *m_pTagTop; + CFX_WideString m_ws1; + CFX_WideString m_ws2; +}; +#ifdef _FDE_BLOCK_BUFFER +class CFDE_BlockBuffer : public CFX_Target +{ +public: + CFDE_BlockBuffer(FX_INT32 iAllocStep = 1024 * 1024); + ~CFDE_BlockBuffer(); + + FX_BOOL InitBuffer(FX_INT32 iBufferSize = 1024 * 1024); + FX_BOOL IsInitialized() + { + return m_iBufferSize / m_iAllocStep >= 1; + } + void ReleaseBuffer() + { + FDE_Delete this; + } + FX_LPWSTR GetAvailableBlock(FX_INT32& iIndexInBlock); + inline FX_INT32 GetAllocStep() const + { + return m_iAllocStep; + } + inline FX_INT32& GetDataLengthRef() + { + return m_iDataLength; + } + inline void Reset(FX_BOOL bReserveData = TRUE) + { + if (!bReserveData) { + m_iStartPosition = 0; + } + m_iDataLength = 0; + } + void SetTextChar(FX_INT32 iIndex, FX_WCHAR ch); + FX_INT32 DeleteTextChars(FX_INT32 iCount, FX_BOOL bDirection = TRUE); + void GetTextData(CFX_WideString& wsTextData, FX_INT32 iStart = 0, FX_INT32 iLength = -1) const; + +protected: + inline void TextDataIndex2BufIndex(const FX_INT32 iIndex, FX_INT32& iBlockIndex, FX_INT32& iInnerIndex) const; + void ClearBuffer(); + CFX_PtrArray m_BlockArray; + FX_INT32 m_iDataLength; + FX_INT32 m_iBufferSize; + FX_INT32 m_iAllocStep; + FX_INT32 m_iStartPosition; +}; +#endif +#define FDE_XMLSYNTAXMODE_Text 0 +#define FDE_XMLSYNTAXMODE_Node 1 +#define FDE_XMLSYNTAXMODE_Target 2 +#define FDE_XMLSYNTAXMODE_Tag 3 +#define FDE_XMLSYNTAXMODE_AttriName 4 +#define FDE_XMLSYNTAXMODE_AttriEqualSign 5 +#define FDE_XMLSYNTAXMODE_AttriQuotation 6 +#define FDE_XMLSYNTAXMODE_AttriValue 7 +#define FDE_XMLSYNTAXMODE_Entity 8 +#define FDE_XMLSYNTAXMODE_EntityDecimal 9 +#define FDE_XMLSYNTAXMODE_EntityHex 10 +#define FDE_XMLSYNTAXMODE_CloseInstruction 11 +#define FDE_XMLSYNTAXMODE_BreakElement 12 +#define FDE_XMLSYNTAXMODE_CloseElement 13 +#define FDE_XMLSYNTAXMODE_SkipDeclNode 14 +#define FDE_XMLSYNTAXMODE_DeclCharData 15 +#define FDE_XMLSYNTAXMODE_SkipComment 16 +#define FDE_XMLSYNTAXMODE_SkipCommentOrDecl 17 +#define FDE_XMLSYNTAXMODE_TargetData 18 +class CFDE_XMLSyntaxParser : public IFDE_XMLSyntaxParser, public CFX_Target +{ +public: + CFDE_XMLSyntaxParser(); + ~CFDE_XMLSyntaxParser(); + virtual void Release() + { + FDE_Delete this; + } + virtual void Init(IFX_Stream *pStream, FX_INT32 iXMLPlaneSize, FX_INT32 iTextDataSize = 256); + virtual FX_DWORD DoSyntaxParse(); + virtual FX_INT32 GetStatus() const; + virtual FX_INT32 GetCurrentPos() const + { + return m_iParsedChars + (m_pStart - m_pBuffer); + } + virtual FX_FILESIZE GetCurrentBinaryPos() const; + virtual FX_INT32 GetCurrentNodeNumber() const + { + return m_iCurrentNodeNum; + } + virtual FX_INT32 GetLastNodeNumber() const + { + return m_iLastNodeNum; + } +#ifdef _FDE_BLOCK_BUFFER + virtual void GetTargetName(CFX_WideString &wsTarget) const + { + m_BlockBuffer.GetTextData(wsTarget, 0, m_iTextDataLength); + } + virtual void GetTagName(CFX_WideString &wsTag) const + { + m_BlockBuffer.GetTextData(wsTag, 0, m_iTextDataLength); + } + virtual void GetAttributeName(CFX_WideString &wsAttriName) const + { + m_BlockBuffer.GetTextData(wsAttriName, 0, m_iTextDataLength); + } + virtual void GetAttributeValue(CFX_WideString &wsAttriValue) const + { + m_BlockBuffer.GetTextData(wsAttriValue, 0, m_iTextDataLength); + } + virtual void GetTextData(CFX_WideString &wsText) const + { + m_BlockBuffer.GetTextData(wsText, 0, m_iTextDataLength); + } + virtual void GetTargetData(CFX_WideString &wsData) const + { + m_BlockBuffer.GetTextData(wsData, 0, m_iTextDataLength); + } +#else + virtual void GetTargetName(CFX_WideString &wsTarget) const + { + GetData(wsTarget); + } + virtual void GetTagName(CFX_WideString &wsTag) const + { + GetData(wsTag); + } + virtual void GetAttributeName(CFX_WideString &wsAttriName) const + { + GetData(wsAttriName); + } + virtual void GetAttributeValue(CFX_WideString &wsAttriValue) const + { + GetData(wsAttriValue); + } + virtual void GetTextData(CFX_WideString &wsText) const + { + GetData(wsText); + } + virtual void GetTargetData(CFX_WideString &wsData) const + { + GetData(wsData); + } +#endif +protected: + IFX_Stream *m_pStream; + FX_INT32 m_iXMLPlaneSize; + FX_INT32 m_iCurrentPos; + FX_INT32 m_iCurrentNodeNum; + FX_INT32 m_iLastNodeNum; + FX_INT32 m_iParsedChars; + FX_INT32 m_iParsedBytes; + FX_LPWSTR m_pBuffer; + FX_INT32 m_iBufferChars; + FX_BOOL m_bEOS; + FX_LPWSTR m_pStart; + FX_LPWSTR m_pEnd; + FDE_XMLNODE m_CurNode; + CFDE_XMLNodeStack m_XMLNodeStack; +#ifdef _FDE_BLOCK_BUFFER + CFDE_BlockBuffer m_BlockBuffer; + FX_INT32 m_iAllocStep; + FX_INT32& m_iDataLength; + FX_LPWSTR m_pCurrentBlock; + FX_INT32 m_iIndexInBlock; +#else + FX_INT32 m_iTextDataSize; + FX_LPWSTR m_pwsTextData; + FX_INT32 m_iDataPos; +#endif + FX_INT32 m_iTextDataLength; + FX_DWORD m_dwStatus; + FX_DWORD m_dwMode; + FX_WCHAR m_wQuotationMark; + FX_INT32 m_iEntityStart; + CFX_DWordStack m_SkipStack; + FX_WCHAR m_SkipChar; + inline void ParseTextChar(FX_WCHAR ch); +#ifndef _FDE_BLOCK_BUFFER + void ReallocTextDataBuffer(); + void GetData(CFX_WideString &wsData) const; +#endif +}; +#endif diff --git a/xfa/src/fee/include/fx_wordbreak.h b/xfa/src/fee/include/fx_wordbreak.h new file mode 100644 index 0000000000..c91aca694a --- /dev/null +++ b/xfa/src/fee/include/fx_wordbreak.h @@ -0,0 +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 _FX_WORDBREAK_H +#define _FX_WORDBREAK_H +class IFX_CharIter; +class IFX_WordBreak +{ +public: + virtual void Release() = 0; + virtual void Attach(IFX_CharIter * pIter) = 0; + virtual void Attach(const CFX_WideString & wsText) = 0; + virtual FX_BOOL Next(FX_BOOL bPrev) = 0; + virtual void SetAt(FX_INT32 nIndex) = 0; + virtual FX_INT32 GetWordPos() const = 0; + virtual FX_INT32 GetWordLength() const = 0; + virtual void GetWord(CFX_WideString &wsWord) const = 0; + virtual FX_BOOL IsEOF(FX_BOOL bTail = TRUE) const = 0; +}; +IFX_WordBreak * FX_WordBreak_Create(); +#endif diff --git a/xfa/src/fee/include/ifde_txtedtbuf.h b/xfa/src/fee/include/ifde_txtedtbuf.h new file mode 100644 index 0000000000..6cfc3ec977 --- /dev/null +++ b/xfa/src/fee/include/ifde_txtedtbuf.h @@ -0,0 +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 + +#ifndef _IFDE_TXTEDTBUF_H +#define _IFDE_TXTEDTBUF_H +#define FDE_DEFCHUNKLENGTH (1024) +class IFDE_TxtEdtBuf; +class IFDE_TxtEdtBuf +{ +public: + virtual void Release() = 0; + + virtual FX_BOOL SetChunkSize(FX_INT32 nChunkSize) = 0; + virtual FX_INT32 GetChunkSize() const = 0; + virtual FX_INT32 GetTextLength() const = 0; + virtual void SetText(const CFX_WideString &wsText) = 0; + virtual void GetText(CFX_WideString &wsText) const = 0; + virtual FX_WCHAR GetCharByIndex(FX_INT32 nIndex) const = 0; + virtual void GetRange(CFX_WideString &wsText, FX_INT32 nBegin, FX_INT32 nCount = - 1) const = 0; + + virtual void Insert(FX_INT32 nPos, FX_LPCWSTR lpText, FX_INT32 nLength = 1) = 0; + virtual void Delete(FX_INT32 nIndex, FX_INT32 nLength = 1) = 0; + + virtual void Clear(FX_BOOL bRelease = TRUE) = 0; + + virtual FX_BOOL Optimize(IFX_Pause * pPause = NULL) = 0; +}; +#endif diff --git a/xfa/src/fee/include/ifde_txtedtengine.h b/xfa/src/fee/include/ifde_txtedtengine.h new file mode 100644 index 0000000000..a47739c3c5 --- /dev/null +++ b/xfa/src/fee/include/ifde_txtedtengine.h @@ -0,0 +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 + +#ifndef _IFDE_TXTEDTENGINE_H +#define _IFDE_TXTEDTENGINE_H +class IFDE_TxtEdtBuf; +class IFDE_TxtEdtPage; +class IFDE_TxtEdtEngine; +class IFDE_TxtEdtEventSink; +class IFDE_TxtEdtParag; +#define FDE_TXTEDT_FIND_FLAGS_Prev (0L << 0) +#define FDE_TXTEDT_FIND_FLAGS_Next (1L << 0) +#define FDE_TXTEDT_FIND_FLAGS_WholeWord (1L << 1) +#define FDE_TXTEDT_FIND_FLAGS_NoCase (1L << 2) +typedef struct _FDE_HTXTEDTFIND { + FX_LPVOID pData; +} * FDE_HTXTEDTFIND; +#define FDE_TEXTEDITMODE_MultiLines (1L << 0) +#define FDE_TEXTEDITMODE_AutoLineWrap (1L << 1) +#define FDE_TEXTEDITMODE_ReadOnly (1L << 2) +#define FDE_TEXTEDITMODE_LimitArea_Vert (1L << 3) +#define FDE_TEXTEDITMODE_LimitArea_Horz (1L << 4) +#define FDE_TEXTEDITMODE_NoRedoUndo (1L << 5) +#define FDE_TEXTEDITMODE_FIELD_TAB (1L << 6) +#define FDE_TEXTEDITMODE_FIELD_AUTO (1L << 7) +#define FDE_TEXTEDITMODE_Validate (1L << 8) +#define FDE_TEXTEDITMODE_Password (1L << 9) +#define FDE_TEXTEDITALIGN_Left (0L << 0) +#define FDE_TEXTEDITALIGN_Center (1L << 0) +#define FDE_TEXTEDITALIGN_Right (2L << 0) +#define FDE_TEXTEDITALIGN_Normal (1L << 3) +#define FDE_TEXTEDITALIGN_Justified (1L << 4) +#define FDE_TEXTEDITALIGN_Distributed (1L << 5) +#define FDE_TEXTEDITLAYOUT_DocVertical (1L << 0) +#define FDE_TEXTEDITLAYOUT_CharVertial (1L << 1) +#define FDE_TEXTEDITLAYOUT_LineReserve (1L << 2) +#define FDE_TEXTEDITLAYOUT_RTL (1L << 3) +#define FDE_TEXTEDITLAYOUT_CombText (1L << 4) +#define FDE_TEXTEDITLAYOUT_ExpandTab (1L << 5) +#define FDE_TEXTEDITLAYOUT_ArabicContext (1L << 6) +#define FDE_TEXTEDITLAYOUT_ArabicShapes (1L << 7) +#define FDE_TEXTEDITLAYOUT_LastLineHeight (1L << 8) +enum FDE_TXTEDTMOVECARET { + MC_MoveNone = 0 , + MC_Left , + MC_Right , + MC_Up , + MC_Down , + MC_WordBackward , + MC_WordForward , + MC_LineStart , + MC_LineEnd , + MC_ParagStart , + MC_ParagEnd , + MC_PageUp , + MC_PageDown , + MC_Home , + MC_End , +}; +enum FDE_TXTEDT_MODIFY_RET { + FDE_TXTEDT_MODIFY_RET_F_Tab = -6, + FDE_TXTEDT_MODIFY_RET_F_Locked = -5, + FDE_TXTEDT_MODIFY_RET_F_Invalidate = -4, + FDE_TXTEDT_MODIFY_RET_F_Boundary = -3, + FDE_TXTEDT_MODIFY_RET_F_Full = -2, + FDE_TXTEDT_MODIFY_RET_F_Normal = -1, + FDE_TXTEDT_MODIFY_RET_S_Normal = 0, + FDE_TXTEDT_MODIFY_RET_S_Full = 1, + FDE_TXTEDT_MODIFY_RET_S_Part = 2, + FDE_TXTEDT_MODIFY_RET_S_Empty = 3, + FDE_TXTEDT_MODIFY_RET_T_Tab = 4, +}; +enum FDE_TXTEDIT_LINEEND { + FDE_TXTEDIT_LINEEND_Auto, + FDE_TXTEDIT_LINEEND_CRLF, + FDE_TXTEDIT_LINEEND_CR, + FDE_TXTEDIT_LINEEND_LF, +}; +struct _FDE_TXTEDTPARAMS : public CFX_Object { + _FDE_TXTEDTPARAMS() + : fPlateWidth(0) + , fPlateHeight(0) + , nLineCount(0) + , dwLayoutStyles(0) + , dwAlignment(0) + , dwMode(0) + , pFont(NULL) + , fFontSize(10.0f) + , dwFontColor(0xff000000) + , fLineSpace(10.0f) + , fTabWidth(36) + , bTabEquidistant(FALSE) + , wDefChar(0xFEFF) + , wLineBreakChar('\n') + , nCharRotation(0) + , nLineEnd(0) + , nHorzScale(100) + , fCharSpace(0) + , pEventSink(NULL) + { + } + FX_FLOAT fPlateWidth; + FX_FLOAT fPlateHeight; + FX_INT32 nLineCount; + FX_DWORD dwLayoutStyles; + FX_DWORD dwAlignment; + FX_DWORD dwMode; + IFX_Font *pFont; + FX_FLOAT fFontSize; + FX_ARGB dwFontColor; + FX_FLOAT fLineSpace; + FX_FLOAT fTabWidth; + FX_BOOL bTabEquidistant; + FX_WCHAR wDefChar; + FX_WCHAR wLineBreakChar; + FX_INT32 nCharRotation; + FX_INT32 nLineEnd; + FX_INT32 nHorzScale; + FX_FLOAT fCharSpace; + IFDE_TxtEdtEventSink * pEventSink; +}; +typedef _FDE_TXTEDTPARAMS FDE_TXTEDTPARAMS; +typedef _FDE_TXTEDTPARAMS* FDE_LPTXTEDTPARAMS; +enum FDE_TXTEDT_TEXTCHANGE_TYPE { + FDE_TXTEDT_TEXTCHANGE_TYPE_Insert = 0 , + FDE_TXTEDT_TEXTCHANGE_TYPE_Delete , + FDE_TXTEDT_TEXTCHANGE_TYPE_Replace , +}; +struct _FDE_TXTEDT_TEXTCHANGE_INFO : public CFX_Object { + FX_INT32 nChangeType; + CFX_WideString wsInsert; + CFX_WideString wsDelete; + CFX_WideString wsPrevText; +}; +typedef _FDE_TXTEDT_TEXTCHANGE_INFO FDE_TXTEDT_TEXTCHANGE_INFO; +typedef _FDE_TXTEDT_TEXTCHANGE_INFO* FDE_LPTXTEDT_TEXTCHANGE_INFO; +class IFDE_TxtEdtEventSink +{ +public: + virtual void On_CaretChanged(IFDE_TxtEdtEngine * pEdit, FX_INT32 nPage, FX_BOOL bVisible = TRUE) = 0; + virtual void On_TextChanged(IFDE_TxtEdtEngine * pEdit, FDE_TXTEDT_TEXTCHANGE_INFO &ChangeInfo) = 0; + virtual void On_PageCountChanged(IFDE_TxtEdtEngine * pEdit) = 0; + virtual void On_SelChanged(IFDE_TxtEdtEngine * pEdit) = 0; + virtual FX_BOOL On_PageLoad(IFDE_TxtEdtEngine * pEdit, FX_INT32 nPageIndex, FX_INT32 nPurpose) = 0; + virtual FX_BOOL On_PageUnload(IFDE_TxtEdtEngine * pEdit, FX_INT32 nPageIndex, FX_INT32 nPurpose) = 0; + virtual FX_BOOL On_PageChange(IFDE_TxtEdtEngine * pEdit, FX_INT32 nPageIndex) = 0; + virtual void On_AddDoRecord(IFDE_TxtEdtEngine * pEdit, FX_BSTR bsDoRecord) = 0; + virtual FX_BOOL On_ValidateField(IFDE_TxtEdtEngine * pEdit, FX_INT32 nBlockIndex, FX_INT32 nFieldIndex, \ + const CFX_WideString &wsFieldText, FX_INT32 nCharIndex) = 0; + virtual FX_BOOL On_ValidateBlock(IFDE_TxtEdtEngine * pEdit, FX_INT32 nBlockIndex) = 0; + virtual FX_BOOL On_GetBlockFormatText(IFDE_TxtEdtEngine * pEdit, FX_INT32 nBlockIndex, CFX_WideString &wsBlockText) = 0; + virtual FX_BOOL On_Validate(IFDE_TxtEdtEngine * pEdit, CFX_WideString &wsText) = 0; +}; +class IFX_CharIter +{ +public: + virtual void Release() = 0; + virtual FX_BOOL Next(FX_BOOL bPrev = FALSE) = 0; + virtual FX_WCHAR GetChar() = 0; + virtual void SetAt(FX_INT32 nIndex) = 0; + virtual FX_INT32 GetAt() const = 0; + virtual FX_BOOL IsEOF(FX_BOOL bTail = TRUE) const = 0; + virtual IFX_CharIter * Clone() = 0; +}; +class IFDE_TxtEdtEngine +{ +public: + static IFDE_TxtEdtEngine* Create(); + + virtual void Release() = 0; + virtual void SetEditParams(const FDE_TXTEDTPARAMS ¶ms) = 0; + virtual const FDE_TXTEDTPARAMS* GetEditParams() const = 0; + + virtual FX_INT32 CountPages() const = 0; + virtual IFDE_TxtEdtPage* GetPage(FX_INT32 nIndex) = 0; + virtual FX_BOOL SetBufChunkSize(FX_INT32 nChunkSize) = 0; + virtual void SetTextByStream(IFX_Stream * pStream) = 0; + virtual void SetText(const CFX_WideString &wsText) = 0; + virtual FX_INT32 GetTextLength() const = 0; + virtual void GetText(CFX_WideString &wsText, FX_INT32 nStart, FX_INT32 nCount = -1) = 0; + virtual void ClearText() = 0; + + virtual FX_INT32 GetCaretRect(CFX_RectF &rtCaret) const = 0; + virtual FX_INT32 GetCaretPos() const = 0; + virtual FX_INT32 SetCaretPos(FX_INT32 nIndex, FX_BOOL bBefore = TRUE) = 0; + virtual FX_INT32 MoveCaretPos(FDE_TXTEDTMOVECARET eMoveCaret, FX_BOOL bShift = FALSE, FX_BOOL bCtrl = FALSE) = 0; + + virtual void Lock() = 0; + virtual void Unlock() = 0; + virtual FX_BOOL IsLocked() const = 0; + + virtual FX_INT32 Insert(FX_INT32 nStart, FX_LPCWSTR lpText, FX_INT32 nLength) = 0; + virtual FX_INT32 Delete(FX_INT32 nStart, FX_BOOL bBackspace = FALSE) = 0; + virtual FX_INT32 DeleteRange(FX_INT32 nStart, FX_INT32 nCount = -1) = 0; + virtual FX_INT32 Replace(FX_INT32 nStart, FX_INT32 nLength, const CFX_WideString &wsReplace) = 0; + virtual void SetLimit(FX_INT32 nLimit) = 0; + virtual void SetAliasChar(FX_WCHAR wAlias) = 0; + virtual void SetFormatBlock(FX_INT32 nIndex, const CFX_WideString &wsBlockFormat) = 0; + virtual FX_INT32 CountEditBlocks() const = 0; + virtual void GetEditBlockText(FX_INT32 nIndex, CFX_WideString &wsBlockText) const = 0; + virtual FX_INT32 CountEditFields(FX_INT32 nBlockIndex) const = 0; + virtual void GetEditFieldText(FX_INT32 nBlockIndex, FX_INT32 nFieldIndex, CFX_WideString &wsFieldText) const = 0; + virtual void StartEdit() = 0; + virtual void EndEdit() = 0; + virtual void AddSelRange(FX_INT32 nStart, FX_INT32 nCount = -1) = 0; + virtual FX_INT32 CountSelRanges() = 0; + virtual FX_INT32 GetSelRange(FX_INT32 nIndex, FX_INT32 &nStart) = 0; + virtual void ClearSelection() = 0; + + virtual FX_BOOL Redo(FX_BSTR bsRedo) = 0; + virtual FX_BOOL Undo(FX_BSTR bsUndo) = 0; + + virtual FX_INT32 StartLayout() = 0; + virtual FX_INT32 DoLayout(IFX_Pause *pPause) = 0; + virtual void EndLayout() = 0; + + virtual FX_BOOL Optimize(IFX_Pause * pPause = NULL) = 0; + virtual FX_INT32 CountParags() const = 0; + virtual IFDE_TxtEdtParag* GetParag(FX_INT32 nParagIndex) const = 0; + virtual IFX_CharIter* CreateCharIter() = 0; +}; +class IFDE_TxtEdtParag +{ +public: + virtual FX_INT32 GetTextLength() const = 0; + virtual FX_INT32 GetStartIndex() const = 0; + virtual FX_INT32 CountLines() const = 0; + virtual void GetLineRange(FX_INT32 nLineIndex, FX_INT32& nStart, FX_INT32& nCount) const = 0; +}; +#endif diff --git a/xfa/src/fee/include/ifde_txtedtpage.h b/xfa/src/fee/include/ifde_txtedtpage.h new file mode 100644 index 0000000000..7555434f5f --- /dev/null +++ b/xfa/src/fee/include/ifde_txtedtpage.h @@ -0,0 +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 _IFDE_TXTEDTPAGE_H +#define _IFDE_TXTEDTPAGE_H +class IFDE_TxtEdtEngine; +class IFDE_TxtEdtPage; +class IFDE_TxtEdtPage : public IFDE_CanvasSet, public IFX_TxtAccess +{ +public: + static IFDE_TxtEdtPage * Create(IFDE_TxtEdtEngine * pEngine, FX_INT32 nIndex); + + virtual void Release() = 0; + + virtual IFDE_TxtEdtEngine * GetEngine() const = 0; + virtual FX_INT32 GetCharRect(FX_INT32 nIndex, CFX_RectF &rect, FX_BOOL bBBox = FALSE) const = 0; + virtual FX_INT32 GetCharIndex(const CFX_PointF &fPoint, FX_BOOL &bBefore) = 0; + virtual void CalcRangeRectArray(FX_INT32 nStart, FX_INT32 nCount, CFX_RectFArray &RectFArr) const = 0; + virtual FX_INT32 SelectWord (const CFX_PointF &fPoint, FX_INT32 &nCount) = 0; + virtual FX_INT32 GetCharStart() const = 0; + virtual FX_INT32 GetCharCount() const = 0; + + virtual FX_INT32 GetDisplayPos(const CFX_RectF &rtClip, FXTEXT_CHARPOS* &pCharPos, FX_LPRECTF pBBox = NULL) const = 0; + virtual FX_BOOL IsLoaded(FX_LPCRECTF pClipBox = NULL) = 0; + virtual FX_INT32 LoadPage(FX_LPCRECTF pClipBox = NULL, IFX_Pause *pPause = NULL) = 0; + virtual void UnloadPage(FX_LPCRECTF pClipBox = NULL) = 0; + virtual const CFX_RectF& GetContentsBox() = 0; +}; +#endif diff --git a/xfa/src/fee/src/fee/fde_txtedtblock.cpp b/xfa/src/fee/src/fee/fde_txtedtblock.cpp new file mode 100644 index 0000000000..89515bdb00 --- /dev/null +++ b/xfa/src/fee/src/fee/fde_txtedtblock.cpp @@ -0,0 +1,674 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "fde_txtedtblock.h" +#ifdef FDE_USEFORMATBLOCK +#define FDE_TXTEDT_FORMATBLOCK_BGN 0xFFF9 +#define FDE_TXTEDT_FORMATBLOCK_END 0xFFFB +#define FDE_TXTEDT_ZEROWIDTHSPACE 0x200B +#define FDE_TXTEDT_ISINTEGER(a) ((a) >= L'0' && (a) <= L'9') +#define FDE_TXTEDT_ISSIGN(a) (((a) == L'-') || ((a) == L'+')) +CFDE_TxtEdtBlock::CFDE_TxtEdtBlock(CFDE_TxtEdtEngine * pEngine, const CFX_WideString &wsBlock, FX_INT32 nPosition) + : m_pEngine(pEngine) + , m_nDisplayLength(0) + , m_nIndex(0) + , m_nPosition(nPosition) +{ + FX_LPCWSTR lpBuf = FX_LPCWSTR(wsBlock); + FX_INT32 nCount = wsBlock.GetLength(); + FX_INT32 i = 0; + CFX_WideString wsFix; + FX_INT32 j = 0; + while (i < nCount) { + if (lpBuf[i] != L'%') { + wsFix += lpBuf[i]; + } else { + i ++; + if (i < nCount) { + if (lpBuf[i] == L'%') { + wsFix += lpBuf[i]; + } else { + if (!wsFix.IsEmpty()) { + CFDE_TxtEdtField * pField = CFDE_TxtEdtField::Create(wsFix, j, this); + j ++; + FXSYS_assert(pField); + m_FieldArr.Add(pField); + m_nDisplayLength += pField->GetDisplayLength(); + wsFix.Empty(); + } + FX_INT32 nPos = i - 1; + while (lpBuf[i ++] != L')') + ; + i ++; + CFX_WideStringC wsField(lpBuf + nPos, i - nPos); + CFDE_TxtEdtField * pField = CFDE_TxtEdtField::Create(wsField, j, this); + j ++; + FXSYS_assert(pField); + m_FieldArr.Add(pField); + m_EditFieldArr.Add(pField); + m_nDisplayLength += pField->GetDisplayLength(); + i --; + } + } + } + i ++; + } + if (!wsFix.IsEmpty()) { + CFDE_TxtEdtField * pField = CFDE_TxtEdtField::Create(wsFix, j, this); + FXSYS_assert(pField); + m_FieldArr.Add(pField); + m_nDisplayLength += pField->GetDisplayLength(); + } +} +CFDE_TxtEdtBlock::~CFDE_TxtEdtBlock() +{ + FX_INT32 nCount = m_FieldArr.GetSize(); + for (FX_INT32 i = 0; i < nCount; i ++) { + CFDE_TxtEdtField * pField = m_FieldArr[i]; + pField->Release(); + } + m_FieldArr.RemoveAll(); +} +void CFDE_TxtEdtBlock::GetDisplayText(CFX_WideString &wsDisplay) +{ + FX_INT32 nCount = m_FieldArr.GetSize(); + for (FX_INT32 i = 0; i < nCount; i ++) { + CFDE_TxtEdtField * pField = m_FieldArr[i]; + CFX_WideString wsTemp; + pField->GetDisplayText(wsTemp); + wsDisplay += wsTemp; + } +} +FX_INT32 CFDE_TxtEdtBlock::GetLength() const +{ + FX_INT32 nDisplayLength = 0; + FX_INT32 nCount = m_FieldArr.GetSize(); + for (FX_INT32 i = 0; i < nCount; i ++) { + CFDE_TxtEdtField * pField = m_FieldArr[i]; + nDisplayLength += pField->GetDisplayLength(); + } + return nDisplayLength; +} +void CFDE_TxtEdtBlock::GetBlockText(CFX_WideString &wsBlock) +{ + FX_INT32 nCount = m_FieldArr.GetSize(); + for (FX_INT32 i = 0; i < nCount; i ++) { + CFDE_TxtEdtField * pField = m_FieldArr[i]; + CFX_WideString wsTemp; + pField->GetFieldText(wsTemp); + wsBlock += wsTemp; + } +} +FX_INT32 CFDE_TxtEdtBlock::CountField() const +{ + return m_EditFieldArr.GetSize(); +} +void CFDE_TxtEdtBlock::GetFieldText(FX_INT32 nIndex, CFX_WideString &wsField) +{ + CFDE_TxtEdtField * pField = m_EditFieldArr[nIndex]; + pField->GetFieldText(wsField); +} +FX_INT32 CFDE_TxtEdtBlock::GetFieldTextLength() const +{ + FX_INT32 nTotalLength = 0; + FX_INT32 nCount = m_EditFieldArr.GetSize(); + for (FX_INT32 i = 0; i < nCount; i ++) { + CFDE_TxtEdtField * pField = m_EditFieldArr[i]; + nTotalLength = pField->GetFieldTextLength(); + } + return nTotalLength; +} +FX_INT32 CFDE_TxtEdtBlock::GetPos() const +{ + return m_nPosition; +} +void CFDE_TxtEdtBlock::GetRealText(CFX_WideString &wsText) const +{ + FX_INT32 nCount = m_FieldArr.GetSize(); + for (FX_INT32 i = 0; i < nCount; i ++) { + CFDE_TxtEdtField * pField = m_FieldArr[i]; + CFX_WideString wsTemp; + pField->GetFieldText(wsTemp); + wsText += wsTemp; + } +} +void CFDE_TxtEdtBlock::Backup() +{ + FX_INT32 nCount = m_EditFieldArr.GetSize(); + for (FX_INT32 i = 0; i < nCount; i ++) { + m_EditFieldArr[i]->Backup(); + } +} +void CFDE_TxtEdtBlock::Restore() +{ + FX_INT32 nCount = m_EditFieldArr.GetSize(); + for (FX_INT32 i = 0; i < nCount; i ++) { + m_EditFieldArr[i]->Restore(); + } +} +CFDE_TxtEdtFieldFormatParser::CFDE_TxtEdtFieldFormatParser() +{ +} +CFDE_TxtEdtFieldFormatParser::~CFDE_TxtEdtFieldFormatParser() +{ + FDE_LPTXTEDTFORMATITEM lpItem = NULL; + FX_INT32 nCount = m_ItemArr.GetSize(); + for (FX_INT32 i = 0; i < nCount; i ++) { + lpItem = m_ItemArr[i]; + delete lpItem; + } + m_ItemArr.RemoveAll(); +} +FX_BOOL CFDE_TxtEdtFieldFormatParser::Parse(const CFX_WideString &wsFormat) +{ + m_wsFormat = wsFormat; + FX_LPCWSTR pBuf = FX_LPCWSTR(m_wsFormat); + FX_INT32 nCount = m_wsFormat.GetLength(); + nCount -= 2; + FX_INT32 i = 0; + for (; i < nCount; i ++) { + FX_WCHAR wChar = pBuf[i]; + if (wChar == L'(') { + break; + } + } + i ++; + FDE_TXTEDTFORMATITEM FormatItem; + for (; i < nCount; i ++) { + while (pBuf[i] == L' ') { + i ++; + } + FormatItem.nKeyStart = i; + while (pBuf[i] != L':') { + i ++; + } + FormatItem.nKeyCount = i - FormatItem.nKeyStart; + i ++; + FormatItem.nValStart = i; + while (pBuf[i] != L';' && i < nCount) { + i ++; + } + FormatItem.nValCount = i - FormatItem.nValStart; + FDE_LPTXTEDTFORMATITEM pFormatItem = FX_NEW FDE_TXTEDTFORMATITEM; + FXSYS_memcpy(pFormatItem, &FormatItem, sizeof(FDE_TXTEDTFORMATITEM)); + m_ItemArr.Add(pFormatItem); + } + return TRUE; +} +FX_INT32 CFDE_TxtEdtFieldFormatParser::CountItems() const +{ + return m_ItemArr.GetSize(); +} +void CFDE_TxtEdtFieldFormatParser::GetItem(FX_INT32 nIndex, CFX_WideString &wsKey, CFX_WideString &wsValue) const +{ + FDE_LPTXTEDTFORMATITEM lpItem = m_ItemArr[nIndex]; + FX_LPCWSTR lpSrcBuf = FX_LPCWSTR(m_wsFormat); + FX_LPWSTR lpDstBuf = wsKey.GetBuffer(lpItem->nKeyCount); + FXSYS_memcpy(lpDstBuf, lpSrcBuf + lpItem->nKeyStart, lpItem->nKeyCount * sizeof(FX_WCHAR)); + wsKey.ReleaseBuffer(lpItem->nKeyCount); + lpDstBuf = wsValue.GetBuffer(lpItem->nValCount); + FXSYS_memcpy(lpDstBuf, lpSrcBuf + lpItem->nValStart, lpItem->nValCount * sizeof(FX_WCHAR)); + wsValue.ReleaseBuffer(lpItem->nValCount); +} +CFDE_TxtEdtField * CFDE_TxtEdtField::Create(const CFX_WideString &wsField, FX_INT32 nIndex, CFDE_TxtEdtBlock * pBlock) +{ + if (wsField[0] != L'%' || (wsField[0] == L'%' && wsField[1] == L'%')) { + return FX_NEW CFDE_TxtEdtField_Fixed(wsField, nIndex, pBlock); + } + FX_WCHAR wcType = wsField[wsField.GetLength() - 1]; + switch(wcType) { + case L'd': + return FX_NEW CFDE_TxtEdtField_Integer(wsField, nIndex, pBlock); + case L'f': + return FX_NEW CFDE_TxtEdtField_Float(wsField, nIndex, pBlock); + case L's': + return FX_NEW CFDE_TxtEdtField_String(wsField, nIndex, pBlock); + case L'p': + return FX_NEW CFDE_TxtEdtField_Password(wsField, nIndex, pBlock); + default: + break; + } + return NULL; +} +void CFDE_TxtEdtField::Release() +{ + delete this; +} +CFDE_TxtEdtField::CFDE_TxtEdtField(FX_INT32 nIndex, CFDE_TxtEdtBlock * pBlock) + : m_nLength(-1) + , m_wcFill(L' ') + , m_bReserveSpace(FALSE) + , m_bLeftAlignment(TRUE) + , m_nIndex(nIndex) + , m_pBlock(pBlock) +{ + FXSYS_assert(pBlock); +} +FX_INT32 CFDE_TxtEdtField::Insert(FX_INT32 nIndex, const CFX_WideString &wsIns, + FX_INT32 &nCaret, FX_BOOL &bBefore) +{ + FX_INT32 nFieldLength = m_wsField.GetLength(); + FX_INT32 nInnerIndex = nIndex - FDE_FORMAT_EDIT_FIELD_HADERSIZE; + if (m_bReserveSpace && !m_bLeftAlignment) { + nInnerIndex -= (m_nLength - nFieldLength); + } + FXSYS_assert(nInnerIndex >= 0 && nInnerIndex <= nFieldLength); + CFX_WideString wsTemp = m_wsField; + FX_INT32 nInsLength = wsIns.GetLength(); + for (FX_INT32 i = 0; i < nInsLength; i ++, nInnerIndex ++) { + wsTemp.Insert(nInnerIndex, wsIns[i]); + } + FX_INT32 nRet = Validate(wsTemp); + switch (nRet) { + case FDE_FORMAT_FIELD_VALIDATE_F_FULL: + return FDE_FORMAT_FIELD_INSERT_RET_F_FULL; + case FDE_FORMAT_FIELD_VALIDATE_F_INVALIDATE: + return FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE; + case FDE_FORMAT_FIELD_VALIDATE_S: + default: + break; + } + m_wsField = wsTemp; + nCaret = nIndex + ((m_bReserveSpace && !m_bLeftAlignment) ? -nInsLength : nInsLength); + bBefore = TRUE; + return (nFieldLength + nInsLength < m_nLength) ? FDE_FORMAT_FIELD_INSERT_RET_S_NORMAL : FDE_FORMAT_FIELD_INSERT_RET_S_FULL; +} +FX_INT32 CFDE_TxtEdtField::Delete(FX_INT32 nIndex, FX_INT32 nCount, + CFX_WideString &wsDel, FX_INT32 &nCaret, FX_BOOL &bBefore) +{ + FX_INT32 nFieldLength = m_wsField.GetLength(); + FX_INT32 nInnerIndex = nIndex - FDE_FORMAT_EDIT_FIELD_HADERSIZE; + if (m_bReserveSpace && !m_bLeftAlignment) { + nInnerIndex -= (m_nLength - nFieldLength); + } + if (nInnerIndex < 0 || (nInnerIndex + nCount) > nFieldLength) { + return FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY; + } + CFX_WideString wsTemp = m_wsField; + wsTemp.Delete(nInnerIndex, nCount); + FX_INT32 nRet = Validate(wsTemp); + switch (nRet) { + case FDE_FORMAT_FIELD_VALIDATE_F_FULL: + return FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY; + case FDE_FORMAT_FIELD_VALIDATE_F_INVALIDATE: + return FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE; + case FDE_FORMAT_FIELD_VALIDATE_S: + default: + break; + } + FX_LPWSTR lpBuf = wsDel.GetBuffer(nCount); + FXSYS_memcpy(lpBuf, FX_LPCWSTR(m_wsField) + nInnerIndex, nCount * sizeof(FX_WCHAR)); + wsDel.ReleaseBuffer(nCount); + m_wsField = wsTemp; + nCaret = nIndex + (m_bReserveSpace && !m_bLeftAlignment) ? nCount : 0; + bBefore = TRUE; + return FDE_FORMAT_FIELD_DELETE_RET_S; +} +FX_INT32 CFDE_TxtEdtField::Replace(FX_INT32 nIndex, FX_INT32 nCount, const CFX_WideString &wsIns, + CFX_WideString &wsDel, FX_INT32 &nCaret, FX_BOOL &bBefore) +{ + FX_INT32 nInnerIndex = nIndex - FDE_FORMAT_EDIT_FIELD_HADERSIZE; + FX_INT32 nInsLength = wsIns.GetLength(); + FX_INT32 nFieldLength = m_wsField.GetLength(); + CFX_WideString wsTemp = m_wsField; + if (m_bReserveSpace && !m_bLeftAlignment) { + nInnerIndex -= (m_nLength - nFieldLength); + } + FXSYS_assert(nInnerIndex >= 0 && nInnerIndex <= nFieldLength); + if (nInnerIndex + nCount > nFieldLength) { + return FALSE; + } + wsTemp.Delete(nInnerIndex, nCount); + FX_INT32 nInnerIndexBK = nInnerIndex; + for (FX_INT32 i = 0; i < nInsLength; i ++, nInnerIndex ++) { + wsTemp.Insert(nInnerIndex, wsIns[i]); + } + FX_INT32 nRet = Validate(wsTemp); + switch(nRet) { + case FDE_FORMAT_FIELD_VALIDATE_F_FULL: + return FDE_FORMAT_FIELD_INSERT_RET_F_FULL; + case FDE_FORMAT_FIELD_VALIDATE_F_INVALIDATE: + return FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE; + default: + break; + } + FX_LPWSTR lpBuffer = wsDel.GetBuffer(nCount); + FX_LPCWSTR lpSrcBuf = FX_LPCWSTR(m_wsField); + FXSYS_memcpy(lpBuffer, lpSrcBuf + nInnerIndexBK, nCount * sizeof(FX_WCHAR)); + wsDel.ReleaseBuffer(nCount); + m_wsField = wsTemp; + nCaret = nIndex + ((m_bReserveSpace && !m_bLeftAlignment) ? (nCount - nInsLength) : (nInsLength)); + return FDE_FORMAT_FIELD_INSERT_RET_S_NORMAL; +} +void CFDE_TxtEdtField::GetDisplayText(CFX_WideString &wsDisplay) +{ + CFX_WideString wsField; + GetNormalizedFieldText(wsField); + FX_INT32 nLength = wsField.GetLength() + FDE_FORMAT_EDIT_FIELD_HADERSIZE + FDE_FORMAT_EDIT_FIELD_TAILSIZE; + FX_LPWSTR lpBuffer = wsDisplay.GetBuffer(nLength); + lpBuffer[0] = FDE_TXTEDT_FORMATBLOCK_BGN; + lpBuffer[nLength - 1] = FDE_TXTEDT_FORMATBLOCK_END; + FX_DWORD nAddress = (FX_DWORD)this; + FXSYS_memcpy(lpBuffer + 1, &nAddress, sizeof(FX_DWORD)); + FXSYS_memcpy(lpBuffer + 3, FX_LPCWSTR(wsField), (nLength - 4) * sizeof(FX_WCHAR)); + wsDisplay.ReleaseBuffer(nLength); +} +FX_INT32 CFDE_TxtEdtField::GetDisplayLength() +{ + return (m_bReserveSpace ? m_nLength : m_wsField.GetLength()) + FDE_FORMAT_EDIT_FIELD_HADERSIZE + FDE_FORMAT_EDIT_FIELD_TAILSIZE; +} +void CFDE_TxtEdtField::GetFieldText(CFX_WideString &wsField) +{ + wsField = m_wsField; +} +FX_INT32 CFDE_TxtEdtField::GetFieldTextLength() const +{ + return m_wsField.GetLength(); +} +FX_INT32 CFDE_TxtEdtField::GetRealIndex(FX_INT32 nIndex) const +{ + FX_INT32 nInnerIndex = nIndex - FDE_FORMAT_EDIT_FIELD_HADERSIZE; + if (nInnerIndex < 0) { + return 0; + } + FX_INT32 nFieldLength = m_wsField.GetLength(); + if (m_bReserveSpace && !m_bLeftAlignment) { + nInnerIndex -= (m_nLength - nFieldLength); + } + if (nInnerIndex < 0) { + return 0; + } + if (nInnerIndex >= nFieldLength) { + return nFieldLength; + } + return nInnerIndex + 1; +} +FX_INT32 CFDE_TxtEdtField::NormalizeCaretPos(FX_INT32 nIndex, FDE_FORMAT_CARET_DIRECTION eDirection ) const +{ + nIndex -= FDE_FORMAT_EDIT_FIELD_HADERSIZE; + FX_INT32 nLength = m_wsField.GetLength(); + if (m_bReserveSpace) { + FX_INT32 nFieldLength = m_wsField.GetLength(); + if (m_bLeftAlignment) { + if (nIndex > nFieldLength) { + if (eDirection == FDE_FORMAT_CARET_FORWARD) { + return -1; + } + nIndex = nFieldLength; + } + } else { + FX_INT32 nReserveLength = m_nLength - nFieldLength; + if (nIndex < nReserveLength) { + if (eDirection == FDE_FORMAT_CARET_BACKWARD) { + return -2; + } + nIndex = nReserveLength; + } + } + } + return nIndex + FDE_FORMAT_EDIT_FIELD_HADERSIZE; +} +FX_BOOL CFDE_TxtEdtField::GetEditableRange(FX_INT32 &nBgn, FX_INT32 &nEnd) const +{ + if (m_bReserveSpace && !m_bLeftAlignment) { + nEnd = FDE_FORMAT_EDIT_FIELD_HADERSIZE + m_nLength; + nBgn = nEnd - m_wsField.GetLength(); + } else { + nBgn = FDE_FORMAT_EDIT_FIELD_HADERSIZE; + nEnd = nBgn + m_wsField.GetLength(); + } + return TRUE; +} +void CFDE_TxtEdtField::Backup() +{ + m_wsBackup = m_wsField; +} +void CFDE_TxtEdtField::Restore() +{ + m_wsField = m_wsBackup; +} +FX_INT32 CFDE_TxtEdtField::Validate(const CFX_WideString & wsText) const +{ + if (m_nLength < 0) { + return FDE_FORMAT_FIELD_DELETE_RET_S; + } + return wsText.GetLength() <= m_nLength ? FDE_FORMAT_FIELD_VALIDATE_S : FDE_FORMAT_FIELD_VALIDATE_F_FULL; +} +void CFDE_TxtEdtField::GetNormalizedFieldText(CFX_WideString &wsField) const +{ + wsField = m_wsField; + if (m_nLength == -1) { + return; + } + if (m_bReserveSpace) { + FX_INT32 nField = wsField.GetLength(); + FX_INT32 nFill = m_nLength - nField; + if (m_bLeftAlignment) { + while (nFill --) { + wsField.Insert(nField++, m_wcFill); + } + } else { + while (nFill --) { + wsField.Insert(0, m_wcFill); + } + } + } +} +CFDE_TxtEdtField_Integer::CFDE_TxtEdtField_Integer(const CFX_WideString &wsField, FX_INT32 nIndex, CFDE_TxtEdtBlock * pBlock) + : m_bSign(FALSE) + , CFDE_TxtEdtField(nIndex, pBlock) +{ + CFDE_TxtEdtFieldFormatParser FormatParser; + FormatParser.Parse(wsField); + FX_INT32 nCount = FormatParser.CountItems(); + CFX_WideString wskey; + CFX_WideString wsVal; + for (FX_INT32 i = 0; i < nCount; i ++) { + FormatParser.GetItem(i, wskey, wsVal); + if (wskey.Equal(L"Length")) { + m_nLength = wsVal.GetInteger(); + } else if (wskey.Equal(L"Sign")) { + m_bSign = wsVal.GetInteger() != 0; + } else if (wskey.Equal(L"FillChar")) { + m_wcFill = wsVal[0]; + } else { + FXSYS_assert(0); + } + wskey.Empty(); + wsVal.Empty(); + } + if (m_nLength == -1) { + m_bReserveSpace = FALSE; + } +} +FX_INT32 CFDE_TxtEdtField_Integer::Validate(const CFX_WideString &wsText) const +{ + FX_INT32 i = 0; + if (m_bSign) { + FX_WCHAR wcTemp = wsText[0]; + if (FDE_TXTEDT_ISSIGN(wcTemp)) { + i ++; + } + } + FX_INT32 nLength = wsText.GetLength(); + if (m_nLength > 0) { + if (nLength - i > (m_nLength - (m_bSign ? 1 : 0))) { + return FDE_FORMAT_FIELD_VALIDATE_F_FULL; + } + } + for (; i < nLength; i ++) { + FX_WCHAR wcTemp = wsText[i]; + if (!FDE_TXTEDT_ISINTEGER(wcTemp)) { + return FDE_FORMAT_FIELD_VALIDATE_F_INVALIDATE; + } + } + return FDE_FORMAT_FIELD_VALIDATE_S; +} +CFDE_TxtEdtField_Float::CFDE_TxtEdtField_Float(const CFX_WideString &wsField, FX_INT32 nIndex, CFDE_TxtEdtBlock * pBlock) + : CFDE_TxtEdtField(nIndex, pBlock) + , m_bSigned(FALSE) + , m_nIntPartlength(-1) + , m_nDecPartLength(-1) +{ + CFDE_TxtEdtFieldFormatParser FormatParser; + FormatParser.Parse(wsField); + FX_INT32 nCount = FormatParser.CountItems(); + CFX_WideString wskey; + CFX_WideString wsVal; + for (FX_INT32 i = 0; i < nCount; i ++) { + FormatParser.GetItem(i, wskey, wsVal); + if (wskey.Equal(L"DecLength")) { + m_nDecPartLength = wsVal.GetInteger(); + } else if (wskey.Equal(L"IntLength")) { + m_nIntPartlength = wsVal.GetInteger(); + } else if (wskey.Equal(L"Sign")) { + m_bSigned = wsVal.GetInteger() != 0; + } else if (wskey.Equal(L"FillChar")) { + m_wcFill = wsVal[0]; + } else { + FXSYS_assert(0); + } + if (m_nIntPartlength == -1 || m_nDecPartLength == -1) { + m_nLength = -1; + } else { + m_nLength = m_nIntPartlength + m_nDecPartLength + 1 + (m_bSigned ? 1 : 0); + } + m_bReserveSpace = TRUE; + wskey.Empty(); + wsVal.Empty(); + } +} +FX_INT32 CFDE_TxtEdtField_Float::Validate(const CFX_WideString & wsText) const +{ + FX_INT32 nLength = wsText.GetLength(); + if (m_nLength != -1 && (nLength > m_nLength)) { + return FDE_FORMAT_FIELD_VALIDATE_F_FULL; + } + FX_LPCWSTR lpBuf = FX_LPCWSTR(wsText); + FX_INT32 i = 0; + if (m_bSigned) { + FX_WCHAR wcTemp = lpBuf[0]; + if (FDE_TXTEDT_ISSIGN(wcTemp)) { + i ++; + } + } + FX_INT32 nIntPart = 0; + FX_INT32 nPoint = 0; + for (; i < nLength; i ++) { + FX_WCHAR wcTemp = lpBuf[i]; + if (!FDE_TXTEDT_ISINTEGER(wcTemp)) { + if (wcTemp != L'.') { + return FDE_FORMAT_FIELD_VALIDATE_F_INVALIDATE; + } + nPoint = 1; + break; + } + nIntPart ++; + } + if (m_nIntPartlength != -1 && (nIntPart > m_nIntPartlength)) { + return FDE_FORMAT_FIELD_VALIDATE_F_FULL; + } + if (m_nDecPartLength != -1 && (nLength - nIntPart - nPoint > m_nDecPartLength)) { + return FDE_FORMAT_FIELD_VALIDATE_F_FULL; + } + i ++; + for (; i < nLength; i ++) { + FX_WCHAR wcTemp = lpBuf[i]; + if (!FDE_TXTEDT_ISINTEGER(wcTemp)) { + return FDE_FORMAT_FIELD_VALIDATE_F_FULL; + } + } + return FDE_FORMAT_FIELD_VALIDATE_S; +} +CFDE_TxtEdtField_Password::CFDE_TxtEdtField_Password(const CFX_WideString &wsField, FX_INT32 nIndex, CFDE_TxtEdtBlock * pBlock) + : CFDE_TxtEdtField(nIndex, pBlock) + , m_wcAlias(L'*') +{ + CFDE_TxtEdtFieldFormatParser FormatParser; + FormatParser.Parse(wsField); + FX_INT32 nCount = FormatParser.CountItems(); + CFX_WideString wskey; + CFX_WideString wsVal; + for (FX_INT32 i = 0; i < nCount; i ++) { + FormatParser.GetItem(i, wskey, wsVal); + if (wskey.Equal(L"Length")) { + m_nLength = wsVal.GetInteger(); + } else if (wskey.Equal(L"AliasChar")) { + m_wcAlias = wsVal[0]; + } else { + FXSYS_assert(0); + } + wskey.Empty(); + wsVal.Empty(); + } + if (m_nLength == -1) { + m_bReserveSpace = FALSE; + } +} +void CFDE_TxtEdtField_Password::GetNormalizedFieldText(CFX_WideString &wsField) const +{ + FX_INT32 nFiledLength = m_wsField.GetLength(); + FX_INT32 nLength = m_bReserveSpace ? m_nLength : nFiledLength; + FX_LPWSTR lpBuf = wsField.GetBuffer(nLength); + FX_INT32 nSpaceLength = nLength - nFiledLength; + FX_INT32 nFirstPart = m_bLeftAlignment ? nFiledLength : nSpaceLength; + FX_WCHAR wFirstChar = m_bLeftAlignment ? m_wcAlias : L' '; + FX_WCHAR wSecondChar = m_bLeftAlignment ? L' ' : m_wcAlias; + FX_INT32 i = 0; + for (; i < nFirstPart; i ++) { + lpBuf[i] = wFirstChar; + } + for (; i < nLength; i ++) { + lpBuf[i] = wSecondChar; + } + wsField.ReleaseBuffer(nLength); +} +CFDE_TxtEdtField_String::CFDE_TxtEdtField_String(const CFX_WideString &wsField, FX_INT32 nIndex, CFDE_TxtEdtBlock * pBlock) + : CFDE_TxtEdtField(nIndex, pBlock) +{ + CFDE_TxtEdtFieldFormatParser FormatParser; + FormatParser.Parse(wsField); + FX_INT32 nCount = FormatParser.CountItems(); + CFX_WideString wskey; + CFX_WideString wsVal; + for (FX_INT32 i = 0; i < nCount; i ++) { + FormatParser.GetItem(i, wskey, wsVal); + if (wskey.Equal(L"Length")) { + m_nLength = wsVal.GetInteger(); + } else { + FXSYS_assert(0); + } + wskey.Empty(); + wsVal.Empty(); + } +} +CFDE_TxtEdtField_Fixed::CFDE_TxtEdtField_Fixed(const CFX_WideString &wsField, FX_INT32 nIndex, CFDE_TxtEdtBlock * pBlock) + : CFDE_TxtEdtField(nIndex, pBlock) +{ + m_wsField = wsField; + m_nLength = wsField.GetLength(); +} +void CFDE_TxtEdtField_Fixed::GetDisplayText(CFX_WideString &wsDisplay) +{ + FX_INT32 nLength = m_wsField.GetLength() + FDE_FORMAT_EDIT_FIELD_HADERSIZE + FDE_FORMAT_EDIT_FIELD_TAILSIZE; + FX_LPWSTR lpBuffer = wsDisplay.GetBuffer(nLength); + lpBuffer[0] = FDE_TXTEDT_FORMATBLOCK_BGN; + lpBuffer[nLength - 1] = FDE_TXTEDT_FORMATBLOCK_END; + FX_DWORD nAddress = (FX_DWORD)this; + FXSYS_memcpy(lpBuffer + 1, &nAddress, sizeof(FX_DWORD)); + FXSYS_memcpy(lpBuffer + 3, FX_LPCWSTR(m_wsField), (nLength - 4) * sizeof(FX_WCHAR)); + wsDisplay.ReleaseBuffer(nLength); +} +FX_INT32 CFDE_TxtEdtField_Fixed::NormalizeCaretPos(FX_INT32 nIndex, FDE_FORMAT_CARET_DIRECTION eDirection ) const +{ + FXSYS_assert(nIndex >= 0 && nIndex <= m_nLength); + if (eDirection == FDE_FORMAT_CARET_MIDDLE) { + return (nIndex > m_wsField.GetLength() / 2) ? -1 : -2; + } + return eDirection == FDE_FORMAT_CARET_BACKWARD ? -2 : -1; +} +#endif diff --git a/xfa/src/fee/src/fee/fde_txtedtblock.h b/xfa/src/fee/src/fee/fde_txtedtblock.h new file mode 100644 index 0000000000..12aee74d39 --- /dev/null +++ b/xfa/src/fee/src/fee/fde_txtedtblock.h @@ -0,0 +1,227 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FDE_TXTEDTBLOCK_H +#define _FDE_TXTEDTBLOCK_H +#ifdef FDE_USEFORMATBLOCK +class CFDE_TxtEdtEngine; +class CFDE_TxtEdtBlock; +class CFDE_TxtEdtFieldFormatParser; +class CFDE_TxtEdtField; +class CFDE_TxtEdtField_Integer; +class CFDE_TxtEdtField_Float; +class CFDE_TxtEdtField_Password; +class CFDE_TxtEdtField_String; +class CFDE_TxtEdtField_Fixed; +#define FDE_FORMAT_EDIT_FIELD_HADERSIZE 3 +#define FDE_FORMAT_EDIT_FIELD_TAILSIZE 1 +enum FDE_FORMAT_FIELD_INSERT_RET { + FDE_FORMAT_FIELD_INSERT_RET_S_NORMAL = 0, + FDE_FORMAT_FIELD_INSERT_RET_S_FULL , + FDE_FORMAT_FIELD_INSERT_RET_F_FULL , + FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE, +}; +enum FDE_FORMAT_FIELD_DELETE_RET { + FDE_FORMAT_FIELD_DELETE_RET_S = 0 , + FDE_FORMAT_FIELD_DELETE_RET_F_INVALIDATE , + FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY , +}; +enum FDE_FORMAT_FIELD_VALIDATE_RET { + FDE_FORMAT_FIELD_VALIDATE_S = 0 , + FDE_FORMAT_FIELD_VALIDATE_F_FULL , + FDE_FORMAT_FIELD_VALIDATE_F_INVALIDATE , +}; +enum FDE_FORMAT_CARET_DIRECTION { + FDE_FORMAT_CARET_FORWARD, + FDE_FORMAT_CARET_MIDDLE, + FDE_FORMAT_CARET_BACKWARD +}; +class CFDE_TxtEdtBlock : public CFX_Object +{ +public: + CFDE_TxtEdtBlock(CFDE_TxtEdtEngine * pEngine, const CFX_WideString &wsBlock, FX_INT32 nPosition); + ~CFDE_TxtEdtBlock(); + void GetDisplayText(CFX_WideString &wsDisplay); + FX_INT32 GetLength() const; + void GetBlockText(CFX_WideString &wsBlock); + FX_INT32 CountField() const; + void GetFieldText(FX_INT32 nIndex, CFX_WideString &wsField); + FX_INT32 GetFieldTextLength() const; + + FX_INT32 GetPos() const; + void GetRealText(CFX_WideString &wsText) const; + void Backup(); + void Restore(); + void SetIndex(FX_INT32 nIndex) + { + m_nIndex = nIndex; + } + FX_INT32 GetIndex() const + { + return m_nIndex; + } +private: + CFDE_TxtEdtEngine * m_pEngine; + FX_INT32 m_nDisplayLength; + FX_INT32 m_nIndex; + + FX_INT32 m_nPosition; + CFX_ArrayTemplate m_FieldArr; + CFX_ArrayTemplate m_EditFieldArr; +}; +class CFDE_TxtEdtFieldFormatParser : public CFX_Object +{ +public: + CFDE_TxtEdtFieldFormatParser(); + ~CFDE_TxtEdtFieldFormatParser(); + FX_BOOL Parse(const CFX_WideString &wsFormat); + FX_INT32 CountItems() const; + void GetItem(FX_INT32 nIndex, CFX_WideString &wsKey, CFX_WideString &wsValue) const; +private: + typedef struct : public CFX_Object { + FX_INT32 nKeyStart; + FX_INT32 nKeyCount; + FX_INT32 nValStart; + FX_INT32 nValCount; + } FDE_TXTEDTFORMATITEM, * FDE_LPTXTEDTFORMATITEM; + + CFX_WideString m_wsFormat; + CFX_ArrayTemplate m_ItemArr; +}; +class CFDE_TxtEdtField : public CFX_Object +{ +public: + static CFDE_TxtEdtField * Create(const CFX_WideString &wsField, FX_INT32 nIndex, CFDE_TxtEdtBlock * pBlock); + virtual void Release(); + virtual FX_INT32 Insert( FX_INT32 nIndex, const CFX_WideString &wsIns, + FX_INT32 &nCaret, FX_BOOL &bBefore); + virtual FX_INT32 Delete( FX_INT32 nIndex, FX_INT32 nCount, + CFX_WideString &wsDel, FX_INT32 &nCaret, + FX_BOOL &bBefore); + virtual FX_INT32 Replace(FX_INT32 nIndex, FX_INT32 nCount, + const CFX_WideString &wsIns, CFX_WideString &wsDel, + FX_INT32 &nCaret, FX_BOOL &bBefore); + virtual void GetDisplayText(CFX_WideString &wsDisplay); + virtual FX_INT32 GetDisplayLength(); + virtual void GetFieldText(CFX_WideString &wsField); + virtual FX_INT32 GetFieldTextLength() const; + virtual FX_INT32 GetRealIndex(FX_INT32 nIndex) const; + + + virtual FX_INT32 NormalizeCaretPos( FX_INT32 nIndex, + FDE_FORMAT_CARET_DIRECTION eDirection = FDE_FORMAT_CARET_MIDDLE) const; + + virtual FX_BOOL GetEditableRange(FX_INT32 &nBgn, FX_INT32 &nEnd) const; + virtual void Backup(); + virtual void Restore(); + virtual FX_BOOL IsFix() const + { + return FALSE; + } + void SetIndex(FX_INT32 nIndex) + { + m_nIndex = nIndex; + } + FX_INT32 GetIndex() const + { + return m_nIndex; + } + FX_INT32 GetBlockIndex() const + { + return m_pBlock->GetIndex(); + } +protected: + CFDE_TxtEdtField(FX_INT32 nIndex, CFDE_TxtEdtBlock * pBlock); + virtual ~CFDE_TxtEdtField() {} + virtual FX_INT32 Validate(const CFX_WideString & wsText) const; + virtual void GetNormalizedFieldText(CFX_WideString &wsField) const; + FX_INT32 m_nLength; + CFX_WideString m_wsField; + CFX_WideString m_wsBackup; + FX_WCHAR m_wcFill; + FX_BOOL m_bReserveSpace; + FX_BOOL m_bLeftAlignment; + FX_INT32 m_nIndex; + CFDE_TxtEdtBlock * m_pBlock; +}; +class CFDE_TxtEdtField_Integer : public CFDE_TxtEdtField +{ +public: + CFDE_TxtEdtField_Integer(const CFX_WideString &wsField, FX_INT32 nIndex, CFDE_TxtEdtBlock * pBlock); +protected: + virtual ~CFDE_TxtEdtField_Integer() {} + virtual FX_INT32 Validate(const CFX_WideString &wsText) const; +private: + FX_BOOL m_bSign; +}; +class CFDE_TxtEdtField_Float : public CFDE_TxtEdtField +{ +public: + CFDE_TxtEdtField_Float(const CFX_WideString &wsField, FX_INT32 nIndex, CFDE_TxtEdtBlock * pBlock); +protected: + virtual ~CFDE_TxtEdtField_Float() {} + virtual FX_INT32 Validate(const CFX_WideString & wsText) const; +private: + FX_BOOL m_bSigned; + FX_INT32 m_nIntPartlength; + FX_INT32 m_nDecPartLength; +}; +class CFDE_TxtEdtField_Password : public CFDE_TxtEdtField +{ +public: + CFDE_TxtEdtField_Password(const CFX_WideString &wsField, FX_INT32 nIndex, CFDE_TxtEdtBlock * pBlock); + +protected: + virtual ~CFDE_TxtEdtField_Password() {} + virtual void GetNormalizedFieldText(CFX_WideString &wsField) const; +private: + FX_WCHAR m_wcAlias; +}; +class CFDE_TxtEdtField_String : public CFDE_TxtEdtField +{ +public: + CFDE_TxtEdtField_String(const CFX_WideString &wsField, FX_INT32 nIndex, CFDE_TxtEdtBlock * pBlock); +protected: + virtual ~CFDE_TxtEdtField_String() {} +}; +class CFDE_TxtEdtField_Fixed : public CFDE_TxtEdtField +{ +public: + CFDE_TxtEdtField_Fixed(const CFX_WideString &wsField, FX_INT32 nIndex, CFDE_TxtEdtBlock * pBlock); + virtual FX_INT32 Insert( FX_INT32 nIndex, const CFX_WideString &wsIns, + FX_INT32 &nCaret, FX_BOOL &bBefore) + { + return FALSE; + } + virtual FX_INT32 Delete( FX_INT32 nIndex, FX_INT32 nCount, CFX_WideString &wsDel, + FX_INT32 &nCaret, FX_BOOL &bBefore) + { + return FALSE; + } + virtual FX_INT32 Replace(FX_INT32 nIndex, FX_INT32 nCount, const CFX_WideString &wsIns, + CFX_WideString &wsDel, FX_INT32 &nCaret, FX_BOOL &bBefore) + { + return FALSE; + } + virtual void GetDisplayText(CFX_WideString &wsDisplay); + virtual FX_INT32 NormalizeCaretPos( FX_INT32 nIndex, + FDE_FORMAT_CARET_DIRECTION eDirection ) const; + virtual FX_BOOL GetEditableRange(FX_INT32 &nBgn, FX_INT32 &nEnd) const + { + return FALSE; + } + virtual void Backup() {} + virtual void Restore() {} + + virtual FX_BOOL IsFix() const + { + return TRUE; + } +protected: + virtual ~CFDE_TxtEdtField_Fixed() {} +}; +#endif +#endif diff --git a/xfa/src/fee/src/fee/fde_txtedtbuf.cpp b/xfa/src/fee/src/fee/fde_txtedtbuf.cpp new file mode 100644 index 0000000000..f2cb0c57f2 --- /dev/null +++ b/xfa/src/fee/src/fee/fde_txtedtbuf.cpp @@ -0,0 +1,446 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../../include/ifde_txtedtbuf.h" +#include "../../include/ifde_txtedtengine.h" +#include "fde_txtedtbuf.h" +#define FDE_DEFCHUNKCOUNT 2 +#define FDE_TXTEDT_FORMATBLOCK_BGN 0xFFF9 +#define FDE_TXTEDT_FORMATBLOCK_END 0xFFFB +#define FDE_TXTEDT_ZEROWIDTHSPACE 0x200B +#ifdef FDE_USEFORMATBLOCK +CFDE_TxtEdtBufIter::CFDE_TxtEdtBufIter(CFDE_TxtEdtBuf * pBuf, FX_BOOL bForDisplay ) +#else +CFDE_TxtEdtBufIter::CFDE_TxtEdtBufIter(CFDE_TxtEdtBuf * pBuf, FX_WCHAR wcAlias ) +#endif + : m_nCurChunk(0) + , m_nCurIndex(0) + , m_nIndex(0) + , m_pBuf(pBuf) +#ifdef FDE_USEFORMATBLOCK + , m_bForDisplay(bForDisplay) + , m_nAliasCount(0) +#endif + , m_bInField(FALSE) + , m_Alias(wcAlias) +{ + FXSYS_assert(m_pBuf); +} +CFDE_TxtEdtBufIter::~CFDE_TxtEdtBufIter() +{ +} +void CFDE_TxtEdtBufIter::Release() +{ + delete this; +} +FX_BOOL CFDE_TxtEdtBufIter::Next(FX_BOOL bPrev ) +{ + if (bPrev) { + if (m_nIndex == 0) { + return FALSE; + } + FXSYS_assert(m_nCurChunk < m_pBuf->m_Chunks.GetSize()); + CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER lpChunk = NULL; + if (m_nCurIndex > 0) { + m_nCurIndex --; + } else { + while (m_nCurChunk > 0) { + --m_nCurChunk; + lpChunk = (CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER)m_pBuf->m_Chunks[m_nCurChunk]; + if (lpChunk->nUsed > 0) { + m_nCurIndex = lpChunk->nUsed - 1; + break; + } + } + } + FXSYS_assert(m_nCurChunk >= 0); + m_nIndex --; + return TRUE; + } else { + if (m_nIndex >= (m_pBuf->m_nTotal - 1)) { + return FALSE; + } + FXSYS_assert(m_nCurChunk < m_pBuf->m_Chunks.GetSize()); + CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER lpChunk = \ + (CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER)m_pBuf->m_Chunks[m_nCurChunk]; + if (lpChunk->nUsed != (m_nCurIndex + 1)) { + m_nCurIndex ++; + } else { + FX_INT32 nEnd = m_pBuf->m_Chunks.GetSize() - 1; + while (m_nCurChunk < nEnd) { + m_nCurChunk ++; + CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER lpChunkTemp = \ + (CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER)m_pBuf->m_Chunks[m_nCurChunk]; + if (lpChunkTemp->nUsed > 0) { + m_nCurIndex = 0; + break; + } + } + } + m_nIndex ++; + return TRUE; + } +} +void CFDE_TxtEdtBufIter::SetAt(FX_INT32 nIndex) +{ + FXSYS_assert(nIndex >= 0 && nIndex < m_pBuf->m_nTotal); + CFDE_TxtEdtBuf::FDE_CHUNKPLACE cp; + m_pBuf->Index2CP(nIndex, cp); + m_nIndex = nIndex; + m_nCurChunk = cp.nChunkIndex; + m_nCurIndex = cp.nCharIndex; +} +FX_INT32 CFDE_TxtEdtBufIter::GetAt() const +{ + return m_nIndex; +} +FX_WCHAR CFDE_TxtEdtBufIter::GetChar() +{ + FXSYS_assert(m_nIndex >= 0 && m_nIndex < m_pBuf->m_nTotal); +#ifdef FDE_USEFORMATBLOCK + if (m_bForDisplay) { + if (m_bInField) { + FXSYS_assert(m_nAliasCount >= 0 && m_nAliasCount <= 2); + if (m_nAliasCount > 0) { + m_nAliasCount --; + return FDE_TXTEDT_ZEROWIDTHSPACE; + } + FX_WCHAR wc = ((CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER)m_pBuf->m_Chunks[m_nCurChunk])->wChars[m_nCurIndex]; + if (wc == FDE_TXTEDT_FORMATBLOCK_END) { + m_nAliasCount = 0; + m_bInField = FALSE; + } + return wc; + } else { + FX_WCHAR wc = ((CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER)m_pBuf->m_Chunks[m_nCurChunk])->wChars[m_nCurIndex]; + if (wc == FDE_TXTEDT_FORMATBLOCK_BGN) { + m_nAliasCount = 2; + m_bInField = TRUE; + } + return wc; + } + } +#endif + if (m_Alias == 0 || m_nIndex == (m_pBuf->m_nTotal - 1)) { + return ((CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER)m_pBuf->m_Chunks[m_nCurChunk])->wChars[m_nCurIndex]; + } + return m_Alias; +} +FX_BOOL CFDE_TxtEdtBufIter::IsEOF(FX_BOOL bTail ) const +{ + return bTail ? m_nIndex == (m_pBuf->GetTextLength() - 2) : m_nIndex == 0; +} +IFX_CharIter * CFDE_TxtEdtBufIter::Clone() +{ + CFDE_TxtEdtBufIter * pIter = FX_NEW CFDE_TxtEdtBufIter(m_pBuf); + pIter->m_nCurChunk = m_nCurChunk; + pIter->m_nCurIndex = m_nCurIndex; + pIter->m_nIndex = m_nIndex; + pIter->m_Alias = m_Alias; + return pIter; +} +CFDE_TxtEdtBuf::CFDE_TxtEdtBuf(FX_INT32 nDefChunkSize ) + : m_nChunkSize(nDefChunkSize) + , m_nTotal(0) + , m_bChanged(FALSE) + , m_pAllocator(NULL) +{ + FXSYS_assert(m_nChunkSize); + ResetChunkBuffer(FDE_DEFCHUNKCOUNT, m_nChunkSize); +} +void CFDE_TxtEdtBuf::Release() +{ + delete this; +} +CFDE_TxtEdtBuf::~CFDE_TxtEdtBuf() +{ + Clear(TRUE); + m_pAllocator->Release(); + m_Chunks.RemoveAll(); +} +FX_BOOL CFDE_TxtEdtBuf::SetChunkSize(FX_INT32 nChunkSize) +{ + FXSYS_assert(nChunkSize); + ResetChunkBuffer(FDE_DEFCHUNKCOUNT, nChunkSize); + return TRUE; +} +FX_INT32 CFDE_TxtEdtBuf::GetChunkSize() const +{ + return m_nChunkSize; +} +FX_INT32 CFDE_TxtEdtBuf::GetTextLength() const +{ + return m_nTotal; +} +void CFDE_TxtEdtBuf::SetText(const CFX_WideString &wsText) +{ + FXSYS_assert(!wsText.IsEmpty()); + Clear(FALSE); + FX_INT32 nTextLength = wsText.GetLength(); + FX_INT32 nNeedCount = ((nTextLength - 1) / m_nChunkSize + 1) - m_Chunks.GetSize(); + FX_INT32 i = 0; + for (i = 0; i < nNeedCount; i ++) { + FDE_LPCHUNKHEADER lpChunk = (FDE_LPCHUNKHEADER)m_pAllocator->Alloc(sizeof(FDE_CHUNKHEADER) + \ + (m_nChunkSize - 1) * sizeof(FX_WCHAR)); + lpChunk->nUsed = 0; + m_Chunks.Add(lpChunk); + } + FX_INT32 nTotalCount = m_Chunks.GetSize(); + FX_LPCWSTR lpSrcBuf = FX_LPCWSTR(wsText); + FX_INT32 nLeave = nTextLength; + FX_INT32 nCopyedLength = m_nChunkSize; + for (i = 0; i < nTotalCount && nLeave > 0; i ++) { + if (nLeave < nCopyedLength) { + nCopyedLength = nLeave; + } + FDE_LPCHUNKHEADER lpChunk = (FDE_LPCHUNKHEADER)m_Chunks[i]; + FXSYS_memcpy(lpChunk->wChars, lpSrcBuf, nCopyedLength * sizeof(FX_WCHAR)); + nLeave -= nCopyedLength; + lpSrcBuf += nCopyedLength; + lpChunk->nUsed = nCopyedLength; + } + m_nTotal = nTextLength; + m_bChanged = TRUE; +} +void CFDE_TxtEdtBuf::GetText(CFX_WideString &wsText) const +{ + GetRange(wsText, 0, m_nTotal); +} +FX_WCHAR CFDE_TxtEdtBuf::GetCharByIndex(FX_INT32 nIndex) const +{ + FXSYS_assert(nIndex >= 0 && nIndex < GetTextLength()); + FDE_LPCHUNKHEADER pChunkHeader = NULL; + FX_INT32 nTotal = 0; + FX_INT32 nCount = m_Chunks.GetSize(); + FX_INT32 i = 0; + for (i = 0; i < nCount; i ++) { + pChunkHeader = (FDE_LPCHUNKHEADER)m_Chunks[i]; + nTotal += pChunkHeader->nUsed; + if (nTotal > nIndex) { + break; + } + } + FXSYS_assert(pChunkHeader); + return pChunkHeader->wChars[pChunkHeader->nUsed - (nTotal - nIndex)]; +} +void CFDE_TxtEdtBuf::GetRange(CFX_WideString &wsText, FX_INT32 nBegin, FX_INT32 nLength) const +{ + FDE_CHUNKPLACE cp; + Index2CP(nBegin, cp); + FX_INT32 nLeave = nLength; + FX_INT32 nCount = m_Chunks.GetSize(); + FX_LPWSTR lpDstBuf = wsText.GetBuffer(nLength); + FX_INT32 nChunkIndex = cp.nChunkIndex; + FDE_LPCHUNKHEADER lpChunkHeader = (FDE_LPCHUNKHEADER)m_Chunks[nChunkIndex]; + FX_INT32 nCopyLength = lpChunkHeader->nUsed - cp.nCharIndex; + FX_LPWSTR lpSrcBuf = lpChunkHeader->wChars + cp.nCharIndex; + while (nLeave > 0) { + if (nLeave <= nCopyLength) { + nCopyLength = nLeave; + } + FXSYS_memcpy(lpDstBuf, lpSrcBuf, nCopyLength * sizeof(FX_WCHAR)); + nChunkIndex ++; + if (nChunkIndex >= nCount) { + break; + } + lpChunkHeader = (FDE_LPCHUNKHEADER)m_Chunks[nChunkIndex]; + lpSrcBuf = lpChunkHeader->wChars; + nLeave -= nCopyLength; + lpDstBuf += nCopyLength; + nCopyLength = lpChunkHeader->nUsed; + } + wsText.ReleaseBuffer(); +} +void CFDE_TxtEdtBuf::Insert(FX_INT32 nPos, FX_LPCWSTR lpText, FX_INT32 nLength ) +{ + FXSYS_assert(nPos >= 0 && nPos <= m_nTotal); + FDE_CHUNKPLACE cp; + Index2CP(nPos, cp); + FX_INT32 nLengthTemp = nLength; + if (cp.nCharIndex != 0) { + FDE_LPCHUNKHEADER lpNewChunk = (FDE_LPCHUNKHEADER)m_pAllocator->Alloc(sizeof(FDE_CHUNKHEADER) + \ + (m_nChunkSize - 1) * sizeof(FX_WCHAR)); + FDE_LPCHUNKHEADER lpChunk = (FDE_LPCHUNKHEADER)m_Chunks[cp.nChunkIndex]; + FX_INT32 nCopy = lpChunk->nUsed - cp.nCharIndex; + FXSYS_memcpy(lpNewChunk->wChars, lpChunk->wChars + cp.nCharIndex, nCopy * sizeof(FX_WCHAR)); + lpChunk->nUsed -= nCopy; + cp.nChunkIndex ++; + m_Chunks.InsertAt(cp.nChunkIndex, lpNewChunk); + lpNewChunk->nUsed = nCopy; + cp.nCharIndex = 0; + } + if (cp.nChunkIndex != 0) { + FDE_LPCHUNKHEADER lpChunk = (FDE_LPCHUNKHEADER)m_Chunks[cp.nChunkIndex - 1]; + if (lpChunk->nUsed != m_nChunkSize) { + cp.nChunkIndex --; + FX_INT32 nFree = m_nChunkSize - lpChunk->nUsed; + FX_INT32 nCopy = FX_MIN(nLengthTemp, nFree); + FXSYS_memcpy(lpChunk->wChars + lpChunk->nUsed, lpText, nCopy * sizeof(FX_WCHAR)); + lpText += nCopy; + nLengthTemp -= nCopy; + lpChunk->nUsed += nCopy; + cp.nChunkIndex++; + } + } + while (nLengthTemp > 0) { + FDE_LPCHUNKHEADER lpChunk = (FDE_LPCHUNKHEADER)m_pAllocator->Alloc(sizeof(FDE_CHUNKHEADER) + \ + (m_nChunkSize - 1) * sizeof(FX_WCHAR)); + FXSYS_assert(lpChunk); + FX_INT32 nCopy = FX_MIN(nLengthTemp, m_nChunkSize); + FXSYS_memcpy(lpChunk->wChars, lpText, nCopy * sizeof(FX_WCHAR)); + lpText += nCopy; + nLengthTemp -= nCopy; + lpChunk->nUsed = nCopy; + m_Chunks.InsertAt(cp.nChunkIndex, lpChunk); + cp.nChunkIndex ++; + } + m_nTotal += nLength; + m_bChanged = TRUE; +} +void CFDE_TxtEdtBuf::Delete(FX_INT32 nIndex, FX_INT32 nLength ) +{ + FXSYS_assert(nLength > 0 && nIndex >= 0 && nIndex + nLength <= m_nTotal); + FDE_CHUNKPLACE cpEnd; + Index2CP(nIndex + nLength - 1, cpEnd); + m_nTotal -= nLength; + FDE_LPCHUNKHEADER lpChunk = (FDE_LPCHUNKHEADER)m_Chunks[cpEnd.nChunkIndex]; + FX_INT32 nFirstPart = cpEnd.nCharIndex + 1; + FX_INT32 nMovePart = lpChunk->nUsed - nFirstPart; + if (nMovePart != 0) { + FX_INT32 nDelete = FX_MIN(nFirstPart, nLength); + FXSYS_memmove(lpChunk->wChars + nFirstPart - nDelete, \ + lpChunk->wChars + nFirstPart, nMovePart * sizeof(FX_WCHAR)); + lpChunk->nUsed -= nDelete; + nLength -= nDelete; + cpEnd.nChunkIndex --; + } + while (nLength > 0) { + lpChunk = (FDE_LPCHUNKHEADER)m_Chunks[cpEnd.nChunkIndex]; + FX_INT32 nDeleted = FX_MIN(lpChunk->nUsed, nLength); + lpChunk->nUsed -= nDeleted; + if (lpChunk->nUsed == 0) { + m_pAllocator->Free(lpChunk); + m_Chunks.RemoveAt(cpEnd.nChunkIndex); + lpChunk = NULL; + } + nLength -= nDeleted; + cpEnd.nChunkIndex --; + } + m_bChanged = TRUE; +} +void CFDE_TxtEdtBuf::Clear(FX_BOOL bRelease ) +{ + FX_INT32 i = 0; + FX_INT32 nCount = m_Chunks.GetSize(); + if (bRelease) { + while (i < nCount) { + m_pAllocator->Free(m_Chunks[i++]); + } + m_Chunks.RemoveAll(); + } else { + while (i < nCount) { + ((FDE_LPCHUNKHEADER)m_Chunks[i++])->nUsed = 0; + } + } + m_nTotal = 0; + m_bChanged = TRUE; +} +FX_BOOL CFDE_TxtEdtBuf::Optimize(IFX_Pause * pPause ) +{ + if (m_bChanged == FALSE) { + return TRUE; + } + if (m_nTotal == 0) { + return TRUE; + } + FX_INT32 nCount = m_Chunks.GetSize(); + if (nCount == 0) { + return TRUE; + } + FX_INT32 i = 0; + for ( ; i < nCount; i ++) { + FDE_LPCHUNKHEADER lpChunk = (FDE_LPCHUNKHEADER)m_Chunks[i]; + if (lpChunk->nUsed == 0) { + m_pAllocator->Free(lpChunk); + m_Chunks.RemoveAt(i); + --i; + --nCount; + } + } + if (pPause != NULL && pPause->NeedToPauseNow()) { + return FALSE; + } + FDE_LPCHUNKHEADER lpPreChunk = (FDE_LPCHUNKHEADER)m_Chunks[0]; + FDE_LPCHUNKHEADER lpCurChunk = NULL; + for (i = 1; i < nCount; i ++) { + lpCurChunk = (FDE_LPCHUNKHEADER)m_Chunks[i]; + if (lpPreChunk->nUsed + lpCurChunk->nUsed <= m_nChunkSize) { + FXSYS_memcpy(lpPreChunk->wChars + lpPreChunk->nUsed, lpCurChunk->wChars, \ + lpCurChunk->nUsed * sizeof(FX_WCHAR)); + lpPreChunk->nUsed += lpCurChunk->nUsed; + m_pAllocator->Free(lpCurChunk); + m_Chunks.RemoveAt(i); + --i; + --nCount; + } else { + lpPreChunk = lpCurChunk; + } + if (pPause != NULL && pPause->NeedToPauseNow()) { + return FALSE; + } + } + m_bChanged = FALSE; + return TRUE; +} +void CFDE_TxtEdtBuf::ResetChunkBuffer(FX_INT32 nDefChunkCount, FX_INT32 nChunkSize) +{ + FXSYS_assert(nChunkSize); + FXSYS_assert(nDefChunkCount); + if (m_pAllocator) { + m_pAllocator->Release(); + m_pAllocator = NULL; + } + m_Chunks.RemoveAll(); + m_nChunkSize = nChunkSize; + FX_INT32 nChunkLength = sizeof(FDE_CHUNKHEADER) + (m_nChunkSize - 1) * sizeof(FX_WCHAR); + m_pAllocator = FX_CreateAllocator(FX_ALLOCTYPE_Fixed, nDefChunkCount, nChunkLength); + FXSYS_assert(m_pAllocator); + FDE_LPCHUNKHEADER lpChunkHeader = (FDE_LPCHUNKHEADER)m_pAllocator->Alloc(nChunkLength); + FXSYS_assert(lpChunkHeader); + lpChunkHeader->nUsed = 0; + m_Chunks.Add(lpChunkHeader); + m_nTotal = 0; +} +FX_INT32 CFDE_TxtEdtBuf::CP2Index(const FDE_CHUNKPLACE & cp) const +{ + FX_INT32 nTotal = cp.nCharIndex; + FX_INT32 i = 0; + for (i = 0; i < cp.nChunkIndex; i ++) { + nTotal += ((FDE_LPCHUNKHEADER)m_Chunks[i])->nUsed; + } + return nTotal; +} +void CFDE_TxtEdtBuf::Index2CP(FX_INT32 nIndex, FDE_CHUNKPLACE & cp) const +{ + FXSYS_assert(nIndex <= GetTextLength()); + if (nIndex == m_nTotal) { + cp.nChunkIndex = m_Chunks.GetSize() - 1; + cp.nCharIndex = ((FDE_LPCHUNKHEADER)m_Chunks[cp.nChunkIndex])->nUsed; + return; + } + FX_INT32 i = 0; + FX_INT32 nTotal = 0; + FX_INT32 nCount = m_Chunks.GetSize(); + for ( ; i < nCount; i ++) { + nTotal += ((FDE_LPCHUNKHEADER)m_Chunks[i])->nUsed; + if (nTotal > nIndex) { + break; + } + } + cp.nChunkIndex = i; + cp.nCharIndex = ((FDE_LPCHUNKHEADER)m_Chunks[i])->nUsed - (nTotal - nIndex); +} diff --git a/xfa/src/fee/src/fee/fde_txtedtbuf.h b/xfa/src/fee/src/fee/fde_txtedtbuf.h new file mode 100644 index 0000000000..5baeacd2f6 --- /dev/null +++ b/xfa/src/fee/src/fee/fde_txtedtbuf.h @@ -0,0 +1,90 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FDE_TXTEDTBUF_H +#define _FDE_TXTEDTBUF_H +class IFX_CharIter; +class CFDE_TxtEdtBufIter; +class CFDE_TxtEdtBuf; +class CFDE_TxtEdtBufIter : public IFX_CharIter, public CFX_Object +{ +public: +#ifdef FDE_USEFORMATBLOCK + CFDE_TxtEdtBufIter(CFDE_TxtEdtBuf * pBuf, FX_BOOL bForDisplay = TRUE); +#else + CFDE_TxtEdtBufIter(CFDE_TxtEdtBuf * pBuf, FX_WCHAR wcAlias = 0); +#endif + + virtual void Release(); + virtual FX_BOOL Next(FX_BOOL bPrev = FALSE); + virtual FX_WCHAR GetChar(); + virtual void SetAt(FX_INT32 nIndex); + virtual FX_INT32 GetAt() const; + virtual FX_BOOL IsEOF(FX_BOOL bTail = TRUE) const; + virtual IFX_CharIter * Clone(); +protected: + ~CFDE_TxtEdtBufIter(); +private: + CFDE_TxtEdtBuf* m_pBuf; + FX_INT32 m_nCurChunk; + FX_INT32 m_nCurIndex; + FX_INT32 m_nIndex; + FX_BOOL m_bInField; +#ifdef FDE_USEFORMATBLOCK + FX_BOOL m_bForDisplay; + FX_INT32 m_nAliasCount; +#endif + FX_WCHAR m_Alias; +}; +class CFDE_TxtEdtBuf : public IFDE_TxtEdtBuf, public CFX_Object +{ + friend class CFDE_TxtEdtBufIter; + struct _FDE_CHUNKHEADER : public CFX_Object { + FX_INT32 nUsed; + FX_WCHAR wChars[1]; + }; + typedef _FDE_CHUNKHEADER FDE_CHUNKHEADER; + typedef _FDE_CHUNKHEADER* FDE_LPCHUNKHEADER; + struct _FDE_CHUNKPLACE : public CFX_Object { + FX_INT32 nChunkIndex; + FX_INT32 nCharIndex; + }; + typedef _FDE_CHUNKPLACE FDE_CHUNKPLACE; + typedef _FDE_CHUNKPLACE* FDE_LPCHUNKPLACE; + +public: + CFDE_TxtEdtBuf(FX_INT32 nDefChunkSize = FDE_DEFCHUNKLENGTH); + + virtual void Release(); + virtual FX_BOOL SetChunkSize(FX_INT32 nChunkSize); + virtual FX_INT32 GetChunkSize() const; + virtual FX_INT32 GetTextLength() const; + virtual void SetText(const CFX_WideString &wsText); + virtual void GetText(CFX_WideString &wsText) const; + virtual FX_WCHAR GetCharByIndex(FX_INT32 nIndex) const; + virtual void GetRange(CFX_WideString &wsText, FX_INT32 nBegine, FX_INT32 nCount = -1) const; + + virtual void Insert(FX_INT32 nPos, FX_LPCWSTR lpText, FX_INT32 nLength = 1); + virtual void Delete(FX_INT32 nIndex, FX_INT32 nLength = 1); + virtual void Clear(FX_BOOL bRelease = TRUE); + + virtual FX_BOOL Optimize(IFX_Pause * pPause = NULL); + +protected: + virtual ~CFDE_TxtEdtBuf(); +private: + void ResetChunkBuffer(FX_INT32 nDefChunkCount, FX_INT32 nChunkSize); + FX_INT32 CP2Index(const FDE_CHUNKPLACE & cp) const; + void Index2CP(FX_INT32 nIndex, FDE_CHUNKPLACE & cp) const; + + FX_INT32 m_nChunkSize; + + FX_INT32 m_nTotal; + FX_BOOL m_bChanged; + CFX_PtrArray m_Chunks; + IFX_MEMAllocator * m_pAllocator; +}; +#endif diff --git a/xfa/src/fee/src/fee/fde_txtedtengine.cpp b/xfa/src/fee/src/fee/fde_txtedtengine.cpp new file mode 100644 index 0000000000..2dbd1384cb --- /dev/null +++ b/xfa/src/fee/src/fee/fde_txtedtengine.cpp @@ -0,0 +1,2871 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../../include/ifde_txtedtengine.h" +#include "../../include/ifde_txtedtbuf.h" +#include "../../include/ifde_txtedtpage.h" +#include "fde_txtedtengine.h" +#include "fde_txtedtparag.h" +#include "fde_txtedtkmpmatch.h" +#include "fde_txtedtbuf.h" +#ifdef FDE_USEFORMATBLOCK +#include "fde_txtedtblock.h" +#endif +#define FDE_PAGEWIDTH_MAX 0xFFFF +#define FDE_TXTPLATESIZE (1024 * 12) +#define FDE_UNICODE_PARAGRAPH_SPERATOR (0x2029) +#define FDE_TXTEDT_DORECORD_INS 0 +#define FDE_TXTEDT_DORECORD_DEL 1 +#ifdef FDE_USEFORMATBLOCK +#define FDE_TXTEDT_DORECORD_FORMATINS 3 +#define FDE_TXTEDT_DORECORD_FORMATDEL 4 +#define FDE_TXTEDT_DORECORD_FORMATREP 5 +#define FDE_TXTEDT_FORMATBLOCK_BGN 0xFFF9 +#define FDE_TXTEDT_FORMATBLOCK_END 0xFFFB +#endif +IFDE_TxtEdtEngine * IFDE_TxtEdtEngine::Create() +{ + return FX_NEW CFDE_TxtEdtEngine(); +} +CFDE_TxtEdtEngine::CFDE_TxtEdtEngine() + : m_nPageLineCount(20) + , m_nLineCount(0) + , m_nAnchorPos(-1) + , m_nLayoutPos(0) + , m_fCaretPosReserve(0.0) + , m_nCaret(0) + , m_bBefore(TRUE) + , m_nCaretPage(0) + , m_bLock(FALSE) + , m_nLimit(0) + , m_wcAliasChar(L'*') + , m_pTextBreak(NULL) +#ifdef FDE_USEFORMATBLOCK + , m_nFixLength(-1) +#endif + , m_dwFindFlags(0) + , m_nFirstLineEnd(FDE_TXTEDIT_LINEEND_Auto) + , m_wLineEnd(FDE_UNICODE_PARAGRAPH_SPERATOR) + , m_bAutoLineEnd(TRUE) +{ + FXSYS_memset(&m_rtCaret, 0, sizeof(CFX_RectF)); + m_pTxtBuf = FX_NEW CFDE_TxtEdtBuf(); + m_bAutoLineEnd = (m_Param.nLineEnd == FDE_TXTEDIT_LINEEND_Auto); +} +CFDE_TxtEdtEngine::~CFDE_TxtEdtEngine() +{ + if (m_pTxtBuf) { + m_pTxtBuf->Release(); + m_pTxtBuf = NULL; + } + if (m_pTextBreak) { + m_pTextBreak->Release(); + m_pTextBreak = NULL; + } +#ifdef FDE_USEFORMATBLOCK + FX_INT32 nBlockCount = m_BlockArray.GetSize(); + if (nBlockCount > 0) { + FX_INT32 i = 0; + for (; i < nBlockCount; i ++) { + CFDE_TxtEdtBlock * pBlock = m_BlockArray[i]; + delete pBlock; + } + m_BlockArray.RemoveAll(); + } +#endif + RemoveAllParags(); + RemoveAllPages(); + m_Param.pEventSink = NULL; + ClearSelection(); +} +void CFDE_TxtEdtEngine::Release() +{ + delete this; +} +void CFDE_TxtEdtEngine::SetEditParams(const FDE_TXTEDTPARAMS ¶ms) +{ + if (m_pTextBreak == NULL) { + m_pTextBreak = IFX_TxtBreak::Create(FX_TXTBREAKPOLICY_None); + } + FXSYS_memcpy(&m_Param, ¶ms, sizeof(FDE_TXTEDTPARAMS)); + m_wLineEnd = params.wLineBreakChar; + m_bAutoLineEnd = (m_Param.nLineEnd == FDE_TXTEDIT_LINEEND_Auto); + UpdateTxtBreak(); +} +const FDE_TXTEDTPARAMS * CFDE_TxtEdtEngine::GetEditParams() const +{ + return &m_Param; +} +FX_INT32 CFDE_TxtEdtEngine::CountPages() const +{ + if (m_nLineCount == 0) { + return 0; + } + return ((m_nLineCount - 1) / m_nPageLineCount) + 1; +} +IFDE_TxtEdtPage * CFDE_TxtEdtEngine::GetPage(FX_INT32 nIndex) +{ + if (m_PagePtrArray.GetSize() <= nIndex) { + return NULL; + } + return (IFDE_TxtEdtPage*)m_PagePtrArray[nIndex]; +} +FX_BOOL CFDE_TxtEdtEngine::SetBufChunkSize(FX_INT32 nChunkSize) +{ + return m_pTxtBuf->SetChunkSize(nChunkSize); +} +void CFDE_TxtEdtEngine::SetTextByStream(IFX_Stream *pStream) +{ + ResetEngine(); + FX_INT32 nIndex = 0; + if (pStream != NULL && pStream->GetLength()) { + FX_INT32 nStreamLength = pStream->GetLength(); + FX_BOOL bValid = TRUE; + if (m_nLimit > 0 && nStreamLength > m_nLimit) { + bValid = FALSE; + } + FX_BOOL bPreIsCR = FALSE; + if (bValid) { + FX_BYTE bom[4]; + FX_INT32 nPos = pStream->GetBOM(bom); + pStream->Seek(FX_STREAMSEEK_Begin, nPos); + FX_INT32 bEos = FALSE; + FX_INT32 nPlateSize = FX_MIN(nStreamLength, m_pTxtBuf->GetChunkSize()); + FX_LPWSTR lpwstr = (FX_LPWSTR)FDE_Alloc(nPlateSize * sizeof(FX_WCHAR)); + FXSYS_assert(lpwstr); + FX_INT32 nRead = 0; + while (!bEos) { + nRead = pStream->ReadString(lpwstr, nPlateSize, bEos); + bPreIsCR = ReplaceParagEnd(lpwstr, nRead, bPreIsCR); + m_pTxtBuf->Insert(nIndex, lpwstr, nRead); + nIndex += nRead; + } + FDE_Free(lpwstr); + } + } + m_pTxtBuf->Insert(nIndex, &m_wLineEnd, 1); + RebuildParagraphs(); +} +void CFDE_TxtEdtEngine::SetText(const CFX_WideString &wsText) +{ + ResetEngine(); + FX_INT32 nLength = wsText.GetLength(); + if (nLength > 0) { + CFX_WideString wsTemp; + FX_LPWSTR lpBuffer = wsTemp.GetBuffer(nLength); + FXSYS_memcpy(lpBuffer, FX_LPCWSTR(wsText), nLength * sizeof(FX_WCHAR)); + ReplaceParagEnd(lpBuffer, nLength, FALSE); + wsTemp.ReleaseBuffer(nLength); + if (m_nLimit > 0 && nLength > m_nLimit) { + wsTemp.Delete(m_nLimit, nLength - m_nLimit); + nLength = m_nLimit; + } + m_pTxtBuf->SetText(wsTemp); + } + m_pTxtBuf->Insert(nLength, &m_wLineEnd, 1); + RebuildParagraphs(); +} +FX_INT32 CFDE_TxtEdtEngine::GetTextLength() const +{ + return GetTextBufLength(); +} +void CFDE_TxtEdtEngine::GetText(CFX_WideString &wsText, FX_INT32 nStart, FX_INT32 nCount ) +{ + FX_INT32 nTextBufLength = GetTextBufLength(); + if (nCount == -1) { + nCount = nTextBufLength - nStart; + } +#ifdef FDE_USEFORMATBLOCK + FX_INT32 nBlockCount = m_BlockArray.GetSize(); + if (nBlockCount == 0 || m_wsFixText.IsEmpty()) { + m_pTxtBuf->GetRange(wsText, nStart, nCount); + return; + } + CFX_WideString wsTemp; + FX_LPCWSTR lpFixBuffer = FX_LPCWSTR(m_wsFixText); + FX_LPWSTR lpBuffer = wsTemp.GetBuffer(nTextBufLength); + FX_INT32 nRealLength = 0; + FX_INT32 nPrePos = 0; + for (FX_INT32 i = 0; i < nBlockCount; i ++) { + CFDE_TxtEdtBlock *pBlock = m_BlockArray[i]; + FX_INT32 nPos = pBlock->GetPos(); + FX_INT32 nCopyLength = nPos - nPrePos; + FXSYS_memcpy(lpBuffer + nRealLength, lpFixBuffer + nPrePos, nCopyLength * sizeof(FX_WCHAR)); + nRealLength += nCopyLength; + nPrePos = nPos; + CFX_WideString wsBlock; + pBlock->GetRealText(wsBlock); + nCopyLength = wsBlock.GetLength(); + FXSYS_memcpy(lpBuffer + nRealLength, FX_LPCWSTR(wsBlock), nCopyLength * sizeof(FX_WCHAR)); + nRealLength += nCopyLength; + } + FX_INT32 nLeftLength = m_wsFixText.GetLength() - nPrePos; + if (nLeftLength > 0) { + FXSYS_memcpy(lpBuffer + nRealLength, lpFixBuffer + nPrePos, nLeftLength * sizeof(FX_WCHAR)); + nRealLength += nLeftLength; + } + wsTemp.ReleaseBuffer(nRealLength); + FX_INT32 nRealBgn = GetRealIndex(nStart); + FX_INT32 nRealEnd = GetRealIndex(nStart + nCount - 1); + FX_INT32 nRealCount = nRealEnd - nRealBgn; + FX_LPWSTR lpDestBuf = wsText.GetBuffer(nRealCount); + FXSYS_memcpy(lpDestBuf, FX_LPCWSTR(wsTemp) + nRealBgn, nRealCount * sizeof(FX_WCHAR)); + wsText.ReleaseBuffer(); +#else + m_pTxtBuf->GetRange(wsText, nStart, nCount); + RecoverParagEnd(wsText); + return; +#endif +} +void CFDE_TxtEdtEngine::ClearText() +{ + DeleteRange(0, -1); +} +FX_INT32 CFDE_TxtEdtEngine::GetCaretRect(CFX_RectF &rtCaret) const +{ + rtCaret = m_rtCaret; + return m_nCaret; +} +FX_INT32 CFDE_TxtEdtEngine::GetCaretPos() const +{ + if (IsLocked()) { + return 0; + } + return m_nCaret + (m_bBefore ? 0 : 1); +} +FX_INT32 CFDE_TxtEdtEngine::SetCaretPos(FX_INT32 nIndex, FX_BOOL bBefore) +{ + if (IsLocked()) { + return 0; + } + FXSYS_assert(nIndex >= 0 && nIndex <= GetTextBufLength()); + if (m_PagePtrArray.GetSize() <= m_nCaretPage) { + return 0; + } +#ifdef FDE_USEFORMATBLOCK + if (m_BlockArray.GetSize() > 0) { + nIndex = NormalizeCaretPos(nIndex, FDE_FORMAT_CARET_MIDDLE, bBefore); + } +#endif + m_bBefore = bBefore; + m_nCaret = nIndex; + MovePage2Char(m_nCaret); + GetCaretRect(m_rtCaret, m_nCaretPage, m_nCaret, m_bBefore); + if (!m_bBefore) { + m_nCaret ++; + m_bBefore = TRUE; + } + m_fCaretPosReserve = (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) ? \ + m_rtCaret.top : m_rtCaret.left; + m_Param.pEventSink->On_CaretChanged(this, m_nCaretPage, 0); + m_nAnchorPos = -1; + return m_nCaret; +} +FX_INT32 CFDE_TxtEdtEngine::MoveCaretPos(FDE_TXTEDTMOVECARET eMoveCaret, + FX_BOOL bShift , + FX_BOOL bCtrl ) +{ + if (IsLocked()) { + return 0; + } + if (m_PagePtrArray.GetSize() <= m_nCaretPage) { + return 0; + } + FX_BOOL bSelChange = FALSE; + if (IsSelect()) { + ClearSelection(); + bSelChange = TRUE; + } + if (bShift) { + if (m_nAnchorPos == -1) { + m_nAnchorPos = m_nCaret; + } + } else { + m_nAnchorPos = -1; + } + FX_BOOL bVertical = m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical; + FX_INT32 nCaret = m_nCaret; + FX_INT32 nCaretPage = m_nCaretPage; + switch (eMoveCaret) { + case MC_Left: { + if (bVertical) { + CFX_PointF ptCaret; + if (MoveUp(ptCaret)) { + UpdateCaretIndex(ptCaret); + } + } else { + FX_BOOL bBefore = TRUE; + FX_INT32 nIndex = MoveBackward(bBefore); +#ifdef FDE_USEFORMATBLOCK + if (m_BlockArray.GetSize()) { + nIndex = NormalizeCaretPos(nIndex, FDE_FORMAT_CARET_BACKWARD, bBefore); + if (nIndex < 0) { + return m_nCaret; + } + } +#endif + if (nIndex >= 0) { + UpdateCaretRect(nIndex, bBefore); + } + } + } + break; + case MC_Right: { + if (bVertical) { + CFX_PointF ptCaret; + if (MoveDown(ptCaret)) { + UpdateCaretIndex(ptCaret); + } + } else { + FX_BOOL bBefore = TRUE; + FX_INT32 nIndex = MoveForward(bBefore); +#ifdef FDE_USEFORMATBLOCK + if (m_BlockArray.GetSize()) { + if (nIndex == -1) { + nIndex = GetTextBufLength(); + } + nIndex = NormalizeCaretPos(nIndex, FDE_FORMAT_CARET_FORWARD, bBefore); + } +#endif + if (nIndex >= 0) { + UpdateCaretRect(nIndex, bBefore); + } + } + } + break; + case MC_Up: { + if (bVertical) { + FX_BOOL bBefore = TRUE; + FX_INT32 nIndex = MoveBackward(bBefore); +#ifdef FDE_USEFORMATBLOCK + if (m_BlockArray.GetSize()) { + nIndex = NormalizeCaretPos(nIndex, FDE_FORMAT_CARET_BACKWARD, bBefore); + } +#endif + if (nIndex >= 0) { + UpdateCaretRect(nIndex, bBefore); + } + } else { + CFX_PointF ptCaret; + if (MoveUp(ptCaret)) { + UpdateCaretIndex(ptCaret); + } + } + } + break; + case MC_Down: { + if (bVertical) { + FX_BOOL bBefore = TRUE; + FX_INT32 nIndex = MoveForward(bBefore); +#ifdef FDE_USEFORMATBLOCK + if (m_BlockArray.GetSize()) { + nIndex = NormalizeCaretPos(nIndex, FDE_FORMAT_CARET_FORWARD, bBefore); + } +#endif + if (nIndex >= 0) { + UpdateCaretRect(nIndex, bBefore); + } + } else { + CFX_PointF ptCaret; + if (MoveDown(ptCaret)) { + UpdateCaretIndex(ptCaret); + } + } + } + break; + case MC_WordBackward: + break; + case MC_WordForward: + break; + case MC_LineStart: + MoveLineStart(); + break; + case MC_LineEnd: + MoveLineEnd(); + break; + case MC_ParagStart: + MoveParagStart(); + break; + case MC_ParagEnd: + MoveParagEnd(); + break; + case MC_PageDown: + break; + case MC_PageUp: + break; + case MC_Home: + MoveHome(); + break; + case MC_End: + MoveEnd(); + break; + default: + break; + } + if (bShift && m_nAnchorPos != -1 && (m_nAnchorPos != m_nCaret)) { + AddSelRange(FX_MIN(m_nAnchorPos, m_nCaret), FXSYS_abs(m_nAnchorPos - m_nCaret)); + m_Param.pEventSink->On_SelChanged(this); + } + if (bSelChange) { + m_Param.pEventSink->On_SelChanged(this); + } + return m_nCaret; +} +void CFDE_TxtEdtEngine::Lock() +{ + m_bLock = TRUE; +} +void CFDE_TxtEdtEngine::Unlock() +{ + m_bLock = FALSE; +} +FX_BOOL CFDE_TxtEdtEngine::IsLocked() const +{ + return m_bLock; +} +FX_INT32 CFDE_TxtEdtEngine::Insert(FX_INT32 nStart, FX_LPCWSTR lpText, FX_INT32 nLength) +{ + if (IsLocked()) { + return FDE_TXTEDT_MODIFY_RET_F_Locked; + } +#ifdef FDE_USEFORMATBLOCK + FX_INT32 nBlockCount = m_BlockArray.GetSize(); + if (nBlockCount) { + if (m_Param.dwMode & FDE_TEXTEDITMODE_FIELD_TAB && nLength == 1 && lpText[0] == L'\t') { + return Move2NextEditableField(nStart) ? FDE_TXTEDT_MODIFY_RET_T_Tab : \ + FDE_TXTEDT_MODIFY_RET_F_Tab; + } + FX_INT32 nSelRangeCount = CountSelRanges(); + if (nSelRangeCount > 0) { + if (nSelRangeCount > 1) { + return FDE_TXTEDT_MODIFY_RET_F_Boundary; + } + FX_INT32 nSelStart; + FX_INT32 nSelCount; + nSelCount = GetSelRange(0, nSelStart); + FX_INT32 nSelEnd = nSelStart + nSelCount; + FX_INT32 nBgn = 0; + FX_INT32 nEnd = 0; + CFDE_TxtEdtField * pField = NULL; + FX_BOOL bInField = GetFieldBoundary(nSelStart, nBgn, nEnd, pField); + if (nSelEnd > nEnd) { + return FDE_TXTEDT_MODIFY_RET_F_Boundary; + } + if (bInField) { + pField->Backup(); + FX_BOOL bBefore = FALSE; + CFX_WideString wsDel; + FX_INT32 nCaret; + FX_INT32 nIndexInField = nSelStart - nBgn; + FX_INT32 nRet = pField->Replace(nSelStart - nBgn, nSelCount, CFX_WideStringC(lpText, nLength), wsDel, nCaret, bBefore); + switch(nRet) { + case FDE_FORMAT_FIELD_INSERT_RET_F_FULL: + pField->Restore(); + return FDE_TXTEDT_MODIFY_RET_F_Full; + case FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE: + pField->Restore(); + return FDE_TXTEDT_MODIFY_RET_F_Invalidate; + default: + break; + } + CFX_WideString wsField; + pField->GetFieldText(wsField); + if (!m_Param.pEventSink->On_ValidateField(this, pField->GetBlockIndex(), pField->GetIndex(), wsField, 0)) { + pField->Restore(); + return FDE_TXTEDT_MODIFY_RET_F_Invalidate; + } + CFX_WideString wsDisplay; + pField->GetDisplayText(wsDisplay); + if ((m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Vert) || (m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Horz)) { + CFX_WideString wsText; + GetPreReplaceText(wsText, nBgn, nEnd - nBgn + 1, FX_LPCWSTR(wsDisplay), wsDisplay.GetLength()); + if (!IsFitArea(wsText)) { + pField->Restore(); + return FDE_TXTEDT_MODIFY_RET_F_Full; + } + } + Replace(nBgn, nEnd - nBgn + 1, wsDisplay); + FX_INT32 nNewCaret = nBgn + nCaret; + if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) { + IFDE_TxtEdtDoRecord * pRecord = FX_NEW CFDE_TxtEdtDoRecord_FieldReplace(this, \ + m_nCaret, nNewCaret, pField, nIndexInField, nBgn, wsDisplay.GetLength(), \ + wsDel, CFX_WideStringC(lpText, nLength), TRUE); + CFX_ByteString bsDoRecord; + pRecord->Serialize(bsDoRecord); + m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord); + pRecord->Release(); + } + SetCaretPos(nBgn + nCaret, bBefore); + return FDE_TXTEDT_MODIFY_RET_S_Normal; + } + } + FX_INT32 nBgn = 0; + FX_INT32 nEnd = 0; + CFDE_TxtEdtField * pField = NULL; + FX_BOOL bInField = GetFieldBoundary(m_nCaret, nBgn, nEnd, pField); + FX_INT32 nCaretInField = m_nCaret - nBgn; + FX_BOOL bBefore = FALSE; + if (bInField) { + pField->Backup(); + CFX_WideStringC wsIns(lpText, nLength); + FX_INT32 nRet = pField->Insert(nCaretInField, wsIns, nCaretInField, bBefore); + FX_BOOL bFull = FALSE; + switch (nRet) { + case FDE_FORMAT_FIELD_INSERT_RET_S_NORMAL: + break; + case FDE_FORMAT_FIELD_INSERT_RET_S_FULL: + bFull = TRUE; + break; + case FDE_FORMAT_FIELD_INSERT_RET_F_FULL: + return FDE_TXTEDT_MODIFY_RET_F_Full; + case FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE: + return FDE_TXTEDT_MODIFY_RET_F_Invalidate; + default: + return FDE_TXTEDT_MODIFY_RET_F_Normal; + } + CFX_WideString wsField; + pField->GetFieldText(wsField); + if (!m_Param.pEventSink->On_ValidateField(this, pField->GetBlockIndex(), pField->GetIndex(), wsField, 0)) { + pField->Restore(); + return FDE_TXTEDT_MODIFY_RET_F_Invalidate; + } + CFX_WideString wsDisplay; + pField->GetDisplayText(wsDisplay); + if ((m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Vert) || (m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Horz)) { + CFX_WideString wsText; + GetPreReplaceText(wsText, nBgn, nEnd - nBgn + 1, FX_LPCWSTR(wsDisplay), wsDisplay.GetLength()); + if (!IsFitArea(wsText)) { + pField->Restore(); + return FDE_TXTEDT_MODIFY_RET_F_Full; + } + } + Replace(nBgn, nEnd - nBgn + 1, wsDisplay); + if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) { + IFDE_TxtEdtDoRecord * pRecord = FX_NEW CFDE_TxtEdtDoRecord_FieldInsert(this, \ + m_nCaret, pField, m_nCaret - nBgn, nBgn, \ + nEnd - nBgn + 1, wsDisplay.GetLength(), \ + CFX_WideStringC(lpText, nLength), FALSE); + CFX_ByteString bsDoRecord; + pRecord->Serialize(bsDoRecord); + m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord); + pRecord->Release(); + } + FX_INT32 nCaretPos = nBgn + nCaretInField; + if (m_Param.dwMode & FDE_TEXTEDITMODE_FIELD_AUTO && bFull && nCaretPos == nEnd) { + if (Move2NextEditableField(nEnd, TRUE, FALSE)) { + return TRUE; + } + } + SetCaretPos(nCaretPos, bBefore); + return bFull ? FDE_TXTEDT_MODIFY_RET_S_Full : FDE_TXTEDT_MODIFY_RET_S_Normal; + } + FXSYS_assert(0); + return FDE_TXTEDT_MODIFY_RET_F_Normal; + } +#endif + CFX_WideString wsTemp; + FX_LPWSTR lpBuffer = wsTemp.GetBuffer(nLength); + FXSYS_memcpy(lpBuffer, lpText, nLength * sizeof(FX_WCHAR)); + ReplaceParagEnd(lpBuffer, nLength, FALSE); + wsTemp.ReleaseBuffer(nLength); + FX_BOOL bPart = FALSE; + if (m_nLimit > 0) { + FX_INT32 nTotalLength = GetTextBufLength(); + FX_INT32 nDelLength = 0; + FX_INT32 nCount = m_SelRangePtrArr.GetSize(); + for (FX_INT32 i = 0; i < nCount; i ++) { + FDE_LPTXTEDTSELRANGE lpSelRange = m_SelRangePtrArr.GetAt(i); + nTotalLength -= lpSelRange->nCount; + } + FX_INT32 nExpectLength = nTotalLength + nLength; + if (nTotalLength == m_nLimit) { + return FDE_TXTEDT_MODIFY_RET_F_Full; + } + if (nExpectLength > m_nLimit) { + nLength -= (nExpectLength - m_nLimit); + bPart = TRUE; + } + } + if ((m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Vert) || (m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Horz)) { + FX_INT32 nTemp = nLength; + if (m_Param.dwMode & FDE_TEXTEDITMODE_Password) { + CFX_WideString wsText; + while (nLength > 0) { + GetPreInsertText(wsText, m_nCaret, lpBuffer, nLength); + FX_INT32 nTotal = wsText.GetLength(); + FX_LPWSTR lpBuf = wsText.GetBuffer(nTotal); + for (FX_INT32 i = 0; i < nTotal; i ++) { + lpBuf[i] = m_wcAliasChar; + } + wsText.ReleaseBuffer(nTotal); + if (IsFitArea(wsText)) { + break; + } + nLength --; + } + } else { + CFX_WideString wsText; + while (nLength > 0) { + GetPreInsertText(wsText, m_nCaret, lpBuffer, nLength); + if (IsFitArea(wsText)) { + break; + } + nLength --; + } + } + if (nLength == 0) { + return FDE_TXTEDT_MODIFY_RET_F_Full; + } + if (nLength < nTemp) { + bPart = TRUE; + } + } + if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) { + CFX_WideString wsText; + GetPreInsertText(wsText, m_nCaret, lpBuffer, nLength); + if (!m_Param.pEventSink->On_Validate(this, wsText)) { + return FDE_TXTEDT_MODIFY_RET_F_Invalidate; + } + } + if (IsSelect()) { + DeleteSelect(); + } + if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) { + IFDE_TxtEdtDoRecord * pRecord = FX_NEW CFDE_TxtEdtDoRecord_Insert(this, m_nCaret, lpBuffer, nLength); + CFX_ByteString bsDoRecord; + pRecord->Serialize(bsDoRecord); + m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord); + pRecord->Release(); + } + GetText(m_ChangeInfo.wsPrevText, 0); + Inner_Insert(m_nCaret, lpBuffer, nLength); + m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert; + m_ChangeInfo.wsInsert = CFX_WideString(lpBuffer, nLength); + nStart = m_nCaret; + nStart += nLength; + FX_WCHAR wChar = m_pTxtBuf->GetCharByIndex(nStart - 1); + FX_BOOL bBefore = TRUE; + if (wChar != L'\n' && wChar != L'\r') { + nStart --; + bBefore = FALSE; + } + SetCaretPos(nStart, bBefore); + m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo); + return bPart ? FDE_TXTEDT_MODIFY_RET_S_Part : FDE_TXTEDT_MODIFY_RET_S_Normal; +} +FX_INT32 CFDE_TxtEdtEngine::Delete(FX_INT32 nStart, FX_BOOL bBackspace ) +{ + if (IsLocked()) { + return FDE_TXTEDT_MODIFY_RET_F_Locked; + } + if (IsSelect()) { + DeleteSelect(); + return FDE_TXTEDT_MODIFY_RET_S_Normal; + } +#ifdef FDE_USEFORMATBLOCK + FX_INT32 nBlockCount = m_BlockArray.GetSize(); + if (nBlockCount > 0) { + if (bBackspace) { + nStart --; + } + FX_INT32 nCount = 1; + FX_INT32 nBgn = 0; + FX_INT32 nEnd = 0; + CFDE_TxtEdtField * pField = NULL; + FX_BOOL bInField = GetFieldBoundary(nStart, nBgn, nEnd, pField); + FX_INT32 nCaretInField = nStart - nBgn; + FX_BOOL bBefore = FALSE; + if (bInField && !pField->IsFix()) { + pField->Backup(); + CFX_WideString wsDel; + FX_INT32 nCaret = 0; + FX_INT32 nRet = pField->Delete(nCaretInField, nCount, wsDel, nCaret, bBefore); + nCaret += nBgn; + switch (nRet) { + case FDE_FORMAT_FIELD_DELETE_RET_S: + break; + case FDE_FORMAT_FIELD_DELETE_RET_F_INVALIDATE: + return FDE_TXTEDT_MODIFY_RET_F_Invalidate; + case FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY: + return FDE_TXTEDT_MODIFY_RET_F_Boundary; + default: + FXSYS_assert(0); + break; + } + CFX_WideString wsField; + pField->GetFieldText(wsField); + if (!m_Param.pEventSink->On_ValidateField(this, pField->GetBlockIndex(), pField->GetIndex(), wsField, 0)) { + pField->Restore(); + return FDE_TXTEDT_MODIFY_RET_F_Invalidate; + } + CFX_WideString wsDisplay; + pField->GetDisplayText(wsDisplay); + Replace(nBgn, nEnd - nBgn + 1, wsDisplay); + if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) { + IFDE_TxtEdtDoRecord * pRecord = FX_NEW CFDE_TxtEdtDoRecord_FieldDelete(this, nStart, pField, nCaretInField, + nBgn, nEnd - nBgn + 1, wsDisplay.GetLength(), wsDel, FALSE); + CFX_ByteString bsDoRecord; + pRecord->Serialize(bsDoRecord); + m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord); + pRecord->Release(); + } + SetCaretPos(nStart, bBefore); + return FDE_TXTEDT_MODIFY_RET_S_Normal; + } + return FDE_TXTEDT_MODIFY_RET_F_Boundary; + } +#endif + FX_INT32 nCount = 1; + if (bBackspace) { + if (nStart == 0) { + return FDE_TXTEDT_MODIFY_RET_F_Boundary; + } + if (nStart > 2 && m_pTxtBuf->GetCharByIndex(nStart - 1) == L'\n' && \ + m_pTxtBuf->GetCharByIndex(nStart - 2) == L'\r') { + nStart --; + nCount ++; + } + nStart --; + } else { + if (nStart == GetTextBufLength()) { + return FDE_TXTEDT_MODIFY_RET_F_Full; + } + if ((nStart + 1 < GetTextBufLength()) && (m_pTxtBuf->GetCharByIndex(nStart) == L'\r') && \ + (m_pTxtBuf->GetCharByIndex(nStart + 1) == L'\n')) { + nCount ++; + } + } + if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) { + CFX_WideString wsText; + GetPreDeleteText(wsText, nStart, nCount); + if (!m_Param.pEventSink->On_Validate(this, wsText)) { + return FDE_TXTEDT_MODIFY_RET_F_Invalidate; + } + } + if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) { + CFX_WideString wsRange; + m_pTxtBuf->GetRange(wsRange, nStart, nCount); + IFDE_TxtEdtDoRecord * pRecord = FX_NEW CFDE_TxtEdtDoRecord_DeleteRange(this, nStart, m_nCaret, wsRange); + CFX_ByteString bsDoRecord; + pRecord->Serialize(bsDoRecord); + m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord); + pRecord->Release(); + } + m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Delete; + GetText(m_ChangeInfo.wsDelete, nStart, nCount); + Inner_DeleteRange(nStart, nCount); + SetCaretPos(nStart + ((!bBackspace && nStart > 0) ? -1 : 0), (bBackspace || nStart == 0)); + m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo); + return FDE_TXTEDT_MODIFY_RET_S_Normal; +} +FX_INT32 CFDE_TxtEdtEngine::DeleteRange(FX_INT32 nStart, FX_INT32 nCount ) +{ + if (IsLocked()) { + return FDE_TXTEDT_MODIFY_RET_F_Locked; + } + if (nCount == -1) { + nCount = GetTextBufLength(); + } + if (nCount == 0) { + return FDE_TXTEDT_MODIFY_RET_S_Normal; + } + if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) { + CFX_WideString wsText; + GetPreDeleteText(wsText, nStart, nCount); + if (!m_Param.pEventSink->On_Validate(this, wsText)) { + return FDE_TXTEDT_MODIFY_RET_F_Invalidate; + } + } + DeleteRange_DoRecord(nStart, nCount); + m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo); + SetCaretPos(nStart, TRUE); + return FDE_TXTEDT_MODIFY_RET_S_Normal; +} +FX_INT32 CFDE_TxtEdtEngine::Replace(FX_INT32 nStart, FX_INT32 nLength, const CFX_WideString &wsReplace) +{ + if (IsLocked()) { + return FDE_TXTEDT_MODIFY_RET_F_Locked; + } + if (nStart < 0 || (nStart + nLength > GetTextBufLength())) { + return FDE_TXTEDT_MODIFY_RET_F_Boundary; + } + if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) { + CFX_WideString wsText; + GetPreReplaceText(wsText, nStart, nLength, FX_LPCWSTR(wsReplace), wsReplace.GetLength()); + if (!m_Param.pEventSink->On_Validate(this, wsText)) { + return FDE_TXTEDT_MODIFY_RET_F_Invalidate; + } + } + if (IsSelect()) { + ClearSelection(); + } + m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Replace; + GetText(m_ChangeInfo.wsDelete, nStart, nLength); + if (nLength > 0) { + Inner_DeleteRange(nStart, nLength); + } + FX_INT32 nTextLength = wsReplace.GetLength(); + if (nTextLength > 0) { + Inner_Insert(nStart, FX_LPCWSTR(wsReplace), nTextLength); + } + m_ChangeInfo.wsInsert = CFX_WideString(FX_LPCWSTR(wsReplace), nTextLength); + nStart += nTextLength; + FX_WCHAR wChar = m_pTxtBuf->GetCharByIndex(nStart - 1); + FX_BOOL bBefore = TRUE; + if (wChar != L'\n' && wChar != L'\r') { + nStart --; + bBefore = FALSE; + } + SetCaretPos(nStart, bBefore); + m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0); + m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0); + m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo); + return FDE_TXTEDT_MODIFY_RET_S_Normal; +} +void CFDE_TxtEdtEngine::SetLimit(FX_INT32 nLimit) +{ + m_nLimit = nLimit; +} +void CFDE_TxtEdtEngine::SetAliasChar(FX_WCHAR wcAlias) +{ + m_wcAliasChar = wcAlias; +} +void CFDE_TxtEdtEngine::SetFormatBlock(FX_INT32 nIndex, const CFX_WideString &wsBlockFormat) +{ +#ifdef FDE_USEFORMATBLOCK + if (m_nFixLength == -1) { + m_nFixLength = GetTextLength(); + FXSYS_assert(m_wsFixText.IsEmpty()); + GetText(m_wsFixText, 0, -1); + } + FX_BOOL bInBlock = FALSE; + FX_INT32 nCharIndex = 0; + FX_INT32 nBlockIndex = 0; + FX_INT32 nBlockPos = -1; + FX_WCHAR wc; + CFDE_TxtEdtBufIter * pIter = FX_NEW CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)m_pTxtBuf, FALSE); + pIter->SetAt(0); + do { + wc = pIter->GetChar(); + if (bInBlock) { + if (wc == FDE_TXTEDT_FORMATBLOCK_END) { + nBlockIndex ++; + bInBlock = FALSE; + } + } else { + if (wc == FDE_TXTEDT_FORMATBLOCK_BGN) { + bInBlock = TRUE; + } else { + if (nCharIndex ++ == nIndex) { + nBlockPos = pIter->GetAt(); + break; + } + } + } + } while (pIter->Next()); + pIter->Release(); + if (nBlockPos == -1) { + nBlockPos = GetTextBufLength(); + } + CFDE_TxtEdtBlock * pEditBlock = FX_NEW CFDE_TxtEdtBlock(this, wsBlockFormat, nIndex); + m_BlockArray.InsertAt(m_BlockArray.GetSize(), pEditBlock); + CFX_WideString wsDisplay; + pEditBlock->GetDisplayText(wsDisplay); + m_nCaret = nBlockPos; + if (wsDisplay.GetLength() > 0) { + RawInsert(nBlockPos, FX_LPCWSTR(wsDisplay), wsDisplay.GetLength()); + } +#endif +} +FX_INT32 CFDE_TxtEdtEngine::CountEditBlocks() const +{ +#ifdef FDE_USEFORMATBLOCK + return m_BlockArray.GetSize(); +#else + return 0; +#endif +} +void CFDE_TxtEdtEngine::GetEditBlockText(FX_INT32 nIndex, CFX_WideString &wsBlockText) const +{ +#ifdef FDE_USEFORMATBLOCK + CFDE_TxtEdtBlock * pBlock = m_BlockArray[nIndex]; + pBlock->GetBlockText(wsBlockText); +#endif +} +FX_INT32 CFDE_TxtEdtEngine::CountEditFields(FX_INT32 nBlockIndex) const +{ +#ifdef FDE_USEFORMATBLOCK + CFDE_TxtEdtBlock * pBlock = m_BlockArray[nBlockIndex]; + return pBlock->CountField(); +#else + return 0; +#endif +} +void CFDE_TxtEdtEngine::GetEditFieldText(FX_INT32 nBlockIndex, FX_INT32 nFieldIndex, CFX_WideString &wsFieldText) const +{ +#ifdef FDE_USEFORMATBLOCK + CFDE_TxtEdtBlock * pBlock = m_BlockArray[nBlockIndex]; + pBlock->GetFieldText(nFieldIndex, wsFieldText); +#endif +} +void CFDE_TxtEdtEngine::StartEdit() +{ +#ifdef FDE_USEFORMATBLOCK +#endif +} +void CFDE_TxtEdtEngine::EndEdit() +{ +#ifdef FDE_USEFORMATBLOCK +#endif +} +void CFDE_TxtEdtEngine::RemoveSelRange(FX_INT32 nStart, FX_INT32 nCount ) +{ + FDE_LPTXTEDTSELRANGE lpTemp = NULL; + FX_INT32 nRangeCount = m_SelRangePtrArr.GetSize(); + FX_INT32 i = 0; + for (i = 0; i < nRangeCount; i ++) { + lpTemp = m_SelRangePtrArr[i]; + if (lpTemp->nStart == nStart && lpTemp->nCount == nCount) { + delete lpTemp; + m_SelRangePtrArr.RemoveAt(i); + return; + } + } + return; +} +void CFDE_TxtEdtEngine::AddSelRange(FX_INT32 nStart, FX_INT32 nCount ) +{ + if (nCount == -1) { + nCount = GetTextLength() - nStart; + } + FX_INT32 nSize = m_SelRangePtrArr.GetSize(); + if (nSize <= 0) { + FDE_LPTXTEDTSELRANGE lpSelRange = FX_NEW FDE_TXTEDTSELRANGE; + lpSelRange->nStart = nStart; + lpSelRange->nCount = nCount; + m_SelRangePtrArr.Add(lpSelRange); + m_Param.pEventSink->On_SelChanged(this); + return; + } + FDE_LPTXTEDTSELRANGE lpTemp = NULL; + lpTemp = m_SelRangePtrArr[nSize - 1]; + if (nStart >= lpTemp->nStart + lpTemp->nCount) { + FDE_LPTXTEDTSELRANGE lpSelRange = FX_NEW FDE_TXTEDTSELRANGE; + lpSelRange->nStart = nStart; + lpSelRange->nCount = nCount; + m_SelRangePtrArr.Add(lpSelRange); + m_Param.pEventSink->On_SelChanged(this); + return; + } + FX_INT32 nEnd = nStart + nCount - 1; + FX_BOOL bBegin = FALSE; + FX_INT32 nRangeBgn = 0; + FX_INT32 nRangeCnt = 0; + for (FX_INT32 i = 0; i < nSize; i ++) { + lpTemp = m_SelRangePtrArr[i]; + FX_INT32 nTempBgn = lpTemp->nStart; + FX_INT32 nTempEnd = nTempBgn + lpTemp->nCount - 1; + if (bBegin) { + if (nEnd < nTempBgn) { + break; + } else if (nStart >= nTempBgn && nStart <= nTempEnd) { + nRangeCnt ++; + break; + } + nRangeCnt ++; + } else { + if (nStart <= nTempEnd) { + nRangeBgn = i; + if (nEnd < nTempBgn) { + break; + } + nRangeCnt = 1; + bBegin = TRUE; + } + } + } + if (nRangeCnt == 0) { + FDE_LPTXTEDTSELRANGE lpSelRange = FX_NEW FDE_TXTEDTSELRANGE; + lpSelRange->nStart = nStart; + lpSelRange->nCount = nCount; + m_SelRangePtrArr.InsertAt(nRangeBgn, lpSelRange); + } else { + lpTemp = m_SelRangePtrArr[nRangeBgn]; + lpTemp->nStart = nStart; + lpTemp->nCount = nCount; + nRangeCnt --; + nRangeBgn ++; + while (nRangeCnt--) { + delete m_SelRangePtrArr[nRangeBgn]; + m_SelRangePtrArr.RemoveAt(nRangeBgn); + } + } + m_Param.pEventSink->On_SelChanged(this); + return; +} +FX_INT32 CFDE_TxtEdtEngine::CountSelRanges() +{ + return m_SelRangePtrArr.GetSize(); +} +FX_INT32 CFDE_TxtEdtEngine::GetSelRange(FX_INT32 nIndex, FX_INT32 &nStart) +{ + nStart = m_SelRangePtrArr[nIndex]->nStart; + return m_SelRangePtrArr[nIndex]->nCount; +} +void CFDE_TxtEdtEngine::ClearSelection() +{ + FX_INT32 nCount = m_SelRangePtrArr.GetSize(); + FDE_LPTXTEDTSELRANGE lpRange = NULL; + FX_INT32 i = 0; + for (i = 0; i < nCount; i ++) { + lpRange = m_SelRangePtrArr[i]; + if (lpRange != NULL) { + delete lpRange; + lpRange = NULL; + } + } + m_SelRangePtrArr.RemoveAll(); + if (nCount && m_Param.pEventSink) { + m_Param.pEventSink->On_SelChanged(this); + } +} +FX_BOOL CFDE_TxtEdtEngine::Redo(FX_BSTR bsRedo) +{ + if (IsLocked()) { + return FALSE; + } + if (m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo) { + return FALSE; + } + IFDE_TxtEdtDoRecord * pDoRecord = IFDE_TxtEdtDoRecord::Create(bsRedo); + FXSYS_assert(pDoRecord); + if (pDoRecord == NULL) { + return FALSE; + } + FX_BOOL bOK = pDoRecord->Redo(); + pDoRecord->Release(); + return bOK; +} +FX_BOOL CFDE_TxtEdtEngine::Undo(FX_BSTR bsUndo) +{ + if (IsLocked()) { + return FALSE; + } + if (m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo) { + return FALSE; + } + IFDE_TxtEdtDoRecord * pDoRecord = IFDE_TxtEdtDoRecord::Create(bsUndo); + FXSYS_assert(pDoRecord); + if (pDoRecord == NULL) { + return FALSE; + } + FX_BOOL bOK = pDoRecord->Undo(); + pDoRecord->Release(); + return bOK; +} +FX_INT32 CFDE_TxtEdtEngine::StartLayout() +{ + Lock(); + RemoveAllPages(); + m_nLayoutPos = 0; + m_nLineCount = 0; + return 0; +} +FX_INT32 CFDE_TxtEdtEngine::DoLayout(IFX_Pause * pPause) +{ + FX_INT32 nCount = m_ParagPtrArray.GetSize(); + CFDE_TxtEdtParag * pParag = NULL; + FX_INT32 nLineCount = 0; + for (; m_nLayoutPos < nCount; m_nLayoutPos ++) { + pParag = m_ParagPtrArray[m_nLayoutPos]; + pParag->CalcLines(); + nLineCount += pParag->m_nLineCount; + if ((pPause != NULL) && (nLineCount > m_nPageLineCount) && pPause->NeedToPauseNow()) { + m_nLineCount += nLineCount; + return (++m_nLayoutPos * 100) / nCount; + } + } + m_nLineCount += nLineCount; + return 100; +} +void CFDE_TxtEdtEngine::EndLayout() +{ + UpdatePages(); + FX_INT32 nLength = GetTextLength(); + if (m_nCaret > nLength) { + m_nCaret = nLength; + } + FX_INT32 nIndex = m_nCaret; + if (!m_bBefore) { + nIndex --; + } + m_rtCaret.Set(0, 0, 1, m_Param.fFontSize); + Unlock(); +} +FX_BOOL CFDE_TxtEdtEngine::Optimize(IFX_Pause * pPause ) +{ + return m_pTxtBuf->Optimize(pPause); +} +IFDE_TxtEdtBuf * CFDE_TxtEdtEngine::GetTextBuf() const +{ + return (IFDE_TxtEdtBuf*)m_pTxtBuf; +} +FX_INT32 CFDE_TxtEdtEngine::GetTextBufLength() const +{ + return m_pTxtBuf->GetTextLength() - 1; +} +IFX_TxtBreak * CFDE_TxtEdtEngine::GetTextBreak() const +{ + return m_pTextBreak; +} +FX_INT32 CFDE_TxtEdtEngine::GetLineCount() const +{ + return m_nLineCount; +} +FX_INT32 CFDE_TxtEdtEngine::GetPageLineCount() const +{ + return m_nPageLineCount; +} +FX_INT32 CFDE_TxtEdtEngine::CountParags() const +{ + return m_ParagPtrArray.GetSize(); +} +IFDE_TxtEdtParag* CFDE_TxtEdtEngine::GetParag(FX_INT32 nParagIndex) const +{ + return m_ParagPtrArray[nParagIndex]; +} +IFX_CharIter* CFDE_TxtEdtEngine::CreateCharIter() +{ + if (!m_pTxtBuf) { + return NULL; + } + return FX_NEW CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)m_pTxtBuf); +} +FX_INT32 CFDE_TxtEdtEngine::Line2Parag(FX_INT32 nStartParag, FX_INT32 nStartLineofParag, \ + FX_INT32 nLineIndex, FX_INT32 &nStartLine) const +{ + FX_INT32 nLineTotal = nStartLineofParag; + FX_INT32 nCount = m_ParagPtrArray.GetSize(); + CFDE_TxtEdtParag * pParag = NULL; + FX_INT32 i = nStartParag; + for (; i < nCount; i ++) { + pParag = m_ParagPtrArray[i]; + nLineTotal += pParag->m_nLineCount; + if (nLineTotal > nLineIndex) { + break; + } + } + nStartLine = nLineTotal - pParag->m_nLineCount; + return i; +} +void CFDE_TxtEdtEngine::GetPreDeleteText(CFX_WideString &wsText, FX_INT32 nIndex, FX_INT32 nLength) +{ + GetText(wsText, 0, GetTextBufLength()); + wsText.Delete(nIndex, nLength); +} +void CFDE_TxtEdtEngine::GetPreInsertText(CFX_WideString &wsText, FX_INT32 nIndex, FX_LPCWSTR lpText, FX_INT32 nLength) +{ + GetText(wsText, 0, GetTextBufLength()); + FX_INT32 nSelIndex = 0; + FX_INT32 nSelLength = 0; + FX_INT32 nSelCount = CountSelRanges(); + while (nSelCount --) { + nSelLength = GetSelRange(nSelCount, nSelIndex); + wsText.Delete(nSelIndex, nSelLength); + nIndex = nSelIndex; + } + CFX_WideString wsTemp; + FX_INT32 nOldLength = wsText.GetLength(); + FX_LPCWSTR pOldBuffer = FX_LPCWSTR(wsText); + FX_LPWSTR lpBuffer = wsTemp.GetBuffer(nOldLength + nLength); + FXSYS_memcpy(lpBuffer, pOldBuffer, (nIndex) * sizeof(FX_WCHAR)); + FXSYS_memcpy(lpBuffer + nIndex, lpText, nLength * sizeof(FX_WCHAR)); + FXSYS_memcpy(lpBuffer + nIndex + nLength, pOldBuffer + nIndex, (nOldLength - nIndex) * sizeof(FX_WCHAR)); + wsTemp.ReleaseBuffer(nOldLength + nLength); + wsText = wsTemp; +} +void CFDE_TxtEdtEngine::GetPreReplaceText(CFX_WideString &wsText, FX_INT32 nIndex, FX_INT32 nOriginLength, FX_LPCWSTR lpText, FX_INT32 nLength) +{ + GetText(wsText, 0, GetTextBufLength()); + FX_INT32 nSelIndex = 0; + FX_INT32 nSelLength = 0; + FX_INT32 nSelCount = CountSelRanges(); + while (nSelCount --) { + nSelLength = GetSelRange(nSelCount, nSelIndex); + wsText.Delete(nSelIndex, nSelLength); + } + wsText.Delete(nIndex, nOriginLength); + FX_INT32 i = 0; + for (i = 0; i < nLength; i ++) { + wsText.Insert(nIndex ++, lpText[i]); + } +} +void CFDE_TxtEdtEngine::Inner_Insert(FX_INT32 nStart, FX_LPCWSTR lpText, FX_INT32 nLength) +{ + FXSYS_assert(nLength > 0); + FDE_TXTEDTPARAGPOS ParagPos; + TextPos2ParagPos(nStart, ParagPos); + m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0); + FX_INT32 nParagCount = m_ParagPtrArray.GetSize(); + FX_INT32 i = 0; + for (i = ParagPos.nParagIndex + 1; i < nParagCount; i ++) { + m_ParagPtrArray[i]->m_nCharStart += nLength; + } + CFDE_TxtEdtParag * pParag = m_ParagPtrArray[ParagPos.nParagIndex]; + FX_INT32 nReserveLineCount = pParag->m_nLineCount; + FX_INT32 nReserveCharStart = pParag->m_nCharStart; + FX_INT32 nLeavePart = ParagPos.nCharIndex; + FX_INT32 nCutPart = pParag->m_nCharCount - ParagPos.nCharIndex; + FX_INT32 nTextStart = 0; + FX_WCHAR wCurChar = L' '; + FX_LPCWSTR lpPos = lpText; + FX_BOOL bFirst = TRUE; + FX_INT32 nParagIndex = ParagPos.nParagIndex; + for (i = 0; i < nLength; i ++, lpPos ++) { + wCurChar = *lpPos; + if (wCurChar == m_wLineEnd) { + if (bFirst) { + pParag->m_nCharCount = nLeavePart + (i - nTextStart + 1); + pParag->m_nLineCount = -1; + nReserveCharStart += pParag->m_nCharCount; + bFirst = FALSE; + } else { + pParag = FX_NEW CFDE_TxtEdtParag(this); + pParag->m_nLineCount = -1; + pParag->m_nCharCount = i - nTextStart + 1; + pParag->m_nCharStart = nReserveCharStart; + m_ParagPtrArray.InsertAt(++nParagIndex, pParag); + nReserveCharStart += pParag->m_nCharCount; + } + nTextStart = i + 1; + } + } + if (bFirst) { + pParag->m_nCharCount += nLength; + pParag->m_nLineCount = -1; + bFirst = FALSE; + } else { + pParag = FX_NEW CFDE_TxtEdtParag(this); + pParag->m_nLineCount = -1; + pParag->m_nCharCount = nLength - nTextStart + nCutPart; + pParag->m_nCharStart = nReserveCharStart; + m_ParagPtrArray.InsertAt(++nParagIndex, pParag); + } + m_pTxtBuf->Insert(nStart, lpText, nLength); + FX_INT32 nTotalLineCount = 0; + for (i = ParagPos.nParagIndex; i <= nParagIndex; i ++) { + pParag = m_ParagPtrArray[i]; + pParag->CalcLines(); + nTotalLineCount += pParag->m_nLineCount; + } + m_nLineCount += nTotalLineCount - nReserveLineCount; + m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0); + UpdatePages(); +} +#ifdef FDE_USEFORMATBLOCK +void CFDE_TxtEdtEngine::RawInsert(FX_INT32 nStart, FX_LPCWSTR lpText, FX_INT32 nLength) +{ + FXSYS_assert(nLength > 0); + FDE_TXTEDTPARAGPOS ParagPos; + TextPos2ParagPos(nStart, ParagPos); + FX_INT32 nParagCount = m_ParagPtrArray.GetSize(); + FX_INT32 i = 0; + for (i = ParagPos.nParagIndex + 1; i < nParagCount; i ++) { + m_ParagPtrArray[i]->m_nCharStart += nLength; + } + CFDE_TxtEdtParag * pParag = m_ParagPtrArray[ParagPos.nParagIndex]; + FX_INT32 nReserveLineCount = pParag->m_nLineCount; + FX_INT32 nReserveCharStart = pParag->m_nCharStart; + FX_INT32 nLeavePart = ParagPos.nCharIndex; + FX_INT32 nCutPart = pParag->m_nCharCount - ParagPos.nCharIndex; + FX_INT32 nTextStart = 0; + FX_WCHAR wCurChar = L' '; + FX_LPCWSTR lpPos = lpText; + FX_BOOL bFirst = TRUE; + FX_INT32 nParagIndex = ParagPos.nParagIndex; + for (i = 0; i < nLength; i ++, lpPos ++) { + wCurChar = *lpPos; + if (wCurChar == m_wLineEnd) { + if (bFirst) { + pParag->m_nCharCount = nLeavePart + (i - nTextStart + 1); + pParag->m_nLineCount = -1; + nReserveCharStart += pParag->m_nCharCount; + bFirst = FALSE; + } else { + pParag = FX_NEW CFDE_TxtEdtParag(this); + pParag->m_nLineCount = -1; + pParag->m_nCharCount = i - nTextStart + 1; + pParag->m_nCharStart = nReserveCharStart; + m_ParagPtrArray.InsertAt(++nParagIndex, pParag); + nReserveCharStart += pParag->m_nCharCount; + } + nTextStart = i + 1; + } + } + if (bFirst) { + pParag->m_nCharCount += nLength; + pParag->m_nLineCount = -1; + bFirst = FALSE; + } else { + pParag = FX_NEW CFDE_TxtEdtParag(this); + pParag->m_nLineCount = -1; + pParag->m_nCharCount = nLength - nTextStart + nCutPart; + pParag->m_nCharStart = nReserveCharStart; + m_ParagPtrArray.InsertAt(++nParagIndex, pParag); + } + m_pTxtBuf->Insert(nStart, lpText, nLength); +} +#endif +void CFDE_TxtEdtEngine::Inner_DeleteRange(FX_INT32 nStart, FX_INT32 nCount ) +{ + if (nCount == -1) { + nCount = m_pTxtBuf->GetTextLength() - nStart; + } + FX_INT32 nEnd = nStart + nCount - 1; + FXSYS_assert(nStart >= 0 && nEnd < m_pTxtBuf->GetTextLength()); + m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0); + FDE_TXTEDTPARAGPOS ParagPosBgn, ParagPosEnd; + TextPos2ParagPos(nStart, ParagPosBgn); + TextPos2ParagPos(nEnd, ParagPosEnd); + CFDE_TxtEdtParag * pParag = m_ParagPtrArray[ParagPosEnd.nParagIndex]; + FX_BOOL bLastParag = FALSE; + if (ParagPosEnd.nCharIndex == pParag->m_nCharCount - 1) { + if (ParagPosEnd.nParagIndex < m_ParagPtrArray.GetSize() - 1) { + ParagPosEnd.nParagIndex ++; + } else { + bLastParag = TRUE; + } + } + FX_INT32 nTotalLineCount = 0; + FX_INT32 nTotalCharCount = 0; + FX_INT32 i = 0; + for (i = ParagPosBgn.nParagIndex; i <= ParagPosEnd.nParagIndex; i ++) { + CFDE_TxtEdtParag * pParag = m_ParagPtrArray[i]; + pParag->CalcLines(); + nTotalLineCount += pParag->m_nLineCount; + nTotalCharCount += pParag->m_nCharCount; + } + m_pTxtBuf->Delete(nStart, nCount); + CFDE_TxtEdtParag * pEndParag = m_ParagPtrArray[ParagPosEnd.nParagIndex]; + FX_INT32 nNextParagIndex = (ParagPosBgn.nCharIndex == 0 && bLastParag) ? ParagPosBgn.nParagIndex : \ + (ParagPosBgn.nParagIndex + 1); + for (i = nNextParagIndex; i <= ParagPosEnd.nParagIndex; i ++) { + CFDE_TxtEdtParag * pParag = m_ParagPtrArray[nNextParagIndex]; + delete pParag; + m_ParagPtrArray.RemoveAt(nNextParagIndex); + } + if (!(bLastParag && ParagPosBgn.nCharIndex == 0)) { + pParag = m_ParagPtrArray[ParagPosBgn.nParagIndex]; + pParag->m_nCharCount = nTotalCharCount - nCount; + pParag->CalcLines(); + nTotalLineCount -= pParag->m_nLineCount; + } + FX_INT32 nParagCount = m_ParagPtrArray.GetSize(); + for (i = nNextParagIndex; i < nParagCount; i ++) { + m_ParagPtrArray[i]->m_nCharStart -= nCount; + } + m_nLineCount -= nTotalLineCount; + UpdatePages(); + FX_INT32 nPageCount = CountPages(); + if (m_nCaretPage >= nPageCount) { + m_nCaretPage = nPageCount - 1; + } + m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0); +} +void CFDE_TxtEdtEngine::DeleteRange_DoRecord(FX_INT32 nStart, FX_INT32 nCount, FX_BOOL bSel ) +{ + FXSYS_assert(nStart >= 0); + if (nCount == -1) { + nCount = GetTextLength() - nStart; + } + FXSYS_assert((nStart + nCount) <= m_pTxtBuf->GetTextLength()); +#ifdef FDE_USEFORMATBLOCK + FX_INT32 nBlockCount = m_BlockArray.GetSize(); + if (nBlockCount > 0) { + } +#endif + if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) { + CFX_WideString wsRange; + m_pTxtBuf->GetRange(wsRange, nStart, nCount); + IFDE_TxtEdtDoRecord * pRecord = FX_NEW CFDE_TxtEdtDoRecord_DeleteRange(this, nStart, m_nCaret, \ + wsRange, bSel); + CFX_ByteString bsDoRecord; + pRecord->Serialize(bsDoRecord); + m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord); + pRecord->Release(); + } + m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Delete; + GetText(m_ChangeInfo.wsDelete, nStart, nCount); + Inner_DeleteRange(nStart, nCount); +} +void CFDE_TxtEdtEngine::ResetEngine() +{ + RemoveAllPages(); + RemoveAllParags(); + ClearSelection(); + m_nCaret = 0; + m_pTxtBuf->Clear(FALSE); + m_nCaret = 0; +} +void CFDE_TxtEdtEngine::RebuildParagraphs() +{ + RemoveAllParags(); + FX_WCHAR wChar = L' '; + FX_WCHAR wCharPre = L' '; + FX_INT32 nParagStart = 0; + FX_INT32 nCount = m_pTxtBuf->GetTextLength(); + FX_INT32 nIndex = 0; + CFDE_TxtEdtParag * pParag = NULL; + IFX_CharIter * pIter = FX_NEW CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)m_pTxtBuf); + pIter->SetAt(0); + do { + wChar = pIter->GetChar(); + nIndex = pIter->GetAt(); + if (wChar == m_wLineEnd) { + CFDE_TxtEdtParag * pParag = FX_NEW CFDE_TxtEdtParag(this); + pParag->m_nCharStart = nParagStart; + pParag->m_nCharCount = nIndex - nParagStart + 1; + pParag->m_nLineCount = -1; + m_ParagPtrArray.Add(pParag); + nParagStart = nIndex + 1; + } + } while (pIter->Next()); + pIter->Release(); +} +void CFDE_TxtEdtEngine::RemoveAllParags() +{ + FX_INT32 nCount = m_ParagPtrArray.GetSize(); + FX_INT32 i = 0; + for (i = 0; i < nCount; i ++) { + CFDE_TxtEdtParag * pParag = m_ParagPtrArray[i]; + if (pParag) { + delete pParag; + } + } + m_ParagPtrArray.RemoveAll(); +} +void CFDE_TxtEdtEngine::RemoveAllPages() +{ + FX_INT32 nCount = m_PagePtrArray.GetSize(); + FX_INT32 i = 0; + for (i = 0; i < nCount; i ++) { + IFDE_TxtEdtPage * pPage = m_PagePtrArray[i]; + if (pPage) { + pPage->Release(); + } + } + m_PagePtrArray.RemoveAll(); +} +void CFDE_TxtEdtEngine::UpdateParags() +{ + FX_INT32 nCount = m_ParagPtrArray.GetSize(); + if (nCount == 0) { + return; + } + CFDE_TxtEdtParag * pParag = NULL; + FX_INT32 nLineCount = 0; + FX_INT32 i = 0; + for (i = 0; i < nCount; i ++) { + pParag = m_ParagPtrArray[i]; + if (pParag->m_nLineCount == -1) { + pParag->CalcLines(); + } + nLineCount += pParag->m_nLineCount; + } + m_nLineCount = nLineCount; +} +void CFDE_TxtEdtEngine::UpdatePages() +{ + if (m_nLineCount == 0) { + return; + } + FX_INT32 nPageCount = (m_nLineCount - 1) / (m_nPageLineCount) + 1; + FX_INT32 nSize = m_PagePtrArray.GetSize(); + if (nSize == nPageCount) { + return; + } + if (nSize > nPageCount) { + IFDE_TxtEdtPage * pPage = NULL; + FX_INT32 i = 0; + for (i = nSize - 1; i >= nPageCount; i --) { + pPage = m_PagePtrArray[i]; + if (pPage) { + pPage->Release(); + } + m_PagePtrArray.RemoveAt(i); + } + m_Param.pEventSink->On_PageCountChanged(this); + return; + } + if (nSize < nPageCount) { + IFDE_TxtEdtPage * pPage = NULL; + FX_INT32 i = 0; + for (i = nSize; i < nPageCount; i ++) { + pPage = IFDE_TxtEdtPage::Create(this, i); + m_PagePtrArray.Add(pPage); + } + m_Param.pEventSink->On_PageCountChanged(this); + return; + } +} +void CFDE_TxtEdtEngine::UpdateTxtBreak() +{ + FX_DWORD dwStyle = m_pTextBreak->GetLayoutStyles(); + if (m_Param.dwMode & FDE_TEXTEDITMODE_MultiLines) { + dwStyle &= ~FX_TXTLAYOUTSTYLE_SingleLine; + } else { + dwStyle |= FX_TXTLAYOUTSTYLE_SingleLine; + } + if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) { + dwStyle |= FX_TXTLAYOUTSTYLE_VerticalLayout; + } else { + dwStyle &= ~FX_TXTLAYOUTSTYLE_VerticalLayout; + } + if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_LineReserve) { + dwStyle |= FX_TXTLAYOUTSTYLE_ReverseLine; + } else { + dwStyle &= ~FX_TXTLAYOUTSTYLE_ReverseLine; + } + if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_RTL) { + dwStyle |= FX_TXTLAYOUTSTYLE_RTLReadingOrder; + } else { + dwStyle &= ~FX_TXTLAYOUTSTYLE_RTLReadingOrder; + } + if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_CombText) { + dwStyle |= FX_TXTLAYOUTSTYLE_CombText; + } else { + dwStyle &= ~FX_TXTLAYOUTSTYLE_CombText; + } + if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_CharVertial) { + dwStyle |= FX_TXTLAYOUTSTYLE_VerticalChars; + } else { + dwStyle &= ~FX_TXTLAYOUTSTYLE_VerticalChars; + } + if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_ExpandTab) { + dwStyle |= FX_TXTLAYOUTSTYLE_ExpandTab; + } else { + dwStyle &= ~ FX_TXTLAYOUTSTYLE_ExpandTab; + } + if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_ArabicContext) { + dwStyle |= FX_TXTLAYOUTSTYLE_ArabicContext; + } else { + dwStyle &= ~FX_TXTLAYOUTSTYLE_ArabicContext; + } + if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_ArabicShapes) { + dwStyle |= FX_TXTLAYOUTSTYLE_ArabicShapes; + } else { + dwStyle &= ~FX_TXTLAYOUTSTYLE_ArabicShapes; + } + m_pTextBreak->SetLayoutStyles(dwStyle); + FX_DWORD dwAligment = 0; + if (m_Param.dwAlignment & FDE_TEXTEDITALIGN_Justified) { + dwAligment |= FX_TXTLINEALIGNMENT_Justified; + } else if (m_Param.dwAlignment & FDE_TEXTEDITALIGN_Distributed) { + dwAligment |= FX_TXTLINEALIGNMENT_Distributed; + } + if (m_Param.dwAlignment & FDE_TEXTEDITALIGN_Center) { + dwAligment |= FX_TXTLINEALIGNMENT_Center; + } else if(m_Param.dwAlignment & FDE_TEXTEDITALIGN_Right) { + dwAligment |= FX_TXTLINEALIGNMENT_Right; + } + m_pTextBreak->SetAlignment(dwAligment); + if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) { + if (m_Param.dwMode & FDE_TEXTEDITMODE_AutoLineWrap) { + m_pTextBreak->SetLineWidth(m_Param.fPlateHeight); + } else { + m_pTextBreak->SetLineWidth(FDE_PAGEWIDTH_MAX); + } + } else { + if (m_Param.dwMode & FDE_TEXTEDITMODE_AutoLineWrap) { + m_pTextBreak->SetLineWidth(m_Param.fPlateWidth); + } else { + m_pTextBreak->SetLineWidth(FDE_PAGEWIDTH_MAX); + } + } + m_nPageLineCount = m_Param.nLineCount; + if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_CombText) { + FX_FLOAT fCombWidth = m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical ? + m_Param.fPlateHeight : m_Param.fPlateWidth; + if (m_nLimit > 0) { + fCombWidth /= m_nLimit; + } + m_pTextBreak->SetCombWidth(fCombWidth); + } + m_pTextBreak->SetFont(m_Param.pFont); + m_pTextBreak->SetFontSize(m_Param.fFontSize); + m_pTextBreak->SetTabWidth(m_Param.fTabWidth, m_Param.bTabEquidistant); + m_pTextBreak->SetDefaultChar(m_Param.wDefChar); + m_pTextBreak->SetParagraphBreakChar(m_Param.wLineBreakChar); + m_pTextBreak->SetCharRotation(m_Param.nCharRotation); + m_pTextBreak->SetLineBreakTolerance(m_Param.fFontSize * 0.2f); + m_pTextBreak->SetHorizontalScale(m_Param.nHorzScale); + m_pTextBreak->SetCharSpace(m_Param.fCharSpace); +} +FX_BOOL CFDE_TxtEdtEngine::ReplaceParagEnd(FX_LPWSTR &lpText, FX_INT32 &nLength, FX_BOOL bPreIsCR ) +{ + for (FX_INT32 i = 0; i < nLength; i ++) { + FX_WCHAR wc = lpText[i]; + switch(wc) { + case L'\r': { + lpText[i] = m_wLineEnd; + bPreIsCR = TRUE; + } + break; + case L'\n': { + if (bPreIsCR == TRUE) { + FX_INT32 nNext = i + 1; + if (nNext < nLength) { + FXSYS_memmove(lpText + i, lpText + nNext, (nLength - nNext) * sizeof(FX_WCHAR)); + } + i --; + nLength --; + bPreIsCR = FALSE; + if (m_bAutoLineEnd) { + m_nFirstLineEnd = FDE_TXTEDIT_LINEEND_CRLF; + m_bAutoLineEnd = FALSE; + } + } else { + lpText[i] = m_wLineEnd; + if (m_bAutoLineEnd) { + m_nFirstLineEnd = FDE_TXTEDIT_LINEEND_LF; + m_bAutoLineEnd = FALSE; + } + } + } + break; + default: { + if (bPreIsCR && m_bAutoLineEnd) { + m_nFirstLineEnd = FDE_TXTEDIT_LINEEND_CR; + m_bAutoLineEnd = FALSE; + } + bPreIsCR = FALSE; + } + break; + } + } + return bPreIsCR; +} +void CFDE_TxtEdtEngine::RecoverParagEnd(CFX_WideString &wsText) +{ + FX_WCHAR wc = (m_nFirstLineEnd == FDE_TXTEDIT_LINEEND_CR) ? L'\n' : L'\r'; + if (m_nFirstLineEnd == FDE_TXTEDIT_LINEEND_CRLF) { + CFX_ArrayTemplate PosArr; + FX_INT32 nLength = wsText.GetLength(); + FX_INT32 i = 0; + FX_LPWSTR lpPos = (FX_LPWSTR)(FX_LPCWSTR)wsText; + for (i = 0; i < nLength; i ++, lpPos ++) { + if (*lpPos == m_wLineEnd) { + *lpPos = wc; + PosArr.Add(i); + } + } + FX_LPCWSTR lpSrcBuf = FX_LPCWSTR(wsText); + CFX_WideString wsTemp; + FX_INT32 nCount = PosArr.GetSize(); + FX_LPWSTR lpDstBuf = wsTemp.GetBuffer(nLength + nCount); + FX_INT32 nDstPos = 0; + FX_INT32 nSrcPos = 0; + for (i = 0; i < nCount; i ++) { + FX_INT32 nPos = PosArr[i]; + FX_INT32 nCopyLen = nPos - nSrcPos + 1; + FXSYS_memcpy(lpDstBuf + nDstPos, lpSrcBuf + nSrcPos, nCopyLen * sizeof(FX_WCHAR)); + nDstPos += nCopyLen; + nSrcPos += nCopyLen; + lpDstBuf[nDstPos] = L'\n'; + nDstPos ++; + } + if (nSrcPos < nLength) { + FXSYS_memcpy(lpDstBuf + nDstPos, lpSrcBuf + nSrcPos, (nLength - nSrcPos) * sizeof(FX_WCHAR)); + } + wsTemp.ReleaseBuffer(nLength + nCount); + wsText = wsTemp; + } else { + FX_INT32 nLength = wsText.GetLength(); + FX_LPWSTR lpBuf = (FX_LPWSTR)(FX_LPCWSTR)wsText; + for (FX_INT32 i = 0; i < nLength; i ++, lpBuf++) { + if (*lpBuf == m_wLineEnd) { + *lpBuf = wc; + } + } + } +} +FX_INT32 CFDE_TxtEdtEngine::MovePage2Char(FX_INT32 nIndex) +{ + FXSYS_assert(nIndex >= 0); + FXSYS_assert(nIndex <= m_pTxtBuf->GetTextLength()); + if (m_nCaretPage >= 0) { + IFDE_TxtEdtPage* pPage = m_PagePtrArray[m_nCaretPage]; + m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0); + FX_INT32 nPageCharStart = pPage->GetCharStart(); + FX_INT32 nPageCharCount = pPage->GetCharCount(); + if (nIndex >= nPageCharStart && nIndex < nPageCharStart + nPageCharCount) { + m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0); + return m_nCaretPage; + } + m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0); + } + CFDE_TxtEdtParag * pParag = NULL; + FX_INT32 nLineCount = 0; + FX_INT32 nParagCount = m_ParagPtrArray.GetSize(); + FX_INT32 i = 0; + for (i = 0; i < nParagCount; i ++) { + pParag = m_ParagPtrArray[i]; + if (pParag->m_nCharStart <= nIndex && nIndex < (pParag->m_nCharStart + pParag->m_nCharCount)) { + break; + } + nLineCount += pParag->m_nLineCount; + } + pParag->LoadParag(); + FX_INT32 nLineStart = -1; + FX_INT32 nLineCharCount = -1; + for (i = 0; i < pParag->m_nLineCount; i ++) { + pParag->GetLineRange(i, nLineStart, nLineCharCount); + if (nLineStart <= nIndex && nIndex < (nLineStart + nLineCharCount)) { + break; + } + } + FXSYS_assert(i < pParag->m_nLineCount); + nLineCount += (i + 1); + m_nCaretPage = (nLineCount - 1) / m_nPageLineCount + 1 - 1; + m_Param.pEventSink->On_PageChange(this, m_nCaretPage); + pParag->UnloadParag(); + return m_nCaretPage; +} +void CFDE_TxtEdtEngine::TextPos2ParagPos(FX_INT32 nIndex, FDE_TXTEDTPARAGPOS &ParagPos) const +{ + FXSYS_assert(nIndex >= 0 && nIndex < m_pTxtBuf->GetTextLength()); + FX_INT32 nCount = m_ParagPtrArray.GetSize(); + FX_INT32 nBgn = 0; + FX_INT32 nMid = 0; + FX_INT32 nEnd = nCount - 1; + while (nEnd > nBgn) { + nMid = (nBgn + nEnd) / 2; + CFDE_TxtEdtParag * pParag = m_ParagPtrArray[nMid]; + if (nIndex < pParag->m_nCharStart) { + nEnd = nMid - 1; + } else if (nIndex >= (pParag->m_nCharStart + pParag->m_nCharCount)) { + nBgn = nMid + 1; + } else { + break; + } + } + if (nBgn == nEnd) { + nMid = nBgn; + } + FXSYS_assert(nIndex >= m_ParagPtrArray[nMid]->m_nCharStart && \ + (nIndex < m_ParagPtrArray[nMid]->m_nCharStart + m_ParagPtrArray[nMid]->m_nCharCount)); + ParagPos.nParagIndex = nMid; + ParagPos.nCharIndex = nIndex - m_ParagPtrArray[nMid]->m_nCharStart; +} +FX_INT32 CFDE_TxtEdtEngine::MoveForward(FX_BOOL &bBefore) +{ + if (m_nCaret == m_pTxtBuf->GetTextLength() - 1) { + return -1; + } + FX_INT32 nCaret = m_nCaret; + if ((nCaret + 1 < m_pTxtBuf->GetTextLength()) && (m_pTxtBuf->GetCharByIndex(nCaret) == L'\r') && \ + (m_pTxtBuf->GetCharByIndex(nCaret + 1) == L'\n')) { + nCaret ++; + } + nCaret ++; + bBefore = TRUE; + return nCaret; +} +FX_INT32 CFDE_TxtEdtEngine::MoveBackward(FX_BOOL &bBefore) +{ + if (m_nCaret == 0) { + return FALSE; + } + FX_INT32 nCaret = m_nCaret; + if (nCaret > 2 && m_pTxtBuf->GetCharByIndex(nCaret - 1) == L'\n' && \ + m_pTxtBuf->GetCharByIndex(nCaret - 2) == L'\r') { + nCaret --; + } + nCaret --; + bBefore = TRUE; + return nCaret; +} +FX_BOOL CFDE_TxtEdtEngine::MoveUp(CFX_PointF &ptCaret) +{ + IFDE_TxtEdtPage * pPage = GetPage(m_nCaretPage); + const CFX_RectF& rtContent = pPage->GetContentsBox(); + if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) { + ptCaret.x = m_rtCaret.left + m_rtCaret.width / 2 - m_Param.fLineSpace; + ptCaret.y = m_fCaretPosReserve; + FX_BOOL bLineReserve = m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_LineReserve; + if (ptCaret.x < rtContent.left) { + if (bLineReserve) { + if (m_nCaretPage == CountPages() - 1) { + return FALSE; + } + } else { + if (m_nCaretPage == 0) { + return FALSE; + } + } + if (bLineReserve) { + m_nCaretPage ++; + } else { + m_nCaretPage --; + } + m_Param.pEventSink->On_PageChange(this, m_nCaretPage); + ptCaret.x -= rtContent.left; + IFDE_TxtEdtPage * pCurPage = GetPage(m_nCaretPage); + ptCaret.x += pCurPage->GetContentsBox().right(); + } + } else { + ptCaret.x = m_fCaretPosReserve; + ptCaret.y = m_rtCaret.top + m_rtCaret.height / 2 - m_Param.fLineSpace; + if (ptCaret.y < rtContent.top) { + if (m_nCaretPage == 0) { + return FALSE; + } + ptCaret.y -= rtContent.top; + m_nCaretPage --; + m_Param.pEventSink->On_PageChange(this, m_nCaretPage); + IFDE_TxtEdtPage * pCurPage = GetPage(m_nCaretPage); + ptCaret.y += pCurPage->GetContentsBox().bottom(); + } + } + return TRUE; +} +FX_BOOL CFDE_TxtEdtEngine::MoveDown(CFX_PointF &ptCaret) +{ + IFDE_TxtEdtPage * pPage = GetPage(m_nCaretPage); + const CFX_RectF& rtContent = pPage->GetContentsBox(); + if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) { + ptCaret.x = m_rtCaret.left + m_rtCaret.width / 2 + m_Param.fLineSpace; + ptCaret.y = m_fCaretPosReserve; + if (ptCaret.x >= rtContent.right()) { + FX_BOOL bLineReserve = m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_LineReserve; + if (bLineReserve) { + if (m_nCaretPage == 0) { + return FALSE; + } + } else { + if (m_nCaretPage == CountPages() - 1) { + return FALSE; + } + } + if (bLineReserve) { + m_nCaretPage --; + } else { + m_nCaretPage ++; + } + m_Param.pEventSink->On_PageChange(this, m_nCaretPage); + ptCaret.x -= rtContent.right(); + IFDE_TxtEdtPage * pCurPage = GetPage(m_nCaretPage); + ptCaret.x += pCurPage->GetContentsBox().left; + } + } else { + ptCaret.x = m_fCaretPosReserve; + ptCaret.y = m_rtCaret.top + m_rtCaret.height / 2 + m_Param.fLineSpace; + if (ptCaret.y >= rtContent.bottom()) { + if (m_nCaretPage == CountPages() - 1) { + return FALSE; + } + ptCaret.y -= rtContent.bottom(); + m_nCaretPage ++; + m_Param.pEventSink->On_PageChange(this, m_nCaretPage); + IFDE_TxtEdtPage * pCurPage = GetPage(m_nCaretPage); + ptCaret.y += pCurPage->GetContentsBox().top; + } + } + return TRUE; +} +FX_BOOL CFDE_TxtEdtEngine::MoveLineStart() +{ + FX_INT32 nIndex = m_bBefore ? m_nCaret : m_nCaret - 1; + FDE_TXTEDTPARAGPOS ParagPos; + TextPos2ParagPos(nIndex, ParagPos); + CFDE_TxtEdtParag * pParag = m_ParagPtrArray[ParagPos.nParagIndex]; + pParag->LoadParag(); + FX_INT32 nLineCount = pParag->m_nLineCount; + FX_INT32 i = 0; + FX_INT32 nStart = 0; + FX_INT32 nCount = 0; + for (; i < nLineCount; i ++) { + pParag->GetLineRange(i, nStart, nCount); + if (nIndex >= nStart && nIndex < nStart + nCount) { + break; + } + } + UpdateCaretRect(nStart, TRUE); + pParag->UnloadParag(); + return TRUE; +} +FX_BOOL CFDE_TxtEdtEngine::MoveLineEnd() +{ + FX_INT32 nIndex = m_bBefore ? m_nCaret : m_nCaret - 1; + FDE_TXTEDTPARAGPOS ParagPos; + TextPos2ParagPos(nIndex, ParagPos); + CFDE_TxtEdtParag * pParag = m_ParagPtrArray[ParagPos.nParagIndex]; + pParag->LoadParag(); + FX_INT32 nLineCount = pParag->m_nLineCount; + FX_INT32 i = 0; + FX_INT32 nStart = 0; + FX_INT32 nCount = 0; + for (; i < nLineCount; i ++) { + pParag->GetLineRange(i, nStart, nCount); + if (nIndex >= nStart && nIndex < nStart + nCount) { + break; + } + } + nIndex = nStart + nCount - 1; + FXSYS_assert(nIndex <= GetTextBufLength()); + FX_WCHAR wChar = m_pTxtBuf->GetCharByIndex(nIndex); + FX_BOOL bBefore = FALSE; + if (nIndex <= GetTextBufLength()) { + if (wChar == L'\r') { + bBefore = TRUE; + } else if (wChar == L'\n' && nIndex > nStart) { + bBefore = TRUE; + nIndex --; + wChar = m_pTxtBuf->GetCharByIndex(nIndex); + if (wChar != L'\r') { + nIndex ++; + } + } + } + UpdateCaretRect(nIndex, bBefore); + pParag->UnloadParag(); + return TRUE; +} +FX_BOOL CFDE_TxtEdtEngine::MoveParagStart() +{ + FX_INT32 nIndex = m_bBefore ? m_nCaret : m_nCaret - 1; + FDE_TXTEDTPARAGPOS ParagPos; + TextPos2ParagPos(nIndex, ParagPos); + CFDE_TxtEdtParag * pParag = m_ParagPtrArray[ParagPos.nParagIndex]; + UpdateCaretRect(pParag->m_nCharStart, TRUE); + return TRUE; +} +FX_BOOL CFDE_TxtEdtEngine::MoveParagEnd() +{ + FX_INT32 nIndex = m_bBefore ? m_nCaret : m_nCaret - 1; + FDE_TXTEDTPARAGPOS ParagPos; + TextPos2ParagPos(nIndex, ParagPos); + CFDE_TxtEdtParag * pParag = m_ParagPtrArray[ParagPos.nParagIndex]; + nIndex = pParag->m_nCharStart + pParag->m_nCharCount - 1; + FX_WCHAR wChar = m_pTxtBuf->GetCharByIndex(nIndex); + if (wChar == L'\n' && nIndex > 0) { + nIndex --; + wChar = m_pTxtBuf->GetCharByIndex(nIndex); + if (wChar != L'\r') { + nIndex ++; + } + } + UpdateCaretRect(nIndex, TRUE); + return TRUE; +} +FX_BOOL CFDE_TxtEdtEngine::MoveHome() +{ + UpdateCaretRect(0, TRUE); + return TRUE; +} +FX_BOOL CFDE_TxtEdtEngine::MoveEnd() +{ + UpdateCaretRect(GetTextBufLength(), TRUE); + return TRUE; +} +#ifdef FDE_USEFORMATBLOCK +FX_INT32 CFDE_TxtEdtEngine::NormalizeCaretPos(FX_INT32 nIndex, FX_INT32 nFlags, FX_BOOL &bBefore) +{ + bBefore = TRUE; + FX_INT32 nBgn = 0, nEnd = 0; + FX_INT32 nRecord = -1; + CFDE_TxtEdtField * pField = NULL; + FX_BOOL bRet = GetFieldBoundary(nIndex, nBgn, nEnd, pField); + FX_INT32 nDelta = 0; + if (bRet && !pField->IsFix()) { + if (nIndex - nBgn < FDE_FORMAT_EDIT_FIELD_HADERSIZE) { + if (nFlags == FDE_FORMAT_CARET_BACKWARD) { + CFDE_TxtEdtField * pEditableField = NULL; + if (FindEditableField(nIndex, nBgn, nEnd, pEditableField, FALSE)) { + return pEditableField->NormalizeCaretPos(nEnd - nBgn, FDE_FORMAT_CARET_BACKWARD) + nBgn; + } + } + nIndex = nBgn + FDE_FORMAT_EDIT_FIELD_HADERSIZE; + } + FX_INT32 nRet = pField->NormalizeCaretPos(nIndex - nBgn, (FDE_FORMAT_CARET_DIRECTION)nFlags); + if (nRet >= 0) { + return nRet + nBgn; + } + if (nRet == -2) { + FX_INT32 nEditablePosBgn = 0, nEditablePosEnd = 0; + pField->GetEditableRange(nEditablePosBgn, nEditablePosEnd); + nRecord = nBgn + nEditablePosBgn; + nFlags = FDE_FORMAT_CARET_BACKWARD; + } else { + FXSYS_assert(nRet == -1); + FX_INT32 nEditablePosBgn = 0, nEditablePosEnd = 0; + pField->GetEditableRange(nEditablePosBgn, nEditablePosEnd); + nRecord = nBgn + nEditablePosEnd; + nFlags = FDE_FORMAT_CARET_FORWARD; + } + } else if (!bRet) { + nDelta = FDE_FORMAT_EDIT_FIELD_HADERSIZE - FDE_FORMAT_EDIT_FIELD_TAILSIZE; + } + switch (nFlags) { + case FDE_FORMAT_CARET_FORWARD: { + if (FindEditableField(nIndex, nBgn, nEnd, pField)) { + return pField->NormalizeCaretPos(FDE_FORMAT_EDIT_FIELD_HADERSIZE, FDE_FORMAT_CARET_FORWARD) + nBgn; + } else { + if (nRecord != -1) { + return nRecord; + } + bRet = FindEditableField(nIndex, nBgn, nEnd, pField, FALSE); + FXSYS_assert(bRet); + return pField->NormalizeCaretPos(nEnd - nBgn, FDE_FORMAT_CARET_BACKWARD) + nBgn; + } + } + break; + case FDE_FORMAT_CARET_MIDDLE: { + FX_INT32 nBgn1 = 0, nEnd1 = 0, nBgn2 = 0, nEnd2 = 0; + CFDE_TxtEdtField * pEditableField1 = NULL; + CFDE_TxtEdtField * pEditableField2 = NULL; + FX_BOOL bRet1 = FindEditableField(nIndex, nBgn1, nEnd1, pEditableField1, FALSE); + FX_BOOL bRet2 = FindEditableField(nIndex, nBgn2, nEnd2, pEditableField2); + if (bRet1 == FALSE) { + FXSYS_assert(bRet2); + return pEditableField2->NormalizeCaretPos(FDE_FORMAT_EDIT_FIELD_HADERSIZE, FDE_FORMAT_CARET_FORWARD) + nBgn2; + } else if (bRet2 == FALSE) { + FXSYS_assert(bRet1); + return pEditableField1->NormalizeCaretPos(nEnd1 - nBgn1, FDE_FORMAT_CARET_BACKWARD) + nBgn1; + } else { + FX_INT32 nEditablePosBgn = 0, nEditablePosEnd = 0; + if (nIndex - nEnd1 < nBgn2 + nDelta - nIndex) { + pEditableField1->GetEditableRange(nEditablePosBgn, nEditablePosEnd); + return nEditablePosEnd + nBgn1; + } else { + pEditableField2->GetEditableRange(nEditablePosBgn, nEditablePosEnd); + return nEditablePosBgn + nBgn2; + } + } + } + break; + case FDE_FORMAT_CARET_BACKWARD: { + if (FindEditableField(nIndex, nBgn, nEnd, pField, FALSE)) { + return pField->NormalizeCaretPos(nEnd - nBgn, FDE_FORMAT_CARET_BACKWARD) + nBgn; + } else { + if (nRecord != -1) { + return nRecord; + } + bRet = FindEditableField(nIndex, nBgn, nEnd, pField); + FXSYS_assert(bRet); + return pField->NormalizeCaretPos(FDE_FORMAT_EDIT_FIELD_HADERSIZE, FDE_FORMAT_CARET_FORWARD) + nBgn; + } + } + break; + default: + FXSYS_assert(0); + return nIndex; + } +} +FX_BOOL CFDE_TxtEdtEngine::GetFieldBoundary(FX_INT32 nIndex, FX_INT32 &nBgn, FX_INT32 &nEnd, CFDE_TxtEdtField * &pField) +{ + CFDE_TxtEdtBufIter * pIter = FX_NEW CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)m_pTxtBuf, FALSE); + pIter->SetAt(nIndex); + FX_BOOL bFind = FALSE; + do { + FX_WCHAR wc = pIter->GetChar(); + if (wc == FDE_TXTEDT_FORMATBLOCK_END) { + nEnd = pIter->GetAt(); + bFind = TRUE; + nIndex --; + break; + } + if (wc == FDE_TXTEDT_FORMATBLOCK_BGN) { + pIter->Release(); + return FALSE; + } + } while (pIter->Next()); + if (!bFind) { + pIter->Release(); + return FALSE; + } + pIter->SetAt(nIndex); + do { + FX_WCHAR wc = pIter->GetChar(); + if (wc == FDE_TXTEDT_FORMATBLOCK_BGN) { + nBgn = pIter->GetAt(); + pIter->Next(); + FX_DWORD dwPre = (FX_DWORD)pIter->GetChar(); + pIter->Next(); + FX_DWORD dwCur = (FX_DWORD)pIter->GetChar(); + pField = (CFDE_TxtEdtField *)((dwCur << 16) | dwPre); + pIter->Release(); + return TRUE; + } + if (wc == FDE_TXTEDT_FORMATBLOCK_END) { + pIter->Release(); + return FALSE; + } + } while (pIter->Next(TRUE)); + pIter->Release(); + return FALSE; +} +FX_BOOL CFDE_TxtEdtEngine::FindEditableField(FX_INT32 nIndex, FX_INT32 &nBgn, FX_INT32 &nEnd, CFDE_TxtEdtField * &pField, FX_BOOL bForward ) +{ + FX_WCHAR wcFirst = FDE_TXTEDT_FORMATBLOCK_BGN; + FX_WCHAR wcSecond = FDE_TXTEDT_FORMATBLOCK_END; + if (!bForward) { + wcFirst = FDE_TXTEDT_FORMATBLOCK_END; + wcSecond = FDE_TXTEDT_FORMATBLOCK_BGN; + } + CFDE_TxtEdtBufIter * pIter = FX_NEW CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)m_pTxtBuf, FALSE); + pIter->SetAt(nIndex); + FX_INT32 bFind = FALSE; + do { + FX_WCHAR wc = pIter->GetChar(); + if (wc == wcFirst) { + nBgn = pIter->GetAt(); + bFind = TRUE; + break; + } + } while (pIter->Next(!bForward)); + if (!bFind) { + pIter->Release(); + return FALSE; + } + bFind = FALSE; + do { + FX_WCHAR wc = pIter->GetChar(); + if (wc == wcSecond) { + nEnd = pIter->GetAt(); + bFind = TRUE; + break; + } + } while (pIter->Next(!bForward)); + FXSYS_assert(bFind); + if (!bForward) { + FX_INT32 nTemp = nBgn; + nBgn = nEnd; + nEnd = nTemp; + } + pIter->SetAt(nBgn + 1); + FX_DWORD dwPre = (FX_DWORD)pIter->GetChar(); + pIter->Next(); + FX_DWORD dwCur = (FX_DWORD)pIter->GetChar(); + pField = (CFDE_TxtEdtField *)((dwCur << 16) | dwPre); + pIter->Release(); + if (!pField->IsFix()) { + return TRUE; + } + return FindEditableField((bForward ? nEnd : nBgn), nBgn, nEnd, pField, bForward); +} +FX_BOOL CFDE_TxtEdtEngine::Move2NextEditableField(FX_INT32 nIndex, FX_BOOL bForward , FX_BOOL bSelect ) +{ + if (m_SelRangePtrArr.GetSize() > 0) { + ClearSelection(); + m_Param.pEventSink->On_SelChanged(this); + } + FX_INT32 nBgn = 0, nEnd = 0; + CFDE_TxtEdtField * pField = NULL; + FX_BOOL bRet = FindEditableField(nIndex, nBgn, nEnd, pField, bForward); + if (!bRet) { + return FALSE; + } + FX_INT32 nEditableBgn = 0, nEditableEnd = 0; + pField->GetEditableRange(nEditableBgn, nEditableEnd); + nEditableBgn += nBgn; + nEditableEnd += nBgn; + if (bSelect) { + FX_INT32 nRangeCount = nEditableEnd - nEditableBgn; + if (nRangeCount > 0) { + AddSelRange(nEditableBgn, nEditableEnd - nEditableBgn); + } + } + SetCaretPos(nEditableEnd, TRUE); + return TRUE; +} +FX_INT32 CFDE_TxtEdtEngine::GetRealIndex(FX_INT32 nIndex) const +{ + CFDE_TxtEdtBufIter * pIter = FX_NEW CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)m_pTxtBuf, FALSE); + pIter->SetAt(0); + FX_BOOL bInField = FALSE; + FX_INT32 nFieldBgn = 0; + FX_INT32 nRealIndex = 0; + for (FX_INT32 i = 0; i <= nIndex; i ++) { + FX_WCHAR wc = pIter->GetChar(); + if (bInField) { + if (wc == FDE_TXTEDT_FORMATBLOCK_END) { + FX_DWORD dwPre = (FX_DWORD)m_pTxtBuf->GetCharByIndex(nFieldBgn + 1); + FX_DWORD dwCur = (FX_DWORD)m_pTxtBuf->GetCharByIndex(nFieldBgn + 2); + CFDE_TxtEdtField * pField = (CFDE_TxtEdtField *)((dwCur << 16) | dwPre); + nRealIndex += pField->GetFieldTextLength(); + bInField = FALSE; + } + } else { + if (wc == FDE_TXTEDT_FORMATBLOCK_BGN) { + bInField = TRUE; + nFieldBgn = pIter->GetAt(); + } else { + nRealIndex ++; + } + } + pIter->Next(); + } + if (!bInField) { + pIter->Release(); + return nRealIndex; + } + pIter->SetAt(nFieldBgn + 1); + FX_DWORD dwPre = (FX_DWORD)pIter->GetChar(); + pIter->Next(); + FX_DWORD dwCur = (FX_DWORD)pIter->GetChar(); + CFDE_TxtEdtField * pField = (CFDE_TxtEdtField *)((dwCur << 16) | dwPre); + pIter->Release(); + if (pField->IsFix()) { + FX_INT32 nDelta = nIndex - nFieldBgn - FDE_FORMAT_EDIT_FIELD_HADERSIZE + 1; + return nRealIndex + (nDelta > 0 ? nDelta : 0); + } else { + return nRealIndex + pField->GetRealIndex(nIndex - nFieldBgn); + } +} +#endif +FX_BOOL CFDE_TxtEdtEngine::IsFitArea(CFX_WideString &wsText) +{ + IFDE_TextOut * pTextOut = IFDE_TextOut::Create(); + pTextOut->SetLineSpace(m_Param.fLineSpace); + pTextOut->SetFont(m_Param.pFont); + pTextOut->SetFontSize(m_Param.fFontSize); + CFX_RectF rcText; + FXSYS_memset(&rcText, 0, sizeof(rcText)); + FX_DWORD dwStyle = 0; + if (!(m_Param.dwMode & FDE_TEXTEDITMODE_MultiLines)) { + dwStyle |= FDE_TTOSTYLE_SingleLine; + } + if (m_Param.dwMode & FDE_TEXTEDITMODE_AutoLineWrap) { + dwStyle |= FDE_TTOSTYLE_LineWrap; + rcText.width = m_Param.fPlateWidth; + } else { + rcText.width = 65535; + } + pTextOut->SetStyles(dwStyle); + wsText += L"\n"; + pTextOut->CalcLogicSize(wsText, wsText.GetLength(), rcText); + pTextOut->Release(); + wsText.Delete(wsText.GetLength() - 1); + if ((m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Horz) && (rcText.width > m_Param.fPlateWidth)) { + return FALSE; + } + if ((m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Vert) && \ + (rcText.height > m_Param.fLineSpace * m_Param.nLineCount)) { + return FALSE; + } + return TRUE; +} +void CFDE_TxtEdtEngine::UpdateCaretRect(FX_INT32 nIndex, FX_BOOL bBefore) +{ + MovePage2Char(nIndex); + GetCaretRect(m_rtCaret, m_nCaretPage, nIndex, bBefore); + m_nCaret = nIndex; + m_bBefore = bBefore; + if (!m_bBefore) { + m_nCaret ++; + m_bBefore = TRUE; + } + m_fCaretPosReserve = (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) ? \ + m_rtCaret.top : m_rtCaret.left; + m_Param.pEventSink->On_CaretChanged(this, m_nCaretPage, 0); +} +void CFDE_TxtEdtEngine::GetCaretRect(CFX_RectF &rtCaret, FX_INT32 nPageIndex, FX_INT32 nCaret, FX_BOOL bBefore ) +{ + IFDE_TxtEdtPage * pPage = m_PagePtrArray[m_nCaretPage]; + m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0); + FX_BOOL bCombText = m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_CombText; + FX_INT32 nIndexInpage = nCaret - pPage->GetCharStart(); + if (bBefore && bCombText && nIndexInpage > 0) { + nIndexInpage--; + bBefore = FALSE; + } + FX_INT32 nBIDILevel = pPage->GetCharRect(nIndexInpage, rtCaret, bCombText); + if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) { + if ((!FX_IsOdd(nBIDILevel) && !bBefore) || (FX_IsOdd(nBIDILevel) && bBefore)) { + rtCaret.Offset(0, rtCaret.height - 1.0f); + } + if (rtCaret.height == 0 && rtCaret.top > 1.0f) { + rtCaret.top -= 1.0f; + } + rtCaret.height = 1.0f; + } else { + if ((!FX_IsOdd(nBIDILevel) && !bBefore) || (FX_IsOdd(nBIDILevel) && bBefore)) { + rtCaret.Offset(rtCaret.width - 1.0f, 0); + } + if (rtCaret.width == 0 && rtCaret.left > 1.0f) { + rtCaret.left -= 1.0f; + } + rtCaret.width = 1.0f; + } + m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0); +} +void CFDE_TxtEdtEngine::UpdateCaretIndex(const CFX_PointF & ptCaret) +{ + IFDE_TxtEdtPage * pPage = m_PagePtrArray[m_nCaretPage]; + m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0); + m_nCaret = pPage->GetCharIndex(ptCaret, m_bBefore); + GetCaretRect(m_rtCaret, m_nCaretPage, m_nCaret, m_bBefore); + if (!m_bBefore) { + m_nCaret ++; + m_bBefore = TRUE; + } + m_Param.pEventSink->On_CaretChanged(this, m_nCaretPage); + m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0); +} +FX_BOOL CFDE_TxtEdtEngine::IsSelect() +{ + return m_SelRangePtrArr.GetSize() > 0; +} +void CFDE_TxtEdtEngine::DeleteSelect() +{ + FX_INT32 nCountRange = CountSelRanges(); + if (nCountRange > 0) { +#ifdef FDE_USEFORMATBLOCK + FX_INT32 nBlockCount = m_BlockArray.GetSize(); + if (nBlockCount > 0) { + if (nCountRange > 1) { + return; + } + FX_INT32 nSelStart; + FX_INT32 nSelCount; + nSelCount = GetSelRange(0, nSelStart); + FX_INT32 nSelEnd = nSelStart + nSelCount; + FX_INT32 nBgn = 0; + FX_INT32 nEnd = 0; + CFDE_TxtEdtField * pField = NULL; + FX_BOOL bInField = GetFieldBoundary(nSelStart, nBgn, nEnd, pField); + FX_INT32 nCaretInField = nSelStart - nBgn; + FX_BOOL bBefore = FALSE; + if (!bInField || pField->IsFix() || nSelEnd > nEnd) { + return; + } + pField->Backup(); + CFX_WideString wsDel; + FX_INT32 nCaret = 0; + FX_INT32 nRet = pField->Delete(nCaretInField, nSelCount, wsDel, nCaret, bBefore); + nCaret += nBgn; + switch (nRet) { + case FDE_FORMAT_FIELD_DELETE_RET_S: + break; + case FDE_FORMAT_FIELD_DELETE_RET_F_INVALIDATE: + case FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY: + return; + default: + FXSYS_assert(0); + break; + } + CFX_WideString wsField; + pField->GetFieldText(wsField); + if (!m_Param.pEventSink->On_ValidateField(this, pField->GetBlockIndex(), pField->GetIndex(), wsField, 0)) { + pField->Restore(); + return; + } + CFX_WideString wsDisplay; + pField->GetDisplayText(wsDisplay); + Replace(nBgn, nEnd - nBgn + 1, wsDisplay); + if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) { + IFDE_TxtEdtDoRecord * pRecord = FX_NEW CFDE_TxtEdtDoRecord_FieldDelete(this, nSelStart, pField, nCaretInField, + nBgn, nEnd - nBgn + 1, wsDisplay.GetLength(), wsDel, FALSE); + CFX_ByteString bsDoRecord; + pRecord->Serialize(bsDoRecord); + m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord); + pRecord->Release(); + } + SetCaretPos(nSelStart, bBefore); + return; + } +#endif + FX_INT32 nSelStart; + FX_INT32 nSelCount; + while (nCountRange > 0) { + nSelCount = GetSelRange(--nCountRange, nSelStart); + FDE_LPTXTEDTSELRANGE lpTemp = m_SelRangePtrArr[nCountRange]; + delete lpTemp; + m_SelRangePtrArr.RemoveAt(nCountRange); + DeleteRange_DoRecord(nSelStart, nSelCount, TRUE); + } + ClearSelection(); + m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo); + m_Param.pEventSink->On_SelChanged(this); + SetCaretPos(nSelStart, TRUE); + return; + } +} +IFDE_TxtEdtDoRecord * IFDE_TxtEdtDoRecord::Create(FX_BSTR bsDoRecord) +{ + FX_LPCSTR lpBuf = bsDoRecord.GetCStr(); + FX_INT32 nType = *((FX_INT32*)lpBuf); + switch(nType) { + case FDE_TXTEDT_DORECORD_INS: + return FX_NEW CFDE_TxtEdtDoRecord_Insert(bsDoRecord); + case FDE_TXTEDT_DORECORD_DEL: + return FX_NEW CFDE_TxtEdtDoRecord_DeleteRange(bsDoRecord); +#ifdef FDE_USEFORMATBLOCK + case FDE_TXTEDT_DORECORD_FORMATINS: + return FX_NEW CFDE_TxtEdtDoRecord_FieldInsert(bsDoRecord); + case FDE_TXTEDT_DORECORD_FORMATDEL: + return FX_NEW CFDE_TxtEdtDoRecord_FieldDelete(bsDoRecord); + case FDE_TXTEDT_DORECORD_FORMATREP: + return FX_NEW CFDE_TxtEdtDoRecord_FieldReplace(bsDoRecord); +#endif + default: + break; + } + return NULL; +} +CFDE_TxtEdtDoRecord_Insert::CFDE_TxtEdtDoRecord_Insert(FX_BSTR bsDoRecord) +{ + Deserialize(bsDoRecord); +} +CFDE_TxtEdtDoRecord_Insert::CFDE_TxtEdtDoRecord_Insert(CFDE_TxtEdtEngine * pEngine, + FX_INT32 nCaret, + FX_LPCWSTR lpText, + FX_INT32 nLength) + : m_pEngine(pEngine) + , m_nCaret(nCaret) +{ + FXSYS_assert(pEngine); + FX_LPWSTR lpBuffer = m_wsInsert.GetBuffer(nLength); + FXSYS_memcpy(lpBuffer, lpText, nLength * sizeof(FX_WCHAR)); + m_wsInsert.ReleaseBuffer(); +} +CFDE_TxtEdtDoRecord_Insert::~CFDE_TxtEdtDoRecord_Insert() +{ +} +void CFDE_TxtEdtDoRecord_Insert::Release() +{ + delete this; +} +FX_BOOL CFDE_TxtEdtDoRecord_Insert::Undo() +{ + if (m_pEngine->IsSelect()) { + m_pEngine->ClearSelection(); + } + m_pEngine->Inner_DeleteRange(m_nCaret, m_wsInsert.GetLength()); + FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param; + m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Delete; + m_pEngine->m_ChangeInfo.wsDelete = m_wsInsert; + Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo); + m_pEngine->SetCaretPos(m_nCaret, TRUE); + return TRUE; +} +FX_BOOL CFDE_TxtEdtDoRecord_Insert::Redo() +{ + m_pEngine->Inner_Insert(m_nCaret, FX_LPCWSTR(m_wsInsert), m_wsInsert.GetLength()); + FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param; + m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert; + m_pEngine->m_ChangeInfo.wsDelete = m_wsInsert; + Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo); + m_pEngine->SetCaretPos(m_nCaret, FALSE); + return TRUE; +} +void CFDE_TxtEdtDoRecord_Insert::Serialize(CFX_ByteString &bsDoRecord) const +{ + CFX_ArchiveSaver ArchiveSaver; + ArchiveSaver << FX_INT32(FDE_TXTEDT_DORECORD_INS); + ArchiveSaver << (FX_INT32)(FX_UINTPTR)m_pEngine; + ArchiveSaver << m_nCaret; + ArchiveSaver << m_wsInsert; + FX_INT32 nLength = ArchiveSaver.GetLength(); + FX_LPCBYTE lpSrcBuf = ArchiveSaver.GetBuffer(); + FX_LPSTR lpDstBuf = bsDoRecord.GetBuffer(nLength); + FXSYS_memcpy(lpDstBuf, lpSrcBuf, nLength); + bsDoRecord.ReleaseBuffer(nLength); +} +void CFDE_TxtEdtDoRecord_Insert::Deserialize(FX_BSTR bsDoRecord) +{ + CFX_ArchiveLoader ArchiveLoader((FX_LPCBYTE)bsDoRecord.GetCStr(), bsDoRecord.GetLength()); + FX_INT32 nType = 0; + ArchiveLoader >> nType; + FXSYS_assert(nType == FDE_TXTEDT_DORECORD_INS); + FX_INT32 nEngine = 0; + ArchiveLoader >> nEngine; + m_pEngine = (CFDE_TxtEdtEngine*)(FX_UINTPTR)nEngine; + ArchiveLoader >> m_nCaret; + ArchiveLoader >> m_wsInsert; +} +CFDE_TxtEdtDoRecord_DeleteRange::CFDE_TxtEdtDoRecord_DeleteRange(FX_BSTR bsDoRecord) +{ + Deserialize(bsDoRecord); +} +CFDE_TxtEdtDoRecord_DeleteRange::CFDE_TxtEdtDoRecord_DeleteRange(CFDE_TxtEdtEngine * pEngine, + FX_INT32 nIndex, + FX_INT32 nCaret, + const CFX_WideString &wsRange, + FX_BOOL bSel) + : m_pEngine(pEngine) + , m_nIndex(nIndex) + , m_nCaret(nCaret) + , m_wsRange(wsRange) + , m_bSel(bSel) +{ + FXSYS_assert(pEngine); +} +CFDE_TxtEdtDoRecord_DeleteRange::~CFDE_TxtEdtDoRecord_DeleteRange() +{ +} +void CFDE_TxtEdtDoRecord_DeleteRange::Release() +{ + delete this; +} +FX_BOOL CFDE_TxtEdtDoRecord_DeleteRange::Undo() +{ + if (m_pEngine->IsSelect()) { + m_pEngine->ClearSelection(); + } + m_pEngine->Inner_Insert(m_nIndex, FX_LPCWSTR(m_wsRange), m_wsRange.GetLength()); + if (m_bSel) { + m_pEngine->AddSelRange(m_nIndex, m_wsRange.GetLength()); + } + FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param; + m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert; + m_pEngine->m_ChangeInfo.wsDelete = m_wsRange; + Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo); + m_pEngine->SetCaretPos(m_nCaret, TRUE); + return TRUE; +} +FX_BOOL CFDE_TxtEdtDoRecord_DeleteRange::Redo() +{ + m_pEngine->Inner_DeleteRange(m_nIndex, m_wsRange.GetLength()); + if (m_bSel) { + m_pEngine->RemoveSelRange(m_nIndex, m_wsRange.GetLength()); + } + FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param; + m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert; + m_pEngine->m_ChangeInfo.wsDelete = m_wsRange; + Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo); + m_pEngine->SetCaretPos(m_nIndex, TRUE); + return TRUE; +} +void CFDE_TxtEdtDoRecord_DeleteRange::Serialize(CFX_ByteString &bsDoRecord) const +{ + CFX_ArchiveSaver ArchiveSaver; + ArchiveSaver << FX_INT32(FDE_TXTEDT_DORECORD_DEL); + ArchiveSaver << (FX_INT32)(FX_UINTPTR)m_pEngine; + ArchiveSaver << m_bSel; + ArchiveSaver << m_nIndex; + ArchiveSaver << m_nCaret; + ArchiveSaver << m_wsRange; + FX_INT32 nLength = ArchiveSaver.GetLength(); + FX_LPCBYTE lpSrcBuf = ArchiveSaver.GetBuffer(); + FX_LPSTR lpDstBuf = bsDoRecord.GetBuffer(nLength); + FXSYS_memcpy(lpDstBuf, lpSrcBuf, nLength); + bsDoRecord.ReleaseBuffer(nLength); +} +void CFDE_TxtEdtDoRecord_DeleteRange::Deserialize(FX_BSTR bsDoRecord) +{ + CFX_ArchiveLoader ArchiveLoader((FX_LPCBYTE)bsDoRecord.GetCStr(), bsDoRecord.GetLength()); + FX_INT32 nType = 0; + ArchiveLoader >> nType; + FXSYS_assert(nType == FDE_TXTEDT_DORECORD_DEL); + FX_INT32 nEngine = 0; + ArchiveLoader >> nEngine; + m_pEngine = (CFDE_TxtEdtEngine*)(FX_UINTPTR)nEngine; + ArchiveLoader >> m_bSel; + ArchiveLoader >> m_nIndex; + ArchiveLoader >> m_nCaret; + ArchiveLoader >> m_wsRange; +} +#ifdef FDE_USEFORMATBLOCK +CFDE_TxtEdtDoRecord_FieldInsert::CFDE_TxtEdtDoRecord_FieldInsert(FX_BSTR bsDoRecord) +{ + Deserialize(bsDoRecord); +} +CFDE_TxtEdtDoRecord_FieldInsert::CFDE_TxtEdtDoRecord_FieldInsert(CFDE_TxtEdtEngine * pEngine, + FX_INT32 nCaret, + CFDE_TxtEdtField * pField, + FX_INT32 nIndexInField, + FX_INT32 nFieldBgn, + FX_INT32 nOldFieldLength, + FX_INT32 nNewFieldLength, + const CFX_WideString &wsIns, + FX_BOOL bSel ) + : m_pEngine(pEngine) + , m_nCaret(nCaret) + , m_pField(pField) + , m_nIndexInField(nIndexInField) + , m_nFieldBgn(nFieldBgn) + , m_nOldFieldLength(nOldFieldLength) + , m_nNewFieldLength(nNewFieldLength) + , m_wsIns(wsIns) + , m_bSel(bSel) +{ + FXSYS_assert(pEngine); + FXSYS_assert(pField); +} +CFDE_TxtEdtDoRecord_FieldInsert::~CFDE_TxtEdtDoRecord_FieldInsert() +{ +} +void CFDE_TxtEdtDoRecord_FieldInsert::Release() +{ + delete this; +} +FX_BOOL CFDE_TxtEdtDoRecord_FieldInsert::Undo() +{ + CFX_WideString wsDel; + FX_INT32 nCaret = 0; + FX_BOOL bBefore = FALSE; + FX_INT32 nRet = m_pField->Delete(m_nIndexInField, m_wsIns.GetLength(), wsDel, nCaret, bBefore); + FXSYS_assert(nRet != FDE_FORMAT_FIELD_DELETE_RET_F_INVALIDATE && nRet != FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY); + CFX_WideString wsDisplay; + m_pField->GetDisplayText(wsDisplay); + m_pEngine->Replace(m_nFieldBgn, m_nNewFieldLength, wsDisplay); + m_pEngine->SetCaretPos(m_nCaret, TRUE); + return TRUE; +} +FX_BOOL CFDE_TxtEdtDoRecord_FieldInsert::Redo() +{ + FX_INT32 nCaret = 0; + FX_BOOL bBefore = FALSE; + FX_INT32 nRet = m_pField->Insert(m_nIndexInField, m_wsIns, nCaret, bBefore); + FXSYS_assert(nRet != FDE_FORMAT_FIELD_INSERT_RET_F_FULL && nRet != FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE); + CFX_WideString wsDisplay; + m_pField->GetDisplayText(wsDisplay); + m_pEngine->Replace(m_nFieldBgn, m_nOldFieldLength, wsDisplay); + m_pEngine->SetCaretPos(m_nCaret + m_wsIns.GetLength(), TRUE); + return TRUE; +} +void CFDE_TxtEdtDoRecord_FieldInsert::Serialize(CFX_ByteString &bsDoRecord) const +{ + CFX_ArchiveSaver ArchiveSaver; + ArchiveSaver << FX_INT32(FDE_TXTEDT_DORECORD_FORMATINS); + ArchiveSaver << FX_INT32(m_pEngine); + ArchiveSaver << m_nCaret; + ArchiveSaver << FX_INT32(m_pField); + ArchiveSaver << m_nIndexInField; + ArchiveSaver << m_nFieldBgn; + ArchiveSaver << m_nOldFieldLength; + ArchiveSaver << m_nNewFieldLength; + ArchiveSaver << m_wsIns; + ArchiveSaver << m_bSel; + FX_INT32 nLength = ArchiveSaver.GetLength(); + FX_LPCBYTE lpSrcBuf = ArchiveSaver.GetBuffer(); + FX_LPSTR lpDstBuf = bsDoRecord.GetBuffer(nLength); + FXSYS_memcpy(lpDstBuf, lpSrcBuf, nLength); + bsDoRecord.ReleaseBuffer(nLength); +} +void CFDE_TxtEdtDoRecord_FieldInsert::Deserialize(FX_BSTR bsDoRecord) +{ + CFX_ArchiveLoader ArchiveLoader((FX_LPCBYTE)bsDoRecord.GetCStr(), bsDoRecord.GetLength()); + FX_INT32 nType = 0; + ArchiveLoader >> nType; + FXSYS_assert(nType == FDE_TXTEDT_DORECORD_FORMATINS); + FX_INT32 nEngine = 0; + ArchiveLoader >> nEngine; + m_pEngine = (CFDE_TxtEdtEngine*)(FX_UINTPTR)nEngine; + ArchiveLoader >> m_nCaret; + FX_INT32 nField = 0; + ArchiveLoader >> nField; + m_pField = (CFDE_TxtEdtField*)nField; + ArchiveLoader >> m_nIndexInField; + ArchiveLoader >> m_nFieldBgn; + ArchiveLoader >> m_nOldFieldLength; + ArchiveLoader >> m_nNewFieldLength; + ArchiveLoader >> m_wsIns; + ArchiveLoader >> m_bSel; +} +CFDE_TxtEdtDoRecord_FieldDelete::CFDE_TxtEdtDoRecord_FieldDelete(FX_BSTR bsDoRecord) +{ + Deserialize(bsDoRecord); +} +CFDE_TxtEdtDoRecord_FieldDelete::CFDE_TxtEdtDoRecord_FieldDelete(CFDE_TxtEdtEngine * pEngine, + FX_INT32 nCaret, + CFDE_TxtEdtField * pField, + FX_INT32 nIndexInField, + FX_INT32 nFieldBgn, + FX_INT32 nOldLength, + FX_INT32 nNewLength, + const CFX_WideString &wsDel, + FX_BOOL bSel ) + : m_pEngine(pEngine) + , m_nCaret(nCaret) + , m_pField(pField) + , m_nIndexInField(nIndexInField) + , m_nFieldBgn(nFieldBgn) + , m_nOldFieldLength(nOldLength) + , m_nNewFieldLength(nNewLength) + , m_wsDel(wsDel) + , m_bSel(bSel) +{ + FXSYS_assert(m_pEngine); + FXSYS_assert(m_pField); +} +CFDE_TxtEdtDoRecord_FieldDelete::~CFDE_TxtEdtDoRecord_FieldDelete() +{ +} +void CFDE_TxtEdtDoRecord_FieldDelete::Release() +{ + delete this; +} +FX_BOOL CFDE_TxtEdtDoRecord_FieldDelete::Undo() +{ + FX_INT32 nCaret = 0; + FX_BOOL bBefore = FALSE; + FX_INT32 nRet = m_pField->Insert(m_nIndexInField, m_wsDel, nCaret, bBefore); + FXSYS_assert(nRet != FDE_FORMAT_FIELD_INSERT_RET_F_FULL && nRet != FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE); + CFX_WideString wsDisplay; + m_pField->GetDisplayText(wsDisplay); + m_pEngine->Replace(m_nFieldBgn, m_nNewFieldLength, wsDisplay); + m_pEngine->SetCaretPos(m_nCaret, TRUE); + return TRUE; +} +FX_BOOL CFDE_TxtEdtDoRecord_FieldDelete::Redo() +{ + FX_INT32 nCaret = 0; + FX_BOOL bBefore = 0; + CFX_WideString wsDel; + FX_INT32 nRet = m_pField->Delete(m_nIndexInField, m_wsDel.GetLength(), wsDel, nCaret, bBefore); + FXSYS_assert(nRet != FDE_FORMAT_FIELD_DELETE_RET_F_INVALIDATE && nRet != FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY); + CFX_WideString wsDisplay; + m_pField->GetDisplayText(wsDisplay); + m_pEngine->Replace(m_nFieldBgn, m_nOldFieldLength, wsDisplay); + m_pEngine->SetCaretPos(m_nCaret - m_wsDel.GetLength(), TRUE); + return TRUE; +} +void CFDE_TxtEdtDoRecord_FieldDelete::Serialize(CFX_ByteString &bsDoRecord) const +{ + CFX_ArchiveSaver ArchiveSaver; + ArchiveSaver << FX_INT32(FDE_TXTEDT_DORECORD_FORMATDEL); + ArchiveSaver << FX_INT32(m_pEngine); + ArchiveSaver << m_nCaret; + ArchiveSaver << FX_INT32(m_pField); + ArchiveSaver << m_nIndexInField; + ArchiveSaver << m_nFieldBgn; + ArchiveSaver << m_nOldFieldLength; + ArchiveSaver << m_nNewFieldLength; + ArchiveSaver << m_wsDel; + ArchiveSaver << m_bSel; + FX_INT32 nLength = ArchiveSaver.GetLength(); + FX_LPCBYTE lpSrcBuf = ArchiveSaver.GetBuffer(); + FX_LPSTR lpDstBuf = bsDoRecord.GetBuffer(nLength); + FXSYS_memcpy(lpDstBuf, lpSrcBuf, nLength); + bsDoRecord.ReleaseBuffer(nLength); +} +void CFDE_TxtEdtDoRecord_FieldDelete::Deserialize(FX_BSTR bsDoRecord) +{ + CFX_ArchiveLoader ArchiveLoader((FX_LPCBYTE)bsDoRecord.GetCStr(), bsDoRecord.GetLength()); + FX_INT32 nType = 0; + ArchiveLoader >> nType; + FXSYS_assert(nType == FDE_TXTEDT_DORECORD_FORMATDEL); + FX_INT32 nEngine = 0; + ArchiveLoader >> nEngine; + m_pEngine = (CFDE_TxtEdtEngine*)(FX_UINTPTR)nEngine; + ArchiveLoader >> m_nCaret; + FX_INT32 nField = 0; + ArchiveLoader >> nField; + m_pField = (CFDE_TxtEdtField*)nField; + ArchiveLoader >> m_nIndexInField; + ArchiveLoader >> m_nFieldBgn; + ArchiveLoader >> m_nOldFieldLength; + ArchiveLoader >> m_nNewFieldLength; + ArchiveLoader >> m_wsDel; + ArchiveLoader >> m_bSel; +} +CFDE_TxtEdtDoRecord_FieldReplace::CFDE_TxtEdtDoRecord_FieldReplace(FX_BSTR bsDoRecord) +{ + Deserialize(bsDoRecord); +} +CFDE_TxtEdtDoRecord_FieldReplace::CFDE_TxtEdtDoRecord_FieldReplace( CFDE_TxtEdtEngine * pEngine, + FX_INT32 nCaret, + FX_INT32 nNewCaret, + CFDE_TxtEdtField * pField, + FX_INT32 nIndexInField, + FX_INT32 nFieldBgn, + FX_INT32 nFieldNewLength, + const CFX_WideString &wsDel, + const CFX_WideString &wsIns, + FX_BOOL bSel) + : m_pEngine(pEngine) + , m_nCaret(nCaret) + , m_nNewCaret(nNewCaret) + , m_pField(pField) + , m_nIndexInField(nIndexInField) + , m_nFieldBgn(nFieldBgn) + , m_nFieldNewLength(nFieldNewLength) + , m_wsDel(wsDel) + , m_wsIns(wsIns) + , m_bSel(bSel) +{ + FXSYS_assert(m_pEngine); + FXSYS_assert(m_pField); +} +CFDE_TxtEdtDoRecord_FieldReplace::~CFDE_TxtEdtDoRecord_FieldReplace() +{ +} +void CFDE_TxtEdtDoRecord_FieldReplace::Release() +{ + delete this; +} +FX_BOOL CFDE_TxtEdtDoRecord_FieldReplace::Undo() +{ + CFX_WideString wsDel; + FX_INT32 nCaret = 0; + FX_BOOL bBefore = FALSE; + FX_INT32 nRet = m_pField->Replace(m_nIndexInField, m_wsIns.GetLength(), m_wsDel, wsDel, nCaret, bBefore); + FXSYS_assert(nRet != FDE_FORMAT_FIELD_DELETE_RET_F_INVALIDATE && nRet != FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY); + CFX_WideString wsDisplay; + m_pField->GetDisplayText(wsDisplay); + m_pEngine->Replace(m_nFieldBgn, m_nFieldNewLength, wsDisplay); + m_pEngine->SetCaretPos(m_nCaret, TRUE); + return TRUE; +} +FX_BOOL CFDE_TxtEdtDoRecord_FieldReplace::Redo() +{ + CFX_WideString wsDel; + FX_INT32 nCaret = 0; + FX_BOOL bBefore = FALSE; + FX_INT32 nRet = m_pField->Replace(m_nIndexInField, m_wsDel.GetLength(), m_wsIns, wsDel, nCaret, bBefore); + FXSYS_assert(nRet != FDE_FORMAT_FIELD_DELETE_RET_F_INVALIDATE && nRet != FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY); + CFX_WideString wsDisplay; + m_pField->GetDisplayText(wsDisplay); + m_pEngine->Replace(m_nFieldBgn, m_nFieldNewLength, wsDisplay); + m_pEngine->SetCaretPos(m_nNewCaret, TRUE); + return TRUE; +} +void CFDE_TxtEdtDoRecord_FieldReplace::Serialize(CFX_ByteString &bsDoRecord) const +{ + CFX_ArchiveSaver ArchiveSaver; + ArchiveSaver << FX_INT32(FDE_TXTEDT_DORECORD_FORMATREP); + ArchiveSaver << FX_INT32(m_pEngine); + ArchiveSaver << m_nCaret; + ArchiveSaver << m_nNewCaret; + ArchiveSaver << FX_INT32(m_pField); + ArchiveSaver << m_nIndexInField; + ArchiveSaver << m_nFieldBgn; + ArchiveSaver << m_nFieldNewLength; + ArchiveSaver << m_wsDel; + ArchiveSaver << m_wsIns; + ArchiveSaver << m_bSel; + FX_INT32 nLength = ArchiveSaver.GetLength(); + FX_LPCBYTE lpSrcBuf = ArchiveSaver.GetBuffer(); + FX_LPSTR lpDstBuf = bsDoRecord.GetBuffer(nLength); + FXSYS_memcpy(lpDstBuf, lpSrcBuf, nLength); + bsDoRecord.ReleaseBuffer(nLength); +} +void CFDE_TxtEdtDoRecord_FieldReplace::Deserialize(FX_BSTR bsDoRecord) +{ + CFX_ArchiveLoader ArchiveLoader((FX_LPCBYTE)bsDoRecord.GetCStr(), bsDoRecord.GetLength()); + FX_INT32 nType = 0; + ArchiveLoader >> nType; + FXSYS_assert(nType == FDE_TXTEDT_DORECORD_FORMATREP); + FX_INT32 nEngine = 0; + ArchiveLoader >> nEngine; + m_pEngine = (CFDE_TxtEdtEngine*)(FX_UINTPTR)nEngine; + ArchiveLoader >> m_nCaret; + ArchiveLoader >> m_nNewCaret; + FX_INT32 nField = 0; + ArchiveLoader >> nField; + m_pField = (CFDE_TxtEdtField*)nField; + ArchiveLoader >> m_nIndexInField; + ArchiveLoader >> m_nFieldBgn; + ArchiveLoader >> m_nFieldNewLength; + ArchiveLoader >> m_wsDel; + ArchiveLoader >> m_wsIns; + ArchiveLoader >> m_bSel; +} +#endif diff --git a/xfa/src/fee/src/fee/fde_txtedtengine.h b/xfa/src/fee/src/fee/fde_txtedtengine.h new file mode 100644 index 0000000000..f9f7a6dc8e --- /dev/null +++ b/xfa/src/fee/src/fee/fde_txtedtengine.h @@ -0,0 +1,341 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FDE_TXTEDTENGINE_H +#define _FDE_TXTEDTENGINE_H +class CFDE_TxtEdtBuf; +class CFDE_TxtEdtPage; +class IFX_TxtBreak; +class CFDE_TxtEdtParag; +class CFDE_TxtEdtKMPMatch; +class IFDE_TxtEdtFormator; +class CFDE_TxtEdtField; +class CFDE_TxtEdtBlock; +class IFX_CharIter; +class CFDE_TxtEdtEngine; +class CFDE_TxtEdtDoRecord_Insert; +class CFDE_TxtEdtDoRecord_DeleteRange; +#ifdef FDE_USEFORMATBLOCK +class CFDE_TxtEdtDoRecord_FormatInsert; +class CFDE_TxtEdtDoRecord_FormatDelete; +class CFDE_TxtEdtDoRecord_FormatReplace; +class CFDE_TxtEdtDoRecord_FieldInsert; +class CFDE_TxtEdtDoRecord_FieldDelete; +class CFDE_TxtEdtDoRecord_FieldReplace; +#endif +class IFDE_TxtEdtDoRecord +{ +public: + static IFDE_TxtEdtDoRecord * Create(FX_BSTR bsDoRecord); + virtual void Release() = 0; + virtual FX_BOOL Redo() = 0; + virtual FX_BOOL Undo() = 0; + virtual void Serialize(CFX_ByteString &bsDoRecord) const = 0; +}; +class CFDE_TxtEdtEngine : public IFDE_TxtEdtEngine, public CFX_Object +{ + friend class CFDE_TxtEdtDoRecord_Insert; + friend class CFDE_TxtEdtDoRecord_DeleteRange; + friend class CFDE_TxtEdtPage; +#ifdef FDE_USEFORMATBLOCK + friend class CFDE_TxtEdtDoRecord_FormatInsert; + friend class CFDE_TxtEdtDoRecord_FormatDelete; + friend class CFDE_TxtEdtDoRecord_FormatReplace; + friend class CFDE_TxtEdtBlock; +#endif + struct _FDE_TXTEDTSELRANGE : public CFX_Object { + FX_INT32 nStart; + FX_INT32 nCount; + }; + typedef _FDE_TXTEDTSELRANGE FDE_TXTEDTSELRANGE; + typedef _FDE_TXTEDTSELRANGE * FDE_LPTXTEDTSELRANGE; + struct _FDE_TXTEDTPARAGPOS : public CFX_Object { + FX_INT32 nParagIndex; + FX_INT32 nCharIndex; + }; + typedef _FDE_TXTEDTPARAGPOS FDE_TXTEDTPARAGPOS; + typedef _FDE_TXTEDTPARAGPOS * FDE_LPTXTEDTPARAGPOS; +public: + CFDE_TxtEdtEngine(); + virtual void Release(); + + virtual void SetEditParams(const FDE_TXTEDTPARAMS ¶ms); + virtual const FDE_TXTEDTPARAMS* GetEditParams() const; + + virtual FX_INT32 CountPages() const; + virtual IFDE_TxtEdtPage* GetPage(FX_INT32 nIndex); + + virtual FX_BOOL SetBufChunkSize(FX_INT32 nChunkSize); + virtual void SetTextByStream(IFX_Stream *pStream); + virtual void SetText(const CFX_WideString &wsText); + virtual FX_INT32 GetTextLength() const; + virtual void GetText(CFX_WideString &wsText, FX_INT32 nStart, FX_INT32 nCount = -1); + virtual void ClearText(); + + virtual FX_INT32 GetCaretRect(CFX_RectF &rtCaret) const; + virtual FX_INT32 GetCaretPos() const; + virtual FX_INT32 SetCaretPos(FX_INT32 nIndex, FX_BOOL bBefore); + virtual FX_INT32 MoveCaretPos(FDE_TXTEDTMOVECARET eMoveCaret, FX_BOOL bShift = FALSE, FX_BOOL bCtrl = FALSE); + virtual void Lock(); + virtual void Unlock(); + virtual FX_BOOL IsLocked() const; + + virtual FX_INT32 Insert(FX_INT32 nStart, FX_LPCWSTR lpText, FX_INT32 nLength); + virtual FX_INT32 Delete(FX_INT32 nStart, FX_BOOL bBackspace = FALSE); + virtual FX_INT32 DeleteRange(FX_INT32 nStart, FX_INT32 nCount = -1); + virtual FX_INT32 Replace(FX_INT32 nStart, FX_INT32 nLength, const CFX_WideString &wsReplace); + + virtual void SetLimit(FX_INT32 nLimit); + virtual void SetAliasChar(FX_WCHAR wcAlias); + virtual void SetFormatBlock(FX_INT32 nIndex, const CFX_WideString &wsBlockFormat); + virtual FX_INT32 CountEditBlocks() const; + virtual void GetEditBlockText(FX_INT32 nIndex, CFX_WideString &wsBlockText) const; + virtual FX_INT32 CountEditFields(FX_INT32 nBlockIndex) const; + virtual void GetEditFieldText(FX_INT32 nBlockIndex, FX_INT32 nFieldIndex, CFX_WideString &wsFieldText) const; + virtual void StartEdit(); + virtual void EndEdit(); + + void RemoveSelRange(FX_INT32 nStart, FX_INT32 nCount = -1); + + virtual void AddSelRange(FX_INT32 nStart, FX_INT32 nCount = -1); + virtual FX_INT32 CountSelRanges(); + virtual FX_INT32 GetSelRange(FX_INT32 nIndex, FX_INT32 &nStart); + virtual void ClearSelection(); + + virtual FX_BOOL Redo(FX_BSTR bsRedo); + virtual FX_BOOL Undo(FX_BSTR bsUndo); + + virtual FX_INT32 StartLayout(); + virtual FX_INT32 DoLayout(IFX_Pause *pPause); + virtual void EndLayout(); + + virtual FX_BOOL Optimize(IFX_Pause * pPause = NULL); + virtual FX_INT32 CountParags() const; + virtual IFDE_TxtEdtParag* GetParag(FX_INT32 nParagIndex) const; + virtual IFX_CharIter* CreateCharIter(); + IFDE_TxtEdtBuf* GetTextBuf() const; + FX_INT32 GetTextBufLength() const; + IFX_TxtBreak* GetTextBreak() const; + FX_INT32 GetLineCount() const; + FX_INT32 GetPageLineCount() const; + + FX_INT32 Line2Parag(FX_INT32 nStartParag, FX_INT32 nStartLineofParag, + FX_INT32 nLineIndex, FX_INT32 &nStartLine) const; + FX_WCHAR GetAliasChar() const + { + return m_wcAliasChar; + } + +protected: + virtual ~CFDE_TxtEdtEngine(); +private: + void Inner_Insert(FX_INT32 nStart, FX_LPCWSTR lpText, FX_INT32 nLength); +#ifdef FDE_USEFORMATBLOCK + void RawInsert(FX_INT32 nStart, FX_LPCWSTR lpText, FX_INT32 nLength); +#endif + void GetPreDeleteText(CFX_WideString &wsText, FX_INT32 nIndex, FX_INT32 nLength); + void GetPreInsertText(CFX_WideString &wsText, FX_INT32 nIndex, FX_LPCWSTR lpText, FX_INT32 nLength); + void GetPreReplaceText(CFX_WideString &wsText, FX_INT32 nIndex, FX_INT32 nOriginLength, FX_LPCWSTR lpText, FX_INT32 nLength); + + void Inner_DeleteRange(FX_INT32 nStart, FX_INT32 nCount = -1); + void DeleteRange_DoRecord(FX_INT32 nStart, FX_INT32 nCount, FX_BOOL bSel = FALSE); + void ResetEngine(); + void RebuildParagraphs(); + void RemoveAllParags(); + void RemoveAllPages(); + void UpdateParags(); + void UpdatePages(); + void UpdateTxtBreak(); + + FX_BOOL ReplaceParagEnd(FX_LPWSTR &lpText, FX_INT32 &nLength, FX_BOOL bPreIsCR = FALSE); + void RecoverParagEnd(CFX_WideString &wsText); + FX_INT32 MovePage2Char(FX_INT32 nIndex); + void TextPos2ParagPos(FX_INT32 nIndex, FDE_TXTEDTPARAGPOS &ParagPos) const; + FX_INT32 MoveForward(FX_BOOL &bBefore); + FX_INT32 MoveBackward(FX_BOOL &bBefore); + FX_BOOL MoveUp(CFX_PointF &ptCaret); + FX_BOOL MoveDown(CFX_PointF &ptCaret); + FX_BOOL MoveLineStart(); + FX_BOOL MoveLineEnd(); + FX_BOOL MoveParagStart(); + FX_BOOL MoveParagEnd(); + FX_BOOL MoveHome(); + FX_BOOL MoveEnd(); + FX_BOOL IsFitArea(CFX_WideString &wsText); + void UpdateCaretRect(FX_INT32 nIndex, FX_BOOL bBefore = TRUE); + void GetCaretRect(CFX_RectF &rtCaret, FX_INT32 nPageIndex, FX_INT32 nCaret, FX_BOOL bBefore = TRUE); + void UpdateCaretIndex(const CFX_PointF & ptCaret); + + FX_BOOL IsSelect(); + void DeleteSelect(); + IFDE_TxtEdtBuf* m_pTxtBuf; + IFX_TxtBreak* m_pTextBreak; + FDE_TXTEDTPARAMS m_Param; + CFX_ArrayTemplate m_PagePtrArray; + CFX_ArrayTemplate m_ParagPtrArray; + CFX_ArrayTemplate m_SelRangePtrArr; + FX_INT32 m_nPageLineCount; + FX_INT32 m_nLineCount; + FX_INT32 m_nAnchorPos; + FX_INT32 m_nLayoutPos; + FX_FLOAT m_fCaretPosReserve; + FX_INT32 m_nCaret; + FX_BOOL m_bBefore; + FX_INT32 m_nCaretPage; + CFX_RectF m_rtCaret; + FX_DWORD m_dwFindFlags; + + FX_BOOL m_bLock; + FX_INT32 m_nLimit; + FX_WCHAR m_wcAliasChar; + FX_INT32 m_nFirstLineEnd; + FX_BOOL m_bAutoLineEnd; + FX_WCHAR m_wLineEnd; + + FDE_TXTEDT_TEXTCHANGE_INFO m_ChangeInfo; +}; +class CFDE_TxtEdtDoRecord_Insert : public IFDE_TxtEdtDoRecord, public CFX_Object +{ +public: + CFDE_TxtEdtDoRecord_Insert(FX_BSTR bsDoRecord); + CFDE_TxtEdtDoRecord_Insert( CFDE_TxtEdtEngine * pEngine, + FX_INT32 nCaret, + FX_LPCWSTR lpText, + FX_INT32 nLength); + virtual void Release(); + virtual FX_BOOL Undo(); + virtual FX_BOOL Redo(); + virtual void Serialize(CFX_ByteString &bsDoRecord) const; +protected: + ~CFDE_TxtEdtDoRecord_Insert(); + void Deserialize(FX_BSTR bsDoRecord); +private: + CFDE_TxtEdtEngine * m_pEngine; + FX_INT32 m_nCaret; + CFX_WideString m_wsInsert; +}; +class CFDE_TxtEdtDoRecord_DeleteRange : public IFDE_TxtEdtDoRecord, public CFX_Object +{ +public: + CFDE_TxtEdtDoRecord_DeleteRange(FX_BSTR bsDoRecord); + CFDE_TxtEdtDoRecord_DeleteRange(CFDE_TxtEdtEngine * pEngine, + FX_INT32 nIndex, + FX_INT32 nCaret, + const CFX_WideString &wsRange, + FX_BOOL bSel = FALSE); + virtual void Release(); + virtual FX_BOOL Undo(); + virtual FX_BOOL Redo(); + virtual void Serialize(CFX_ByteString &bsDoRecord) const; +protected: + ~CFDE_TxtEdtDoRecord_DeleteRange(); + void Deserialize(FX_BSTR bsDoRecord); +private: + CFDE_TxtEdtEngine * m_pEngine; + FX_BOOL m_bSel; + FX_INT32 m_nIndex; + FX_INT32 m_nCaret; + CFX_WideString m_wsRange; +}; +#ifdef FDE_USEFORMATBLOCK +class CFDE_TxtEdtDoRecord_FieldInsert : public IFDE_TxtEdtDoRecord, public CFX_Object +{ +public: + CFDE_TxtEdtDoRecord_FieldInsert(FX_BSTR bsDoRecord); + CFDE_TxtEdtDoRecord_FieldInsert(CFDE_TxtEdtEngine * pEngine, + FX_INT32 nCaret, + CFDE_TxtEdtField * pField, + FX_INT32 nIndexInField, + FX_INT32 nFieldBgn, + FX_INT32 nOldFieldLength, + FX_INT32 nNewFieldLength, + const CFX_WideString &wsIns, + FX_BOOL bSel = FALSE); + virtual void Release(); + virtual FX_BOOL Undo(); + virtual FX_BOOL Redo(); + virtual void Serialize(CFX_ByteString &bsDoRecord) const; +protected: + ~CFDE_TxtEdtDoRecord_FieldInsert(); + void Deserialize(FX_BSTR bsDoRecord); + +private: + CFDE_TxtEdtEngine * m_pEngine; + FX_INT32 m_nCaret; + CFDE_TxtEdtField * m_pField; + FX_INT32 m_nIndexInField; + FX_INT32 m_nFieldBgn; + FX_INT32 m_nOldFieldLength; + FX_INT32 m_nNewFieldLength; + CFX_WideString m_wsIns; + FX_BOOL m_bSel; +}; +class CFDE_TxtEdtDoRecord_FieldDelete : public IFDE_TxtEdtDoRecord, public CFX_Object +{ +public: + CFDE_TxtEdtDoRecord_FieldDelete(FX_BSTR bsDoRecord); + CFDE_TxtEdtDoRecord_FieldDelete(CFDE_TxtEdtEngine * pEngine, + FX_INT32 nCaret, + CFDE_TxtEdtField * pField, + FX_INT32 nIndexInField, + FX_INT32 nFieldBgn, + FX_INT32 nOldLength, + FX_INT32 nNewLength, + const CFX_WideString &wsDel, + FX_BOOL bSel = FALSE); + virtual void Release(); + virtual FX_BOOL Undo(); + virtual FX_BOOL Redo(); + virtual void Serialize(CFX_ByteString &bsDoRecord) const; +protected: + ~CFDE_TxtEdtDoRecord_FieldDelete(); + void Deserialize(FX_BSTR bsDoRecord); +private: + CFDE_TxtEdtEngine * m_pEngine; + FX_INT32 m_nCaret; + CFDE_TxtEdtField * m_pField; + FX_INT32 m_nIndexInField; + FX_INT32 m_nFieldBgn; + FX_INT32 m_nOldFieldLength; + FX_INT32 m_nNewFieldLength; + CFX_WideString m_wsDel; + FX_BOOL m_bSel; +}; +class CFDE_TxtEdtDoRecord_FieldReplace : public IFDE_TxtEdtDoRecord, public CFX_Object +{ +public: + CFDE_TxtEdtDoRecord_FieldReplace(FX_BSTR bsDoRecord); + CFDE_TxtEdtDoRecord_FieldReplace( CFDE_TxtEdtEngine * pEngine, + FX_INT32 nCaret, + FX_INT32 nNewCaret, + CFDE_TxtEdtField * pField, + FX_INT32 nIndexInField, + FX_INT32 nFieldBgn, + FX_INT32 nFieldNewLength, + const CFX_WideString &wsDel, + const CFX_WideString &wsIns, + FX_BOOL bSel); + virtual void Release(); + virtual FX_BOOL Undo(); + virtual FX_BOOL Redo(); + virtual void Serialize(CFX_ByteString &bsDoRecord) const; +protected: + ~CFDE_TxtEdtDoRecord_FieldReplace(); + void Deserialize(FX_BSTR bsDoRecord); +private: + CFDE_TxtEdtEngine * m_pEngine; + FX_INT32 m_nCaret; + FX_INT32 m_nNewCaret; + CFDE_TxtEdtField * m_pField; + FX_INT32 m_nIndexInField; + FX_INT32 m_nFieldBgn; + FX_INT32 m_nFieldNewLength; + CFX_WideString m_wsDel; + CFX_WideString m_wsIns; + FX_BOOL m_bSel; +}; +#endif +#endif diff --git a/xfa/src/fee/src/fee/fde_txtedtkmpmatch.cpp b/xfa/src/fee/src/fee/fde_txtedtkmpmatch.cpp new file mode 100644 index 0000000000..7d0790bf8c --- /dev/null +++ b/xfa/src/fee/src/fee/fde_txtedtkmpmatch.cpp @@ -0,0 +1,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 "../../../foxitlib.h" +#include "fde_txtedtkmpmatch.h" diff --git a/xfa/src/fee/src/fee/fde_txtedtkmpmatch.h b/xfa/src/fee/src/fee/fde_txtedtkmpmatch.h new file mode 100644 index 0000000000..0b5b477172 --- /dev/null +++ b/xfa/src/fee/src/fee/fde_txtedtkmpmatch.h @@ -0,0 +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 + +#ifndef _FDE_KMPMATCH_H +#define _FDE_KMPMATCH_H +#endif diff --git a/xfa/src/fee/src/fee/fde_txtedtpage.cpp b/xfa/src/fee/src/fee/fde_txtedtpage.cpp new file mode 100644 index 0000000000..e0a94f81fa --- /dev/null +++ b/xfa/src/fee/src/fee/fde_txtedtpage.cpp @@ -0,0 +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 "../../../foxitlib.h" +#include "../../include/ifde_txtedtbuf.h" +#include "../../include/ifde_txtedtengine.h" +#include "../../include/ifde_txtedtpage.h" +#include "../../include/fx_wordbreak.h" +#include "fde_txtedtpage.h" +#include "fde_txtedtengine.h" +#include "fde_txtedtparag.h" +#include "fde_txtedtbuf.h" +#define FDE_TXTEDT_TOLERANCE 0.1f +IFDE_TxtEdtPage * IFDE_TxtEdtPage::Create(IFDE_TxtEdtEngine * pEngine, FX_INT32 nIndex) +{ + return (IFDE_TxtEdtPage*)FX_NEW CFDE_TxtEdtPage(pEngine, nIndex); +} +CFDE_TxtEdtTextSet::CFDE_TxtEdtTextSet(CFDE_TxtEdtPage * pPage) + : m_pPage(pPage) +{ +} +CFDE_TxtEdtTextSet::~CFDE_TxtEdtTextSet() +{ +} +FDE_VISUALOBJTYPE CFDE_TxtEdtTextSet::GetType() +{ + return FDE_VISUALOBJ_Text; +} +FX_BOOL CFDE_TxtEdtTextSet::GetBBox(FDE_HVISUALOBJ hVisualObj, CFX_RectF &bbox) +{ + return FALSE; +} +FX_BOOL CFDE_TxtEdtTextSet::GetMatrix(FDE_HVISUALOBJ hVisualObj, CFX_Matrix &matrix) +{ + return FALSE; +} +FX_BOOL CFDE_TxtEdtTextSet::GetRect(FDE_HVISUALOBJ hVisualObj, CFX_RectF &rt) +{ + rt = ((FDE_LPTEXTEDITPIECE)(hVisualObj))->rtPiece; + return TRUE; +} +FX_BOOL CFDE_TxtEdtTextSet::GetClip(FDE_HVISUALOBJ hVisualObj, CFX_RectF &rt) +{ + return FALSE; +} +FX_INT32 CFDE_TxtEdtTextSet::GetString(FDE_HVISUALOBJ hText, CFX_WideString &wsText) +{ + FDE_LPTEXTEDITPIECE pPiece = (FDE_LPTEXTEDITPIECE)hText; + FX_LPWSTR pBuffer = wsText.GetBuffer(pPiece->nCount); + for (FX_INT32 i = 0; i < pPiece->nCount; i++) { + pBuffer[i] = m_pPage->GetChar((FX_LPVOID)hText, i); + } + wsText.ReleaseBuffer(pPiece->nCount); + return pPiece->nCount; +} +IFX_Font* CFDE_TxtEdtTextSet::GetFont(FDE_HVISUALOBJ hText) +{ + return m_pPage->GetEngine()->GetEditParams()->pFont; +} +FX_FLOAT CFDE_TxtEdtTextSet::GetFontSize(FDE_HVISUALOBJ hText) +{ + return m_pPage->GetEngine()->GetEditParams()->fFontSize; +} +FX_ARGB CFDE_TxtEdtTextSet::GetFontColor(FDE_HVISUALOBJ hText) +{ + return m_pPage->GetEngine()->GetEditParams()->dwFontColor; +} +FX_INT32 CFDE_TxtEdtTextSet::GetDisplayPos(FDE_HVISUALOBJ hText, FXTEXT_CHARPOS *pCharPos, FX_BOOL bCharCode , CFX_WideString *pWSForms ) +{ + if (hText == NULL) { + return 0; + } + FDE_LPTEXTEDITPIECE pPiece = (FDE_LPTEXTEDITPIECE)hText; + FX_INT32 nLength = pPiece->nCount; + if (nLength < 1) { + return 0; + } + CFDE_TxtEdtEngine * pEngine = (CFDE_TxtEdtEngine*)(m_pPage->GetEngine()); + const FDE_TXTEDTPARAMS * pTextParams = pEngine->GetEditParams(); + IFX_TxtBreak * pBreak = pEngine->GetTextBreak(); + FX_DWORD dwLayoutStyle = pBreak->GetLayoutStyles(); + FX_TXTRUN tr; + tr.pAccess = m_pPage; + tr.pIdentity = (FX_LPVOID)hText; + tr.pStr = NULL; + tr.pWidths = NULL; + tr.iLength = nLength; + tr.pFont = pTextParams->pFont; + tr.fFontSize = pTextParams->fFontSize; + tr.dwStyles = dwLayoutStyle; + tr.iCharRotation = pTextParams->nCharRotation; + tr.dwCharStyles = pPiece->dwCharStyles; + tr.pRect = &(pPiece->rtPiece); + tr.wLineBreakChar = pTextParams->wLineBreakChar; + return pBreak->GetDisplayPos(&tr, pCharPos, bCharCode, pWSForms); +} +FX_INT32 CFDE_TxtEdtTextSet::GetCharRects(FDE_HVISUALOBJ hText, CFX_RectFArray &rtArray) +{ + return GetCharRects_Impl(hText, rtArray); +} +FX_INT32 CFDE_TxtEdtTextSet::GetCharRects_Impl(FDE_HVISUALOBJ hText, CFX_RectFArray &rtArray, FX_BOOL bBBox ) +{ + if (hText == NULL) { + return 0; + } + FDE_LPTEXTEDITPIECE pPiece = (FDE_LPTEXTEDITPIECE)hText; + CFDE_TxtEdtEngine * pEngine = (CFDE_TxtEdtEngine*)(m_pPage->GetEngine()); + FX_INT32 nLength = pPiece->nCount; + if (nLength < 1) { + return 0; + } + const FDE_TXTEDTPARAMS * pTextParams = pEngine->GetEditParams(); + FX_DWORD dwLayoutStyle = pEngine->GetTextBreak()->GetLayoutStyles(); + FX_TXTRUN tr; + tr.pAccess = m_pPage; + tr.pIdentity = (FX_LPVOID)hText; + tr.pStr = NULL; + tr.pWidths = NULL; + tr.iLength = nLength; + tr.pFont = pTextParams->pFont; + tr.fFontSize = pTextParams->fFontSize; + tr.dwStyles = dwLayoutStyle; + tr.iCharRotation = pTextParams->nCharRotation; + tr.dwCharStyles = pPiece->dwCharStyles; + tr.pRect = &(pPiece->rtPiece); + tr.wLineBreakChar = pTextParams->wLineBreakChar; + return pEngine->GetTextBreak()->GetCharRects(&tr, rtArray, bBBox); +} +CFDE_TxtEdtPage::CFDE_TxtEdtPage(IFDE_TxtEdtEngine * pEngine, FX_INT32 nPageIndex) + : m_pIter(NULL) + , m_pTextSet(NULL) + , m_nRefCount(0) + , m_nPageStart(-1) + , m_nCharCount(0) + , m_nPageIndex(nPageIndex) + , m_bLoaded(FALSE) + , m_bLastPage(FALSE) + , m_pCharWidth(NULL) + , m_pBgnParag(NULL) + , m_pEndParag(NULL) +{ + FXSYS_memset(&m_rtPage, 0, sizeof(CFX_RectF)); + FXSYS_memset(&m_rtPageMargin, 0, sizeof(CFX_RectF)); + FXSYS_memset(&m_rtPageContents, 0, sizeof(CFX_RectF)); + FXSYS_memset(&m_rtPageCanvas, 0, sizeof(CFX_RectF)); + m_pEditEngine = (CFDE_TxtEdtEngine*)pEngine; +} +CFDE_TxtEdtPage::~CFDE_TxtEdtPage() +{ + m_PieceMassArr.RemoveAll(TRUE); + if (m_pTextSet) { + delete m_pTextSet; + m_pTextSet = NULL; + } + if (m_pCharWidth) { + delete [] m_pCharWidth; + m_pCharWidth = NULL; + } + if (m_pIter != NULL) { + m_pIter->Release(); + m_pIter = NULL; + } +} +void CFDE_TxtEdtPage::Release() +{ + delete this; +} +IFDE_TxtEdtEngine * CFDE_TxtEdtPage::GetEngine() const +{ + return (IFDE_TxtEdtEngine*)m_pEditEngine; +} +FDE_VISUALOBJTYPE CFDE_TxtEdtPage::GetType() +{ + return FDE_VISUALOBJ_Text; +} +FX_BOOL CFDE_TxtEdtPage::GetBBox(FDE_HVISUALOBJ hVisualObj, CFX_RectF &bbox) +{ + return FALSE; +} +FX_BOOL CFDE_TxtEdtPage::GetMatrix(FDE_HVISUALOBJ hVisualObj, CFX_Matrix &matrix) +{ + return FALSE; +} +FX_BOOL CFDE_TxtEdtPage::GetRect(FDE_HVISUALOBJ hVisualObj, CFX_RectF &rt) +{ + return FALSE; +} +FX_BOOL CFDE_TxtEdtPage::GetClip(FDE_HVISUALOBJ hVisualObj, CFX_RectF &rt) +{ + return FALSE; +} +FX_INT32 CFDE_TxtEdtPage::GetCharRect(FX_INT32 nIndex, CFX_RectF &rect, FX_BOOL bBBox ) const +{ + FXSYS_assert(m_nRefCount > 0); + FXSYS_assert(nIndex >= 0 && nIndex < m_nCharCount); + if (m_nRefCount < 1) { + return 0; + } + FX_INT32 nCount = m_PieceMassArr.GetSize(); + for (FX_INT32 i = 0; i < nCount; i ++) { + const FDE_LPTEXTEDITPIECE pPiece = m_PieceMassArr.GetPtrAt(i); + if (nIndex >= pPiece->nStart && nIndex < (pPiece->nStart + pPiece->nCount)) { + CFX_RectFArray rectArr; + if (bBBox) { + m_pTextSet->GetCharRects_Impl((FDE_HVISUALOBJ)pPiece, rectArr, bBBox); + } else { + m_pTextSet->GetCharRects((FDE_HVISUALOBJ)pPiece, rectArr); + } + rect = rectArr[nIndex - pPiece->nStart]; + return pPiece->nBidiLevel; + } + } + FXSYS_assert(0); + return 0; +} +FX_INT32 CFDE_TxtEdtPage::GetCharIndex(const CFX_PointF &fPoint, FX_BOOL &bBefore) +{ + FX_BOOL bVertical = m_pEditEngine->GetEditParams()->dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical; + CFX_PointF ptF = fPoint; + NormalizePt2Rect(ptF, m_rtPageContents, FDE_TXTEDT_TOLERANCE); + FX_INT32 nCount = m_PieceMassArr.GetSize(); + CFX_RectF rtLine; + FX_INT32 nBgn = 0; + FX_INT32 nEnd = 0; + FX_BOOL bInLine = FALSE; + FX_INT32 i = 0; + for (i = 0; i < nCount; i ++) { + const FDE_LPTEXTEDITPIECE pPiece = m_PieceMassArr.GetPtrAt(i); + if (!bInLine && (bVertical ? (pPiece->rtPiece.left <= ptF.x && pPiece->rtPiece.right() > ptF.x) \ + : (pPiece->rtPiece.top <= ptF.y && pPiece->rtPiece.bottom() > ptF.y))) { + nBgn = nEnd = i; + rtLine = pPiece->rtPiece; + bInLine = TRUE; + } else if (bInLine) { + if (bVertical ? (!(pPiece->rtPiece.left <= ptF.x && pPiece->rtPiece.right() > ptF.x)) : \ + (pPiece->rtPiece.bottom() <= ptF.y || pPiece->rtPiece.top > ptF.y)) { + nEnd = i - 1; + break; + } else { + rtLine.Union(pPiece->rtPiece); + } + } + } + NormalizePt2Rect(ptF, rtLine, FDE_TXTEDT_TOLERANCE); + FX_INT32 nCaret = 0; + FDE_LPTEXTEDITPIECE pPiece = NULL; + for (i = nBgn; i <= nEnd; i ++) { + pPiece = m_PieceMassArr.GetPtrAt(i); + nCaret = m_nPageStart + pPiece->nStart; + if (pPiece->rtPiece.Contains(ptF)) { + CFX_RectFArray rectArr; + m_pTextSet->GetCharRects((FDE_HVISUALOBJ)pPiece, rectArr); + FX_INT32 nRtCount = rectArr.GetSize(); + for (FX_INT32 j = 0; j < nRtCount; j ++) { + if (rectArr[j].Contains(ptF)) { + nCaret = m_nPageStart + pPiece->nStart + j; + if (nCaret >= m_pEditEngine->GetTextBufLength()) { + bBefore = TRUE; + return m_pEditEngine->GetTextBufLength(); + } + FX_WCHAR wChar = m_pEditEngine->GetTextBuf()->GetCharByIndex(nCaret); + if (wChar == L'\n' || wChar == L'\r') { + if (wChar == L'\n') { + if (m_pEditEngine->GetTextBuf()->GetCharByIndex(nCaret - 1) == L'\r') { + nCaret --; + } + } + bBefore = TRUE; + return nCaret; + } + if (bVertical ? (ptF.y > ((rectArr[j].top + rectArr[j].bottom()) / 2)) : \ + (ptF.x > ((rectArr[j].left + rectArr[j].right()) / 2))) { + bBefore = FX_IsOdd(pPiece->nBidiLevel); + } else { + bBefore = !FX_IsOdd(pPiece->nBidiLevel); + } + return nCaret; + } + } + } + } + bBefore = TRUE; + return nCaret; +} +FX_INT32 CFDE_TxtEdtPage::GetCharStart() const +{ + return m_nPageStart; +} +FX_INT32 CFDE_TxtEdtPage::GetCharCount() const +{ + return m_nCharCount; +} +FX_INT32 CFDE_TxtEdtPage::GetDisplayPos(const CFX_RectF &rtClip, FXTEXT_CHARPOS *&pCharPos, FX_LPRECTF pBBox ) const +{ + pCharPos = (FXTEXT_CHARPOS*)FDE_Alloc(sizeof(FXTEXT_CHARPOS) * m_nCharCount); + FX_INT32 nCharPosCount = 0; + FDE_HVISUALOBJ hVisualObj = NULL; + FX_INT32 nVisualObjCount = m_PieceMassArr.GetSize(); + FXTEXT_CHARPOS* pos = pCharPos; + CFX_RectF rtObj; + for (FX_INT32 i = 0; i < nVisualObjCount; i ++) { + hVisualObj = (FDE_HVISUALOBJ)m_PieceMassArr.GetPtrAt(i); + m_pTextSet->GetRect(hVisualObj, rtObj); + if (!rtClip.IntersectWith(rtObj)) { + continue; + } + FX_INT32 nCount = m_pTextSet->GetDisplayPos(hVisualObj, pos, FALSE); + nCharPosCount += nCount; + pos += nCount; + } + if ((nCharPosCount * 5) < (m_nCharCount << 2)) { + FX_INT32 nLength = sizeof(FXTEXT_CHARPOS) * nCharPosCount; + FXTEXT_CHARPOS * pTemp = (FXTEXT_CHARPOS*)FDE_Alloc(nLength); + FXSYS_memcpy(pTemp, pCharPos, nLength); + FDE_Free(pCharPos); + pCharPos = pTemp; + } + return nCharPosCount; +} +void CFDE_TxtEdtPage::CalcRangeRectArray(FX_INT32 nStart, FX_INT32 nCount, CFX_RectFArray &RectFArr) const +{ + FX_INT32 nPieceCount = m_PieceMassArr.GetSize(); + FX_INT32 nEnd = nStart + nCount - 1; + FX_BOOL bInRange = FALSE; + for (FX_INT32 i = 0; i < nPieceCount; i ++) { + FDE_LPTEXTEDITPIECE piece = m_PieceMassArr.GetPtrAt(i); + if (!bInRange) { + if (nStart >= piece->nStart && nStart < (piece->nStart + piece->nCount)) { + FX_INT32 nRangeEnd = piece->nCount - 1; + FX_BOOL bEnd = FALSE; + if (nEnd >= piece->nStart && nEnd < (piece->nStart + piece->nCount)) { + nRangeEnd = nEnd - piece->nStart; + bEnd = TRUE; + } + CFX_RectFArray rcArr; + m_pTextSet->GetCharRects((FDE_HVISUALOBJ)piece, rcArr); + FX_INT32 nSize = rcArr.GetSize(); + CFX_RectF rectPiece = rcArr[nStart - piece->nStart]; + rectPiece.Union(rcArr[nRangeEnd]); + RectFArr.Add(rectPiece); + if (bEnd) { + return; + } + bInRange = TRUE; + } + } else { + if (nEnd >= piece->nStart && nEnd < (piece->nStart + piece->nCount)) { + CFX_RectFArray rcArr; + m_pTextSet->GetCharRects((FDE_HVISUALOBJ)piece, rcArr); + CFX_RectF rectPiece = rcArr[0]; + rectPiece.Union(rcArr[nEnd - piece->nStart]); + RectFArr.Add(rectPiece); + return; + } + RectFArr.Add(piece->rtPiece); + } + } + return; +} +FX_INT32 CFDE_TxtEdtPage::SelectWord(const CFX_PointF &fPoint, FX_INT32 &nCount) +{ + if (m_nRefCount < 0) { + return - 1; + } + IFDE_TxtEdtBuf * pBuf = m_pEditEngine->GetTextBuf(); + FX_BOOL bBefore; + FX_INT32 nIndex = GetCharIndex(fPoint, bBefore); + if (nIndex == m_pEditEngine->GetTextBufLength()) { + nIndex = m_pEditEngine->GetTextBufLength() - 1; + } + if (nIndex < 0) { + return -1; + } + IFX_WordBreak * pIter = FX_WordBreak_Create(); + pIter->Attach(FX_NEW CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)pBuf)); + pIter->SetAt(nIndex); + nCount = pIter->GetWordLength(); + FX_INT32 nRet = pIter->GetWordPos(); + pIter->Release(); + return nRet; +} +FX_BOOL CFDE_TxtEdtPage::IsLoaded(FX_LPCRECTF pClipBox ) +{ + return m_bLoaded; +} +FX_INT32 CFDE_TxtEdtPage::LoadPage(FX_LPCRECTF pClipBox , IFX_Pause *pPause ) +{ + if (m_nRefCount > 0) { + m_nRefCount ++; + return m_nRefCount; + } + IFDE_TxtEdtBuf * pBuf = m_pEditEngine->GetTextBuf(); + const FDE_TXTEDTPARAMS * pParams = m_pEditEngine->GetEditParams(); + if (m_pIter != NULL) { + m_pIter->Release(); + } + FX_WCHAR wcAlias = 0; + if (pParams->dwMode & FDE_TEXTEDITMODE_Password) { + wcAlias = m_pEditEngine->GetAliasChar(); + } + m_pIter = FX_NEW CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)pBuf, wcAlias); + IFX_TxtBreak * pBreak = m_pEditEngine->GetTextBreak(); + pBreak->EndBreak(FX_TXTBREAK_ParagraphBreak); + pBreak->ClearBreakPieces(); + FX_INT32 nLineCount = m_pEditEngine->GetLineCount(); + FX_INT32 nPageLineCount = m_pEditEngine->GetPageLineCount(); + FX_INT32 nLength = pBuf->GetTextLength(); + FX_INT32 nStartLine = nPageLineCount * m_nPageIndex; + FX_INT32 nEndLine = FX_MIN((nStartLine + nPageLineCount - 1), (m_pEditEngine->GetLineCount() - 1)); + FX_INT32 nPageStart, nPageEnd, nTemp, nBgnParag, nStartLineInParag, nEndParag, nEndLineInParag; + nBgnParag = m_pEditEngine->Line2Parag(0, 0, nStartLine, nStartLineInParag); + m_pBgnParag = (CFDE_TxtEdtParag*)m_pEditEngine->GetParag(nBgnParag); + m_pBgnParag->LoadParag(); + m_pBgnParag->GetLineRange(nStartLine - nStartLineInParag, nPageStart, nTemp); + nEndParag = m_pEditEngine->Line2Parag(nBgnParag, nStartLineInParag, nEndLine, nEndLineInParag); + m_pEndParag = (CFDE_TxtEdtParag*)m_pEditEngine->GetParag(nEndParag); + m_pEndParag->LoadParag(); + m_pEndParag->GetLineRange(nEndLine - nEndLineInParag, nPageEnd, nTemp); + nPageEnd += (nTemp - 1); + FX_BOOL bVertial = pParams->dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical; + FX_BOOL bLineReserve = pParams->dwLayoutStyles & FDE_TEXTEDITLAYOUT_LineReserve; + FX_FLOAT fLineStart = bVertial ? (bLineReserve ? (pParams->fPlateWidth - pParams->fLineSpace) : 0.0f) : 0.0f; + FX_FLOAT fLineStep = (bVertial && bLineReserve) ? (-pParams->fLineSpace) : pParams->fLineSpace; + FX_FLOAT fLinePos = fLineStart; + if (m_pTextSet == NULL) { + m_pTextSet = FX_NEW CFDE_TxtEdtTextSet(this); + } + m_PieceMassArr.RemoveAll(TRUE); + FX_DWORD dwBreakStatus = FX_TXTBREAK_None; + FX_INT32 nLineStart = nPageStart; + FX_INT32 nPieceStart = 0; + if (m_pCharWidth != NULL) { + delete [] m_pCharWidth; + } + m_pCharWidth = new FX_INT32[nPageEnd - nPageStart + 1]; + pBreak->EndBreak(FX_TXTBREAK_ParagraphBreak); + pBreak->ClearBreakPieces(); + m_nPageStart = nPageStart; + m_nCharCount = nPageEnd - nPageStart + 1; + FX_BOOL bReload = FALSE; + FX_FLOAT fDefCharWidth = 0; + IFX_CharIter * pIter = m_pIter->Clone(); + pIter->SetAt(nPageStart); + m_pIter->SetAt(nPageStart); + FX_INT32 nTextEnd = m_pEditEngine->GetTextBufLength(); + FX_BOOL bFirstPiece = TRUE; + do { + if (bReload) { + dwBreakStatus = pBreak->EndBreak(FX_TXTBREAK_ParagraphBreak); + } else { + FX_WCHAR wAppend = pIter->GetChar(); + dwBreakStatus = pBreak->AppendChar(wAppend); + } + if (pIter->GetAt() == nPageEnd && dwBreakStatus < FX_TXTBREAK_LineBreak) { + dwBreakStatus = pBreak->EndBreak(FX_TXTBREAK_ParagraphBreak); + } + if (dwBreakStatus > FX_TXTBREAK_PieceBreak) { + FX_INT32 nPieceCount = pBreak->CountBreakPieces(); + for (FX_INT32 j = 0; j < nPieceCount; j ++) { + const CFX_TxtPiece * pPiece = pBreak->GetBreakPiece(j); + FDE_TEXTEDITPIECE TxtEdtPiece; + FXSYS_memset(&TxtEdtPiece, 0, sizeof(FDE_TEXTEDITPIECE)); + TxtEdtPiece.nBidiLevel = pPiece->m_iBidiLevel; + TxtEdtPiece.nCount = pPiece->GetLength(); + TxtEdtPiece.nStart = nPieceStart; + TxtEdtPiece.dwCharStyles = pPiece->m_dwCharStyles; + if (FX_IsOdd(pPiece->m_iBidiLevel)) { + TxtEdtPiece.dwCharStyles |= FX_TXTCHARSTYLE_OddBidiLevel; + } + FX_FLOAT fParaBreakWidth = 0.0f; + if (pPiece->m_dwStatus > FX_TXTBREAK_PieceBreak) { + FX_WCHAR wRtChar = pParams->wLineBreakChar; + if (TxtEdtPiece.nCount >= 2) { + FX_WCHAR wChar = pBuf->GetCharByIndex(m_nPageStart + TxtEdtPiece.nStart + TxtEdtPiece.nCount - 1); + FX_WCHAR wCharPre = pBuf->GetCharByIndex(m_nPageStart + TxtEdtPiece.nStart + TxtEdtPiece.nCount - 2); + if (wChar == wRtChar) { + fParaBreakWidth += fDefCharWidth; + } + if (wCharPre == wRtChar) { + fParaBreakWidth += fDefCharWidth; + } + } else if (TxtEdtPiece.nCount >= 1) { + FX_WCHAR wChar = pBuf->GetCharByIndex(m_nPageStart + TxtEdtPiece.nStart + TxtEdtPiece.nCount - 1); + if (wChar == wRtChar) { + fParaBreakWidth += fDefCharWidth; + } + } + } + if (pParams->dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) { + TxtEdtPiece.rtPiece.left = fLinePos; + TxtEdtPiece.rtPiece.top = (FX_FLOAT)pPiece->m_iStartPos / 20000.0f; + TxtEdtPiece.rtPiece.width = pParams->fLineSpace; + TxtEdtPiece.rtPiece.height = (FX_FLOAT)pPiece->m_iWidth / 20000.0f + fParaBreakWidth; + } else { + TxtEdtPiece.rtPiece.left = (FX_FLOAT)pPiece->m_iStartPos / 20000.0f; + TxtEdtPiece.rtPiece.top = fLinePos; + TxtEdtPiece.rtPiece.width = (FX_FLOAT)pPiece->m_iWidth / 20000.0f + fParaBreakWidth; + TxtEdtPiece.rtPiece.height = pParams->fLineSpace; + } + if (bFirstPiece) { + m_rtPageContents = TxtEdtPiece.rtPiece; + bFirstPiece = FALSE; + } else { + m_rtPageContents.Union(TxtEdtPiece.rtPiece); + } + nPieceStart += TxtEdtPiece.nCount; + m_PieceMassArr.Add(TxtEdtPiece); + for (FX_INT32 k = 0; k < TxtEdtPiece.nCount; k ++) { + CFX_Char* ptc = pPiece->GetCharPtr(k); + m_pCharWidth[TxtEdtPiece.nStart + k] = ptc->m_iCharWidth; + } + } + fLinePos += fLineStep; + pBreak->ClearBreakPieces(); + } + if (pIter->GetAt() == nPageEnd && dwBreakStatus == FX_TXTBREAK_LineBreak) { + bReload = TRUE; + pIter->Next(TRUE); + } + } while (pIter->Next(FALSE) && (pIter->GetAt() <= nPageEnd)); + if (m_rtPageContents.left != 0) { + FX_FLOAT fDelta = 0.0f; + if (m_rtPageContents.width < pParams->fPlateWidth) { + if (pParams->dwAlignment & FDE_TEXTEDITALIGN_Right) { + fDelta = pParams->fPlateWidth - m_rtPageContents.width; + } else if (pParams->dwAlignment & FDE_TEXTEDITALIGN_Center) { + if ((pParams->dwLayoutStyles & FDE_TEXTEDITLAYOUT_CombText) && m_nCharCount > 1) { + FX_INT32 nCount = m_nCharCount - 1; + FX_INT32 n = (m_pEditEngine->m_nLimit - nCount) / 2; + fDelta = (m_rtPageContents.width / nCount) * n; + } else { + fDelta = (pParams->fPlateWidth - m_rtPageContents.width) / 2; + } + } + } + FX_FLOAT fOffset = m_rtPageContents.left - fDelta; + FX_INT32 nCount = m_PieceMassArr.GetSize(); + for (FX_INT32 i = 0; i < nCount; i ++) { + FDE_LPTEXTEDITPIECE pPiece = m_PieceMassArr.GetPtrAt(i); + pPiece->rtPiece.Offset(-fOffset, 0.0f); + } + m_rtPageContents.Offset(-fOffset, 0.0f); + } + if (m_pEditEngine->GetEditParams()->dwLayoutStyles & FDE_TEXTEDITLAYOUT_LastLineHeight) { + m_rtPageContents.height -= pParams->fLineSpace - pParams->fFontSize; + FX_INT32 nCount = m_PieceMassArr.GetSize(); + FDE_LPTEXTEDITPIECE pPiece = m_PieceMassArr.GetPtrAt(nCount - 1); + pPiece->rtPiece.height = pParams->fFontSize; + } + pIter->Release(); + m_nRefCount = 1; + m_bLoaded = TRUE; + return 0; +} +void CFDE_TxtEdtPage::UnloadPage(FX_LPCRECTF pClipBox ) +{ + FXSYS_assert(m_nRefCount > 0); + m_nRefCount --; + if (m_nRefCount == 0) { + m_PieceMassArr.RemoveAll(); + if (m_pTextSet) { + delete m_pTextSet; + m_pTextSet = NULL; + } + if (m_pCharWidth) { + delete [] m_pCharWidth; + m_pCharWidth = NULL; + } + if (m_pBgnParag) { + m_pBgnParag->UnloadParag(); + } + if (m_pEndParag) { + m_pEndParag->UnloadParag(); + } + if (m_pIter) { + m_pIter->Release(); + m_pIter = NULL; + } + m_pBgnParag = NULL; + m_pEndParag = NULL; + } + return; +} +const CFX_RectF& CFDE_TxtEdtPage::GetContentsBox() +{ + return m_rtPageContents; +} +FX_POSITION CFDE_TxtEdtPage::GetFirstPosition(FDE_HVISUALOBJ hCanvas) +{ + if (m_PieceMassArr.GetSize() < 1) { + return NULL; + } + return (FX_POSITION)1; +} +FDE_HVISUALOBJ CFDE_TxtEdtPage::GetNext(FDE_HVISUALOBJ hCanvas, FX_POSITION &pos, IFDE_VisualSet *&pVisualSet) +{ + if (m_pTextSet == NULL) { + pos = NULL; + return NULL; + } + FX_INT32 nPos = (FX_INT32)(FX_UINTPTR)pos; + pVisualSet = m_pTextSet; + if (nPos + 1 > m_PieceMassArr.GetSize()) { + pos = NULL; + } else { + pos = (FX_POSITION)(FX_UINTPTR)(nPos + 1); + } + return (FDE_HVISUALOBJ)(m_PieceMassArr.GetPtrAt(nPos - 1)); +} +FDE_HVISUALOBJ CFDE_TxtEdtPage::GetParentCanvas(FDE_HVISUALOBJ hCanvas, IFDE_VisualSet *&pVisualSet) +{ + return NULL; +} +FX_WCHAR CFDE_TxtEdtPage::GetChar(FX_LPVOID pIdentity, FX_INT32 index) const +{ + FX_INT32 nIndex = m_nPageStart + ((FDE_LPTEXTEDITPIECE)pIdentity)->nStart + index; + if (nIndex != m_pIter->GetAt()) { + m_pIter->SetAt(nIndex); + } + FX_WCHAR wChar = m_pIter->GetChar(); + m_pIter->Next(); + return wChar; +} +FX_INT32 CFDE_TxtEdtPage::GetWidth(FX_LPVOID pIdentity, FX_INT32 index) const +{ + FX_INT32 nWidth = m_pCharWidth[((FDE_LPTEXTEDITPIECE)pIdentity)->nStart + index]; + return nWidth; +} +void CFDE_TxtEdtPage::NormalizePt2Rect(CFX_PointF &ptF, const CFX_RectF &rtF, FX_FLOAT fTolerance) const +{ + if (rtF.Contains(ptF.x, ptF.y)) { + return; + } + if (ptF.x < rtF.left) { + ptF.x = rtF.left; + } else if (ptF.x >= rtF.right()) { + ptF.x = rtF.right() - fTolerance; + } + if (ptF.y < rtF.top) { + ptF.y = rtF.top; + } else if (ptF.y >= rtF.bottom()) { + ptF.y = rtF.bottom() - fTolerance; + } +} diff --git a/xfa/src/fee/src/fee/fde_txtedtpage.h b/xfa/src/fee/src/fee/fde_txtedtpage.h new file mode 100644 index 0000000000..36021b66aa --- /dev/null +++ b/xfa/src/fee/src/fee/fde_txtedtpage.h @@ -0,0 +1,130 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FDE_TXTEDTPAGE_H +#define _FDE_TXTEDTPAGE_H +class CFDE_TxtEdtEngine; +class IFX_CharIter; +class CFDE_TxtEdtPage; +class CFDE_TxtEdtLineExt; +class CFDE_TxtEdtTextSet; +class CFDE_TxtEdtParag; +enum FDE_TXTEDT_CHARTYPE { + FDE_TXTEDT_CHARTYPE_Unknown = 0 , + FDE_TXTEDT_CHARTYPE_Tab , + FDE_TXTEDT_CHARTYPE_Space , + FDE_TXTEDT_CHARTYPE_Punctuation , + FDE_TXTEDT_CHARTYPE_LineBreak , + FDE_TXTEDT_CHARTYPE_Number , + FDE_TXTEDT_CHARTYPE_Char , + FDE_TXTEDT_CHARTYPE_CJK , +}; +static FDE_TXTEDT_CHARTYPE FDE_GetEditSelCharType(FX_WCHAR wChar) +{ + if (wChar == 0x9) { + return FDE_TXTEDT_CHARTYPE_Tab; + } else if (wChar == 0x20 || wChar == 0xA0) { + return FDE_TXTEDT_CHARTYPE_Space; + } else if (wChar == 0x9 || wChar == 0x20 || wChar == 0xA0 || (wChar >= L'!' && wChar <= L'/') || (wChar >= L':' && wChar <= L'@') || (wChar >= L'[' && wChar <= L'^') || + (wChar >= L'{' && wChar <= L'~') || wChar == 0x60) { + return FDE_TXTEDT_CHARTYPE_Punctuation; + } else if (wChar == 0x0a || wChar == 0x0d) { + return FDE_TXTEDT_CHARTYPE_LineBreak; + } else if (wChar >= '0' && wChar <= '9') { + return FDE_TXTEDT_CHARTYPE_Number; + } else if ((wChar >= 0x2e80 && wChar <= 0x2eff) || (wChar >= 0x3000 && wChar <= 0x303f) || (wChar >= 0x31c0 && wChar <= 0x31ef) + || (wChar >= 0x3200 && wChar <= 0x32ff) || (wChar >= 0x3300 && wChar <= 0x33ff) || (wChar >= 0x3400 && wChar <= 0x4dbf) + || (wChar >= 0x4e00 && wChar <= 0x9fff) || (wChar >= 0xf900 && wChar <= 0xfaff) || (wChar >= 0xfe30 && wChar <= 0xfe4f)) { + return FDE_TXTEDT_CHARTYPE_CJK; + } else { + return FDE_TXTEDT_CHARTYPE_Char; + } +} +typedef struct _FDE_TXTEDTPIECE : public CFX_Object { + FX_INT32 nStart; + FX_INT32 nCount; + FX_INT32 nBidiLevel; + CFX_RectF rtPiece; + FX_DWORD dwCharStyles; +} FDE_TEXTEDITPIECE, * FDE_LPTEXTEDITPIECE; +typedef CFX_MassArrayTemplate CFDE_TXTEDTPieceMassArray; +class CFDE_TxtEdtTextSet : public IFDE_TextSet, public CFX_Object +{ +public: + CFDE_TxtEdtTextSet(CFDE_TxtEdtPage * pPage); + ~CFDE_TxtEdtTextSet(); + + virtual FDE_VISUALOBJTYPE GetType(); + virtual FX_BOOL GetBBox(FDE_HVISUALOBJ hVisualObj, CFX_RectF &bbox); + virtual FX_BOOL GetMatrix(FDE_HVISUALOBJ hVisualObj, CFX_Matrix &matrix); + virtual FX_BOOL GetRect(FDE_HVISUALOBJ hVisualObj, CFX_RectF &rt); + virtual FX_BOOL GetClip(FDE_HVISUALOBJ hVisualObj, CFX_RectF &rt); + virtual FX_INT32 GetString(FDE_HVISUALOBJ hText, CFX_WideString &wsText); + virtual IFX_Font* GetFont(FDE_HVISUALOBJ hText); + virtual FX_FLOAT GetFontSize(FDE_HVISUALOBJ hText); + virtual FX_ARGB GetFontColor(FDE_HVISUALOBJ hText); + virtual FX_INT32 GetDisplayPos(FDE_HVISUALOBJ hText, FXTEXT_CHARPOS *pCharPos, FX_BOOL bCharCode = FALSE, CFX_WideString *pWSForms = NULL); + virtual FX_INT32 GetCharRects(FDE_HVISUALOBJ hText, CFX_RectFArray &rtArray); + virtual FX_INT32 GetCharRects_Impl(FDE_HVISUALOBJ hText, CFX_RectFArray &rtArray, FX_BOOL bBBox = FALSE); +private: + + CFDE_TxtEdtPage * m_pPage; +}; +class CFDE_TxtEdtPage : public CFX_Object, public IFDE_TxtEdtPage +{ +public: + CFDE_TxtEdtPage(IFDE_TxtEdtEngine * pEngine, FX_INT32 nLineIndex); + + virtual void Release(); + virtual IFDE_TxtEdtEngine * GetEngine() const; + + virtual FDE_VISUALOBJTYPE GetType(); + virtual FX_BOOL GetBBox(FDE_HVISUALOBJ hVisualObj, CFX_RectF &bbox); + virtual FX_BOOL GetMatrix(FDE_HVISUALOBJ hVisualObj, CFX_Matrix &matrix); + virtual FX_BOOL GetRect(FDE_HVISUALOBJ hVisualObj, CFX_RectF &rt); + virtual FX_BOOL GetClip(FDE_HVISUALOBJ hVisualObj, CFX_RectF &rt); + virtual FX_INT32 GetCharRect(FX_INT32 nIndex, CFX_RectF &rect, FX_BOOL bBBox = FALSE) const; + virtual FX_INT32 GetCharIndex(const CFX_PointF &fPoint, FX_BOOL &bBefore); + virtual FX_INT32 SelectWord(const CFX_PointF &fPoint, FX_INT32 &nCount); + virtual FX_INT32 GetCharStart() const; + virtual FX_INT32 GetCharCount() const; + virtual void CalcRangeRectArray(FX_INT32 nStart, FX_INT32 nCount, CFX_RectFArray &RectFArr) const; + virtual FX_INT32 GetDisplayPos(const CFX_RectF &rtClip, FXTEXT_CHARPOS *&pCharPos, FX_LPRECTF pBBox) const; + + virtual FX_BOOL IsLoaded(FX_LPCRECTF pClipBox = NULL); + virtual FX_INT32 LoadPage(FX_LPCRECTF pClipBox = NULL, IFX_Pause *pPause = NULL); + virtual void UnloadPage(FX_LPCRECTF pClipBox = NULL); + + virtual const CFX_RectF& GetContentsBox(); + virtual FX_POSITION GetFirstPosition(FDE_HVISUALOBJ hCanvas); + virtual FDE_HVISUALOBJ GetNext(FDE_HVISUALOBJ hCanvas, FX_POSITION &pos, IFDE_VisualSet *&pVisualSet); + virtual FDE_HVISUALOBJ GetParentCanvas(FDE_HVISUALOBJ hCanvas, IFDE_VisualSet *&pVisualSet); + virtual FX_WCHAR GetChar(FX_LPVOID pIdentity, FX_INT32 index) const; + virtual FX_INT32 GetWidth(FX_LPVOID pIdentity, FX_INT32 index) const; +protected: + virtual ~CFDE_TxtEdtPage(); +private: + void NormalizePt2Rect(CFX_PointF &ptF, const CFX_RectF &rtF, FX_FLOAT fTolerance) const; + IFX_CharIter *m_pIter; + CFDE_TxtEdtTextSet *m_pTextSet; + CFDE_TxtEdtEngine *m_pEditEngine; + CFDE_TXTEDTPieceMassArray m_PieceMassArr; + CFDE_TxtEdtParag * m_pBgnParag; + CFDE_TxtEdtParag * m_pEndParag; + + FX_INT32 m_nRefCount; + FX_INT32 m_nPageStart; + FX_INT32 m_nCharCount; + FX_INT32 m_nPageIndex; + FX_BOOL m_bLoaded; + FX_BOOL m_bLastPage; + CFX_RectF m_rtPage; + CFX_RectF m_rtPageMargin; + CFX_RectF m_rtPageContents; + CFX_RectF m_rtPageCanvas; + FX_INT32* m_pCharWidth; +}; +#endif diff --git a/xfa/src/fee/src/fee/fde_txtedtparag.cpp b/xfa/src/fee/src/fee/fde_txtedtparag.cpp new file mode 100644 index 0000000000..9887ddcd3c --- /dev/null +++ b/xfa/src/fee/src/fee/fde_txtedtparag.cpp @@ -0,0 +1,149 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../../include/ifde_txtedtbuf.h" +#include "../../include/ifde_txtedtengine.h" +#include "../../include/fx_wordbreak.h" +#include "fde_txtedtparag.h" +#include "fde_txtedtengine.h" +#include "fde_txtedtbuf.h" +CFDE_TxtEdtParag::CFDE_TxtEdtParag(CFDE_TxtEdtEngine * pEngine) + : m_nLineCount(0) + , m_nCharStart(0) + , m_nCharCount(0) + , m_lpData(NULL) + , m_pEngine(pEngine) +{ + FXSYS_assert(m_pEngine); +} +CFDE_TxtEdtParag::~CFDE_TxtEdtParag() +{ + if (m_lpData != NULL) { + FX_Free(m_lpData); + } +} +void CFDE_TxtEdtParag::LoadParag() +{ + if (m_lpData != NULL) { + ((FX_INT32*)m_lpData)[0]++; + return; + } + IFX_TxtBreak * pTxtBreak = m_pEngine->GetTextBreak(); + IFDE_TxtEdtBuf * pTxtBuf = m_pEngine->GetTextBuf(); + const FDE_TXTEDTPARAMS *pParam = m_pEngine->GetEditParams(); + FX_WCHAR wcAlias = 0; + if (pParam->dwMode & FDE_TEXTEDITMODE_Password) { + wcAlias = m_pEngine->GetAliasChar(); + } + IFX_CharIter * pIter = FX_NEW CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)pTxtBuf, wcAlias); + pIter->SetAt(m_nCharStart); + FX_INT32 nEndIndex = m_nCharStart + m_nCharCount; + CFX_ArrayTemplate LineBaseArr; + FX_BOOL bReload = FALSE; + FX_DWORD dwBreakStatus = FX_TXTBREAK_None; + FX_INT32 nTextEnd = m_pEngine->GetTextBufLength(); + do { + if (bReload) { + dwBreakStatus = pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak); + } else { + FX_WCHAR wAppend = pIter->GetChar(); + dwBreakStatus = pTxtBreak->AppendChar(wAppend); + } + if (pIter->GetAt() + 1 == nEndIndex && dwBreakStatus < FX_TXTBREAK_LineBreak) { + dwBreakStatus = pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak); + } + if (dwBreakStatus > FX_TXTBREAK_PieceBreak) { + FX_INT32 nCount = pTxtBreak->CountBreakPieces(); + FX_INT32 nTotal = 0; + for (FX_INT32 j = 0; j < nCount; j ++) { + const CFX_TxtPiece * Piece = pTxtBreak->GetBreakPiece(j); + nTotal += Piece->GetLength(); + } + LineBaseArr.Add(nTotal); + pTxtBreak->ClearBreakPieces(); + } + if ((pIter->GetAt() + 1 == nEndIndex) && (dwBreakStatus == FX_TXTBREAK_LineBreak)) { + bReload = TRUE; + pIter->Next(TRUE); + } + } while (pIter->Next(FALSE) && (pIter->GetAt() < nEndIndex)); + pIter->Release(); + pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak); + pTxtBreak->ClearBreakPieces(); + FX_INT32 nLineCount = LineBaseArr.GetSize(); + m_nLineCount = nLineCount; + if (m_lpData == NULL) { + m_lpData = FX_Alloc(FX_INT32, nLineCount + 1); + } else { + m_lpData = FX_Realloc(FX_INT32, m_lpData, (nLineCount + 1)); + } + FX_INT32 * pIntArr = (FX_INT32*)m_lpData; + pIntArr[0] = 1; + m_nLineCount = nLineCount; + pIntArr ++; + for (FX_INT32 j = 0; j < nLineCount; j ++, pIntArr ++) { + *pIntArr = LineBaseArr[j]; + } + LineBaseArr.RemoveAll(); +} +void CFDE_TxtEdtParag::UnloadParag() +{ + FXSYS_assert(m_lpData != NULL); + ((FX_INT32*)m_lpData)[0]--; + FXSYS_assert(((FX_INT32*)m_lpData)[0] >= 0); + if (((FX_INT32*)m_lpData)[0] == 0) { + FX_Free(m_lpData); + m_lpData = NULL; + } +} +void CFDE_TxtEdtParag::CalcLines() +{ + IFX_TxtBreak * pTxtBreak = m_pEngine->GetTextBreak(); + IFDE_TxtEdtBuf * pTxtBuf = m_pEngine->GetTextBuf(); + IFX_CharIter * pIter = FX_NEW CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)pTxtBuf); + FX_INT32 nCount = 0; + FX_DWORD dwBreakStatus = FX_TXTBREAK_None; + FX_INT32 nEndIndex = m_nCharStart + m_nCharCount; + pIter->SetAt(m_nCharStart); + FX_BOOL bReload = FALSE; + FX_INT32 nTextEnd = m_pEngine->GetTextBufLength(); + do { + if (bReload) { + dwBreakStatus = pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak); + } else { + FX_WCHAR wAppend = pIter->GetChar(); + dwBreakStatus = pTxtBreak->AppendChar(wAppend); + } + if (pIter->GetAt() + 1 == nEndIndex && dwBreakStatus < FX_TXTBREAK_LineBreak) { + dwBreakStatus = pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak); + } + if (dwBreakStatus > FX_TXTBREAK_PieceBreak) { + nCount ++; + pTxtBreak->ClearBreakPieces(); + } + if ((pIter->GetAt() + 1 == nEndIndex) && (dwBreakStatus == FX_TXTBREAK_LineBreak)) { + bReload = TRUE; + pIter->Next(TRUE); + } + } while (pIter->Next(FALSE) && (pIter->GetAt() < nEndIndex)); + pIter->Release(); + pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak); + pTxtBreak->ClearBreakPieces(); + m_nLineCount = nCount; +} +void CFDE_TxtEdtParag::GetLineRange(FX_INT32 nLineIndex, FX_INT32& nStart, FX_INT32& nCount) const +{ + FX_INT32 * pLineBaseArr = (FX_INT32*)m_lpData; + FXSYS_assert(nLineIndex < m_nLineCount); + nStart = m_nCharStart; + pLineBaseArr ++; + for (FX_INT32 i = 0; i < nLineIndex; i ++) { + nStart += *pLineBaseArr; + pLineBaseArr ++; + } + nCount = *pLineBaseArr; +} diff --git a/xfa/src/fee/src/fee/fde_txtedtparag.h b/xfa/src/fee/src/fee/fde_txtedtparag.h new file mode 100644 index 0000000000..72584feca8 --- /dev/null +++ b/xfa/src/fee/src/fee/fde_txtedtparag.h @@ -0,0 +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 _FDE_TXTEDTPARAG_H +#define _FDE_TXTEDTPARAG_H +class CFDE_TxtEdtEngine; +class CFDE_TxtEdtParag; +class CFDE_TxtEdtParag : public IFDE_TxtEdtParag, public CFX_Object +{ +public: + CFDE_TxtEdtParag(CFDE_TxtEdtEngine * pEngine); + ~CFDE_TxtEdtParag(); + virtual FX_INT32 GetTextLength() const + { + return m_nCharCount; + } + virtual FX_INT32 GetStartIndex() const + { + return m_nCharStart; + } + virtual FX_INT32 CountLines() const + { + return m_nLineCount; + } + virtual void GetLineRange(FX_INT32 nLineIndex, FX_INT32& nStart, FX_INT32& nCount) const; + void LoadParag(); + void UnloadParag(); + void CalcLines(); + FX_INT32 m_nCharStart; + FX_INT32 m_nCharCount; + FX_INT32 m_nLineCount; +private: + FX_LPVOID m_lpData; + CFDE_TxtEdtEngine* m_pEngine; +}; +#endif diff --git a/xfa/src/fee/src/fx_wordbreak/fx_wordbreak_impl.cpp b/xfa/src/fee/src/fx_wordbreak/fx_wordbreak_impl.cpp new file mode 100644 index 0000000000..4847af9ed3 --- /dev/null +++ b/xfa/src/fee/src/fx_wordbreak/fx_wordbreak_impl.cpp @@ -0,0 +1,263 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "fx_wordbreak_impl.h" +#define FX_IsOdd(a) ((a) & 1) +FX_WordBreakProp FX_GetWordBreakProperty(FX_WCHAR wcCodePoint) +{ + FX_DWORD dwProperty = (FX_DWORD)gs_FX_WordBreak_CodePointProperties[wcCodePoint >> 1]; + return (FX_WordBreakProp)(FX_IsOdd(wcCodePoint) ? (dwProperty & 0x0F) : (dwProperty >> 4)); +} +CFX_CharIter::CFX_CharIter(const CFX_WideString & wsText) + : m_wsText(wsText) + , m_nIndex(0) +{ + FXSYS_assert(!wsText.IsEmpty()); +} +CFX_CharIter::~CFX_CharIter() +{ +} +void CFX_CharIter::Release() +{ + delete this; +} +FX_BOOL CFX_CharIter::Next(FX_BOOL bPrev ) +{ + if (bPrev) { + if (m_nIndex <= 0) { + return FALSE; + } + m_nIndex --; + } else { + if (m_nIndex + 1 >= m_wsText.GetLength()) { + return FALSE; + } + m_nIndex ++; + } + return TRUE; +} +FX_WCHAR CFX_CharIter::GetChar() +{ + return m_wsText.GetAt(m_nIndex); +} +void CFX_CharIter::SetAt(FX_INT32 nIndex) +{ + if (nIndex < 0 || nIndex >= m_wsText.GetLength()) { + return; + } + m_nIndex = nIndex; +} +FX_INT32 CFX_CharIter::GetAt() const +{ + return m_nIndex; +} +FX_BOOL CFX_CharIter::IsEOF(FX_BOOL bTail ) const +{ + return bTail ? (m_nIndex + 1 == m_wsText.GetLength()) : (m_nIndex == 0); +} +IFX_CharIter * CFX_CharIter::Clone() +{ + CFX_CharIter * pIter = new CFX_CharIter(m_wsText); + pIter->m_nIndex = m_nIndex; + return pIter; +} +CFX_WordBreak::CFX_WordBreak() + : m_pPreIter(NULL) + , m_pCurIter(NULL) +{ +} +CFX_WordBreak::~CFX_WordBreak() +{ + if (m_pPreIter) { + m_pPreIter->Release(); + m_pPreIter = NULL; + } + if (m_pCurIter) { + m_pCurIter->Release(); + m_pCurIter = NULL; + } +} +void CFX_WordBreak::Release() +{ + delete this; +} +void CFX_WordBreak::Attach(IFX_CharIter * pIter) +{ + FXSYS_assert(pIter); + m_pCurIter = pIter; +} +void CFX_WordBreak::Attach(const CFX_WideString &wsText) +{ + m_pCurIter = new CFX_CharIter(wsText); +} +FX_BOOL CFX_WordBreak::Next(FX_BOOL bPrev) +{ + IFX_CharIter * pIter = bPrev ? m_pPreIter->Clone() : m_pCurIter->Clone(); + if (pIter->IsEOF(!bPrev)) { + return FALSE; + } + pIter->Next(bPrev); + if (!FindNextBreakPos(pIter, bPrev, TRUE)) { + pIter->Release(); + return FALSE; + } + if (bPrev) { + m_pCurIter->Release(); + m_pCurIter = m_pPreIter; + m_pCurIter->Next(TRUE); + m_pPreIter = pIter; + } else { + m_pPreIter->Release(); + m_pPreIter = m_pCurIter; + m_pPreIter->Next(); + m_pCurIter = pIter; + } + return TRUE; +} +void CFX_WordBreak::SetAt(FX_INT32 nIndex) +{ + if (m_pPreIter) { + m_pPreIter->Release(); + m_pPreIter = NULL; + } + m_pCurIter->SetAt(nIndex); + FindNextBreakPos(m_pCurIter, TRUE, FALSE); + m_pPreIter = m_pCurIter; + m_pCurIter = m_pPreIter->Clone(); + FindNextBreakPos(m_pCurIter, FALSE, FALSE); +} +FX_INT32 CFX_WordBreak::GetWordPos() const +{ + return m_pPreIter->GetAt(); +} +FX_INT32 CFX_WordBreak::GetWordLength() const +{ + return m_pCurIter->GetAt() - m_pPreIter->GetAt() + 1; +} +void CFX_WordBreak::GetWord(CFX_WideString &wsWord) const +{ + FX_INT32 nWordLength = GetWordLength(); + if (nWordLength <= 0) { + return; + } + FX_LPWSTR lpBuf = wsWord.GetBuffer(nWordLength); + IFX_CharIter * pTempIter = m_pPreIter->Clone(); + FX_INT32 i = 0; + while (pTempIter->GetAt() <= m_pCurIter->GetAt()) { + lpBuf[i++] = pTempIter->GetChar(); + FX_BOOL bEnd = pTempIter->Next(); + if (!bEnd) { + break; + } + } + pTempIter->Release(); + wsWord.ReleaseBuffer(nWordLength); +} +FX_BOOL CFX_WordBreak::IsEOF(FX_BOOL bTail) const +{ + return m_pCurIter->IsEOF(bTail); +} +FX_BOOL CFX_WordBreak::FindNextBreakPos(IFX_CharIter * pIter, FX_BOOL bPrev, + FX_BOOL bFromNext ) +{ + FX_WordBreakProp ePreType = FX_WordBreakProp_None; + FX_WordBreakProp eCurType = FX_WordBreakProp_None; + FX_WordBreakProp eNextType = FX_WordBreakProp_None; + if (pIter->IsEOF(!bPrev)) { + return TRUE; + } + if (!(bFromNext || pIter->IsEOF(bPrev))) { + pIter->Next(!bPrev); + FX_WCHAR wcTemp = pIter->GetChar(); + ePreType = FX_GetWordBreakProperty(wcTemp); + pIter->Next(bPrev); + } + FX_WCHAR wcTemp = pIter->GetChar(); + eCurType = FX_GetWordBreakProperty(wcTemp); + FX_BOOL bFirst = TRUE; + do { + pIter->Next(bPrev); + FX_WCHAR wcTemp = pIter->GetChar(); + eNextType = FX_GetWordBreakProperty(wcTemp); + FX_WORD wBreak = gs_FX_WordBreak_Table[eCurType] & ((FX_WORD)(1 << eNextType)); + if (wBreak) { + if (pIter->IsEOF(!bPrev)) { + pIter->Next(!bPrev); + return TRUE; + } + if (bFirst) { + FX_INT32 nFlags = 0; + if (eCurType == FX_WordBreakProp_MidLetter) { + if (eNextType == FX_WordBreakProp_ALetter) { + nFlags = 1; + } + } else if (eCurType == FX_WordBreakProp_MidNum) { + if (eNextType == FX_WordBreakProp_Numberic) { + nFlags = 2; + } + } else if (eCurType == FX_WordBreakProp_MidNumLet) { + if (eNextType == FX_WordBreakProp_ALetter) { + nFlags = 1; + } else if (eNextType == FX_WordBreakProp_Numberic) { + nFlags = 2; + } + } + if (nFlags > 0) { + FXSYS_assert(nFlags <= 2); + if (!((nFlags == 1 && ePreType == FX_WordBreakProp_ALetter) || + (nFlags == 2 && ePreType == FX_WordBreakProp_Numberic))) { + pIter->Next(!bPrev); + return TRUE; + } + pIter->Next(bPrev); + wBreak = FALSE; + } + bFirst = FALSE; + } + if (wBreak) { + FX_INT32 nFlags = 0; + if (eNextType == FX_WordBreakProp_MidLetter) { + if (eCurType == FX_WordBreakProp_ALetter) { + nFlags = 1; + } + } else if (eNextType == FX_WordBreakProp_MidNum) { + if (eCurType == FX_WordBreakProp_Numberic) { + nFlags = 2; + } + } else if (eNextType == FX_WordBreakProp_MidNumLet) { + if (eCurType == FX_WordBreakProp_ALetter) { + nFlags = 1; + } else if (eCurType == FX_WordBreakProp_Numberic) { + nFlags = 2; + } + } + if (nFlags <= 0) { + pIter->Next(!bPrev); + return TRUE; + } + FXSYS_assert(nFlags <= 2); + pIter->Next(bPrev); + wcTemp = pIter->GetChar(); + eNextType = (FX_WordBreakProp)FX_GetWordBreakProperty(wcTemp); + if (!((nFlags == 1 && eNextType == FX_WordBreakProp_ALetter) || + (nFlags == 2 && eNextType == FX_WordBreakProp_Numberic))) { + pIter->Next(!bPrev); + pIter->Next(!bPrev); + return TRUE; + } + } + } + ePreType = eCurType; + eCurType = eNextType; + bFirst = FALSE; + } while (!pIter->IsEOF(!bPrev)); + return TRUE; +} +IFX_WordBreak * FX_WordBreak_Create() +{ + return new CFX_WordBreak; +} diff --git a/xfa/src/fee/src/fx_wordbreak/fx_wordbreak_impl.h b/xfa/src/fee/src/fx_wordbreak/fx_wordbreak_impl.h new file mode 100644 index 0000000000..91895a54d7 --- /dev/null +++ b/xfa/src/fee/src/fx_wordbreak/fx_wordbreak_impl.h @@ -0,0 +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 _FX_WORDBREAK_IMPL_H +#define _FX_WORDBREAK_IMPL_H +extern const FX_WORD gs_FX_WordBreak_Table[16]; +extern const FX_BYTE gs_FX_WordBreak_CodePointProperties[(0xFFFF - 1) / 2 + 1]; +enum FX_WordBreakProp { + FX_WordBreakProp_None = 0 , + FX_WordBreakProp_CR , + FX_WordBreakProp_LF , + FX_WordBreakProp_NewLine , + FX_WordBreakProp_Extend , + FX_WordBreakProp_Format , + FX_WordBreakProp_KataKana , + FX_WordBreakProp_ALetter , + FX_WordBreakProp_MidLetter , + FX_WordBreakProp_MidNum , + FX_WordBreakProp_MidNumLet , + FX_WordBreakProp_Numberic , + FX_WordBreakProp_ExtendNumLet , +}; +FX_WordBreakProp FX_GetWordBreakProperty(FX_WCHAR wcCodePoint); +class CFX_CharIter : public IFX_CharIter, public CFX_Object +{ +public: + CFX_CharIter(const CFX_WideString & wsText); + virtual void Release(); + virtual FX_BOOL Next(FX_BOOL bPrev = FALSE); + virtual FX_WCHAR GetChar(); + virtual void SetAt(FX_INT32 nIndex); + virtual FX_INT32 GetAt() const; + virtual FX_BOOL IsEOF(FX_BOOL bTail = TRUE) const; + virtual IFX_CharIter * Clone(); +protected: + ~CFX_CharIter(); +private: + const CFX_WideString &m_wsText; + FX_INT32 m_nIndex; +}; +class CFX_WordBreak : public IFX_WordBreak, public CFX_Object +{ +public: + CFX_WordBreak(); + virtual void Release(); + virtual void Attach(IFX_CharIter * pIter); + virtual void Attach(const CFX_WideString &wsText); + virtual FX_BOOL Next(FX_BOOL bPrev); + virtual void SetAt(FX_INT32 nIndex); + virtual FX_INT32 GetWordPos() const; + virtual FX_INT32 GetWordLength() const; + virtual void GetWord(CFX_WideString &wsWord) const; + virtual FX_BOOL IsEOF(FX_BOOL bTail ) const; +protected: + ~CFX_WordBreak(); + FX_BOOL FindNextBreakPos(IFX_CharIter * pIter, FX_BOOL bPrev, FX_BOOL bFromNext = TRUE); +private: + IFX_CharIter * m_pPreIter; + IFX_CharIter * m_pCurIter; +}; +#endif diff --git a/xfa/src/fee/src/fx_wordbreak/fx_wordbreakdata.cpp b/xfa/src/fee/src/fx_wordbreak/fx_wordbreakdata.cpp new file mode 100644 index 0000000000..23e30479f4 --- /dev/null +++ b/xfa/src/fee/src/fx_wordbreak/fx_wordbreakdata.cpp @@ -0,0 +1,2062 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "fx_wordbreak_impl.h" +extern const FX_WORD gs_FX_WordBreak_Table[16] = { + 0xFFFF, 0xFFF9, 0xFFFB, 0xFFFB, 0xFFFB, 0xFFFB, 0xEFBB, 0xE77B, + 0xFFFB, 0xFFFB, 0xFFFB, 0xE77B, 0xE73B, 0xFFFB, 0xFFFB, 0xFFFB, +}; +extern const FX_BYTE gs_FX_WordBreak_CodePointProperties[(0xFFFF - 1) / 2 + 1] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x90, 0xA0, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x89, 0x00, 0x00, + 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x0C, + 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x05, 0x00, 0x00, 0x00, 0x07, 0x08, 0x00, 0x70, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x77, 0x70, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x77, 0x77, 0x70, 0x77, 0x00, 0x77, 0x77, 0x90, + 0x00, 0x00, 0x00, 0x78, 0x77, 0x70, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x07, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x04, 0x44, 0x44, 0x44, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x07, 0x00, 0x00, 0x00, + 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x09, 0x00, 0x00, 0x00, 0x04, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x04, + 0x04, 0x40, 0x44, 0x04, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00, 0x77, 0x77, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x99, 0x00, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x00, 0x00, + 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, + 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x0B, 0x90, 0x77, 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x07, 0x44, 0x44, 0x44, 0x45, 0x44, + 0x44, 0x44, 0x47, 0x74, 0x40, 0x44, 0x44, 0x77, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x77, 0x70, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x74, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x44, 0x44, 0x44, 0x44, 0x44, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, 0x44, 0x44, 0x44, 0x44, 0x77, 0x00, 0x90, 0x70, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x44, 0x44, 0x74, 0x44, 0x44, + 0x44, 0x44, 0x74, 0x44, 0x74, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x44, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x47, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x74, 0x44, 0x44, 0x00, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x07, 0x70, 0x00, 0x00, 0x07, 0x77, 0x77, 0x77, + 0x04, 0x44, 0x07, 0x77, 0x77, 0x77, 0x70, 0x07, 0x70, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, 0x70, 0x00, 0x77, 0x77, 0x00, 0x47, 0x44, + 0x44, 0x44, 0x40, 0x04, 0x40, 0x04, 0x44, 0x70, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x77, 0x07, + 0x77, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x44, 0x07, 0x77, 0x77, 0x70, 0x00, 0x07, 0x70, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, 0x77, 0x07, 0x70, 0x77, 0x00, 0x40, 0x44, + 0x44, 0x40, 0x00, 0x04, 0x40, 0x04, 0x44, 0x00, 0x04, 0x00, 0x00, 0x00, 0x07, 0x77, 0x70, 0x70, + 0x00, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x44, 0x77, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x44, 0x07, 0x77, 0x77, 0x77, 0x77, 0x07, 0x77, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, 0x77, 0x07, 0x77, 0x77, 0x00, 0x47, 0x44, + 0x44, 0x44, 0x44, 0x04, 0x44, 0x04, 0x44, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x44, 0x07, 0x77, 0x77, 0x77, 0x70, 0x07, 0x70, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, 0x77, 0x07, 0x77, 0x77, 0x00, 0x47, 0x44, + 0x44, 0x44, 0x40, 0x04, 0x40, 0x04, 0x44, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x77, 0x07, + 0x77, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x47, 0x07, 0x77, 0x77, 0x70, 0x00, 0x77, 0x70, 0x77, 0x77, 0x00, 0x07, 0x70, 0x70, 0x77, + 0x00, 0x07, 0x70, 0x00, 0x77, 0x70, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x44, + 0x44, 0x40, 0x00, 0x44, 0x40, 0x44, 0x44, 0x00, 0x70, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x44, 0x07, 0x77, 0x77, 0x77, 0x70, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x07, 0x77, 0x77, 0x00, 0x07, 0x44, + 0x44, 0x44, 0x40, 0x44, 0x40, 0x44, 0x44, 0x00, 0x00, 0x00, 0x04, 0x40, 0x77, 0x00, 0x00, 0x00, + 0x77, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x44, 0x07, 0x77, 0x77, 0x77, 0x70, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x07, 0x77, 0x77, 0x00, 0x47, 0x44, + 0x44, 0x44, 0x40, 0x44, 0x40, 0x44, 0x44, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x00, 0x00, 0x70, + 0x77, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x44, 0x07, 0x77, 0x77, 0x77, 0x70, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x07, 0x44, + 0x44, 0x44, 0x40, 0x44, 0x40, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, + 0x00, 0x44, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x07, 0x77, 0x77, 0x77, 0x77, 0x07, 0x00, + 0x77, 0x77, 0x77, 0x70, 0x00, 0x40, 0x00, 0x04, 0x44, 0x44, 0x40, 0x40, 0x44, 0x44, 0x44, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x44, 0x44, 0x44, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x44, 0x44, 0x44, 0x40, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x44, 0x44, 0x44, 0x04, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, + 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x00, 0x00, 0x44, + 0x77, 0x77, 0x77, 0x77, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x04, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x40, 0x44, 0x77, 0x77, 0x00, 0x00, 0x44, 0x44, 0x44, 0x44, 0x04, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, + 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x44, + 0x40, 0x44, 0x40, 0x04, 0x44, 0x44, 0x44, 0x00, 0x04, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x04, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x44, 0x44, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x70, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x70, 0x70, 0x77, 0x77, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x70, + 0x70, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x77, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x70, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x74, 0x70, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x00, 0x00, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x40, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xB0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, 0x44, 0x44, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x44, 0x44, 0x44, 0x40, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x04, + 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x44, 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x47, 0x77, 0x77, 0x77, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x44, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x74, 0x44, 0x44, 0x44, 0x44, 0x40, 0x00, 0x77, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00, + 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x07, 0x77, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x40, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x47, 0x77, 0x74, 0x77, 0x77, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x77, 0x07, 0x07, 0x07, 0x07, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, 0x70, + 0x00, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, 0x00, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x55, 0x00, 0x00, 0x00, 0x00, 0xAA, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA0, 0x08, 0x33, 0x55, 0x55, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, + 0xC0, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x55, 0x55, 0x50, 0x00, 0x00, 0x55, 0x55, 0x55, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x07, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x07, 0x00, 0x07, 0x77, 0x77, 0x00, + 0x00, 0x00, 0x70, 0x70, 0x70, 0x77, 0x77, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x77, 0x77, + 0x00, 0x00, 0x07, 0x77, 0x77, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x70, 0x00, 0x00, 0x07, 0x77, 0x74, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, + 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x06, 0x66, 0x66, 0x00, 0x00, 0x07, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x46, 0x60, 0x00, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x60, 0x66, 0x66, + 0x00, 0x00, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x60, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x44, 0x07, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x77, 0x77, 0x77, 0x77, + 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x70, 0x07, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x77, 0x77, + 0x77, 0x47, 0x77, 0x47, 0x77, 0x74, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x74, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x77, 0x77, 0x77, 0x00, 0x07, 0x00, 0x00, + 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x44, 0x44, 0x44, 0x44, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x74, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, + 0x44, 0x44, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x74, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x74, 0x77, 0x77, 0x77, 0x77, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x44, 0x40, 0x04, 0x40, 0x00, 0x00, 0x44, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x74, 0x44, 0x44, 0x44, 0x40, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x70, 0x00, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x77, 0x77, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x77, 0x77, 0x00, 0x00, 0x07, 0x47, + 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x70, 0x70, + 0x77, 0x07, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x90, 0x08, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x44, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xCC, 0x90, 0xA0, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x05, + 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x90, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, + 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x0C, + 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x44, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, + 0x00, 0x77, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x00, 0x77, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x55, 0x00, 0x00, +}; diff --git a/xfa/src/fgas/include/fgas.h b/xfa/src/fgas/include/fgas.h new file mode 100644 index 0000000000..8f085e4791 --- /dev/null +++ b/xfa/src/fgas/include/fgas.h @@ -0,0 +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 _FGAS_ +#define _FGAS_ +#include "fx_sys.h" +#include "fx_mem.h" +#include "fx_lgg.h" +#include "fx_utl.h" +#include "fx_alg.h" +#include "fx_cpg.h" +#include "fx_stm.h" +#include "fx_datetime.h" +#include "fx_locale.h" +#include "fx_sax.h" +#include "fx_fnt.h" +#include "fx_ucd.h" +#include "fx_lbk.h" +#include "fx_tbk.h" +#include "fx_rbk.h" +#endif diff --git a/xfa/src/fgas/include/fx_alg.h b/xfa/src/fgas/include/fx_alg.h new file mode 100644 index 0000000000..ed946641f2 --- /dev/null +++ b/xfa/src/fgas/include/fx_alg.h @@ -0,0 +1,46 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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_ALGORITHM +#define _FX_ALGORITHM +#define FX_IsOdd(a) ((a) & 1) +#ifdef __cplusplus +extern "C" { +#endif +FX_INT32 FX_Base64EncodeA(FX_LPCBYTE pSrc, FX_INT32 iSrcLen, FX_LPSTR pDst); +FX_INT32 FX_Base64DecodeA(FX_LPCSTR pSrc, FX_INT32 iSrcLen, FX_LPBYTE pDst); +FX_INT32 FX_Base64DecodeW(FX_LPCWSTR pSrc, FX_INT32 iSrcLen, FX_LPBYTE pDst); +FX_BYTE FX_Hex2Dec(FX_BYTE hexHigh, FX_BYTE hexLow); +FX_INT32 FX_SeparateStringW(FX_LPCWSTR pStr, FX_INT32 iStrLen, FX_WCHAR delimiter, CFX_WideStringArray &pieces); +#ifdef __cplusplus +}; +#endif +template +class CFX_DSPATemplate +{ +public: + FX_INT32 Lookup(const baseType &find, const baseType *pArray, FX_INT32 iCount) + { + FXSYS_assert(pArray != NULL); + if (iCount < 1) { + return -1; + } + FX_INT32 iStart = 0, iEnd = iCount - 1, iMid; + do { + iMid = (iStart + iEnd) / 2; + const baseType &v = pArray[iMid]; + if (find == v) { + return iMid; + } else if (find < v) { + iEnd = iMid - 1; + } else { + iStart = iMid + 1; + } + } while (iStart <= iEnd); + return -1; + } +}; +#endif diff --git a/xfa/src/fgas/include/fx_cpg.h b/xfa/src/fgas/include/fx_cpg.h new file mode 100644 index 0000000000..43c6520152 --- /dev/null +++ b/xfa/src/fgas/include/fx_cpg.h @@ -0,0 +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 + +#ifndef _FX_CODEPAGE +#define _FX_CODEPAGE +class IFX_CodePage; +#define FX_CODEPAGE_DefANSI 0 +#define FX_CODEPAGE_DefOEM 1 +#define FX_CODEPAGE_DefMAC 2 +#define FX_CODEPAGE_Thread 3 +#define FX_CODEPAGE_Symbol 42 +#define FX_CODEPAGE_MSDOS_US 437 +#define FX_CODEPAGE_Arabic_ASMO708 708 +#define FX_CODEPAGE_Arabic_ASMO449Plus 709 +#define FX_CODEPAGE_Arabic_Transparent 710 +#define FX_CODEPAGE_Arabic_NafithaEnhanced 711 +#define FX_CODEPAGE_Arabic_TransparentASMO 720 +#define FX_CODEPAGE_MSDOS_Greek1 737 +#define FX_CODEPAGE_MSDOS_Baltic 775 +#define FX_CODEPAGE_MSWin31_WesternEuropean 819 +#define FX_CODEPAGE_MSDOS_WesternEuropean 850 +#define FX_CODEPAGE_MSDOS_EasternEuropean 852 +#define FX_CODEPAGE_MSDOS_Latin3 853 +#define FX_CODEPAGE_MSDOS_Cyrillic 855 +#define FX_CODEPAGE_MSDOS_Turkish 857 +#define FX_CODEPAGE_MSDOS_Latin1Euro 858 +#define FX_CODEPAGE_MSDOS_Portuguese 860 +#define FX_CODEPAGE_MSDOS_Icelandic 861 +#define FX_CODEPAGE_MSDOS_Hebrew 862 +#define FX_CODEPAGE_MSDOS_FrenchCanadian 863 +#define FX_CODEPAGE_MSDOS_Arabic 864 +#define FX_CODEPAGE_MSDOS_Norwegian 865 +#define FX_CODEPAGE_MSDOS_Russian 866 +#define FX_CODEPAGE_MSDOS_Greek2 869 +#define FX_CODEPAGE_MSDOS_Thai 874 +#define FX_CODEPAGE_MSDOS_KamenickyCS 895 +#define FX_CODEPAGE_ShiftJIS 932 +#define FX_CODEPAGE_ChineseSimplified 936 +#define FX_CODEPAGE_Korean 949 +#define FX_CODEPAGE_ChineseTraditional 950 +#define FX_CODEPAGE_UTF16LE 1200 +#define FX_CODEPAGE_UTF16BE 1201 +#define FX_CODEPAGE_MSWin_EasternEuropean 1250 +#define FX_CODEPAGE_MSWin_Cyrillic 1251 +#define FX_CODEPAGE_MSWin_WesternEuropean 1252 +#define FX_CODEPAGE_MSWin_Greek 1253 +#define FX_CODEPAGE_MSWin_Turkish 1254 +#define FX_CODEPAGE_MSWin_Hebrew 1255 +#define FX_CODEPAGE_MSWin_Arabic 1256 +#define FX_CODEPAGE_MSWin_Baltic 1257 +#define FX_CODEPAGE_MSWin_Vietnamese 1258 +#define FX_CODEPAGE_Johab 1361 +#define FX_CODEPAGE_MAC_Roman 10000 +#define FX_CODEPAGE_MAC_ShiftJIS 10001 +#define FX_CODEPAGE_MAC_ChineseTraditional 10002 +#define FX_CODEPAGE_MAC_Korean 10003 +#define FX_CODEPAGE_MAC_Arabic 10004 +#define FX_CODEPAGE_MAC_Hebrew 10005 +#define FX_CODEPAGE_MAC_Greek 10006 +#define FX_CODEPAGE_MAC_Cyrillic 10007 +#define FX_CODEPAGE_MAC_ChineseSimplified 10008 +#define FX_CODEPAGE_MAC_Thai 10021 +#define FX_CODEPAGE_MAC_EasternEuropean 10029 +#define FX_CODEPAGE_MAC_Turkish 10081 +#define FX_CODEPAGE_UTF32LE 12000 +#define FX_CODEPAGE_UTF32BE 12001 +#define FX_CODEPAGE_ISO8859_1 28591 +#define FX_CODEPAGE_ISO8859_2 28592 +#define FX_CODEPAGE_ISO8859_3 28593 +#define FX_CODEPAGE_ISO8859_4 28594 +#define FX_CODEPAGE_ISO8859_5 28595 +#define FX_CODEPAGE_ISO8859_6 28596 +#define FX_CODEPAGE_ISO8859_7 28597 +#define FX_CODEPAGE_ISO8859_8 28598 +#define FX_CODEPAGE_ISO8859_9 28599 +#define FX_CODEPAGE_ISO8859_10 28600 +#define FX_CODEPAGE_ISO8859_11 28601 +#define FX_CODEPAGE_ISO8859_12 28602 +#define FX_CODEPAGE_ISO8859_13 28603 +#define FX_CODEPAGE_ISO8859_14 28604 +#define FX_CODEPAGE_ISO8859_15 28605 +#define FX_CODEPAGE_ISO8859_16 28606 +#define FX_CODEPAGE_ISCII_Devanagari 57002 +#define FX_CODEPAGE_ISCII_Bengali 57003 +#define FX_CODEPAGE_ISCII_Tamil 57004 +#define FX_CODEPAGE_ISCII_Telugu 57005 +#define FX_CODEPAGE_ISCII_Assamese 57006 +#define FX_CODEPAGE_ISCII_Oriya 57007 +#define FX_CODEPAGE_ISCII_Kannada 57008 +#define FX_CODEPAGE_ISCII_Malayalam 57009 +#define FX_CODEPAGE_ISCII_Gujarati 57010 +#define FX_CODEPAGE_ISCII_Punjabi 57011 +#define FX_CODEPAGE_UTF7 65000 +#define FX_CODEPAGE_UTF8 65001 +#define FX_CHARSET_ANSI 0 +#define FX_CHARSET_Default 1 +#define FX_CHARSET_Symbol 2 +#define FX_CHARSET_MAC_Roman 77 +#define FX_CHARSET_MAC_ShiftJIS 78 +#define FX_CHARSET_MAC_Korean 79 +#define FX_CHARSET_MAC_ChineseSimplified 80 +#define FX_CHARSET_MAC_ChineseTriditional 81 +#define FX_CHARSET_MAC_Johab 82 +#define FX_CHARSET_MAC_Hebrew 83 +#define FX_CHARSET_MAC_Arabic 84 +#define FX_CHARSET_MAC_Greek 85 +#define FX_CHARSET_MAC_Turkish 86 +#define FX_CHARSET_MAC_Thai 87 +#define FX_CHARSET_MAC_EasternEuropean 88 +#define FX_CHARSET_MAC_Cyrillic 89 +#define FX_CHARSET_ShiftJIS 128 +#define FX_CHARSET_Korean 129 +#define FX_CHARSET_Johab 130 +#define FX_CHARSET_ChineseSimplified 134 +#define FX_CHARSET_ChineseTriditional 136 +#define FX_CHARSET_MSWin_Greek 161 +#define FX_CHARSET_MSWin_Turkish 162 +#define FX_CHARSET_MSWin_Vietnamese 163 +#define FX_CHARSET_MSWin_Hebrew 177 +#define FX_CHARSET_MSWin_Arabic 178 +#define FX_CHARSET_ArabicTraditional 179 +#define FX_CHARSET_ArabicUser 180 +#define FX_CHARSET_HebrewUser 181 +#define FX_CHARSET_MSWin_Baltic 186 +#define FX_CHARSET_MSWin_Cyrillic 204 +#define FX_CHARSET_Thai 222 +#define FX_CHARSET_MSWin_EasterEuropean 238 +#define FX_CHARSET_US 254 +#define FX_CHARSET_OEM 255 +FX_WORD FX_GetCodePageFromCharset(FX_BYTE charset); +FX_WORD FX_GetCharsetFromCodePage(FX_WORD codepage); +FX_WORD FX_GetCodePageFromStringA(FX_LPCSTR pStr, FX_INT32 iLength); +FX_WORD FX_GetCodePageFormStringW(FX_LPCWSTR pStr, FX_INT32 iLength); +FX_WORD FX_GetDefCodePageByLanguage(FX_WORD wLanguage); +void FX_SwapByteOrder(FX_LPWSTR pStr, FX_INT32 iLength); +void FX_SwapByteOrderCopy(FX_LPCWSTR pSrc, FX_LPWSTR pDst, FX_INT32 iLength); +void FX_UTF16ToWChar(FX_LPVOID pBuffer, FX_INT32 iLength); +void FX_UTF16ToWCharCopy(const FX_WORD *pUTF16, FX_LPWSTR pWChar, FX_INT32 iLength); +void FX_WCharToUTF16(FX_LPVOID pBuffer, FX_INT32 iLength); +void FX_WCharToUTF16Copy(FX_LPCWSTR pWChar, FX_WORD *pUTF16, FX_INT32 iLength); +FX_INT32 FX_DecodeString(FX_WORD wCodePage, FX_LPCSTR pSrc, FX_INT32 *pSrcLen, FX_LPWSTR pDst, FX_INT32 *pDstLen, FX_BOOL bErrBreak = FALSE); +FX_INT32 FX_UTF8Decode(FX_LPCSTR pSrc, FX_INT32 *pSrcLen, FX_LPWSTR pDst, FX_INT32 *pDstLen); +enum FX_CODESYSTEM { + FX_MBCS = 0, + FX_SBCS , + FX_DBCS , +}; +typedef struct _FX_CODEPAGE_HEADER { + FX_UINT16 uCPID; + FX_UINT8 uMinCharBytes; + FX_UINT8 uMaxCharBytes; + FX_CODESYSTEM eCPType; + FX_BOOL bHasLeadByte; + FX_WCHAR wMinChar; + FX_WCHAR wMaxChar; + FX_WCHAR wDefChar; + FX_WCHAR wMinUnicode; + FX_WCHAR wMaxUnicode; + FX_WCHAR wDefUnicode; +} FX_CODEPAGE_HEADER; +#define FX_CPMAPTYPE_Consecution 1 +#define FX_CPMAPTYPE_Strict 2 +#define FX_CPMAPTYPE_NoMapping 3 +#define FX_CPMAPTYPE_Delta 4 +typedef struct _FX_CPCU_MAPTABLE1 { + FX_UINT16 uMapType; + FX_UINT16 uUniocde; +} FX_CPCU_MAPTABLE1; +typedef struct _FX_CPCU_MAPTABLE2 { + FX_UINT8 uTrailByte; + FX_UINT8 uMapType; + FX_UINT16 uOffset; +} FX_CPCU_MAPTABLE2; +typedef struct _FX_CPCU_MAPINFO { + FX_CPCU_MAPTABLE1 *pMapTable1; + FX_CPCU_MAPTABLE2 *pMapTable2; + FX_LPCBYTE pMapData; +} FX_CPCU_MAPINFO; +typedef struct _FX_CPUC_MAPTABLE { + FX_UINT16 uStartUnicode; + FX_UINT16 uEndUnicode; + FX_UINT16 uMapType; + FX_UINT16 uOffset; +} FX_CPUC_MAPTABLE; +typedef struct _FX_CPUC_MAPINFO { + FX_UINT32 uMapCount; + FX_CPUC_MAPTABLE *pMapTable; + FX_LPCBYTE pMapData; +} FX_CPUC_MAPINFO; +typedef struct _FX_CODEPAGE { + FX_CODEPAGE_HEADER const *pCPHeader; + FX_CPCU_MAPINFO const *pCPCUMapInfo; + FX_CPUC_MAPINFO const *pCPUCMapInfo; +} FX_CODEPAGE, * FX_LPCODEPAGE; +typedef FX_CODEPAGE const * FX_LPCCODEPAGE; +typedef struct _FX_STR2CPHASH { + FX_UINT32 uHash; + FX_UINT32 uCodePage; +} FX_STR2CPHASH; +typedef struct _FX_CHARSET_MAP { + FX_UINT16 charset; + FX_UINT16 codepage; +} FX_CHARSET_MAP; +typedef struct _FX_LANG2CPMAP { + FX_WORD wLanguage; + FX_WORD wCodepage; +} FX_LANG2CPMAP; +class IFX_CodePage +{ +public: + static IFX_CodePage* Create(FX_WORD wCodePage); + virtual void Release() = 0; + virtual FX_WORD GetCodePageNumber() const = 0; + virtual FX_CODESYSTEM GetCodeSystemType() const = 0; + virtual FX_BOOL HasLeadByte() const = 0; + virtual FX_BOOL IsLeadByte(FX_BYTE byte) const = 0; + virtual FX_INT32 GetMinBytesPerChar() const = 0; + virtual FX_INT32 GetMaxBytesPerChar() const = 0; + virtual FX_WCHAR GetMinCharcode() const = 0; + virtual FX_WCHAR GetMaxCharcode() const = 0; + virtual FX_WCHAR GetDefCharcode() const = 0; + virtual FX_WCHAR GetMinUnicode() const = 0; + virtual FX_WCHAR GetMaxUnicode() const = 0; + virtual FX_WCHAR GetDefUnicode() const = 0; + virtual FX_BOOL IsValidCharcode(FX_WORD wCharcode) const = 0; + virtual FX_WCHAR GetUnicode(FX_WORD wCharcode) const = 0; + virtual FX_BOOL IsValidUnicode(FX_WCHAR wUnicode) const = 0; + virtual FX_WORD GetCharcode(FX_WCHAR wUnicode) const = 0; +}; +#endif diff --git a/xfa/src/fgas/include/fx_datetime.h b/xfa/src/fgas/include/fx_datetime.h new file mode 100644 index 0000000000..dd0a5d6147 --- /dev/null +++ b/xfa/src/fgas/include/fx_datetime.h @@ -0,0 +1,470 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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_DATETIME_H_ +#define _FX_DATETIME_H_ +class CFX_Unitime; +class CFX_DateTime; +typedef FX_INT64 FX_UNITIME; +enum FX_WEEKDAY { + FX_Sunday = 0, + FX_Monday , + FX_Tuesday , + FX_Wednesday , + FX_Thursday , + FX_Friday , + FX_Saturday , +}; +FX_BOOL FX_IsLeapYear(FX_INT32 iYear); +FX_INT32 FX_DaysInYear(FX_INT32 iYear); +FX_BYTE FX_DaysInMonth(FX_INT32 iYear, FX_BYTE iMonth); +class CFX_Unitime : public CFX_Object +{ +public: + CFX_Unitime() + { + m_iUnitime = 0; + } + CFX_Unitime(FX_UNITIME iUnitime) + { + m_iUnitime = iUnitime; + } + CFX_Unitime(const CFX_Unitime &unitime) + { + m_iUnitime = unitime.m_iUnitime; + } + operator FX_UNITIME * () + { + return &m_iUnitime; + } + operator FX_UNITIME const * () const + { + return &m_iUnitime; + } + operator FX_UNITIME& () + { + return m_iUnitime; + } + operator const FX_UNITIME& () const + { + return m_iUnitime; + } + CFX_Unitime& operator = (const CFX_Unitime &t) + { + m_iUnitime = t.m_iUnitime; + return *this; + } + CFX_Unitime& operator = (FX_UNITIME t) + { + m_iUnitime = t; + return *this; + } + CFX_Unitime& operator += (const CFX_Unitime &t) + { + m_iUnitime += t.m_iUnitime; + return *this; + } + CFX_Unitime& operator += (FX_UNITIME t) + { + m_iUnitime += t; + return *this; + } + CFX_Unitime& operator -= (const CFX_Unitime &t) + { + m_iUnitime -= t.m_iUnitime; + return *this; + } + CFX_Unitime& operator -= (FX_UNITIME t) + { + m_iUnitime -= t; + return *this; + } + void Now(); + void SetGMTime(); + void Set(FX_INT32 year, FX_BYTE month, FX_BYTE day, FX_BYTE hour = 0, FX_BYTE minute = 0, FX_BYTE second = 0, FX_WORD millisecond = 0); + void Set(FX_UNITIME t); + FX_INT32 GetYear() const; + FX_BYTE GetMonth() const; + FX_BYTE GetDay() const; + FX_WEEKDAY GetDayOfWeek() const; + FX_WORD GetDayOfYear() const; + FX_INT64 GetDayOfAD() const; + FX_BYTE GetHour() const; + FX_BYTE GetMinute() const; + FX_BYTE GetSecond() const; + FX_WORD GetMillisecond() const; + FX_BOOL AddYears(FX_INT32 iYears); + FX_BOOL AddMonths(FX_INT32 iMonths); + FX_BOOL AddDays(FX_INT32 iDays); + FX_BOOL AddHours(FX_INT32 iHours); + FX_BOOL AddMinutes(FX_INT32 iMinutes); + FX_BOOL AddSeconds(FX_INT32 iSeconds); + FX_BOOL AddMilliseconds(FX_INT32 iMilliseconds); + friend CFX_Unitime operator + (const CFX_Unitime &t1, const CFX_Unitime &t2) + { + return CFX_Unitime(t1.m_iUnitime + t2.m_iUnitime); + } + friend CFX_Unitime operator + (const CFX_Unitime &t1, FX_UNITIME t2) + { + return CFX_Unitime(t1.m_iUnitime + t2); + } + friend CFX_Unitime operator + (FX_UNITIME t1, const CFX_Unitime &t2) + { + return CFX_Unitime(t1 + t2.m_iUnitime); + } + friend CFX_Unitime operator - (const CFX_Unitime &t1, const CFX_Unitime &t2) + { + return CFX_Unitime(t1.m_iUnitime + t2.m_iUnitime); + } + friend CFX_Unitime operator - (const CFX_Unitime &t1, FX_UNITIME t2) + { + return CFX_Unitime(t1.m_iUnitime + t2); + } + friend CFX_Unitime operator - (FX_UNITIME t1, const CFX_Unitime &t2) + { + return CFX_Unitime(t1 + t2.m_iUnitime); + } + friend FX_BOOL operator == (const CFX_Unitime &t1, const CFX_Unitime &t2) + { + return t1.m_iUnitime == t2.m_iUnitime; + } + friend FX_BOOL operator == (const CFX_Unitime &t1, FX_UNITIME t2) + { + return t1.m_iUnitime == t2; + } + friend FX_BOOL operator == (FX_UNITIME t1, const CFX_Unitime &t2) + { + return t1 == t2.m_iUnitime; + } + friend FX_BOOL operator != (const CFX_Unitime &t1, const CFX_Unitime &t2) + { + return t1.m_iUnitime != t2.m_iUnitime; + } + friend FX_BOOL operator != (const CFX_Unitime &t1, FX_UNITIME t2) + { + return t1.m_iUnitime != t2; + } + friend FX_BOOL operator != (FX_UNITIME t1, const CFX_Unitime &t2) + { + return t1 != t2.m_iUnitime; + } + friend FX_BOOL operator > (const CFX_Unitime &t1, const CFX_Unitime &t2) + { + return t1.m_iUnitime > t2.m_iUnitime; + } + friend FX_BOOL operator > (const CFX_Unitime &t1, FX_UNITIME t2) + { + return t1.m_iUnitime > t2; + } + friend FX_BOOL operator > (FX_UNITIME t1, const CFX_Unitime &t2) + { + return t1 > t2.m_iUnitime; + } + friend FX_BOOL operator >= (const CFX_Unitime &t1, const CFX_Unitime &t2) + { + return t1.m_iUnitime >= t2.m_iUnitime; + } + friend FX_BOOL operator >= (const CFX_Unitime &t1, FX_UNITIME t2) + { + return t1.m_iUnitime >= t2; + } + friend FX_BOOL operator >= (FX_UNITIME t1, const CFX_Unitime &t2) + { + return t1 >= t2.m_iUnitime; + } + friend FX_BOOL operator < (const CFX_Unitime &t1, const CFX_Unitime &t2) + { + return t1.m_iUnitime < t2.m_iUnitime; + } + friend FX_BOOL operator < (const CFX_Unitime &t1, FX_UNITIME t2) + { + return t1.m_iUnitime < t2; + } + friend FX_BOOL operator < (FX_UNITIME t1, const CFX_Unitime &t2) + { + return t1 < t2.m_iUnitime; + } + friend FX_BOOL operator <= (const CFX_Unitime &t1, const CFX_Unitime &t2) + { + return t1.m_iUnitime <= t2.m_iUnitime; + } + friend FX_BOOL operator <= (const CFX_Unitime &t1, FX_UNITIME t2) + { + return t1.m_iUnitime <= t2; + } + friend FX_BOOL operator <= (FX_UNITIME t1, const CFX_Unitime &t2) + { + return t1 <= t2.m_iUnitime; + } +private: + FX_UNITIME m_iUnitime; +}; +#if _FX_OS_ != _FX_ANDROID_ +#pragma pack(push, 1) +#endif +typedef struct _FX_DATE { + FX_INT32 year; + FX_BYTE month; + FX_BYTE day; +} FX_DATE, * FX_LPDATE; +typedef FX_DATE const * FX_LPCDATE; +typedef struct _FX_TIME { + FX_BYTE hour; + FX_BYTE minute; + FX_BYTE second; + FX_WORD millisecond; +} FX_TIME, * FX_LPTIME; +typedef FX_TIME const * FX_LPCTIME; +typedef struct _FX_TIMEZONE { + FX_INT8 tzHour; + FX_BYTE tzMinute; +} FX_TIMEZONE, * FX_LPTIMEZONE; +typedef FX_TIMEZONE const * FX_LPCTIMEZONE; +typedef struct _FX_DATETIME { + union { + struct { + FX_INT32 year; + FX_BYTE month; + FX_BYTE day; + } sDate; + FX_DATE aDate; + } Date; + union { + struct { + FX_BYTE hour; + FX_BYTE minute; + FX_BYTE second; + FX_WORD millisecond; + } sTime; + FX_TIME aTime; + } Time; +} FX_DATETIME, * FX_LPDATETIME; +typedef FX_DATETIME const * FX_LPCDATETIME; +typedef struct _FX_DATETIMEZONE { + union { + struct { + union { + struct { + FX_INT32 year; + FX_BYTE month; + FX_BYTE day; + }; + FX_DATE date; + }; + union { + struct { + FX_BYTE hour; + FX_BYTE minute; + FX_BYTE second; + FX_WORD millisecond; + }; + FX_TIME time; + }; + }; + FX_DATETIME dt; + }; + union { + struct { + FX_INT8 tzHour; + FX_BYTE tzMinute; + }; + FX_TIMEZONE tz; + }; +} FX_DATETIMEZONE, * FX_LPDATETIMEZONE; +typedef FX_DATETIMEZONE const * FX_LPCDATETIMEZONE; +#if _FX_OS_ != _FX_ANDROID_ +#pragma pack(pop) +#endif +class CFX_DateTime : public CFX_Object +{ +public: + CFX_DateTime() {} + CFX_DateTime(const FX_DATETIME &dt) + { + m_DateTime = dt; + } + CFX_DateTime(const CFX_DateTime &dt) + { + m_DateTime = dt.m_DateTime; + } + operator FX_DATETIME * () + { + return &m_DateTime; + } + operator FX_DATETIME const * () const + { + return &m_DateTime; + } + operator FX_DATETIME& () + { + return m_DateTime; + } + operator const FX_DATETIME& () const + { + return m_DateTime; + } + CFX_DateTime& operator = (const CFX_DateTime &dt) + { + m_DateTime = dt.m_DateTime; + return *this; + } + CFX_DateTime& operator = (const FX_DATETIME &dt) + { + m_DateTime = dt; + return *this; + } + CFX_DateTime& operator += (const CFX_DateTime &dt) + { + FromUnitime(ToUnitime() + dt.ToUnitime()); + return *this; + } + CFX_DateTime& operator += (const FX_DATETIME &dt) + { + FromUnitime(ToUnitime() + ((const CFX_DateTime&)dt).ToUnitime()); + return *this; + } + CFX_DateTime& operator -= (const CFX_DateTime &dt) + { + FromUnitime(ToUnitime() - dt.ToUnitime()); + return *this; + } + CFX_DateTime& operator -= (const FX_DATETIME &dt) + { + FromUnitime(ToUnitime() - ((const CFX_DateTime&)dt).ToUnitime()); + return *this; + } + virtual FX_BOOL Set(FX_INT32 year, FX_BYTE month, FX_BYTE day, FX_BYTE hour = 0, FX_BYTE minute = 0, FX_BYTE second = 0, FX_WORD millisecond = 0); + virtual FX_BOOL FromUnitime(FX_UNITIME t); + virtual FX_UNITIME ToUnitime() const; + virtual FX_INT32 GetYear() const; + virtual FX_BYTE GetMonth() const; + virtual FX_BYTE GetDay() const; + virtual FX_WEEKDAY GetDayOfWeek() const; + virtual FX_WORD GetDayOfYear() const; + virtual FX_INT64 GetDayOfAD() const; + virtual FX_BYTE GetHour() const; + virtual FX_BYTE GetMinute() const; + virtual FX_BYTE GetSecond() const; + virtual FX_WORD GetMillisecond() const; + virtual FX_BOOL AddYears(FX_INT32 iYears); + virtual FX_BOOL AddMonths(FX_INT32 iMonths); + virtual FX_BOOL AddDays(FX_INT32 iDays); + virtual FX_BOOL AddHours(FX_INT32 iHours); + virtual FX_BOOL AddMinutes(FX_INT32 iMinutes); + virtual FX_BOOL AddSeconds(FX_INT32 iSeconds); + virtual FX_BOOL AddMilliseconds(FX_INT32 iMilliseconds); + friend CFX_DateTime operator + (const CFX_DateTime &dt1, const CFX_DateTime &dt2) + { + CFX_DateTime dt; + dt.FromUnitime(dt1.ToUnitime() + dt2.ToUnitime()); + return dt; + } + friend CFX_DateTime operator + (const CFX_DateTime &dt1, const FX_DATETIME &dt2) + { + CFX_DateTime dt; + dt.FromUnitime(dt1.ToUnitime() + ((const CFX_DateTime&)dt2).ToUnitime()); + return dt; + } + friend CFX_DateTime operator + (const FX_DATETIME &dt1, const CFX_DateTime &dt2) + { + CFX_DateTime dt; + dt.FromUnitime(((const CFX_DateTime&)dt1).ToUnitime() + dt2.ToUnitime()); + return dt; + } + friend CFX_DateTime operator - (const CFX_DateTime &dt1, const CFX_DateTime &dt2) + { + CFX_DateTime dt; + dt.FromUnitime(dt1.ToUnitime() - dt2.ToUnitime()); + return dt; + } + friend CFX_DateTime operator - (const CFX_DateTime &dt1, const FX_DATETIME &dt2) + { + CFX_DateTime dt; + dt.FromUnitime(dt1.ToUnitime() - ((const CFX_DateTime&)dt2).ToUnitime()); + return dt; + } + friend CFX_DateTime operator - (const FX_DATETIME &dt1, const CFX_DateTime &dt2) + { + CFX_DateTime dt; + dt.FromUnitime(((const CFX_DateTime&)dt1).ToUnitime() - dt2.ToUnitime()); + return dt; + } + friend FX_BOOL operator == (const CFX_DateTime &dt1, const CFX_DateTime &dt2) + { + return FXSYS_memcmp((FX_LPCDATETIME)dt1, (FX_LPCDATETIME)dt2, sizeof(FX_DATETIME)) == 0; + } + friend FX_BOOL operator == (const CFX_DateTime &dt1, const FX_DATETIME &dt2) + { + return FXSYS_memcmp((FX_LPCDATETIME)dt1, &dt2, sizeof(FX_DATETIME)) == 0; + } + friend FX_BOOL operator == (const FX_DATETIME &dt1, const CFX_DateTime &dt2) + { + return FXSYS_memcmp(&dt1, (FX_LPCDATETIME)dt2, sizeof(FX_DATETIME)) == 0; + } + friend FX_BOOL operator != (const CFX_DateTime &dt1, const CFX_DateTime &dt2) + { + return FXSYS_memcmp((FX_LPCDATETIME)dt1, (FX_LPCDATETIME)dt2, sizeof(FX_DATETIME)) != 0; + } + friend FX_BOOL operator != (const CFX_DateTime &dt1, const FX_DATETIME &dt2) + { + return FXSYS_memcmp((FX_LPCDATETIME)dt1, &dt2, sizeof(FX_DATETIME)) != 0; + } + friend FX_BOOL operator != (const FX_DATETIME &dt1, const CFX_DateTime &dt2) + { + return FXSYS_memcmp(&dt1, (FX_LPCDATETIME)dt2, sizeof(FX_DATETIME)) != 0; + } + friend FX_BOOL operator > (const CFX_DateTime &dt1, const CFX_DateTime &dt2) + { + return dt1.ToUnitime() > dt2.ToUnitime(); + } + friend FX_BOOL operator > (const CFX_DateTime &dt1, const FX_DATETIME &dt2) + { + return dt1.ToUnitime() > ((const CFX_DateTime&)dt2).ToUnitime(); + } + friend FX_BOOL operator > (const FX_DATETIME &dt1, const CFX_DateTime &dt2) + { + return ((const CFX_DateTime&)dt1).ToUnitime() > dt2.ToUnitime(); + } + friend FX_BOOL operator >= (const CFX_DateTime &dt1, const CFX_DateTime &dt2) + { + return dt1.ToUnitime() >= dt2.ToUnitime(); + } + friend FX_BOOL operator >= (const CFX_DateTime &dt1, const FX_DATETIME &dt2) + { + return dt1.ToUnitime() >= ((const CFX_DateTime&)dt2).ToUnitime(); + } + friend FX_BOOL operator >= (const FX_DATETIME &dt1, const CFX_DateTime &dt2) + { + return ((const CFX_DateTime&)dt1).ToUnitime() >= dt2.ToUnitime(); + } + friend FX_BOOL operator < (const CFX_DateTime &dt1, const CFX_DateTime &dt2) + { + return dt1.ToUnitime() < dt2.ToUnitime(); + } + friend FX_BOOL operator < (const CFX_DateTime &dt1, const FX_DATETIME &dt2) + { + return dt1.ToUnitime() < ((const CFX_DateTime&)dt2).ToUnitime(); + } + friend FX_BOOL operator < (const FX_DATETIME &dt1, const CFX_DateTime &dt2) + { + return ((const CFX_DateTime&)dt1).ToUnitime() < dt2.ToUnitime(); + } + friend FX_BOOL operator <= (const CFX_DateTime &dt1, const CFX_DateTime &dt2) + { + return dt1.ToUnitime() <= dt2.ToUnitime(); + } + friend FX_BOOL operator <= (const CFX_DateTime &dt1, const FX_DATETIME &dt2) + { + return dt1.ToUnitime() <= ((const CFX_DateTime&)dt2).ToUnitime(); + } + friend FX_BOOL operator <= (const FX_DATETIME &dt1, const CFX_DateTime &dt2) + { + return ((const CFX_DateTime&)dt1).ToUnitime() <= dt2.ToUnitime(); + } +private: + FX_DATETIME m_DateTime; +}; +#endif diff --git a/xfa/src/fgas/include/fx_fnt.h b/xfa/src/fgas/include/fx_fnt.h new file mode 100644 index 0000000000..d664853df7 --- /dev/null +++ b/xfa/src/fgas/include/fx_fnt.h @@ -0,0 +1,170 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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_FONT +#define _FX_FONT +class IFX_Font; +class IFX_FontMgr; +#define FX_FONTSTYLE_Normal 0x00 +#define FX_FONTSTYLE_FixedPitch 0x01 +#define FX_FONTSTYLE_Serif 0x02 +#define FX_FONTSTYLE_Symbolic 0x04 +#define FX_FONTSTYLE_Script 0x08 +#define FX_FONTSTYLE_Italic 0x40 +#define FX_FONTSTYLE_Bold 0x40000 +#define FX_FONTSTYLE_BoldItalic (FX_FONTSTYLE_Bold|FX_FONTSTYLE_Italic) +#define FX_FONTSTYLE_ExactMatch 0x80000000 +#define FX_FONTDECORATION_Underline 0x00000001 +#define FX_FONTDECORATION_Strikeout 0x00000002 +#define FX_FONTDECORATION_Overline 0x00000004 +#define FX_FONTDECORATION_Emphasis 0x00000008 +#define FX_FONTDECORATION_Superscript 0x00000010 +#define FX_FONTDECORATION_Subscript 0x00000020 +#define FX_FONTDECORATION_SmallCapital 0x00000040 +#define FX_FONTDECORATION_Capital 0x00000080 +#define FX_FONTDECORATION_Lowercase 0x000000C0 +#define FX_FONTDECORATION_Raised 0x00000100 +#define FX_FONTDECORATION_Sunken 0x00000200 +#define FX_FONTDECORATION_Shadow 0x00000400 +#define FX_FONTDECORATION_BoundingShape 0x20000000 +#define FX_FONTDECORATION_Hide 0x40000000 +#define FX_FONTDECORATION_StrokeFill 0x80000000 +#define FX_BOUNDINGSHAPE_None 0 +#define FX_BOUNDINGSHAPE_Circle 1 +#define FX_BOUNDINGSHAPE_Square 2 +#define FX_BOUNDINGSHAPE_Triangle 3 +#define FX_BOUNDINGSHAPE_Diamond 4 +class IFX_FontProvider +{ +public: + virtual FX_BOOL GetCharWidth(IFX_Font* pFont, FX_WCHAR wUnicode, FX_INT32 &iWidth, FX_BOOL bCharCode = FALSE) = 0; +}; +class IFX_Font +{ +public: + static IFX_Font* LoadFont(FX_LPCWSTR pszFontFamily, FX_DWORD dwFontStyles, FX_WORD wCodePage, IFX_FontMgr *pFontMgr); + static IFX_Font* LoadFont(FX_LPCBYTE pBuffer, FX_INT32 iLength, IFX_FontMgr *pFontMgr); + static IFX_Font* LoadFont(FX_LPCWSTR pszFileName, IFX_FontMgr *pFontMgr); + static IFX_Font* LoadFont(IFX_Stream *pFontStream, IFX_FontMgr *pFontMgr, FX_BOOL bSaveStream = FALSE); + static IFX_Font* LoadFont(CFX_Font *pExtFont, IFX_FontMgr *pFontMgr, FX_BOOL bTakeOver = FALSE); + virtual void Release() = 0; + virtual IFX_Font* Retain() = 0; + virtual IFX_Font* Derive(FX_DWORD dwFontStyles, FX_WORD wCodePage = 0) = 0; + virtual void GetFamilyName(CFX_WideString &wsFamily) const = 0; + virtual void GetPsName(CFX_WideString &wsName) const = 0; + virtual FX_DWORD GetFontStyles() const = 0; + virtual FX_BYTE GetCharSet() const = 0; + virtual FX_BOOL GetCharWidth(FX_WCHAR wUnicode, FX_INT32 &iWidth, FX_BOOL bCharCode = FALSE) = 0; + virtual FX_INT32 GetGlyphIndex(FX_WCHAR wUnicode, FX_BOOL bCharCode = FALSE) = 0; + virtual FX_INT32 GetAscent() const = 0; + virtual FX_INT32 GetDescent() const = 0; + virtual FX_BOOL GetCharBBox(FX_WCHAR wUnicode, CFX_Rect &bbox, FX_BOOL bCharCode = FALSE) = 0; + virtual FX_BOOL GetBBox(CFX_Rect &bbox) = 0; + virtual FX_INT32 GetItalicAngle() const = 0; + virtual void Reset() = 0; + virtual IFX_Font* GetSubstFont(FX_INT32 iGlyphIndex) const = 0; + virtual void* GetDevFont() const = 0; + virtual void SetFontProvider(IFX_FontProvider* pProvider) = 0; +#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ + virtual void SetLogicalFontStyle(FX_DWORD dwLogFontStyle) = 0; +#endif +}; +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ +typedef struct _FX_FONTMATCHPARAMS : public CFX_Object { + FX_LPCWSTR pwsFamily; + FX_DWORD dwFontStyles; + FX_DWORD dwUSB; + FX_DWORD dwMatchFlags; + FX_WCHAR wUnicode; + FX_WORD wCodePage; +} FX_FONTMATCHPARAMS, * FX_LPFONTMATCHPARAMS; +typedef FX_FONTMATCHPARAMS const * FX_LPCFONTMATCHPARAMS; +typedef struct _FX_FONTSIGNATURE : public CFX_Target { + FX_DWORD fsUsb[4]; + FX_DWORD fsCsb[2]; +} FX_FONTSIGNATURE; +typedef struct _FX_FONTDESCRIPTOR : public CFX_Target { + FX_WCHAR wsFontFace[32]; + FX_DWORD dwFontStyles; + FX_BYTE uCharSet; + FX_FONTSIGNATURE FontSignature; +} FX_FONTDESCRIPTOR, * FX_LPFONTDESCRIPTOR; +typedef FX_FONTDESCRIPTOR const * FX_LPCFONTDESCRIPTOR; +typedef CFX_MassArrayTemplate CFX_FontDescriptors; +inline FX_BOOL operator == (const FX_FONTDESCRIPTOR &left, const FX_FONTDESCRIPTOR &right) +{ + return left.uCharSet == right.uCharSet + && left.dwFontStyles == right.dwFontStyles + && FXSYS_wcscmp(left.wsFontFace, right.wsFontFace) == 0 + && FXSYS_memcmp(&left.FontSignature, &right.FontSignature, sizeof(FX_FONTSIGNATURE)) == 0; +} +#define FX_FONTMATCHPARA_MacthStyle 0x01 +#define FX_FONTMATCHPARA_MacthFamily 0x02 +#define FX_FONTMATCHPARA_MacthUnicode 0x04 +typedef void (*FX_LPEnumAllFonts)(CFX_FontDescriptors &fonts, FX_LPVOID pUserData, FX_LPCWSTR pwsFaceName, FX_WCHAR wUnicode); +FX_LPEnumAllFonts FX_GetDefFontEnumerator(); +typedef FX_LPCFONTDESCRIPTOR (*FX_LPMatchFont)(FX_LPFONTMATCHPARAMS pParams, const CFX_FontDescriptors &fonts, FX_LPVOID pUserData); +FX_LPMatchFont FX_GetDefFontMatchor(); +class IFX_FontMgr +{ +public: + static IFX_FontMgr* Create(FX_LPEnumAllFonts pEnumerator, FX_LPMatchFont pMatcher = NULL, FX_LPVOID pUserData = NULL); + virtual void Release() = 0; + virtual IFX_Font* GetDefFontByCodePage(FX_WORD wCodePage, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0; + virtual IFX_Font* GetDefFontByCharset(FX_BYTE nCharset, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0; + virtual IFX_Font* GetDefFontByUnicode(FX_WCHAR wUnicode, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0; + virtual IFX_Font* GetDefFontByLanguage(FX_WORD wLanguage, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0; + virtual IFX_Font* LoadFont(FX_LPCWSTR pszFontFamily, FX_DWORD dwFontStyles, FX_WORD wCodePage = 0xFFFF) = 0; + virtual IFX_Font* LoadFont(FX_LPCBYTE pBuffer, FX_INT32 iLength) = 0; + virtual IFX_Font* LoadFont(FX_LPCWSTR pszFileName) = 0; + virtual IFX_Font* LoadFont(IFX_Stream *pFontStream, FX_LPCWSTR pszFontAlias = NULL, FX_DWORD dwFontStyles = 0, FX_WORD wCodePage = 0, FX_BOOL bSaveStream = FALSE) = 0; + virtual IFX_Font* LoadFont(IFX_Font *pSrcFont, FX_DWORD dwFontStyles, FX_WORD wCodePage = 0xFFFF) = 0; + virtual void ClearFontCache() = 0; + virtual void RemoveFont(IFX_Font *pFont) = 0; +}; +#else +class IFX_FontMgrDelegate +{ +public: + virtual IFX_Font* GetDefFontByCodePage(IFX_FontMgr* pFontMgr, FX_WORD wCodePage, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0; + virtual IFX_Font* GetDefFontByCharset(IFX_FontMgr* pFontMgr, FX_BYTE nCharset, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0; + virtual IFX_Font* GetDefFontByUnicode(IFX_FontMgr* pFontMgr, FX_WCHAR wUnicode, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0; + virtual IFX_Font* GetDefFontByLanguage(IFX_FontMgr* pFontMgr, FX_WORD wLanguage, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0; +}; +class IFX_FontSourceEnum +{ +public: + virtual void Release() = 0; + virtual FX_POSITION GetStartPosition(FX_LPVOID pUserData = NULL) = 0; + virtual IFX_FileAccess* GetNext(FX_POSITION& pos, FX_LPVOID pUserData = NULL) = 0; +}; +IFX_FontSourceEnum* FX_CreateDefaultFontSourceEnum(); +class IFX_FontMgr +{ +public: + static IFX_FontMgr* Create(IFX_FontSourceEnum* pFontEnum, IFX_FontMgrDelegate* pDelegate = NULL, FX_LPVOID pUserData = NULL); + virtual void Release() = 0; + virtual IFX_Font* GetDefFontByCodePage(FX_WORD wCodePage, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0; + virtual IFX_Font* GetDefFontByCharset(FX_BYTE nCharset, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0; + virtual IFX_Font* GetDefFontByUnicode(FX_WCHAR wUnicode, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0; + virtual IFX_Font* GetDefFontByLanguage(FX_WORD wLanguage, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0; + virtual IFX_Font* GetFontByCodePage(FX_WORD wCodePage, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0; + inline IFX_Font* LoadFont(FX_LPCWSTR pszFontFamily, FX_DWORD dwFontStyles, FX_WORD wCodePage) + { + return GetFontByCodePage(wCodePage, dwFontStyles, pszFontFamily); + } + virtual IFX_Font* GetFontByCharset(FX_BYTE nCharset, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0; + virtual IFX_Font* GetFontByUnicode(FX_WCHAR wUnicode, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0; + virtual IFX_Font* GetFontByLanguage(FX_WORD wLanguage, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0; + virtual IFX_Font* LoadFont(FX_LPCBYTE pBuffer, FX_INT32 iLength, FX_INT32 iFaceIndex, FX_INT32* pFaceCount = NULL) = 0; + virtual IFX_Font* LoadFont(FX_LPCWSTR pszFileName, FX_INT32 iFaceIndex, FX_INT32* pFaceCount = NULL) = 0; + virtual IFX_Font* LoadFont(IFX_Stream *pFontStream, FX_INT32 iFaceIndex, FX_INT32* pFaceCount = NULL, FX_BOOL bSaveStream = FALSE) = 0; + + virtual void ClearFontCache() = 0; + virtual void RemoveFont(IFX_Font *pFont) = 0; +}; +#endif +#endif diff --git a/xfa/src/fgas/include/fx_lbk.h b/xfa/src/fgas/include/fx_lbk.h new file mode 100644 index 0000000000..3c7aa5d7dd --- /dev/null +++ b/xfa/src/fgas/include/fx_lbk.h @@ -0,0 +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 + +#ifndef _FX_LINEBREAK +#define _FX_LINEBREAK +enum FX_LINEBREAKTYPE { + FX_LBT_UNKNOWN = 0x00, + FX_LBT_DIRECT_BRK = 0x1A, + FX_LBT_INDIRECT_BRK = 0x2B, + FX_LBT_COM_INDIRECT_BRK = 0x3C, + FX_LBT_COM_PROHIBITED_BRK = 0x4D, + FX_LBT_PROHIBITED_BRK = 0x5E, + FX_LBT_HANGUL_SPACE_BRK = 0x6F, +}; +#define FX_LBUN FX_LBT_UNKNOWN +#define FX_LBDB FX_LBT_DIRECT_BRK +#define FX_LBIB FX_LBT_INDIRECT_BRK +#define FX_LBCB FX_LBT_COM_INDIRECT_BRK +#define FX_LBCP FX_LBT_COM_PROHIBITED_BRK +#define FX_LBPB FX_LBT_PROHIBITED_BRK +#define FX_LBHS FX_LBT_HANGUL_SPACE_BRK +void FX_GetLineBreakPositions(FX_LPCWSTR pwsText, FX_LINEBREAKTYPE *pBrkType, FX_INT32 iLength); +void FX_GetLineBreakPositions(FX_LPCWSTR pwsText, FX_INT32 iLength, CFX_Int32MassArray &bp); +#endif diff --git a/xfa/src/fgas/include/fx_lgg.h b/xfa/src/fgas/include/fx_lgg.h new file mode 100644 index 0000000000..6f4786e319 --- /dev/null +++ b/xfa/src/fgas/include/fx_lgg.h @@ -0,0 +1,267 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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_LANGUAGE +#define _FX_LANGUAGE +#define FX_LANG_Neutral 0x0000 +#define FX_LANG_Invariant 0x007f +#define FX_LANG_UserDefault 0x0400 +#define FX_LANG_SystemDefault 0x0800 +#define FX_LANG_Afrikaans_SouthAfrica 0x0436 +#define FX_LANG_Albanian_Albania 0x041c +#define FX_LANG_Alsatian_France 0x0484 +#define FX_LANG_Amharic_Ethiopia 0x045e +#define FX_LANG_Arabic_Algeria 0x1401 +#define FX_LANG_Arabic_Bahrain 0x3c01 +#define FX_LANG_Arabic_Egypt 0x0c01 +#define FX_LANG_Arabic_Iraq 0x0801 +#define FX_LANG_Arabic_Jordan 0x2c01 +#define FX_LANG_Arabic_Kuwait 0x3401 +#define FX_LANG_Arabic_Lebanon 0x3001 +#define FX_LANG_Arabic_Libya 0x1001 +#define FX_LANG_Arabic_Morocco 0x1801 +#define FX_LANG_Arabic_Oman 0x2001 +#define FX_LANG_Arabic_Qatar 0x4001 +#define FX_LANG_Arabic_SaudiArabia 0x0401 +#define FX_LANG_Arabic_Syria 0x2801 +#define FX_LANG_Arabic_Tunisia 0x1c01 +#define FX_LANG_Arabic_UAE 0x3801 +#define FX_LANG_Arabic_Yemen 0x2401 +#define FX_LANG_Armenian_Armenia 0x042b +#define FX_LANG_Assamese_India 0x044d +#define FX_LANG_Azerbaijan_Cyrillic 0x082c +#define FX_LANG_Azerbaijan_Latin 0x042c +#define FX_LANG_Bashkir_Russia 0x046d +#define FX_LANG_Basque_Basque 0x042d +#define FX_LANG_Belarusian_Belarus 0x0423 +#define FX_LANG_Bengali_Bangladesh 0x0845 +#define FX_LANG_Bengali_India 0x0445 +#define FX_LANG_Bosnia_Herzegovina 0x101a +#define FX_LANG_Bosnian_Cyrillic 0x201a +#define FX_LANG_Bosnian_Latin 0x141a +#define FX_LANG_Breton_France 0x047e +#define FX_LANG_Bulgarian_Bulgaria 0x0402 +#define FX_LANG_Burmese 0x0455 +#define FX_LANG_Catalan_Catalan 0x0403 +#define FX_LANG_Cherokee 0x045c +#define FX_LANG_Chinese_HongKong 0x0c04 +#define FX_LANG_Chinese_Macao 0x1404 +#define FX_LANG_Chinese_PRC 0x0804 +#define FX_LANG_Chinese_Singapore 0x1004 +#define FX_LANG_Chinese_Taiwan 0x0404 +#define FX_LANG_Corsican_France 0x0483 +#define FX_LANG_Croatian_Croatia 0x041a +#define FX_LANG_Croatian_Latin 0x101a +#define FX_LANG_CustomCurrent 0x0c00 +#define FX_LANG_CzechRepublic 0x0405 +#define FX_LANG_Danish_Denmark 0x0406 +#define FX_LANG_Dari_Afghanistan 0x048c +#define FX_LANG_Divehi_Maldives 0x0465 +#define FX_LANG_Dutch_Belgium 0x0813 +#define FX_LANG_Dutch_Netherlands 0x0413 +#define FX_LANG_Dutch_Preferred 0x0013 +#define FX_LANG_Dzongkha 0x0851 +#define FX_LANG_Edo 0x0466 +#define FX_LANG_English_Australia 0x0c09 +#define FX_LANG_English_Belize 0x2809 +#define FX_LANG_English_Canada 0x1009 +#define FX_LANG_English_Caribbean 0x2409 +#define FX_LANG_English_HongKong 0x3c09 +#define FX_LANG_English_India 0x4009 +#define FX_LANG_English_Indonesia 0x3809 +#define FX_LANG_English_Ireland 0x1809 +#define FX_LANG_English_Jamaica 0x2009 +#define FX_LANG_English_Malaysia 0x4409 +#define FX_LANG_English_NewZealand 0x1409 +#define FX_LANG_English_Philippines 0x3409 +#define FX_LANG_English_Singapore 0x4809 +#define FX_LANG_English_SouthAfrica 0x1c09 +#define FX_LANG_English_TrinidadTobago 0x2c09 +#define FX_LANG_English_UnitedKingdom 0x0809 +#define FX_LANG_English_UnitedStates 0x0409 +#define FX_LANG_English_Zimbabwe 0x3009 +#define FX_LANG_Estonian_Estonia 0x0425 +#define FX_LANG_Faroese_FaroeIslands 0x0438 +#define FX_LANG_Filipino_Philippines 0x0464 +#define FX_LANG_Finnish_Finland 0x040b +#define FX_LANG_French_Belgium 0x080c +#define FX_LANG_French_Cameroon 0x2c0c +#define FX_LANG_French_Canada 0x0c0c +#define FX_LANG_French_CongoDRC 0x240c +#define FX_LANG_French_CotedIvoire 0x300c +#define FX_LANG_French_France 0x040c +#define FX_LANG_French_Haiti 0x3c0c +#define FX_LANG_French_Luxembourg 0x140c +#define FX_LANG_French_Mali 0x340c +#define FX_LANG_French_Monaco 0x180c +#define FX_LANG_French_Morocco 0x380c +#define FX_LANG_French_Reunion 0x200c +#define FX_LANG_French_Senegal 0x280c +#define FX_LANG_French_Switzerland 0x100c +#define FX_LANG_French_WestIndies 0x1c0c +#define FX_LANG_Frisian_Netherlands 0x0462 +#define FX_LANG_Fulfulde 0x0467 +#define FX_LANG_Gaelic_Ireland 0x083c +#define FX_LANG_Gaelic_Scotland 0x043c +#define FX_LANG_Galician_Galician 0x0456 +#define FX_LANG_Georgian_Georgia 0x0437 +#define FX_LANG_German_Austria 0x0c07 +#define FX_LANG_German_Germany 0x0407 +#define FX_LANG_German_Liechtenstein 0x1407 +#define FX_LANG_German_Luxembourg 0x1007 +#define FX_LANG_German_Switzerland 0x0807 +#define FX_LANG_Greek_Greece 0x0408 +#define FX_LANG_Greenlandic_Greenland 0x046f +#define FX_LANG_Guarani 0x0474 +#define FX_LANG_Gujarati_India 0x0447 +#define FX_LANG_Hausa_LatinNigeria 0x0468 +#define FX_LANG_Hawaiian 0x0475 +#define FX_LANG_Hebrew_Israel 0x040d +#define FX_LANG_Hindi_India 0x0439 +#define FX_LANG_Hungarian_Hungary 0x040e +#define FX_LANG_Ibibio_Nigeria 0x0469 +#define FX_LANG_Icelandic_Iceland 0x040f +#define FX_LANG_Igbo_Nigeria 0x0470 +#define FX_LANG_Indonesian_Indonesia 0x0421 +#define FX_LANG_Inuktitut_LatinCanada 0x085d +#define FX_LANG_Inuktitut_SyllabicsCanada 0x045d +#define FX_LANG_IsiXhosa_SouthAfrica 0x0434 +#define FX_LANG_IsiZulu_SouthAfrica 0x0435 +#define FX_LANG_Italian_Italy 0x0410 +#define FX_LANG_Italian_Switzerland 0x0810 +#define FX_LANG_Japanese_Japan 0x0411 +#define FX_LANG_Kannada_India 0x044b +#define FX_LANG_Kanuri 0x0471 +#define FX_LANG_Kashmiri 0x0860 +#define FX_LANG_Kashmiri_Arabic 0x0460 +#define FX_LANG_Kazakh_Kazakhstan 0x043f +#define FX_LANG_Khmer_Cambodia 0x0453 +#define FX_LANG_Kiche_Guatemala 0x0486 +#define FX_LANG_Kinyarwanda_Rwanda 0x0487 +#define FX_LANG_Kiswahili_Kenya 0x0441 +#define FX_LANG_Konkani_India 0x0457 +#define FX_LANG_Korean_Korea 0x0412 +#define FX_LANG_Kyrgyz_Kyrgyzstan 0x0440 +#define FX_LANG_Lao_LaoPDR 0x0454 +#define FX_LANG_Latin 0x0476 +#define FX_LANG_Latvian_Latvia 0x0426 +#define FX_LANG_Lithuanian_Lithuania 0x0427 +#define FX_LANG_LithuanianTrad 0x0827 +#define FX_LANG_Lower Sorbian_Germany 0x082e +#define FX_LANG_Luxembourgish_Luxembourg 0x046e +#define FX_LANG_Macedonian 0x042f +#define FX_LANG_Malay_BruneiDarussalam 0x083e +#define FX_LANG_Malay_Malaysia 0x043e +#define FX_LANG_Malayalam_India 0x044c +#define FX_LANG_Maldivian 0x0465 +#define FX_LANG_Maltese_Malta 0x043a +#define FX_LANG_Manipuri 0x0458 +#define FX_LANG_Maori_NewZealand 0x0481 +#define FX_LANG_Mapudungun_Chile 0x047a +#define FX_LANG_Marathi_India 0x044e +#define FX_LANG_Mohawk_Mohawk 0x047c +#define FX_LANG_Mongolian_CyrillicMongolia 0x0450 +#define FX_LANG_Mongolian_TraditionalMongolian 0x0850 +#define FX_LANG_Nepali_India 0x0861 +#define FX_LANG_Nepali_Nepal 0x0461 +#define FX_LANG_Norwegian_Bokmal 0x0414 +#define FX_LANG_Norwegian_Nynorsk 0x0814 +#define FX_LANG_Occitan_France 0x0482 +#define FX_LANG_Oriya_India 0x0448 +#define FX_LANG_Oromo 0x0472 +#define FX_LANG_Papiamentu 0x0479 +#define FX_LANG_Pashto_Afghanistan 0x0463 +#define FX_LANG_Persian 0x0429 +#define FX_LANG_Polish_Poland 0x0415 +#define FX_LANG_Portuguese_Brazil 0x0416 +#define FX_LANG_Portuguese_Portugal 0x0816 +#define FX_LANG_Punjabi_India 0x0446 +#define FX_LANG_Punjabi_Pakistan 0x0846 +#define FX_LANG_Quechua_Bolivia 0x046b +#define FX_LANG_Quechua_Ecuador 0x086b +#define FX_LANG_Quechua_Peru 0x0c6b +#define FX_LANG_Romanian_Moldova 0x0818 +#define FX_LANG_Romanian_Romania 0x0418 +#define FX_LANG_Romansh_Switzerland 0x0417 +#define FX_LANG_Russian_Moldova 0x0819 +#define FX_LANG_Russian_Russia 0x0419 +#define FX_LANG_Sami_InariFinland 0x243b +#define FX_LANG_Sami_LuleNorway 0x103b +#define FX_LANG_Sami_LuleSweden 0x143b +#define FX_LANG_Sami_NorthernFinland 0x0c3b +#define FX_LANG_Sami_NorthernNorway 0x043b +#define FX_LANG_Sami_NorthernSweden 0x083b +#define FX_LANG_Sami_SkoltFinland 0x203b +#define FX_LANG_Sami_SouthernNorway 0x183b +#define FX_LANG_Sami_SouthernSweden 0x1c3b +#define FX_LANG_SanskritIndia 0x044f +#define FX_LANG_SerbianCyrillic_BosniaHerzegovina 0x1c1a +#define FX_LANG_SerbianCyrillic_Serbia 0x0c1a +#define FX_LANG_SerbianLatin_BosniaHerzegovina 0x181a +#define FX_LANG_SerbianLatin_Serbia 0x081a +#define FX_LANG_SesothoSaLeboa 0x046c +#define FX_LANG_Setswana_SouthAfrica 0x0432 +#define FX_LANG_Sindhi_Arabic 0x0859 +#define FX_LANG_Sindhi_Devanagari 0x0459 +#define FX_LANG_Sinhala_SriLanka 0x045b +#define FX_LANG_Slovak_Slovakia 0x041b +#define FX_LANG_Slovenian_Slovenia 0x0424 +#define FX_LANG_Somali 0x0477 +#define FX_LANG_Spanish_Argentina 0x2c0a +#define FX_LANG_Spanish_Bolivia 0x400a +#define FX_LANG_Spanish_Chile 0x340a +#define FX_LANG_Spanish_Colombia 0x240a +#define FX_LANG_Spanish_CostaRica 0x140a +#define FX_LANG_Spanish_DominicanRepublic 0x1c0a +#define FX_LANG_Spanish_Ecuador 0x300a +#define FX_LANG_Spanish_ElSalvador 0x440a +#define FX_LANG_Spanish_Guatemala 0x100a +#define FX_LANG_Spanish_Honduras 0x480a +#define FX_LANG_Spanish_Mexico 0x080a +#define FX_LANG_Spanish_Nicaragua 0x4c0a +#define FX_LANG_Spanish_Panama 0x180a +#define FX_LANG_Spanish_Paraguay 0x3c0a +#define FX_LANG_Spanish_Peru 0x280a +#define FX_LANG_Spanish_PuertoRico 0x500a +#define FX_LANG_Spanish_InternationalSort 0x0c0a +#define FX_LANG_Spanish_TraditionalSort 0x040a +#define FX_LANG_Spanish_UnitedStates 0x540a +#define FX_LANG_Spanish_Uruguay 0x380a +#define FX_LANG_Spanish_Venezuela 0x200a +#define FX_LANG_Sutu_SouthAfrica 0x0430 +#define FX_LANG_Swedish_Finland 0x081d +#define FX_LANG_Swedish_Sweden 0x041d +#define FX_LANG_Syriac_Syria 0x045a +#define FX_LANG_Tajik_CyrillicTajikistan 0x0428 +#define FX_LANG_Tamazight_ArabicMorocco 0x045f +#define FX_LANG_Tamazight_LatinAlgeria 0x085f +#define FX_LANG_Tamil_India 0x0449 +#define FX_LANG_Tatar_Russia 0x0444 +#define FX_LANG_Telugu_India 0x044a +#define FX_LANG_Thai_Thailand 0x041e +#define FX_LANG_TibetanPRC 0x0451 +#define FX_LANG_Tigrigna_Eritrea 0x0873 +#define FX_LANG_Tigrigna_Ethiopia 0x0473 +#define FX_LANG_Tsonga 0x0431 +#define FX_LANG_Turkish_Turkey 0x041f +#define FX_LANG_Turkmen_Turkmenistan 0x0442 +#define FX_LANG_UighurPRC 0x0480 +#define FX_LANG_Ukrainian_Ukraine 0x0422 +#define FX_LANG_UpperSorbian_Germany 0x042e +#define FX_LANG_Urdu_Pakistan 0x0420 +#define FX_LANG_Urdu_India 0x0820 +#define FX_LANG_Uzbek_CyrillicUzbekistan 0x0843 +#define FX_LANG_Uzbek_LatinUzbekistan 0x0443 +#define FX_LANG_Venda 0x0433 +#define FX_LANG_Vietnamese_Vietnam 0x042a +#define FX_LANG_Welsh_UnitedKingdom 0x0452 +#define FX_LANG_Wolof_Senegal 0x0488 +#define FX_LANG_Xhosa 0x0434 +#define FX_LANG_Yakut_Russia 0x0485 +#define FX_LANG_YiPRC 0x0478 +#define FX_LANG_Yiddish 0x043d +#define FX_LANG_Yoruba_Nigeria 0x046a +#endif diff --git a/xfa/src/fgas/include/fx_locale.h b/xfa/src/fgas/include/fx_locale.h new file mode 100644 index 0000000000..6886974fd2 --- /dev/null +++ b/xfa/src/fgas/include/fx_locale.h @@ -0,0 +1,160 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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_LOCALE_H_ +#define _FX_LOCALE_H_ +class CFX_Unitime; +class IFX_Locale; +class IFX_FormatString; +class IFX_LocaleMgr; +enum FX_LOCALENUMSYMBOL { + FX_LOCALENUMSYMBOL_Decimal, + FX_LOCALENUMSYMBOL_Grouping, + FX_LOCALENUMSYMBOL_Percent, + FX_LOCALENUMSYMBOL_Minus, + FX_LOCALENUMSYMBOL_Zero, + FX_LOCALENUMSYMBOL_CurrencySymbol, + FX_LOCALENUMSYMBOL_CurrencyName, +}; +enum FX_LOCALEDATETIMESUBCATEGORY { + FX_LOCALEDATETIMESUBCATEGORY_Default, + FX_LOCALEDATETIMESUBCATEGORY_Short, + FX_LOCALEDATETIMESUBCATEGORY_Medium, + FX_LOCALEDATETIMESUBCATEGORY_Full, + FX_LOCALEDATETIMESUBCATEGORY_Long, +}; +enum FX_LOCALENUMSUBCATEGORY { + FX_LOCALENUMPATTERN_Percent, + FX_LOCALENUMPATTERN_Currency, + FX_LOCALENUMPATTERN_Decimal, + FX_LOCALENUMPATTERN_Integer, +}; +enum FX_LOCALECATEGORY { + FX_LOCALECATEGORY_Unknown, + FX_LOCALECATEGORY_Date, + FX_LOCALECATEGORY_Time, + FX_LOCALECATEGORY_DateTime, + FX_LOCALECATEGORY_Num, + FX_LOCALECATEGORY_Text, + FX_LOCALECATEGORY_Zero, + FX_LOCALECATEGORY_Null, +}; +enum FX_DATETIMETYPE { + FX_DATETIMETYPE_Unknown, + FX_DATETIMETYPE_Date, + FX_DATETIMETYPE_Time, + FX_DATETIMETYPE_DateTime, + FX_DATETIMETYPE_TimeDate, +}; +class IFX_Locale +{ +public: + static IFX_Locale* Create(CXML_Element* pLocaleData); + + virtual void Release() = 0; + + + virtual CFX_WideString GetName() = 0; + + virtual void GetNumbericSymbol(FX_LOCALENUMSYMBOL eType, CFX_WideString& wsNumSymbol) const = 0; + virtual void GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const = 0; + virtual void GetMonthName(FX_INT32 nMonth, CFX_WideString& wsMonthName, FX_BOOL bAbbr = TRUE) const = 0; + virtual void GetDayName(FX_INT32 nWeek, CFX_WideString& wsDayName, FX_BOOL bAbbr = TRUE) const = 0; + virtual void GetMeridiemName(CFX_WideString& wsMeridiemName, FX_BOOL bAM = TRUE) const = 0; + virtual void GetTimeZone(FX_TIMEZONE& tz) const = 0; + virtual void GetEraName(CFX_WideString& wsEraName, FX_BOOL bAD = TRUE) const = 0; + virtual void GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType, CFX_WideString& wsPattern) const = 0; + virtual void GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType, CFX_WideString& wsPattern) const = 0; + virtual void GetNumPattern(FX_LOCALENUMSUBCATEGORY eType, CFX_WideString& wsPattern) const = 0; +}; +class IFX_LocaleMgr +{ +public: + virtual void Release() = 0; + virtual FX_WORD GetDefLocaleID() = 0; + virtual IFX_Locale* GetDefLocale() = 0; + virtual IFX_Locale* GetLocale(FX_WORD lcid) = 0; + virtual IFX_Locale* GetLocaleByName(FX_WSTR wsLocaleName) = 0; +}; +IFX_LocaleMgr* FX_LocaleMgr_Create(FX_LPCWSTR pszLocalPath, FX_WORD wDefaultLCID); +void FX_ParseNumString(const CFX_WideString& wsNum, CFX_WideString& wsResult); +FX_BOOL FX_DateFromCanonical(const CFX_WideString& wsDate, CFX_Unitime& datetime); +FX_BOOL FX_TimeFromCanonical(FX_WSTR wsTime, CFX_Unitime& datetime, IFX_Locale* pLocale); +class IFX_FormatString +{ +public: + static IFX_FormatString* Create(IFX_LocaleMgr* pLocaleMgr, FX_BOOL bUseLCID); + + virtual void Release() = 0; + virtual void SplitFormatString(const CFX_WideString& wsFormatString, CFX_WideStringArray& wsPatterns) = 0; + virtual FX_LOCALECATEGORY GetCategory(const CFX_WideString& wsPattern) = 0; + virtual FX_WORD GetLCID(const CFX_WideString& wsPattern) = 0; + virtual CFX_WideString GetLocaleName(const CFX_WideString& wsPattern) = 0; + virtual FX_BOOL ParseText(const CFX_WideString& wsSrcText, const CFX_WideString& wsPattern, CFX_WideString& wsValue) = 0; + virtual FX_BOOL ParseNum(const CFX_WideString& wsSrcNum, const CFX_WideString& wsPattern, FX_FLOAT &fValue) = 0; + virtual FX_BOOL ParseNum(const CFX_WideString& wsSrcNum, const CFX_WideString& wsPattern, CFX_WideString &wsValue) = 0; + virtual FX_BOOL ParseDateTime(const CFX_WideString& wsSrcDateTime, const CFX_WideString& wsPattern, FX_DATETIMETYPE eDateTimeType, CFX_Unitime& dtValue) = 0; + virtual FX_BOOL ParseZero(const CFX_WideString& wsSrcText, const CFX_WideString& wsPattern) = 0; + virtual FX_BOOL ParseNull(const CFX_WideString& wsSrcText, const CFX_WideString& wsPattern) = 0; + virtual FX_BOOL FormatText(const CFX_WideString& wsSrcText, const CFX_WideString& wsPattern, CFX_WideString& wsOutput) = 0; + virtual FX_BOOL FormatNum(const CFX_WideString& wsSrcNum, const CFX_WideString& wsPattern, CFX_WideString& wsOutput) = 0; + virtual FX_BOOL FormatNum(FX_FLOAT fNum, const CFX_WideString& wsPattern, CFX_WideString& wsOutput) = 0; + virtual FX_BOOL FormatDateTime(const CFX_WideString& wsSrcDateTime, const CFX_WideString& wsPattern, CFX_WideString& wsOutput) = 0; + virtual FX_BOOL FormatDateTime(const CFX_WideString& wsSrcDateTime, const CFX_WideString& wsPattern, CFX_WideString& wsOutput, FX_DATETIMETYPE eDateTimeType) = 0; + virtual FX_BOOL FormatDateTime(const CFX_Unitime& dt, const CFX_WideString& wsPattern, CFX_WideString& wsOutput) = 0; + virtual FX_BOOL FormatZero(const CFX_WideString& wsPattern, CFX_WideString& wsOutput) = 0; + virtual FX_BOOL FormatNull(const CFX_WideString& wsPattern, CFX_WideString& wsOutput) = 0; +}; +class CFX_Decimal : CFX_Object +{ +public: + CFX_Decimal(); + CFX_Decimal(FX_UINT32 val); + CFX_Decimal(FX_UINT64 val); + CFX_Decimal(FX_INT32 val); + CFX_Decimal(FX_INT64 val); + CFX_Decimal(FX_FLOAT val, FX_UINT8 scale = 3); + CFX_Decimal(FX_WSTR str); + CFX_Decimal(FX_BSTR str); + operator CFX_WideString() const; + operator double() const; + FX_BOOL operator == (const CFX_Decimal& val) const; + FX_BOOL operator <= (const CFX_Decimal& val) const; + FX_BOOL operator >= (const CFX_Decimal& val) const; + FX_BOOL operator != (const CFX_Decimal& val) const; + FX_BOOL operator < (const CFX_Decimal& val) const; + FX_BOOL operator > (const CFX_Decimal& val) const; + CFX_Decimal operator + (const CFX_Decimal& val) const; + CFX_Decimal operator - (const CFX_Decimal& val) const; + CFX_Decimal operator * (const CFX_Decimal& val) const; + CFX_Decimal operator / (const CFX_Decimal& val) const; + CFX_Decimal operator % (const CFX_Decimal& val) const; + void SetScale(FX_UINT8 newScale); + FX_UINT8 GetScale(); + void SetAbs(); + void SetNegate(); + void SetFloor(); + void SetCeiling(); + void SetTruncate(); +protected: + CFX_Decimal(FX_UINT32 hi, FX_UINT32 mid, FX_UINT32 lo, FX_BOOL neg, FX_UINT8 scale); + inline FX_BOOL IsNotZero() const + { + return m_uHi || m_uMid || m_uLo; + } + inline FX_INT8 Compare (const CFX_Decimal& val) const; + inline void Swap(CFX_Decimal& val); + inline void FloorOrCeil(FX_BOOL bFloor); + CFX_Decimal AddOrMinus(const CFX_Decimal& val, FX_BOOL isAdding) const; + CFX_Decimal Multiply(const CFX_Decimal& val) const; + CFX_Decimal Divide(const CFX_Decimal& val) const; + CFX_Decimal Modulus(const CFX_Decimal& val) const; + FX_UINT32 m_uFlags; + FX_UINT32 m_uHi; + FX_UINT32 m_uLo; + FX_UINT32 m_uMid; +}; +#endif diff --git a/xfa/src/fgas/include/fx_mem.h b/xfa/src/fgas/include/fx_mem.h new file mode 100644 index 0000000000..18cd85e422 --- /dev/null +++ b/xfa/src/fgas/include/fx_mem.h @@ -0,0 +1,58 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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_MEMORY +#define _FX_MEMORY +class IFX_MEMAllocator; +class CFX_Target; +enum FX_ALLOCTYPE { + FX_ALLOCTYPE_Default = 0, + FX_ALLOCTYPE_Static , + FX_ALLOCTYPE_Fixed , + FX_ALLOCTYPE_Dynamic , +}; +class IFX_MEMAllocator +{ +public: + virtual void Release() = 0; + virtual void* Alloc(size_t size) = 0; + virtual void Free(void *pBlock) = 0; + virtual size_t GetBlockSize() const = 0; + virtual size_t GetDefChunkSize() const = 0; + virtual size_t SetDefChunkSize(size_t size) = 0; + virtual size_t GetCurrentDataSize() const = 0; +}; +IFX_MEMAllocator* FX_CreateAllocator(FX_ALLOCTYPE eType, size_t chunkSize, size_t blockSize); +class CFX_Target +{ +public: + void* operator new(size_t size) + { + return FX_Alloc(FX_BYTE, size); + } + void operator delete(void *p) + { + FX_Free(p); + } + void* operator new(size_t size, IFX_MEMAllocator *pAllocator) + { + return pAllocator->Alloc(size); + } + void operator delete(void *p, IFX_MEMAllocator *pAllocator) + { + pAllocator->Free(p); + } + void* operator new(size_t size, void *place) + { + return place; + } + void operator delete(void *p, void *place) {} +}; +#define FXTARGET_New new +#define FXTARGET_NewWith(__allocator__) new(__allocator__) +#define FXTARGET_Delete delete +#define FXTARGET_DeleteWith(__class__, __allocator__, pointer) {(pointer)->~__class__(); (pointer)->operator delete((pointer), (__allocator__));} +#endif diff --git a/xfa/src/fgas/include/fx_rbk.h b/xfa/src/fgas/include/fx_rbk.h new file mode 100644 index 0000000000..3053fc5e1b --- /dev/null +++ b/xfa/src/fgas/include/fx_rbk.h @@ -0,0 +1,235 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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_RTFBREAK +#define _FX_RTFBREAK +class IFX_Unknown; +class IFX_Font; +class CFX_Char; +class CFX_RTFChar; +class CFX_RTFBreakPiece; +class IFX_RTFBreak; +#define FX_RTFBREAKPOLICY_None 0x00 +#define FX_RTFBREAKPOLICY_SpaceBreak 0x01 +#define FX_RTFBREAKPOLICY_NumberBreak 0x02 +#define FX_RTFBREAKPOLICY_InfixBreak 0x04 +#define FX_RTFBREAKPOLICY_TabBreak 0x08 +#define FX_RTFBREAKPOLICY_OrphanPositionedTab 0x10 +#define FX_RTFBREAK_None 0x00 +#define FX_RTFBREAK_PieceBreak 0x01 +#define FX_RTFBREAK_LineBreak 0x02 +#define FX_RTFBREAK_ParagraphBreak 0x03 +#define FX_RTFBREAK_PageBreak 0x04 +#define FX_RTFLAYOUTSTYLE_Pagination 0x01 +#define FX_RTFLAYOUTSTYLE_VerticalLayout 0x02 +#define FX_RTFLAYOUTSTYLE_VerticalChars 0x04 +#define FX_RTFLAYOUTSTYLE_LineDirection 0x08 +#define FX_RTFLAYOUTSTYLE_ExpandTab 0x10 +#define FX_RTFLAYOUTSTYLE_ArabicNumber 0x20 +#define FX_RTFLAYOUTSTYLE_SingleLine 0x40 +#define FX_RTFLAYOUTSTYLE_MBCSCode 0x80 +#define FX_RTFCHARSTYLE_Alignment 0x000F +#define FX_RTFCHARSTYLE_ArabicNumber 0x0010 +#define FX_RTFCHARSTYLE_ArabicShadda 0x0020 +#define FX_RTFCHARSTYLE_OddBidiLevel 0x0040 +#define FX_RTFCHARSTYLE_RTLReadingOrder 0x0080 +#define FX_RTFCHARSTYLE_ArabicContext 0x0300 +#define FX_RTFCHARSTYLE_ArabicIndic 0x0400 +#define FX_RTFCHARSTYLE_ArabicComma 0x0800 +#define FX_RTFLINEALIGNMENT_Left 0 +#define FX_RTFLINEALIGNMENT_Center 1 +#define FX_RTFLINEALIGNMENT_Right 2 +#define FX_RTFLINEALIGNMENT_Justified (1 << 2) +#define FX_RTFLINEALIGNMENT_Distributed (2 << 2) +#define FX_RTFLINEALIGNMENT_JustifiedLeft (FX_RTFLINEALIGNMENT_Left | FX_RTFLINEALIGNMENT_Justified) +#define FX_RTFLINEALIGNMENT_JustifiedCenter (FX_RTFLINEALIGNMENT_Center | FX_RTFLINEALIGNMENT_Justified) +#define FX_RTFLINEALIGNMENT_JustifiedRight (FX_RTFLINEALIGNMENT_Right | FX_RTFLINEALIGNMENT_Justified) +#define FX_RTFLINEALIGNMENT_DistributedLeft (FX_RTFLINEALIGNMENT_Left | FX_RTFLINEALIGNMENT_Distributed) +#define FX_RTFLINEALIGNMENT_DistributedCenter (FX_RTFLINEALIGNMENT_Center | FX_RTFLINEALIGNMENT_Distributed) +#define FX_RTFLINEALIGNMENT_DistributedRight (FX_RTFLINEALIGNMENT_Right | FX_RTFLINEALIGNMENT_Distributed) +#define FX_RTFLINEALIGNMENT_LowerMask 0x03 +#define FX_RTFLINEALIGNMENT_HigherMask 0x0C +typedef struct _FX_RTFTEXTOBJ { + _FX_RTFTEXTOBJ() + { + pStr = NULL; + pWidths = NULL; + iLength = 0; + pFont = NULL; + fFontSize = 12.0f; + dwLayoutStyles = 0; + iCharRotation = 0; + iBidiLevel = 0; + pRect = NULL; + wLineBreakChar = L'\n'; + iHorizontalScale = 100; + iVerticalScale = 100; + } + FX_LPCWSTR pStr; + FX_INT32 *pWidths; + FX_INT32 iLength; + IFX_Font *pFont; + FX_FLOAT fFontSize; + FX_DWORD dwLayoutStyles; + FX_INT32 iCharRotation; + FX_INT32 iBidiLevel; + FX_LPCRECTF pRect; + FX_WCHAR wLineBreakChar; + FX_INT32 iHorizontalScale; + FX_INT32 iVerticalScale; +} FX_RTFTEXTOBJ, * FX_LPRTFTEXTOBJ; +typedef FX_RTFTEXTOBJ const * FX_LPCRTFTEXTOBJ; +class CFX_RTFPiece : public CFX_Target +{ +public: + CFX_RTFPiece() : m_dwStatus(FX_RTFBREAK_PieceBreak) + , m_iStartPos(0) + , m_iWidth(-1) + , m_iStartChar(0) + , m_iChars(0) + , m_iBidiLevel(0) + , m_iBidiPos(0) + , m_iFontSize(0) + , m_iFontHeight(0) + , m_iHorizontalScale(100) + , m_iVerticalScale(100) + , m_dwLayoutStyles(0) + , m_dwIdentity(0) + , m_pChars(NULL) + , m_pUserData(NULL) + { + } + ~CFX_RTFPiece() + { + Reset(); + } + void AppendChar(const CFX_RTFChar &tc) + { + FXSYS_assert(m_pChars != NULL); + m_pChars->Add(tc); + if (m_iWidth < 0) { + m_iWidth = tc.m_iCharWidth; + } else { + m_iWidth += tc.m_iCharWidth; + } + m_iChars ++; + } + FX_INT32 GetEndPos() const + { + return m_iWidth < 0 ? m_iStartPos : m_iStartPos + m_iWidth; + } + FX_INT32 GetLength() const + { + return m_iChars; + } + FX_INT32 GetEndChar() const + { + return m_iStartChar + m_iChars; + } + CFX_RTFChar& GetChar(FX_INT32 index) + { + FXSYS_assert(index > -1 && index < m_iChars && m_pChars != NULL); + return *m_pChars->GetDataPtr(m_iStartChar + index); + } + CFX_RTFChar* GetCharPtr(FX_INT32 index) const + { + FXSYS_assert(index > -1 && index < m_iChars && m_pChars != NULL); + return m_pChars->GetDataPtr(m_iStartChar + index); + } + void GetString (FX_LPWSTR pText) const + { + FXSYS_assert(pText != NULL); + FX_INT32 iEndChar = m_iStartChar + m_iChars; + CFX_RTFChar *pChar; + for (FX_INT32 i = m_iStartChar; i < iEndChar; i ++) { + pChar = m_pChars->GetDataPtr(i); + *pText ++ = (FX_WCHAR)pChar->m_wCharCode; + } + } + void GetString(CFX_WideString &wsText) const + { + FX_LPWSTR pText = wsText.GetBuffer(m_iChars); + GetString(pText); + wsText.ReleaseBuffer(m_iChars); + } + void GetWidths(FX_INT32 *pWidths) const + { + FXSYS_assert(pWidths != NULL); + FX_INT32 iEndChar = m_iStartChar + m_iChars; + CFX_RTFChar *pChar; + for (FX_INT32 i = m_iStartChar; i < iEndChar; i ++) { + pChar = m_pChars->GetDataPtr(i); + *pWidths ++ = pChar->m_iCharWidth; + } + } + void Reset() + { + m_dwStatus = FX_RTFBREAK_PieceBreak; + if (m_iWidth > -1) { + m_iStartPos += m_iWidth; + } + m_iWidth = -1; + m_iStartChar += m_iChars; + m_iChars = 0; + m_iBidiLevel = 0; + m_iBidiPos = 0; + m_iHorizontalScale = 100; + m_iVerticalScale = 100; + } + FX_DWORD m_dwStatus; + FX_INT32 m_iStartPos; + FX_INT32 m_iWidth; + FX_INT32 m_iStartChar; + FX_INT32 m_iChars; + FX_INT32 m_iBidiLevel; + FX_INT32 m_iBidiPos; + FX_INT32 m_iFontSize; + FX_INT32 m_iFontHeight; + FX_INT32 m_iHorizontalScale; + FX_INT32 m_iVerticalScale; + FX_DWORD m_dwLayoutStyles; + FX_DWORD m_dwIdentity; + CFX_RTFCharArray *m_pChars; + IFX_Unknown *m_pUserData; +}; +typedef CFX_BaseArrayTemplate CFX_RTFPieceArray; +class IFX_RTFBreak +{ +public: + static IFX_RTFBreak* Create(FX_DWORD dwPolicies); + virtual void Release() = 0; + virtual void SetLineWidth(FX_FLOAT fLineStart, FX_FLOAT fLineEnd) = 0; + virtual void SetLinePos(FX_FLOAT fLinePos) = 0; + virtual FX_DWORD GetLayoutStyles() const = 0; + virtual void SetLayoutStyles(FX_DWORD dwLayoutStyles) = 0; + virtual void SetFont(IFX_Font *pFont) = 0; + virtual void SetFontSize(FX_FLOAT fFontSize) = 0; + virtual void SetTabWidth(FX_FLOAT fTabWidth) = 0; + virtual void AddPositionedTab(FX_FLOAT fTabPos) = 0; + virtual void SetPositionedTabs(const CFX_FloatArray &tabs) = 0; + virtual void ClearPositionedTabs() = 0; + virtual void SetDefaultChar(FX_WCHAR wch) = 0; + virtual void SetLineBreakChar(FX_WCHAR wch) = 0; + virtual void SetLineBreakTolerance(FX_FLOAT fTolerance) = 0; + virtual void SetHorizontalScale(FX_INT32 iScale) = 0; + virtual void SetVerticalScale(FX_INT32 iScale) = 0; + virtual void SetCharRotation(FX_INT32 iCharRotation) = 0; + virtual void SetCharSpace(FX_FLOAT fCharSpace) = 0; + virtual void SetWordSpace(FX_BOOL bDefault, FX_FLOAT fWordSpace) = 0; + virtual void SetReadingOrder(FX_BOOL bRTL = FALSE) = 0; + virtual void SetAlignment(FX_INT32 iAlignment = FX_RTFLINEALIGNMENT_Left) = 0; + virtual void SetUserData(IFX_Unknown *pUserData) = 0; + virtual FX_DWORD AppendChar(FX_WCHAR wch) = 0; + virtual FX_DWORD EndBreak(FX_DWORD dwStatus = FX_RTFBREAK_PieceBreak) = 0; + virtual FX_INT32 CountBreakPieces() const = 0; + virtual const CFX_RTFPiece* GetBreakPiece(FX_INT32 index) const = 0; + virtual void GetLineRect(CFX_RectF &rect) const = 0; + virtual void ClearBreakPieces() = 0; + virtual void Reset() = 0; + virtual FX_INT32 GetDisplayPos(FX_LPCRTFTEXTOBJ pText, FXTEXT_CHARPOS *pCharPos, FX_BOOL bCharCode = FALSE, CFX_WideString *pWSForms = NULL, FX_AdjustCharDisplayPos pAdjustPos = NULL) const = 0; + virtual FX_INT32 GetCharRects(FX_LPCRTFTEXTOBJ pText, CFX_RectFArray &rtArray, FX_BOOL bCharBBox = FALSE) const = 0; +}; +#endif diff --git a/xfa/src/fgas/include/fx_sax.h b/xfa/src/fgas/include/fx_sax.h new file mode 100644 index 0000000000..c0159f8c22 --- /dev/null +++ b/xfa/src/fgas/include/fx_sax.h @@ -0,0 +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 + +#ifndef _FX_SAX_ +#define _FX_SAX_ +class IFX_SAXReaderHandler; +class IFX_SAXReader; +#define FX_SAXPARSEMODE_NotConvert_amp 0x0001 +#define FX_SAXPARSEMODE_NotConvert_lt 0x0002 +#define FX_SAXPARSEMODE_NotConvert_gt 0x0004 +#define FX_SAXPARSEMODE_NotConvert_apos 0x0008 +#define FX_SAXPARSEMODE_NotConvert_quot 0x0010 +#define FX_SAXPARSEMODE_NotConvert_sharp 0x0020 +#define FX_SAXPARSEMODE_NotSkipSpace 0x0100 +enum FX_SAXNODE { + FX_SAXNODE_Unknown = 0, + FX_SAXNODE_Instruction, + FX_SAXNODE_Declaration, + FX_SAXNODE_Comment, + FX_SAXNODE_Tag, + FX_SAXNODE_Text, + FX_SAXNODE_CharData, +}; +class IFX_SAXReaderHandler +{ +public: + virtual FX_LPVOID OnTagEnter(FX_BSTR bsTagName, FX_SAXNODE eType, FX_DWORD dwStartPos) = 0; + virtual void OnTagAttribute(FX_LPVOID pTag, FX_BSTR bsAttri, FX_BSTR bsValue) = 0; + virtual void OnTagBreak(FX_LPVOID pTag) = 0; + virtual void OnTagData(FX_LPVOID pTag, FX_SAXNODE eType, FX_BSTR bsData, FX_DWORD dwStartPos) = 0; + virtual void OnTagClose(FX_LPVOID pTag, FX_DWORD dwEndPos) = 0; + virtual void OnTagEnd(FX_LPVOID pTag, FX_BSTR bsTagName, FX_DWORD dwEndPos) = 0; + virtual void OnTargetData(FX_LPVOID pTag, FX_SAXNODE eType, FX_BSTR bsData, FX_DWORD dwStartPos) = 0; +}; +class IFX_SAXReader +{ +public: + virtual void Release() = 0; + virtual FX_INT32 StartParse(IFX_FileRead *pFile, FX_DWORD dwStart = 0, FX_DWORD dwLen = -1, FX_DWORD dwParseMode = 0) = 0; + virtual FX_INT32 ContinueParse(IFX_Pause *pPause = NULL) = 0; + virtual void SkipCurrentNode() = 0; + virtual void SetHandler(IFX_SAXReaderHandler *pHandler) = 0; +}; +IFX_SAXReader* FX_SAXReader_Create(); +#endif diff --git a/xfa/src/fgas/include/fx_stm.h b/xfa/src/fgas/include/fx_stm.h new file mode 100644 index 0000000000..ae424dba2d --- /dev/null +++ b/xfa/src/fgas/include/fx_stm.h @@ -0,0 +1,60 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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_STREAM +#define _FX_STREAM +class IFX_Stream; +IFX_FileRead* FX_CreateFileRead(IFX_Stream *pBaseStream, FX_BOOL bReleaseStream = FALSE); +#ifdef FX_FILESIZE +IFX_FileRead* FX_CreateFileRead(IFX_BufferRead *pBufferRead, FX_FILESIZE iFileSize = -1, FX_BOOL bReleaseStream = TRUE); +#else +IFX_FileRead* FX_CreateFileRead(IFX_BufferRead *pBufferRead, FX_INT32 iFileSize = -1, FX_BOOL bReleaseStream = TRUE); +#endif +IFX_FileWrite* FX_CreateFileWrite(IFX_Stream *pBaseStream, FX_BOOL bReleaseStream = FALSE); +enum FX_STREAMACCESS { + FX_STREAMACCESS_Binary = 0x00, + FX_STREAMACCESS_Text = 0x01, + FX_STREAMACCESS_Read = 0x02, + FX_STREAMACCESS_Write = 0x04, + FX_STREAMACCESS_Truncate = 0x10, + FX_STREAMACCESS_Append = 0x20, + FX_STREAMACCESS_Create = 0x80, +}; +enum FX_STREAMSEEK { + FX_STREAMSEEK_Begin = 0 , + FX_STREAMSEEK_Current , + FX_STREAMSEEK_End , +}; +class IFX_Stream +{ +public: + static IFX_Stream* CreateStream(IFX_FileRead *pFileRead, FX_DWORD dwAccess); + static IFX_Stream* CreateStream(IFX_FileWrite *pFileWrite, FX_DWORD dwAccess); + static IFX_Stream* CreateStream(FX_LPCWSTR pszFileName, FX_DWORD dwAccess); + static IFX_Stream* CreateStream(FX_LPBYTE pData, FX_INT32 length, FX_DWORD dwAccess); + static IFX_Stream* CreateStream(IFX_BufferRead *pBufferRead, FX_DWORD dwAccess, FX_INT32 iFileSize = -1, FX_BOOL bReleaseBufferRead = TRUE); + static IFX_Stream* CreateTextStream(IFX_Stream *pBaseStream, FX_BOOL bDeleteOnRelease); + virtual void Release() = 0; + virtual IFX_Stream* Retain() = 0; + virtual FX_DWORD GetAccessModes() const = 0; + virtual FX_INT32 GetLength() const = 0; + virtual FX_INT32 Seek(FX_STREAMSEEK eSeek, FX_INT32 iOffset) = 0; + virtual FX_INT32 GetPosition() = 0; + virtual FX_BOOL IsEOF() const = 0; + virtual FX_INT32 ReadData(FX_LPBYTE pBuffer, FX_INT32 iBufferSize) = 0; + virtual FX_INT32 ReadString(FX_LPWSTR pStr, FX_INT32 iMaxLength, FX_BOOL &bEOS, FX_INT32 const *pByteSize = NULL) = 0; + virtual FX_INT32 WriteData(FX_LPCBYTE pBuffer, FX_INT32 iBufferSize) = 0; + virtual FX_INT32 WriteString(FX_LPCWSTR pStr, FX_INT32 iLength) = 0; + virtual void Flush() = 0; + virtual FX_BOOL SetLength(FX_INT32 iLength) = 0; + virtual FX_INT32 GetBOM(FX_BYTE bom[4]) const = 0; + virtual FX_WORD GetCodePage() const = 0; + virtual FX_WORD SetCodePage(FX_WORD wCodePage) = 0; + virtual void Lock() = 0; + virtual void Unlock() = 0; + virtual IFX_Stream* CreateSharedStream(FX_DWORD dwAccess, FX_INT32 iOffset, FX_INT32 iLength) = 0; +}; +#endif diff --git a/xfa/src/fgas/include/fx_sys.h b/xfa/src/fgas/include/fx_sys.h new file mode 100644 index 0000000000..c0b5c7445f --- /dev/null +++ b/xfa/src/fgas/include/fx_sys.h @@ -0,0 +1,63 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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_SYSTEM +#define _FX_SYSTEM +#ifdef __cplusplus +extern "C" { +#endif +#define FX_RAD2DEG(r) ((r) * 180.0f / FX_PI) +#define FX_DEG2RAD(a) ((a) * FX_PI / 180.0f) +typedef FX_INT8 * FX_LPINT8; +typedef FX_INT8 const * FX_LPCINT8; +typedef FX_INT32 * FX_LPINT32; +typedef FX_INT32 const * FX_LPCINT32; +typedef long FX_LONG; +typedef FX_LONG * FX_LPLONG; +typedef FX_LONG const * FX_LPCLONG; +typedef FX_FLOAT const * FX_LPCFLOAT; +typedef double FX_DOUBLE; +typedef FX_DOUBLE * FX_LPDOUBLE; +typedef FX_DOUBLE const * FX_LPCDOUBLE; +FX_FLOAT FX_tan(FX_FLOAT a); +FX_FLOAT FX_log(FX_FLOAT b, FX_FLOAT x); +FX_FLOAT FX_strtof(FX_LPCSTR pcsStr, FX_INT32 iLength = -1, FX_INT32 *pUsedLen = NULL); +FX_FLOAT FX_wcstof(FX_LPCWSTR pwsStr, FX_INT32 iLength = -1, FX_INT32 *pUsedLen = NULL); +FX_LPWSTR FX_wcsncpy(FX_LPWSTR dstStr, FX_LPCWSTR srcStr, size_t count); +FX_INT32 FX_wcsnicmp(FX_LPCWSTR s1, FX_LPCWSTR s2, size_t count); +FX_INT32 FX_strnicmp(FX_LPCSTR s1, FX_LPCSTR s2, size_t count); +inline FX_BOOL FX_islower(FX_INT32 ch) +{ + return ch >= 'a' && ch <= 'z'; +} +inline FX_BOOL FX_isupper(FX_INT32 ch) +{ + return ch >= 'A' && ch <= 'Z'; +} +inline FX_INT32 FX_tolower(FX_INT32 ch) +{ + return FX_isupper(ch) ? (ch + 0x20) : ch; +} +inline FX_INT32 FX_toupper(FX_INT32 ch) +{ + return FX_islower(ch) ? (ch - 0x20) : ch; +} +FX_INT32 FX_filelength(FXSYS_FILE *file); +FX_BOOL FX_fsetsize(FXSYS_FILE *file, FX_INT32 size); +void FX_memset(FX_LPVOID pBuf, FX_INT32 iValue, size_t size); +void FX_memcpy(FX_LPVOID pDst, FX_LPCVOID pSrc, size_t size); +FX_BOOL FX_IsRelativePath(const CFX_WideStringC &wsPath); +FX_BOOL FX_JoinPath(const CFX_WideStringC &wsBasePath, const CFX_WideStringC &wsRelativePath, CFX_WideString &wsAbsolutePath); +typedef struct _FX_VERSION { + FX_DWORD dwMajorVersion; + FX_DWORD dwMinorVersion; + FX_DWORD dwBuildVersion; +} FX_VERSION, * FX_LPVERSION; +typedef FX_VERSION const * FX_LPCVERSION; +#ifdef __cplusplus +}; +#endif +#endif diff --git a/xfa/src/fgas/include/fx_tbk.h b/xfa/src/fgas/include/fx_tbk.h new file mode 100644 index 0000000000..ab64d1dac0 --- /dev/null +++ b/xfa/src/fgas/include/fx_tbk.h @@ -0,0 +1,211 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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_TEXTBREAK +#define _FX_TEXTBREAK +class IFX_Font; +class CFX_Char; +class IFX_TxtAccess; +class CFX_TxtChar; +class CFX_TxtPiece; +class IFX_TxtBreak; +#define FX_TXTBREAKPOLICY_None 0x00 +#define FX_TXTBREAKPOLICY_Pagination 0x01 +#define FX_TXTBREAKPOLICY_SpaceBreak 0x02 +#define FX_TXTBREAKPOLICY_NumberBreak 0x04 +#define FX_TXTBREAK_None 0x00 +#define FX_TXTBREAK_PieceBreak 0x01 +#define FX_TXTBREAK_LineBreak 0x02 +#define FX_TXTBREAK_ParagraphBreak 0x03 +#define FX_TXTBREAK_PageBreak 0x04 +#define FX_TXTBREAK_ControlChar 0x10 +#define FX_TXTBREAK_BreakChar 0x20 +#define FX_TXTBREAK_UnknownChar 0x40 +#define FX_TXTBREAK_RemoveChar 0x80 +#define FX_TXTLAYOUTSTYLE_MutipleFormat 0x0001 +#define FX_TXTLAYOUTSTYLE_VerticalLayout 0x0002 +#define FX_TXTLAYOUTSTYLE_VerticalChars 0x0004 +#define FX_TXTLAYOUTSTYLE_ReverseLine 0x0008 +#define FX_TXTLAYOUTSTYLE_ArabicContext 0x0010 +#define FX_TXTLAYOUTSTYLE_ArabicShapes 0x0020 +#define FX_TXTLAYOUTSTYLE_RTLReadingOrder 0x0040 +#define FX_TXTLAYOUTSTYLE_ExpandTab 0x0100 +#define FX_TXTLAYOUTSTYLE_SingleLine 0x0200 +#define FX_TXTLAYOUTSTYLE_CombText 0x0400 +#define FX_TXTCHARSTYLE_Alignment 0x000F +#define FX_TXTCHARSTYLE_ArabicNumber 0x0010 +#define FX_TXTCHARSTYLE_ArabicShadda 0x0020 +#define FX_TXTCHARSTYLE_OddBidiLevel 0x0040 +#define FX_TXTCHARSTYLE_RTLReadingOrder 0x0080 +#define FX_TXTCHARSTYLE_ArabicContext 0x0300 +#define FX_TXTCHARSTYLE_ArabicIndic 0x0400 +#define FX_TXTCHARSTYLE_ArabicComma 0x0800 +#define FX_TXTLINEALIGNMENT_Left 0 +#define FX_TXTLINEALIGNMENT_Center 1 +#define FX_TXTLINEALIGNMENT_Right 2 +#define FX_TXTLINEALIGNMENT_Justified (1 << 2) +#define FX_TXTLINEALIGNMENT_Distributed (2 << 2) +#define FX_TXTLINEALIGNMENT_JustifiedLeft (FX_TXTLINEALIGNMENT_Left | FX_TXTLINEALIGNMENT_Justified) +#define FX_TXTLINEALIGNMENT_JustifiedCenter (FX_TXTLINEALIGNMENT_Center | FX_TXTLINEALIGNMENT_Justified) +#define FX_TXTLINEALIGNMENT_JustifiedRight (FX_TXTLINEALIGNMENT_Right | FX_TXTLINEALIGNMENT_Justified) +#define FX_TXTLINEALIGNMENT_DistributedLeft (FX_TXTLINEALIGNMENT_Left | FX_TXTLINEALIGNMENT_Distributed) +#define FX_TXTLINEALIGNMENT_DistributedCenter (FX_TXTLINEALIGNMENT_Center | FX_TXTLINEALIGNMENT_Distributed) +#define FX_TXTLINEALIGNMENT_DistributedRight (FX_TXTLINEALIGNMENT_Right | FX_TXTLINEALIGNMENT_Distributed) +#define FX_TXTLINEALIGNMENT_LowerMask 0x03 +#define FX_TXTLINEALIGNMENT_HigherMask 0x0C +#define FX_TXTBREAK_MinimumTabWidth 160000 +class IFX_TxtAccess +{ +public: + virtual FX_WCHAR GetChar(FX_LPVOID pIdentity, FX_INT32 index) const = 0; + virtual FX_INT32 GetWidth(FX_LPVOID pIdentity, FX_INT32 index) const = 0; +}; +typedef struct _FX_TXTRUN { + _FX_TXTRUN() + { + pAccess = NULL; + pIdentity = NULL; + pStr = NULL; + pWidths = NULL; + iLength = 0; + pFont = NULL; + fFontSize = 12; + dwStyles = 0; + iHorizontalScale = 100; + iVerticalScale = 100; + iCharRotation = 0; + dwCharStyles = 0; + pRect = NULL; + wLineBreakChar = L'\n'; + bSkipSpace = TRUE; + } + IFX_TxtAccess *pAccess; + FX_LPVOID pIdentity; + FX_LPCWSTR pStr; + FX_INT32 *pWidths; + FX_INT32 iLength; + IFX_Font *pFont; + FX_FLOAT fFontSize; + FX_DWORD dwStyles; + FX_INT32 iHorizontalScale; + FX_INT32 iVerticalScale; + FX_INT32 iCharRotation; + FX_DWORD dwCharStyles; + FX_LPCRECTF pRect; + FX_WCHAR wLineBreakChar; + FX_BOOL bSkipSpace; +} FX_TXTRUN, * FX_LPTXTRUN; +typedef FX_TXTRUN const * FX_LPCTXTRUN; +class CFX_TxtPiece : public CFX_Target +{ +public: + CFX_TxtPiece() : m_dwStatus(FX_TXTBREAK_PieceBreak) + , m_iStartPos(0) + , m_iWidth(-1) + , m_iStartChar(0) + , m_iChars(0) + , m_iBidiLevel(0) + , m_iBidiPos(0) + , m_iHorizontalScale(100) + , m_iVerticalScale(100) + , m_dwCharStyles(0) + , m_pChars(NULL) + , m_pUserData(NULL) + { + } + FX_INT32 GetEndPos() const + { + return m_iWidth < 0 ? m_iStartPos : m_iStartPos + m_iWidth; + } + FX_INT32 GetLength() const + { + return m_iChars; + } + FX_INT32 GetEndChar() const + { + return m_iStartChar + m_iChars; + } + CFX_TxtChar* GetCharPtr(FX_INT32 index) const + { + FXSYS_assert(index > -1 && index < m_iChars && m_pChars != NULL); + return m_pChars->GetDataPtr(m_iStartChar + index); + } + void GetString(FX_LPWSTR pText) const + { + FXSYS_assert(pText != NULL); + FX_INT32 iEndChar = m_iStartChar + m_iChars; + CFX_Char *pChar; + for (FX_INT32 i = m_iStartChar; i < iEndChar; i ++) { + pChar = m_pChars->GetDataPtr(i); + *pText ++ = (FX_WCHAR)pChar->m_wCharCode; + } + } + + void GetString(CFX_WideString &wsText) const + { + FX_LPWSTR pText = wsText.GetBuffer(m_iChars); + GetString(pText); + wsText.ReleaseBuffer(m_iChars); + } + void GetWidths(FX_INT32 *pWidths) const + { + FXSYS_assert(pWidths != NULL); + FX_INT32 iEndChar = m_iStartChar + m_iChars; + CFX_Char *pChar; + for (FX_INT32 i = m_iStartChar; i < iEndChar; i ++) { + pChar = m_pChars->GetDataPtr(i); + *pWidths ++ = pChar->m_iCharWidth; + } + } + FX_DWORD m_dwStatus; + FX_INT32 m_iStartPos; + FX_INT32 m_iWidth; + FX_INT32 m_iStartChar; + FX_INT32 m_iChars; + FX_INT32 m_iBidiLevel; + FX_INT32 m_iBidiPos; + FX_INT32 m_iHorizontalScale; + FX_INT32 m_iVerticalScale; + FX_DWORD m_dwCharStyles; + CFX_TxtCharArray *m_pChars; + FX_LPVOID m_pUserData; +}; +typedef CFX_BaseArrayTemplate CFX_TxtPieceArray; +class IFX_TxtBreak +{ +public: + static IFX_TxtBreak* Create(FX_DWORD dwPolicies); + virtual void Release() = 0; + virtual void SetLineWidth(FX_FLOAT fLineWidth) = 0; + virtual void SetLinePos(FX_FLOAT fLinePos) = 0; + virtual FX_DWORD GetLayoutStyles() const = 0; + virtual void SetLayoutStyles(FX_DWORD dwLayoutStyles) = 0; + virtual void SetFont(IFX_Font *pFont) = 0; + virtual void SetFontSize(FX_FLOAT fFontSize) = 0; + virtual void SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant) = 0; + virtual void SetDefaultChar(FX_WCHAR wch) = 0; + virtual void SetParagraphBreakChar(FX_WCHAR wch) = 0; + virtual void SetLineBreakTolerance(FX_FLOAT fTolerance) = 0; + virtual void SetHorizontalScale(FX_INT32 iScale) = 0; + virtual void SetVerticalScale(FX_INT32 iScale) = 0; + virtual void SetCharRotation(FX_INT32 iCharRotation) = 0; + virtual void SetCharSpace(FX_FLOAT fCharSpace) = 0; + virtual void SetAlignment(FX_INT32 iAlignment) = 0; + virtual FX_DWORD GetContextCharStyles() const = 0; + virtual void SetContextCharStyles(FX_DWORD dwCharStyles) = 0; + virtual void SetCombWidth(FX_FLOAT fCombWidth) = 0; + virtual void SetUserData(FX_LPVOID pUserData) = 0; + virtual FX_DWORD AppendChar(FX_WCHAR wch) = 0; + virtual FX_DWORD EndBreak(FX_DWORD dwStatus = FX_TXTBREAK_PieceBreak) = 0; + virtual FX_INT32 CountBreakChars() const = 0; + virtual FX_INT32 CountBreakPieces() const = 0; + virtual const CFX_TxtPiece* GetBreakPiece(FX_INT32 index) const = 0; + virtual void ClearBreakPieces() = 0; + virtual void Reset() = 0; + virtual FX_INT32 GetDisplayPos(FX_LPCTXTRUN pTxtRun, FXTEXT_CHARPOS *pCharPos, FX_BOOL bCharCode = FALSE, CFX_WideString *pWSForms = NULL, FX_AdjustCharDisplayPos pAdjustPos = NULL) const = 0; + virtual FX_INT32 GetCharRects(FX_LPCTXTRUN pTxtRun, CFX_RectFArray &rtArray, FX_BOOL bCharBBox = FALSE) const = 0; +}; +#endif diff --git a/xfa/src/fgas/include/fx_ucd.h b/xfa/src/fgas/include/fx_ucd.h new file mode 100644 index 0000000000..715c8af4dd --- /dev/null +++ b/xfa/src/fgas/include/fx_ucd.h @@ -0,0 +1,23 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FGAS_UNICODE_ +#define _FGAS_UNICODE_ +#define FX_JAPCHARPROPERTYEX_Left 0x01 +#define FX_JAPCHARPROPERTYEX_Center 0x02 +#define FX_JAPCHARPROPERTYEX_Right 0x03 +#define FX_JAPCHARPROPERTYEX_Top 0x10 +#define FX_JAPCHARPROPERTYEX_Middle 0x20 +#define FX_JAPCHARPROPERTYEX_Bottom 0x30 +typedef struct _FX_JAPCHARPROPERTYEX { + FX_WCHAR wChar; + FX_BYTE uAlign; +} FX_JAPCHARPROPERTYEX, *FX_LPJAPCHARPROPERTYEX; +typedef FX_JAPCHARPROPERTYEX const * FX_LPCJAPCHARPROPERTYEX; +FX_LPCJAPCHARPROPERTYEX FX_GetJapCharPropertyEx(FX_WCHAR wch); +typedef FX_BOOL (*FX_AdjustCharDisplayPos)(FX_WCHAR wch, FX_BOOL bMBCSCode, IFX_Font *pFont, FX_FLOAT fFontSize, FX_BOOL bVertical, CFX_PointF &ptOffset); +FX_BOOL FX_AdjustJapCharDisplayPos(FX_WCHAR wch, FX_BOOL bMBCSCode, IFX_Font *pFont, FX_FLOAT fFontSize, FX_BOOL bVertical, CFX_PointF &ptOffset); +#endif diff --git a/xfa/src/fgas/include/fx_utl.h b/xfa/src/fgas/include/fx_utl.h new file mode 100644 index 0000000000..3bb7b61986 --- /dev/null +++ b/xfa/src/fgas/include/fx_utl.h @@ -0,0 +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 + +#ifndef _FX_UTILS +#define _FX_UTILS +class CFX_ThreadLock; +class CFX_BaseArray; +template class CFX_BaseArrayTemplate; +template class CFX_ObjectBaseArrayTemplate; +class CFX_BaseMassArray; +template class CFX_MassArrayTemplate; +template class CFX_ObjectMassArrayTemplate; +class CFX_BaseDiscreteArray; +template class CFX_DiscreteArrayTemplate; +class CFX_BaseStack; +template class CFX_StackTemplate; +template class CFX_ObjectStackTemplate; +template class CFX_CPLTreeNode; +template class CFX_CPLTree; +class CFX_ThreadLock +{ +public: + CFX_ThreadLock(); + virtual ~CFX_ThreadLock(); + void Lock(); + void Unlock(); +private: + FX_LPVOID m_pData; +}; +class CFX_BaseArray : public CFX_Target +{ +protected: + CFX_BaseArray(FX_INT32 iGrowSize, FX_INT32 iBlockSize); + ~CFX_BaseArray(); + FX_INT32 GetSize() const; + FX_INT32 GetBlockSize() const; + FX_LPBYTE AddSpaceTo(FX_INT32 index); + FX_LPBYTE GetAt(FX_INT32 index) const; + FX_LPBYTE GetBuffer() const; + FX_INT32 Append(const CFX_BaseArray &src, FX_INT32 iStart = 0, FX_INT32 iCount = -1); + FX_INT32 Copy(const CFX_BaseArray &src, FX_INT32 iStart = 0, FX_INT32 iCount = -1); + FX_INT32 RemoveLast(FX_INT32 iCount = -1); + void RemoveAll(FX_BOOL bLeaveMemory = FALSE); + FX_LPVOID m_pData; +}; +template +class CFX_BaseArrayTemplate : public CFX_BaseArray +{ +public: + CFX_BaseArrayTemplate(FX_INT32 iGrowSize = 100) : CFX_BaseArray(iGrowSize, sizeof(baseType)) {} + CFX_BaseArrayTemplate(FX_INT32 iGrowSize, FX_INT32 iBlockSize) : CFX_BaseArray(iGrowSize, iBlockSize) {} + FX_INT32 GetSize() const + { + return CFX_BaseArray::GetSize(); + } + FX_INT32 GetBlockSize() const + { + return CFX_BaseArray::GetBlockSize(); + } + baseType* AddSpace() + { + return (baseType*)CFX_BaseArray::AddSpaceTo(CFX_BaseArray::GetSize()); + } + FX_INT32 Add(const baseType &element) + { + FX_INT32 index = CFX_BaseArray::GetSize(); + *(baseType*)CFX_BaseArray::AddSpaceTo(index) = element; + return index; + } + baseType* GetBuffer() const + { + return (baseType*)CFX_BaseArray::GetBuffer(); + } + baseType& GetAt(FX_INT32 index) const + { + return *(baseType*)CFX_BaseArray::GetAt(index); + } + baseType* GetPtrAt(FX_INT32 index) const + { + return (baseType*)CFX_BaseArray::GetAt(index); + } + void SetAt(FX_INT32 index, const baseType &element) + { + *(baseType*)CFX_BaseArray::GetAt(index) = element; + } + void SetAtGrow(FX_INT32 index, const baseType &element) + { + *(baseType*)CFX_BaseArray::AddSpaceTo(index) = element; + } + FX_INT32 Append(const CFX_BaseArrayTemplate &src, FX_INT32 iStart = 0, FX_INT32 iCount = -1) + { + return CFX_BaseArray::Append(src, iStart, iCount); + } + FX_INT32 Copy(const CFX_BaseArrayTemplate &src, FX_INT32 iStart = 0, FX_INT32 iCount = -1) + { + return CFX_BaseArray::Copy(src, iStart, iCount); + } + FX_INT32 RemoveLast(FX_INT32 iCount = -1) + { + return CFX_BaseArray::RemoveLast(iCount); + } + void RemoveAll(FX_BOOL bLeaveMemory = FALSE) + { + CFX_BaseArray::RemoveAll(bLeaveMemory); + } +}; +typedef CFX_BaseArrayTemplate CFDE_PtrArray; +typedef CFX_BaseArrayTemplate CFDE_DWordArray; +typedef CFX_BaseArrayTemplate CFDE_WordArray; +template +class CFX_ObjectBaseArrayTemplate : public CFX_BaseArray +{ +public: + CFX_ObjectBaseArrayTemplate(FX_INT32 iGrowSize = 100) : CFX_BaseArray(iGrowSize, sizeof(baseType)) {} + ~CFX_ObjectBaseArrayTemplate() + { + RemoveAll(FALSE); + } + FX_INT32 GetSize() const + { + return CFX_BaseArray::GetSize(); + } + FX_INT32 GetBlockSize() const + { + return CFX_BaseArray::GetBlockSize(); + } + FX_INT32 Add(const baseType &element) + { + FX_INT32 index = CFX_BaseArray::GetSize(); + baseType *p = (baseType*)CFX_BaseArray::AddSpaceTo(index); + FXTARGET_New ((void*)p)baseType(element); + return index; + } + baseType& GetAt(FX_INT32 index) const + { + return *(baseType*)CFX_BaseArray::GetAt(index); + } + baseType* GetPtrAt(FX_INT32 index) const + { + return (baseType*)CFX_BaseArray::GetAt(index); + } + FX_INT32 Append(const CFX_ObjectBaseArrayTemplate &src, FX_INT32 iStart = 0, FX_INT32 iCount = -1) + { + FXSYS_assert(GetBlockSize() == src.GetBlockSize()); + if (iCount == 0) { + return 0; + } + FX_INT32 iSize = src.GetSize(); + FXSYS_assert(iStart > -1 && iStart < iSize); + if (iCount < 0) { + iCount = iSize; + } + if (iStart + iCount > iSize) { + iCount = iSize - iStart; + } + if (iCount < 1) { + return 0; + } + iSize = CFX_BaseArray::GetSize(); + CFX_BaseArray::AddSpaceTo(iSize + iCount - 1); + FX_LPBYTE *pStart = CFX_BaseArray::GetAt(iSize); + FX_INT32 iBlockSize = CFX_BaseArray::GetBlockSize(); + iSize = iStart + iCount; + for (FX_INT32 i = iStart; i < iSize; i ++) { + FXTARGET_NewWith ((void*)pStart)baseType(src.GetAt(i)); + pStart += iBlockSize; + } + return iCount; + } + FX_INT32 Copy(const CFX_ObjectBaseArrayTemplate &src, FX_INT32 iStart = 0, FX_INT32 iCount = -1) + { + FXSYS_assert(GetBlockSize() == src.GetBlockSize()); + if (iCount == 0) { + return 0; + } + FX_INT32 iSize = src.GetSize(); + FXSYS_assert(iStart > -1 && iStart < iSize); + if (iCount < 0) { + iCount = iSize; + } + if (iStart + iCount > iSize) { + iCount = iSize - iStart; + } + if (iCount < 1) { + return 0; + } + RemoveAll(TRUE); + CFX_BaseArray::AddSpaceTo(iCount - 1); + FX_LPBYTE *pStart = CFX_BaseArray::GetAt(0); + FX_INT32 iBlockSize = CFX_BaseArray::GetBlockSize(); + iSize = iStart + iCount; + for (FX_INT32 i = iStart; i < iSize; i ++) { + FXTARGET_New ((void*)pStart)baseType(src.GetAt(i)); + pStart += iBlockSize; + } + return iCount; + } + FX_INT32 RemoveLast(FX_INT32 iCount = -1) + { + FX_INT32 iSize = CFX_BaseArray::GetSize(); + if (iCount < 0 || iCount > iSize) { + iCount = iSize; + } + if (iCount == 0) { + return iSize; + } + for (FX_INT32 i = iSize - iCount; i < iSize; i ++) { + ((baseType*)GetPtrAt(i))->~baseType(); + } + return CFX_BaseArray::RemoveLast(iCount); + } + void RemoveAll(FX_BOOL bLeaveMemory = FALSE) + { + FX_INT32 iSize = CFX_BaseArray::GetSize(); + for (FX_INT32 i = 0; i < iSize; i ++) { + ((baseType*)GetPtrAt(i))->~baseType(); + } + CFX_BaseArray::RemoveAll(bLeaveMemory); + } +}; +class CFX_BaseMassArray : public CFX_Target +{ +protected: + CFX_BaseMassArray(FX_INT32 iChunkSize, FX_INT32 iBlockSize); + ~CFX_BaseMassArray(); + FX_INT32 GetSize() const; + FX_LPBYTE AddSpaceTo(FX_INT32 index); + FX_LPBYTE GetAt(FX_INT32 index) const; + FX_INT32 Append(const CFX_BaseMassArray &src, FX_INT32 iStart = 0, FX_INT32 iCount = -1); + FX_INT32 Copy(const CFX_BaseMassArray &src, FX_INT32 iStart = 0, FX_INT32 iCount = -1); + FX_INT32 RemoveLast(FX_INT32 iCount = -1); + void RemoveAll(FX_BOOL bLeaveMemory = FALSE); + FX_LPVOID m_pData; +}; +template +class CFX_MassArrayTemplate : public CFX_BaseMassArray +{ +public: + CFX_MassArrayTemplate(FX_INT32 iChunkSize = 100) : CFX_BaseMassArray(iChunkSize, sizeof(baseType)) {} + CFX_MassArrayTemplate(FX_INT32 iChunkSize, FX_INT32 iBlockSize) : CFX_BaseMassArray(iChunkSize, iBlockSize) {} + FX_INT32 GetSize() const + { + return CFX_BaseMassArray::GetSize(); + } + baseType* AddSpace() + { + return (baseType*)CFX_BaseMassArray::AddSpaceTo(CFX_BaseMassArray::GetSize()); + } + FX_INT32 Add(const baseType &element) + { + FX_INT32 index = CFX_BaseMassArray::GetSize(); + *(baseType*)CFX_BaseMassArray::AddSpaceTo(index) = element; + return index; + } + baseType& GetAt(FX_INT32 index) const + { + return *(baseType*)CFX_BaseMassArray::GetAt(index); + } + baseType* GetPtrAt(FX_INT32 index) const + { + return (baseType*)CFX_BaseMassArray::GetAt(index); + } + void SetAt(FX_INT32 index, const baseType &element) + { + *(baseType*)CFX_BaseMassArray::GetAt(index) = element; + } + void SetAtGrow(FX_INT32 index, const baseType &element) + { + *(baseType*)CFX_BaseMassArray::AddSpaceTo(index) = element; + } + FX_INT32 Append(const CFX_MassArrayTemplate &src, FX_INT32 iStart = 0, FX_INT32 iCount = -1) + { + return CFX_BaseMassArray::Append(src, iStart, iCount); + } + FX_INT32 Copy(const CFX_MassArrayTemplate &src, FX_INT32 iStart = 0, FX_INT32 iCount = -1) + { + return CFX_BaseMassArray::Copy(src, iStart, iCount); + } + FX_INT32 RemoveLast(FX_INT32 iCount = -1) + { + return CFX_BaseMassArray::RemoveLast(iCount); + } + void RemoveAll(FX_BOOL bLeaveMemory = FALSE) + { + CFX_BaseMassArray::RemoveAll(bLeaveMemory); + } +}; +typedef CFX_MassArrayTemplate CFX_PtrMassArray; +typedef CFX_MassArrayTemplate CFX_Int32MassArray; +typedef CFX_MassArrayTemplate CFX_DWordMassArray; +typedef CFX_MassArrayTemplate CFX_WordMassArray; +typedef CFX_MassArrayTemplate CFX_RectMassArray; +typedef CFX_MassArrayTemplate CFX_RectFMassArray; +template +class CFX_ObjectMassArrayTemplate : public CFX_BaseMassArray +{ +public: + CFX_ObjectMassArrayTemplate(FX_INT32 iChunkSize = 100) : CFX_BaseMassArray(iChunkSize, sizeof(baseType)) {} + ~CFX_ObjectMassArrayTemplate() + { + RemoveAll(FALSE); + } + FX_INT32 GetSize() const + { + return CFX_BaseMassArray::GetSize(); + } + FX_INT32 Add(const baseType &element) + { + FX_INT32 index = CFX_BaseMassArray::GetSize(); + baseType *p = (baseType*)CFX_BaseMassArray::AddSpaceTo(index); + FXTARGET_New ((void*)p)baseType(element); + return index; + } + baseType& GetAt(FX_INT32 index) const + { + return *(baseType*)CFX_BaseMassArray::GetAt(index); + } + baseType* GetPtrAt(FX_INT32 index) const + { + return (baseType*)CFX_BaseMassArray::GetAt(index); + } + FX_INT32 Append(const CFX_ObjectMassArrayTemplate &src, FX_INT32 iStart = 0, FX_INT32 iCount = -1) + { + if (iCount == 0) { + return CFX_BaseMassArray::GetSize(); + } + FX_INT32 iSize = src.GetSize(); + FXSYS_assert(iStart > -1 && iStart < iSize); + if (iCount < 0) { + iCount = iSize; + } + FX_INT32 iEnd = iStart + iCount; + if (iEnd > iSize) { + iEnd = iSize; + } + for (FX_INT32 i = iStart; i < iEnd; i ++) { + Add(src.GetAt(i)); + } + return CFX_BaseMassArray::GetSize(); + } + FX_INT32 Copy(const CFX_ObjectMassArrayTemplate &src, FX_INT32 iStart = 0, FX_INT32 iCount = -1) + { + if (iCount == 0) { + return CFX_BaseMassArray::GetSize(); + } + FX_INT32 iSize = src.GetSize(); + FXSYS_assert(iStart > -1 && iStart < iSize); + if (iCount < 0) { + iCount = iSize; + } + FX_INT32 iEnd = iStart + iCount; + if (iEnd > iSize) { + iEnd = iSize; + } + RemoveAll(TRUE); + for (FX_INT32 i = iStart; i < iEnd; i ++) { + Add(src.GetAt(i)); + } + return CFX_BaseMassArray::GetSize(); + } + FX_INT32 RemoveLast(FX_INT32 iCount = -1) + { + FX_INT32 iSize = CFX_BaseMassArray::GetSize(); + if (iCount < 0 || iCount > iSize) { + iCount = iSize; + } + if (iCount == 0) { + return iSize; + } + for (FX_INT32 i = iSize - iCount; i < iSize; i ++) { + ((baseType*)GetPtrAt(i))->~baseType(); + } + return CFX_BaseMassArray::RemoveLast(iCount); + } + void RemoveAll(FX_BOOL bLeaveMemory = FALSE) + { + FX_INT32 iSize = CFX_BaseMassArray::GetSize(); + for (FX_INT32 i = 0; i < iSize; i ++) { + ((baseType*)GetPtrAt(i))->~baseType(); + } + CFX_BaseMassArray::RemoveAll(bLeaveMemory); + } +}; +class CFX_BaseDiscreteArray : public CFX_Target +{ +protected: + CFX_BaseDiscreteArray(FX_INT32 iChunkSize, FX_INT32 iBlockSize); + ~CFX_BaseDiscreteArray(); + FX_LPBYTE AddSpaceTo(FX_INT32 index); + FX_LPBYTE GetAt(FX_INT32 index) const; + void RemoveAll(); + FX_LPVOID m_pData; +}; +template +class CFX_DiscreteArrayTemplate : public CFX_BaseDiscreteArray +{ +public: + CFX_DiscreteArrayTemplate(FX_INT32 iChunkSize = 100) : CFX_BaseDiscreteArray(iChunkSize, sizeof(baseType)) {} + baseType& GetAt(FX_INT32 index, const baseType &defValue) const + { + baseType *p = (baseType*)CFX_BaseDiscreteArray::GetAt(index); + return p == NULL ? (baseType&)defValue : *p; + } + baseType* GetPtrAt(FX_INT32 index) const + { + return (baseType*)CFX_BaseDiscreteArray::GetAt(index); + } + void SetAtGrow(FX_INT32 index, const baseType &element) + { + *(baseType*)CFX_BaseDiscreteArray::AddSpaceTo(index) = element; + } + void RemoveAll() + { + CFX_BaseDiscreteArray::RemoveAll(); + } +}; +typedef CFX_DiscreteArrayTemplate CFX_PtrDiscreteArray; +typedef CFX_DiscreteArrayTemplate CFX_DWordDiscreteArray; +typedef CFX_DiscreteArrayTemplate CFX_WordDiscreteArray; +class CFX_BaseStack : public CFX_Target +{ +protected: + CFX_BaseStack(FX_INT32 iChunkSize, FX_INT32 iBlockSize); + ~CFX_BaseStack(); + FX_LPBYTE Push(); + void Pop(); + FX_LPBYTE GetTopElement() const; + FX_INT32 GetSize() const; + FX_LPBYTE GetAt(FX_INT32 index) const; + void RemoveAll(FX_BOOL bLeaveMemory = FALSE); + FX_LPVOID m_pData; +}; +template +class CFX_StackTemplate : public CFX_BaseStack +{ +public: + CFX_StackTemplate(FX_INT32 iChunkSize = 100) : CFX_BaseStack(iChunkSize, sizeof(baseType)) {} + FX_INT32 Push(const baseType &element) + { + FX_INT32 index = CFX_BaseStack::GetSize(); + *(baseType*)CFX_BaseStack::Push() = element; + return index; + } + void Pop() + { + CFX_BaseStack::Pop(); + } + baseType* GetTopElement() const + { + return (baseType*)CFX_BaseStack::GetTopElement(); + } + FX_INT32 GetSize() const + { + return CFX_BaseStack::GetSize(); + } + baseType* GetAt(FX_INT32 index) const + { + return (baseType*)CFX_BaseStack::GetAt(index); + } + void RemoveAll(FX_BOOL bLeaveMemory = FALSE) + { + CFX_BaseStack::RemoveAll(bLeaveMemory); + } +}; +typedef CFX_StackTemplate CFX_PtrStack; +typedef CFX_StackTemplate CFX_DWordStack; +typedef CFX_StackTemplate CFX_WordStack; +typedef CFX_StackTemplate CFX_Int32Stack; +template +class CFX_ObjectStackTemplate : public CFX_BaseStack +{ +public: + CFX_ObjectStackTemplate(FX_INT32 iChunkSize = 100) : CFX_BaseStack(iChunkSize, sizeof(baseType)) {} + ~CFX_ObjectStackTemplate() + { + RemoveAll(); + } + FX_INT32 Push(const baseType &element) + { + FX_INT32 index = CFX_BaseStack::GetSize(); + baseType *p = (baseType*)CFX_BaseStack::Push(); + FXTARGET_New ((void*)p)baseType(element); + return index; + } + void Pop() + { + baseType *p = (baseType*)CFX_BaseStack::GetTopElement(); + if (p != NULL) { + p->~baseType(); + } + CFX_BaseStack::Pop(); + } + baseType* GetTopElement() const + { + return (baseType*)CFX_BaseStack::GetTopElement(); + } + FX_INT32 GetSize() const + { + return CFX_BaseStack::GetSize(); + } + baseType* GetAt(FX_INT32 index) const + { + return (baseType*)CFX_BaseStack::GetAt(index); + } + void RemoveAll(FX_BOOL bLeaveMemory = FALSE) + { + FX_INT32 iSize = CFX_BaseStack::GetSize(); + for (FX_INT32 i = 0; i < iSize; i ++) { + ((baseType*)CFX_BaseStack::GetAt(i))->~baseType(); + } + CFX_BaseStack::RemoveAll(bLeaveMemory); + } + FX_INT32 Copy(const CFX_ObjectStackTemplate &src, FX_INT32 iStart = 0, FX_INT32 iCount = -1) + { + if (iCount == 0) { + return CFX_BaseStack::GetSize(); + } + FX_INT32 iSize = src.GetSize(); + FXSYS_assert(iStart > -1 && iStart < iSize); + if (iCount < 0) { + iCount = iSize; + } + FX_INT32 iEnd = iStart + iCount; + if (iEnd > iSize) { + iEnd = iSize; + } + RemoveAll(TRUE); + for (FX_INT32 i = iStart; i < iEnd; i ++) { + Push(*src.GetAt(i)); + } + return CFX_BaseStack::GetSize(); + } +}; +template +class CFX_CPLTreeNode : public CFX_Target +{ +public: + typedef CFX_CPLTreeNode CPLTreeNode; + CFX_CPLTreeNode() : m_pParentNode(NULL) + , m_pChildNode(NULL) + , m_pPrevNode(NULL) + , m_pNextNode(NULL) + , m_Data() + { + } + enum TreeNode {Root = 0, Parent, FirstSibling, PreviousSibling, NextSibling, LastSibling, FirstNeighbor, PreviousNeighbor, NextNeighbor, LastNeighbor, FirstChild, LastChild}; + CPLTreeNode* GetNode(TreeNode eNode) const + { + switch (eNode) { + case Root: { + CPLTreeNode *pParent = (CPLTreeNode*)this; + CPLTreeNode *pTemp; + while ((pTemp = pParent->m_pParentNode) != NULL) { + pParent = pTemp; + } + return pParent; + } + case Parent: + return m_pParentNode; + case FirstSibling: { + CPLTreeNode *pNode = (CPLTreeNode*)this; + CPLTreeNode *pTemp; + while ((pTemp = pNode->m_pPrevNode) != NULL) { + pNode = pTemp; + } + return pNode == (CPLTreeNode*)this ? NULL : pNode; + } + case PreviousSibling: + return m_pPrevNode; + case NextSibling: + return m_pNextNode; + case LastSibling: { + CPLTreeNode *pNode = (CPLTreeNode*)this; + CPLTreeNode *pTemp; + while ((pTemp = pNode->m_pNextNode) != NULL) { + pNode = pTemp; + } + return pNode == (CPLTreeNode*)this ? NULL : pNode; + } + case FirstNeighbor: { + CPLTreeNode *pParent = (CPLTreeNode*)this; + CPLTreeNode *pTemp; + while ((pTemp = pParent->m_pParentNode) != NULL) { + pParent = pTemp; + } + return pParent == (CPLTreeNode*)this ? NULL : pParent; + } + case PreviousNeighbor: { + if (m_pPrevNode == NULL) { + return m_pParentNode; + } + CPLTreeNode *pNode = m_pPrevNode; + CPLTreeNode *pTemp; + while ((pTemp = pNode->m_pChildNode) != NULL) { + pNode = pTemp; + while ((pTemp = pNode->m_pNextNode) != NULL) { + pNode = pTemp; + } + } + return pNode; + } + case NextNeighbor: { + if (m_pChildNode != NULL) { + return m_pChildNode; + } + if (m_pNextNode != NULL) { + return m_pNextNode; + } + CPLTreeNode *pNode = m_pParentNode; + while (pNode != NULL) { + if (pNode->m_pNextNode != NULL) { + return pNode->m_pNextNode; + } + pNode = pNode->m_pParentNode; + } + return NULL; + } + case LastNeighbor: { + CPLTreeNode *pNode = (CPLTreeNode*)this; + CPLTreeNode *pTemp; + while ((pTemp = pNode->m_pParentNode) != NULL) { + pNode = pTemp; + } + while (TRUE) { + CPLTreeNode *pTemp; + while ((pTemp = pNode->m_pNextNode) != NULL) { + pNode = pTemp; + } + if (pNode->m_pChildNode == NULL) { + break; + } + pNode = pNode->m_pChildNode; + } + return pNode == (CPLTreeNode*)this ? NULL : pNode; + } + case FirstChild: + return m_pChildNode; + case LastChild: { + if (m_pChildNode == NULL) { + return NULL; + } + CPLTreeNode *pChild = m_pChildNode; + CPLTreeNode *pTemp; + while ((pTemp = pChild->m_pNextNode) != NULL) { + pChild = pTemp; + } + return pChild; + } + default: + break; + } + return NULL; + } + void SetParentNode(CPLTreeNode *pNode) + { + m_pParentNode = pNode; + } + FX_INT32 CountChildNodes() const + { + FX_INT32 iCount = 0; + CPLTreeNode *pNode = m_pChildNode; + while (pNode) { + iCount ++; + pNode = pNode->m_pNextNode; + } + return iCount; + } + CPLTreeNode* GetChildNode(FX_INT32 iIndex) const + { + FX_INT32 iCount = 0; + CPLTreeNode *pNode = m_pChildNode; + while (pNode) { + if (iIndex == iCount) { + return pNode; + } + iCount ++; + pNode = pNode->m_pNextNode; + } + return NULL; + } + FX_INT32 GetNodeIndex() const + { + FX_INT32 index = 0; + CPLTreeNode *pNode = m_pPrevNode; + while (pNode != NULL) { + index ++; + pNode = pNode->m_pPrevNode; + } + return index; + } + FX_BOOL IsParentNode(const CPLTreeNode *pNode) const + { + CPLTreeNode *pParent = m_pParentNode; + while (pParent != NULL) { + if (pParent == pNode) { + return TRUE; + } + pParent = pParent->GetTreeNode(Parent); + } + return FALSE; + } + FX_BOOL IsChildNode(const CPLTreeNode *pNode) const + { + if (pNode == NULL) { + return FALSE; + } + return pNode->IsParentNode((const CPLTreeNode*)this); + } + void SetChildNode(CPLTreeNode *pNode) + { + m_pChildNode = pNode; + } + void SetPrevNode(CPLTreeNode *pNode) + { + m_pPrevNode = pNode; + } + void SetNextNode(CPLTreeNode *pNode) + { + m_pNextNode = pNode; + } + FX_INT32 GetNodeLevel() const + { + FX_INT32 iLevel = 0; + CPLTreeNode *pNode = (CPLTreeNode*)this; + while ((pNode = pNode->m_pParentNode) != NULL) { + iLevel ++; + } + return iLevel; + } + FX_BOOL IsRootNode() const + { + return m_pParentNode == NULL; + } + baseType GetData() const + { + return m_Data; + } + void SetData(baseType data) + { + m_Data = data; + } +protected: + CPLTreeNode *m_pParentNode; + CPLTreeNode *m_pChildNode; + CPLTreeNode *m_pPrevNode; + CPLTreeNode *m_pNextNode; + baseType m_Data; + friend class CFX_CPLTree; +}; +template +class CFX_CPLTree : public CFX_Object +{ +public: + typedef CFX_CPLTreeNode CPLTreeNode; + CFX_CPLTree() : m_Root() + { + } + ~CFX_CPLTree() + { + CPLTreeNode *pNode = m_Root.GetNode(CPLTreeNode::LastNeighbor); + while (pNode != NULL) { + if (pNode->IsRootNode()) { + break; + } + CPLTreeNode *pTemp = pNode->GetNode(CPLTreeNode::PreviousNeighbor); + delete pNode; + pNode = pTemp; + } + } + CPLTreeNode* GetRoot() + { + return &m_Root; + } + CPLTreeNode* AddChild(baseType data, CPLTreeNode *pParent = NULL) + { + if (pParent == NULL) { + pParent = &m_Root; + } + CPLTreeNode *pChild = FXTARGET_New CPLTreeNode; + pChild->SetParentNode(pParent); + pChild->SetData(data); + if (pParent->m_pChildNode == NULL) { + pParent->m_pChildNode = pChild; + } else { + CPLTreeNode *pLast = pParent->GetNode(CPLTreeNode::LastChild); + pChild->SetPrevNode(pLast); + pLast->SetNextNode(pChild); + } + return pChild; + } +protected: + CPLTreeNode m_Root; +}; +#endif diff --git a/xfa/src/fgas/src/crt/codepage/cpcu1250.cpp b/xfa/src/fgas/src/crt/codepage/cpcu1250.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cpcu1250.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cpcu1251.cpp b/xfa/src/fgas/src/crt/codepage/cpcu1251.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cpcu1251.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cpcu1252.cpp b/xfa/src/fgas/src/crt/codepage/cpcu1252.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cpcu1252.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cpcu1253.cpp b/xfa/src/fgas/src/crt/codepage/cpcu1253.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cpcu1253.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cpcu1254.cpp b/xfa/src/fgas/src/crt/codepage/cpcu1254.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cpcu1254.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cpcu1255.cpp b/xfa/src/fgas/src/crt/codepage/cpcu1255.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cpcu1255.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cpcu1256.cpp b/xfa/src/fgas/src/crt/codepage/cpcu1256.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cpcu1256.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cpcu1257.cpp b/xfa/src/fgas/src/crt/codepage/cpcu1257.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cpcu1257.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cpcu1258.cpp b/xfa/src/fgas/src/crt/codepage/cpcu1258.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cpcu1258.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cpcu874.cpp b/xfa/src/fgas/src/crt/codepage/cpcu874.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cpcu874.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cpcu932.cpp b/xfa/src/fgas/src/crt/codepage/cpcu932.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cpcu932.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cpcu936.cpp b/xfa/src/fgas/src/crt/codepage/cpcu936.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cpcu936.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cpcu949.cpp b/xfa/src/fgas/src/crt/codepage/cpcu949.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cpcu949.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cpcu950.cpp b/xfa/src/fgas/src/crt/codepage/cpcu950.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cpcu950.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cphi1250.cpp b/xfa/src/fgas/src/crt/codepage/cphi1250.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cphi1250.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cphi1251.cpp b/xfa/src/fgas/src/crt/codepage/cphi1251.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cphi1251.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cphi1252.cpp b/xfa/src/fgas/src/crt/codepage/cphi1252.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cphi1252.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cphi1253.cpp b/xfa/src/fgas/src/crt/codepage/cphi1253.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cphi1253.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cphi1254.cpp b/xfa/src/fgas/src/crt/codepage/cphi1254.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cphi1254.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cphi1255.cpp b/xfa/src/fgas/src/crt/codepage/cphi1255.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cphi1255.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cphi1256.cpp b/xfa/src/fgas/src/crt/codepage/cphi1256.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cphi1256.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cphi1257.cpp b/xfa/src/fgas/src/crt/codepage/cphi1257.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cphi1257.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cphi1258.cpp b/xfa/src/fgas/src/crt/codepage/cphi1258.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cphi1258.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cphi874.cpp b/xfa/src/fgas/src/crt/codepage/cphi874.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cphi874.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cphi932.cpp b/xfa/src/fgas/src/crt/codepage/cphi932.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cphi932.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cphi936.cpp b/xfa/src/fgas/src/crt/codepage/cphi936.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cphi936.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cphi949.cpp b/xfa/src/fgas/src/crt/codepage/cphi949.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cphi949.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cphi950.cpp b/xfa/src/fgas/src/crt/codepage/cphi950.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cphi950.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cpuc1250.cpp b/xfa/src/fgas/src/crt/codepage/cpuc1250.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cpuc1250.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cpuc1251.cpp b/xfa/src/fgas/src/crt/codepage/cpuc1251.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cpuc1251.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cpuc1252.cpp b/xfa/src/fgas/src/crt/codepage/cpuc1252.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cpuc1252.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cpuc1253.cpp b/xfa/src/fgas/src/crt/codepage/cpuc1253.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cpuc1253.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cpuc1254.cpp b/xfa/src/fgas/src/crt/codepage/cpuc1254.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cpuc1254.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cpuc1255.cpp b/xfa/src/fgas/src/crt/codepage/cpuc1255.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cpuc1255.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cpuc1256.cpp b/xfa/src/fgas/src/crt/codepage/cpuc1256.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cpuc1256.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cpuc1257.cpp b/xfa/src/fgas/src/crt/codepage/cpuc1257.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cpuc1257.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cpuc1258.cpp b/xfa/src/fgas/src/crt/codepage/cpuc1258.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cpuc1258.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cpuc874.cpp b/xfa/src/fgas/src/crt/codepage/cpuc874.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cpuc874.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cpuc932.cpp b/xfa/src/fgas/src/crt/codepage/cpuc932.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cpuc932.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cpuc936.cpp b/xfa/src/fgas/src/crt/codepage/cpuc936.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cpuc936.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cpuc949.cpp b/xfa/src/fgas/src/crt/codepage/cpuc949.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cpuc949.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/codepage/cpuc950.cpp b/xfa/src/fgas/src/crt/codepage/cpuc950.cpp new file mode 100644 index 0000000000..6cd252bcf4 --- /dev/null +++ b/xfa/src/fgas/src/crt/codepage/cpuc950.cpp @@ -0,0 +1,6 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + diff --git a/xfa/src/fgas/src/crt/fx_algorithm.cpp b/xfa/src/fgas/src/crt/fx_algorithm.cpp new file mode 100644 index 0000000000..e2d77d1a0e --- /dev/null +++ b/xfa/src/fgas/src/crt/fx_algorithm.cpp @@ -0,0 +1,315 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../fgas_base.h" +#ifdef __cplusplus +extern "C" { +#endif +const static FX_CHAR g_FXBase64EncoderMap[64] = { + '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', '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', '0', '1', '2', '3', + '4', '5', '6', '7', '8', '9', '+', '/', +}; +typedef struct _FX_BASE64DATA { + + FX_DWORD data1 : 2; + FX_DWORD data2 : 6; + FX_DWORD data3 : 4; + FX_DWORD data4 : 4; + FX_DWORD data5 : 6; + FX_DWORD data6 : 2; + FX_DWORD data7 : 8; +} FX_BASE64DATA, * FX_LPBASE64ENCODEDATA; +typedef FX_BASE64DATA const * FX_LPCBASE64DATA; +static void FX_Base64EncodePiece(const FX_BASE64DATA &src, FX_INT32 iBytes, FX_CHAR dst[4]) +{ + dst[0] = g_FXBase64EncoderMap[src.data2]; + FX_DWORD b = src.data1 << 4; + if (iBytes > 1) { + b |= src.data4; + } + dst[1] = g_FXBase64EncoderMap[b]; + if (iBytes > 1) { + b = src.data3 << 2; + if (iBytes > 2) { + b |= src.data6; + } + dst[2] = g_FXBase64EncoderMap[b]; + if (iBytes > 2) { + dst[3] = g_FXBase64EncoderMap[src.data5]; + } else { + dst[3] = '='; + } + } else { + dst[2] = dst[3] = '='; + } +} +FX_INT32 FX_Base64EncodeA(FX_LPCBYTE pSrc, FX_INT32 iSrcLen, FX_LPSTR pDst) +{ + FXSYS_assert(pSrc != NULL); + if (iSrcLen < 1) { + return 0; + } + if (pDst == NULL) { + FX_INT32 iDstLen = iSrcLen / 3 * 4; + if ((iSrcLen % 3) != 0) { + iDstLen += 4; + } + return iDstLen; + } + FX_BASE64DATA srcData; + FX_INT32 iBytes = 3; + FX_LPSTR pDstEnd = pDst; + while (iSrcLen > 0) { + if (iSrcLen > 2) { + ((FX_LPBYTE)&srcData)[0] = *pSrc ++; + ((FX_LPBYTE)&srcData)[1] = *pSrc ++; + ((FX_LPBYTE)&srcData)[2] = *pSrc ++; + iSrcLen -= 3; + } else { + *((FX_LPDWORD)&srcData) = 0; + ((FX_LPBYTE)&srcData)[0] = *pSrc ++; + if (iSrcLen > 1) { + ((FX_LPBYTE)&srcData)[1] = *pSrc ++; + } + iBytes = iSrcLen; + iSrcLen = 0; + } + FX_Base64EncodePiece(srcData, iBytes, pDstEnd); + pDstEnd += 4; + } + return pDstEnd - pDst; +} +const static FX_BYTE g_FXBase64DecoderMap[256] = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x3E, 0xFF, 0xFF, 0xFF, 0x3F, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, + 0x3C, 0x3D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, + 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, + 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, + 0x17, 0x18, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, + 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, + 0x31, 0x32, 0x33, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +}; +static void FX_Base64DecodePiece(const FX_CHAR src[4], FX_INT32 iChars, FX_BASE64DATA &dst, FX_INT32 &iBytes) +{ + FXSYS_assert(iChars > 0 && iChars < 5); + iBytes = 1; + dst.data2 = g_FXBase64DecoderMap[(FX_BYTE)src[0]]; + if (iChars > 1) { + FX_BYTE b = g_FXBase64DecoderMap[(FX_BYTE)src[1]]; + dst.data1 = b >> 4; + dst.data4 = b; + if (iChars > 2) { + iBytes = 2; + b = g_FXBase64DecoderMap[(FX_BYTE)src[2]]; + dst.data3 = b >> 2; + dst.data6 = b; + if (iChars > 3) { + iBytes = 3; + dst.data5 = g_FXBase64DecoderMap[(FX_BYTE)src[3]]; + } else { + dst.data5 = 0; + } + } else { + dst.data3 = 0; + } + } else { + dst.data1 = 0; + } +} +FX_INT32 FX_Base64DecodeA(FX_LPCSTR pSrc, FX_INT32 iSrcLen, FX_LPBYTE pDst) +{ + FXSYS_assert(pSrc != NULL); + if (iSrcLen < 1) { + return 0; + } + while (iSrcLen > 0 && pSrc[iSrcLen - 1] == '=') { + iSrcLen --; + } + if (iSrcLen < 1) { + return 0; + } + if (pDst == NULL) { + FX_INT32 iDstLen = iSrcLen / 4 * 3; + iSrcLen %= 4; + if (iSrcLen == 1) { + iDstLen += 1; + } else if (iSrcLen == 2) { + iDstLen += 1; + } else if (iSrcLen == 3) { + iDstLen += 2; + } + return iDstLen; + } + FX_CHAR srcData[4]; + FX_BASE64DATA dstData; + FX_INT32 iChars = 4, iBytes; + FX_LPBYTE pDstEnd = pDst; + while (iSrcLen > 0) { + if (iSrcLen > 3) { + *((FX_DWORD*)srcData) = *((FX_DWORD*)pSrc); + pSrc += 4; + iSrcLen -= 4; + } else { + *((FX_LPDWORD)&dstData) = 0; + *((FX_DWORD*)srcData) = 0; + srcData[0] = *pSrc ++; + if (iSrcLen > 1) { + srcData[1] = *pSrc ++; + } + if (iSrcLen > 2) { + srcData[2] = *pSrc ++; + } + iChars = iSrcLen; + iSrcLen = 0; + } + FX_Base64DecodePiece(srcData, iChars, dstData, iBytes); + *pDstEnd ++ = ((FX_LPBYTE)&dstData)[0]; + if (iBytes > 1) { + *pDstEnd ++ = ((FX_LPBYTE)&dstData)[1]; + } + if (iBytes > 2) { + *pDstEnd ++ = ((FX_LPBYTE)&dstData)[2]; + } + } + return pDstEnd - pDst; +} +FX_INT32 FX_Base64DecodeW(FX_LPCWSTR pSrc, FX_INT32 iSrcLen, FX_LPBYTE pDst) +{ + FXSYS_assert(pSrc != NULL); + if (iSrcLen < 1) { + return 0; + } + while (iSrcLen > 0 && pSrc[iSrcLen - 1] == '=') { + iSrcLen --; + } + if (iSrcLen < 1) { + return 0; + } + if (pDst == NULL) { + FX_INT32 iDstLen = iSrcLen / 4 * 3; + iSrcLen %= 4; + if (iSrcLen == 1) { + iDstLen += 1; + } else if (iSrcLen == 2) { + iDstLen += 1; + } else if (iSrcLen == 3) { + iDstLen += 2; + } + return iDstLen; + } + FX_CHAR srcData[4]; + FX_BASE64DATA dstData; + FX_INT32 iChars = 4, iBytes; + FX_LPBYTE pDstEnd = pDst; + while (iSrcLen > 0) { + if (iSrcLen > 3) { + srcData[0] = (FX_CHAR) * pSrc ++; + srcData[1] = (FX_CHAR) * pSrc ++; + srcData[2] = (FX_CHAR) * pSrc ++; + srcData[3] = (FX_CHAR) * pSrc ++; + iSrcLen -= 4; + } else { + *((FX_LPDWORD)&dstData) = 0; + *((FX_DWORD*)srcData) = 0; + srcData[0] = (FX_CHAR) * pSrc ++; + if (iSrcLen > 1) { + srcData[1] = (FX_CHAR) * pSrc ++; + } + if (iSrcLen > 2) { + srcData[2] = (FX_CHAR) * pSrc ++; + } + iChars = iSrcLen; + iSrcLen = 0; + } + FX_Base64DecodePiece(srcData, iChars, dstData, iBytes); + *pDstEnd ++ = ((FX_LPBYTE)&dstData)[0]; + if (iBytes > 1) { + *pDstEnd ++ = ((FX_LPBYTE)&dstData)[1]; + } + if (iBytes > 2) { + *pDstEnd ++ = ((FX_LPBYTE)&dstData)[2]; + } + } + return pDstEnd - pDst; +} +const static FX_BYTE g_FXHex2DecMap[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, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, + 0, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; +FX_BYTE FX_Hex2Dec(FX_BYTE hexHigh, FX_BYTE hexLow) +{ + return (g_FXHex2DecMap[hexHigh] << 4) + g_FXHex2DecMap[hexLow]; +} +FX_INT32 FX_SeparateStringW(FX_LPCWSTR pStr, FX_INT32 iStrLen, FX_WCHAR delimiter, CFX_WideStringArray &pieces) +{ + if (pStr == NULL) { + return 0; + } + if (iStrLen < 0) { + iStrLen = FXSYS_wcslen(pStr); + } + FX_LPCWSTR pToken = pStr; + FX_LPCWSTR pEnd = pStr + iStrLen; + while (TRUE) { + if (pStr >= pEnd || delimiter == *pStr) { + CFX_WideString sub(pToken, pStr - pToken); + pieces.Add(sub); + pToken = pStr + 1; + if (pStr >= pEnd) { + break; + } + } + pStr ++; + } + return pieces.GetSize(); +} +#ifdef __cplusplus +}; +#endif diff --git a/xfa/src/fgas/src/crt/fx_codepage.cpp b/xfa/src/fgas/src/crt/fx_codepage.cpp new file mode 100644 index 0000000000..798edc9776 --- /dev/null +++ b/xfa/src/fgas/src/crt/fx_codepage.cpp @@ -0,0 +1,373 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../fgas_base.h" +#include "fx_codepage.h" +static const FX_CHARSET_MAP g_FXCharset2CodePageTable[] = { + { 0, 1252 }, + { 1, 0 }, + { 2, 42 }, + { 77, 10000 }, + { 78, 10001 }, + { 79, 10003 }, + { 80, 10008 }, + { 81, 10002 }, + { 83, 10005 }, + { 84, 10004 }, + { 85, 10006 }, + { 86, 10081 }, + { 87, 10021 }, + { 88, 10029 }, + { 89, 10007 }, + { 128, 932 }, + { 129, 949 }, + { 130, 1361 }, + { 134, 936 }, + { 136, 950 }, + { 161, 1253 }, + { 162, 1254 }, + { 163, 1258 }, + { 177, 1255 }, + { 178, 1256 }, + { 186, 1257 }, + { 204, 1251 }, + { 222, 874 }, + { 238, 1250 }, + { 254, 437 }, + { 255, 850 }, +}; +FX_WORD FX_GetCodePageFromCharset(FX_BYTE charset) +{ + FX_INT32 iEnd = sizeof(g_FXCharset2CodePageTable) / sizeof(FX_CHARSET_MAP) - 1; + FXSYS_assert(iEnd >= 0); + FX_INT32 iStart = 0, iMid; + do { + iMid = (iStart + iEnd) / 2; + const FX_CHARSET_MAP & cp = g_FXCharset2CodePageTable[iMid]; + if (charset == cp.charset) { + return cp.codepage; + } else if (charset < cp.charset) { + iEnd = iMid - 1; + } else { + iStart = iMid + 1; + } + } while (iStart <= iEnd); + return 0xFFFF; +} +static const FX_CHARSET_MAP g_FXCodepage2CharsetTable[] = { + { 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_WORD FX_GetCharsetFromCodePage(FX_WORD codepage) +{ + FX_INT32 iEnd = sizeof(g_FXCodepage2CharsetTable) / sizeof(FX_CHARSET_MAP) - 1; + FXSYS_assert(iEnd >= 0); + FX_INT32 iStart = 0, iMid; + do { + iMid = (iStart + iEnd) / 2; + const FX_CHARSET_MAP & cp = g_FXCodepage2CharsetTable[iMid]; + if (codepage == cp.codepage) { + return cp.charset; + } else if (codepage < cp.codepage) { + iEnd = iMid - 1; + } else { + iStart = iMid + 1; + } + } while (iStart <= iEnd); + return 0xFFFF; +} +const FX_LANG2CPMAP g_FXLang2CodepageTable[] = { + {FX_LANG_Arabic_SaudiArabia , FX_CODEPAGE_MSWin_Arabic }, + {FX_LANG_Bulgarian_Bulgaria , FX_CODEPAGE_MSWin_Cyrillic }, + {FX_LANG_Catalan_Catalan , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Chinese_Taiwan , FX_CODEPAGE_ChineseTraditional }, + {FX_LANG_CzechRepublic , FX_CODEPAGE_MSWin_EasternEuropean}, + {FX_LANG_Danish_Denmark , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_German_Germany , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Greek_Greece , FX_CODEPAGE_MSWin_Greek }, + {FX_LANG_English_UnitedStates , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Spanish_TraditionalSort , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Finnish_Finland , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_French_France , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Hebrew_Israel , FX_CODEPAGE_MSWin_Hebrew }, + {FX_LANG_Hungarian_Hungary , FX_CODEPAGE_MSWin_EasternEuropean}, + {FX_LANG_Icelandic_Iceland , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Italian_Italy , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Japanese_Japan , FX_CODEPAGE_ShiftJIS }, + {FX_LANG_Korean_Korea , FX_CODEPAGE_Korean }, + {FX_LANG_Dutch_Netherlands , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Norwegian_Bokmal , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Polish_Poland , FX_CODEPAGE_MSWin_EasternEuropean}, + {FX_LANG_Portuguese_Brazil , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Romanian_Romania , FX_CODEPAGE_MSWin_EasternEuropean}, + {FX_LANG_Russian_Russia , FX_CODEPAGE_MSWin_Cyrillic }, + {FX_LANG_Croatian_Croatia , FX_CODEPAGE_MSWin_EasternEuropean}, + {FX_LANG_Slovak_Slovakia , FX_CODEPAGE_MSWin_EasternEuropean}, + {FX_LANG_Albanian_Albania , FX_CODEPAGE_MSWin_EasternEuropean}, + {FX_LANG_Swedish_Sweden , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Thai_Thailand , FX_CODEPAGE_MSDOS_Thai }, + {FX_LANG_Turkish_Turkey , FX_CODEPAGE_MSWin_Turkish }, + {FX_LANG_Urdu_Pakistan , FX_CODEPAGE_MSWin_Arabic }, + {FX_LANG_Indonesian_Indonesia , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Ukrainian_Ukraine , FX_CODEPAGE_MSWin_Cyrillic }, + {FX_LANG_Belarusian_Belarus , FX_CODEPAGE_MSWin_Cyrillic }, + {FX_LANG_Slovenian_Slovenia , FX_CODEPAGE_MSWin_EasternEuropean}, + {FX_LANG_Estonian_Estonia , FX_CODEPAGE_MSWin_Baltic }, + {FX_LANG_Latvian_Latvia , FX_CODEPAGE_MSWin_Baltic }, + {FX_LANG_Lithuanian_Lithuania , FX_CODEPAGE_MSWin_Baltic }, + {FX_LANG_Persian , FX_CODEPAGE_MSWin_Arabic }, + {FX_LANG_Vietnamese_Vietnam , FX_CODEPAGE_MSWin_Vietnamese }, + {FX_LANG_Armenian_Armenia , FX_CODEPAGE_DefANSI }, + {FX_LANG_Azerbaijan_Latin , FX_CODEPAGE_MSWin_Turkish }, + {FX_LANG_Basque_Basque , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Macedonian , FX_CODEPAGE_MSWin_Cyrillic }, + {FX_LANG_Afrikaans_SouthAfrica , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Georgian_Georgia , FX_CODEPAGE_DefANSI }, + {FX_LANG_Faroese_FaroeIslands , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Hindi_India , FX_CODEPAGE_DefANSI }, + {FX_LANG_Malay_Malaysia , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Kazakh_Kazakhstan , FX_CODEPAGE_MSWin_Cyrillic }, + {FX_LANG_Kyrgyz_Kyrgyzstan , FX_CODEPAGE_MSWin_Cyrillic }, + {FX_LANG_Kiswahili_Kenya , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Uzbek_LatinUzbekistan , FX_CODEPAGE_MSWin_Turkish }, + {FX_LANG_Tatar_Russia , FX_CODEPAGE_MSWin_Cyrillic }, + {FX_LANG_Punjabi_India , FX_CODEPAGE_DefANSI }, + {FX_LANG_Gujarati_India , FX_CODEPAGE_DefANSI }, + {FX_LANG_Tamil_India , FX_CODEPAGE_DefANSI }, + {FX_LANG_Telugu_India , FX_CODEPAGE_DefANSI }, + {FX_LANG_Kannada_India , FX_CODEPAGE_DefANSI }, + {FX_LANG_Marathi_India , FX_CODEPAGE_DefANSI }, + {FX_LANG_SanskritIndia , FX_CODEPAGE_DefANSI }, + {FX_LANG_Mongolian_CyrillicMongolia, FX_CODEPAGE_MSWin_Cyrillic }, + {FX_LANG_Galician_Galician , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Konkani_India , FX_CODEPAGE_DefANSI }, + {FX_LANG_Syriac_Syria , FX_CODEPAGE_DefANSI }, + {FX_LANG_Divehi_Maldives , FX_CODEPAGE_DefANSI }, + {FX_LANG_Arabic_Iraq , FX_CODEPAGE_MSWin_Arabic }, + {FX_LANG_Chinese_PRC , FX_CODEPAGE_ChineseSimplified }, + {FX_LANG_German_Switzerland , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_English_UnitedKingdom , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Spanish_Mexico , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_French_Belgium , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Italian_Switzerland , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Dutch_Belgium , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Norwegian_Nynorsk , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Portuguese_Portugal , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_SerbianLatin_Serbia , FX_CODEPAGE_MSWin_EasternEuropean}, + {FX_LANG_Swedish_Finland , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Azerbaijan_Cyrillic , FX_CODEPAGE_MSWin_Cyrillic }, + {FX_LANG_Malay_BruneiDarussalam , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Uzbek_CyrillicUzbekistan , FX_CODEPAGE_MSWin_Cyrillic }, + {FX_LANG_Arabic_Egypt , FX_CODEPAGE_MSWin_Arabic }, + {FX_LANG_Chinese_HongKong , FX_CODEPAGE_ChineseTraditional }, + {FX_LANG_German_Austria , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_English_Australia , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Spanish_InternationalSort, FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_French_Canada , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_SerbianCyrillic_Serbia , FX_CODEPAGE_MSWin_Cyrillic }, + {FX_LANG_Arabic_Libya , FX_CODEPAGE_MSWin_Arabic }, + {FX_LANG_Chinese_Singapore , FX_CODEPAGE_ChineseSimplified }, + {FX_LANG_German_Luxembourg , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_English_Canada , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Spanish_Guatemala , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_French_Switzerland , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Arabic_Algeria , FX_CODEPAGE_MSWin_Arabic }, + {FX_LANG_Chinese_Macao , FX_CODEPAGE_ChineseTraditional }, + {FX_LANG_German_Liechtenstein , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_English_NewZealand , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Spanish_CostaRica , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_French_Luxembourg , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Arabic_Morocco , FX_CODEPAGE_MSWin_Arabic }, + {FX_LANG_English_Ireland , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Spanish_Panama , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_French_Monaco , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Arabic_Tunisia , FX_CODEPAGE_MSWin_Arabic }, + {FX_LANG_English_SouthAfrica , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Spanish_DominicanRepublic, FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Arabic_Oman , FX_CODEPAGE_MSWin_Arabic }, + {FX_LANG_English_Jamaica , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Spanish_Venezuela , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Arabic_Yemen , FX_CODEPAGE_MSWin_Arabic }, + {FX_LANG_English_Caribbean , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Spanish_Colombia , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Arabic_Syria , FX_CODEPAGE_MSWin_Arabic }, + {FX_LANG_English_Belize , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Spanish_Peru , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Arabic_Jordan , FX_CODEPAGE_MSWin_Arabic }, + {FX_LANG_English_TrinidadTobago , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Spanish_Argentina , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Arabic_Lebanon , FX_CODEPAGE_MSWin_Arabic }, + {FX_LANG_English_Zimbabwe , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Spanish_Ecuador , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Arabic_Kuwait , FX_CODEPAGE_MSWin_Arabic }, + {FX_LANG_English_Philippines , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Spanish_Chile , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Arabic_UAE , FX_CODEPAGE_MSWin_Arabic }, + {FX_LANG_Spanish_Uruguay , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Arabic_Bahrain , FX_CODEPAGE_MSWin_Arabic }, + {FX_LANG_Spanish_Paraguay , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Arabic_Qatar , FX_CODEPAGE_MSWin_Arabic }, + {FX_LANG_Spanish_Bolivia , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Spanish_ElSalvador , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Spanish_Honduras , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Spanish_Nicaragua , FX_CODEPAGE_MSWin_WesternEuropean}, + {FX_LANG_Spanish_PuertoRico , FX_CODEPAGE_MSWin_WesternEuropean}, +}; +FX_WORD FX_GetDefCodePageByLanguage(FX_WORD wLanguage) +{ + FX_INT32 iEnd = sizeof(g_FXLang2CodepageTable) / sizeof(FX_LANG2CPMAP) - 1; + FXSYS_assert(iEnd >= 0); + FX_INT32 iStart = 0, iMid; + do { + iMid = (iStart + iEnd) / 2; + const FX_LANG2CPMAP &cp = g_FXLang2CodepageTable[iMid]; + if (wLanguage == cp.wLanguage) { + return cp.wCodepage; + } else if (wLanguage < cp.wLanguage) { + iEnd = iMid - 1; + } else { + iStart = iMid + 1; + } + } while (iStart <= iEnd); + return 0xFFFF; +} +static const FX_STR2CPHASH g_FXCPHashTable[] = { + { 0xd45, 0x6faf }, { 0xd46, 0x6fb0 }, { 0xd47, 0x6fb1 }, { 0xd48, 0x6fb2 }, + { 0xd49, 0x4e6 }, { 0xd4d, 0x6fbd }, { 0xe9e, 0x4e4 }, { 0xc998, 0x1b5 }, + { 0x18ef0, 0x3a8 }, { 0x19f85, 0x5182 }, { 0x2e2335, 0x3b6 }, { 0x325153, 0x5182 }, + { 0x145bded, 0x2716 }, { 0x3c9a5f2, 0xc6f3 }, { 0x4c45f2d, 0x3a4 }, { 0x4c45f4e, 0xc431 }, + { 0x58caf51, 0x4e4 }, { 0x5a5cd7d, 0x3a8 }, { 0x5a6c6a7, 0x4e4 }, { 0x5a6ca0b, 0x1b5 }, + { 0x5a6cd68, 0x307 }, { 0x5a6d8d3, 0x4e4 }, { 0x5a6d948, 0x354 }, { 0x5a6d96b, 0x362 }, + { 0x5a6d984, 0x366 }, { 0x5a90e35, 0x1b5 }, { 0x5e0cf00, 0x6fb5 }, { 0x609c324, 0x551 }, + { 0x617d97f, 0x5182 }, { 0x6a6fd91, 0xfde8 }, { 0x6a6fd92, 0xfde9 }, { 0x6b102de, 0xcadc }, + { 0x6b10f48, 0x4e89 }, { 0x1020805f, 0x4e4 }, { 0x10f0524c, 0x6fb5 }, { 0x11d558fe, 0x6fb0 }, + { 0x13898d19, 0xc42d }, { 0x13898d3a, 0xc431 }, { 0x138a319e, 0x6fb1 }, { 0x14679c09, 0x96c6 }, + { 0x153f0a3d, 0x6fb2 }, { 0x1576eeb3, 0x4e20 }, { 0x169a0ce6, 0xc6f9 }, { 0x16f3e2dc, 0x6fb3 }, + { 0x18a8bb7a, 0x6fb4 }, { 0x1a5d9419, 0x6fb5 }, { 0x1a847b48, 0x3a8 }, { 0x1b762419, 0xcec8 }, + { 0x1b9d7847, 0x475 }, { 0x1c126cb9, 0x6fb6 }, { 0x1ccdbc7d, 0x4f42 }, { 0x1d330f5f, 0x2714 }, + { 0x1dc74559, 0x4e6 }, { 0x1edd80da, 0x4e4 }, { 0x23e4b03d, 0xfde8 }, { 0x24f28a16, 0x4f3d }, + { 0x286e7a32, 0x2715 }, { 0x2c7c18ed, 0x3a8 }, { 0x2e2103b7, 0x2713 }, { 0x304bf479, 0x6fb4 }, + { 0x304bf47d, 0x6fb5 }, { 0x309bb869, 0xfde8 }, { 0x309bb86a, 0xfde9 }, { 0x33664357, 0x3b6 }, + { 0x352d6b49, 0x3a4 }, { 0x36f5661c, 0x1b5 }, { 0x392e8f48, 0xcadc }, { 0x3dc7c64c, 0x47c }, + { 0x3ed2e8e1, 0x4e4 }, { 0x3f0c2fea, 0xcaed }, { 0x3f0fef8f, 0xc6f2 }, { 0x3f5e130f, 0x5182 }, + { 0x47174d1f, 0x3a8 }, { 0x49686b7b, 0x6fb4 }, { 0x4b80b0d9, 0x3a4 }, { 0x4dcda97a, 0x4e4 }, + { 0x4dcda9b6, 0x4e4 }, { 0x4e881e6a, 0x5221 }, { 0x4ffdf5a1, 0x36a }, { 0x4ffdf5a5, 0x6fbd }, + { 0x5241ce16, 0x4e8b }, { 0x546bab9d, 0x4e4 }, { 0x54a3d64e, 0x6fb6 }, { 0x562179bd, 0x5161 }, + { 0x57c1df15, 0xc6f7 }, { 0x61ff6e62, 0x4f36 }, { 0x6359c7d8, 0x4f35 }, { 0x63f3c335, 0x3a8 }, + { 0x645a0f78, 0x477 }, { 0x691ac2fd, 0x275f }, { 0x6dc2eab0, 0x2d0 }, { 0x6dc2eeef, 0x35e }, + { 0x6dc2ef10, 0x36a }, { 0x7103138a, 0x47d }, { 0x710dfbd0, 0xc6f5 }, { 0x7319f6cb, 0x36a }, + { 0x745096ad, 0x3a8 }, { 0x74866229, 0x4e8c }, { 0x77185fa5, 0x3a8 }, { 0x7953f002, 0x6faf }, + { 0x7953f003, 0x6fb0 }, { 0x7953f004, 0x6fb1 }, { 0x7953f005, 0x6fb2 }, { 0x7953f006, 0x6fb7 }, + { 0x7953f00a, 0x6fbd }, { 0x7c577571, 0x2761 }, { 0x7e8c8ff1, 0x479 }, { 0x8031f47f, 0x3b5 }, + { 0x8031f481, 0x3b5 }, { 0x80c4a710, 0x5187 }, { 0x857c7e14, 0xfde8 }, { 0x857c7e15, 0xfde9 }, + { 0x86b59c90, 0x4e4 }, { 0x86b59c91, 0x6fb0 }, { 0x86b59c92, 0x6fb1 }, { 0x86b59c93, 0x6fb2 }, + { 0x86b59c94, 0x6fb3 }, { 0x86b59c95, 0x6fb4 }, { 0x86b59c96, 0x6fb5 }, { 0x86b59c97, 0x4e7 }, + { 0x86b59c98, 0x4e6 }, { 0x8b4b24ec, 0x5190 }, { 0x8face362, 0x4e4 }, { 0x8ff9ec2a, 0xfde9 }, + { 0x919d3989, 0xcadc }, { 0x9967e5ad, 0x4e22 }, { 0x99f8b933, 0x6fbd }, { 0x9bd2a380, 0x4fc7 }, + { 0x9befad23, 0x4f38 }, { 0x9c7ac649, 0x4f3c }, { 0xa02468db, 0xdeae }, { 0xa02468ec, 0xdeab }, + { 0xa024692a, 0xdeaa }, { 0xa0246997, 0xdeb2 }, { 0xa02469ff, 0xdeb0 }, { 0xa0246a3d, 0xdeb1 }, + { 0xa0246a8c, 0xdeaf }, { 0xa0246a9a, 0xdeb3 }, { 0xa0246b16, 0xdeac }, { 0xa0246b1a, 0xdead }, + { 0xa071addc, 0x4b1 }, { 0xa38b62dc, 0x474 }, { 0xa4c09fed, 0x3a8 }, { 0xa51e86e5, 0x4e7 }, + { 0xa67ab13e, 0x3a4 }, { 0xa7414244, 0x51a9 }, { 0xa9ddbead, 0xc6fb }, { 0xab24ffab, 0x4e8a }, + { 0xabef8ac4, 0x2710 }, { 0xabfa20ac, 0x6fb4 }, { 0xad36895e, 0x4e2 }, { 0xad36895f, 0x4e3 }, + { 0xaf310e90, 0x402 }, { 0xaf31166f, 0x4e8 }, { 0xaf7277a5, 0x3b6 }, { 0xafc0d8b3, 0x96c6 }, + { 0xb0fd5dba, 0xcae0 }, { 0xb0fd5e95, 0xcadc }, { 0xb1052893, 0x7149 }, { 0xb1e98745, 0x36a }, + { 0xb277e91c, 0x5166 }, { 0xb2f7eac5, 0xcae0 }, { 0xb2f7eba0, 0xcadc }, { 0xb2f7ebc1, 0x3b5 }, + { 0xb53fa77d, 0x3a8 }, { 0xb6391138, 0x6fb5 }, { 0xb7358b7f, 0x6fb6 }, { 0xb8c42b40, 0x4e4 }, + { 0xb8c42ea4, 0x1b5 }, { 0xb8c439e7, 0x2e1 }, { 0xb8c43a61, 0x307 }, { 0xb8c43d6c, 0x4e4 }, + { 0xb8c43ddf, 0x352 }, { 0xb8c43de1, 0x354 }, { 0xb8c43de6, 0x359 }, { 0xb8c43dff, 0x35d }, + { 0xb8c43e04, 0x362 }, { 0xb8c43e07, 0x365 }, { 0xbcd29a7f, 0x3a8 }, { 0xbce34e78, 0x5182 }, + { 0xbce34e7b, 0x556a }, { 0xbce81504, 0x3b5 }, { 0xbd8a4c95, 0x272d }, { 0xbdd89dad, 0x4e4 }, + { 0xbdd89dae, 0x6fb0 }, { 0xbdd89daf, 0x6fb1 }, { 0xbdd89db0, 0x6fb2 }, { 0xbdd89db1, 0x4e6 }, + { 0xbdd89db5, 0x6fbd }, { 0xc1756e9f, 0x36b }, { 0xc7482444, 0x47a }, { 0xc9281c18, 0x4e4 }, + { 0xc9ef95df, 0x47b }, { 0xccc9db0d, 0x4e4 }, { 0xccc9db0e, 0x6fb0 }, { 0xcd73425f, 0x3b6 }, + { 0xce38b40b, 0x4b0 }, { 0xce99e549, 0x25 }, { 0xcf598740, 0x4e7 }, { 0xcf6d6f78, 0x4e4 }, + { 0xcf758df6, 0x3a4 }, { 0xd1266e51, 0x6fb5 }, { 0xd2910213, 0x2718 }, { 0xd29196bb, 0x2712 }, + { 0xd3eb2fc2, 0x476 }, { 0xd442dc2c, 0x4fc4 }, { 0xd9da4da4, 0x2711 }, { 0xdbad2f42, 0x4e4 }, + { 0xdbad2f43, 0x6fb0 }, { 0xdbad2f44, 0x6fb1 }, { 0xdbad2f45, 0x6fb2 }, { 0xdbad2f46, 0x6fb3 }, + { 0xdbad2f47, 0x6fb4 }, { 0xdbad2f48, 0x6fb5 }, { 0xdbad2f49, 0x6fb6 }, { 0xdbad2f4a, 0x4e6 }, + { 0xdc438033, 0x4f31 }, { 0xdccb439b, 0x477 }, { 0xdccdc626, 0x3b5 }, { 0xdd80a595, 0x4e4 }, + { 0xdd80a596, 0x6fb0 }, { 0xdd80a59e, 0x6fb1 }, { 0xdd80a5b4, 0x6fb2 }, { 0xdd80a5d9, 0x6fb5 }, + { 0xdd80a5da, 0x6fb4 }, { 0xdd80a5fa, 0x6fb6 }, { 0xdd80a615, 0x6fb3 }, { 0xdd80a619, 0x4e6 }, + { 0xdd80a61a, 0x3b5 }, { 0xdd80c0f8, 0x4e9f }, { 0xdf7e46ff, 0x4fc8 }, { 0xdf8680fd, 0x556a }, + { 0xdfb0bd6e, 0xc42d }, { 0xdff05486, 0x2c4 }, { 0xe3323399, 0x3a4 }, { 0xe60412dd, 0x3b5 }, + { 0xeee47add, 0x4b0 }, { 0xf021a186, 0x4e2 }, { 0xf021a187, 0x4e3 }, { 0xf021a188, 0x4e4 }, + { 0xf021a189, 0x4e5 }, { 0xf021a18a, 0x4e6 }, { 0xf021a18b, 0x4e7 }, { 0xf021a18c, 0x4e8 }, + { 0xf021a18d, 0x4e9 }, { 0xf021a18e, 0x4ea }, { 0xf0700456, 0x6fb3 }, { 0xf274f175, 0x3b5 }, + { 0xf2a9730b, 0x3a8 }, { 0xf3d463c2, 0x3a4 }, { 0xf52a70a3, 0xc42e }, { 0xf5693147, 0x6fb3 }, + { 0xf637e157, 0x478 }, { 0xfc213f3a, 0x2717 }, { 0xff654d14, 0x3b5 }, +}; +FX_WORD FX_GetCodePageFromStringA(FX_LPCSTR pStr, FX_INT32 iLength) +{ + FXSYS_assert(pStr != NULL); + if (iLength < 0) { + iLength = FXSYS_strlen(pStr); + } + if (iLength == 0) { + return 0xFFFF; + } + FX_UINT32 uHash = FX_HashCode_String_GetA(pStr, iLength, TRUE); + FX_INT32 iStart = 0, iMid; + FX_INT32 iEnd = sizeof(g_FXCPHashTable) / sizeof(FX_STR2CPHASH) - 1; + FXSYS_assert(iEnd >= 0); + do { + iMid = (iStart + iEnd) / 2; + const FX_STR2CPHASH & cp = g_FXCPHashTable[iMid]; + if (uHash == cp.uHash) { + return (FX_WORD)cp.uCodePage; + } else if (uHash < cp.uHash) { + iEnd = iMid - 1; + } else { + iStart = iMid + 1; + } + } while (iStart <= iEnd); + return 0xFFFF; +} +FX_WORD FX_GetCodePageFormStringW(FX_LPCWSTR pStr, FX_INT32 iLength) +{ + if (iLength < 0) { + iLength = FXSYS_wcslen(pStr); + } + if (iLength == 0) { + return 0xFFFF; + } + CFX_ByteString csStr; + FX_LPSTR pBuf = csStr.GetBuffer(iLength + 1); + for (FX_INT32 i = 0; i < iLength; ++i) { + *pBuf ++ = (FX_CHAR) * pStr ++; + } + csStr.ReleaseBuffer(iLength); + return FX_GetCodePageFromStringA(csStr, iLength); +} diff --git a/xfa/src/fgas/src/crt/fx_codepage.h b/xfa/src/fgas/src/crt/fx_codepage.h new file mode 100644 index 0000000000..031f4642cb --- /dev/null +++ b/xfa/src/fgas/src/crt/fx_codepage.h @@ -0,0 +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 + +#ifndef _FX_CODEPAGE_IMP +#define _FX_CODEPAGE_IMP +#endif diff --git a/xfa/src/fgas/src/crt/fx_cpmgr.cpp b/xfa/src/fgas/src/crt/fx_cpmgr.cpp new file mode 100644 index 0000000000..7bb2aa4a8d --- /dev/null +++ b/xfa/src/fgas/src/crt/fx_cpmgr.cpp @@ -0,0 +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 + +#include "../fgas_base.h" +#include "fx_codepage.h" +#ifdef _FXCP +#ifdef __cplusplus +extern "C" +{ +#endif +extern const FX_CODEPAGE_HEADER g_CP936_MapHeader; +extern const FX_CODEPAGE_HEADER g_CP932_MapHeader; +extern const FX_CODEPAGE_HEADER g_CP949_MapHeader; +extern const FX_CODEPAGE_HEADER g_CP950_MapHeader; +extern const FX_CODEPAGE_HEADER g_CP874_MapHeader; +extern const FX_CODEPAGE_HEADER g_CP1250_MapHeader; +extern const FX_CODEPAGE_HEADER g_CP1251_MapHeader; +extern const FX_CODEPAGE_HEADER g_CP1252_MapHeader; +extern const FX_CODEPAGE_HEADER g_CP1253_MapHeader; +extern const FX_CODEPAGE_HEADER g_CP1254_MapHeader; +extern const FX_CODEPAGE_HEADER g_CP1255_MapHeader; +extern const FX_CODEPAGE_HEADER g_CP1256_MapHeader; +extern const FX_CODEPAGE_HEADER g_CP1257_MapHeader; +extern const FX_CODEPAGE_HEADER g_CP1258_MapHeader; +extern const FX_CPCU_MAPINFO g_CP936_CUMap; +extern const FX_CPCU_MAPINFO g_CP932_CUMap; +extern const FX_CPCU_MAPINFO g_CP949_CUMap; +extern const FX_CPCU_MAPINFO g_CP950_CUMap; +extern const FX_CPCU_MAPINFO g_CP874_CUMap; +extern const FX_CPCU_MAPINFO g_CP1250_CUMap; +extern const FX_CPCU_MAPINFO g_CP1251_CUMap; +extern const FX_CPCU_MAPINFO g_CP1252_CUMap; +extern const FX_CPCU_MAPINFO g_CP1253_CUMap; +extern const FX_CPCU_MAPINFO g_CP1254_CUMap; +extern const FX_CPCU_MAPINFO g_CP1255_CUMap; +extern const FX_CPCU_MAPINFO g_CP1256_CUMap; +extern const FX_CPCU_MAPINFO g_CP1257_CUMap; +extern const FX_CPCU_MAPINFO g_CP1258_CUMap; +FX_LPCCODEPAGE FX_GetCodePage(FX_WORD wCodePage) +{ + FX_INT32 iEnd = sizeof(g_FXCodePageMgr) / sizeof(FX_CODEPAGE) - 1; + FXSYS_assert(iEnd >= 0); + FX_INT32 iStart = 0, iMid; + FX_UINT16 uCPID; + do { + iMid = (iStart + iEnd) / 2; + const FX_CODEPAGE &cp = g_FXCodePageMgr[iMid]; + uCPID = cp.pCPHeader->uCPID; + if (wCodePage == uCPID) { + return g_FXCodePageMgr + iMid; + } else if (wCodePage < uCPID) { + iEnd = iMid - 1; + } else { + iStart = iMid + 1; + } + } while (iStart <= iEnd); + return NULL; +} +#ifdef __cplusplus +} +#endif +#endif diff --git a/xfa/src/fgas/src/crt/fx_encode.cpp b/xfa/src/fgas/src/crt/fx_encode.cpp new file mode 100644 index 0000000000..892b5a9059 --- /dev/null +++ b/xfa/src/fgas/src/crt/fx_encode.cpp @@ -0,0 +1,189 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../fgas_base.h" +#include "fx_codepage.h" +void FX_SwapByteOrder(FX_LPWSTR pStr, FX_INT32 iLength) +{ + FXSYS_assert(pStr != NULL); + if (iLength < 0) { + iLength = FXSYS_wcslen(pStr); + } + FX_WORD wch; + if (sizeof(FX_WCHAR) > 2) { + while (iLength -- > 0) { + wch = (FX_WORD) * pStr; + wch = (wch >> 8) | (wch << 8); + wch &= 0x00FF; + *pStr ++ = wch; + } + } else { + while (iLength -- > 0) { + wch = (FX_WORD) * pStr; + wch = (wch >> 8) | (wch << 8); + *pStr ++ = wch; + } + } +} +void FX_SwapByteOrderCopy(FX_LPCWSTR pSrc, FX_LPWSTR pDst, FX_INT32 iLength) +{ + FXSYS_assert(pSrc != NULL && pDst != NULL); + if (iLength < 0) { + iLength = FXSYS_wcslen(pSrc); + } + FX_WORD wch; + if (sizeof(FX_WCHAR) > 2) { + while (iLength -- > 0) { + wch = (FX_WORD) * pSrc ++; + wch = (wch >> 8) | (wch << 8); + wch &= 0x00FF; + *pDst ++ = wch; + } + } else { + while (iLength -- > 0) { + wch = (FX_WORD) * pSrc ++; + wch = (wch >> 8) | (wch << 8); + *pDst ++ = wch; + } + } +} +void FX_UTF16ToWChar(FX_LPVOID pBuffer, FX_INT32 iLength) +{ + FXSYS_assert(pBuffer != NULL && iLength > 0); + if (sizeof(FX_WCHAR) == 2) { + return; + } + FX_WORD *pSrc = (FX_WORD*)pBuffer; + FX_LPWSTR pDst = (FX_LPWSTR)pBuffer; + while (--iLength >= 0) { + pDst[iLength] = (FX_WCHAR)pSrc[iLength]; + } +} +void FX_UTF16ToWCharCopy(const FX_WORD *pUTF16, FX_LPWSTR pWChar, FX_INT32 iLength) +{ + FXSYS_assert(pUTF16 != NULL && pWChar != NULL && iLength > 0); + if (sizeof(FX_WCHAR) == 2) { + FXSYS_memcpy(pWChar, pUTF16, iLength * sizeof(FX_WCHAR)); + } else { + while (--iLength >= 0) { + pWChar[iLength] = (FX_WCHAR)pUTF16[iLength]; + } + } +} +void FX_WCharToUTF16(FX_LPVOID pBuffer, FX_INT32 iLength) +{ + FXSYS_assert(pBuffer != NULL && iLength > 0); + if (sizeof(FX_WCHAR) == 2) { + return; + } + FX_LPCWSTR pSrc = (FX_LPCWSTR)pBuffer; + FX_WORD *pDst = (FX_WORD*)pBuffer; + while (--iLength >= 0) { + *pDst++ = (FX_WORD) * pSrc++; + } +} +void FX_WCharToUTF16Copy(FX_LPCWSTR pWChar, FX_WORD *pUTF16, FX_INT32 iLength) +{ + FXSYS_assert(pWChar != NULL && pUTF16 != NULL && iLength > 0); + if (sizeof(FX_WCHAR) == 2) { + FXSYS_memcpy(pUTF16, pWChar, iLength * sizeof(FX_WCHAR)); + } else { + while (--iLength >= 0) { + *pUTF16++ = (FX_WORD) * pWChar++; + } + } +} +inline FX_DWORD FX_DWordFromBytes(FX_LPCBYTE pStr) +{ + return FXBSTR_ID(pStr[3], pStr[2], pStr[1], pStr[0]); +} +inline FX_WORD FX_WordFromBytes(FX_LPCBYTE pStr) +{ + return (pStr[1] << 8 | pStr[0]); +} +FX_INT32 FX_DecodeString(FX_WORD wCodePage, FX_LPCSTR pSrc, FX_INT32 *pSrcLen, FX_LPWSTR pDst, FX_INT32 *pDstLen, FX_BOOL bErrBreak) +{ + if (wCodePage == FX_CODEPAGE_UTF8) { + return FX_UTF8Decode(pSrc, pSrcLen, pDst, pDstLen); + } + return -1; +} +FX_INT32 FX_UTF8Decode(FX_LPCSTR pSrc, FX_INT32 *pSrcLen, FX_LPWSTR pDst, FX_INT32 *pDstLen) +{ + if (pSrcLen == NULL || pDstLen == NULL) { + return -1; + } + FX_INT32 iSrcLen = *pSrcLen; + if (iSrcLen < 1) { + *pSrcLen = *pDstLen = 0; + return 1; + } + FX_INT32 iDstLen = *pDstLen; + FX_BOOL bValidDst = (pDst != NULL && iDstLen > 0); + FX_DWORD dwCode = 0; + FX_INT32 iPending = 0; + FX_INT32 iSrcNum = 0, iDstNum = 0; + FX_INT32 k = 0; + FX_INT32 iIndex = 0; + k = 1; + while (iIndex < iSrcLen) { + FX_BYTE byte = (FX_BYTE) * (pSrc + iIndex); + if (byte < 0x80) { + iPending = 0; + k = 1; + iDstNum ++; + iSrcNum += k; + if (bValidDst) { + *pDst ++ = byte; + if (iDstNum >= iDstLen) { + break; + } + } + } else if (byte < 0xc0) { + if (iPending < 1) { + break; + } + iPending--; + dwCode |= (byte & 0x3f) << (iPending * 6); + if (iPending == 0) { + iDstNum ++; + iSrcNum += k; + if (bValidDst) { + *pDst ++ = dwCode; + if (iDstNum >= iDstLen) { + break; + } + } + } + } else if (byte < 0xe0) { + iPending = 1; + k = 2; + dwCode = (byte & 0x1f) << 6; + } else if (byte < 0xf0) { + iPending = 2; + k = 3; + dwCode = (byte & 0x0f) << 12; + } else if (byte < 0xf8) { + iPending = 3; + k = 4; + dwCode = (byte & 0x07) << 18; + } else if (byte < 0xfc) { + iPending = 4; + k = 5; + dwCode = (byte & 0x03) << 24; + } else if (byte < 0xfe) { + iPending = 5; + k = 6; + dwCode = (byte & 0x01) << 30; + } else { + break; + } + iIndex++; + } + *pSrcLen = iSrcNum; + *pDstLen = iDstNum; + return 1; +} diff --git a/xfa/src/fgas/src/crt/fx_memory.cpp b/xfa/src/fgas/src/crt/fx_memory.cpp new file mode 100644 index 0000000000..12d081a645 --- /dev/null +++ b/xfa/src/fgas/src/crt/fx_memory.cpp @@ -0,0 +1,334 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../fgas_base.h" +#include "fx_memory.h" +#define FX_4BYTEALIGN(size) (((size) + 3) / 4 * 4) +IFX_MEMAllocator* FX_CreateAllocator(FX_ALLOCTYPE eType, size_t chunkSize, size_t blockSize) +{ + switch (eType) { +#ifndef _FXEMB + case FX_ALLOCTYPE_Dynamic: + return FXTARGET_New CFX_DynamicStore(chunkSize); +#endif + case FX_ALLOCTYPE_Default: + return FXTARGET_New CFX_DefStore(); + case FX_ALLOCTYPE_Static: + return FXTARGET_New CFX_StaticStore(chunkSize); + case FX_ALLOCTYPE_Fixed: + return FXTARGET_New CFX_FixedStore(blockSize, chunkSize); + default: + return NULL; + } +} +CFX_StaticStore::CFX_StaticStore(size_t iDefChunkSize) + : m_iAllocatedSize(0) + , m_iDefChunkSize(iDefChunkSize) + , m_pChunk(NULL) + , m_pLastChunk(NULL) +{ + FXSYS_assert(m_iDefChunkSize != 0); +} +CFX_StaticStore::~CFX_StaticStore() +{ + register FX_LPSTATICSTORECHUNK pChunk, pNext; + pChunk = m_pChunk; + while (pChunk != NULL) { + pNext = pChunk->pNextChunk; + FX_Free(pChunk); + pChunk = pNext; + } +} +FX_LPSTATICSTORECHUNK CFX_StaticStore::AllocChunk(size_t size) +{ + FXSYS_assert(size != 0); + register FX_LPSTATICSTORECHUNK pChunk = (FX_LPSTATICSTORECHUNK)FX_Alloc(FX_BYTE, sizeof(FX_STATICSTORECHUNK) + size); + if (pChunk == NULL) { + return NULL; + } + pChunk->iChunkSize = size; + pChunk->iFreeSize = size; + pChunk->pNextChunk = NULL; + if (m_pLastChunk == NULL) { + m_pChunk = pChunk; + } else { + m_pLastChunk->pNextChunk = pChunk; + } + m_pLastChunk = pChunk; + return pChunk; +} +FX_LPSTATICSTORECHUNK CFX_StaticStore::FindChunk(size_t size) +{ + FXSYS_assert(size != 0); + if (m_pLastChunk == NULL || m_pLastChunk->iFreeSize < size) { + return AllocChunk(FX_MAX(m_iDefChunkSize, size)); + } + return m_pLastChunk; +} +void* CFX_StaticStore::Alloc(size_t size) +{ + size = FX_4BYTEALIGN(size); + FXSYS_assert(size != 0); + register FX_LPSTATICSTORECHUNK pChunk = FindChunk(size); + FXSYS_assert(pChunk != NULL && pChunk->iFreeSize >= size); + register FX_LPBYTE p = (FX_LPBYTE)pChunk; + p += sizeof(FX_STATICSTORECHUNK) + pChunk->iChunkSize - pChunk->iFreeSize; + pChunk->iFreeSize -= size; + m_iAllocatedSize += size; + return p; +} +size_t CFX_StaticStore::SetDefChunkSize(size_t size) +{ + FXSYS_assert(size != 0); + size_t v = m_iDefChunkSize; + m_iDefChunkSize = size; + return v; +} +CFX_FixedStore::CFX_FixedStore(size_t iBlockSize, size_t iBlockNumsInChunk) + : m_iBlockSize(FX_4BYTEALIGN(iBlockSize)) + , m_iDefChunkSize(FX_4BYTEALIGN(iBlockNumsInChunk)) + , m_pChunk(NULL) +{ + FXSYS_assert(m_iBlockSize != 0 && m_iDefChunkSize != 0); +} +CFX_FixedStore::~CFX_FixedStore() +{ + register FX_LPFIXEDSTORECHUNK pChunk, pNext; + pChunk = m_pChunk; + while (pChunk != NULL) { + pNext = pChunk->pNextChunk; + FX_Free(pChunk); + pChunk = pNext; + } +} +FX_LPFIXEDSTORECHUNK CFX_FixedStore::AllocChunk() +{ + FX_INT32 iTotalSize = sizeof(FX_FIXEDSTORECHUNK) + m_iDefChunkSize + m_iBlockSize * m_iDefChunkSize; + register FX_LPFIXEDSTORECHUNK pChunk = (FX_LPFIXEDSTORECHUNK)FX_Alloc(FX_BYTE, iTotalSize); + if (pChunk == NULL) { + return NULL; + } + FXSYS_memset(pChunk->FirstFlag(), 0, m_iDefChunkSize); + pChunk->pNextChunk = m_pChunk; + pChunk->iChunkSize = m_iDefChunkSize; + pChunk->iFreeNum = m_iDefChunkSize; + m_pChunk = pChunk; + return pChunk; +} +void* CFX_FixedStore::Alloc(size_t size) +{ + if (size > m_iBlockSize) { + return NULL; + } + register FX_LPFIXEDSTORECHUNK pChunk = m_pChunk; + while (pChunk != NULL) { + if (pChunk->iFreeNum > 0) { + break; + } + pChunk = pChunk->pNextChunk; + } + if (pChunk == NULL) { + pChunk = AllocChunk(); + } + FXSYS_assert(pChunk != NULL); + register FX_LPBYTE pFlags = pChunk->FirstFlag(); + register size_t i = 0; + for (; i < pChunk->iChunkSize; i ++) + if (pFlags[i] == 0) { + break; + } + FXSYS_assert(i < pChunk->iChunkSize); + pFlags[i] = 1; + pChunk->iFreeNum --; + return pChunk->FirstBlock() + i * m_iBlockSize; +} +void CFX_FixedStore::Free(void* pBlock) +{ + FXSYS_assert(pBlock != NULL); + register FX_LPFIXEDSTORECHUNK pPrior, pChunk; + pPrior = NULL, pChunk = m_pChunk; + register FX_LPBYTE pStart = NULL, pEnd; + while (pChunk != NULL) { + pStart = pChunk->FirstBlock(); + if (pBlock >= pStart) { + pEnd = pStart + m_iBlockSize * pChunk->iChunkSize; + if (pBlock < pEnd) { + break; + } + } + pPrior = pChunk, pChunk = pChunk->pNextChunk; + } + FXSYS_assert(pChunk != NULL); + register size_t iPos = ((FX_LPBYTE)pBlock - pStart) / m_iBlockSize; + FXSYS_assert(iPos < pChunk->iChunkSize); + register FX_LPBYTE pFlags = pChunk->FirstFlag(); + if (pFlags[iPos] == 0) { + return; + } + pFlags[iPos] = 0; + pChunk->iFreeNum ++; + if (pChunk->iFreeNum == pChunk->iChunkSize) { + if (pPrior == NULL) { + m_pChunk = pChunk->pNextChunk; + } else { + pPrior->pNextChunk = pChunk->pNextChunk; + } + FX_Free(pChunk); + } +} +size_t CFX_FixedStore::SetDefChunkSize(size_t iChunkSize) +{ + FXSYS_assert(iChunkSize != 0); + size_t v = m_iDefChunkSize; + m_iDefChunkSize = FX_4BYTEALIGN(iChunkSize); + return v; +} +#ifndef _FXEMB +CFX_DynamicStore::CFX_DynamicStore(size_t iDefChunkSize) + : m_iDefChunkSize(iDefChunkSize) + , m_pChunk(NULL) +{ + FXSYS_assert(m_iDefChunkSize != 0); +} +CFX_DynamicStore::~CFX_DynamicStore() +{ + register FX_LPDYNAMICSTORECHUNK pChunk, pNext; + pChunk = m_pChunk; + while (pChunk != NULL) { + pNext = pChunk->pNextChunk; + FX_Free(pChunk); + pChunk = pNext; + } +} +FX_LPDYNAMICSTORECHUNK CFX_DynamicStore::AllocChunk(size_t size) +{ + FXSYS_assert(size != 0); + register FX_LPDYNAMICSTORECHUNK pChunk = (FX_LPDYNAMICSTORECHUNK)FX_Alloc(FX_BYTE, sizeof(FX_DYNAMICSTORECHUNK) + sizeof(FX_DYNAMICSTOREBLOCK) * 2 + size); + if (pChunk == NULL) { + return NULL; + } + pChunk->iChunkSize = size; + pChunk->iFreeSize = size; + register FX_LPDYNAMICSTOREBLOCK pBlock = pChunk->FirstBlock(); + pBlock->iBlockSize = size; + pBlock->bUsed = FALSE; + pBlock = pBlock->NextBlock(); + pBlock->iBlockSize = 0; + pBlock->bUsed = TRUE; + if (m_pChunk != NULL && size >= m_iDefChunkSize) { + FX_LPDYNAMICSTORECHUNK pLast = m_pChunk; + while (pLast->pNextChunk != NULL) { + pLast = pLast->pNextChunk; + } + pLast->pNextChunk = pChunk; + pChunk->pNextChunk = NULL; + } else { + pChunk->pNextChunk = m_pChunk; + m_pChunk = pChunk; + } + return pChunk; +} +void* CFX_DynamicStore::Alloc(size_t size) +{ + size = FX_4BYTEALIGN(size); + FXSYS_assert(size != 0); + register FX_LPDYNAMICSTORECHUNK pChunk = m_pChunk; + register FX_LPDYNAMICSTOREBLOCK pBlock = NULL; + while (pChunk != NULL) { + if (pChunk->iFreeSize >= size) { + pBlock = pChunk->FirstBlock(); + register FX_BOOL bFind = FALSE; + while(pBlock->iBlockSize != 0) { + if (!pBlock->bUsed && pBlock->iBlockSize >= size) { + bFind = TRUE; + break; + } + pBlock = pBlock->NextBlock(); + } + if (bFind) { + break; + } + } + pChunk = pChunk->pNextChunk; + } + if (pChunk == NULL) { + pChunk = AllocChunk(FX_MAX(m_iDefChunkSize, size)); + pBlock = pChunk->FirstBlock(); + } + FXSYS_assert(pChunk != NULL && pBlock != NULL); + register size_t m = size + sizeof(FX_DYNAMICSTOREBLOCK); + pBlock->bUsed = TRUE; + if (pBlock->iBlockSize > m) { + register size_t n = pBlock->iBlockSize; + pBlock->iBlockSize = size; + register FX_LPDYNAMICSTOREBLOCK pNextBlock = pBlock->NextBlock(); + pNextBlock->bUsed = FALSE; + pNextBlock->iBlockSize = n - size - sizeof(FX_DYNAMICSTOREBLOCK); + pChunk->iFreeSize -= size + sizeof(FX_DYNAMICSTOREBLOCK); + } else { + pChunk->iFreeSize -= pBlock->iBlockSize; + } + return pBlock->Data(); +} +void CFX_DynamicStore::Free(void* pBlock) +{ + FXSYS_assert(pBlock != NULL); + register FX_LPDYNAMICSTORECHUNK pPriorChunk, pChunk; + pPriorChunk = NULL, pChunk = m_pChunk; + while (pChunk != NULL) { + if (pBlock > pChunk && pBlock <= ((FX_LPBYTE)pChunk + sizeof(FX_DYNAMICSTORECHUNK) + pChunk->iChunkSize)) { + break; + } + pPriorChunk = pChunk, pChunk = pChunk->pNextChunk; + } + FXSYS_assert(pChunk != NULL); + register FX_LPDYNAMICSTOREBLOCK pPriorBlock, pFindBlock; + pPriorBlock = NULL, pFindBlock = pChunk->FirstBlock(); + while(pFindBlock->iBlockSize != 0) { + if (pBlock == (void*)pFindBlock->Data()) { + break; + } + pPriorBlock = pFindBlock; + pFindBlock = pFindBlock->NextBlock(); + } + FXSYS_assert(pFindBlock->iBlockSize != 0 && pFindBlock->bUsed && pBlock == (void*)pFindBlock->Data()); + pFindBlock->bUsed = FALSE; + pChunk->iFreeSize += pFindBlock->iBlockSize; + if (pPriorBlock == NULL) { + pPriorBlock = pChunk->FirstBlock(); + } else if (pPriorBlock->bUsed) { + pPriorBlock = pFindBlock; + } + pFindBlock = pPriorBlock; + register size_t sizeFree = 0; + register size_t sizeBlock = 0; + while (pFindBlock->iBlockSize != 0 && !pFindBlock->bUsed) { + if (pFindBlock != pPriorBlock) { + sizeFree += sizeof(FX_DYNAMICSTOREBLOCK); + sizeBlock += sizeof(FX_DYNAMICSTOREBLOCK); + } + sizeBlock += pFindBlock->iBlockSize; + pFindBlock = pFindBlock->NextBlock(); + } + pPriorBlock->iBlockSize = sizeBlock; + pChunk->iFreeSize += sizeFree; + if (pChunk->iFreeSize == pChunk->iChunkSize) { + if (pPriorChunk == NULL) { + m_pChunk = pChunk->pNextChunk; + } else { + pPriorChunk->pNextChunk = pChunk->pNextChunk; + } + FX_Free(pChunk); + } +} +size_t CFX_DynamicStore::SetDefChunkSize(size_t size) +{ + FXSYS_assert(size != 0); + size_t v = m_iDefChunkSize; + m_iDefChunkSize = size; + return v; +} +#endif diff --git a/xfa/src/fgas/src/crt/fx_memory.h b/xfa/src/fgas/src/crt/fx_memory.h new file mode 100644 index 0000000000..9121c32c0f --- /dev/null +++ b/xfa/src/fgas/src/crt/fx_memory.h @@ -0,0 +1,199 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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_MEMORY_IMP +#define _FX_MEMORY_IMP +class CFX_DefStore; +class CFX_StaticStore; +class CFX_FixedStore; +class CFX_DynamicStore; +class CFX_DefStore : public IFX_MEMAllocator, public CFX_Target +{ +public: + CFX_DefStore() {} + ~CFX_DefStore() {} + virtual void Release() + { + FXTARGET_Delete this; + } + virtual void* Alloc(size_t size) + { + return FX_Alloc(FX_BYTE, size); + } + virtual void Free(void *pBlock) + { + FX_Free(pBlock); + } + virtual size_t GetBlockSize() const + { + return 0; + } + virtual size_t GetDefChunkSize() const + { + return 0; + } + virtual size_t SetDefChunkSize(size_t size) + { + return 0; + } + virtual size_t GetCurrentDataSize() const + { + return 0; + } +}; +#if _FX_OS_ != _FX_ANDROID_ +#pragma pack(push, 1) +#endif +typedef struct _FX_STATICSTORECHUNK { + _FX_STATICSTORECHUNK* pNextChunk; + size_t iChunkSize; + size_t iFreeSize; +} FX_STATICSTORECHUNK, * FX_LPSTATICSTORECHUNK; +typedef FX_STATICSTORECHUNK const * FX_LPCSTATICSTORECHUNK; +#if _FX_OS_ != _FX_ANDROID_ +#pragma pack(pop) +#endif +class CFX_StaticStore : public IFX_MEMAllocator, public CFX_Target +{ +public: + CFX_StaticStore(size_t iDefChunkSize = 4096); + ~CFX_StaticStore(); + virtual void Release() + { + FXTARGET_Delete this; + } + virtual void* Alloc(size_t size); + virtual void Free(FX_LPVOID pBlock) {} + virtual size_t GetBlockSize() const + { + return 0; + } + virtual size_t GetDefChunkSize() const + { + return m_iDefChunkSize; + } + virtual size_t SetDefChunkSize(size_t size); + virtual size_t GetCurrentDataSize() const + { + return m_iAllocatedSize; + } +protected: + size_t m_iAllocatedSize; + size_t m_iDefChunkSize; + FX_LPSTATICSTORECHUNK m_pChunk; + FX_LPSTATICSTORECHUNK m_pLastChunk; + FX_LPSTATICSTORECHUNK AllocChunk(size_t size); + FX_LPSTATICSTORECHUNK FindChunk(size_t size); +}; +#if _FX_OS_ != _FX_ANDROID_ +#pragma pack(push, 1) +#endif +typedef struct _FX_FIXEDSTORECHUNK { + FX_LPBYTE FirstFlag() const + { + return (FX_LPBYTE)this + sizeof(_FX_FIXEDSTORECHUNK); + } + FX_LPBYTE FirstBlock() const + { + return FirstFlag() + iChunkSize; + } + _FX_FIXEDSTORECHUNK* pNextChunk; + size_t iChunkSize; + size_t iFreeNum; +} FX_FIXEDSTORECHUNK, * FX_LPFIXEDSTORECHUNK; +typedef FX_FIXEDSTORECHUNK const * FX_LPCFIXEDSTORECHUNK; +#if _FX_OS_ != _FX_ANDROID_ +#pragma pack(pop) +#endif +class CFX_FixedStore : public IFX_MEMAllocator, public CFX_Target +{ +public: + CFX_FixedStore(size_t iBlockSize, size_t iBlockNumsInChunk); + virtual ~CFX_FixedStore(); + virtual void Release() + { + FXTARGET_Delete this; + } + virtual void* Alloc(size_t size); + virtual void Free(FX_LPVOID pBlock); + virtual size_t GetBlockSize() const + { + return m_iBlockSize; + } + virtual size_t GetDefChunkSize() const + { + return m_iDefChunkSize; + } + virtual size_t SetDefChunkSize(size_t iChunkSize); + virtual size_t GetCurrentDataSize() const + { + return 0; + } +protected: + size_t m_iBlockSize; + size_t m_iDefChunkSize; + FX_LPFIXEDSTORECHUNK m_pChunk; + FX_LPFIXEDSTORECHUNK AllocChunk(); +}; +#if _FX_OS_ != _FX_ANDROID_ +#pragma pack(push, 1) +#endif +typedef struct _FX_DYNAMICSTOREBLOCK { + _FX_DYNAMICSTOREBLOCK* NextBlock() const + { + return (_FX_DYNAMICSTOREBLOCK*)(Data() + iBlockSize); + } + FX_LPBYTE Data() const + { + return (FX_LPBYTE)this + sizeof(_FX_DYNAMICSTOREBLOCK); + } + size_t iBlockSize; + FX_BOOL bUsed; +} FX_DYNAMICSTOREBLOCK, * FX_LPDYNAMICSTOREBLOCK; +typedef FX_DYNAMICSTOREBLOCK const * FX_LPCDYNAMICSTOREBLOCK; +typedef struct _FX_DYNAMICSTORECHUNK { + FX_LPDYNAMICSTOREBLOCK FirstBlock() const + { + return (FX_LPDYNAMICSTOREBLOCK)((FX_LPBYTE)this + sizeof(_FX_DYNAMICSTORECHUNK)); + } + _FX_DYNAMICSTORECHUNK* pNextChunk; + size_t iChunkSize; + size_t iFreeSize; +} FX_DYNAMICSTORECHUNK, * FX_LPDYNAMICSTORECHUNK; +typedef FX_DYNAMICSTORECHUNK const * FX_LPCDYNAMICSTORECHUNK; +#if _FX_OS_ != _FX_ANDROID_ +#pragma pack(pop) +#endif +class CFX_DynamicStore : public IFX_MEMAllocator, public CFX_Target +{ +public: + CFX_DynamicStore(size_t iDefChunkSize = 4096); + virtual ~CFX_DynamicStore(); + virtual void Release() + { + FXTARGET_Delete this; + } + virtual void* Alloc(size_t size); + virtual void Free(FX_LPVOID pBlock); + virtual size_t GetBlockSize() const + { + return 0; + } + virtual size_t GetDefChunkSize() const + { + return m_iDefChunkSize; + } + virtual size_t SetDefChunkSize(size_t size); + virtual size_t GetCurrentDataSize() const + { + return 0; + } +protected: + size_t m_iDefChunkSize; + FX_LPDYNAMICSTORECHUNK m_pChunk; + FX_LPDYNAMICSTORECHUNK AllocChunk(size_t size); +}; +#endif diff --git a/xfa/src/fgas/src/crt/fx_stream.cpp b/xfa/src/fgas/src/crt/fx_stream.cpp new file mode 100644 index 0000000000..fff3fe1e86 --- /dev/null +++ b/xfa/src/fgas/src/crt/fx_stream.cpp @@ -0,0 +1,1613 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../fgas_base.h" +#include "fx_stream.h" +IFX_Stream* IFX_Stream::CreateStream(IFX_BufferRead *pBufferRead, FX_DWORD dwAccess, FX_INT32 iFileSize, FX_BOOL bReleaseBufferRead ) +{ + CFX_Stream *pSR = FX_NEW CFX_Stream; + if (!pSR) { + return NULL; + } + if (!pSR->LoadBufferRead(pBufferRead, iFileSize, dwAccess, bReleaseBufferRead)) { + pSR->Release(); + return NULL; + } + if (dwAccess & FX_STREAMACCESS_Text) { + IFX_Stream *pTR = FX_NEW CFX_TextStream(pSR, TRUE); + if (!pTR) { + pTR->Release(); + pTR = NULL; + } + return pTR; + } + return pSR; +} +IFX_Stream* IFX_Stream::CreateStream(IFX_FileRead *pFileRead, FX_DWORD dwAccess) +{ + CFX_Stream *pSR = FX_NEW CFX_Stream; + if (pSR == NULL) { + return NULL; + } + if (!pSR->LoadFileRead(pFileRead, dwAccess)) { + pSR->Release(); + return NULL; + } + if (dwAccess & FX_STREAMACCESS_Text) { + IFX_Stream *pTR = FX_NEW CFX_TextStream(pSR, TRUE); + if (pTR == NULL) { + pSR->Release(); + return NULL; + } + return pTR; + } + return pSR; +} +IFX_Stream* IFX_Stream::CreateStream(IFX_FileWrite *pFileWrite, FX_DWORD dwAccess) +{ + CFX_Stream *pSR = FX_NEW CFX_Stream; + if (pSR == NULL) { + return NULL; + } + if (!pSR->LoadFileWrite(pFileWrite, dwAccess)) { + pSR->Release(); + return NULL; + } + if (dwAccess & FX_STREAMACCESS_Text) { + IFX_Stream *pTR = FX_NEW CFX_TextStream(pSR, TRUE); + if (pTR == NULL) { + pSR->Release(); + return NULL; + } + return pTR; + } + return pSR; +} +IFX_Stream* IFX_Stream::CreateStream(FX_LPCWSTR pszFileName, FX_DWORD dwAccess) +{ + CFX_Stream *pSR = FX_NEW CFX_Stream; + if (pSR == NULL) { + return NULL; + } + if (!pSR->LoadFile(pszFileName, dwAccess)) { + pSR->Release(); + return NULL; + } + if (dwAccess & FX_STREAMACCESS_Text) { + IFX_Stream *pTR = FX_NEW CFX_TextStream(pSR, TRUE); + if (pTR == NULL) { + pSR->Release(); + return NULL; + } + return pTR; + } + return pSR; +} +IFX_Stream* IFX_Stream::CreateStream(FX_LPBYTE pData, FX_INT32 length, FX_DWORD dwAccess) +{ + CFX_Stream *pSR = FX_NEW CFX_Stream; + if (pSR == NULL) { + return NULL; + } + if (!pSR->LoadBuffer(pData, length, dwAccess)) { + pSR->Release(); + return NULL; + } + if (dwAccess & FX_STREAMACCESS_Text) { + IFX_Stream *pTR = FX_NEW CFX_TextStream(pSR, TRUE); + if (pTR == NULL) { + pSR->Release(); + return NULL; + } + return pTR; + } + return pSR; +} +CFX_StreamImp::CFX_StreamImp() + : CFX_ThreadLock() + , m_dwAccess(0) +{ +} +CFX_FileStreamImp::CFX_FileStreamImp() + : CFX_StreamImp() + , m_hFile(NULL) + , m_iLength(0) +{ +} +CFX_FileStreamImp::~CFX_FileStreamImp() +{ + if (m_hFile != NULL) { + FXSYS_fclose(m_hFile); + } +} +FX_BOOL CFX_FileStreamImp::LoadFile(FX_LPCWSTR pszSrcFileName, FX_DWORD dwAccess) +{ + FXSYS_assert(m_hFile == NULL); + FXSYS_assert(pszSrcFileName != NULL && FXSYS_wcslen(pszSrcFileName) > 0); +#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || _FX_OS_ == _FX_WIN64_ + CFX_WideString wsMode; + if (dwAccess & FX_STREAMACCESS_Write) { + if (dwAccess & FX_STREAMACCESS_Append) { + wsMode = L"a+b"; + } else if (dwAccess & FX_STREAMACCESS_Truncate) { + wsMode = L"w+b"; + } else { + wsMode = L"r+b"; + } + } else { + wsMode = L"rb"; + } +#ifdef _FX_WINAPI_PARTITION_APP_ + CFX_WideString wsSrcFileName(pszSrcFileName); + _wfopen_s(&m_hFile, wsSrcFileName, wsMode); +#else + m_hFile = FXSYS_wfopen(pszSrcFileName, wsMode); +#endif + if (m_hFile == NULL) { + if (dwAccess & FX_STREAMACCESS_Write) { + if (dwAccess & FX_STREAMACCESS_Create) { +#ifdef _FX_WINAPI_PARTITION_APP_ + CFX_WideString wsSrcFileName(pszSrcFileName); + _wfopen_s(&m_hFile, wsSrcFileName, L"w+b"); +#else + m_hFile = FXSYS_wfopen(pszSrcFileName, L"w+b"); +#endif + } + if (m_hFile == NULL) { +#ifdef _FX_WINAPI_PARTITION_APP_ + CFX_WideString wsSrcFileName(pszSrcFileName); + _wfopen_s(&m_hFile, wsSrcFileName, L"r+b"); +#else + m_hFile = FXSYS_wfopen(pszSrcFileName, L"r+b"); +#endif + if (m_hFile == NULL) { + return FALSE; + } + if (dwAccess & FX_STREAMACCESS_Truncate) { + FX_fsetsize(m_hFile, 0); + } + } + } else { + return FALSE; + } + } +#else + CFX_ByteString wsMode; + if (dwAccess & FX_STREAMACCESS_Write) { + if (dwAccess & FX_STREAMACCESS_Append) { + wsMode = "a+b"; + } else if (dwAccess & FX_STREAMACCESS_Truncate) { + wsMode = "w+b"; + } else { + wsMode = "r+b"; + } + } else { + wsMode = "rb"; + } + CFX_ByteString szFileName = CFX_ByteString::FromUnicode(pszSrcFileName); + m_hFile = FXSYS_fopen(szFileName, wsMode); + if (m_hFile == NULL) { + if (dwAccess & FX_STREAMACCESS_Write) { + if (dwAccess & FX_STREAMACCESS_Create) { + m_hFile = FXSYS_fopen(szFileName, "w+b"); + } + if (m_hFile == NULL) { + m_hFile = FXSYS_fopen(szFileName, "r+b"); + if (m_hFile == NULL) { + return FALSE; + } + if (dwAccess & FX_STREAMACCESS_Truncate) { + FX_fsetsize(m_hFile, 0); + } + } + } else { + return FALSE; + } + } +#endif + m_dwAccess = dwAccess; + if ((dwAccess & (FX_STREAMACCESS_Write | FX_STREAMACCESS_Truncate)) == (FX_STREAMACCESS_Write | FX_STREAMACCESS_Truncate)) { + m_iLength = 0; + } else { + m_iLength = FX_filelength(m_hFile); + } + return TRUE; +} +FX_INT32 CFX_FileStreamImp::GetLength() const +{ + FXSYS_assert(m_hFile != NULL); + return m_iLength; +} +FX_INT32 CFX_FileStreamImp::Seek(FX_STREAMSEEK eSeek, FX_INT32 iOffset) +{ + FXSYS_assert(m_hFile != NULL); + FXSYS_fseek(m_hFile, iOffset, eSeek); + return FXSYS_ftell(m_hFile); +} +FX_INT32 CFX_FileStreamImp::GetPosition() +{ + FXSYS_assert(m_hFile != NULL); + return FXSYS_ftell(m_hFile); +} +FX_BOOL CFX_FileStreamImp::IsEOF() const +{ + FXSYS_assert(m_hFile != NULL); + return FXSYS_ftell(m_hFile) >= m_iLength; +} +FX_INT32 CFX_FileStreamImp::ReadData(FX_LPBYTE pBuffer, FX_INT32 iBufferSize) +{ + FXSYS_assert(m_hFile != NULL); + FXSYS_assert(pBuffer != NULL && iBufferSize > 0); + return FXSYS_fread(pBuffer, 1, iBufferSize, m_hFile); +} +FX_INT32 CFX_FileStreamImp::ReadString(FX_LPWSTR pStr, FX_INT32 iMaxLength, FX_BOOL &bEOS) +{ + FXSYS_assert(m_hFile != NULL); + FXSYS_assert(pStr != NULL && iMaxLength > 0); + if (m_iLength <= 0) { + return 0; + } + FX_INT32 iPosition = FXSYS_ftell(m_hFile); + FX_INT32 iLen = FX_MIN((m_iLength - iPosition) / 2, iMaxLength); + if (iLen <= 0) { + return 0; + } + iLen = FXSYS_fread(pStr, 2, iLen, m_hFile); + FX_INT32 iCount = 0; + while (*pStr != L'\0' && iCount < iLen) { + pStr ++, iCount ++; + } + iPosition += iCount * 2; + if (FXSYS_ftell(m_hFile) != iPosition) { + FXSYS_fseek(m_hFile, iPosition, 0); + } + bEOS = (iPosition >= m_iLength); + return iCount; +} +FX_INT32 CFX_FileStreamImp::WriteData(FX_LPCBYTE pBuffer, FX_INT32 iBufferSize) +{ + FXSYS_assert(m_hFile != NULL && (m_dwAccess & FX_STREAMACCESS_Write) != 0); + FXSYS_assert(pBuffer != NULL && iBufferSize > 0); + FX_INT32 iRet = FXSYS_fwrite(pBuffer, 1, iBufferSize, m_hFile); + if (iRet != 0) { + FX_INT32 iPos = FXSYS_ftell(m_hFile); + if (iPos > m_iLength) { + m_iLength = iPos; + } + } + return iRet; +} +FX_INT32 CFX_FileStreamImp::WriteString(FX_LPCWSTR pStr, FX_INT32 iLength) +{ + FXSYS_assert(m_hFile != NULL && (m_dwAccess & FX_STREAMACCESS_Write) != 0); + FXSYS_assert(pStr != NULL && iLength > 0); + FX_INT32 iRet = FXSYS_fwrite(pStr, 2, iLength, m_hFile); + if (iRet != 0) { + FX_INT32 iPos = FXSYS_ftell(m_hFile); + if (iPos > m_iLength) { + m_iLength = iPos; + } + } + return iRet; +} +void CFX_FileStreamImp::Flush() +{ + FXSYS_assert(m_hFile != NULL && (m_dwAccess & FX_STREAMACCESS_Write) != 0); + FXSYS_fflush(m_hFile); +} +FX_BOOL CFX_FileStreamImp::SetLength(FX_INT32 iLength) +{ + FXSYS_assert(m_hFile != NULL && (m_dwAccess & FX_STREAMACCESS_Write) != 0); + FX_BOOL bRet = FX_fsetsize(m_hFile, iLength); + m_iLength = FX_filelength(m_hFile); + return bRet; +} +CFX_FileReadStreamImp::CFX_FileReadStreamImp() + : m_pFileRead(NULL) + , m_iPosition(0) + , m_iLength(0) +{ +} +FX_BOOL CFX_FileReadStreamImp::LoadFileRead(IFX_FileRead *pFileRead, FX_DWORD dwAccess) +{ + FXSYS_assert(m_pFileRead == NULL && pFileRead != NULL); + if (dwAccess & FX_STREAMACCESS_Write) { + return FALSE; + } + m_pFileRead = pFileRead; + m_iLength = m_pFileRead->GetSize(); + return TRUE; +} +FX_INT32 CFX_FileReadStreamImp::GetLength() const +{ + return m_iLength; +} +FX_INT32 CFX_FileReadStreamImp::Seek(FX_STREAMSEEK eSeek, FX_INT32 iOffset) +{ + switch (eSeek) { + case FX_STREAMSEEK_Begin: + m_iPosition = iOffset; + break; + case FX_STREAMSEEK_Current: + m_iPosition += iOffset; + break; + case FX_STREAMSEEK_End: + m_iPosition = m_iLength + iOffset; + break; + } + if (m_iPosition < 0) { + m_iPosition = 0; + } else if (m_iPosition >= m_iLength) { + m_iPosition = m_iLength; + } + return m_iPosition; +} +FX_BOOL CFX_FileReadStreamImp::IsEOF() const +{ + return m_iPosition >= m_iLength; +} +FX_INT32 CFX_FileReadStreamImp::ReadData(FX_LPBYTE pBuffer, FX_INT32 iBufferSize) +{ + FXSYS_assert(m_pFileRead != NULL); + FXSYS_assert(pBuffer != NULL && iBufferSize > 0); + if (iBufferSize > m_iLength - m_iPosition) { + iBufferSize = m_iLength - m_iPosition; + } + if (m_pFileRead->ReadBlock(pBuffer, m_iPosition, iBufferSize)) { + m_iPosition += iBufferSize; + return iBufferSize; + } + return 0; +} +FX_INT32 CFX_FileReadStreamImp::ReadString(FX_LPWSTR pStr, FX_INT32 iMaxLength, FX_BOOL &bEOS) +{ + FXSYS_assert(m_pFileRead != NULL); + FXSYS_assert(pStr != NULL && iMaxLength > 0); + iMaxLength = ReadData((FX_LPBYTE)pStr, iMaxLength * 2) / 2; + if (iMaxLength <= 0) { + return 0; + } + FX_INT32 i = 0; + while (i < iMaxLength && pStr[i] != L'\0') { + ++i; + } + bEOS = (m_iPosition >= m_iLength) || pStr[i] == L'\0'; + return i; +} +CFX_BufferReadStreamImp::CFX_BufferReadStreamImp() + : m_pBufferRead(NULL) + , m_bReleaseBufferRead(FALSE) + , m_iPosition(0) + , m_iBufferSize(0) +{ +} +CFX_BufferReadStreamImp::~CFX_BufferReadStreamImp() +{ + if (m_bReleaseBufferRead && m_pBufferRead != NULL) { + m_pBufferRead->Release(); + } +} +FX_BOOL CFX_BufferReadStreamImp::LoadBufferRead(IFX_BufferRead *pBufferRead, FX_INT32 iFileSize, FX_DWORD dwAccess, FX_BOOL bReleaseBufferRead) +{ + FXSYS_assert(m_pBufferRead == NULL && pBufferRead != NULL); + if (dwAccess & FX_STREAMACCESS_Write) { + return FALSE; + } + m_bReleaseBufferRead = bReleaseBufferRead; + m_pBufferRead = pBufferRead; + m_iBufferSize = iFileSize; + if (m_iBufferSize >= 0) { + return TRUE; + } + if (!m_pBufferRead->ReadNextBlock(TRUE)) { + return FALSE; + } + m_iBufferSize = m_pBufferRead->GetBlockSize(); + while (!m_pBufferRead->IsEOF()) { + m_pBufferRead->ReadNextBlock(FALSE); + m_iBufferSize += m_pBufferRead->GetBlockSize(); + } + return TRUE; +} +FX_INT32 CFX_BufferReadStreamImp::GetLength() const +{ + return m_iBufferSize; +} +FX_INT32 CFX_BufferReadStreamImp::Seek(FX_STREAMSEEK eSeek, FX_INT32 iOffset) +{ + FX_INT32 iLength = GetLength(); + switch (eSeek) { + case FX_STREAMSEEK_Begin: + m_iPosition = iOffset; + break; + case FX_STREAMSEEK_Current: + m_iPosition += iOffset; + break; + case FX_STREAMSEEK_End: + m_iPosition = iLength + iOffset; + break; + } + if (m_iPosition < 0) { + m_iPosition = 0; + } else if (m_iPosition >= iLength) { + m_iPosition = iLength; + } + return m_iPosition; +} +FX_BOOL CFX_BufferReadStreamImp::IsEOF() const +{ + return m_pBufferRead ? m_pBufferRead->IsEOF() : TRUE; +} +FX_INT32 CFX_BufferReadStreamImp::ReadData(FX_LPBYTE pBuffer, FX_INT32 iBufferSize) +{ + FXSYS_assert(m_pBufferRead != NULL); + FXSYS_assert(pBuffer != NULL && iBufferSize > 0); + FX_INT32 iLength = GetLength(); + if (m_iPosition >= iLength) { + return 0; + } + if (iBufferSize > iLength - m_iPosition) { + iBufferSize = iLength - m_iPosition; + } + FX_DWORD dwBlockOffset = m_pBufferRead->GetBlockOffset(); + FX_DWORD dwBlockSize = m_pBufferRead->GetBlockSize(); + if (m_iPosition < (FX_INT32)dwBlockOffset) { + if (!m_pBufferRead->ReadNextBlock(TRUE)) { + return 0; + } + dwBlockOffset = m_pBufferRead->GetBlockOffset(); + dwBlockSize = m_pBufferRead->GetBlockSize(); + } + while (m_iPosition < (FX_INT32)dwBlockOffset || m_iPosition >= (FX_INT32)(dwBlockOffset + dwBlockSize)) { + if (m_pBufferRead->IsEOF() || !m_pBufferRead->ReadNextBlock(FALSE)) { + break; + } + dwBlockOffset = m_pBufferRead->GetBlockOffset(); + dwBlockSize = m_pBufferRead->GetBlockSize(); + } + if (m_iPosition < (FX_INT32)dwBlockOffset || m_iPosition >= (FX_INT32)(dwBlockOffset + dwBlockSize)) { + return 0; + } + FX_LPCBYTE pBufferTmp = m_pBufferRead->GetBlockBuffer(); + FX_DWORD dwOffsetTmp = m_iPosition - dwBlockOffset; + FX_DWORD dwCopySize = FX_MIN(iBufferSize, (FX_INT32)(dwBlockSize - dwOffsetTmp)); + FXSYS_memcpy(pBuffer, pBufferTmp + dwOffsetTmp, dwCopySize); + dwOffsetTmp = dwCopySize; + iBufferSize -= dwCopySize; + while (iBufferSize > 0) { + if (!m_pBufferRead->ReadNextBlock(FALSE)) { + break; + } + dwBlockOffset = m_pBufferRead->GetBlockOffset(); + dwBlockSize = m_pBufferRead->GetBlockSize(); + pBufferTmp = m_pBufferRead->GetBlockBuffer(); + dwCopySize = FX_MIN((FX_DWORD)iBufferSize, dwBlockSize); + FXSYS_memcpy(pBuffer + dwOffsetTmp, pBufferTmp, dwCopySize); + dwOffsetTmp += dwCopySize; + iBufferSize -= dwCopySize; + } + m_iPosition += dwOffsetTmp; + return dwOffsetTmp; +} +FX_INT32 CFX_BufferReadStreamImp::ReadString(FX_LPWSTR pStr, FX_INT32 iMaxLength, FX_BOOL &bEOS) +{ + FXSYS_assert(m_pBufferRead != NULL); + FXSYS_assert(pStr != NULL && iMaxLength > 0); + iMaxLength = ReadData((FX_LPBYTE)pStr, iMaxLength * 2) / 2; + if (iMaxLength <= 0) { + return 0; + } + FX_INT32 i = 0; + while (i < iMaxLength && pStr[i] != L'\0') { + ++i; + } + bEOS = (m_iPosition >= GetLength()) || pStr[i] == L'\0'; + return i; +} +CFX_FileWriteStreamImp::CFX_FileWriteStreamImp() + : m_pFileWrite(NULL) + , m_iPosition(0) +{ +} +FX_BOOL CFX_FileWriteStreamImp::LoadFileWrite(IFX_FileWrite *pFileWrite, FX_DWORD dwAccess) +{ + FXSYS_assert(m_pFileWrite == NULL && pFileWrite != NULL); + if (dwAccess & FX_STREAMACCESS_Read) { + return FALSE; + } + if (dwAccess & FX_STREAMACCESS_Append) { + m_iPosition = pFileWrite->GetSize(); + } + m_pFileWrite = pFileWrite; + return TRUE; +} +FX_INT32 CFX_FileWriteStreamImp::GetLength() const +{ + if (!m_pFileWrite) { + return 0; + } + return (FX_INT32)m_pFileWrite->GetSize(); +} +FX_INT32 CFX_FileWriteStreamImp::Seek(FX_STREAMSEEK eSeek, FX_INT32 iOffset) +{ + FX_INT32 iLength = GetLength(); + switch (eSeek) { + case FX_STREAMSEEK_Begin: + m_iPosition = iOffset; + break; + case FX_STREAMSEEK_Current: + m_iPosition += iOffset; + break; + case FX_STREAMSEEK_End: + m_iPosition = iLength + iOffset; + break; + } + if (m_iPosition < 0) { + m_iPosition = 0; + } else if (m_iPosition >= iLength) { + m_iPosition = iLength; + } + return m_iPosition; +} +FX_BOOL CFX_FileWriteStreamImp::IsEOF() const +{ + return m_iPosition >= GetLength(); +} +FX_INT32 CFX_FileWriteStreamImp::WriteData(FX_LPCBYTE pBuffer, FX_INT32 iBufferSize) +{ + if (!m_pFileWrite) { + return 0; + } + if (m_pFileWrite->WriteBlock(pBuffer, m_iPosition, iBufferSize)) { + m_iPosition += iBufferSize; + } + return iBufferSize; +} +FX_INT32 CFX_FileWriteStreamImp::WriteString(FX_LPCWSTR pStr, FX_INT32 iLength) +{ + return WriteData((FX_LPCBYTE)pStr, iLength * sizeof(FX_WCHAR)); +} +void CFX_FileWriteStreamImp::Flush() +{ + if (m_pFileWrite) { + m_pFileWrite->Flush(); + } +} +CFX_BufferStreamImp::CFX_BufferStreamImp() + : CFX_StreamImp() + , m_pData(NULL) + , m_iTotalSize(0) + , m_iPosition(0) + , m_iLength(0) +{ +} +FX_BOOL CFX_BufferStreamImp::LoadBuffer(FX_LPBYTE pData, FX_INT32 iTotalSize, FX_DWORD dwAccess) +{ + FXSYS_assert(m_pData == NULL); + FXSYS_assert(pData != NULL && iTotalSize > 0); + m_dwAccess = dwAccess; + m_pData = pData; + m_iTotalSize = iTotalSize; + m_iPosition = 0; + m_iLength = (dwAccess & FX_STREAMACCESS_Write) != 0 ? 0 : iTotalSize; + return TRUE; +} +FX_INT32 CFX_BufferStreamImp::GetLength() const +{ + FXSYS_assert(m_pData != NULL); + return m_iLength; +} +FX_INT32 CFX_BufferStreamImp::Seek(FX_STREAMSEEK eSeek, FX_INT32 iOffset) +{ + FXSYS_assert(m_pData != NULL); + if (eSeek == FX_STREAMSEEK_Begin) { + m_iPosition = iOffset; + } else if (eSeek == FX_STREAMSEEK_Current) { + m_iPosition += iOffset; + } else if (eSeek == FX_STREAMSEEK_End) { + m_iPosition = m_iLength + iOffset; + } + if (m_iPosition > m_iLength) { + m_iPosition = m_iLength; + } + if (m_iPosition < 0) { + m_iPosition = 0; + } + return m_iPosition; +} +FX_INT32 CFX_BufferStreamImp::GetPosition() +{ + FXSYS_assert(m_pData != NULL); + return m_iPosition; +} +FX_BOOL CFX_BufferStreamImp::IsEOF() const +{ + FXSYS_assert(m_pData != NULL); + return m_iPosition >= m_iLength; +} +FX_INT32 CFX_BufferStreamImp::ReadData(FX_LPBYTE pBuffer, FX_INT32 iBufferSize) +{ + FXSYS_assert(m_pData != NULL); + FXSYS_assert(pBuffer != NULL && iBufferSize > 0); + FX_INT32 iLen = FX_MIN(m_iLength - m_iPosition, iBufferSize); + if (iLen <= 0) { + return 0; + } + FXSYS_memcpy(pBuffer, m_pData + m_iPosition, iLen); + m_iPosition += iLen; + return iLen; +} +FX_INT32 CFX_BufferStreamImp::ReadString(FX_LPWSTR pStr, FX_INT32 iMaxLength, FX_BOOL &bEOS) +{ + FXSYS_assert(m_pData != NULL); + FXSYS_assert(pStr != NULL && iMaxLength > 0); + FX_INT32 iLen = FX_MIN((m_iLength - m_iPosition) / 2, iMaxLength); + if (iLen <= 0) { + return 0; + } + FX_LPCWSTR pSrc = (FX_LPCWSTR)(FX_LPSTR)(m_pData + m_iPosition); + FX_INT32 iCount = 0; + while (*pSrc != L'\0' && iCount < iLen) { + *pStr ++ = *pSrc ++, iCount ++; + } + m_iPosition += iCount * 2; + bEOS = (*pSrc == L'\0') || (m_iPosition >= m_iLength); + return iCount; +} +FX_INT32 CFX_BufferStreamImp::WriteData(FX_LPCBYTE pBuffer, FX_INT32 iBufferSize) +{ + FXSYS_assert(m_pData != NULL && (m_dwAccess & FX_STREAMACCESS_Write) != 0); + FXSYS_assert(pBuffer != NULL && iBufferSize > 0); + FX_INT32 iLen = FX_MIN(m_iTotalSize - m_iPosition, iBufferSize); + if (iLen <= 0) { + return 0; + } + FXSYS_memcpy(m_pData + m_iPosition, pBuffer, iLen); + m_iPosition += iLen; + if (m_iPosition > m_iLength) { + m_iLength = m_iPosition; + } + return iLen; +} +FX_INT32 CFX_BufferStreamImp::WriteString(FX_LPCWSTR pStr, FX_INT32 iLength) +{ + FXSYS_assert(m_pData != NULL && (m_dwAccess & FX_STREAMACCESS_Write) != 0); + FXSYS_assert(pStr != NULL && iLength > 0); + FX_INT32 iLen = FX_MIN((m_iTotalSize - m_iPosition) / 2, iLength); + if (iLen <= 0) { + return 0; + } + FXSYS_memcpy(m_pData + m_iPosition, pStr, iLen * 2); + m_iPosition += iLen * 2; + if (m_iPosition > m_iLength) { + m_iLength = m_iPosition; + } + return iLen; +} +IFX_Stream* IFX_Stream::CreateTextStream(IFX_Stream *pBaseStream, FX_BOOL bDeleteOnRelease) +{ + FXSYS_assert(pBaseStream != NULL); + return FX_NEW CFX_TextStream(pBaseStream, bDeleteOnRelease); +} +CFX_TextStream::CFX_TextStream(IFX_Stream *pStream, FX_BOOL bDelStream) + : m_wCodePage(FX_CODEPAGE_DefANSI) + , m_wBOMLength(0) + , m_dwBOM(0) + , m_pBuf(NULL) + , m_iBufSize(0) + , m_bDelStream(bDelStream) + , m_pStreamImp(pStream) + , m_iRefCount(1) +{ + FXSYS_assert(m_pStreamImp != NULL); + m_pStreamImp->Retain(); + InitStream(); +} +CFX_TextStream::~CFX_TextStream() +{ + m_pStreamImp->Release(); + if (m_bDelStream) { + m_pStreamImp->Release(); + } + if (m_pBuf != NULL) { + FX_Free(m_pBuf); + } +} +void CFX_TextStream::InitStream() +{ + FX_INT32 iPosition = m_pStreamImp->GetPosition(); + m_pStreamImp->Seek(FX_STREAMSEEK_Begin, 0); + m_pStreamImp->ReadData((FX_LPBYTE)&m_dwBOM, 3); +#if _FX_ENDIAN_ == _FX_LITTLE_ENDIAN_ + m_dwBOM &= 0x00FFFFFF; + if (m_dwBOM == 0x00BFBBEF) { + m_wBOMLength = 3; + m_wCodePage = FX_CODEPAGE_UTF8; + } else { + m_dwBOM &= 0x0000FFFF; + if (m_dwBOM == 0x0000FFFE) { + m_wBOMLength = 2; + m_wCodePage = FX_CODEPAGE_UTF16BE; + } else if (m_dwBOM == 0x0000FEFF) { + m_wBOMLength = 2; + m_wCodePage = FX_CODEPAGE_UTF16LE; + } else { + m_wBOMLength = 0; + m_dwBOM = 0; + m_wCodePage = FXSYS_GetACP(); + } + } +#else + m_dwBOM &= 0xFFFFFF00; + if (m_dwBOM == 0xEFBBBF00) { + m_wBOMLength = 3; + m_wCodePage = FX_CODEPAGE_UTF8; + } else { + m_dwBOM &= 0xFFFF0000; + if (m_dwBOM == 0xFEFF0000) { + m_wBOMLength = 2; + m_wCodePage = FX_CODEPAGE_UTF16BE; + } else if (m_dwBOM == 0xFFFE0000) { + m_wBOMLength = 2; + m_wCodePage = FX_CODEPAGE_UTF16LE; + } else { + m_wBOMLength = 0; + m_dwBOM = 0; + m_wCodePage = FXSYS_GetACP(); + } + } +#endif + m_pStreamImp->Seek(FX_STREAMSEEK_Begin, FX_MAX(m_wBOMLength, iPosition)); +} +void CFX_TextStream::Release() +{ + if (--m_iRefCount < 1) { + delete this; + } +} +IFX_Stream* CFX_TextStream::Retain() +{ + m_iRefCount++; + return this; +} +FX_DWORD CFX_TextStream::GetAccessModes() const +{ + return m_pStreamImp->GetAccessModes() | FX_STREAMACCESS_Text; +} +FX_INT32 CFX_TextStream::GetLength() const +{ + return m_pStreamImp->GetLength(); +} +FX_INT32 CFX_TextStream::Seek(FX_STREAMSEEK eSeek, FX_INT32 iOffset) +{ + return m_pStreamImp->Seek(eSeek, iOffset); +} +FX_INT32 CFX_TextStream::GetPosition() +{ + return m_pStreamImp->GetPosition(); +} +FX_BOOL CFX_TextStream::IsEOF() const +{ + return m_pStreamImp->IsEOF(); +} +FX_INT32 CFX_TextStream::ReadData(FX_LPBYTE pBuffer, FX_INT32 iBufferSize) +{ + return m_pStreamImp->ReadData(pBuffer, iBufferSize); +} +FX_INT32 CFX_TextStream::WriteData(FX_LPCBYTE pBuffer, FX_INT32 iBufferSize) +{ + return m_pStreamImp->WriteData(pBuffer, iBufferSize); +} +void CFX_TextStream::Flush() +{ + m_pStreamImp->Flush(); +} +FX_BOOL CFX_TextStream::SetLength(FX_INT32 iLength) +{ + return m_pStreamImp->SetLength(iLength); +} +FX_WORD CFX_TextStream::GetCodePage() const +{ + return m_wCodePage; +} +IFX_Stream* CFX_TextStream::CreateSharedStream(FX_DWORD dwAccess, FX_INT32 iOffset, FX_INT32 iLength) +{ + IFX_Stream *pSR = m_pStreamImp->CreateSharedStream(dwAccess, iOffset, iLength); + if (pSR == NULL) { + return NULL; + } + if (dwAccess & FX_STREAMACCESS_Text) { + IFX_Stream *pTR = FX_NEW CFX_TextStream(pSR, TRUE); + if (pTR == NULL) { + pSR->Release(); + return NULL; + } + return pTR; + } + return pSR; +} +FX_INT32 CFX_TextStream::GetBOM(FX_BYTE bom[4]) const +{ + if (m_wBOMLength < 1) { + return 0; + } + *(FX_DWORD*)bom = m_dwBOM; + return (FX_INT32)m_wBOMLength; +} +FX_WORD CFX_TextStream::SetCodePage(FX_WORD wCodePage) +{ + if (m_wBOMLength > 0) { + return m_wCodePage; + } + FX_WORD v = m_wCodePage; + m_wCodePage = wCodePage; + return v; +} +FX_INT32 CFX_TextStream::ReadString(FX_LPWSTR pStr, FX_INT32 iMaxLength, FX_BOOL &bEOS, FX_INT32 const *pByteSize) +{ + FXSYS_assert(pStr != NULL && iMaxLength > 0); + if (m_pStreamImp == NULL) { + return -1; + } + FX_INT32 iLen; + if (m_wCodePage == FX_CODEPAGE_UTF16LE || m_wCodePage == FX_CODEPAGE_UTF16BE) { + FX_INT32 iBytes = pByteSize == NULL ? iMaxLength * 2 : *pByteSize; + m_pStreamImp->Lock(); + iLen = m_pStreamImp->ReadData((FX_LPBYTE)pStr, iBytes); + m_pStreamImp->Unlock(); + iMaxLength = iLen / 2; + if (sizeof(FX_WCHAR) > 2) { + FX_UTF16ToWChar(pStr, iMaxLength); + } +#if _FX_ENDIAN_ == _FX_BIG_ENDIAN_ + if (m_wCodePage == FX_CODEPAGE_UTF16LE) { + FX_SwapByteOrder(pStr, iMaxLength); + } +#else + if (m_wCodePage == FX_CODEPAGE_UTF16BE) { + FX_SwapByteOrder(pStr, iMaxLength); + } +#endif + } else { + FX_INT32 pos = m_pStreamImp->GetPosition(); + FX_INT32 iBytes = pByteSize == NULL ? iMaxLength : *pByteSize; + iBytes = FX_MIN(iBytes, m_pStreamImp->GetLength() - pos); + if (iBytes > 0) { + if (m_pBuf == NULL) { + m_pBuf = (FX_LPBYTE)FX_Alloc(FX_BYTE, iBytes); + m_iBufSize = iBytes; + } else if (iBytes > m_iBufSize) { + m_pBuf = (FX_LPBYTE)FX_Realloc(FX_BYTE, m_pBuf, iBytes); + m_iBufSize = iBytes; + } + m_pStreamImp->Lock(); + iLen = m_pStreamImp->ReadData(m_pBuf, iBytes); + FX_INT32 iSrc = iLen; + FX_INT32 iDecode = FX_DecodeString(m_wCodePage, (FX_LPCSTR)m_pBuf, &iSrc, pStr, &iMaxLength, TRUE); + m_pStreamImp->Seek(FX_STREAMSEEK_Current, iSrc - iLen); + m_pStreamImp->Unlock(); + if (iDecode < 1) { + return -1; + } + } else { + iMaxLength = 0; + } + } + bEOS = m_pStreamImp->IsEOF(); + return iMaxLength; +} +FX_INT32 CFX_TextStream::WriteString(FX_LPCWSTR pStr, FX_INT32 iLength) +{ + FXSYS_assert(pStr != NULL && iLength > 0); + if ((m_pStreamImp->GetAccessModes() & FX_STREAMACCESS_Write) == 0) { + return -1; + } + if (m_wCodePage == FX_CODEPAGE_UTF8) { + FX_INT32 len = iLength; + CFX_UTF8Encoder encoder; + while (len -- > 0) { + encoder.Input(*pStr ++); + } + CFX_ByteStringC bsResult = encoder.GetResult(); + m_pStreamImp->Lock(); + m_pStreamImp->WriteData((FX_LPCBYTE)bsResult.GetCStr(), bsResult.GetLength()); + m_pStreamImp->Unlock(); + } + return iLength; +} +CFX_Stream::CFX_Stream() + : m_eStreamType(FX_SREAMTYPE_Unknown) + , m_pStreamImp(NULL) + , m_dwAccess(0) + , m_iTotalSize(0) + , m_iPosition(0) + , m_iStart(0) + , m_iLength(0) + , m_iRefCount(1) +{ +} +CFX_Stream::~CFX_Stream() +{ + if (m_eStreamType != FX_STREAMTYPE_Stream && m_pStreamImp != NULL) { + m_pStreamImp->Release(); + } +} +FX_BOOL CFX_Stream::LoadFile(FX_LPCWSTR pszSrcFileName, FX_DWORD dwAccess) +{ + if (m_eStreamType != FX_SREAMTYPE_Unknown || m_pStreamImp != NULL) { + return FALSE; + } + if (pszSrcFileName == NULL || FXSYS_wcslen(pszSrcFileName) < 1) { + return FALSE; + } + m_pStreamImp = FX_NEW CFX_FileStreamImp(); + if (m_pStreamImp == NULL) { + return FALSE; + } + FX_BOOL bRet = ((CFX_FileStreamImp*)m_pStreamImp)->LoadFile(pszSrcFileName, dwAccess); + if (!bRet) { + m_pStreamImp->Release(); + m_pStreamImp = NULL; + } else { + m_eStreamType = FX_STREAMTYPE_File; + m_dwAccess = dwAccess; + m_iLength = m_pStreamImp->GetLength(); + } + return bRet; +} +FX_BOOL CFX_Stream::LoadFileRead(IFX_FileRead *pFileRead, FX_DWORD dwAccess) +{ + if (m_eStreamType != FX_SREAMTYPE_Unknown || m_pStreamImp != NULL) { + return FALSE; + } + if (pFileRead == NULL) { + return FALSE; + } + m_pStreamImp = FX_NEW CFX_FileReadStreamImp(); + if (m_pStreamImp == NULL) { + return FALSE; + } + FX_BOOL bRet = ((CFX_FileReadStreamImp*)m_pStreamImp)->LoadFileRead(pFileRead, dwAccess); + if (!bRet) { + m_pStreamImp->Release(); + m_pStreamImp = NULL; + } else { + m_eStreamType = FX_STREAMTYPE_File; + m_dwAccess = dwAccess; + m_iLength = m_pStreamImp->GetLength(); + } + return bRet; +} +FX_BOOL CFX_Stream::LoadFileWrite(IFX_FileWrite *pFileWrite, FX_DWORD dwAccess) +{ + if (m_eStreamType != FX_SREAMTYPE_Unknown || m_pStreamImp != NULL) { + return FALSE; + } + if (pFileWrite == NULL) { + return FALSE; + } + m_pStreamImp = FX_NEW CFX_FileWriteStreamImp(); + if (m_pStreamImp == NULL) { + return FALSE; + } + FX_BOOL bRet = ((CFX_FileWriteStreamImp*)m_pStreamImp)->LoadFileWrite(pFileWrite, dwAccess); + if (!bRet) { + m_pStreamImp->Release(); + m_pStreamImp = NULL; + } else { + m_eStreamType = FX_STREAMTYPE_File; + m_dwAccess = dwAccess; + m_iLength = m_pStreamImp->GetLength(); + } + return bRet; +} +FX_BOOL CFX_Stream::LoadBuffer(FX_LPBYTE pData, FX_INT32 iTotalSize, FX_DWORD dwAccess) +{ + if (m_eStreamType != FX_SREAMTYPE_Unknown || m_pStreamImp != NULL) { + return FALSE; + } + if (pData == NULL || iTotalSize < 1) { + return FALSE; + } + m_pStreamImp = FX_NEW CFX_BufferStreamImp(); + if (m_pStreamImp == NULL) { + return FALSE; + } + FX_BOOL bRet = ((CFX_BufferStreamImp*)m_pStreamImp)->LoadBuffer(pData, iTotalSize, dwAccess); + if (!bRet) { + m_pStreamImp->Release(); + m_pStreamImp = NULL; + } else { + m_eStreamType = FX_STREAMTYPE_Buffer; + m_dwAccess = dwAccess; + m_iLength = m_pStreamImp->GetLength(); + } + return bRet; +} +FX_BOOL CFX_Stream::LoadBufferRead(IFX_BufferRead *pBufferRead, FX_INT32 iFileSize, FX_DWORD dwAccess, FX_BOOL bReleaseBufferRead) +{ + if (m_eStreamType != FX_SREAMTYPE_Unknown || m_pStreamImp != NULL) { + return FALSE; + } + if (!pBufferRead) { + return FALSE; + } + m_pStreamImp = FX_NEW CFX_BufferReadStreamImp; + if (m_pStreamImp == NULL) { + return FALSE; + } + FX_BOOL bRet = ((CFX_BufferReadStreamImp*)m_pStreamImp)->LoadBufferRead(pBufferRead, iFileSize, dwAccess, bReleaseBufferRead); + if (!bRet) { + m_pStreamImp->Release(); + m_pStreamImp = NULL; + } else { + m_eStreamType = FX_STREAMTYPE_BufferRead; + m_dwAccess = dwAccess; + m_iLength = m_pStreamImp->GetLength(); + } + return bRet; +} +void CFX_Stream::Release() +{ + if (--m_iRefCount < 1) { + delete this; + } +} +IFX_Stream* CFX_Stream::Retain() +{ + m_iRefCount++; + return this; +} +FX_INT32 CFX_Stream::GetLength() const +{ + if (m_pStreamImp == NULL) { + return -1; + } + if (m_eStreamType == FX_STREAMTYPE_File || m_eStreamType == FX_STREAMTYPE_Buffer) { + return m_pStreamImp->GetLength(); + } + return m_iLength; +} +FX_INT32 CFX_Stream::Seek(FX_STREAMSEEK eSeek, FX_INT32 iOffset) +{ + if (m_pStreamImp == NULL) { + return -1; + } + if (m_eStreamType == FX_STREAMTYPE_File || m_eStreamType == FX_STREAMTYPE_Buffer) { + return m_iPosition = m_pStreamImp->Seek(eSeek, iOffset); + } + FX_INT32 iEnd = m_iStart + m_iLength; + FX_INT32 iPosition = m_iStart + iOffset; + if (eSeek == FX_STREAMSEEK_Begin) { + m_iPosition = iPosition; + } else if (eSeek == FX_STREAMSEEK_Current) { + m_iPosition += iOffset; + } else if (eSeek == FX_STREAMSEEK_End) { + m_iPosition = iEnd + iOffset; + } + if (m_iPosition > iEnd) { + m_iPosition = iEnd; + } + if (m_iPosition < m_iStart) { + m_iPosition = m_iStart; + } + return m_iPosition - m_iStart; +} +FX_INT32 CFX_Stream::GetPosition() +{ + if (m_pStreamImp == NULL) { + return -1; + } + if (m_eStreamType == FX_STREAMTYPE_File || m_eStreamType == FX_STREAMTYPE_Buffer) { + return m_iPosition = m_pStreamImp->GetPosition(); + } + return m_iPosition - m_iStart; +} +FX_BOOL CFX_Stream::IsEOF() const +{ + if (m_pStreamImp == NULL) { + return TRUE; + } + if (m_eStreamType == FX_STREAMTYPE_File || m_eStreamType == FX_STREAMTYPE_Buffer) { + return m_pStreamImp->IsEOF(); + } + return m_iPosition >= m_iStart + m_iLength; +} +FX_INT32 CFX_Stream::ReadData(FX_LPBYTE pBuffer, FX_INT32 iBufferSize) +{ + FXSYS_assert(pBuffer != NULL && iBufferSize > 0); + if (m_pStreamImp == NULL) { + return -1; + } + FX_INT32 iLen = FX_MIN(m_iStart + m_iLength - m_iPosition, iBufferSize); + if (iLen <= 0) { + return 0; + } + m_pStreamImp->Lock(); + if (m_pStreamImp->GetPosition() != m_iPosition) { + m_pStreamImp->Seek(FX_STREAMSEEK_Begin, m_iPosition); + } + iLen = m_pStreamImp->ReadData(pBuffer, iLen); + m_iPosition = m_pStreamImp->GetPosition(); + m_pStreamImp->Unlock(); + return iLen; +} +FX_INT32 CFX_Stream::ReadString(FX_LPWSTR pStr, FX_INT32 iMaxLength, FX_BOOL &bEOS, FX_INT32 const *pByteSize) +{ + FXSYS_assert(pStr != NULL && iMaxLength > 0); + if (m_pStreamImp == NULL) { + return -1; + } + FX_INT32 iEnd = m_iStart + m_iLength; + FX_INT32 iLen = iEnd - m_iPosition; + if (pByteSize != NULL) { + iLen = FX_MIN(iLen, *pByteSize); + } + iLen = FX_MIN(iEnd / 2, iMaxLength); + if (iLen <= 0) { + return 0; + } + m_pStreamImp->Lock(); + if (m_pStreamImp->GetPosition() != m_iPosition) { + m_pStreamImp->Seek(FX_STREAMSEEK_Begin, m_iPosition); + } + iLen = m_pStreamImp->ReadString(pStr, iLen, bEOS); + m_iPosition = m_pStreamImp->GetPosition(); + if (iLen > 0 && m_iPosition >= iEnd) { + bEOS = TRUE; + } + m_pStreamImp->Unlock(); + return iLen; +} +FX_INT32 CFX_Stream::WriteData(FX_LPCBYTE pBuffer, FX_INT32 iBufferSize) +{ + FXSYS_assert(pBuffer != NULL && iBufferSize > 0); + if (m_pStreamImp == NULL) { + return -1; + } + if ((m_dwAccess & FX_STREAMACCESS_Write) == 0) { + return -1; + } + FX_INT32 iLen = iBufferSize; + if (m_eStreamType == FX_STREAMTYPE_Stream) { + iLen = FX_MIN(m_iStart + m_iTotalSize - m_iPosition, iBufferSize); + if (iLen <= 0) { + return 0; + } + } + m_pStreamImp->Lock(); + FX_INT32 iEnd = m_iStart + m_iLength; + if (m_pStreamImp->GetPosition() != m_iPosition) { + m_pStreamImp->Seek(FX_STREAMSEEK_Begin, m_iPosition); + } + iLen = m_pStreamImp->WriteData(pBuffer, iLen); + m_iPosition = m_pStreamImp->GetPosition(); + if (m_iPosition > iEnd) { + m_iLength = m_iPosition - m_iStart; + } + m_pStreamImp->Unlock(); + return iLen; +} +FX_INT32 CFX_Stream::WriteString(FX_LPCWSTR pStr, FX_INT32 iLength) +{ + FXSYS_assert(pStr != NULL && iLength > 0); + if (m_pStreamImp == NULL) { + return -1; + } + if ((m_dwAccess & FX_STREAMACCESS_Write) == 0) { + return -1; + } + FX_INT32 iLen = iLength; + if (m_eStreamType == FX_STREAMTYPE_Stream) { + iLen = FX_MIN((m_iStart + m_iTotalSize - m_iPosition) / 2, iLength); + if (iLen <= 0) { + return 0; + } + } + m_pStreamImp->Lock(); + FX_INT32 iEnd = m_iStart + m_iLength; + if (m_pStreamImp->GetPosition() != m_iPosition) { + m_pStreamImp->Seek(FX_STREAMSEEK_Begin, m_iPosition); + } + iLen = m_pStreamImp->WriteString(pStr, iLen); + m_iPosition = m_pStreamImp->GetPosition(); + if (m_iPosition > iEnd) { + m_iLength = m_iPosition - m_iStart; + } + m_pStreamImp->Unlock(); + return iLen; +} +void CFX_Stream::Flush() +{ + if (m_pStreamImp == NULL) { + return; + } + if ((m_dwAccess & FX_STREAMACCESS_Write) == 0) { + return; + } + m_pStreamImp->Flush(); +} +FX_BOOL CFX_Stream::SetLength(FX_INT32 iLength) +{ + if (m_pStreamImp == NULL) { + return FALSE; + } + if ((m_dwAccess & FX_STREAMACCESS_Write) == 0) { + return FALSE; + } + return m_pStreamImp->SetLength(iLength); +} +FX_INT32 CFX_Stream::GetBOM(FX_BYTE bom[4]) const +{ + if (m_pStreamImp == NULL) { + return -1; + } + return 0; +} +FX_WORD CFX_Stream::GetCodePage() const +{ +#if _FX_ENDIAN_ == _FX_LITTLE_ENDIAN_ + return FX_CODEPAGE_UTF16LE; +#else + return FX_CODEPAGE_UTF16BE; +#endif +} +FX_WORD CFX_Stream::SetCodePage(FX_WORD wCodePage) +{ +#if _FX_ENDIAN_ == _FX_LITTLE_ENDIAN_ + return FX_CODEPAGE_UTF16LE; +#else + return FX_CODEPAGE_UTF16BE; +#endif +} +IFX_Stream* CFX_Stream::CreateSharedStream(FX_DWORD dwAccess, FX_INT32 iOffset, FX_INT32 iLength) +{ + FXSYS_assert( iLength > 0); + if (m_pStreamImp == NULL) { + return NULL; + } + if ((m_dwAccess & FX_STREAMACCESS_Text) != 0 && (dwAccess & FX_STREAMACCESS_Text) == 0) { + return NULL; + } + if ((m_dwAccess & FX_STREAMACCESS_Write) == 0 && (dwAccess & FX_STREAMACCESS_Write) != 0) { + return NULL; + } + register FX_INT32 iStart = m_iStart + iOffset; + register FX_INT32 iTotal = m_iStart + m_iLength; + if (iStart < m_iStart || iStart >= iTotal) { + return NULL; + } + register FX_INT32 iEnd = iStart + iLength; + if (iEnd < iStart || iEnd > iTotal) { + return NULL; + } + CFX_Stream *pShared = FX_NEW CFX_Stream; + if (pShared == NULL) { + return NULL; + } + pShared->m_eStreamType = FX_STREAMTYPE_Stream; + pShared->m_pStreamImp = m_pStreamImp; + pShared->m_dwAccess = dwAccess; + pShared->m_iTotalSize = iLength; + pShared->m_iPosition = iStart; + pShared->m_iStart = iStart; + pShared->m_iLength = (dwAccess & FX_STREAMACCESS_Write) != 0 ? 0 : iLength; + if (dwAccess & FX_STREAMACCESS_Text) { + return IFX_Stream::CreateTextStream(pShared, TRUE); + } + return pShared; +} +IFX_FileRead* FX_CreateFileRead(IFX_Stream *pBaseStream, FX_BOOL bReleaseStream) +{ + FXSYS_assert(pBaseStream != NULL); + return FX_NEW CFGAS_FileRead(pBaseStream, bReleaseStream); +} +#ifdef FX_FILESIZE +CFGAS_FileRead::CFGAS_FileRead(IFX_Stream *pStream, FX_BOOL bReleaseStream) + : m_bReleaseStream(bReleaseStream) + , m_pStream(pStream) +{ + FXSYS_assert(m_pStream != NULL); +} +CFGAS_FileRead::~CFGAS_FileRead() +{ + if (m_bReleaseStream) { + m_pStream->Release(); + } +} +FX_FILESIZE CFGAS_FileRead::GetSize() +{ + return (FX_FILESIZE)m_pStream->GetLength(); +} +FX_BOOL CFGAS_FileRead::ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) +{ + m_pStream->Lock(); + m_pStream->Seek(FX_STREAMSEEK_Begin, (FX_INT32)offset); + FX_INT32 iLen = m_pStream->ReadData((FX_LPBYTE)buffer, (FX_INT32)size); + m_pStream->Unlock(); + return iLen == (FX_INT32)size; +} +#else +CFGAS_FileRead::CFGAS_FileRead(IFX_Stream *pStream, FX_BOOL bReleaseStream) + : m_bReleaseStream(bReleaseStream) + , m_pStream(pStream) +{ + FXSYS_assert(m_pStream != NULL); +} +CFGAS_FileRead::~CFGAS_FileRead() +{ + if (m_bReleaseStream) { + m_pStream->Release(); + } +} +FX_DWORD CFGAS_FileRead::GetSize() +{ + return (FX_DWORD)m_pStream->GetLength(); +} +FX_BOOL CFGAS_FileRead::ReadBlock(void* buffer, FX_DWORD offset, FX_DWORD size) +{ + m_pStream->Lock(); + m_pStream->Seek(FX_STREAMSEEK_Begin, (FX_INT32)offset); + FX_INT32 iLen = m_pStream->ReadData((FX_LPBYTE)buffer, (FX_INT32)size); + m_pStream->Unlock(); + return iLen == (FX_INT32)size; +} +#endif +#ifdef FX_FILESIZE +IFX_FileRead* FX_CreateFileRead(IFX_BufferRead *pBufferRead, FX_FILESIZE iFileSize, FX_BOOL bReleaseStream) +{ + if (!pBufferRead) { + return NULL; + } + return FX_NEW CFX_BufferAccImp(pBufferRead, iFileSize, bReleaseStream); +} +CFX_BufferAccImp::CFX_BufferAccImp(IFX_BufferRead *pBufferRead, FX_FILESIZE iFileSize, FX_BOOL bReleaseStream) + : m_pBufferRead(pBufferRead) + , m_bReleaseStream(bReleaseStream) + , m_iBufSize(iFileSize) +{ + FXSYS_assert(m_pBufferRead); +} +CFX_BufferAccImp::~CFX_BufferAccImp() +{ + if (m_bReleaseStream && m_pBufferRead) { + m_pBufferRead->Release(); + } +} +FX_FILESIZE CFX_BufferAccImp::GetSize() +{ + if (!m_pBufferRead) { + return 0; + } + if (m_iBufSize >= 0) { + return m_iBufSize; + } + if (!m_pBufferRead->ReadNextBlock(TRUE)) { + return 0; + } + m_iBufSize = (FX_FILESIZE)m_pBufferRead->GetBlockSize(); + while (!m_pBufferRead->IsEOF()) { + m_pBufferRead->ReadNextBlock(FALSE); + m_iBufSize += (FX_FILESIZE)m_pBufferRead->GetBlockSize(); + } + return m_iBufSize; +} +FX_BOOL CFX_BufferAccImp::ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) +{ + if (!m_pBufferRead) { + return FALSE; + } + if (!buffer || !size) { + return TRUE; + } + FX_FILESIZE dwBufSize = GetSize(); + if (offset >= dwBufSize) { + return FALSE; + } + size_t dwBlockSize = m_pBufferRead->GetBlockSize(); + FX_FILESIZE dwBlockOffset = m_pBufferRead->GetBlockOffset(); + if (offset < dwBlockOffset) { + if (!m_pBufferRead->ReadNextBlock(TRUE)) { + return FALSE; + } + dwBlockSize = m_pBufferRead->GetBlockSize(); + dwBlockOffset = m_pBufferRead->GetBlockOffset(); + } + while (offset < dwBlockOffset || offset >= (FX_FILESIZE)(dwBlockOffset + dwBlockSize)) { + if (m_pBufferRead->IsEOF() || !m_pBufferRead->ReadNextBlock(FALSE)) { + break; + } + dwBlockSize = m_pBufferRead->GetBlockSize(); + dwBlockOffset = m_pBufferRead->GetBlockOffset(); + } + if (offset < dwBlockOffset || offset >= (FX_FILESIZE)(dwBlockOffset + dwBlockSize)) { + return FALSE; + } + FX_LPCBYTE pBuffer = m_pBufferRead->GetBlockBuffer(); + FX_FILESIZE dwOffset = offset - dwBlockOffset; + size_t dwCopySize = FX_MIN(size, dwBlockSize - dwOffset); + FXSYS_memcpy(buffer, pBuffer + dwOffset, dwCopySize); + offset = dwCopySize; + size -= dwCopySize; + while (size) { + if (!m_pBufferRead->ReadNextBlock(FALSE)) { + break; + } + dwBlockOffset = m_pBufferRead->GetBlockOffset(); + dwBlockSize = m_pBufferRead->GetBlockSize(); + pBuffer = m_pBufferRead->GetBlockBuffer(); + dwCopySize = FX_MIN(size, dwBlockSize); + FXSYS_memcpy(((FX_LPBYTE)buffer) + offset, pBuffer, dwCopySize); + offset += dwCopySize; + size -= dwCopySize; + } + return TRUE; +} +#else +IFX_FileRead* FX_CreateFileRead(IFX_BufferRead *pBufferRead, FX_INT32 iFileSize, FX_BOOL bReleaseStream) +{ + if (!pBufferRead) { + return NULL; + } + return FX_NEW CFX_BufferAccImp(pBufferRead, iFileSize, bReleaseStream); +} +CFX_BufferAccImp::CFX_BufferAccImp(IFX_BufferRead *pBufferRead, FX_INT32 iFileSize, FX_BOOL bReleaseStream) + : m_pBufferRead(pBufferRead) + , m_bReleaseStream(bReleaseStream) + , m_iBufSize(iFileSize) +{ + FXSYS_assert(m_pBufferRead); +} +CFX_BufferAccImp::~CFX_BufferAccImp() +{ + if (m_bReleaseStream && m_pBufferRead) { + m_pBufferRead->Release(); + } +} +FX_DWORD CFX_BufferAccImp::GetSize() +{ + if (!m_pBufferRead) { + return 0; + } + if (m_iBufSize >= 0) { + return m_iBufSize; + } + if (!m_pBufferRead->ReadNextBlock(TRUE)) { + return 0; + } + m_iBufSize = (FX_DWORD)m_pBufferRead->GetBlockSize(); + while (!m_pBufferRead->IsEOF()) { + m_pBufferRead->ReadNextBlock(FALSE); + m_iBufSize += (FX_DWORD)m_pBufferRead->GetBlockSize(); + } + return m_iBufSize; +} +FX_BOOL CFX_BufferAccImp::ReadBlock(void* buffer, FX_DWORD offset, FX_DWORD size) +{ + if (!m_pBufferRead) { + return FALSE; + } + if (!buffer || !size) { + return TRUE; + } + FX_DWORD dwBufSize = GetSize(); + if (offset >= dwBufSize) { + return FALSE; + } + size_t dwBlockSize = m_pBufferRead->GetBlockSize(); + FX_DWORD dwBlockOffset = m_pBufferRead->GetBlockOffset(); + if (offset < dwBlockOffset) { + if (!m_pBufferRead->ReadNextBlock(TRUE)) { + return FALSE; + } + dwBlockSize = m_pBufferRead->GetBlockSize(); + dwBlockOffset = m_pBufferRead->GetBlockOffset(); + } + while (offset < dwBlockOffset || offset >= (FX_DWORD)(dwBlockOffset + dwBlockSize)) { + if (m_pBufferRead->IsEOF() || !m_pBufferRead->ReadNextBlock(FALSE)) { + break; + } + dwBlockSize = m_pBufferRead->GetBlockSize(); + dwBlockOffset = m_pBufferRead->GetBlockOffset(); + } + if (offset < dwBlockOffset || offset >= (FX_DWORD)(dwBlockOffset + dwBlockSize)) { + return FALSE; + } + FX_LPCBYTE pBuffer = m_pBufferRead->GetBlockBuffer(); + FX_DWORD dwOffset = offset - dwBlockOffset; + FX_DWORD dwCopySize = FX_MIN(size, dwBlockSize - dwOffset); + FXSYS_memcpy(buffer, pBuffer + dwOffset, dwCopySize); + offset = dwCopySize; + size -= dwCopySize; + while (size) { + if (!m_pBufferRead->ReadNextBlock(FALSE)) { + break; + } + dwBlockOffset = m_pBufferRead->GetBlockOffset(); + dwBlockSize = m_pBufferRead->GetBlockSize(); + pBuffer = m_pBufferRead->GetBlockBuffer(); + dwCopySize = FX_MIN(size, dwBlockSize); + FXSYS_memcpy(((FX_LPBYTE)buffer) + offset, pBuffer, dwCopySize); + offset += dwCopySize; + size -= dwCopySize; + } + return TRUE; +} +#endif +IFX_FileWrite* FX_CreateFileWrite(IFX_Stream *pBaseStream, FX_BOOL bReleaseStream) +{ + FXSYS_assert(pBaseStream != NULL); + return FX_NEW CFGAS_FileWrite(pBaseStream, bReleaseStream); +} +#ifdef FX_FILESIZE +CFGAS_FileWrite::CFGAS_FileWrite(IFX_Stream *pStream, FX_BOOL bReleaseStream) + : m_pStream(pStream) + , m_bReleaseStream(bReleaseStream) +{ + FXSYS_assert(m_pStream != NULL); +} +CFGAS_FileWrite::~CFGAS_FileWrite() +{ + if (m_bReleaseStream) { + m_pStream->Release(); + } +} +FX_FILESIZE CFGAS_FileWrite::GetSize() +{ + return m_pStream->GetLength(); +} +FX_BOOL CFGAS_FileWrite::Flush() +{ + m_pStream->Flush(); + return TRUE; +} +FX_BOOL CFGAS_FileWrite::WriteBlock(const void* pData, size_t size) +{ + return m_pStream->WriteData((FX_LPCBYTE)pData, (FX_INT32)size) == (FX_INT32)size; +} +FX_BOOL CFGAS_FileWrite::WriteBlock(const void* pData, FX_FILESIZE offset, size_t size) +{ + m_pStream->Lock(); + m_pStream->Seek(FX_STREAMSEEK_Begin, offset); + FX_INT32 iLen = m_pStream->WriteData((FX_LPBYTE)pData, (FX_INT32)size); + m_pStream->Unlock(); + return iLen == (FX_INT32)size; +} +#else +CFGAS_FileWrite::CFGAS_FileWrite(IFX_Stream *pStream, FX_BOOL bReleaseStream) + : m_pStream(pStream) + , m_bReleaseStream(bReleaseStream) +{ + FXSYS_assert(m_pStream != NULL); +} +CFGAS_FileWrite::~CFGAS_FileWrite() +{ + if (m_bReleaseStream) { + m_pStream->Release(); + } +} +FX_DWORD CFGAS_FileWrite::GetSize() +{ + return m_pStream->GetLength(); +} +FX_DWORD CFGAS_FileWrite::Flush() +{ + m_pStream->Flush(); + return 0; +} +FX_BOOL CFGAS_FileWrite::WriteBlock(const void* pData, FX_DWORD size) +{ + return m_pStream->WriteData((FX_LPCBYTE)pData, (FX_INT32)size) == (FX_INT32)size; +} +FX_BOOL CFGAS_FileWrite::WriteBlock(const void* pData, FX_DWORD offset, FX_DWORD size) +{ + m_pStream->Lock(); + m_pStream->Seek(FX_STREAMSEEK_Begin, offset); + FX_INT32 iLen = m_pStream->WriteData((FX_LPBYTE)pData, (FX_INT32)size); + m_pStream->Unlock(); + return iLen == (FX_INT32)size; +} +#endif diff --git a/xfa/src/fgas/src/crt/fx_stream.h b/xfa/src/fgas/src/crt/fx_stream.h new file mode 100644 index 0000000000..630a0fb77f --- /dev/null +++ b/xfa/src/fgas/src/crt/fx_stream.h @@ -0,0 +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 + +#ifndef _FX_STREAM_IMP +#define _FX_STREAM_IMP +class CFX_StreamImp; +class CFX_FileStreamImp; +class CFX_BufferStreamImp; +class CFX_FileReadStreamImp; +class CFX_BufferReadStreamImp; +class CFX_FileWriteStreamImp; +class CFX_Stream; +class CFX_TextStream; +class CFX_FileRead; +class CFX_FileWrite; +class CFX_BufferAccImp; +class CFX_StreamImp : public CFX_ThreadLock, public CFX_Object +{ +public: + virtual void Release() + { + delete this; + } + virtual FX_DWORD GetAccessModes() const + { + return m_dwAccess; + } + virtual FX_INT32 GetLength() const = 0; + virtual FX_INT32 Seek(FX_STREAMSEEK eSeek, FX_INT32 iOffset) = 0; + virtual FX_INT32 GetPosition() = 0; + virtual FX_BOOL IsEOF() const = 0; + virtual FX_INT32 ReadData(FX_LPBYTE pBuffer, FX_INT32 iBufferSize) = 0; + virtual FX_INT32 ReadString(FX_LPWSTR pStr, FX_INT32 iMaxLength, FX_BOOL &bEOS) = 0; + virtual FX_INT32 WriteData(FX_LPCBYTE pBuffer, FX_INT32 iBufferSize) = 0; + virtual FX_INT32 WriteString(FX_LPCWSTR pStr, FX_INT32 iLength) = 0; + virtual void Flush() = 0; + virtual FX_BOOL SetLength(FX_INT32 iLength) = 0; +protected: + CFX_StreamImp(); + virtual ~CFX_StreamImp() {} + FX_DWORD m_dwAccess; +}; +class CFX_FileStreamImp : public CFX_StreamImp +{ +public: + CFX_FileStreamImp(); + virtual ~CFX_FileStreamImp(); + FX_BOOL LoadFile(FX_LPCWSTR pszSrcFileName, FX_DWORD dwAccess); + virtual FX_INT32 GetLength() const; + virtual FX_INT32 Seek(FX_STREAMSEEK eSeek, FX_INT32 iOffset); + virtual FX_INT32 GetPosition(); + virtual FX_BOOL IsEOF() const; + virtual FX_INT32 ReadData(FX_LPBYTE pBuffer, FX_INT32 iBufferSize); + virtual FX_INT32 ReadString(FX_LPWSTR pStr, FX_INT32 iMaxLength, FX_BOOL &bEOS); + virtual FX_INT32 WriteData(FX_LPCBYTE pBuffer, FX_INT32 iBufferSize); + virtual FX_INT32 WriteString(FX_LPCWSTR pStr, FX_INT32 iLength); + virtual void Flush(); + virtual FX_BOOL SetLength(FX_INT32 iLength); +protected: + FXSYS_FILE *m_hFile; + FX_INT32 m_iLength; +}; +class CFX_BufferStreamImp : public CFX_StreamImp +{ +public: + CFX_BufferStreamImp(); + virtual ~CFX_BufferStreamImp() {} + FX_BOOL LoadBuffer(FX_LPBYTE pData, FX_INT32 iTotalSize, FX_DWORD dwAccess); + virtual FX_INT32 GetLength() const; + virtual FX_INT32 Seek(FX_STREAMSEEK eSeek, FX_INT32 iOffset); + virtual FX_INT32 GetPosition(); + virtual FX_BOOL IsEOF() const; + virtual FX_INT32 ReadData(FX_LPBYTE pBuffer, FX_INT32 iBufferSize); + virtual FX_INT32 ReadString(FX_LPWSTR pStr, FX_INT32 iMaxLength, FX_BOOL &bEOS); + virtual FX_INT32 WriteData(FX_LPCBYTE pBuffer, FX_INT32 iBufferSize); + virtual FX_INT32 WriteString(FX_LPCWSTR pStr, FX_INT32 iLength); + virtual void Flush() {} + virtual FX_BOOL SetLength(FX_INT32 iLength) + { + return FALSE; + } +protected: + FX_LPBYTE m_pData; + FX_INT32 m_iTotalSize; + FX_INT32 m_iPosition; + FX_INT32 m_iLength; +}; +class CFX_FileReadStreamImp : public CFX_StreamImp +{ +public: + CFX_FileReadStreamImp(); + virtual ~CFX_FileReadStreamImp() {} + FX_BOOL LoadFileRead(IFX_FileRead *pFileRead, FX_DWORD dwAccess); + virtual FX_INT32 GetLength() const; + virtual FX_INT32 Seek(FX_STREAMSEEK eSeek, FX_INT32 iOffset); + virtual FX_INT32 GetPosition() + { + return m_iPosition; + } + virtual FX_BOOL IsEOF() const; + + virtual FX_INT32 ReadData(FX_LPBYTE pBuffer, FX_INT32 iBufferSize); + virtual FX_INT32 ReadString(FX_LPWSTR pStr, FX_INT32 iMaxLength, FX_BOOL &bEOS); + virtual FX_INT32 WriteData(FX_LPCBYTE pBuffer, FX_INT32 iBufferSize) + { + return 0; + } + virtual FX_INT32 WriteString(FX_LPCWSTR pStr, FX_INT32 iLength) + { + return 0; + } + virtual void Flush() {} + virtual FX_BOOL SetLength(FX_INT32 iLength) + { + return FALSE; + } +protected: + IFX_FileRead *m_pFileRead; + FX_INT32 m_iPosition; + FX_INT32 m_iLength; +}; +class CFX_BufferReadStreamImp : public CFX_StreamImp +{ +public: + CFX_BufferReadStreamImp(); + ~CFX_BufferReadStreamImp(); + FX_BOOL LoadBufferRead(IFX_BufferRead *pBufferRead, FX_INT32 iFileSize, FX_DWORD dwAccess, FX_BOOL bReleaseBufferRead); + + virtual FX_INT32 GetLength() const; + virtual FX_INT32 Seek(FX_STREAMSEEK eSeek, FX_INT32 iOffset); + virtual FX_INT32 GetPosition() + { + return m_iPosition; + } + virtual FX_BOOL IsEOF() const; + + virtual FX_INT32 ReadData(FX_LPBYTE pBuffer, FX_INT32 iBufferSize); + virtual FX_INT32 ReadString(FX_LPWSTR pStr, FX_INT32 iMaxLength, FX_BOOL &bEOS); + virtual FX_INT32 WriteData(FX_LPCBYTE pBuffer, FX_INT32 iBufferSize) + { + return 0; + } + virtual FX_INT32 WriteString(FX_LPCWSTR pStr, FX_INT32 iLength) + { + return 0; + } + virtual void Flush() {} + virtual FX_BOOL SetLength(FX_INT32 iLength) + { + return FALSE; + } +private: + IFX_BufferRead *m_pBufferRead; + FX_BOOL m_bReleaseBufferRead; + FX_INT32 m_iPosition; + FX_INT32 m_iBufferSize; +}; +class CFX_FileWriteStreamImp : public CFX_StreamImp +{ +public: + CFX_FileWriteStreamImp(); + virtual ~CFX_FileWriteStreamImp() {} + FX_BOOL LoadFileWrite(IFX_FileWrite *pFileWrite, FX_DWORD dwAccess); + virtual FX_INT32 GetLength() const; + virtual FX_INT32 Seek(FX_STREAMSEEK eSeek, FX_INT32 iOffset); + virtual FX_INT32 GetPosition() + { + return m_iPosition; + } + virtual FX_BOOL IsEOF() const; + virtual FX_INT32 ReadData(FX_LPBYTE pBuffer, FX_INT32 iBufferSize) + { + return 0; + } + virtual FX_INT32 ReadString(FX_LPWSTR pStr, FX_INT32 iMaxLength, FX_BOOL &bEOS) + { + return 0; + } + virtual FX_INT32 WriteData(FX_LPCBYTE pBuffer, FX_INT32 iBufferSize); + virtual FX_INT32 WriteString(FX_LPCWSTR pStr, FX_INT32 iLength); + virtual void Flush(); + virtual FX_BOOL SetLength(FX_INT32 iLength) + { + return FALSE; + } +protected: + IFX_FileWrite *m_pFileWrite; + FX_INT32 m_iPosition; +}; +enum FX_STREAMTYPE { + FX_SREAMTYPE_Unknown = 0, + FX_STREAMTYPE_File , + FX_STREAMTYPE_Buffer , + FX_STREAMTYPE_Stream , + FX_STREAMTYPE_BufferRead , +}; +class CFX_Stream : public IFX_Stream, public CFX_ThreadLock, public CFX_Object +{ +public: + CFX_Stream(); + ~CFX_Stream(); + FX_BOOL LoadFile(FX_LPCWSTR pszSrcFileName, FX_DWORD dwAccess); + FX_BOOL LoadBuffer(FX_LPBYTE pData, FX_INT32 iTotalSize, FX_DWORD dwAccess); + FX_BOOL LoadFileRead(IFX_FileRead *pFileRead, FX_DWORD dwAccess); + FX_BOOL LoadFileWrite(IFX_FileWrite *pFileWrite, FX_DWORD dwAccess); + FX_BOOL LoadBufferRead(IFX_BufferRead *pBufferRead, FX_INT32 iFileSize, FX_DWORD dwAccess, FX_BOOL bReleaseBufferRead); + virtual void Release(); + virtual IFX_Stream* Retain(); + virtual FX_DWORD GetAccessModes() const + { + return m_dwAccess; + } + virtual FX_INT32 GetLength() const; + virtual FX_INT32 Seek(FX_STREAMSEEK eSeek, FX_INT32 iOffset); + virtual FX_INT32 GetPosition(); + virtual FX_BOOL IsEOF() const; + virtual FX_INT32 ReadData(FX_LPBYTE pBuffer, FX_INT32 iBufferSize); + virtual FX_INT32 ReadString(FX_LPWSTR pStr, FX_INT32 iMaxLength, FX_BOOL &bEOS, FX_INT32 const *pByteSize = NULL); + virtual FX_INT32 WriteData(FX_LPCBYTE pBuffer, FX_INT32 iBufferSize); + virtual FX_INT32 WriteString(FX_LPCWSTR pStr, FX_INT32 iLength); + virtual void Flush(); + virtual FX_BOOL SetLength(FX_INT32 iLength); + virtual FX_INT32 GetBOM(FX_BYTE bom[4]) const; + virtual FX_WORD GetCodePage() const; + virtual FX_WORD SetCodePage(FX_WORD wCodePage); + virtual void Lock() + { + CFX_ThreadLock::Lock(); + } + virtual void Unlock() + { + CFX_ThreadLock::Unlock(); + } + virtual IFX_Stream* CreateSharedStream(FX_DWORD dwAccess, FX_INT32 iOffset, FX_INT32 iLength); +protected: + FX_STREAMTYPE m_eStreamType; + CFX_StreamImp *m_pStreamImp; + FX_DWORD m_dwAccess; + FX_INT32 m_iTotalSize; + FX_INT32 m_iPosition; + FX_INT32 m_iStart; + FX_INT32 m_iLength; + FX_INT32 m_iRefCount; +}; +class CFX_TextStream : public IFX_Stream, public CFX_ThreadLock, public CFX_Object +{ +public: + CFX_TextStream(IFX_Stream *pStream, FX_BOOL bDelStream); + ~CFX_TextStream(); + virtual void Release(); + virtual IFX_Stream* Retain(); + + virtual FX_DWORD GetAccessModes() const; + virtual FX_INT32 GetLength() const; + virtual FX_INT32 Seek(FX_STREAMSEEK eSeek, FX_INT32 iOffset); + virtual FX_INT32 GetPosition(); + virtual FX_BOOL IsEOF() const; + + virtual FX_INT32 ReadData(FX_LPBYTE pBuffer, FX_INT32 iBufferSize); + virtual FX_INT32 ReadString(FX_LPWSTR pStr, FX_INT32 iMaxLength, FX_BOOL &bEOS, FX_INT32 const *pByteSize = NULL); + virtual FX_INT32 WriteData(FX_LPCBYTE pBuffer, FX_INT32 iBufferSize); + virtual FX_INT32 WriteString(FX_LPCWSTR pStr, FX_INT32 iLength); + virtual void Flush(); + virtual FX_BOOL SetLength(FX_INT32 iLength); + + virtual FX_INT32 GetBOM(FX_BYTE bom[4]) const; + virtual FX_WORD GetCodePage() const; + virtual FX_WORD SetCodePage(FX_WORD wCodePage); + + virtual void Lock() + { + CFX_ThreadLock::Lock(); + } + virtual void Unlock() + { + CFX_ThreadLock::Unlock(); + } + + virtual IFX_Stream* CreateSharedStream(FX_DWORD dwAccess, FX_INT32 iOffset, FX_INT32 iLength); +protected: + FX_WORD m_wCodePage; + FX_WORD m_wBOMLength; + FX_DWORD m_dwBOM; + FX_LPBYTE m_pBuf; + FX_INT32 m_iBufSize; + FX_BOOL m_bDelStream; + IFX_Stream *m_pStreamImp; + FX_INT32 m_iRefCount; + void InitStream(); +}; +#ifdef FX_FILESIZE +class CFGAS_FileRead : public IFX_FileRead, public CFX_Object +{ +public: + CFGAS_FileRead(IFX_Stream *pStream, FX_BOOL bReleaseStream); + virtual ~CFGAS_FileRead(); + virtual void Release() + { + delete this; + } + virtual FX_FILESIZE GetSize(); + virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size); +protected: + FX_BOOL m_bReleaseStream; + IFX_Stream *m_pStream; +}; +#else +class CFGAS_FileRead : public IFX_FileRead, public CFX_Object +{ +public: + CFGAS_FileRead(IFX_Stream *pStream, FX_BOOL bReleaseStream); + virtual ~CFGAS_FileRead(); + + virtual void Release() + { + delete this; + } + virtual FX_DWORD GetSize(); + virtual FX_BOOL ReadBlock(void* buffer, FX_DWORD offset, FX_DWORD size); + +protected: + FX_BOOL m_bReleaseStream; + IFX_Stream *m_pStream; +}; +#endif +#ifdef FX_FILESIZE +class CFX_BufferAccImp : public IFX_FileRead, public CFX_Object +{ +public: + CFX_BufferAccImp(IFX_BufferRead *pBufferRead, FX_FILESIZE iFileSize, FX_BOOL bReleaseStream); + virtual ~CFX_BufferAccImp(); + virtual void Release() + { + delete this; + } + virtual FX_FILESIZE GetSize(); + virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size); +protected: + IFX_BufferRead *m_pBufferRead; + FX_BOOL m_bReleaseStream; + FX_FILESIZE m_iBufSize; +}; +#else +class CFX_BufferAccImp : public IFX_FileRead, public CFX_Object +{ +public: + CFX_BufferAccImp(IFX_BufferRead *pBufferRead, FX_INT32 iFileSize, FX_BOOL bReleaseStream); + virtual ~CFX_BufferAccImp(); + + virtual void Release() + { + delete this; + } + virtual FX_DWORD GetSize(); + virtual FX_BOOL ReadBlock(void* buffer, FX_DWORD offset, FX_DWORD size); + +protected: + IFX_BufferRead *m_pBufferRead; + FX_BOOL m_bReleaseStream; + FX_INT32 m_iBufSize; +}; +#endif +#ifdef FX_FILESIZE +class CFGAS_FileWrite : public IFX_FileWrite, public CFX_Object +{ +public: + CFGAS_FileWrite(IFX_Stream *pStream, FX_BOOL bReleaseStream); + virtual ~CFGAS_FileWrite(); + virtual void Release() + { + delete this; + } + virtual FX_FILESIZE GetSize(); + virtual FX_BOOL Flush(); + virtual FX_BOOL WriteBlock(const void* pData, size_t size); + virtual FX_BOOL WriteBlock(const void* pData, FX_FILESIZE offset, size_t size); +protected: + IFX_Stream *m_pStream; + FX_BOOL m_bReleaseStream; +}; +#else +class CFGAS_FileWrite : public IFX_FileWrite, public CFX_Object +{ +public: + CFGAS_FileWrite(IFX_Stream *pStream, FX_BOOL bReleaseStream); + virtual ~CFGAS_FileWrite(); + + virtual void Release() + { + delete this; + } + virtual FX_DWORD GetSize(); + virtual FX_DWORD Flush(); + virtual FX_BOOL WriteBlock(const void* pData, FX_DWORD size); + virtual FX_BOOL WriteBlock(const void* pData, FX_DWORD offset, FX_DWORD size); + +protected: + IFX_Stream *m_pStream; + FX_BOOL m_bReleaseStream; +}; +#endif +#endif diff --git a/xfa/src/fgas/src/crt/fx_system.cpp b/xfa/src/fgas/src/crt/fx_system.cpp new file mode 100644 index 0000000000..c8e4407a79 --- /dev/null +++ b/xfa/src/fgas/src/crt/fx_system.cpp @@ -0,0 +1,236 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../fgas_base.h" +#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || _FX_OS_ == _FX_WIN64_ +#include +#elif _FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_LINUX_Mini_ +#include +#endif +#ifdef __cplusplus +extern "C" { +#endif +FX_FLOAT FX_tan(FX_FLOAT a) +{ + return (FX_FLOAT)tan(a); +} +FX_FLOAT FX_log(FX_FLOAT b, FX_FLOAT x) +{ + return FXSYS_log(x) / FXSYS_log(b); +} +FX_LPWSTR FX_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 FX_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)FX_tolower(*s1++); + wch2 = (FX_WCHAR)FX_tolower(*s2++); + if (wch1 != wch2) { + break; + } + } + return wch1 - wch2; +} +FX_INT32 FX_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)FX_tolower(*s1++); + ch2 = (FX_CHAR)FX_tolower(*s2++); + if (ch1 != ch2) { + break; + } + } + return ch1 - ch2; +} +FX_INT32 FX_filelength(FXSYS_FILE *file) +{ + FXSYS_assert(file != NULL); +#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_ + return _filelength(_fileno(file)); +#else + FX_INT32 iPos = FXSYS_ftell(file); + FXSYS_fseek(file, 0, FXSYS_SEEK_END); + FX_INT32 iLen = FXSYS_ftell(file); + FXSYS_fseek(file, iPos, FXSYS_SEEK_SET); + return iLen; +#endif +} +FX_BOOL FX_fsetsize(FXSYS_FILE *file, FX_INT32 size) +{ + FXSYS_assert(file != NULL); +#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_ + return _chsize(_fileno(file), size) == 0; +#elif _FX_OS_ == _FX_WIN32_MOBILE_ + HANDLE hFile = _fileno(file); + FX_DWORD dwPos = ::SetFilePointer(hFile, 0, 0, FILE_CURRENT); + ::SetFilePointer(hFile, size, 0, FILE_BEGIN); + FX_BOOL bRet = ::SetEndOfFile(hFile); + ::SetFilePointer(hFile, (FX_INT32)dwPos, 0, FILE_BEGIN); + return bRet; +#else + return FALSE; +#endif +} +FX_FLOAT FX_strtof(FX_LPCSTR pcsStr, FX_INT32 iLength , FX_INT32 *pUsedLen ) +{ + FXSYS_assert(pcsStr != NULL); + if (iLength < 0) { + iLength = FXSYS_strlen(pcsStr); + } + return FX_wcstof(CFX_WideString::FromLocal(pcsStr, iLength), iLength, pUsedLen); +} +FX_FLOAT FX_wcstof(FX_LPCWSTR pwsStr, FX_INT32 iLength , FX_INT32 *pUsedLen ) +{ + FXSYS_assert(pwsStr != NULL); + if (iLength < 0) { + iLength = 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; +} +void FX_memset(FX_LPVOID pBuf, FX_INT32 iValue, size_t size) +{ + FXSYS_assert(pBuf != NULL && size > 0 && (size & 0x03) == 0); + FXSYS_assert((((size_t)pBuf) & 0x03) == 0); + FX_DWORD *pStart = (FX_DWORD*)pBuf; + FX_DWORD *pEnd = pStart + (size >> 2); + while (pStart < pEnd) { + *pStart ++ = iValue; + } +} +void FX_memcpy(FX_LPVOID pDst, FX_LPCVOID pSrc, size_t size) +{ + FXSYS_assert(pDst != NULL && pSrc != NULL && size > 0 && (size & 0x03) == 0); + FXSYS_assert((((size_t)pDst) & 0x03) == 0 && (((size_t)pSrc) & 0x03) == 0); + FX_DWORD *pStart = (FX_DWORD*)pDst; + FX_DWORD *pEnd = pStart + (size >> 2); + FX_DWORD *pValue = (FX_DWORD*)pSrc; + while (pStart < pEnd) { + *pStart ++ = *pValue ++; + } +} +FX_BOOL FX_IsRelativePath(const CFX_WideStringC &wsUrl) +{ + FX_INT32 iUrlLen = wsUrl.GetLength(); + if (iUrlLen == 0) { + return TRUE; + } + for (FX_INT32 i = FX_MIN(5, iUrlLen) - 1; i >= 0; --i) + if (wsUrl.GetAt(i) == ':') { + return FALSE; + } + return TRUE; +} +FX_BOOL FX_JoinPath(const CFX_WideStringC &wsBasePath, const CFX_WideStringC &wsRelativePath, CFX_WideString &wsAbsolutePath) +{ + if (!FX_IsRelativePath(wsRelativePath)) { + wsAbsolutePath = wsRelativePath; + return TRUE; + } + FX_LPCWSTR pRelStart = wsRelativePath.GetPtr(); + FX_LPCWSTR pRelEnd = pRelStart + wsRelativePath.GetLength(); + if (pRelStart < pRelEnd) { + switch (*pRelStart) { + case '#': + wsAbsolutePath = CFX_WideString(wsBasePath, wsRelativePath); + return wsAbsolutePath.GetLength() > 0; + case '/': + case '\\': + wsAbsolutePath = wsRelativePath; + return wsAbsolutePath.GetLength() > 0; + } + } + FX_INT32 nBackCount = 0; + for(;;) { + if (pRelStart >= pRelEnd) { + wsAbsolutePath = wsBasePath; + return TRUE; + } + if (*pRelStart != '.') { + break; + } + if (pRelStart + 1 < pRelEnd && + (pRelStart[1] == '/' || pRelStart[1] == '\\')) { + pRelStart += 2; + } else if (pRelStart + 2 < pRelEnd + && pRelStart[1] == '.' + && (pRelStart[2] == '/' || pRelStart[2] == '\\')) { + pRelStart += 3; + nBackCount++; + } else { + return FALSE; + } + } + FX_LPCWSTR pBaseStart = wsBasePath.GetPtr(); + FX_LPCWSTR pBaseEnd = pBaseStart + wsBasePath.GetLength(); + while(pBaseStart < (--pBaseEnd) && *pBaseEnd != '/' && *pBaseEnd != '\\') + ; + if (pBaseStart == pBaseEnd) { + wsAbsolutePath = CFX_WideStringC(pRelStart, pRelEnd - pRelStart); + return wsAbsolutePath.GetLength() > 0; + } + while (nBackCount > 0) { + if (pBaseStart >= (--pBaseEnd)) { + return FALSE; + } else if (*pBaseEnd == '/' || *pBaseEnd == '\\') + if ((--nBackCount) <= 0) { + break; + } + } + wsAbsolutePath = CFX_WideString(CFX_WideStringC(pBaseStart, pBaseEnd - pBaseStart + 1), + CFX_WideStringC(pRelStart, pRelEnd - pRelStart)); + return wsAbsolutePath.GetLength() > 0; +} +#ifdef __cplusplus +}; +#endif diff --git a/xfa/src/fgas/src/crt/fx_utils.cpp b/xfa/src/fgas/src/crt/fx_utils.cpp new file mode 100644 index 0000000000..f13af23216 --- /dev/null +++ b/xfa/src/fgas/src/crt/fx_utils.cpp @@ -0,0 +1,456 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../fgas_base.h" +#include "fx_utils.h" +CFX_ThreadLock::CFX_ThreadLock() + : m_pData(NULL) +{ +} +CFX_ThreadLock::~CFX_ThreadLock() +{ +} +void CFX_ThreadLock::Lock() +{ +} +void CFX_ThreadLock::Unlock() +{ +} +typedef struct _FX_BASEARRAYDATA : public CFX_Target { + FX_INT32 iGrowSize; + FX_INT32 iBlockSize; + FX_INT32 iTotalCount; + FX_INT32 iBlockCount; + FX_LPBYTE pBuffer; +} FX_BASEARRAYDATA, * FX_LPBASEARRAYDATA; +typedef FX_BASEARRAYDATA const * FX_LPCBASEARRAYDATA; +CFX_BaseArray::CFX_BaseArray(FX_INT32 iGrowSize, FX_INT32 iBlockSize) +{ + FXSYS_assert(iGrowSize > 0 && iBlockSize > 0); + m_pData = FXTARGET_New FX_BASEARRAYDATA; + FX_memset(m_pData, 0, sizeof(FX_BASEARRAYDATA)); + ((FX_LPBASEARRAYDATA)m_pData)->iGrowSize = iGrowSize; + ((FX_LPBASEARRAYDATA)m_pData)->iBlockSize = iBlockSize; +} +CFX_BaseArray::~CFX_BaseArray() +{ + FX_LPBASEARRAYDATA pData = (FX_LPBASEARRAYDATA)m_pData; + if (pData->pBuffer != NULL) { + FX_Free(pData->pBuffer); + } + FXTARGET_Delete pData; +} +FX_INT32 CFX_BaseArray::GetSize() const +{ + return ((FX_LPBASEARRAYDATA)m_pData)->iBlockCount; +} +FX_INT32 CFX_BaseArray::GetBlockSize() const +{ + return ((FX_LPBASEARRAYDATA)m_pData)->iBlockSize; +} +FX_LPBYTE CFX_BaseArray::AddSpaceTo(FX_INT32 index) +{ + FXSYS_assert(index > -1); + FX_LPBYTE &pBuffer = ((FX_LPBASEARRAYDATA)m_pData)->pBuffer; + FX_INT32 &iTotalCount = ((FX_LPBASEARRAYDATA)m_pData)->iTotalCount; + FX_INT32 iBlockSize = ((FX_LPBASEARRAYDATA)m_pData)->iBlockSize; + if (index >= iTotalCount) { + FX_INT32 iGrowSize = ((FX_LPBASEARRAYDATA)m_pData)->iGrowSize; + iTotalCount = (index / iGrowSize + 1) * iGrowSize; + FX_INT32 iNewSize = iTotalCount * iBlockSize; + if (pBuffer == NULL) { + pBuffer = (FX_LPBYTE)FX_Alloc(FX_BYTE, iNewSize); + } else { + pBuffer = (FX_LPBYTE)FX_Realloc(FX_BYTE, pBuffer, iNewSize); + } + } + FXSYS_assert(pBuffer != NULL); + FX_INT32 &iBlockCount = ((FX_LPBASEARRAYDATA)m_pData)->iBlockCount; + if (index >= iBlockCount) { + iBlockCount = index + 1; + } + return pBuffer + index * iBlockSize; +} +FX_LPBYTE CFX_BaseArray::GetAt(FX_INT32 index) const +{ + FXSYS_assert(index > -1 && index < ((FX_LPBASEARRAYDATA)m_pData)->iBlockCount); + return ((FX_LPBASEARRAYDATA)m_pData)->pBuffer + index * ((FX_LPBASEARRAYDATA)m_pData)->iBlockSize; +} +FX_LPBYTE CFX_BaseArray::GetBuffer() const +{ + return ((FX_LPBASEARRAYDATA)m_pData)->pBuffer; +} +FX_INT32 CFX_BaseArray::Append(const CFX_BaseArray &src, FX_INT32 iStart, FX_INT32 iCount) +{ + FX_INT32 iBlockSize = ((FX_LPBASEARRAYDATA)m_pData)->iBlockSize; + FXSYS_assert(iBlockSize == ((FX_LPBASEARRAYDATA)src.m_pData)->iBlockSize); + FX_INT32 &iBlockCount = ((FX_LPBASEARRAYDATA)m_pData)->iBlockCount; + FX_INT32 iAdded = src.GetSize(); + FXSYS_assert(iStart > -1 && iStart < iAdded); + if (iCount < 0) { + iCount = iAdded; + } + if (iStart + iCount > iAdded) { + iCount = iAdded - iStart; + } + if (iCount < 1) { + return 0; + } + FX_LPBYTE pDst = ((FX_LPBASEARRAYDATA)m_pData)->pBuffer + iBlockCount * iBlockSize; + AddSpaceTo(iBlockCount + iCount - 1); + FX_memcpy(pDst, ((FX_LPBASEARRAYDATA)src.m_pData)->pBuffer + iStart * iBlockSize, iCount * iBlockSize); + return iCount; +} +FX_INT32 CFX_BaseArray::Copy(const CFX_BaseArray &src, FX_INT32 iStart, FX_INT32 iCount) +{ + FX_INT32 iBlockSize = ((FX_LPBASEARRAYDATA)m_pData)->iBlockSize; + FXSYS_assert(iBlockSize == ((FX_LPBASEARRAYDATA)src.m_pData)->iBlockSize); + FX_INT32 iCopied = src.GetSize(); + FXSYS_assert(iStart > -1 && iStart < iCopied); + if (iCount < 0) { + iCount = iCopied; + } + if (iStart + iCount > iCopied) { + iCount = iCopied - iStart; + } + if (iCount < 1) { + return 0; + } + RemoveAll(TRUE); + AddSpaceTo(iCount - 1); + FX_memcpy(((FX_LPBASEARRAYDATA)m_pData)->pBuffer, ((FX_LPBASEARRAYDATA)src.m_pData)->pBuffer + iStart * iBlockSize, iCount * iBlockSize); + return iCount; +} +FX_INT32 CFX_BaseArray::RemoveLast(FX_INT32 iCount) +{ + FX_INT32 &iBlockCount = ((FX_LPBASEARRAYDATA)m_pData)->iBlockCount; + if (iCount < 0 || iCount > iBlockCount) { + iCount = iBlockCount; + iBlockCount = 0; + } else { + iBlockCount -= iCount; + } + return iCount; +} +void CFX_BaseArray::RemoveAll(FX_BOOL bLeaveMemory) +{ + if (!bLeaveMemory) { + FX_LPBYTE &pBuffer = ((FX_LPBASEARRAYDATA)m_pData)->pBuffer; + if (pBuffer != NULL) { + FX_Free(pBuffer); + pBuffer = NULL; + } + ((FX_LPBASEARRAYDATA)m_pData)->iTotalCount = 0; + } + ((FX_LPBASEARRAYDATA)m_pData)->iBlockCount = 0; +} +CFX_BaseMassArrayImp::CFX_BaseMassArrayImp(FX_INT32 iChunkSize, FX_INT32 iBlockSize) + : m_iChunkSize(iChunkSize) + , m_iBlockSize(iBlockSize) + , m_iChunkCount(0) + , m_iBlockCount(0) +{ + FXSYS_assert(m_iChunkSize > 0 && m_iBlockSize > 0); + m_pData = FX_NEW CFX_PtrArray; + m_pData->SetSize(16); +} +CFX_BaseMassArrayImp::~CFX_BaseMassArrayImp() +{ + RemoveAll(); + delete m_pData; +} +FX_LPBYTE CFX_BaseMassArrayImp::AddSpaceTo(FX_INT32 index) +{ + FXSYS_assert(index > -1); + FX_LPBYTE pChunk; + if (index < m_iBlockCount) { + pChunk = (FX_LPBYTE)m_pData->GetAt(index / m_iChunkSize); + } else { + FX_INT32 iMemSize = m_iChunkSize * m_iBlockSize; + while (TRUE) { + if (index < m_iChunkCount * m_iChunkSize) { + pChunk = (FX_LPBYTE)m_pData->GetAt(index / m_iChunkSize); + break; + } else { + pChunk = (FX_LPBYTE)FX_Alloc(FX_BYTE, iMemSize); + if (m_iChunkCount < m_pData->GetSize()) { + m_pData->SetAt(m_iChunkCount, pChunk); + } else { + m_pData->Add(pChunk); + } + m_iChunkCount ++; + } + } + } + FXSYS_assert(pChunk != NULL); + m_iBlockCount = index + 1; + return pChunk + (index % m_iChunkSize) * m_iBlockSize; +} +FX_LPBYTE CFX_BaseMassArrayImp::GetAt(FX_INT32 index) const +{ + FXSYS_assert(index > -1 && index < m_iBlockCount); + FX_LPBYTE pChunk = (FX_LPBYTE)m_pData->GetAt(index / m_iChunkSize); + FXSYS_assert(pChunk != NULL); + return pChunk + (index % m_iChunkSize) * m_iBlockSize; +} +FX_INT32 CFX_BaseMassArrayImp::Append(const CFX_BaseMassArrayImp &src, FX_INT32 iStart, FX_INT32 iCount) +{ + FXSYS_assert(m_iBlockSize == src.m_iBlockSize); + FX_INT32 iAdded = src.m_iBlockCount; + FXSYS_assert(iStart > -1 && iStart < iAdded); + if (iCount < 0) { + iCount = iAdded; + } + if (iStart + iCount > iAdded) { + iCount = iAdded - iStart; + } + if (iCount < 1) { + return m_iBlockCount; + } + FX_INT32 iBlockCount = m_iBlockCount; + FX_INT32 iTotal = m_iBlockCount + iCount; + AddSpaceTo(iTotal - 1); + Append(iBlockCount, src, iStart, iCount); + return m_iBlockCount; +} +FX_INT32 CFX_BaseMassArrayImp::Copy(const CFX_BaseMassArrayImp &src, FX_INT32 iStart, FX_INT32 iCount) +{ + FXSYS_assert(m_iBlockSize == src.m_iBlockSize); + FX_INT32 iCopied = src.m_iBlockCount; + FXSYS_assert(iStart > -1); + if (iStart >= iCopied) { + return 0; + } + RemoveAll(TRUE); + if (iCount < 0) { + iCount = iCopied; + } + if (iStart + iCount > iCopied) { + iCount = iCopied - iStart; + } + if (iCount < 1) { + return 0; + } + if (m_iBlockCount < iCount) { + AddSpaceTo(iCount - 1); + } + Append(0, src, iStart, iCount); + return m_iBlockCount; +} +void CFX_BaseMassArrayImp::Append(FX_INT32 iDstStart, const CFX_BaseMassArrayImp &src, FX_INT32 iSrcStart, FX_INT32 iSrcCount) +{ + FXSYS_assert(iDstStart > -1 && m_iBlockSize == src.m_iBlockSize); + FX_INT32 iSrcTotal = src.m_iBlockCount; + FXSYS_assert(iSrcTotal > 0 && m_iBlockCount >= iDstStart + iSrcCount); + FXSYS_assert(iSrcStart > -1 && iSrcStart < iSrcTotal && iSrcCount > 0 && iSrcStart + iSrcCount <= iSrcTotal); + FX_INT32 iDstChunkIndex = iDstStart / m_iChunkSize; + FX_INT32 iSrcChunkIndex = iSrcStart / src.m_iChunkSize; + FX_LPBYTE pDstChunk = (FX_LPBYTE)GetAt(iDstStart); + FX_LPBYTE pSrcChunk = (FX_LPBYTE)src.GetAt(iSrcStart); + FX_INT32 iDstChunkSize = m_iChunkSize - (iDstStart % m_iChunkSize); + FX_INT32 iSrcChunkSize = src.m_iChunkSize - (iSrcStart % src.m_iChunkSize); + FX_INT32 iCopySize = FX_MIN(iSrcCount, FX_MIN(iSrcChunkSize, iDstChunkSize)); + FX_INT32 iCopyBytes = iCopySize * m_iBlockSize; + while (iSrcCount > 0) { + FXSYS_assert(pDstChunk != NULL && pSrcChunk != NULL); + FXSYS_memcpy(pDstChunk, pSrcChunk, iCopyBytes); + iSrcCount -= iCopySize; + iSrcChunkSize -= iCopySize; + if (iSrcChunkSize < 1) { + iSrcChunkSize = src.m_iChunkSize; + iSrcChunkIndex ++; + pSrcChunk = (FX_LPBYTE)src.m_pData->GetAt(iSrcChunkIndex); + } else { + pSrcChunk += iCopyBytes; + } + iDstChunkSize -= iCopySize; + if (iDstChunkSize < 1) { + iDstChunkSize = m_iChunkSize; + iDstChunkIndex ++; + pDstChunk = (FX_LPBYTE)m_pData->GetAt(iDstChunkIndex); + } else { + pDstChunk += iCopyBytes; + } + iCopySize = FX_MIN(iSrcCount, FX_MIN(iSrcChunkSize, iDstChunkSize)); + iCopyBytes = iCopySize * m_iBlockSize; + } +} +FX_INT32 CFX_BaseMassArrayImp::RemoveLast(FX_INT32 iCount) +{ + if (iCount < 0 || iCount >= m_iBlockCount) { + m_iBlockCount = 0; + } else { + m_iBlockCount -= iCount; + } + return m_iBlockCount; +} +void CFX_BaseMassArrayImp::RemoveAll(FX_BOOL bLeaveMemory) +{ + if (bLeaveMemory) { + m_iBlockCount = 0; + return; + } + for (FX_INT32 i = 0; i < m_iChunkCount; i ++) { + FX_LPVOID p = m_pData->GetAt(i); + if (p == NULL) { + continue; + } + FX_Free(p); + } + m_pData->RemoveAll(); + m_iChunkCount = 0; + m_iBlockCount = 0; +} +CFX_BaseMassArray::CFX_BaseMassArray(FX_INT32 iChunkSize, FX_INT32 iBlockSize) +{ + m_pData = FXTARGET_New CFX_BaseMassArrayImp(iChunkSize, iBlockSize); +} +CFX_BaseMassArray::~CFX_BaseMassArray() +{ + FXTARGET_Delete (CFX_BaseMassArrayImp*)m_pData; +} +FX_INT32 CFX_BaseMassArray::GetSize() const +{ + return ((CFX_BaseMassArrayImp*)m_pData)->m_iBlockCount; +} +FX_LPBYTE CFX_BaseMassArray::AddSpaceTo(FX_INT32 index) +{ + return ((CFX_BaseMassArrayImp*)m_pData)->AddSpaceTo(index); +} +FX_LPBYTE CFX_BaseMassArray::GetAt(FX_INT32 index) const +{ + return ((CFX_BaseMassArrayImp*)m_pData)->GetAt(index); +} +FX_INT32 CFX_BaseMassArray::Append(const CFX_BaseMassArray &src, FX_INT32 iStart, FX_INT32 iCount) +{ + return ((CFX_BaseMassArrayImp*)m_pData)->Append(*(CFX_BaseMassArrayImp*)src.m_pData, iStart, iCount); +} +FX_INT32 CFX_BaseMassArray::Copy(const CFX_BaseMassArray &src, FX_INT32 iStart, FX_INT32 iCount) +{ + return ((CFX_BaseMassArrayImp*)m_pData)->Copy(*(CFX_BaseMassArrayImp*)src.m_pData, iStart, iCount); +} +FX_INT32 CFX_BaseMassArray::RemoveLast(FX_INT32 iCount) +{ + return ((CFX_BaseMassArrayImp*)m_pData)->RemoveLast(iCount); +} +void CFX_BaseMassArray::RemoveAll(FX_BOOL bLeaveMemory) +{ + ((CFX_BaseMassArrayImp*)m_pData)->RemoveAll(bLeaveMemory); +} +typedef struct _FX_BASEDISCRETEARRAYDATA : public CFX_Object { + FX_INT32 iBlockSize; + FX_INT32 iChunkSize; + FX_INT32 iChunkCount; + CFX_PtrArray ChunkBuffer; +} FX_BASEDISCRETEARRAYDATA, * FX_LPBASEDISCRETEARRAYDATA; +typedef FX_BASEDISCRETEARRAYDATA const * FX_LPCBASEDISCRETEARRAYDATA; +CFX_BaseDiscreteArray::CFX_BaseDiscreteArray(FX_INT32 iChunkSize, FX_INT32 iBlockSize) +{ + FXSYS_assert(iChunkSize > 0 && iBlockSize > 0); + FX_LPBASEDISCRETEARRAYDATA pData; + m_pData = pData = FX_NEW FX_BASEDISCRETEARRAYDATA; + pData->ChunkBuffer.SetSize(16); + pData->iChunkCount = 0; + pData->iChunkSize = iChunkSize; + pData->iBlockSize = iBlockSize; +} +CFX_BaseDiscreteArray::~CFX_BaseDiscreteArray() +{ + RemoveAll(); + delete (FX_LPBASEDISCRETEARRAYDATA)m_pData; +} +FX_LPBYTE CFX_BaseDiscreteArray::AddSpaceTo(FX_INT32 index) +{ + FXSYS_assert(index > -1); + FX_LPBASEDISCRETEARRAYDATA pData = (FX_LPBASEDISCRETEARRAYDATA)m_pData; + FX_INT32 &iChunkCount = pData->iChunkCount; + FX_INT32 iChunkSize = pData->iChunkSize; + FX_LPBYTE pChunk = NULL; + FX_INT32 iChunk = index / iChunkSize; + if (iChunk < iChunkCount) { + pChunk = (FX_LPBYTE)pData->ChunkBuffer.GetAt(iChunk); + } + if (pChunk == NULL) { + FX_INT32 iMemSize = iChunkSize * pData->iBlockSize; + pChunk = (FX_LPBYTE)FX_Alloc(FX_BYTE, iMemSize); + FXSYS_memset(pChunk, 0, iMemSize); + pData->ChunkBuffer.SetAtGrow(iChunk, pChunk); + if (iChunkCount <= iChunk) { + iChunkCount = iChunk + 1; + } + } + return pChunk + (index % iChunkSize) * pData->iBlockSize; +} +FX_LPBYTE CFX_BaseDiscreteArray::GetAt(FX_INT32 index) const +{ + FXSYS_assert(index > -1); + FX_LPBASEDISCRETEARRAYDATA pData = (FX_LPBASEDISCRETEARRAYDATA)m_pData; + FX_INT32 iChunkSize = pData->iChunkSize; + FX_INT32 iChunk = index / iChunkSize; + if (iChunk >= pData->iChunkCount) { + return NULL; + } + FX_LPBYTE pChunk = (FX_LPBYTE)pData->ChunkBuffer.GetAt(iChunk); + if (pChunk == NULL) { + return NULL; + } + return pChunk + (index % iChunkSize) * pData->iBlockSize; +} +void CFX_BaseDiscreteArray::RemoveAll() +{ + FX_LPBASEDISCRETEARRAYDATA pData = (FX_LPBASEDISCRETEARRAYDATA)m_pData; + CFX_PtrArray &ChunkBuffer = pData->ChunkBuffer; + FX_INT32 &iChunkCount = pData->iChunkCount; + for (FX_INT32 i = 0; i < iChunkCount; i++) { + FX_LPVOID p = ChunkBuffer.GetAt(i); + if (p == NULL) { + continue; + } + FX_Free(p); + } + ChunkBuffer.RemoveAll(); + iChunkCount = 0; +} +CFX_BaseStack::CFX_BaseStack(FX_INT32 iChunkSize, FX_INT32 iBlockSize) +{ + m_pData = FXTARGET_New CFX_BaseMassArrayImp(iChunkSize, iBlockSize); +} +CFX_BaseStack::~CFX_BaseStack() +{ + FXTARGET_Delete (CFX_BaseMassArrayImp*)m_pData; +} +FX_LPBYTE CFX_BaseStack::Push() +{ + return ((CFX_BaseMassArrayImp*)m_pData)->AddSpace(); +} +void CFX_BaseStack::Pop() +{ + FX_INT32 &iBlockCount = ((CFX_BaseMassArrayImp*)m_pData)->m_iBlockCount; + if (iBlockCount < 1) { + return; + } + iBlockCount --; +} +FX_LPBYTE CFX_BaseStack::GetTopElement() const +{ + FX_INT32 iSize = ((CFX_BaseMassArrayImp*)m_pData)->m_iBlockCount; + if (iSize < 1) { + return NULL; + } + return ((CFX_BaseMassArrayImp*)m_pData)->GetAt(iSize - 1); +} +FX_INT32 CFX_BaseStack::GetSize() const +{ + return ((CFX_BaseMassArrayImp*)m_pData)->m_iBlockCount; +} +FX_LPBYTE CFX_BaseStack::GetAt(FX_INT32 index) const +{ + return ((CFX_BaseMassArrayImp*)m_pData)->GetAt(index); +} +void CFX_BaseStack::RemoveAll(FX_BOOL bLeaveMemory ) +{ + ((CFX_BaseMassArrayImp*)m_pData)->RemoveAll(bLeaveMemory); +} diff --git a/xfa/src/fgas/src/crt/fx_utils.h b/xfa/src/fgas/src/crt/fx_utils.h new file mode 100644 index 0000000000..a073b80e57 --- /dev/null +++ b/xfa/src/fgas/src/crt/fx_utils.h @@ -0,0 +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 _FX_UTILS_IMP +#define _FX_UTILS_IMP +class CFX_BaseMassArrayImp : public CFX_Target +{ +public: + CFX_BaseMassArrayImp(FX_INT32 iChunkSize, FX_INT32 iBlockSize); + ~CFX_BaseMassArrayImp(); + FX_LPBYTE AddSpace() + { + return AddSpaceTo(m_iBlockCount); + } + FX_LPBYTE AddSpaceTo(FX_INT32 index); + FX_LPBYTE GetAt(FX_INT32 index) const; + FX_INT32 Append(const CFX_BaseMassArrayImp &src, FX_INT32 iStart = 0, FX_INT32 iCount = -1); + FX_INT32 Copy(const CFX_BaseMassArrayImp &src, FX_INT32 iStart = 0, FX_INT32 iCount = -1); + FX_INT32 RemoveLast(FX_INT32 iCount = -1); + void RemoveAll(FX_BOOL bLeaveMemory = FALSE); + FX_INT32 m_iChunkSize; + FX_INT32 m_iBlockSize; + FX_INT32 m_iChunkCount; + FX_INT32 m_iBlockCount; + CFX_PtrArray *m_pData; +protected: + void Append(FX_INT32 iDstStart, const CFX_BaseMassArrayImp &src, FX_INT32 iSrcStart = 0, FX_INT32 iSrcCount = -1); +}; +#endif diff --git a/xfa/src/fgas/src/fgas_base.h b/xfa/src/fgas/src/fgas_base.h new file mode 100644 index 0000000000..d860ec3c9b --- /dev/null +++ b/xfa/src/fgas/src/fgas_base.h @@ -0,0 +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 + +#ifndef _FXMATH_BASE_ +#define _FXMATH_BASE_ +#include "../../foxitlib.h" +#include "../../../../core/include/fxge/fx_freetype.h" +#include "../include/fgas.h" +#endif diff --git a/xfa/src/fgas/src/font/fx_fontutils.cpp b/xfa/src/fgas/src/font/fx_fontutils.cpp new file mode 100644 index 0000000000..b2a7028fb8 --- /dev/null +++ b/xfa/src/fgas/src/font/fx_fontutils.cpp @@ -0,0 +1,236 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../fgas_base.h" +#include "fx_fontutils.h" +FX_DWORD FGAS_GetFontHashCode(FX_WORD wCodePage, FX_DWORD dwFontStyles) +{ + FX_DWORD dwHash = wCodePage; + if (dwFontStyles & FX_FONTSTYLE_FixedPitch) { + dwHash |= 0x00010000; + } + if (dwFontStyles & FX_FONTSTYLE_Serif) { + dwHash |= 0x00020000; + } + if (dwFontStyles & FX_FONTSTYLE_Symbolic) { + dwHash |= 0x00040000; + } + if (dwFontStyles & FX_FONTSTYLE_Script) { + dwHash |= 0x00080000; + } + if (dwFontStyles & FX_FONTSTYLE_Italic) { + dwHash |= 0x00100000; + } + if (dwFontStyles & FX_FONTSTYLE_Bold) { + dwHash |= 0x00200000; + } + return dwHash; +} +FX_DWORD FGAS_GetFontFamilyHash(FX_LPCWSTR pszFontFamily, FX_DWORD dwFontStyles, FX_WORD wCodePage) +{ + CFX_WideString wsFont(pszFontFamily); + if (dwFontStyles & FX_FONTSTYLE_Bold) { + wsFont += L"Bold"; + } + if (dwFontStyles & FX_FONTSTYLE_Italic) { + wsFont += L"Italic"; + } + wsFont += wCodePage; + return FX_HashCode_String_GetW((FX_LPCWSTR)wsFont, wsFont.GetLength()); +} +static const FGAS_FONTUSB g_FXGdiFontUSBTable[] = { + {0x0000 , 0x007F , 0 , 1252 }, + {0x0080 , 0x00FF , 1 , 1252 }, + {0x0100 , 0x017F , 2 , 1250 }, + {0x0180 , 0x024F , 3 , 1250 }, + {0x0250 , 0x02AF , 4 , 0xFFFF}, + {0x02B0 , 0x02FF , 5 , 0xFFFF}, + {0x0300 , 0x036F , 6 , 0xFFFF}, + {0x0370 , 0x03FF , 7 , 1253 }, + {0x0400 , 0x04FF , 9 , 1251 }, + {0x0500 , 0x052F , 9 , 0xFFFF}, + {0x0530 , 0x058F , 10 , 0xFFFF}, + {0x0590 , 0x05FF , 11 , 1255 }, + {0x0600 , 0x06FF , 13 , 1256 }, + {0x0700 , 0x074F , 71 , 0xFFFF}, + {0x0750 , 0x077F , 13 , 0xFFFF}, + {0x0780 , 0x07BF , 72 , 0xFFFF}, + {0x07C0 , 0x07FF , 14 , 0xFFFF}, + {0x0800 , 0x08FF , 999, 0xFFFF}, + {0x0900 , 0x097F , 15 , 0xFFFF}, + {0x0980 , 0x09FF , 16 , 0xFFFF}, + {0x0A00 , 0x0A7F , 17 , 0xFFFF}, + {0x0A80 , 0x0AFF , 18 , 0xFFFF}, + {0x0B00 , 0x0B7F , 19 , 0xFFFF}, + {0x0B80 , 0x0BFF , 20 , 0xFFFF}, + {0x0C00 , 0x0C7F , 21 , 0xFFFF}, + {0x0C80 , 0x0CFF , 22 , 0xFFFF}, + {0x0D00 , 0x0D7F , 23 , 0xFFFF}, + {0x0D80 , 0x0DFF , 73 , 0xFFFF}, + {0x0E00 , 0x0E7F , 24 , 874 }, + {0x0E80 , 0x0EFF , 25 , 0xFFFF}, + {0x0F00 , 0x0FFF , 70 , 0xFFFF}, + {0x1000 , 0x109F , 74 , 0xFFFF}, + {0x10A0 , 0x10FF , 26 , 0xFFFF}, + {0x1100 , 0x11FF , 28 , 0xFFFF}, + {0x1200 , 0x137F , 75 , 0xFFFF}, + {0x1380 , 0x139F , 75 , 0xFFFF}, + {0x13A0 , 0x13FF , 76 , 0xFFFF}, + {0x1400 , 0x167F , 77 , 0xFFFF}, + {0x1680 , 0x169F , 78 , 0xFFFF}, + {0x16A0 , 0x16FF , 79 , 0xFFFF}, + {0x1700 , 0x171F , 84 , 0xFFFF}, + {0x1720 , 0x173F , 84 , 0xFFFF}, + {0x1740 , 0x175F , 84 , 0xFFFF}, + {0x1760 , 0x177F , 84 , 0xFFFF}, + {0x1780 , 0x17FF , 80 , 0xFFFF}, + {0x1800 , 0x18AF , 81 , 0xFFFF}, + {0x18B0 , 0x18FF , 999, 0xFFFF}, + {0x1900 , 0x194F , 93 , 0xFFFF}, + {0x1950 , 0x197F , 94 , 0xFFFF}, + {0x1980 , 0x19DF , 95 , 0xFFFF}, + {0x19E0 , 0x19FF , 80 , 0xFFFF}, + {0x1A00 , 0x1A1F , 96 , 0xFFFF}, + {0x1A20 , 0x1AFF , 999, 0xFFFF}, + {0x1B00 , 0x1B7F , 27 , 0xFFFF}, + {0x1B80 , 0x1BBF , 112, 0xFFFF}, + {0x1BC0 , 0x1BFF , 999, 0xFFFF}, + {0x1C00 , 0x1C4F , 113, 0xFFFF}, + {0x1C50 , 0x1C7F , 114, 0xFFFF}, + {0x1C80 , 0x1CFF , 999, 0xFFFF}, + {0x1D00 , 0x1D7F , 4 , 0xFFFF}, + {0x1D80 , 0x1DBF , 4 , 0xFFFF}, + {0x1DC0 , 0x1DFF , 6 , 0xFFFF}, + {0x1E00 , 0x1EFF , 29 , 0xFFFF}, + {0x1F00 , 0x1FFF , 30 , 0xFFFF}, + {0x2000 , 0x206F , 31 , 0xFFFF}, + {0x2070 , 0x209F , 32 , 0xFFFF}, + {0x20A0 , 0x20CF , 33 , 0xFFFF}, + {0x20D0 , 0x20FF , 34 , 0xFFFF}, + {0x2100 , 0x214F , 35 , 0xFFFF}, + {0x2150 , 0x215F , 36 , 0xFFFF}, + {0x2160 , 0x216B , 36 , 936 }, + {0x216C , 0x216F , 36 , 0xFFFF}, + {0x2170 , 0x2179 , 36 , 936 }, + {0x217A , 0x218F , 36 , 0xFFFF}, + {0x2190 , 0x2199 , 37 , 949 }, + {0x219A , 0x21FF , 37 , 0xFFFF}, + {0x2200 , 0x22FF , 38 , 0xFFFF}, + {0x2300 , 0x23FF , 39 , 0xFFFF}, + {0x2400 , 0x243F , 40 , 0xFFFF}, + {0x2440 , 0x245F , 41 , 0xFFFF}, + {0x2460 , 0x2473 , 42 , 932 }, + {0x2474 , 0x249B , 42 , 936 }, + {0x249C , 0x24E9 , 42 , 949 }, + {0x24EA , 0x24FF , 42 , 0xFFFF}, + {0x2500 , 0x2573 , 43 , 936 }, + {0x2574 , 0x257F , 43 , 0xFFFF}, + {0x2580 , 0x2580 , 44 , 0xFFFF}, + {0x2581 , 0x258F , 44 , 936 }, + {0x2590 , 0x259F , 44 , 0xFFFF}, + {0x25A0 , 0x25FF , 45 , 0xFFFF}, + {0x2600 , 0x26FF , 46 , 0xFFFF}, + {0x2700 , 0x27BF , 47 , 0xFFFF}, + {0x27C0 , 0x27EF , 38 , 0xFFFF}, + {0x27F0 , 0x27FF , 37 , 0xFFFF}, + {0x2800 , 0x28FF , 82 , 0xFFFF}, + {0x2900 , 0x297F , 37 , 0xFFFF}, + {0x2980 , 0x29FF , 38 , 0xFFFF}, + {0x2A00 , 0x2AFF , 38 , 0xFFFF}, + {0x2B00 , 0x2BFF , 37 , 0xFFFF}, + {0x2C00 , 0x2C5F , 97 , 0xFFFF}, + {0x2C60 , 0x2C7F , 29 , 0xFFFF}, + {0x2C80 , 0x2CFF , 8 , 0xFFFF}, + {0x2D00 , 0x2D2F , 26 , 0xFFFF}, + {0x2D30 , 0x2D7F , 98 , 0xFFFF}, + {0x2D80 , 0x2DDF , 75 , 0xFFFF}, + {0x2DE0 , 0x2DFF , 9 , 0xFFFF}, + {0x2E00 , 0x2E7F , 31 , 0xFFFF}, + {0x2E80 , 0x2EFF , 59 , 0xFFFF}, + {0x2F00 , 0x2FDF , 59 , 0xFFFF}, + {0x2FE0 , 0x2FEF , 999, 0xFFFF}, + {0x2FF0 , 0x2FFF , 59 , 0xFFFF}, + {0x3000 , 0x303F , 48 , 0xFFFF}, + {0x3040 , 0x309F , 49 , 932 }, + {0x30A0 , 0x30FF , 50 , 932 }, + {0x3100 , 0x3129 , 51 , 936 }, + {0x312A , 0x312F , 51 , 0xFFFF}, + {0x3130 , 0x318F , 52 , 949 }, + {0x3190 , 0x319F , 59 , 0xFFFF}, + {0x31A0 , 0x31BF , 51 , 0xFFFF}, + {0x31C0 , 0x31EF , 61 , 0xFFFF}, + {0x31F0 , 0x31FF , 50 , 0xFFFF}, + {0x3200 , 0x321C , 54 , 949 }, + {0x321D , 0x325F , 54 , 0xFFFF}, + {0x3260 , 0x327F , 54 , 949 }, + {0x3280 , 0x32FF , 54 , 0xFFFF}, + {0x3300 , 0x3387 , 55 , 0xFFFF}, + {0x3388 , 0x33D0 , 55 , 949 }, + {0x33D1 , 0x33FF , 55 , 0xFFFF}, + {0x3400 , 0x4DBF , 59 , 0xFFFF}, + {0x4DC0 , 0x4DFF , 99 , 0xFFFF}, + {0x4E00 , 0x9FA5 , 59 , 936 }, + {0x9FA6 , 0x9FFF , 59 , 0xFFFF}, + {0xA000 , 0xA48F , 83 , 0xFFFF}, + {0xA490 , 0xA4CF , 83 , 0xFFFF}, + {0xA4D0 , 0xA4FF , 999, 0xFFFF}, + {0xA500 , 0xA63F , 12 , 0xFFFF}, + {0xA640 , 0xA69F , 9 , 0xFFFF}, + {0xA6A0 , 0xA6FF , 999, 0xFFFF}, + {0xA700 , 0xA71F , 5 , 0xFFFF}, + {0xA720 , 0xA7FF , 29 , 0xFFFF}, + {0xA800 , 0xA82F , 100, 0xFFFF}, + {0xA830 , 0xA8FF , 999, 0xFFFF}, + {0xA840 , 0xA87F , 53 , 0xFFFF}, + {0xA880 , 0xA8DF , 115, 0xFFFF}, + {0xA8E0 , 0xA8FF , 999, 0xFFFF}, + {0xA900 , 0xA92F , 116, 0xFFFF}, + {0xA930 , 0xA95F , 117, 0xFFFF}, + {0xA960 , 0xA9FF , 999, 0xFFFF}, + {0xAA00 , 0xAA5F , 118, 0xFFFF}, + {0xAA60 , 0xABFF , 999, 0xFFFF}, + {0xAC00 , 0xD7AF , 56 , 949 }, + {0xD7B0 , 0xD7FF , 999, 0xFFFF}, + {0xD800 , 0xDB7F , 57 , 0xFFFF}, + {0xDB80 , 0xDBFF , 57 , 0xFFFF}, + {0xDC00 , 0xDFFF , 57 , 0xFFFF}, + {0xE000 , 0xE814 , 60 , 0xFFFF}, + {0xE815 , 0xE864 , 60 , 936 }, + {0xE865 , 0xF8FF , 60 , 0xFFFF}, + {0xF900 , 0xFA0B , 61 , 949 }, + {0xFA0C , 0xFA0D , 61 , 936 }, + {0xFA0E , 0xFA2D , 61 , 932 }, + {0xFA2E , 0xFAFF , 61 , 0xFFFF}, + {0xFB00 , 0xFB4F , 62 , 0xFFFF}, + {0xFB50 , 0xFDFF , 63 , 1256 }, + {0xFE00 , 0xFE0F , 91 , 0xFFFF}, + {0xFE10 , 0xFE1F , 65 , 0xFFFF}, + {0xFE20 , 0xFE2F , 64 , 0xFFFF}, + {0xFE30 , 0xFE4F , 65 , 0xFFFF}, + {0xFE50 , 0xFE6F , 66 , 0xFFFF}, + {0xFE70 , 0xFEFF , 67 , 1256 }, + {0xFF00 , 0xFF5F , 68 , 936 }, + {0xFF60 , 0xFF9F , 68 , 932 }, + {0xFFA0 , 0xFFEF , 68 , 0xFFFF}, +}; +FGAS_LPCFONTUSB FGAS_GetUnicodeBitField(FX_WCHAR wUnicode) +{ + FX_INT32 iEnd = sizeof(g_FXGdiFontUSBTable) / sizeof(FGAS_FONTUSB) - 1; + FXSYS_assert(iEnd >= 0); + FX_INT32 iStart = 0, iMid; + do { + iMid = (iStart + iEnd) / 2; + const FGAS_FONTUSB &usb = g_FXGdiFontUSBTable[iMid]; + if (wUnicode < usb.wStartUnicode) { + iEnd = iMid - 1; + } else if (wUnicode > usb.wEndUnicode) { + iStart = iMid + 1; + } else { + return &usb; + } + } while (iStart <= iEnd); + return NULL; +} diff --git a/xfa/src/fgas/src/font/fx_fontutils.h b/xfa/src/fgas/src/font/fx_fontutils.h new file mode 100644 index 0000000000..1e3088fde8 --- /dev/null +++ b/xfa/src/fgas/src/font/fx_fontutils.h @@ -0,0 +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 _FGAS_FONTUTIL_H_ +#define _FGAS_FONTUTIL_H_ +typedef struct _FGAS_FONTUSB { + FX_WCHAR wStartUnicode; + FX_WCHAR wEndUnicode; + FX_WORD wBitField; + FX_WORD wCodePage; +} FGAS_FONTUSB, * FGAS_LPFONTUSB; +typedef FGAS_FONTUSB const * FGAS_LPCFONTUSB; +FX_DWORD FGAS_GetFontHashCode(FX_WORD wCodePage, FX_DWORD dwFontStyles); +FX_DWORD FGAS_GetFontFamilyHash(FX_LPCWSTR pszFontFamily, FX_DWORD dwFontStyles, FX_WORD wCodePage); +FGAS_LPCFONTUSB FGAS_GetUnicodeBitField(FX_WCHAR wUnicode); +#endif diff --git a/xfa/src/fgas/src/font/fx_gdifont.cpp b/xfa/src/fgas/src/font/fx_gdifont.cpp new file mode 100644 index 0000000000..e9ab665b5a --- /dev/null +++ b/xfa/src/fgas/src/font/fx_gdifont.cpp @@ -0,0 +1,532 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../fgas_base.h" +#include "fx_gdifont.h" +#include "fx_stdfontmgr.h" +#ifdef _FXPLUS +#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || _FX_OS_ == _FX_WIN64_ +CFX_GdiFontCache::CFX_GdiFontCache() + : m_GlyphMap(128) +{ +} +CFX_GdiFontCache::~CFX_GdiFontCache() +{ + FX_POSITION pos = m_GlyphMap.GetStartPosition(); + FX_INT32 iGlyph; + FX_LPGDIGOCACHE pGlyph; + while (pos != NULL) { + pGlyph = NULL; + m_GlyphMap.GetNextAssoc(pos, (void*&)iGlyph, (void*&)pGlyph); + if (pGlyph != NULL) { + FDE_Free(pGlyph->pOutline); + FDE_Free(pGlyph); + } + } + m_GlyphMap.RemoveAll(); +} +void CFX_GdiFontCache::SetCachedGlyphOutline(FX_DWORD dwGlyph, const GLYPHMETRICS &gm, FX_LPBYTE pOutline) +{ + FXSYS_assert(pOutline != NULL); + FX_LPGDIGOCACHE pGlyph = (FX_LPGDIGOCACHE)FDE_Alloc(sizeof(FX_GDIGOCACHE)); + pGlyph->gm = gm; + pGlyph->pOutline = pOutline; + m_GlyphMap.SetAt((void*)dwGlyph, (void*)pGlyph); +} +FX_LPCGDIGOCACHE CFX_GdiFontCache::GetCachedGlyphOutline(FX_DWORD dwGlyph) const +{ + FX_LPCGDIGOCACHE pGlyph = NULL; + if (!m_GlyphMap.Lookup((void*)dwGlyph, (void*&)pGlyph)) { + return FALSE; + } + return pGlyph; +} +IFX_Font* IFX_Font::LoadFont(FX_LPCWSTR pszFontFamily, FX_DWORD dwFontStyles, FX_WORD wCodePage, IFX_FontMgr *pFontMgr) +{ + CFX_GdiFont *pFont = FX_NEW CFX_GdiFont(pFontMgr); + if (!pFont->LoadFont(pszFontFamily, dwFontStyles, wCodePage)) { + pFont->Release(); + return NULL; + } + return pFont; +} +IFX_Font* IFX_Font::LoadFont(FX_LPCBYTE pBuffer, FX_INT32 iLength, IFX_FontMgr *pFontMgr) +{ + CFX_GdiFont *pFont = FX_NEW CFX_GdiFont(pFontMgr); + if (!pFont->LoadFont(pBuffer, iLength)) { + pFont->Release(); + return NULL; + } + return pFont; +} +IFX_Font* IFX_Font::LoadFont(FX_LPCWSTR pszFileName, IFX_FontMgr *pFontMgr) +{ + CFX_GdiFont *pFont = FX_NEW CFX_GdiFont(pFontMgr); + if (!pFont->LoadFont(pszFileName)) { + pFont->Release(); + return NULL; + } + return pFont; +} +IFX_Font* IFX_Font::LoadFont(IFX_Stream *pFontStream, IFX_FontMgr *pFontMgr, FX_BOOL bSaveStream ) +{ + CFX_GdiFont *pFont = FX_NEW CFX_GdiFont(pFontMgr); + if (!pFont->LoadFont(pFontStream)) { + pFont->Release(); + return NULL; + } + return pFont; +} +IFX_Font* IFX_Font::LoadFont(CFX_Font *pExtFont, IFX_FontMgr *pFontMgr) +{ + FXSYS_assert(FALSE); + return NULL; +} +#define FX_GDIFONT_FONTCACHESIZE 8 +CFX_GdiFont::CFX_GdiFont(IFX_FontMgr *pFontMgr) + : m_pFontMgr(pFontMgr) + , m_iRefCount(1) + , m_WidthCache(1024) + , m_hOldFont(NULL) + , m_hFont(NULL) + , m_hDC(NULL) + , m_wsFontFileName() + , m_FontFamilies() + , m_hRes(NULL) + , m_dwStyles(0) + , m_SubstFonts() + , m_FontMapper(16) + , m_FontCache(FX_GDIFONT_FONTCACHESIZE) +{ + m_hDC = ::CreateCompatibleDC(NULL); + FX_memset(&m_LogFont, 0, sizeof(m_LogFont)); + FXSYS_assert(m_hDC != NULL); +} +CFX_GdiFont::~CFX_GdiFont() +{ + FX_INT32 iCount = m_SubstFonts.GetSize(); + for (FX_INT32 i = 0; i < iCount; i ++) { + IFX_Font *pFont = (IFX_Font*)m_SubstFonts[i]; + pFont->Release(); + } + m_SubstFonts.RemoveAll(); + m_FontMapper.RemoveAll(); + if (m_hFont != NULL) { + ::SelectObject(m_hDC, m_hOldFont); + ::DeleteObject(m_hFont); + } + ::DeleteDC(m_hDC); + if (m_hRes != NULL) { + if (m_wsFontFileName.GetLength() > 0) { + ::RemoveFontResourceW((FX_LPCWSTR)m_wsFontFileName); + } else { + ::RemoveFontMemResourceEx(m_hRes); + } + } + m_WidthCache.RemoveAll(); + ClearCache(); +} +void CFX_GdiFont::ClearCache() +{ + FX_INT32 iCount = m_SubstFonts.GetSize(); + for (FX_INT32 i = 0; i < iCount; i ++) { + IFX_Font *pFont = (IFX_Font*)m_SubstFonts[i]; + ((CFX_GdiFont*)pFont)->ClearCache(); + } + FX_POSITION pos = m_FontCache.GetStartPosition(); + FX_DWORD dwMAT2; + CFX_GdiFontCache *pCache; + while (pos != NULL) { + pCache = NULL; + m_FontCache.GetNextAssoc(pos, (void*&)dwMAT2, (void*&)pCache); + if (pCache != NULL) { + delete pCache; + } + } + m_FontCache.RemoveAll(); +} +void CFX_GdiFont::Release() +{ + if (-- m_iRefCount < 1) { + if (m_pFontMgr != NULL) { + m_pFontMgr->RemoveFont(this); + } + delete this; + } +} +IFX_Font* CFX_GdiFont::Retain() +{ + ++ m_iRefCount; + return this; +} +FX_BOOL CFX_GdiFont::LoadFont(FX_LPCWSTR pszFontFamily, FX_DWORD dwFontStyles, FX_WORD wCodePage) +{ + FXSYS_assert(m_hFont == NULL); + LOGFONTW lf; + FX_memset(&lf, 0, sizeof(lf)); + lf.lfHeight = -1000; + lf.lfWeight = (dwFontStyles & FX_FONTSTYLE_Bold) ? FW_BOLD : FW_NORMAL; + lf.lfItalic = (dwFontStyles & FX_FONTSTYLE_Italic) != 0; + lf.lfPitchAndFamily = (dwFontStyles & FX_FONTSTYLE_FixedPitch) ? FIXED_PITCH : VARIABLE_PITCH; + if (dwFontStyles & FX_FONTSTYLE_Serif) { + lf.lfPitchAndFamily |= FF_ROMAN; + } + if (dwFontStyles & FX_FONTSTYLE_Script) { + lf.lfPitchAndFamily |= FF_SCRIPT; + } + if (dwFontStyles & FX_FONTSTYLE_Symbolic) { + lf.lfCharSet = SYMBOL_CHARSET; + } else { + FX_WORD wCharSet = FX_GetCharsetFromCodePage(wCodePage); + lf.lfCharSet = wCharSet != 0xFFFF ? (FX_BYTE)wCharSet : DEFAULT_CHARSET; + } + if (pszFontFamily == NULL) { + lf.lfFaceName[0] = L'\0'; + } else { + FXSYS_wcsncpy(lf.lfFaceName, pszFontFamily, 31); + } + return LoadFont(lf); +} +FX_BOOL CFX_GdiFont::LoadFont(FX_LPCBYTE pBuffer, FX_INT32 iLength) +{ + FXSYS_assert(m_hFont == NULL && pBuffer != NULL && iLength > 0); + Gdiplus::PrivateFontCollection pfc; + if (pfc.AddMemoryFont(pBuffer, iLength) != Gdiplus::Ok) { + return FALSE; + } + if (GetFontFamilies(pfc) < 1) { + return FALSE; + } + FX_DWORD dwCount = 0; + m_hRes = ::AddFontMemResourceEx((void*)pBuffer, iLength, 0, &dwCount); + if (m_hRes == NULL) { + return FALSE; + } + CFX_WideString wsFamily = m_FontFamilies[0]; + m_hFont = ::CreateFontW(-1000, 0, 0, 0, FW_NORMAL, FALSE, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, (FX_LPCWSTR)wsFamily); + if (m_hFont == NULL) { + ::RemoveFontMemResourceEx(m_hRes); + m_hRes = NULL; + return FALSE; + } + RetrieveFontStyles(); + m_hOldFont = ::SelectObject(m_hDC, m_hFont); + ::GetOutlineTextMetricsW(m_hDC, sizeof(m_OutlineTM), &m_OutlineTM); + return TRUE; +} +FX_BOOL CFX_GdiFont::LoadFont(FX_LPCWSTR pszFileName) +{ + FXSYS_assert(m_hFont == NULL && pszFileName != NULL); + Gdiplus::PrivateFontCollection pfc; + if (pfc.AddFontFile(pszFileName) != Gdiplus::Ok) { + return FALSE; + } + if (GetFontFamilies(pfc) < 1) { + return FALSE; + } + m_wsFontFileName = pszFileName; + m_hRes = (HANDLE)::AddFontResourceW(pszFileName); + if (m_hRes == NULL) { + return FALSE; + } + CFX_WideString wsFamily = m_FontFamilies[0]; + m_hFont = ::CreateFontW(-1000, 0, 0, 0, FW_NORMAL, FALSE, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, (FX_LPCWSTR)wsFamily); + if (m_hFont == NULL) { + ::RemoveFontResourceW(pszFileName); + m_hRes = NULL; + return FALSE; + } + RetrieveFontStyles(); + ::SelectObject(m_hDC, m_hFont); + ::GetOutlineTextMetricsW(m_hDC, sizeof(m_OutlineTM), &m_OutlineTM); + return TRUE; +} +FX_BOOL CFX_GdiFont::LoadFont(IFX_Stream *pFontStream) +{ + FXSYS_assert(m_hFont == NULL && pFontStream != NULL); + FX_INT32 iLength = pFontStream->GetLength(); + if (iLength < 1) { + return FALSE; + } + FX_LPBYTE pBuf = (FX_LPBYTE)FDE_Alloc(iLength); + if (pBuf == NULL) { + return FALSE; + } + iLength = pFontStream->ReadData(pBuf, iLength); + FX_BOOL bRet = LoadFont(pBuf, iLength); + FDE_Free(pBuf); + return bRet; +} +FX_BOOL CFX_GdiFont::LoadFont(const LOGFONTW &lf) +{ + FXSYS_assert(m_hFont == NULL); + m_hFont = ::CreateFontIndirectW((LPLOGFONTW)&lf); + if (m_hFont == NULL) { + return FALSE; + } + RetrieveFontStyles(); + ::SelectObject(m_hDC, m_hFont); + ::GetOutlineTextMetricsW(m_hDC, sizeof(m_OutlineTM), &m_OutlineTM); + return TRUE; +} +FX_INT32 CFX_GdiFont::GetFontFamilies(Gdiplus::FontCollection &fc) +{ + FX_INT32 iCount = fc.GetFamilyCount(); + if (iCount < 1) { + return iCount; + } + Gdiplus::FontFamily *pFontFamilies = (Gdiplus::FontFamily*)FDE_Alloc(iCount * sizeof(Gdiplus::FontFamily)); + if (pFontFamilies == NULL) { + return -1; + } + FX_INT32 iFind = 0; + fc.GetFamilies(iCount, pFontFamilies, &iFind); + for (FX_INT32 i = 0; i < iCount; i ++) { + CFX_WideString wsFamilyName; + FX_LPWSTR pName = wsFamilyName.GetBuffer(LF_FACESIZE); + pFontFamilies[i].GetFamilyName(pName); + wsFamilyName.ReleaseBuffer(); + m_FontFamilies.Add(wsFamilyName); + } + FDE_Free(pFontFamilies); + return iCount; +} +void CFX_GdiFont::RetrieveFontStyles() +{ + FXSYS_assert(m_hFont != NULL); + FX_memset(&m_LogFont, 0, sizeof(m_LogFont)); + ::GetObjectW(m_hFont, sizeof(m_LogFont), &m_LogFont); + m_dwStyles = FX_GetGdiFontStyles(m_LogFont); +} +void CFX_GdiFont::GetFamilyName(CFX_WideString &wsFamily) const +{ + FXSYS_assert(m_hFont != NULL); + wsFamily = m_LogFont.lfFaceName; +} +FX_BOOL CFX_GdiFont::GetCharWidth(FX_WCHAR wUnicode, FX_INT32 &iWidth, FX_BOOL bRecursive, FX_BOOL bCharCode) +{ + iWidth = (FX_INT32)(FX_SHORT)m_WidthCache.GetAt(wUnicode, 0); + if (iWidth == 0 || iWidth == -1) { + IFX_Font *pFont = NULL; + FX_INT32 iGlyph = GetGlyphIndex(wUnicode, TRUE, &pFont, bCharCode); + if (iGlyph != 0xFFFF && pFont != NULL) { + if (pFont == (IFX_Font*)this) { + if (!::GetCharWidthI(m_hDC, iGlyph, 1, NULL, &iWidth)) { + iWidth = -1; + } + } else if (((CFX_GdiFont*)pFont)->GetCharWidth(wUnicode, iWidth, FALSE, bCharCode)) { + return TRUE; + } + } else { + iWidth = -1; + } + Lock(); + m_WidthCache.SetAtGrow(wUnicode, (FX_SHORT)iWidth); + Unlock(); + } + return iWidth > 0; +} +FX_BOOL CFX_GdiFont::GetCharWidth(FX_WCHAR wUnicode, FX_INT32 &iWidth, FX_BOOL bCharCode) +{ + return GetCharWidth(wUnicode, iWidth, TRUE, bCharCode); +} +FX_INT32 CFX_GdiFont::GetGlyphIndex(FX_WCHAR wUnicode, FX_BOOL bRecursive, IFX_Font **ppFont, FX_BOOL bCharCode) +{ + FX_INT32 iGlyph = 0XFFFF; + if (::GetGlyphIndicesW(m_hDC, &wUnicode, 1, (LPWORD)&iGlyph, GGI_MARK_NONEXISTING_GLYPHS) != GDI_ERROR && iGlyph != 0xFFFF) { + if (ppFont != NULL) { + *ppFont = (IFX_Font*)this; + } + return iGlyph; + } + FX_LPCFONTUSB pFontUSB = FX_GetUnicodeBitField(wUnicode); + if (pFontUSB == NULL) { + return 0xFFFF; + } + FX_WORD wBitField = pFontUSB->wBitField; + if (wBitField >= 128) { + return 0xFFFF; + } + IFX_Font *pFont = NULL; + m_FontMapper.Lookup((void*)wBitField, (void*&)pFont); + if (pFont != NULL && pFont != (IFX_Font*)this) { + iGlyph = ((CFX_GdiFont*)pFont)->GetGlyphIndex(wUnicode, FALSE, NULL, bCharCode); + if (iGlyph != 0xFFFF) { + FX_INT32 i = m_SubstFonts.Find(pFont); + if (i > -1) { + iGlyph |= ((i + 1) << 24); + if (ppFont != NULL) { + *ppFont = pFont; + } + return iGlyph; + } + } + } + if (m_pFontMgr != NULL && bRecursive) { + IFX_Font *pFont = m_pFontMgr->GetDefFontByUnicode(wUnicode, m_dwStyles, m_LogFont.lfFaceName); + if (pFont != NULL) { + if (pFont == (IFX_Font*)this) { + pFont->Release(); + return 0xFFFF; + } + m_FontMapper.SetAt((void*)wBitField, (void*)pFont); + FX_INT32 i = m_SubstFonts.GetSize(); + m_SubstFonts.Add(pFont); + iGlyph = ((CFX_GdiFont*)pFont)->GetGlyphIndex(wUnicode, FALSE, NULL, bCharCode); + if (iGlyph != 0xFFFF) { + iGlyph |= ((i + 1) << 24); + if (ppFont != NULL) { + *ppFont = pFont; + } + return iGlyph; + } + } + } + return 0xFFFF; +} +FX_INT32 CFX_GdiFont::GetGlyphIndex(FX_WCHAR wUnicode, FX_BOOL bCharCode) +{ + return GetGlyphIndex(wUnicode, TRUE, NULL, bCharCode); +} +FX_INT32 CFX_GdiFont::GetAscent() const +{ + return m_OutlineTM.otmAscent; +} +FX_INT32 CFX_GdiFont::GetDescent() const +{ + return m_OutlineTM.otmDescent; +} +FX_BOOL CFX_GdiFont::GetCharBBox(FX_WCHAR wUnicode, CFX_Rect &bbox, FX_BOOL bCharCode) +{ + FX_INT32 iGlyphIndex = GetGlyphIndex(wUnicode, bCharCode); + if (iGlyphIndex == 0xFFFF) { + return FALSE; + } + IFX_Font *pFont = GetSubstFont(iGlyphIndex); + if (pFont == NULL) { + return FALSE; + } + GLYPHMETRICS gm; + iGlyphIndex &= 0x00FFFFFF; + static const MAT2 mat2 = {{0, 1}, {0, 0}, {0, 0}, {0, 1}}; + if (::GetGlyphOutlineW(((CFX_GdiFont*)pFont)->m_hDC, iGlyphIndex, GGO_GLYPH_INDEX | GGO_METRICS, &gm, 0, NULL, &mat2) != GDI_ERROR) { + bbox.left = gm.gmptGlyphOrigin.x; + bbox.top = gm.gmptGlyphOrigin.y; + bbox.width = gm.gmBlackBoxX; + bbox.height = gm.gmBlackBoxY; + return TRUE; + } + return FALSE; +} +FX_BOOL CFX_GdiFont::GetBBox(CFX_Rect &bbox) +{ + bbox.left = m_OutlineTM.otmrcFontBox.left; + bbox.top = m_OutlineTM.otmrcFontBox.top; + bbox.width = m_OutlineTM.otmrcFontBox.right - m_OutlineTM.otmrcFontBox.left; + bbox.height = m_OutlineTM.otmrcFontBox.bottom - m_OutlineTM.otmrcFontBox.top; + return TRUE; +} +FX_INT32 CFX_GdiFont::GetItalicAngle() const +{ + return m_OutlineTM.otmItalicAngle / 10; +} +void CFX_GdiFont::Reset() +{ + Lock(); + m_WidthCache.RemoveAll(); + ClearCache(); + Unlock(); +} +IFX_Font* CFX_GdiFont::GetSubstFont(FX_INT32 iGlyphIndex) const +{ + FX_INT32 iHigher = (iGlyphIndex & 0x7F000000) >> 24; + if (iHigher == 0) { + return (IFX_Font*)this; + } + if (iHigher > m_SubstFonts.GetSize()) { + return (IFX_Font*)this; + } + return (IFX_Font*)m_SubstFonts[iHigher - 1]; +} +FX_DWORD CFX_GdiFont::GetGlyphDIBits(FX_INT32 iGlyphIndex, FX_ARGB argb, const MAT2 *pMatrix, GLYPHMETRICS &gm, FX_LPVOID pBuffer, FX_DWORD bufSize) +{ + static const UINT uFormat = GGO_GLYPH_INDEX | GGO_GRAY8_BITMAP; + IFX_Font *pFont = GetSubstFont(iGlyphIndex); + if (pFont == NULL) { + return 0; + } + if (pFont != (IFX_Font*)this) { + return ((CFX_GdiFont*)pFont)->GetGlyphDIBits(iGlyphIndex & 0x00FFFFFF, argb, pMatrix, gm, pBuffer, bufSize); + } + FX_LPBYTE pGlyphOutline = NULL; + FXSYS_assert(pMatrix != NULL); + FX_DWORD dwMAT2 = GetMAT2HashCode((const FIXED*)pMatrix); + CFX_GdiFontCache *pCache = NULL; + if (m_FontCache.Lookup((void*)dwMAT2, (void*&)pCache) && pCache != NULL) { + FX_LPCGDIGOCACHE pGO = pCache->GetCachedGlyphOutline(iGlyphIndex); + if (pGO != NULL) { + gm = pGO->gm; + pGlyphOutline = pGO->pOutline; + } + } + if (pGlyphOutline == NULL) { + FX_DWORD dwGlyphSize = ::GetGlyphOutlineW(m_hDC, iGlyphIndex, uFormat, &gm, 0, NULL, pMatrix); + if (dwGlyphSize == 0 || dwGlyphSize == GDI_ERROR) { + return 0; + } + pGlyphOutline = (FX_LPBYTE)FX_Alloc(dwGlyphSize); + ::GetGlyphOutlineW(m_hDC, iGlyphIndex, uFormat, &gm, dwGlyphSize, pGlyphOutline, pMatrix); + if (pCache == NULL) { + pCache = FX_NEW CFX_GdiFontCache; + if (m_FontCache.GetCount() >= FX_GDIFONT_FONTCACHESIZE) { + ClearCache(); + } + m_FontCache.SetAt((void*)dwMAT2, (void*)pCache); + } + pCache->SetCachedGlyphOutline(iGlyphIndex, gm, pGlyphOutline); + } + FX_DWORD dwDibSize = gm.gmBlackBoxX * 4 * gm.gmBlackBoxY; + if (pBuffer == NULL || bufSize < dwDibSize) { + return dwDibSize; + } + CreateGlyphBitmap(gm.gmBlackBoxX, gm.gmBlackBoxY, pGlyphOutline, (FX_LPDWORD)pBuffer, argb); + return dwDibSize; +} +FX_DWORD CFX_GdiFont::GetHashCode() const +{ + return FX_GetFontHashCode(FX_GetCodePageFromCharset(m_LogFont.lfCharSet), FX_GetGdiFontStyles(m_LogFont)); +} +FX_DWORD CFX_GdiFont::GetMAT2HashCode(const FIXED *pFixed) +{ + FXSYS_assert(pFixed != NULL); + FX_DWORD dwHash1 = 0, dwHash2 = 5381, dwRet; + for (int i = 0; i < 4; i ++) { + dwRet = *((const FX_DWORD*)pFixed); + dwHash1 = 1313 * dwHash1 + dwRet; + dwHash2 += (dwHash2 << 5) + dwRet; + pFixed ++; + } + return ((dwHash1 & 0x0000FFFF) << 16) | (dwHash2 & 0x0000FFFF); +} +void CFX_GdiFont::CreateGlyphBitmap(FX_INT32 iWidth, FX_INT32 iHeight, FX_LPBYTE pOutline, FX_LPDWORD pDIB, FX_ARGB argb) +{ + FX_INT32 padding = ((iWidth + 3) / 4) * 4 - iWidth; + FX_DWORD alpha; + FX_INT32 i, j; + for (j = iHeight - 1; j >= 0; --j) { + for (i = iWidth - 1; i >= 0; --i) { + if ((alpha = *pOutline++) == 0) { + *pDIB++ = 0; + } else { + alpha = (argb >> 24) * (alpha * 4 - 1) / 256; + *pDIB++ = (alpha << 24) | (argb & 0x00FFFFFF); + } + } + pOutline += padding; + } +} +#endif +#endif diff --git a/xfa/src/fgas/src/font/fx_gdifont.h b/xfa/src/fgas/src/font/fx_gdifont.h new file mode 100644 index 0000000000..f6d88f38a0 --- /dev/null +++ b/xfa/src/fgas/src/font/fx_gdifont.h @@ -0,0 +1,89 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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_GDIOBJECT_IMP +#define _FX_GDIOBJECT_IMP +#ifdef _FXPLUS +#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || _FX_OS_ == _FX_WIN64_ +typedef struct _FX_GDIGOCACHE { + GLYPHMETRICS gm; + FX_LPBYTE pOutline; +} FX_GDIGOCACHE, * FX_LPGDIGOCACHE; +typedef FX_GDIGOCACHE const * FX_LPCGDIGOCACHE; +class CFX_GdiFontCache : public CFX_Object +{ +public: + CFX_GdiFontCache(); + ~CFX_GdiFontCache(); + void SetCachedGlyphOutline(FX_DWORD dwGlyph, const GLYPHMETRICS &gm, FX_LPBYTE pOutline); + FX_LPCGDIGOCACHE GetCachedGlyphOutline(FX_DWORD dwGlyph) const; +protected: + CFX_MapPtrToPtr m_GlyphMap; +}; +class CFX_GdiFont : public IFX_Font, public CFX_ThreadLock, public CFX_Object +{ +public: + CFX_GdiFont(IFX_FontMgr *pFontMgr); + ~CFX_GdiFont(); + virtual void Release(); + virtual IFX_Font* Retain(); + FX_BOOL LoadFont(FX_LPCWSTR pszFontFamily, FX_DWORD dwFontStyles, FX_WORD wCodePage); + FX_BOOL LoadFont(FX_LPCBYTE pBuffer, FX_INT32 iLength); + FX_BOOL LoadFont(FX_LPCWSTR pszFileName); + FX_BOOL LoadFont(IFX_Stream *pFontStream); + FX_BOOL LoadFont(const LOGFONTW &lf); + virtual IFX_Font* Derive(FX_DWORD dwFontStyles, FX_WORD wCodePage = 0) + { + return NULL; + } + virtual void GetFamilyName(CFX_WideString &wsFamily) const; + virtual FX_DWORD GetFontStyles() const + { + return m_dwStyles; + } + virtual FX_BYTE GetCharSet() const + { + return m_LogFont.lfCharSet; + } + virtual FX_BOOL GetCharWidth(FX_WCHAR wUnicode, FX_INT32 &iWidth, FX_BOOL bCharCode = FALSE); + virtual FX_INT32 GetGlyphIndex(FX_WCHAR wUnicode, FX_BOOL bCharCode = FALSE); + virtual FX_INT32 GetAscent() const; + virtual FX_INT32 GetDescent() const; + virtual FX_BOOL GetCharBBox(FX_WCHAR wUnicode, CFX_Rect &bbox, FX_BOOL bCharCode = FALSE); + virtual FX_BOOL GetBBox(CFX_Rect &bbox); + virtual FX_INT32 GetItalicAngle() const; + virtual void Reset(); + FX_DWORD GetGlyphDIBits(FX_INT32 iGlyphIndex, FX_ARGB argb, const MAT2 *pMatrix, GLYPHMETRICS &gm, FX_LPVOID pBuffer, FX_DWORD bufSize); + FX_DWORD GetHashCode() const; +protected: + IFX_FontMgr *m_pFontMgr; + FX_INT32 m_iRefCount; + CFX_WordDiscreteArray m_WidthCache; + OUTLINETEXTMETRICW m_OutlineTM; + HGDIOBJ m_hOldFont; + HFONT m_hFont; + HDC m_hDC; + LOGFONTW m_LogFont; + CFX_WideString m_wsFontFileName; + CFX_WideStringArray m_FontFamilies; + HANDLE m_hRes; + FX_DWORD m_dwStyles; + CFX_PtrArray m_SubstFonts; + CFX_MapPtrToPtr m_FontMapper; + CFX_MapPtrToPtr m_FontCache; + void ClearCache(); + FX_INT32 GetFontFamilies(Gdiplus::FontCollection &fc); + void RetrieveFontStyles(); + IFX_Font* GetSubstFont(FX_INT32 iGlyphIndex) const; + FX_BOOL GetCharWidth(FX_WCHAR wUnicode, FX_INT32 &iWidth, FX_BOOL bRecursive, FX_BOOL bCharCode = FALSE); + FX_INT32 GetGlyphIndex(FX_WCHAR wUnicode, FX_BOOL bRecursive, IFX_Font **ppFont, FX_BOOL bCharCode = FALSE); + FX_DWORD GetMAT2HashCode(const FIXED *pFixed); + void CreateGlyphBitmap(FX_INT32 iWidth, FX_INT32 iHeight, FX_LPBYTE pOutline, FX_LPDWORD pDIB, FX_ARGB argb); + friend class CFX_GdiFontMgr; +}; +#endif +#endif +#endif diff --git a/xfa/src/fgas/src/font/fx_gefont.cpp b/xfa/src/fgas/src/font/fx_gefont.cpp new file mode 100644 index 0000000000..f952bc730e --- /dev/null +++ b/xfa/src/fgas/src/font/fx_gefont.cpp @@ -0,0 +1,595 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../fgas_base.h" +#include "fx_gefont.h" +#include "fx_fontutils.h" +#ifndef _FXPLUS +IFX_Font* IFX_Font::LoadFont(FX_LPCWSTR pszFontFamily, FX_DWORD dwFontStyles, FX_WORD wCodePage, IFX_FontMgr *pFontMgr) +{ +#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ + if (NULL != pFontMgr) { + return pFontMgr->GetFontByCodePage(wCodePage, dwFontStyles, pszFontFamily); + } + return NULL; +#else + CFX_GEFont *pFont = FX_NEW CFX_GEFont(pFontMgr); + if (!pFont->LoadFont(pszFontFamily, dwFontStyles, wCodePage)) { + pFont->Release(); + return NULL; + } + return pFont; +#endif +} +IFX_Font* IFX_Font::LoadFont(FX_LPCBYTE pBuffer, FX_INT32 iLength, IFX_FontMgr *pFontMgr) +{ +#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ + if (NULL != pFontMgr) { + return pFontMgr->LoadFont(pBuffer, iLength, 0, NULL); + } + return NULL; +#else + CFX_GEFont *pFont = FX_NEW CFX_GEFont(pFontMgr); + if (!pFont->LoadFont(pBuffer, iLength)) { + pFont->Release(); + return NULL; + } + return pFont; +#endif +} +IFX_Font* IFX_Font::LoadFont(FX_LPCWSTR pszFileName, IFX_FontMgr *pFontMgr) +{ +#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ + if (NULL != pFontMgr) { + return pFontMgr->LoadFont(pszFileName, 0, NULL); + } + return NULL; +#else + CFX_GEFont *pFont = FX_NEW CFX_GEFont(pFontMgr); + if (!pFont->LoadFont(pszFileName)) { + pFont->Release(); + return NULL; + } + return pFont; +#endif +} +IFX_Font* IFX_Font::LoadFont(IFX_Stream *pFontStream, IFX_FontMgr *pFontMgr, FX_BOOL bSaveStream) +{ +#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ + if (NULL != pFontMgr) { + return pFontMgr->LoadFont(pFontStream, 0, NULL); + } + return NULL; +#else + CFX_GEFont *pFont = FX_NEW CFX_GEFont(pFontMgr); + if (!pFont->LoadFont(pFontStream, bSaveStream)) { + pFont->Release(); + return NULL; + } + return pFont; +#endif +} +IFX_Font* IFX_Font::LoadFont(CFX_Font *pExtFont, IFX_FontMgr *pFontMgr, FX_BOOL bTakeOver) +{ + CFX_GEFont *pFont = FX_NEW CFX_GEFont(pFontMgr); + if (!pFont->LoadFont(pExtFont, bTakeOver)) { + pFont->Release(); + return NULL; + } + return pFont; +} +CFX_GEFont::CFX_GEFont(IFX_FontMgr *pFontMgr) + : CFX_ThreadLock() + , m_pFont(NULL) + , m_pFontMgr(pFontMgr) + , m_iRefCount(1) + , m_bExtFont(FALSE) + , m_pStream(NULL) + , m_pFileRead(NULL) + , m_pFontEncoding(NULL) + , m_pCharWidthMap(NULL) + , m_pRectArray(NULL) + , m_pBBoxMap(NULL) + , m_wCharSet(0xFFFF) + , m_pProvider(NULL) +#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ + , m_bUseLogFontStyle(FALSE) + , m_dwLogFontStyle(0) +#endif + , m_SubstFonts() + , m_FontMapper(16) +{ +} +CFX_GEFont::CFX_GEFont(const CFX_GEFont &src, FX_DWORD dwFontStyles) + : CFX_ThreadLock() + , m_pFont(NULL) + , m_pFontMgr(src.m_pFontMgr) + , m_iRefCount(1) + , m_bExtFont(FALSE) + , m_pStream(NULL) + , m_pFileRead(NULL) + , m_pFontEncoding(NULL) + , m_pCharWidthMap(NULL) + , m_pRectArray(NULL) + , m_pBBoxMap(NULL) + , m_wCharSet(0xFFFF) + , m_pProvider(NULL) + , m_SubstFonts() + , m_FontMapper(16) +{ + m_pFont = FX_NEW CFX_Font; + FXSYS_assert(m_pFont != NULL); + FXSYS_assert(src.m_pFont != NULL); + m_pFont->LoadClone(src.m_pFont); + CFX_SubstFont *&pSubst = m_pFont->m_pSubstFont; + if (pSubst == NULL) { + pSubst = FX_NEW CFX_SubstFont; + } + if (pSubst) { + pSubst->m_Weight = (dwFontStyles & FX_FONTSTYLE_Bold) ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL; + if (dwFontStyles & FX_FONTSTYLE_Italic) { + pSubst->m_SubstFlags |= FXFONT_SUBST_ITALIC; + } + } + InitFont(); +} +CFX_GEFont::~CFX_GEFont() +{ + FX_INT32 iCount = m_SubstFonts.GetSize(); + for (FX_INT32 i = 0; i < iCount; i ++) { + IFX_Font *pFont = (IFX_Font*)m_SubstFonts[i]; + pFont->Release(); + } + m_SubstFonts.RemoveAll(); + m_FontMapper.RemoveAll(); + if (m_pFileRead != NULL) { + m_pFileRead->Release(); + } + if (m_pStream != NULL) { + m_pStream->Release(); + } + if (m_pFontEncoding != NULL) { + delete m_pFontEncoding; + } + if (m_pCharWidthMap != NULL) { + FXTARGET_Delete m_pCharWidthMap; + } + if (m_pRectArray != NULL) { + FXTARGET_Delete m_pRectArray; + } + if (m_pBBoxMap != NULL) { + delete m_pBBoxMap; + } + if (m_pFont != NULL && !m_bExtFont) { + delete m_pFont; + } +} +void CFX_GEFont::Release() +{ + if (-- m_iRefCount < 1) { + if (m_pFontMgr != NULL) { + m_pFontMgr->RemoveFont(this); + } + delete this; + } +} +IFX_Font* CFX_GEFont::Retain() +{ + ++ m_iRefCount; + return this; +} +FX_BOOL CFX_GEFont::LoadFont(FX_LPCWSTR pszFontFamily, FX_DWORD dwFontStyles, FX_WORD wCodePage) +{ + if (m_pFont != NULL) { + return FALSE; + } + Lock(); + CFX_ByteString csFontFamily; + if (pszFontFamily != NULL) { + csFontFamily = CFX_ByteString::FromUnicode(pszFontFamily); + } + FX_DWORD dwFlags = 0; + if (dwFontStyles & FX_FONTSTYLE_FixedPitch) { + dwFlags |= FXFONT_FIXED_PITCH; + } + if (dwFontStyles & FX_FONTSTYLE_Serif) { + dwFlags |= FXFONT_SERIF; + } + if (dwFontStyles & FX_FONTSTYLE_Symbolic) { + dwFlags |= FXFONT_SYMBOLIC; + } + if (dwFontStyles & FX_FONTSTYLE_Script) { + dwFlags |= FXFONT_SCRIPT; + } + if (dwFontStyles & FX_FONTSTYLE_Italic) { + dwFlags |= FXFONT_ITALIC; + } + if (dwFontStyles & FX_FONTSTYLE_Bold) { + dwFlags |= FXFONT_BOLD; + } + if (dwFontStyles & FX_FONTSTYLE_ExactMatch) { + dwFlags |= FXFONT_EXACTMATCH; + } + FX_INT32 iWeight = (dwFontStyles & FX_FONTSTYLE_Bold) ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL; + FX_WORD wCharSet = FX_GetCharsetFromCodePage(wCodePage); + if (wCharSet == 0xFFFF) { + wCharSet = FXSYS_GetACP(); + } + m_wCharSet = wCharSet; + m_pFont = FX_NEW CFX_Font; + if ((dwFlags & FXFONT_ITALIC) && (dwFlags & FXFONT_BOLD)) { + csFontFamily += ",BoldItalic"; + } else if (dwFlags & FXFONT_BOLD) { + csFontFamily += ",Bold"; + } else if (dwFlags & FXFONT_ITALIC) { + csFontFamily += ",Italic"; + } + FX_BOOL bRet = m_pFont->LoadSubst(csFontFamily, TRUE, dwFlags, iWeight, 0, wCodePage); + bRet = m_pFont->m_Face != NULL; + if (bRet) { + InitFont(); + } + Unlock(); + return bRet; +} +FX_BOOL CFX_GEFont::LoadFont(FX_LPCBYTE pBuffer, FX_INT32 length) +{ + if (m_pFont != NULL) { + return FALSE; + } + Lock(); + m_pFont = FX_NEW CFX_Font; + FX_BOOL bRet = m_pFont->LoadEmbedded(pBuffer, length); + if (bRet) { + InitFont(); + } + m_wCharSet = 0xFFFF; + Unlock(); + return bRet; +} +FX_BOOL CFX_GEFont::LoadFont(FX_LPCWSTR pszFileName) +{ + if (m_pFont != NULL) { + return FALSE; + } + if (m_pStream != NULL) { + return FALSE; + } + if (m_pFileRead != NULL) { + return FALSE; + } + Lock(); + m_pStream = IFX_Stream::CreateStream(pszFileName, FX_STREAMACCESS_Binary | FX_STREAMACCESS_Read); + m_pFileRead = FX_CreateFileRead(m_pStream); + FX_BOOL bRet = FALSE; + if (m_pStream != NULL && m_pFileRead != NULL) { + m_pFont = FX_NEW CFX_Font; + bRet = m_pFont->LoadFile(m_pFileRead); + if (!bRet) { + m_pFileRead->Release(); + m_pFileRead = NULL; + } else { + InitFont(); + } + } + m_wCharSet = 0xFFFF; + Unlock(); + return bRet; +} +FX_BOOL CFX_GEFont::LoadFont(IFX_Stream *pFontStream, FX_BOOL bSaveStream) +{ + if (m_pFont != NULL) { + return FALSE; + } + if (pFontStream == NULL || pFontStream->GetLength() < 1) { + return FALSE; + } + if (m_pFileRead != NULL) { + return FALSE; + } + Lock(); + if (bSaveStream) { + m_pStream = pFontStream; + } + m_pFileRead = FX_CreateFileRead(pFontStream); + m_pFont = FX_NEW CFX_Font; + FX_BOOL bRet = m_pFont->LoadFile(m_pFileRead); + if (!bRet) { + m_pFileRead->Release(); + m_pFileRead = NULL; + } else { + InitFont(); + } + m_wCharSet = 0xFFFF; + Unlock(); + return bRet; +} +FX_BOOL CFX_GEFont::LoadFont(CFX_Font *pExtFont, FX_BOOL bTakeOver) +{ + if (m_pFont != NULL) { + return FALSE; + } + if (pExtFont == NULL) { + return FALSE; + } + Lock(); + if ((m_pFont = pExtFont) != NULL) { + m_bExtFont = !bTakeOver; + InitFont(); + } else { + m_bExtFont = TRUE; + } + m_wCharSet = 0xFFFF; + Unlock(); + return m_pFont != NULL; +} +void CFX_GEFont::InitFont() +{ + if (m_pFont == NULL) { + return; + } + if (m_pFontEncoding == NULL) { +#ifdef FXFM_ENCODING_NONE + m_pFontEncoding = FX_CreateFontEncodingEx(m_pFont); +#else + m_pFontEncoding = FXGE_CreateUnicodeEncoding(m_pFont); +#endif + } + if (m_pCharWidthMap == NULL) { + m_pCharWidthMap = FXTARGET_New CFX_WordDiscreteArray(1024); + } + if (m_pRectArray == NULL) { + m_pRectArray = FXTARGET_New CFX_RectMassArray(16); + } + if (m_pBBoxMap == NULL) { + m_pBBoxMap = FX_NEW CFX_MapPtrToPtr(16); + } +} +IFX_Font* CFX_GEFont::Derive(FX_DWORD dwFontStyles, FX_WORD wCodePage ) +{ + if (GetFontStyles() == dwFontStyles) { + return Retain(); + } + return FX_NEW CFX_GEFont(*this, dwFontStyles); +} +FX_BYTE CFX_GEFont::GetCharSet() const +{ + FXSYS_assert(m_pFont != NULL); + if (m_wCharSet != 0xFFFF) { + return (FX_BYTE)m_wCharSet; + } + if (m_pFont->m_pSubstFont == NULL) { + return FX_CHARSET_Default; + } + return m_pFont->m_pSubstFont->m_Charset; +} +void CFX_GEFont::GetFamilyName(CFX_WideString &wsFamily) const +{ + FXSYS_assert(m_pFont != NULL); + if (m_pFont->m_pSubstFont == NULL || m_pFont->m_pSubstFont->m_Family.GetLength() == 0) { + wsFamily = CFX_WideString::FromLocal(m_pFont->GetFamilyName()); + } else { + wsFamily = CFX_WideString::FromLocal(m_pFont->m_pSubstFont->m_Family); + } +} +void CFX_GEFont::GetPsName(CFX_WideString &wsName) const +{ + wsName = m_pFont->GetPsName(); +} +FX_DWORD CFX_GEFont::GetFontStyles() const +{ + FXSYS_assert(m_pFont != NULL); +#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ + if (m_bUseLogFontStyle) { + return m_dwLogFontStyle; + } +#endif + FX_DWORD dwStyles = 0; + if (m_pFont->m_pSubstFont == NULL) { + if (m_pFont->IsBold()) { + dwStyles |= FX_FONTSTYLE_Bold; + } + if (m_pFont->IsItalic()) { + dwStyles |= FX_FONTSTYLE_Italic; + } + } else { + if (m_pFont->m_pSubstFont->m_Weight == FXFONT_FW_BOLD) { + dwStyles |= FX_FONTSTYLE_Bold; + } + if (m_pFont->m_pSubstFont->m_SubstFlags & FXFONT_SUBST_ITALIC) { + dwStyles |= FX_FONTSTYLE_Italic; + } + } + return dwStyles; +} +FX_BOOL CFX_GEFont::GetCharWidth(FX_WCHAR wUnicode, FX_INT32 &iWidth, FX_BOOL bCharCode) +{ + return GetCharWidth(wUnicode, iWidth, TRUE, bCharCode); +} +FX_BOOL CFX_GEFont::GetCharWidth(FX_WCHAR wUnicode, FX_INT32 &iWidth, FX_BOOL bRecursive, FX_BOOL bCharCode) +{ + FXSYS_assert (m_pCharWidthMap != NULL); + iWidth = m_pCharWidthMap->GetAt(wUnicode, 0); + if (iWidth < 1) { + if (!m_pProvider || !m_pProvider->GetCharWidth(this, wUnicode, iWidth, bCharCode)) { + IFX_Font *pFont = NULL; + FX_INT32 iGlyph = GetGlyphIndex(wUnicode, TRUE, &pFont, bCharCode); + if (iGlyph != 0xFFFF && pFont != NULL) { + if (pFont == (IFX_Font*)this) { + iWidth = m_pFont->GetGlyphWidth(iGlyph); + if (iWidth < 0) { + iWidth = -1; + } + } else if (((CFX_GEFont*)pFont)->GetCharWidth(wUnicode, iWidth, FALSE, bCharCode)) { + return TRUE; + } + } else { + iWidth = -1; + } + } + Lock(); + m_pCharWidthMap->SetAtGrow(wUnicode, (FX_SHORT)iWidth); + Unlock(); + } else if (iWidth == 65535) { + iWidth = -1; + } + return iWidth > 0; +} +FX_BOOL CFX_GEFont::GetCharBBox(FX_WCHAR wUnicode, CFX_Rect &bbox, FX_BOOL bCharCode) +{ + return GetCharBBox(wUnicode, bbox, TRUE, bCharCode); +} +FX_BOOL CFX_GEFont::GetCharBBox(FX_WCHAR wUnicode, CFX_Rect &bbox, FX_BOOL bRecursive, FX_BOOL bCharCode) +{ + FXSYS_assert(m_pRectArray != NULL); + FXSYS_assert(m_pBBoxMap != NULL); + FX_LPVOID pRect = NULL; + if (!m_pBBoxMap->Lookup((void*)(FX_UINTPTR)wUnicode, pRect)) { + IFX_Font *pFont = NULL; + FX_INT32 iGlyph = GetGlyphIndex(wUnicode, TRUE, &pFont, bCharCode); + if (iGlyph != 0xFFFF && pFont != NULL) { + if (pFont == (IFX_Font*)this) { + FX_RECT rtBBox; + if (m_pFont->GetGlyphBBox(iGlyph, rtBBox)) { + Lock(); + CFX_Rect rt; + rt.Set(rtBBox.left, rtBBox.top, rtBBox.Width(), rtBBox.Height()); + FX_INT32 index = m_pRectArray->Add(rt); + pRect = m_pRectArray->GetPtrAt(index); + m_pBBoxMap->SetAt((void*)(FX_UINTPTR)wUnicode, pRect); + Unlock(); + } + } else if (((CFX_GEFont*)pFont)->GetCharBBox(wUnicode, bbox, FALSE, bCharCode)) { + return TRUE; + } + } + } + if (pRect == NULL) { + return FALSE; + } + bbox = *(FX_LPCRECT)pRect; + return TRUE; +} +FX_BOOL CFX_GEFont::GetBBox(CFX_Rect &bbox) +{ + FX_RECT rt(0, 0, 0, 0); + FX_BOOL bRet = m_pFont->GetBBox(rt); + if (bRet) { + bbox.left = rt.left; + bbox.width = rt.Width(); + bbox.top = rt.bottom; + bbox.height = -rt.Height(); + } + return bRet; +} +FX_INT32 CFX_GEFont::GetItalicAngle() const +{ + if (m_pFont->m_pSubstFont == NULL) { + return 0; + } + return m_pFont->m_pSubstFont->m_ItalicAngle; +} +FX_INT32 CFX_GEFont::GetGlyphIndex(FX_WCHAR wUnicode, FX_BOOL bCharCode) +{ + return GetGlyphIndex(wUnicode, TRUE, NULL, bCharCode); +} +FX_INT32 CFX_GEFont::GetGlyphIndex(FX_WCHAR wUnicode, FX_BOOL bRecursive, IFX_Font **ppFont, FX_BOOL bCharCode) +{ + FXSYS_assert (m_pFontEncoding != NULL); + FX_INT32 iGlyphIndex = m_pFontEncoding->GlyphFromCharCode(wUnicode); + if (iGlyphIndex > 0) { + if (ppFont != NULL) { + *ppFont = (IFX_Font*)this; + } + return iGlyphIndex; + } + FGAS_LPCFONTUSB pFontUSB = FGAS_GetUnicodeBitField(wUnicode); + if (pFontUSB == NULL) { + return 0xFFFF; + } + FX_WORD wBitField = pFontUSB->wBitField; + if (wBitField >= 128) { + return 0xFFFF; + } + IFX_Font *pFont = NULL; + m_FontMapper.Lookup((void*)(FX_UINTPTR)wUnicode, (void*&)pFont); + if (pFont != NULL && pFont != (IFX_Font*)this) { + iGlyphIndex = ((CFX_GEFont*)pFont)->GetGlyphIndex(wUnicode, FALSE, NULL, bCharCode); + if (iGlyphIndex != 0xFFFF) { + FX_INT32 i = m_SubstFonts.Find(pFont); + if (i > -1) { + iGlyphIndex |= ((i + 1) << 24); + if (ppFont != NULL) { + *ppFont = pFont; + } + return iGlyphIndex; + } + } + } + if (m_pFontMgr != NULL && bRecursive) { + CFX_WideString wsFamily; + GetFamilyName(wsFamily); +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + IFX_Font *pFont = m_pFontMgr->GetDefFontByUnicode(wUnicode, GetFontStyles(), (FX_LPCWSTR)wsFamily); +#else + IFX_Font *pFont = m_pFontMgr->GetFontByUnicode(wUnicode, GetFontStyles(), (FX_LPCWSTR)wsFamily); + if (NULL == pFont) { + pFont = m_pFontMgr->GetFontByUnicode(wUnicode, GetFontStyles(), NULL); + } +#endif + if (pFont != NULL) { + if (pFont == (IFX_Font*)this) { + pFont->Release(); + return 0xFFFF; + } + m_FontMapper.SetAt((void*)(FX_UINTPTR)wUnicode, (void*)pFont); + FX_INT32 i = m_SubstFonts.GetSize(); + m_SubstFonts.Add(pFont); + iGlyphIndex = ((CFX_GEFont*)pFont)->GetGlyphIndex(wUnicode, FALSE, NULL, bCharCode); + if (iGlyphIndex != 0xFFFF) { + iGlyphIndex |= ((i + 1) << 24); + if (ppFont != NULL) { + *ppFont = pFont; + } + return iGlyphIndex; + } + } + } + return 0xFFFF; +} +FX_INT32 CFX_GEFont::GetAscent() const +{ + return m_pFont->GetAscent(); +} +FX_INT32 CFX_GEFont::GetDescent() const +{ + return m_pFont->GetDescent(); +} +void CFX_GEFont::Reset() +{ + Lock(); + FX_INT32 iCount = m_SubstFonts.GetSize(); + for (FX_INT32 i = 0; i < iCount; i ++) { + IFX_Font *pFont = (IFX_Font*)m_SubstFonts[i]; + ((CFX_GEFont*)pFont)->Reset(); + } + if (m_pCharWidthMap != NULL) { + m_pCharWidthMap->RemoveAll(); + } + if (m_pBBoxMap != NULL) { + m_pBBoxMap->RemoveAll(); + } + if (m_pRectArray != NULL) { + m_pRectArray->RemoveAll(); + } + Unlock(); +} +IFX_Font* CFX_GEFont::GetSubstFont(FX_INT32 iGlyphIndex) const +{ + iGlyphIndex = ((FX_DWORD)iGlyphIndex) >> 24; + return iGlyphIndex == 0 ? (IFX_Font*)this : (IFX_Font*)m_SubstFonts[iGlyphIndex - 1]; +} +#endif diff --git a/xfa/src/fgas/src/font/fx_gefont.h b/xfa/src/fgas/src/font/fx_gefont.h new file mode 100644 index 0000000000..430ff09852 --- /dev/null +++ b/xfa/src/fgas/src/font/fx_gefont.h @@ -0,0 +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 + +#ifndef _FX_GRAPHOBJS_IMP +#define _FX_GRAPHOBJS_IMP +#ifndef _FXPLUS +class CFX_GEFontMgr; +#ifndef FXFONT_SUBST_ITALIC +#define FXFONT_SUBST_ITALIC 0x02 +#endif +class CFX_GEFont : public IFX_Font, public CFX_ThreadLock, public CFX_Object +{ +public: + CFX_GEFont(const CFX_GEFont &src, FX_DWORD dwFontStyles); + CFX_GEFont(IFX_FontMgr *pFontMgr); + ~CFX_GEFont(); + virtual void Release(); + virtual IFX_Font* Retain(); + FX_BOOL LoadFont(FX_LPCWSTR pszFontFamily, FX_DWORD dwFontStyles, FX_WORD wCodePage); + FX_BOOL LoadFont(FX_LPCBYTE pBuffer, FX_INT32 length); + FX_BOOL LoadFont(FX_LPCWSTR pszFileName); + FX_BOOL LoadFont(IFX_Stream *pFontStream, FX_BOOL bSaveStream); + FX_BOOL LoadFont(CFX_Font *pExtFont, FX_BOOL bTakeOver = FALSE); + virtual IFX_Font* Derive(FX_DWORD dwFontStyles, FX_WORD wCodePage = 0); + virtual void GetFamilyName(CFX_WideString &wsFamily) const; + virtual void GetPsName(CFX_WideString &wsName) const; + virtual FX_DWORD GetFontStyles() const; + virtual FX_BYTE GetCharSet() const; + virtual FX_BOOL GetCharWidth(FX_WCHAR wUnicode, FX_INT32 &iWidth, FX_BOOL bCharCode = FALSE); + virtual FX_INT32 GetGlyphIndex(FX_WCHAR wUnicode, FX_BOOL bCharCode = FALSE); + virtual FX_INT32 GetAscent() const; + virtual FX_INT32 GetDescent() const; + virtual FX_BOOL GetCharBBox(FX_WCHAR wUnicode, CFX_Rect &bbox, FX_BOOL bCharCode = FALSE); + virtual FX_BOOL GetBBox(CFX_Rect &bbox); + virtual FX_INT32 GetItalicAngle() const; + virtual void Reset(); + virtual IFX_Font* GetSubstFont(FX_INT32 iGlyphIndex) const; + virtual void* GetDevFont()const + { + return (void*)m_pFont; + } + virtual void SetFontProvider(IFX_FontProvider* pProvider) + { + m_pProvider = pProvider; + } +#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ + virtual void SetLogicalFontStyle(FX_DWORD dwLogFontStyle) + { + m_bUseLogFontStyle = TRUE; + m_dwLogFontStyle = dwLogFontStyle; + }; +#endif +protected: +#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ + FX_BOOL m_bUseLogFontStyle; + FX_DWORD m_dwLogFontStyle; +#endif + CFX_Font *m_pFont; + IFX_FontMgr *m_pFontMgr; + FX_INT32 m_iRefCount; + FX_BOOL m_bExtFont; + IFX_Stream *m_pStream; + IFX_FileRead *m_pFileRead; + IFX_FontEncoding *m_pFontEncoding; + CFX_WordDiscreteArray *m_pCharWidthMap; + CFX_RectMassArray *m_pRectArray; + CFX_MapPtrToPtr *m_pBBoxMap; + IFX_FontProvider *m_pProvider; + FX_WORD m_wCharSet; + CFX_PtrArray m_SubstFonts; + CFX_MapPtrToPtr m_FontMapper; + void InitFont(); + FX_BOOL GetCharBBox(FX_WCHAR wUnicode, CFX_Rect &bbox, FX_BOOL bRecursive, FX_BOOL bCharCode = FALSE); + FX_BOOL GetCharWidth(FX_WCHAR wUnicode, FX_INT32 &iWidth, FX_BOOL bRecursive, FX_BOOL bCharCode = FALSE); + FX_INT32 GetGlyphIndex(FX_WCHAR wUnicode, FX_BOOL bRecursive, IFX_Font **ppFont, FX_BOOL bCharCode = FALSE); +}; +#endif +#endif diff --git a/xfa/src/fgas/src/font/fx_stdfontmgr.cpp b/xfa/src/fgas/src/font/fx_stdfontmgr.cpp new file mode 100644 index 0000000000..ae59cab2e5 --- /dev/null +++ b/xfa/src/fgas/src/font/fx_stdfontmgr.cpp @@ -0,0 +1,1490 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../fgas_base.h" +#include "fx_stdfontmgr.h" +#include "fx_fontutils.h" +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ +IFX_FontMgr* IFX_FontMgr::Create(FX_LPEnumAllFonts pEnumerator, FX_LPMatchFont pMatcher , FX_LPVOID pUserData ) +{ + return FX_NEW CFX_StdFontMgrImp(pEnumerator, pMatcher, pUserData); +} +CFX_StdFontMgrImp::CFX_StdFontMgrImp(FX_LPEnumAllFonts pEnumerator, FX_LPMatchFont pMatcher, FX_LPVOID pUserData) + : m_pMatcher(pMatcher) + , m_pEnumerator(pEnumerator) + , m_FontFaces() + , m_Fonts() + , m_CPFonts(8) + , m_FamilyFonts(16) + , m_UnicodeFonts(16) + , m_BufferFonts(4) + , m_FileFonts(4) + , m_StreamFonts(4) + , m_DeriveFonts(4) + , m_pUserData(pUserData) +{ + if (m_pEnumerator != NULL) { + m_pEnumerator(m_FontFaces, m_pUserData, NULL, 0xFEFF); + } + if (m_pMatcher == NULL) { + m_pMatcher = FX_DefFontMatcher; + } + FXSYS_assert(m_pMatcher != NULL); +} +CFX_StdFontMgrImp::~CFX_StdFontMgrImp() +{ + m_FontFaces.RemoveAll(); + m_CPFonts.RemoveAll(); + m_FamilyFonts.RemoveAll(); + m_UnicodeFonts.RemoveAll(); + m_BufferFonts.RemoveAll(); + m_FileFonts.RemoveAll(); + m_StreamFonts.RemoveAll(); + m_DeriveFonts.RemoveAll(); + for (FX_INT32 i = m_Fonts.GetUpperBound(); i >= 0; i--) { + IFX_Font *pFont = (IFX_Font*)m_Fonts[i]; + if (pFont != NULL) { + pFont->Release(); + } + } + m_Fonts.RemoveAll(); +} +IFX_Font* CFX_StdFontMgrImp::GetDefFontByCodePage(FX_WORD wCodePage, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily) +{ + FX_DWORD dwHash = FGAS_GetFontHashCode(wCodePage, dwFontStyles); + IFX_Font *pFont = NULL; + if (m_CPFonts.Lookup((void*)(FX_UINTPTR)dwHash, (void*&)pFont)) { + return pFont ? LoadFont(pFont, dwFontStyles, wCodePage) : NULL; + } + FX_LPCFONTDESCRIPTOR pFD; + if ((pFD = FindFont(pszFontFamily, dwFontStyles, TRUE, wCodePage)) == NULL) + if ((pFD = FindFont(NULL, dwFontStyles, TRUE, wCodePage)) == NULL) + if ((pFD = FindFont(NULL, dwFontStyles, FALSE, wCodePage)) == NULL) { + return NULL; + } + FXSYS_assert(pFD != NULL); + pFont = IFX_Font::LoadFont(pFD->wsFontFace, dwFontStyles, wCodePage, this); + if (pFont != NULL) { + m_Fonts.Add(pFont); + m_CPFonts.SetAt((void*)(FX_UINTPTR)dwHash, (void*)pFont); + dwHash = FGAS_GetFontFamilyHash(pFD->wsFontFace, dwFontStyles, wCodePage); + m_FamilyFonts.SetAt((void*)(FX_UINTPTR)dwHash, (void*)pFont); + return LoadFont(pFont, dwFontStyles, wCodePage); + } + return NULL; +} +IFX_Font* CFX_StdFontMgrImp::GetDefFontByCharset(FX_BYTE nCharset, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily) +{ + return GetDefFontByCodePage(FX_GetCodePageFromCharset(nCharset), dwFontStyles, pszFontFamily); +} +#define _FX_USEGASFONTMGR_ +IFX_Font* CFX_StdFontMgrImp::GetDefFontByUnicode(FX_WCHAR wUnicode, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily) +{ + FGAS_LPCFONTUSB pRet = FGAS_GetUnicodeBitField(wUnicode); + if (pRet->wBitField == 999) { + return NULL; + } + FX_DWORD dwHash = FGAS_GetFontFamilyHash(pszFontFamily, dwFontStyles, pRet->wBitField); + IFX_Font *pFont = NULL; + if (m_UnicodeFonts.Lookup((void*)(FX_UINTPTR)dwHash, (void*&)pFont)) { + return pFont ? LoadFont(pFont, dwFontStyles, pRet->wCodePage) : NULL; + } +#ifdef _FX_USEGASFONTMGR_ + FX_LPCFONTDESCRIPTOR pFD = FindFont(pszFontFamily, dwFontStyles, FALSE, pRet->wCodePage, pRet->wBitField, wUnicode); + if (pFD == NULL && pszFontFamily) { + pFD = FindFont(NULL, dwFontStyles, FALSE, pRet->wCodePage, pRet->wBitField, wUnicode); + } + if (pFD == NULL) { + return NULL; + } + FXSYS_assert(pFD); + FX_WORD wCodePage = FX_GetCodePageFromCharset(pFD->uCharSet); + FX_LPCWSTR pFontFace = pFD->wsFontFace; + pFont = IFX_Font::LoadFont(pFontFace, dwFontStyles, wCodePage, this); +#else + CFX_FontMapper* pBuiltinMapper = CFX_GEModule::Get()->GetFontMgr()->m_pBuiltinMapper; + if (pBuiltinMapper == NULL) { + return NULL; + } + FX_INT32 iWeight = (dwFontStyles & FX_FONTSTYLE_Bold) ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL; + int italic_angle = 0; + FXFT_Face ftFace = pBuiltinMapper->FindSubstFontByUnicode(wUnicode, dwFontStyles, iWeight, italic_angle); + if (ftFace == NULL) { + return NULL; + } + CFX_Font* pFXFont = FX_NEW CFX_Font; + if (pFXFont == NULL) { + return NULL; + } + pFXFont->m_Face = ftFace; + pFXFont->m_pFontData = FXFT_Get_Face_Stream_Base(ftFace); + pFXFont->m_dwSize = FXFT_Get_Face_Stream_Size(ftFace); + pFont = IFX_Font::LoadFont(pFXFont, this); + FX_WORD wCodePage = pRet->wCodePage; + CFX_WideString wsPsName = pFXFont->GetPsName(); + FX_LPCWSTR pFontFace = wsPsName; +#endif + if (pFont != NULL) { + m_Fonts.Add(pFont); + m_UnicodeFonts.SetAt((void*)(FX_UINTPTR)dwHash, (void*)pFont); + dwHash = FGAS_GetFontHashCode(wCodePage, dwFontStyles); + m_CPFonts.SetAt((void*)(FX_UINTPTR)dwHash, (void*)pFont); + dwHash = FGAS_GetFontFamilyHash(pFontFace, dwFontStyles, wCodePage); + m_FamilyFonts.SetAt((void*)(FX_UINTPTR)dwHash, (void*)pFont); + return LoadFont(pFont, dwFontStyles, wCodePage); + } + return NULL; +} +IFX_Font* CFX_StdFontMgrImp::GetDefFontByLanguage(FX_WORD wLanguage, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily) +{ + return GetDefFontByCodePage(FX_GetDefCodePageByLanguage(wLanguage), dwFontStyles, pszFontFamily); +} +IFX_Font* CFX_StdFontMgrImp::LoadFont(FX_LPCWSTR pszFontFamily, FX_DWORD dwFontStyles, FX_WORD wCodePage) +{ + FX_DWORD dwHash = FGAS_GetFontFamilyHash(pszFontFamily, dwFontStyles, wCodePage); + IFX_Font *pFont = NULL; + if (m_FamilyFonts.Lookup((void*)(FX_UINTPTR)dwHash, (void*&)pFont)) { + return pFont ? LoadFont(pFont, dwFontStyles, wCodePage) : NULL; + } + FX_LPCFONTDESCRIPTOR pFD = NULL; + if ((pFD = FindFont(pszFontFamily, dwFontStyles, TRUE, wCodePage)) == NULL) + if ((pFD = FindFont(pszFontFamily, dwFontStyles, FALSE, wCodePage)) == NULL) { + return NULL; + } + FXSYS_assert(pFD != NULL); + if (wCodePage == 0xFFFF) { + wCodePage = FX_GetCodePageFromCharset(pFD->uCharSet); + } + pFont = IFX_Font::LoadFont(pFD->wsFontFace, dwFontStyles, wCodePage, this); + if (pFont != NULL) { + m_Fonts.Add(pFont); + m_FamilyFonts.SetAt((void*)(FX_UINTPTR)dwHash, (void*)pFont); + dwHash = FGAS_GetFontHashCode(wCodePage, dwFontStyles); + m_CPFonts.SetAt((void*)(FX_UINTPTR)dwHash, (void*)pFont); + return LoadFont(pFont, dwFontStyles, wCodePage); + } + return NULL; +} +IFX_Font* CFX_StdFontMgrImp::LoadFont(FX_LPCBYTE pBuffer, FX_INT32 iLength) +{ + FXSYS_assert(pBuffer != NULL && iLength > 0); + IFX_Font *pFont = NULL; + if (m_BufferFonts.Lookup((void*)pBuffer, (void*&)pFont)) { + if (pFont != NULL) { + return pFont->Retain(); + } + } + pFont = IFX_Font::LoadFont(pBuffer, iLength, this); + if (pFont != NULL) { + m_Fonts.Add(pFont); + m_BufferFonts.SetAt((void*)pBuffer, pFont); + return pFont->Retain(); + } + return NULL; +} +IFX_Font* CFX_StdFontMgrImp::LoadFont(FX_LPCWSTR pszFileName) +{ + FXSYS_assert(pszFileName != NULL); + FX_DWORD dwHash = FX_HashCode_String_GetW(pszFileName, -1); + IFX_Font *pFont = NULL; + if (m_FileFonts.Lookup((void*)(FX_UINTPTR)dwHash, (void*&)pFont)) { + if (pFont != NULL) { + return pFont->Retain(); + } + } + pFont = IFX_Font::LoadFont(pszFileName, NULL); + if (pFont != NULL) { + m_Fonts.Add(pFont); + m_FileFonts.SetAt((void*)(FX_UINTPTR)dwHash, (void*)pFont); + return pFont->Retain(); + } + return NULL; +} +IFX_Font* CFX_StdFontMgrImp::LoadFont(IFX_Stream *pFontStream, FX_LPCWSTR pszFontAlias , FX_DWORD dwFontStyles , FX_WORD wCodePage , FX_BOOL bSaveStream ) +{ + FXSYS_assert(pFontStream != NULL && pFontStream->GetLength() > 0); + IFX_Font *pFont = NULL; + if (m_StreamFonts.Lookup((void*)pFontStream, (void*&)pFont)) { + if (pFont != NULL) { + if (pszFontAlias != NULL) { + FX_DWORD dwHash = FGAS_GetFontFamilyHash(pszFontAlias, dwFontStyles, wCodePage); + m_FamilyFonts.SetAt((void*)(FX_UINTPTR)dwHash, (void*)pFont); + } + return LoadFont(pFont, dwFontStyles, wCodePage); + } + } + pFont = IFX_Font::LoadFont(pFontStream, this, bSaveStream); + if (pFont != NULL) { + m_Fonts.Add(pFont); + m_StreamFonts.SetAt((void*)pFontStream, (void*)pFont); + if (pszFontAlias != NULL) { + FX_DWORD dwHash = FGAS_GetFontFamilyHash(pszFontAlias, dwFontStyles, wCodePage); + m_FamilyFonts.SetAt((void*)(FX_UINTPTR)dwHash, (void*)pFont); + } + return LoadFont(pFont, dwFontStyles, wCodePage); + } + return NULL; +} +IFX_Font* CFX_StdFontMgrImp::LoadFont(IFX_Font *pSrcFont, FX_DWORD dwFontStyles, FX_WORD wCodePage) +{ + FXSYS_assert(pSrcFont != NULL); + if (pSrcFont->GetFontStyles() == dwFontStyles) { + return pSrcFont->Retain(); + } + void* buffer[3] = {pSrcFont, (void*)(FX_UINTPTR)dwFontStyles, (void*)(FX_UINTPTR)wCodePage}; + FX_DWORD dwHash = FX_HashCode_String_GetA((FX_LPCSTR)buffer, 3 * sizeof(void*)); + IFX_Font *pFont = NULL; + if (m_DeriveFonts.GetCount() > 0) { + m_DeriveFonts.Lookup((void*)(FX_UINTPTR)dwHash, (void*&)pFont); + if (pFont != NULL) { + return pFont->Retain(); + } + } + pFont = pSrcFont->Derive(dwFontStyles, wCodePage); + if (pFont != NULL) { + m_DeriveFonts.SetAt((void*)(FX_UINTPTR)dwHash, (void*)pFont); + FX_INT32 index = m_Fonts.Find(pFont); + if (index < 0) { + m_Fonts.Add(pFont); + pFont->Retain(); + } + return pFont; + } + return NULL; +} +void CFX_StdFontMgrImp::ClearFontCache() +{ + FX_INT32 iCount = m_Fonts.GetSize(); + for (FX_INT32 i = 0; i < iCount; i ++) { + IFX_Font *pFont = (IFX_Font*)m_Fonts[i]; + if (pFont != NULL) { + pFont->Reset(); + } + } +} +void CFX_StdFontMgrImp::RemoveFont(CFX_MapPtrToPtr &fontMap, IFX_Font *pFont) +{ + FX_POSITION pos = fontMap.GetStartPosition(); + FX_LPVOID pKey; + FX_LPVOID pFind; + while (pos != NULL) { + pFind = NULL; + fontMap.GetNextAssoc(pos, pKey, pFind); + if (pFind != (void*)pFont) { + continue; + } + fontMap.RemoveKey(pKey); + break; + } +} +void CFX_StdFontMgrImp::RemoveFont(IFX_Font *pFont) +{ + RemoveFont(m_CPFonts, pFont); + RemoveFont(m_FamilyFonts, pFont); + RemoveFont(m_UnicodeFonts, pFont); + RemoveFont(m_BufferFonts, pFont); + RemoveFont(m_FileFonts, pFont); + RemoveFont(m_StreamFonts, pFont); + RemoveFont(m_DeriveFonts, pFont); + FX_INT32 iFind = m_Fonts.Find(pFont); + if (iFind > -1) { + m_Fonts.RemoveAt(iFind, 1); + } +} +FX_LPCFONTDESCRIPTOR CFX_StdFontMgrImp::FindFont(FX_LPCWSTR pszFontFamily, FX_DWORD dwFontStyles, FX_DWORD dwMatchFlags, FX_WORD wCodePage, FX_DWORD dwUSB , FX_WCHAR wUnicode ) +{ + if (m_pMatcher == NULL) { + return NULL; + } + FX_FONTMATCHPARAMS params; + FX_memset(¶ms, 0, sizeof(params)); + params.dwUSB = dwUSB; + params.wUnicode = wUnicode; + params.wCodePage = wCodePage; + params.pwsFamily = pszFontFamily; + params.dwFontStyles = dwFontStyles; + params.dwMatchFlags = dwMatchFlags; + FX_LPCFONTDESCRIPTOR pDesc = m_pMatcher(¶ms, m_FontFaces, m_pUserData); + if (pDesc) { + return pDesc; + } + if (pszFontFamily && m_pEnumerator) { + CFX_FontDescriptors namedFonts; + m_pEnumerator(namedFonts, m_pUserData, pszFontFamily, wUnicode); + params.pwsFamily = NULL; + pDesc = m_pMatcher(¶ms, namedFonts, m_pUserData); + if (pDesc == NULL) { + return NULL; + } + for (FX_INT32 i = m_FontFaces.GetSize() - 1; i >= 0; i--) { + FX_LPCFONTDESCRIPTOR pMatch = m_FontFaces.GetPtrAt(i); + if (*pMatch == *pDesc) { + return pMatch; + } + } + int index = m_FontFaces.Add(*pDesc); + return m_FontFaces.GetPtrAt(index); + } + return NULL; +} +FX_LPCFONTDESCRIPTOR FX_DefFontMatcher(FX_LPFONTMATCHPARAMS pParams, const CFX_FontDescriptors &fonts, FX_LPVOID pUserData) +{ + FX_LPCFONTDESCRIPTOR pBestFont = NULL; + FX_INT32 iBestSimilar = 0; + FX_BOOL bMatchStyle = (pParams->dwMatchFlags & FX_FONTMATCHPARA_MacthStyle) > 0; + FX_INT32 iCount = fonts.GetSize(); + for (FX_INT32 i = 0; i < iCount; ++i) { + FX_LPCFONTDESCRIPTOR pFont = fonts.GetPtrAt(i); + if ((pFont->dwFontStyles & FX_FONTSTYLE_BoldItalic) == FX_FONTSTYLE_BoldItalic) { + continue; + } + if (pParams->pwsFamily) { + if (FXSYS_wcsicmp(pParams->pwsFamily, pFont->wsFontFace)) { + continue; + } + if (pFont->uCharSet == FX_CHARSET_Symbol) { + return pFont; + } + } + if (pFont->uCharSet == FX_CHARSET_Symbol) { + continue; + } + if (pParams->wCodePage != 0xFFFF) { + if (FX_GetCodePageFromCharset(pFont->uCharSet) != pParams->wCodePage) { + continue; + } + } else { + if (pParams->dwUSB < 128) { + FX_DWORD dwByte = pParams->dwUSB / 32; + FX_DWORD dwUSB = 1 << (pParams->dwUSB % 32); + if ((pFont->FontSignature.fsUsb[dwByte] & dwUSB) == 0) { + continue; + } + } + } + if (bMatchStyle) { + if ((pFont->dwFontStyles & 0x0F) == (pParams->dwFontStyles & 0x0F)) { + return pFont; + } else { + continue; + } + } + if (pParams->pwsFamily != NULL) { + if (FXSYS_wcsicmp(pParams->pwsFamily, pFont->wsFontFace) == 0) { + return pFont; + } + } + FX_INT32 iSimilarValue = FX_GetSimilarValue(pFont, pParams->dwFontStyles); + if (iBestSimilar < iSimilarValue) { + iBestSimilar = iSimilarValue; + pBestFont = pFont; + } + } + return iBestSimilar < 1 ? NULL : pBestFont; +} +FX_INT32 FX_GetSimilarValue(FX_LPCFONTDESCRIPTOR pFont, FX_DWORD dwFontStyles) +{ + FX_INT32 iValue = 0; + if ((dwFontStyles & FX_FONTSTYLE_Symbolic) == (pFont->dwFontStyles & FX_FONTSTYLE_Symbolic)) { + iValue += 64; + } + if ((dwFontStyles & FX_FONTSTYLE_FixedPitch) == (pFont->dwFontStyles & FX_FONTSTYLE_FixedPitch)) { + iValue += 32; + } + if ((dwFontStyles & FX_FONTSTYLE_Serif) == (pFont->dwFontStyles & FX_FONTSTYLE_Serif)) { + iValue += 16; + } + if ((dwFontStyles & FX_FONTSTYLE_Script) == (pFont->dwFontStyles & FX_FONTSTYLE_Script)) { + iValue += 8; + } + return iValue; +} +FX_LPMatchFont FX_GetDefFontMatchor() +{ + return FX_DefFontMatcher; +} +FX_DWORD FX_GetGdiFontStyles(const LOGFONTW &lf) +{ + FX_DWORD dwStyles = 0; + if ((lf.lfPitchAndFamily & 0x03) == FIXED_PITCH) { + dwStyles |= FX_FONTSTYLE_FixedPitch; + } + FX_BYTE nFamilies = lf.lfPitchAndFamily & 0xF0; + if (nFamilies == FF_ROMAN) { + dwStyles |= FX_FONTSTYLE_Serif; + } + if (nFamilies == FF_SCRIPT) { + dwStyles |= FX_FONTSTYLE_Script; + } + if (lf.lfCharSet == SYMBOL_CHARSET) { + dwStyles |= FX_FONTSTYLE_Symbolic; + } + return dwStyles; +} +static FX_INT32 CALLBACK FX_GdiFontEnumProc(ENUMLOGFONTEX *lpelfe, NEWTEXTMETRICEX *lpntme, DWORD dwFontType, LPARAM lParam) +{ + if (dwFontType != TRUETYPE_FONTTYPE) { + return 1; + } + const LOGFONTW &lf = ((LPENUMLOGFONTEXW)lpelfe)->elfLogFont; + if (lf.lfFaceName[0] == L'@') { + return 1; + } + FX_LPFONTDESCRIPTOR pFont = FX_Alloc(FX_FONTDESCRIPTOR, 1); + if (NULL == pFont) { + return 0; + } + FXSYS_memset(pFont, 0, sizeof(FX_FONTDESCRIPTOR)); + pFont->uCharSet = lf.lfCharSet; + pFont->dwFontStyles = FX_GetGdiFontStyles(lf); + FXSYS_wcsncpy(pFont->wsFontFace, (FX_LPCWSTR)lf.lfFaceName, 31); + pFont->wsFontFace[31] = 0; + FX_memcpy(&pFont->FontSignature, &lpntme->ntmFontSig, sizeof(lpntme->ntmFontSig)); + ((CFX_FontDescriptors*)lParam)->Add(*pFont); + FX_Free(pFont); + return 1; +} +static void FX_EnumGdiFonts(CFX_FontDescriptors &fonts, FX_LPVOID pUserData, FX_LPCWSTR pwsFaceName, FX_WCHAR wUnicode) +{ + HDC hDC = ::GetDC(NULL); + LOGFONTW lfFind; + FX_memset(&lfFind, 0, sizeof(lfFind)); + lfFind.lfCharSet = DEFAULT_CHARSET; + if (pwsFaceName) { + FXSYS_wcsncpy((FX_LPWSTR)lfFind.lfFaceName, pwsFaceName, 31); + lfFind.lfFaceName[31] = 0; + } + EnumFontFamiliesExW(hDC, (LPLOGFONTW)&lfFind, (FONTENUMPROCW)FX_GdiFontEnumProc, (LPARAM)&fonts, 0); + ::ReleaseDC(NULL, hDC); +} +FX_LPEnumAllFonts FX_GetDefFontEnumerator() +{ + return FX_EnumGdiFonts; +} +#else +FX_LPCSTR g_FontFolders[] = { +#if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ + (FX_LPCSTR)"/usr/share/fonts", + (FX_LPCSTR)"/usr/share/X11/fonts/Type1", + (FX_LPCSTR)"/usr/share/X11/fonts/TTF", + (FX_LPCSTR)"/usr/local/share/fonts", +#elif _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + (FX_LPCSTR)"~/Library/Fonts", + (FX_LPCSTR)"/Library/Fonts", + (FX_LPCSTR)"/System/Library/Fonts", +#elif _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_ + (FX_LPCSTR)"/system/fonts", +#endif +}; +CFX_FontSourceEnum_File::CFX_FontSourceEnum_File() +{ + for (FX_INT32 i = 0; i < sizeof(g_FontFolders) / sizeof(FX_LPCSTR); i++) { + m_FolderPaths.Add(g_FontFolders[i]); + } +} +CFX_ByteString CFX_FontSourceEnum_File::GetNextFile() +{ +Restart: + FX_LPVOID pCurHandle = m_FolderQueue.GetSize() == 0 ? NULL : m_FolderQueue.GetDataPtr(m_FolderQueue.GetSize() - 1)->pFileHandle; + if (NULL == pCurHandle) { + if (m_FolderPaths.GetSize() < 1) { + return ""; + } + pCurHandle = FX_OpenFolder(m_FolderPaths[m_FolderPaths.GetSize() - 1]); + FX_HandleParentPath hpp; + hpp.pFileHandle = pCurHandle; + hpp.bsParentPath = m_FolderPaths[m_FolderPaths.GetSize() - 1]; + m_FolderQueue.Add(hpp); + } + CFX_ByteString bsName; + FX_BOOL bFolder; + CFX_ByteString bsFolderSpearator = CFX_ByteString::FromUnicode(CFX_WideString(FX_GetFolderSeparator())); + while (TRUE) { + if (!FX_GetNextFile(pCurHandle, bsName, bFolder)) { + FX_CloseFolder(pCurHandle); + m_FolderQueue.RemoveAt(m_FolderQueue.GetSize() - 1); + if (m_FolderQueue.GetSize() == 0) { + m_FolderPaths.RemoveAt(m_FolderPaths.GetSize() - 1); + if (m_FolderPaths.GetSize() == 0) { + return ""; + } else { + goto Restart; + } + } + pCurHandle = m_FolderQueue.GetDataPtr(m_FolderQueue.GetSize() - 1)->pFileHandle; + continue; + } + if (bsName == "." || bsName == "..") { + continue; + } + if (bFolder) { + FX_HandleParentPath hpp; + hpp.bsParentPath = m_FolderQueue.GetDataPtr(m_FolderQueue.GetSize() - 1)->bsParentPath + bsFolderSpearator + bsName; + hpp.pFileHandle = FX_OpenFolder(hpp.bsParentPath); + if (hpp.pFileHandle == NULL) { + continue; + } + m_FolderQueue.Add(hpp); + pCurHandle = hpp.pFileHandle; + continue; + } + bsName = m_FolderQueue.GetDataPtr(m_FolderQueue.GetSize() - 1)->bsParentPath + bsFolderSpearator + bsName; + break; + } + return bsName; +} +FX_POSITION CFX_FontSourceEnum_File::GetStartPosition( FX_LPVOID pUserData ) +{ + m_wsNext = GetNextFile().UTF8Decode(); + if (0 == m_wsNext.GetLength()) { + return (FX_POSITION)0; + } + return (FX_POSITION) - 1; +} +IFX_FileAccess* CFX_FontSourceEnum_File::GetNext( FX_POSITION& pos, FX_LPVOID pUserData ) +{ + IFX_FileAccess* pAccess = FX_CreateDefaultFileAccess(m_wsNext); + m_wsNext = GetNextFile().UTF8Decode(); + pos = 0 != m_wsNext.GetLength() ? pAccess : NULL; + return (IFX_FileAccess*)pAccess; +} +IFX_FontSourceEnum* FX_CreateDefaultFontSourceEnum() +{ + return (IFX_FontSourceEnum*)FX_NEW CFX_FontSourceEnum_File; +} +IFX_FontMgr* IFX_FontMgr::Create(IFX_FontSourceEnum* pFontEnum, IFX_FontMgrDelegate* pDelegate, FX_LPVOID pUserData) +{ + if (NULL == pFontEnum) { + return NULL; + } + CFX_FontMgrImp* pFontMgr = FX_NEW CFX_FontMgrImp(pFontEnum, pDelegate, pUserData); + if (NULL == pFontMgr) { + return NULL; + } + if (pFontMgr->EnumFonts()) { + return pFontMgr; + } + delete pFontMgr; + return NULL; +} +CFX_FontMgrImp::CFX_FontMgrImp( IFX_FontSourceEnum* pFontEnum, IFX_FontMgrDelegate* pDelegate , FX_LPVOID pUserData ) + : m_pFontSource(pFontEnum) + , m_pDelegate(pDelegate) + , m_pUserData(pUserData) +{ +} +FX_BOOL CFX_FontMgrImp::EnumFonts() +{ + FXFT_Library& library = CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary; + if (library == NULL) { + FXFT_Init_FreeType(&library); + } + if (library == NULL) { + return FALSE; + } + FXFT_Face pFace = NULL; + FX_POSITION pos = m_pFontSource->GetStartPosition(); + IFX_FileAccess* pFontSource = NULL; + IFX_FileRead* pFontStream = NULL; + while (pos) { + pFontSource = m_pFontSource->GetNext(pos); + pFontStream = pFontSource->CreateFileStream(FX_FILEMODE_ReadOnly); + if (NULL == pFontStream) { + pFontSource->Release(); + continue; + } + if (NULL == (pFace = LoadFace(pFontStream, 0))) { + pFontStream->Release(); + pFontSource->Release(); + continue; + } + FX_INT32 nFaceCount = pFace->num_faces; + ReportFace(pFace, m_InstalledFonts, pFontSource); + if (FXFT_Get_Face_External_Stream(pFace)) { + FXFT_Clear_Face_External_Stream(pFace); + } + FXFT_Done_Face(pFace); + for (FX_INT32 i = 1; i < nFaceCount; i++) { + if (NULL == (pFace = LoadFace(pFontStream, i))) { + continue; + } + ReportFace(pFace, m_InstalledFonts, pFontSource); + if (FXFT_Get_Face_External_Stream(pFace)) { + FXFT_Clear_Face_External_Stream(pFace); + } + FXFT_Done_Face(pFace); + } + pFontStream->Release(); + pFontSource->Release(); + } + return TRUE; +} +void CFX_FontMgrImp::Release() +{ + for (FX_INT32 i = 0; i < m_InstalledFonts.GetSize(); i++) { + delete m_InstalledFonts[i]; + } + FX_POSITION pos = m_Hash2CandidateList.GetStartPosition(); + while (pos) { + FX_DWORD dwHash; + CFX_FontDescriptorInfos* pDescs; + m_Hash2CandidateList.GetNextAssoc(pos, dwHash, pDescs); + if (NULL != pDescs) { + delete pDescs; + } + } + pos = m_Hash2Fonts.GetStartPosition(); + while (pos) { + FX_DWORD dwHash; + CFX_ArrayTemplate* pFonts; + m_Hash2Fonts.GetNextAssoc(pos, dwHash, pFonts); + if (NULL != pFonts) { + delete pFonts; + } + } + m_Hash2Fonts.RemoveAll(); + pos = m_Hash2FileAccess.GetStartPosition(); + while (pos) { + FX_DWORD dwHash; + IFX_FileAccess* pFileAccess; + m_Hash2FileAccess.GetNextAssoc(pos, dwHash, pFileAccess); + if (NULL != pFileAccess) { + pFileAccess->Release(); + } + } + pos = m_FileAccess2IFXFont.GetStartPosition(); + while (pos) { + FX_DWORD dwHash; + IFX_Font* pFont; + m_FileAccess2IFXFont.GetNextAssoc(pos, dwHash, pFont); + if (NULL != pFont) { + pFont->Release(); + } + } + pos = m_IFXFont2FileRead.GetStartPosition(); + while (pos) { + IFX_Font* pFont; + IFX_FileRead* pFileRead; + m_IFXFont2FileRead.GetNextAssoc(pos, pFont, pFileRead); + pFileRead->Release(); + } + delete this; +} +IFX_Font* CFX_FontMgrImp::GetDefFontByCodePage( FX_WORD wCodePage, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily ) +{ + return NULL == m_pDelegate ? NULL : m_pDelegate->GetDefFontByCodePage(this, wCodePage, dwFontStyles, pszFontFamily); +} +IFX_Font* CFX_FontMgrImp::GetDefFontByCharset( FX_BYTE nCharset, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily ) +{ + return NULL == m_pDelegate ? NULL : m_pDelegate->GetDefFontByCharset(this, nCharset, dwFontStyles, pszFontFamily); +} +IFX_Font* CFX_FontMgrImp::GetDefFontByUnicode( FX_WCHAR wUnicode, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily ) +{ + return NULL == m_pDelegate ? NULL : m_pDelegate->GetDefFontByUnicode(this, wUnicode, dwFontStyles, pszFontFamily); +} +IFX_Font* CFX_FontMgrImp::GetDefFontByLanguage( FX_WORD wLanguage, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily ) +{ + return NULL == m_pDelegate ? NULL : m_pDelegate->GetDefFontByLanguage(this, wLanguage, dwFontStyles, pszFontFamily); +} +IFX_Font* CFX_FontMgrImp::GetFontByCodePage( FX_WORD wCodePage, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily ) +{ + CFX_ByteString bsHash; + bsHash.Format("%d, %d", wCodePage, dwFontStyles); + bsHash += CFX_WideString(pszFontFamily).UTF8Encode(); + FX_DWORD dwHash = FX_HashCode_String_GetA(bsHash, bsHash.GetLength()); + CFX_ArrayTemplate* pFonts = NULL; + IFX_Font* pFont = NULL; + if (m_Hash2Fonts.Lookup(dwHash, pFonts)) { + if (NULL == pFonts) { + return NULL; + } + if (0 != pFonts->GetSize()) { + return pFonts->GetAt(0)->Retain(); + } + } + if (NULL == pFonts) { + pFonts = FX_NEW CFX_ArrayTemplate; + } + if (NULL == pFonts) { + return NULL; + } + m_Hash2Fonts.SetAt(dwHash, pFonts); + CFX_FontDescriptorInfos* sortedFonts = NULL; + if (!m_Hash2CandidateList.Lookup(dwHash, sortedFonts)) { + sortedFonts = FX_NEW CFX_FontDescriptorInfos; + MatchFonts(*sortedFonts, wCodePage, dwFontStyles, CFX_WideString(pszFontFamily), 0); + m_Hash2CandidateList.SetAt(dwHash, sortedFonts); + } + if (sortedFonts->GetSize() == 0) { + return NULL; + } + CFX_FontDescriptor* pDesc = sortedFonts->GetAt(0).pFont; + pFont = LoadFont(pDesc->m_pFileAccess, pDesc->m_nFaceIndex, NULL); + if (NULL != pFont) { + pFont->SetLogicalFontStyle(dwFontStyles); + } + pFonts->Add(pFont); + return pFont; +} +IFX_Font* CFX_FontMgrImp::GetFontByCharset( FX_BYTE nCharset, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily ) +{ + return GetFontByCodePage(FX_GetCodePageFromCharset(nCharset), dwFontStyles, pszFontFamily); +} +IFX_Font* CFX_FontMgrImp::GetFontByUnicode( FX_WCHAR wUnicode, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily ) +{ + IFX_Font* pFont = NULL; + if (m_FailedUnicodes2NULL.Lookup(wUnicode, pFont)) { + return NULL; + } + FGAS_LPCFONTUSB x = FGAS_GetUnicodeBitField(wUnicode); + FX_WORD wCodePage = NULL == x ? 0xFFFF : x->wCodePage; + FX_WORD wBitField = NULL == x ? 999 : x->wBitField; + CFX_ByteString bsHash; + if (wCodePage == 0xFFFF) { + bsHash.Format("%d, %d, %d", wCodePage, wBitField, dwFontStyles); + } else { + bsHash.Format("%d, %d", wCodePage, dwFontStyles); + } + bsHash += CFX_WideString(pszFontFamily).UTF8Encode(); + FX_DWORD dwHash = FX_HashCode_String_GetA(bsHash, bsHash.GetLength()); + CFX_ArrayTemplate* pFonts = NULL; + if (m_Hash2Fonts.Lookup(dwHash, pFonts)) { + if (NULL == pFonts) { + return NULL; + } + if (0 != pFonts->GetSize()) { + for (FX_INT32 i = 0; i < pFonts->GetSize(); i++) { + if (VerifyUnicode(pFonts->GetAt(i), wUnicode)) { + return pFonts->GetAt(i)->Retain(); + } + } + } + } + if (NULL == pFonts) { + pFonts = FX_NEW CFX_ArrayTemplate; + } + if (NULL == pFonts) { + return NULL; + } + m_Hash2Fonts.SetAt(dwHash, pFonts); + CFX_FontDescriptorInfos* sortedFonts = NULL; + if (!m_Hash2CandidateList.Lookup(dwHash, sortedFonts)) { + sortedFonts = FX_NEW CFX_FontDescriptorInfos; + MatchFonts(*sortedFonts, wCodePage, dwFontStyles, CFX_WideString(pszFontFamily), wUnicode); + m_Hash2CandidateList.SetAt(dwHash, sortedFonts); + } + for (FX_INT32 i = 0; i < sortedFonts->GetSize(); i++) { + CFX_FontDescriptor* pDesc = sortedFonts->GetAt(i).pFont; + if (VerifyUnicode(pDesc, wUnicode)) { + pFont = LoadFont(pDesc->m_pFileAccess, pDesc->m_nFaceIndex, NULL); + if (NULL != pFont) { + pFont->SetLogicalFontStyle(dwFontStyles); + } + pFonts->Add(pFont); + return pFont; + } + } + if (NULL == pszFontFamily) { + m_FailedUnicodes2NULL.SetAt(wUnicode, NULL); + } + return NULL; +} +FX_BOOL CFX_FontMgrImp::VerifyUnicode( CFX_FontDescriptor* pDesc, FX_WCHAR wcUnicode ) +{ + IFX_FileRead* pFileRead = pDesc->m_pFileAccess->CreateFileStream(FX_FILEMODE_ReadOnly); + if (NULL == pFileRead) { + return FALSE; + } + FXFT_Face pFace = LoadFace(pFileRead, pDesc->m_nFaceIndex); + if (NULL == pFace) { + goto BadRet; + } + if (0 != FXFT_Select_Charmap(pFace, FXFT_ENCODING_UNICODE)) { + goto BadRet; + } + if (0 == FXFT_Get_Char_Index(pFace, wcUnicode)) { + goto BadRet; + } + pFileRead->Release(); + if (FXFT_Get_Face_External_Stream(pFace)) { + FXFT_Clear_Face_External_Stream(pFace); + } + FXFT_Done_Face(pFace); + return TRUE; +BadRet: + if (NULL != pFileRead) { + pFileRead->Release(); + } + if (NULL != pFace) { + if (FXFT_Get_Face_External_Stream(pFace)) { + FXFT_Clear_Face_External_Stream(pFace); + } + FXFT_Done_Face(pFace); + } + return FALSE; +} +FX_BOOL CFX_FontMgrImp::VerifyUnicode( IFX_Font* pFont, FX_WCHAR wcUnicode ) +{ + if (NULL == pFont) { + return FALSE; + } + FXFT_Face pFace = ((CFX_Font*)pFont->GetDevFont())->m_Face; + FXFT_CharMap charmap = FXFT_Get_Face_Charmap(pFace); + if (0 != FXFT_Select_Charmap(pFace, FXFT_ENCODING_UNICODE)) { + return FALSE; + } + if (0 == FXFT_Get_Char_Index(pFace, wcUnicode)) { + FXFT_Set_Charmap(pFace, charmap); + return FALSE; + } + return TRUE; +} +IFX_Font* CFX_FontMgrImp::GetFontByLanguage( FX_WORD wLanguage, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily ) +{ + return GetFontByCodePage(FX_GetDefCodePageByLanguage(wLanguage), dwFontStyles, pszFontFamily); +} +IFX_Font* CFX_FontMgrImp::LoadFont( FX_LPCBYTE pBuffer, FX_INT32 iLength, FX_INT32 iFaceIndex, FX_INT32* pFaceCount ) +{ + FX_LPVOID Hash[2] = {(FX_LPVOID)(FX_UINTPTR)pBuffer, (FX_LPVOID)(FX_UINTPTR)iLength}; + FX_DWORD dwHash = FX_HashCode_String_GetA((FX_LPCSTR)Hash, 2 * sizeof (FX_LPVOID)); + IFX_FileAccess* pFontAccess = NULL; + if (!m_Hash2FileAccess.Lookup(dwHash, pFontAccess)) { + } + if (NULL != pFontAccess) { + return LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE); + } else { + return NULL; + } +} +IFX_Font* CFX_FontMgrImp::LoadFont( FX_LPCWSTR pszFileName, FX_INT32 iFaceIndex, FX_INT32* pFaceCount ) +{ + CFX_ByteString bsHash; + bsHash += CFX_WideString(pszFileName).UTF8Encode(); + FX_DWORD dwHash = FX_HashCode_String_GetA((FX_LPCSTR)bsHash, bsHash.GetLength()); + IFX_FileAccess* pFontAccess = NULL; + if (!m_Hash2FileAccess.Lookup(dwHash, pFontAccess)) { + pFontAccess = FX_CreateDefaultFileAccess(pszFileName); + m_Hash2FileAccess.SetAt(dwHash, pFontAccess); + } + if (NULL != pFontAccess) { + return LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE); + } else { + return NULL; + } +} +IFX_Font* CFX_FontMgrImp::LoadFont( IFX_Stream* pFontStream, FX_INT32 iFaceIndex, FX_INT32* pFaceCount, FX_BOOL bSaveStream ) +{ + FX_LPVOID Hash[1] = {(FX_LPVOID)(FX_UINTPTR)pFontStream}; + FX_DWORD dwHash = FX_HashCode_String_GetA((FX_LPCSTR)Hash, 1 * sizeof (FX_LPVOID)); + IFX_FileAccess* pFontAccess = NULL; + if (!m_Hash2FileAccess.Lookup(dwHash, pFontAccess)) { + } + if (NULL != pFontAccess) { + return LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE); + } else { + return NULL; + } +} +IFX_Font* CFX_FontMgrImp::LoadFont( IFX_FileAccess* pFontAccess, FX_INT32 iFaceIndex, FX_INT32* pFaceCount, FX_BOOL bWantCache ) +{ + FX_DWORD dwHash = 0; + IFX_Font* pFont = NULL; + if (bWantCache) { + CFX_ByteString bsHash; + bsHash.Format("%d, %d", (FX_UINTPTR)pFontAccess, iFaceIndex); + dwHash = FX_HashCode_String_GetA(bsHash, bsHash.GetLength()); + if (m_FileAccess2IFXFont.Lookup(dwHash, pFont)) { + if (NULL != pFont) { + if (NULL != pFaceCount) { + *pFaceCount = ((CFX_Font*)pFont->GetDevFont())->m_Face->num_faces; + } + return pFont->Retain(); + } + } + } + CFX_Font* pInternalFont = FX_NEW CFX_Font; + if (NULL == pInternalFont) { + return NULL; + } + IFX_FileRead* pFontStream = pFontAccess->CreateFileStream(FX_FILEMODE_ReadOnly); + if (NULL == pFontStream) { + delete pInternalFont; + return NULL; + } + if (!pInternalFont->LoadFile(pFontStream, iFaceIndex)) { + delete pInternalFont; + pFontStream->Release(); + return NULL; + } + pFont = IFX_Font::LoadFont(pInternalFont, this, TRUE); + if (NULL == pFont) { + delete pInternalFont; + pFontStream->Release(); + return NULL; + } + if (bWantCache) { + m_FileAccess2IFXFont.SetAt(dwHash, pFont); + } + m_IFXFont2FileRead.SetAt(pFont, pFontStream); + if (NULL != pFaceCount) { + *pFaceCount = ((CFX_Font*)pFont->GetDevFont())->m_Face->num_faces; + } + return pFont; +} +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) + { + } +}; +FXFT_Face CFX_FontMgrImp::LoadFace( IFX_FileRead* pFontStream, FX_INT32 iFaceIndex ) +{ + FXFT_Library& library = CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary; + FXFT_Open_Args ftArgs; + FXFT_Stream ftStream = FX_Alloc(FXFT_StreamRec, 1); + FXFT_Face pFace = NULL; + if (library == NULL) { + FXFT_Init_FreeType(&library); + } + if (library == NULL) { + goto BadRet; + } + FXSYS_memset(&ftArgs, 0, sizeof(FXFT_Open_Args)); + if (NULL == ftStream) { + goto BadRet; + } + FXSYS_memset(ftStream, 0, sizeof(FXFT_StreamRec)); + if (NULL == pFontStream) { + goto BadRet; + } + ftStream->base = NULL; + ftStream->descriptor.pointer = pFontStream; + ftStream->pos = 0; + ftStream->size = (unsigned long)pFontStream->GetSize(); + ftStream->read = _ftStreamRead; + ftStream->close = _ftStreamClose; + ftArgs.flags |= FT_OPEN_STREAM; + ftArgs.stream = ftStream; + if (0 != FXFT_Open_Face(library, &ftArgs, iFaceIndex, &pFace)) { + goto BadRet; + } + FXFT_Set_Pixel_Sizes(pFace, 0, 64); + return pFace; +BadRet: + if (NULL != ftStream) { + FX_Free(ftStream); + } + return NULL; +} +FX_INT32 CFX_FontMgrImp::MatchFonts( CFX_FontDescriptorInfos& MatchedFonts, FX_WORD wCodePage, FX_DWORD dwFontStyles, const CFX_WideString& FontName, FX_WCHAR wcUnicode ) +{ + MatchedFonts.RemoveAll(); + CFX_WideString wsNormalizedFontName = FontName; + NormalizeFontName(wsNormalizedFontName); + static const FX_INT32 nMax = 0xffff; + CFX_FontDescriptor* pFont = NULL; + FX_INT32 nCount = m_InstalledFonts.GetSize(); + for (FX_INT32 i = 0; i < nCount; i++) { + pFont = m_InstalledFonts[i]; + FX_INT32 nPenalty = CalcPenalty(pFont, wCodePage, dwFontStyles, wsNormalizedFontName, wcUnicode); + if (nPenalty >= 0xFFFF) { + continue; + } + FX_FontDescriptorInfo FontInfo; + FontInfo.pFont = pFont; + FontInfo.nPenalty = nPenalty; + MatchedFonts.Add(FontInfo); + if (MatchedFonts.GetSize() == nMax) { + break; + } + } + if (MatchedFonts.GetSize() == 0) { + return 0; + } + CFX_SSortTemplate ssort; + ssort.ShellSort(MatchedFonts.GetData(), MatchedFonts.GetSize()); + return MatchedFonts.GetSize(); +} +struct FX_BitCodePage { + FX_WORD wBit; + FX_WORD wCodePage; +}; +static const FX_BitCodePage g_Bit2CodePage[] = { + {0, 1252}, + {1, 1250}, + {2, 1251}, + {3, 1253}, + {4, 1254}, + {5, 1255}, + {6, 1256}, + {7, 1257}, + {8, 1258}, + {9, 0}, + {10, 0}, + {11, 0}, + {12, 0}, + {13, 0}, + {14, 0}, + {15, 0}, + {16, 874}, + {17, 932}, + {18, 936}, + {19, 949}, + {20, 950}, + {21, 1361}, + {22, 0}, + {23, 0}, + {24, 0}, + {25, 0}, + {26, 0}, + {27, 0}, + {28, 0}, + {29, 0}, + {30, 0}, + {31, 0}, + {32, 0}, + {33, 0}, + {34, 0}, + {35, 0}, + {36, 0}, + {37, 0}, + {38, 0}, + {39, 0}, + {40, 0}, + {41, 0}, + {42, 0}, + {43, 0}, + {44, 0}, + {45, 0}, + {46, 0}, + {47, 0}, + {48, 869}, + {49, 866}, + {50, 865}, + {51, 864}, + {52, 863}, + {53, 862}, + {54, 861}, + {55, 860}, + {56, 857}, + {57, 855}, + {58, 852}, + {59, 775}, + {60, 737}, + {61, 708}, + {62, 850}, + {63, 437}, +}; +FX_WORD FX_GetCodePageBit(FX_WORD wCodePage) +{ + for (FX_INT32 i = 0; i < sizeof(g_Bit2CodePage) / sizeof (FX_BitCodePage); i++) { + if (g_Bit2CodePage[i].wCodePage == wCodePage) { + return g_Bit2CodePage[i].wBit; + } + } + return (FX_WORD) - 1; +} +FX_WORD FX_GetUnicodeBit(FX_WCHAR wcUnicode) +{ + FGAS_LPCFONTUSB x = FGAS_GetUnicodeBitField(wcUnicode); + if (NULL == x) { + return 999; + } + return x->wBitField; +} +FX_INT32 CFX_FontMgrImp::CalcPenalty( CFX_FontDescriptor* pInstalled, FX_WORD wCodePage, FX_DWORD dwFontStyles, const CFX_WideString& FontName, FX_WCHAR wcUnicode ) +{ + FX_INT32 nPenalty = 30000; + if (0 != FontName.GetLength()) { + if (FontName != pInstalled->m_wsFaceName) { + FX_INT32 i; + for (i = 0; i < pInstalled->m_wsFamilyNames.GetSize(); i++) { + if (pInstalled->m_wsFamilyNames[i] == FontName) { + break; + } + } + if (i == pInstalled->m_wsFamilyNames.GetSize()) { + nPenalty += 0xFFFF; + } else { + nPenalty -= 28000; + } + } else { + nPenalty -= 30000; + } + if (30000 == nPenalty && 0 == IsPartName(pInstalled->m_wsFaceName, FontName)) { + FX_INT32 i; + for (i = 0; i < pInstalled->m_wsFamilyNames.GetSize(); i++) { + if (0 != IsPartName(pInstalled->m_wsFamilyNames[i], FontName)) { + break; + } + } + if (i == pInstalled->m_wsFamilyNames.GetSize()) { + nPenalty += 0xFFFF; + } else { + nPenalty -= 26000; + } + } else { + nPenalty -= 27000; + } + } + FX_DWORD dwStyleMask = pInstalled->m_dwFontStyles ^ dwFontStyles; + if (dwStyleMask & FX_FONTSTYLE_Bold) { + nPenalty += 4500; + } + if (dwStyleMask & FX_FONTSTYLE_FixedPitch) { + nPenalty += 10000; + } + if (dwStyleMask & FX_FONTSTYLE_Italic) { + nPenalty += 10000; + } + if (dwStyleMask & FX_FONTSTYLE_Serif) { + nPenalty += 500; + } + if (dwStyleMask & FX_FONTSTYLE_Symbolic) { + nPenalty += 0xFFFF; + } + if (nPenalty >= 0xFFFF) { + return 0xFFFF; + } + FX_WORD wBit = ((0 == wCodePage || 0xFFFF == wCodePage) ? (FX_WORD) - 1 : FX_GetCodePageBit(wCodePage)); + if (wBit != (FX_WORD) - 1) { + FXSYS_assert(wBit < 64); + if (0 == (pInstalled->m_dwCsb[wBit / 32] & (1 << (wBit % 32)))) { + nPenalty += 0xFFFF; + } else { + nPenalty -= 60000; + } + } + wBit = ((0 == wcUnicode || 0xFFFE == wcUnicode) ? (FX_WORD)999 : FX_GetUnicodeBit(wcUnicode)); + if (wBit != (FX_WORD)999) { + FXSYS_assert(wBit < 128); + if (0 == (pInstalled->m_dwUsb[wBit / 32] & (1 << (wBit % 32)))) { + nPenalty += 0xFFFF; + } else { + nPenalty -= 60000; + } + } + return nPenalty; +} +void CFX_FontMgrImp::ClearFontCache() +{ + FX_POSITION pos = m_Hash2CandidateList.GetStartPosition(); + while (pos) { + FX_DWORD dwHash; + CFX_FontDescriptorInfos* pDescs; + m_Hash2CandidateList.GetNextAssoc(pos, dwHash, pDescs); + if (NULL != pDescs) { + delete pDescs; + } + } + pos = m_FileAccess2IFXFont.GetStartPosition(); + while (pos) { + FX_DWORD dwHash; + IFX_Font* pFont; + m_FileAccess2IFXFont.GetNextAssoc(pos, dwHash, pFont); + if (NULL != pFont) { + pFont->Release(); + } + } + pos = m_IFXFont2FileRead.GetStartPosition(); + while (pos) { + IFX_Font* pFont; + IFX_FileRead* pFileRead; + m_IFXFont2FileRead.GetNextAssoc(pos, pFont, pFileRead); + pFileRead->Release(); + } +} +void CFX_FontMgrImp::RemoveFont( IFX_Font* pEFont ) +{ + if (NULL == pEFont) { + return ; + } + IFX_FileRead* pFileRead; + if (m_IFXFont2FileRead.Lookup(pEFont, pFileRead)) { + pFileRead->Release(); + m_IFXFont2FileRead.RemoveKey(pEFont); + } + FX_POSITION pos; + pos = m_FileAccess2IFXFont.GetStartPosition(); + while (pos) { + FX_DWORD dwHash; + IFX_Font* pCFont; + m_FileAccess2IFXFont.GetNextAssoc(pos, dwHash, pCFont); + if (pCFont == pEFont) { + m_FileAccess2IFXFont.RemoveKey(dwHash); + break; + } + } + pos = m_Hash2Fonts.GetStartPosition(); + while (pos) { + FX_DWORD dwHash; + CFX_ArrayTemplate* pFonts; + m_Hash2Fonts.GetNextAssoc(pos, dwHash, pFonts); + if (NULL != pFonts) { + for (FX_INT32 i = 0; i < pFonts->GetSize(); i++) { + if (pFonts->GetAt(i) == pEFont) { + pFonts->SetAt(i, NULL); + } + } + } else { + m_Hash2Fonts.RemoveKey(dwHash); + } + } +} +void CFX_FontMgrImp::ReportFace( FXFT_Face pFace, CFX_FontDescriptors& Fonts, IFX_FileAccess* pFontAccess) +{ + if (0 == (pFace->face_flags & FT_FACE_FLAG_SCALABLE)) { + return ; + } + CFX_FontDescriptor* pFont = FX_NEW CFX_FontDescriptor; + if (NULL == pFont) { + return; + } + pFont->m_dwFontStyles |= FXFT_Is_Face_Bold(pFace) ? FX_FONTSTYLE_Bold : 0; + pFont->m_dwFontStyles |= FXFT_Is_Face_Italic(pFace) ? FX_FONTSTYLE_Italic : 0; + pFont->m_dwFontStyles |= GetFlags(pFace); + CFX_WordArray Charsets; + GetCharsets(pFace, Charsets); + GetUSBCSB(pFace, pFont->m_dwUsb, pFont->m_dwCsb); + unsigned long nLength = 0; + FT_ULong dwTag; + FX_LPBYTE pTable = NULL; + FT_ENC_TAG(dwTag, 'n', 'a', 'm', 'e'); + unsigned int error = FXFT_Load_Sfnt_Table(pFace, dwTag, 0, NULL, &nLength); + if (0 == error && 0 != nLength) { + pTable = FX_Alloc(FX_BYTE, nLength); + if (NULL != pTable) { + error = FXFT_Load_Sfnt_Table(pFace, dwTag, 0, pTable, NULL); + if (0 != error) { + FX_Free(pTable); + pTable = NULL; + } + } + } + GetNames(pTable, pFont->m_wsFamilyNames); + if (NULL != pTable) { + FX_Free(pTable); + } + pFont->m_wsFamilyNames.Add(CFX_ByteString(pFace->family_name).UTF8Decode()); + pFont->m_wsFaceName = CFX_WideString::FromLocal(FXFT_Get_Postscript_Name(pFace)); + pFont->m_nFaceIndex = pFace->face_index; + pFont->m_pFileAccess = pFontAccess->Retain(); + NormalizeFontName(pFont->m_wsFaceName); + for (FX_INT32 i = 0; i < pFont->m_wsFamilyNames.GetSize(); i++) { + NormalizeFontName(pFont->m_wsFamilyNames[i]); + } + Fonts.Add(pFont); +} +FX_DWORD CFX_FontMgrImp::GetFlags(FXFT_Face pFace) +{ + FX_DWORD flag = 0; + if (FT_IS_FIXED_WIDTH(pFace)) { + flag |= FX_FONTSTYLE_FixedPitch; + } + TT_OS2* pOS2 = (TT_OS2*)FT_Get_Sfnt_Table(pFace, ft_sfnt_os2); + if (!pOS2) { + return flag; + } + if (pOS2->ulCodePageRange1 & (1 << 31)) { + flag |= FX_FONTSTYLE_Symbolic; + } + if (pOS2->panose[0] == 2) { + FX_BYTE uSerif = pOS2->panose[1]; + if ((uSerif > 1 && uSerif < 10) || uSerif > 13) { + flag |= FX_FONTSTYLE_Serif; + } + } + return flag; +} +#define GetUInt8(p) ((FX_UINT8)((p)[0])) +#define GetUInt16(p) ((FX_UINT16)((p)[0] << 8 | (p)[1])) +#define GetUInt32(p) ((FX_UINT32)((p)[0] << 24 | (p)[1] << 16 | (p)[2] << 8 | (p)[3])) +void CFX_FontMgrImp::GetNames(FX_LPCBYTE name_table, CFX_WideStringArray& Names) +{ + if (NULL == name_table) { + return; + } + FX_LPBYTE lpTable = (FX_LPBYTE)name_table; + CFX_WideString wsFamily; + FX_LPBYTE sp = lpTable + 2; + FX_LPBYTE lpNameRecord = lpTable + 6; + FX_UINT16 nNameCount = GetUInt16(sp); + FX_LPBYTE lpStr = lpTable + GetUInt16(sp + 2); + for (FX_UINT16 j = 0; j < nNameCount; j++) { + FX_UINT16 nNameID = GetUInt16(lpNameRecord + j * 12 + 6); + if (nNameID != 1) { + continue; + } + FX_UINT16 nPlatformID = GetUInt16(lpNameRecord + j * 12 + 0); + FX_UINT16 nNameLength = GetUInt16(lpNameRecord + j * 12 + 8); + FX_UINT16 nNameOffset = GetUInt16(lpNameRecord + j * 12 + 10); + wsFamily.Empty(); + if (nPlatformID != 1) { + for (FX_UINT16 k = 0; k < nNameLength / 2; k++) { + FX_WCHAR wcTemp = GetUInt16(lpStr + nNameOffset + k * 2); + wsFamily += wcTemp; + } + Names.Add(wsFamily); + } else { + for (FX_UINT16 k = 0; k < nNameLength; k++) { + FX_WCHAR wcTemp = GetUInt8(lpStr + nNameOffset + k); + wsFamily += wcTemp; + } + Names.Add(wsFamily); + } + } +} +#undef GetUInt8 +#undef GetUInt16 +#undef GetUInt32 +struct FX_BIT2CHARSET { + FX_WORD wBit; + FX_WORD wCharset; +}; +FX_BIT2CHARSET g_FX_Bit2Charset1[16] = { + {1 << 0 , FX_CHARSET_ANSI}, + {1 << 1 , FX_CHARSET_MSWin_EasterEuropean}, + {1 << 2 , FX_CHARSET_MSWin_Cyrillic}, + {1 << 3 , FX_CHARSET_MSWin_Greek}, + {1 << 4 , FX_CHARSET_MSWin_Turkish}, + {1 << 5 , FX_CHARSET_MSWin_Hebrew}, + {1 << 6 , FX_CHARSET_MSWin_Arabic}, + {1 << 7 , FX_CHARSET_MSWin_Baltic}, + {1 << 8 , FX_CHARSET_MSWin_Vietnamese}, + {1 << 9 , FX_CHARSET_Default}, + {1 << 10 , FX_CHARSET_Default}, + {1 << 11 , FX_CHARSET_Default}, + {1 << 12 , FX_CHARSET_Default}, + {1 << 13 , FX_CHARSET_Default}, + {1 << 14 , FX_CHARSET_Default}, + {1 << 15 , FX_CHARSET_Default}, +}; +FX_BIT2CHARSET g_FX_Bit2Charset2[16] = { + {1 << 0 , FX_CHARSET_Thai}, + {1 << 1 , FX_CHARSET_ShiftJIS}, + {1 << 2 , FX_CHARSET_ChineseSimplified}, + {1 << 3 , FX_CHARSET_Korean}, + {1 << 4 , FX_CHARSET_ChineseTriditional}, + {1 << 5 , FX_CHARSET_Johab}, + {1 << 6 , FX_CHARSET_Default}, + {1 << 7 , FX_CHARSET_Default}, + {1 << 8 , FX_CHARSET_Default}, + {1 << 9 , FX_CHARSET_Default}, + {1 << 10 , FX_CHARSET_Default}, + {1 << 11 , FX_CHARSET_Default}, + {1 << 12 , FX_CHARSET_Default}, + {1 << 13 , FX_CHARSET_Default}, + {1 << 14 , FX_CHARSET_OEM}, + {1 << 15 , FX_CHARSET_Symbol}, +}; +FX_BIT2CHARSET g_FX_Bit2Charset3[16] = { + {1 << 0 , FX_CHARSET_Default}, + {1 << 1 , FX_CHARSET_Default}, + {1 << 2 , FX_CHARSET_Default}, + {1 << 3 , FX_CHARSET_Default}, + {1 << 4 , FX_CHARSET_Default}, + {1 << 5 , FX_CHARSET_Default}, + {1 << 6 , FX_CHARSET_Default}, + {1 << 7 , FX_CHARSET_Default}, + {1 << 8 , FX_CHARSET_Default}, + {1 << 9 , FX_CHARSET_Default}, + {1 << 10 , FX_CHARSET_Default}, + {1 << 11 , FX_CHARSET_Default}, + {1 << 12 , FX_CHARSET_Default}, + {1 << 13 , FX_CHARSET_Default}, + {1 << 14 , FX_CHARSET_Default}, + {1 << 15 , FX_CHARSET_Default}, +}; +FX_BIT2CHARSET g_FX_Bit2Charset4[16] = { + {1 << 0 , FX_CHARSET_Default }, + {1 << 1 , FX_CHARSET_Default }, + {1 << 2 , FX_CHARSET_Default }, + {1 << 3 , FX_CHARSET_Default }, + {1 << 4 , FX_CHARSET_Default }, + {1 << 5 , FX_CHARSET_Default }, + {1 << 6 , FX_CHARSET_Default }, + {1 << 7 , FX_CHARSET_Default }, + {1 << 8 , FX_CHARSET_Default }, + {1 << 9 , FX_CHARSET_Default }, + {1 << 10 , FX_CHARSET_Default }, + {1 << 11 , FX_CHARSET_Default }, + {1 << 12 , FX_CHARSET_Default }, + {1 << 13 , FX_CHARSET_Default }, + {1 << 14 , FX_CHARSET_Default }, + {1 << 15 , FX_CHARSET_US }, +}; +#define CODEPAGERANGE_IMPLEMENT(n) \ + for (FX_INT32 i = 0; i < 16; i++)\ + {\ + if ((a##n & g_FX_Bit2Charset##n[i].wBit) != 0)\ + {\ + Charsets.Add(g_FX_Bit2Charset##n[i].wCharset);\ + }\ + } +void CFX_FontMgrImp::GetCharsets( FXFT_Face pFace, CFX_WordArray& Charsets ) +{ + Charsets.RemoveAll(); + TT_OS2* pOS2 = (TT_OS2*)FT_Get_Sfnt_Table(pFace, ft_sfnt_os2); + if (NULL != pOS2) { + FX_WORD a1, a2, a3, a4; + a1 = pOS2->ulCodePageRange1 & 0x0000ffff; + CODEPAGERANGE_IMPLEMENT(1); + a2 = (pOS2->ulCodePageRange1 >> 16) & 0x0000ffff; + CODEPAGERANGE_IMPLEMENT(2); + a3 = pOS2->ulCodePageRange2 & 0x0000ffff; + CODEPAGERANGE_IMPLEMENT(3); + a4 = (pOS2->ulCodePageRange2 >> 16) & 0x0000ffff; + CODEPAGERANGE_IMPLEMENT(4); + } else { + Charsets.Add(FX_CHARSET_Default); + } +} +#undef CODEPAGERANGE_IMPLEMENT +void CFX_FontMgrImp::GetUSBCSB( FXFT_Face pFace, FX_DWORD* USB, FX_DWORD* CSB ) +{ + TT_OS2* pOS2 = (TT_OS2*)FT_Get_Sfnt_Table(pFace, ft_sfnt_os2); + if (NULL != pOS2) { + USB[0] = pOS2->ulUnicodeRange1; + USB[1] = pOS2->ulUnicodeRange2; + USB[2] = pOS2->ulUnicodeRange3; + USB[3] = pOS2->ulUnicodeRange4; + CSB[0] = pOS2->ulCodePageRange1; + CSB[1] = pOS2->ulCodePageRange2; + } else { + USB[0] = 0; + USB[1] = 0; + USB[2] = 0; + USB[3] = 0; + CSB[0] = 0; + CSB[1] = 0; + } +} +void CFX_FontMgrImp::NormalizeFontName( CFX_WideString& FontName ) +{ + FontName.MakeLower(); + FontName.Remove(' '); + FontName.Remove('-'); +} +FX_INT32 CFX_FontMgrImp::IsPartName( const CFX_WideString& Name1, const CFX_WideString& Name2 ) +{ + if (Name1.Find((FX_LPCWSTR)Name2) != -1) { + return 1; + } + return 0; +} +#endif diff --git a/xfa/src/fgas/src/font/fx_stdfontmgr.h b/xfa/src/fgas/src/font/fx_stdfontmgr.h new file mode 100644 index 0000000000..adcc737ca5 --- /dev/null +++ b/xfa/src/fgas/src/font/fx_stdfontmgr.h @@ -0,0 +1,175 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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_FONTMGR_IMP +#define _FX_FONTMGR_IMP +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ +FX_INT32 FX_GetSimilarValue(FX_LPCFONTDESCRIPTOR pFont, FX_DWORD dwFontStyles); +FX_LPCFONTDESCRIPTOR FX_DefFontMatcher(FX_LPFONTMATCHPARAMS pParams, const CFX_FontDescriptors &fonts, FX_LPVOID pUserData); +class CFX_StdFontMgrImp : public IFX_FontMgr, public CFX_Object +{ +public: + CFX_StdFontMgrImp(FX_LPEnumAllFonts pEnumerator, FX_LPMatchFont pMatcher, FX_LPVOID pUserData); + ~CFX_StdFontMgrImp(); + virtual void Release() + { + delete this; + } + virtual IFX_Font* GetDefFontByCodePage(FX_WORD wCodePage, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL); + virtual IFX_Font* GetDefFontByCharset(FX_BYTE nCharset, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL); + virtual IFX_Font* GetDefFontByUnicode(FX_WCHAR wUnicode, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL); + virtual IFX_Font* GetDefFontByLanguage(FX_WORD wLanguage, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL); + virtual IFX_Font* LoadFont(FX_LPCWSTR pszFontFamily, FX_DWORD dwFontStyles, FX_WORD wCodePage = 0xFFFF); + virtual IFX_Font* LoadFont(FX_LPCBYTE pBuffer, FX_INT32 iLength); + virtual IFX_Font* LoadFont(FX_LPCWSTR pszFileName); + virtual IFX_Font* LoadFont(IFX_Stream *pFontStream, FX_LPCWSTR pszFontAlias = NULL, FX_DWORD dwFontStyles = 0, FX_WORD wCodePage = 0, FX_BOOL bSaveStream = FALSE); + virtual IFX_Font* LoadFont(IFX_Font *pSrcFont, FX_DWORD dwFontStyles, FX_WORD wCodePage = 0xFFFF); + virtual void ClearFontCache(); + virtual void RemoveFont(IFX_Font *pFont); +protected: + FX_LPMatchFont m_pMatcher; + FX_LPEnumAllFonts m_pEnumerator; + CFX_FontDescriptors m_FontFaces; + CFX_PtrArray m_Fonts; + CFX_MapPtrToPtr m_CPFonts; + CFX_MapPtrToPtr m_FamilyFonts; + CFX_MapPtrToPtr m_UnicodeFonts; + CFX_MapPtrToPtr m_BufferFonts; + CFX_MapPtrToPtr m_FileFonts; + CFX_MapPtrToPtr m_StreamFonts; + CFX_MapPtrToPtr m_DeriveFonts; + FX_LPVOID m_pUserData; + void RemoveFont(CFX_MapPtrToPtr &fontMap, IFX_Font *pFont); + FX_LPCFONTDESCRIPTOR FindFont(FX_LPCWSTR pszFontFamily, FX_DWORD dwFontStyles, FX_DWORD dwMatchFlags, FX_WORD wCodePage, FX_DWORD dwUSB = 999, FX_WCHAR wUnicode = 0); + IFX_Font* GetFont(FX_LPCFONTDESCRIPTOR pFD, FX_DWORD dwFontStyles); +}; +FX_DWORD FX_GetGdiFontStyles(const LOGFONTW &lf); +#else +class CFX_FontDescriptor : public CFX_Object +{ +public: + CFX_FontDescriptor() + : m_pFileAccess(NULL) + , m_nFaceIndex(0) + , m_dwFontStyles(0) + { + m_dwUsb[0] = m_dwUsb[1] = m_dwUsb[2] = m_dwUsb[3] = 0; + m_dwCsb[0] = m_dwCsb[1] = 0; + } + ~CFX_FontDescriptor() + { + if (NULL != m_pFileAccess) { + m_pFileAccess->Release(); + } + } + IFX_FileAccess* m_pFileAccess; + FX_INT32 m_nFaceIndex; + CFX_WideString m_wsFaceName; + CFX_WideStringArray m_wsFamilyNames; + FX_DWORD m_dwFontStyles; + FX_DWORD m_dwUsb[4]; + FX_DWORD m_dwCsb[2]; +}; +typedef CFX_ArrayTemplate CFX_FontDescriptors; +struct FX_FontDescriptorInfo { +public: + CFX_FontDescriptor* pFont; + FX_INT32 nPenalty; + FX_BOOL operator > (const FX_FontDescriptorInfo& x) + { + return this->nPenalty > x.nPenalty; + }; + FX_BOOL operator < (const FX_FontDescriptorInfo& x) + { + return this->nPenalty < x.nPenalty; + }; + FX_BOOL operator == (const FX_FontDescriptorInfo& x) + { + return this->nPenalty == x.nPenalty; + }; +}; +typedef CFX_ArrayTemplate CFX_FontDescriptorInfos; +struct FX_HandleParentPath : public CFX_Object { + FX_HandleParentPath() + { + } + FX_HandleParentPath(const FX_HandleParentPath& x) + { + pFileHandle = x.pFileHandle; + bsParentPath = x.bsParentPath; + } + void* pFileHandle; + CFX_ByteString bsParentPath; +}; +class CFX_FontSourceEnum_File : public IFX_FontSourceEnum, public CFX_Object +{ +public: + CFX_FontSourceEnum_File(); + virtual void Release() + { + delete this; + }; + virtual FX_POSITION GetStartPosition(FX_LPVOID pUserData = NULL); + virtual IFX_FileAccess* GetNext(FX_POSITION& pos, FX_LPVOID pUserData = NULL); +private: + CFX_ByteString GetNextFile(); + CFX_WideString m_wsNext; + CFX_ObjectArray m_FolderQueue; + CFX_ByteStringArray m_FolderPaths; +}; +typedef CFX_MapPtrTemplate CFX_HashFileMap; +typedef CFX_MapPtrTemplate CFX_HashFontMap; +typedef CFX_MapPtrTemplate CFX_HashFontDescsMap; +typedef CFX_MapPtrTemplate* > CFX_HashFontsMap; +typedef CFX_MapPtrTemplate CFX_UnicodeFontMap; +typedef CFX_MapPtrTemplate* > CFX_FileFontMap; +typedef CFX_MapPtrTemplate CFX_FonStreamtMap; +class CFX_FontMgrImp : public IFX_FontMgr, public CFX_Object +{ +public: + CFX_FontMgrImp(IFX_FontSourceEnum* pFontEnum, IFX_FontMgrDelegate* pDelegate = NULL, FX_LPVOID pUserData = NULL); + virtual void Release(); + virtual IFX_Font* GetDefFontByCodePage(FX_WORD wCodePage, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL); + virtual IFX_Font* GetDefFontByCharset(FX_BYTE nCharset, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL); + virtual IFX_Font* GetDefFontByUnicode(FX_WCHAR wUnicode, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL); + virtual IFX_Font* GetDefFontByLanguage(FX_WORD wLanguage, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL); + virtual IFX_Font* GetFontByCodePage(FX_WORD wCodePage, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL); + virtual IFX_Font* GetFontByCharset(FX_BYTE nCharset, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL); + virtual IFX_Font* GetFontByUnicode(FX_WCHAR wUnicode, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL); + virtual IFX_Font* GetFontByLanguage(FX_WORD wLanguage, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL); + virtual IFX_Font* LoadFont(FX_LPCBYTE pBuffer, FX_INT32 iLength, FX_INT32 iFaceIndex, FX_INT32* pFaceCount); + virtual IFX_Font* LoadFont(FX_LPCWSTR pszFileName, FX_INT32 iFaceIndex, FX_INT32* pFaceCount); + virtual IFX_Font* LoadFont(IFX_Stream* pFontStream, FX_INT32 iFaceIndex, FX_INT32* pFaceCount, FX_BOOL bSaveStream = FALSE); + virtual void ClearFontCache(); + virtual void RemoveFont(IFX_Font* pFont); + FX_BOOL EnumFonts(); +protected: + void ReportFace(FXFT_Face pFace, CFX_FontDescriptors& Fonts, IFX_FileAccess* pFontAccess); + void GetNames(FX_LPCBYTE name_table, CFX_WideStringArray& Names); + void GetCharsets(FXFT_Face pFace, CFX_WordArray& Charsets); + void GetUSBCSB(FXFT_Face pFace, FX_DWORD* USB, FX_DWORD* CSB); + FX_DWORD GetFlags(FXFT_Face pFace); + CFX_FontDescriptors m_InstalledFonts; + FX_BOOL VerifyUnicode(CFX_FontDescriptor* pDesc, FX_WCHAR wcUnicode); + FX_BOOL VerifyUnicode(IFX_Font* pFont, FX_WCHAR wcUnicode); + void NormalizeFontName( CFX_WideString& FontName ); + FX_INT32 IsPartName(const CFX_WideString& Name1, const CFX_WideString& Name2); + FX_INT32 MatchFonts(CFX_FontDescriptorInfos& MatchedFonts, FX_WORD wCodePage, FX_DWORD dwFontStyles, const CFX_WideString& FontName, FX_WCHAR wcUnicode = 0xFFFE); + FX_INT32 CalcPenalty(CFX_FontDescriptor* pInstalled, FX_WORD wCodePage, FX_DWORD dwFontStyles, const CFX_WideString& FontName, FX_WCHAR wcUnicode = 0xFFFE); + IFX_Font* LoadFont(IFX_FileAccess* pFontAccess, FX_INT32 iFaceIndex, FX_INT32* pFaceCount, FX_BOOL bWantCache = FALSE); + FXFT_Face LoadFace(IFX_FileRead* pFontStream, FX_INT32 iFaceIndex); + CFX_HashFontDescsMap m_Hash2CandidateList; + CFX_HashFontsMap m_Hash2Fonts; + CFX_HashFileMap m_Hash2FileAccess; + CFX_HashFontMap m_FileAccess2IFXFont; + CFX_FonStreamtMap m_IFXFont2FileRead; + CFX_UnicodeFontMap m_FailedUnicodes2NULL; + IFX_FontSourceEnum* m_pFontSource; + IFX_FontMgrDelegate* m_pDelegate; + FX_LPVOID m_pUserData; +}; +#endif +#endif diff --git a/xfa/src/fgas/src/layout/fx_linebreak.cpp b/xfa/src/fgas/src/layout/fx_linebreak.cpp new file mode 100644 index 0000000000..4662e1c122 --- /dev/null +++ b/xfa/src/fgas/src/layout/fx_linebreak.cpp @@ -0,0 +1,121 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../fgas_base.h" +extern const FX_DWORD gs_FX_TextLayout_CodeProperties[65536]; +extern const FX_LINEBREAKTYPE gs_FX_LineBreak_PairTable[64][32] = { + {FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBCP, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBPB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBIB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBIB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBIB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBIB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBIB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBDB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBDB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBIB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBPB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBIB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBDB, FX_LBPB, FX_LBDB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBDB, FX_LBPB, FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBPB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBDB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, + {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN}, +}; +void FX_GetLineBreakPositions(FX_LPCWSTR pwsText, FX_LINEBREAKTYPE *pBrkType, FX_INT32 iLength) +{ + if (iLength < 2) { + return; + } + FX_DWORD dwCur, dwNext; + FX_WCHAR wch; + wch = *pwsText ++; + dwCur = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch] & 0x003F; + iLength --; + for (FX_INT32 i = 0; i < iLength; i ++) { + wch = *pwsText ++; + dwNext = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch] & 0x003F; + if (dwNext == FX_CBP_SP) { + pBrkType[i] = FX_LBT_PROHIBITED_BRK; + } else { + pBrkType[i] = *((const FX_LINEBREAKTYPE *)gs_FX_LineBreak_PairTable + (dwCur << 5) + dwNext); + } + dwCur = dwNext; + } + pBrkType[iLength] = FX_LBT_INDIRECT_BRK; +} +void FX_GetLineBreakPositions(FX_LPCWSTR pwsText, FX_INT32 iLength, CFX_Int32MassArray &bp) +{ + if (iLength < 2) { + return; + } + FX_LINEBREAKTYPE eType; + FX_DWORD dwCur, dwNext; + FX_WCHAR wch; + wch = *pwsText ++; + dwCur = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch] & 0x003F; + iLength --; + for (FX_INT32 i = 0; i < iLength; i ++) { + wch = *pwsText ++; + dwNext = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch] & 0x003F; + if (dwNext == FX_CBP_SP) { + eType = FX_LBT_PROHIBITED_BRK; + } else { + eType = *((const FX_LINEBREAKTYPE *)gs_FX_LineBreak_PairTable + (dwCur << 5) + dwNext); + } + if (eType == FX_LBT_DIRECT_BRK) { + bp.Add(i); + } + dwCur = dwNext; + } +} diff --git a/xfa/src/fgas/src/layout/fx_rtfbreak.cpp b/xfa/src/fgas/src/layout/fx_rtfbreak.cpp new file mode 100644 index 0000000000..24c64c453b --- /dev/null +++ b/xfa/src/fgas/src/layout/fx_rtfbreak.cpp @@ -0,0 +1,1522 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../fgas_base.h" +#include "fx_unicode.h" +#include "fx_rtfbreak.h" +extern const FX_DWORD gs_FX_TextLayout_CodeProperties[65536]; +extern const FX_WCHAR gs_FX_TextLayout_VerticalMirror[64]; +extern const FX_WCHAR gs_FX_TextLayout_BidiMirror[512]; +extern const FX_LINEBREAKTYPE gs_FX_LineBreak_PairTable[64][32]; +IFX_RTFBreak* IFX_RTFBreak::Create(FX_DWORD dwPolicies) +{ + return FX_NEW CFX_RTFBreak(dwPolicies); +} +CFX_RTFBreak::CFX_RTFBreak(FX_DWORD dwPolicies) + : m_dwPolicies(dwPolicies) + , m_pArabicChar(NULL) + , m_iLineStart(0) + , m_iLineEnd(2000000) + , m_dwLayoutStyles(0) + , m_bPagination(FALSE) + , m_bVertical(FALSE) + , m_bSingleLine(FALSE) + , m_bCharCode(FALSE) + , m_pFont(NULL) + , m_iFontHeight(240) + , m_iFontSize(240) + , m_iTabWidth(720000) + , m_PositionedTabs() + , m_bOrphanLine(FALSE) + , m_wDefChar(0xFEFF) + , m_iDefChar(0) + , m_wLineBreakChar(L'\n') + , m_iHorizontalScale(100) + , m_iVerticalScale(100) + , m_iLineRotation(0) + , m_iCharRotation(0) + , m_iRotation(0) + , m_iCharSpace(0) + , m_bWordSpace(FALSE) + , m_iWordSpace(0) + , m_bRTL(FALSE) + , m_iAlignment(FX_RTFLINEALIGNMENT_Left) + , m_pUserData(NULL) + , m_dwCharType(0) + , m_dwIdentity(0) + , m_RTFLine1() + , m_RTFLine2() + , m_pCurLine(NULL) + , m_iReady(0) + , m_iTolerance(0) +{ + m_pArabicChar = IFX_ArabicChar::Create(); + m_pCurLine = &m_RTFLine1; +} +CFX_RTFBreak::~CFX_RTFBreak() +{ + Reset(); + m_PositionedTabs.RemoveAll(); + m_pArabicChar->Release(); + if (m_pUserData != NULL) { + m_pUserData->Release(); + } +} +void CFX_RTFBreak::SetLineWidth(FX_FLOAT fLineStart, FX_FLOAT fLineEnd) +{ + m_iLineStart = FXSYS_round(fLineStart * 20000.0f); + m_iLineEnd = FXSYS_round(fLineEnd * 20000.0f); + FXSYS_assert(m_iLineEnd >= m_iLineStart); + if (m_pCurLine->m_iStart < m_iLineStart) { + m_pCurLine->m_iStart = m_iLineStart; + } +} +void CFX_RTFBreak::SetLinePos(FX_FLOAT fLinePos) +{ + FX_INT32 iLinePos = FXSYS_round(fLinePos * 20000.0f); + if (iLinePos > m_iLineEnd) { + iLinePos = m_iLineEnd; + } + m_pCurLine->m_iStart = iLinePos; +} +void CFX_RTFBreak::SetLayoutStyles(FX_DWORD dwLayoutStyles) +{ + if (m_dwLayoutStyles == dwLayoutStyles) { + return; + } + SetBreakStatus(); + m_dwLayoutStyles = dwLayoutStyles; + m_bPagination = (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_Pagination) != 0; + m_bVertical = (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_VerticalChars) != 0; + m_bSingleLine = (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_SingleLine) != 0; + m_bCharCode = (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_MBCSCode) != 0; + m_iLineRotation = GetLineRotation(m_dwLayoutStyles); + m_iRotation = m_iLineRotation + m_iCharRotation; + m_iRotation %= 4; +} +void CFX_RTFBreak::SetFont(IFX_Font *pFont) +{ + if (pFont == NULL) { + return; + } + if (m_pFont == pFont) { + return; + } + SetBreakStatus(); + m_pFont = pFont; + m_iDefChar = 0; + if (m_pFont != NULL) { + m_iFontHeight = m_iFontSize; + if (m_wDefChar != 0xFEFF) { + m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE); + m_iDefChar *= m_iFontSize; + } + } +} +void CFX_RTFBreak::SetFontSize(FX_FLOAT fFontSize) +{ + FX_INT32 iFontSize = FXSYS_round(fFontSize * 20.0f); + if (m_iFontSize == iFontSize) { + return; + } + SetBreakStatus(); + m_iFontSize = iFontSize; + m_iDefChar = 0; + if (m_pFont != NULL) { + m_iFontHeight = m_iFontSize; + if (m_wDefChar != 0xFEFF) { + m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE); + m_iDefChar *= m_iFontSize; + } + } +} +void CFX_RTFBreak::SetTabWidth(FX_FLOAT fTabWidth) +{ + m_iTabWidth = FXSYS_round(fTabWidth * 20000.0f); +} +void CFX_RTFBreak::AddPositionedTab(FX_FLOAT fTabPos) +{ + FX_INT32 iLineEnd = m_iLineEnd; + FX_INT32 iTabPos = FXSYS_round(fTabPos * 20000.0f) + m_iLineStart; + if (iTabPos > iLineEnd) { + iTabPos = iLineEnd; + } + if (m_PositionedTabs.Find(iTabPos, 0) > -1) { + return; + } + FX_INT32 iCount = m_PositionedTabs.GetSize(); + FX_INT32 iFind = 0; + for (; iFind < iCount; iFind ++) { + if (m_PositionedTabs[iFind] > iTabPos) { + break; + } + } + m_PositionedTabs.InsertAt(iFind, iTabPos); + if (m_dwPolicies & FX_RTFBREAKPOLICY_OrphanPositionedTab) { + m_bOrphanLine = GetLastPositionedTab() >= iLineEnd; + } else { + m_bOrphanLine = FALSE; + } +} +void CFX_RTFBreak::SetPositionedTabs(const CFX_FloatArray &tabs) +{ + m_PositionedTabs.RemoveAll(); + FX_INT32 iCount = tabs.GetSize(); + m_PositionedTabs.SetSize(iCount); + FX_INT32 iLineEnd = m_iLineEnd; + FX_INT32 iTabPos; + for (FX_INT32 i = 0; i < iCount; i ++) { + iTabPos = FXSYS_round(tabs[i] * 20000.0f) + m_iLineStart; + if (iTabPos > iLineEnd) { + iTabPos = iLineEnd; + } + m_PositionedTabs[i] = iTabPos; + } + if (m_dwPolicies & FX_RTFBREAKPOLICY_OrphanPositionedTab) { + m_bOrphanLine = GetLastPositionedTab() >= iLineEnd; + } else { + m_bOrphanLine = FALSE; + } +} +void CFX_RTFBreak::ClearPositionedTabs() +{ + m_PositionedTabs.RemoveAll(); + m_bOrphanLine = FALSE; +} +void CFX_RTFBreak::SetDefaultChar(FX_WCHAR wch) +{ + m_wDefChar = wch; + m_iDefChar = 0; + if (m_wDefChar != 0xFEFF && m_pFont != NULL) { + m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE); + if (m_iDefChar < 0) { + m_iDefChar = 0; + } else { + m_iDefChar *= m_iFontSize; + } + } +} +void CFX_RTFBreak::SetLineBreakChar(FX_WCHAR wch) +{ + if (wch != L'\r' && wch != L'\n') { + return; + } + m_wLineBreakChar = wch; +} +void CFX_RTFBreak::SetLineBreakTolerance(FX_FLOAT fTolerance) +{ + m_iTolerance = FXSYS_round(fTolerance * 20000.0f); +} +void CFX_RTFBreak::SetHorizontalScale(FX_INT32 iScale) +{ + if (iScale < 0) { + iScale = 0; + } + if (m_iHorizontalScale == iScale) { + return; + } + SetBreakStatus(); + m_iHorizontalScale = iScale; +} +void CFX_RTFBreak::SetVerticalScale(FX_INT32 iScale) +{ + if (iScale < 0) { + iScale = 0; + } + if (m_iVerticalScale == iScale) { + return; + } + SetBreakStatus(); + m_iVerticalScale = iScale; +} +void CFX_RTFBreak::SetCharRotation(FX_INT32 iCharRotation) +{ + if (iCharRotation < 0) { + iCharRotation += (-iCharRotation / 4 + 1) * 4; + } else if (iCharRotation > 3) { + iCharRotation -= (iCharRotation / 4) * 4; + } + if (m_iCharRotation == iCharRotation) { + return; + } + SetBreakStatus(); + m_iCharRotation = iCharRotation; + m_iRotation = m_iLineRotation + m_iCharRotation; + m_iRotation %= 4; +} +void CFX_RTFBreak::SetCharSpace(FX_FLOAT fCharSpace) +{ + m_iCharSpace = FXSYS_round(fCharSpace * 20000.0f); +} +void CFX_RTFBreak::SetWordSpace(FX_BOOL bDefault, FX_FLOAT fWordSpace) +{ + m_bWordSpace = !bDefault; + m_iWordSpace = FXSYS_round(fWordSpace * 20000.0f); +} +void CFX_RTFBreak::SetReadingOrder(FX_BOOL bRTL) +{ + m_bRTL = bRTL; +} +void CFX_RTFBreak::SetAlignment(FX_INT32 iAlignment) +{ + FXSYS_assert(iAlignment >= FX_RTFLINEALIGNMENT_Left && iAlignment <= FX_RTFLINEALIGNMENT_Distributed); + m_iAlignment = iAlignment; +} +void CFX_RTFBreak::SetUserData(IFX_Unknown *pUserData) +{ + if (m_pUserData == pUserData) { + return; + } + SetBreakStatus(); + if (m_pUserData != NULL) { + m_pUserData->Release(); + } + m_pUserData = pUserData; + if (m_pUserData != NULL) { + m_pUserData->AddRef(); + } +} +static const FX_INT32 gs_FX_RTFLineRotations[8] = {0, 3, 1, 0, 2, 1, 3, 2}; +FX_INT32 CFX_RTFBreak::GetLineRotation(FX_DWORD dwStyles) const +{ + return gs_FX_RTFLineRotations[(dwStyles & 0x0E) >> 1]; +} +void CFX_RTFBreak::SetBreakStatus() +{ + m_dwIdentity ++; + FX_INT32 iCount = m_pCurLine->CountChars(); + if (iCount < 1) { + return; + } + CFX_RTFChar &tc = m_pCurLine->GetChar(iCount - 1); + if (tc.m_dwStatus == 0) { + tc.m_dwStatus = FX_RTFBREAK_PieceBreak; + } +} +CFX_RTFChar* CFX_RTFBreak::GetLastChar(FX_INT32 index) const +{ + CFX_RTFCharArray &tca = m_pCurLine->m_LineChars; + FX_INT32 iCount = tca.GetSize(); + if (index < 0 || index >= iCount) { + return NULL; + } + CFX_RTFChar *pTC; + FX_INT32 iStart = iCount - 1; + while (iStart > -1) { + pTC = tca.GetDataPtr(iStart --); + if (pTC->m_iCharWidth >= 0 || pTC->GetCharType() != FX_CHARTYPE_Combination) { + if (--index < 0) { + return pTC; + } + } + } + return NULL; +} +CFX_RTFLine* CFX_RTFBreak::GetRTFLine(FX_BOOL bReady) const +{ + if (bReady) { + if (m_iReady == 1) { + return (CFX_RTFLine*)&m_RTFLine1; + } else if (m_iReady == 2) { + return (CFX_RTFLine*)&m_RTFLine2; + } else { + return NULL; + } + } + FXSYS_assert(m_pCurLine != NULL); + return m_pCurLine; +} +CFX_RTFPieceArray* CFX_RTFBreak::GetRTFPieces(FX_BOOL bReady) const +{ + CFX_RTFLine *pRTFLine = GetRTFLine(bReady); + if (pRTFLine == NULL) { + return NULL; + } + return &pRTFLine->m_LinePieces; +} +inline FX_DWORD CFX_RTFBreak::GetUnifiedCharType(FX_DWORD dwType) const +{ + return dwType >= FX_CHARTYPE_ArabicAlef ? FX_CHARTYPE_Arabic : dwType; +} +FX_INT32 CFX_RTFBreak::GetLastPositionedTab() const +{ + FX_INT32 iCount = m_PositionedTabs.GetSize(); + if (iCount < 1) { + return m_iLineStart; + } + return m_PositionedTabs[iCount - 1]; +} +FX_BOOL CFX_RTFBreak::GetPositionedTab(FX_INT32 &iTabPos) const +{ + FX_INT32 iCount = m_PositionedTabs.GetSize(); + for (FX_INT32 i = 0; i < iCount; i ++) { + if (m_PositionedTabs[i] > iTabPos) { + iTabPos = m_PositionedTabs[i]; + return TRUE; + } + } + return FALSE; +} +typedef FX_DWORD (CFX_RTFBreak::*FX_RTFBreak_LPFAppendChar)(CFX_RTFChar *pCurChar, FX_INT32 iRotation); +static const FX_RTFBreak_LPFAppendChar g_FX_RTFBreak_lpfAppendChar[16] = { + &CFX_RTFBreak::AppendChar_Others, + &CFX_RTFBreak::AppendChar_Tab, + &CFX_RTFBreak::AppendChar_Others, + &CFX_RTFBreak::AppendChar_Control, + &CFX_RTFBreak::AppendChar_Combination, + &CFX_RTFBreak::AppendChar_Others, + &CFX_RTFBreak::AppendChar_Others, + &CFX_RTFBreak::AppendChar_Arabic, + &CFX_RTFBreak::AppendChar_Arabic, + &CFX_RTFBreak::AppendChar_Arabic, + &CFX_RTFBreak::AppendChar_Arabic, + &CFX_RTFBreak::AppendChar_Arabic, + &CFX_RTFBreak::AppendChar_Arabic, + &CFX_RTFBreak::AppendChar_Others, + &CFX_RTFBreak::AppendChar_Others, + &CFX_RTFBreak::AppendChar_Others, +}; +FX_DWORD CFX_RTFBreak::AppendChar(FX_WCHAR wch) +{ + FXSYS_assert(m_pFont != NULL && m_pCurLine != NULL && m_pArabicChar != NULL); + if (m_bCharCode) { + return AppendChar_CharCode(wch); + } + FX_DWORD dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch]; + FX_DWORD dwType = (dwProps & FX_CHARTYPEBITSMASK); + CFX_RTFCharArray &tca = m_pCurLine->m_LineChars; + CFX_RTFChar *pCurChar = tca.AddSpace(); + pCurChar->m_dwStatus = 0; + pCurChar->m_wCharCode = wch; + pCurChar->m_dwCharProps = dwProps; + pCurChar->m_dwCharStyles = 0; + pCurChar->m_dwLayoutStyles = 0; + pCurChar->m_iFontSize = m_iFontSize; + pCurChar->m_iFontHeight = m_iFontHeight; + pCurChar->m_iHorizontalScale = m_iHorizontalScale; + pCurChar->m_iVertialScale = m_iVerticalScale; + pCurChar->m_nRotation = m_iCharRotation; + pCurChar->m_iCharWidth = 0; + pCurChar->m_dwIdentity = m_dwIdentity; + if (m_pUserData != NULL) { + m_pUserData->AddRef(); + } + pCurChar->m_pUserData = m_pUserData; + FX_DWORD dwRet1 = FX_RTFBREAK_None; + if (dwType != FX_CHARTYPE_Combination && GetUnifiedCharType(m_dwCharType) != GetUnifiedCharType(dwType)) { + if (!m_bSingleLine && !m_bOrphanLine && m_dwCharType > 0 && m_pCurLine->GetLineEnd() > m_iLineEnd + m_iTolerance) { + if (m_dwCharType != FX_CHARTYPE_Space || dwType != FX_CHARTYPE_Control) { + dwRet1 = EndBreak(FX_RTFBREAK_LineBreak); + FX_INT32 iCount = m_pCurLine->CountChars(); + if (iCount > 0) { + pCurChar = m_pCurLine->m_LineChars.GetDataPtr(iCount - 1); + } + } + } + } + FX_INT32 iRotation = m_iRotation; + if (m_bVertical && (dwProps & 0x8000) != 0) { + iRotation = (iRotation + 1) % 4; + } + FX_DWORD dwRet2 = (this->*g_FX_RTFBreak_lpfAppendChar[dwType >> FX_CHARTYPEBITS])(pCurChar, iRotation); + m_dwCharType = dwType; + return FX_MAX(dwRet1, dwRet2); +} +FX_DWORD CFX_RTFBreak::AppendChar_CharCode(FX_WCHAR wch) +{ + FXSYS_assert(m_pFont != NULL && m_pCurLine != NULL); + FXSYS_assert(m_bCharCode); + m_pCurLine->m_iMBCSChars ++; + CFX_RTFCharArray &tca = m_pCurLine->m_LineChars; + CFX_RTFChar *pCurChar = tca.AddSpace(); + pCurChar->m_dwStatus = 0; + pCurChar->m_wCharCode = wch; + pCurChar->m_dwCharProps = 0; + pCurChar->m_dwCharStyles = 0; + pCurChar->m_dwLayoutStyles = m_dwLayoutStyles; + pCurChar->m_iFontSize = m_iFontSize; + pCurChar->m_iFontHeight = m_iFontHeight; + pCurChar->m_iHorizontalScale = m_iHorizontalScale; + pCurChar->m_iVertialScale = m_iVerticalScale; + pCurChar->m_nRotation = m_iCharRotation; + pCurChar->m_iCharWidth = 0; + pCurChar->m_dwIdentity = m_dwIdentity; + if (m_pUserData != NULL) { + m_pUserData->AddRef(); + } + pCurChar->m_pUserData = m_pUserData; + FX_INT32 iCharWidth = 0; + if (m_bVertical != FX_IsOdd(m_iRotation)) { + iCharWidth = 1000; + } else { + if (!m_pFont->GetCharWidth(wch, iCharWidth, TRUE)) { + iCharWidth = m_iDefChar; + } + } + iCharWidth *= m_iFontSize; + iCharWidth = iCharWidth * m_iHorizontalScale / 100; + iCharWidth += m_iCharSpace; + pCurChar->m_iCharWidth = iCharWidth; + m_pCurLine->m_iWidth += iCharWidth; + m_dwCharType = 0; + if (!m_bSingleLine && m_pCurLine->GetLineEnd() > m_iLineEnd + m_iTolerance) { + return EndBreak(FX_RTFBREAK_LineBreak); + } + return FX_RTFBREAK_None; +} +FX_DWORD CFX_RTFBreak::AppendChar_Combination(CFX_RTFChar *pCurChar, FX_INT32 iRotation) +{ + FX_INT32 iCharWidth = 0; + if (m_bVertical != FX_IsOdd(iRotation)) { + iCharWidth = 1000; + } else { + if (!m_pFont->GetCharWidth(pCurChar->m_wCharCode, iCharWidth, m_bCharCode)) { + iCharWidth = 0; + } + } + iCharWidth *= m_iFontSize; + iCharWidth = iCharWidth * m_iHorizontalScale / 100; + CFX_RTFChar *pLastChar = GetLastChar(0); + if (pLastChar != NULL && pLastChar->GetCharType() > FX_CHARTYPE_Combination) { + iCharWidth = -iCharWidth; + } else { + m_dwCharType = FX_CHARTYPE_Combination; + } + pCurChar->m_iCharWidth = iCharWidth; + if (iCharWidth > 0) { + m_pCurLine->m_iWidth += iCharWidth; + } + return FX_RTFBREAK_None; +} +FX_DWORD CFX_RTFBreak::AppendChar_Tab(CFX_RTFChar *pCurChar, FX_INT32 iRotation) +{ + if (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_ExpandTab) { + FX_BOOL bBreak = FALSE; + if ((m_dwPolicies & FX_RTFBREAKPOLICY_TabBreak) != 0) { + bBreak = (m_pCurLine->GetLineEnd() > m_iLineEnd + m_iTolerance); + } + FX_INT32 &iLineWidth = m_pCurLine->m_iWidth; + FX_INT32 iCharWidth = iLineWidth; + if (GetPositionedTab(iCharWidth)) { + iCharWidth -= iLineWidth; + } else { + iCharWidth = m_iTabWidth * (iLineWidth / m_iTabWidth + 1) - iLineWidth; + } + pCurChar->m_iCharWidth = iCharWidth; + iLineWidth += iCharWidth; + if (!m_bSingleLine && !m_bOrphanLine && bBreak) { + return EndBreak(FX_RTFBREAK_LineBreak); + } + } + return FX_RTFBREAK_None; +} +FX_DWORD CFX_RTFBreak::AppendChar_Control(CFX_RTFChar *pCurChar, FX_INT32 iRotation) +{ + FX_DWORD dwRet2 = FX_RTFBREAK_None; + if (!m_bSingleLine) { + switch (pCurChar->m_wCharCode) { + case L'\v': + case 0x2028: + dwRet2 = FX_RTFBREAK_LineBreak; + break; + case L'\f': + dwRet2 = FX_RTFBREAK_PageBreak; + break; + case 0x2029: + dwRet2 = FX_RTFBREAK_ParagraphBreak; + break; + default: + if (pCurChar->m_wCharCode == m_wLineBreakChar) { + dwRet2 = FX_RTFBREAK_ParagraphBreak; + } + break; + } + if (dwRet2 != FX_RTFBREAK_None) { + dwRet2 = EndBreak(dwRet2); + } + } + return dwRet2; +} +FX_DWORD CFX_RTFBreak::AppendChar_Arabic(CFX_RTFChar *pCurChar, FX_INT32 iRotation) +{ + CFX_RTFChar *pLastChar = NULL; + FX_INT32 &iLineWidth = m_pCurLine->m_iWidth; + FX_INT32 iCharWidth = 0; + FX_WCHAR wForm; + FX_BOOL bAlef = FALSE; + if (m_dwCharType >= FX_CHARTYPE_ArabicAlef && m_dwCharType <= FX_CHARTYPE_ArabicDistortion) { + pLastChar = GetLastChar(1); + if (pLastChar != NULL) { + iLineWidth -= pLastChar->m_iCharWidth; + CFX_RTFChar *pPrevChar = GetLastChar(2); + wForm = m_pArabicChar->GetFormChar(pLastChar, pPrevChar, pCurChar); + bAlef = (wForm == 0xFEFF && pLastChar->GetCharType() == FX_CHARTYPE_ArabicAlef); + FX_INT32 iLastRotation = pLastChar->m_nRotation + m_iLineRotation; + if (m_bVertical && (pLastChar->m_dwCharProps & 0x8000) != 0) { + iLastRotation ++; + } + if (m_bVertical != FX_IsOdd(iLastRotation)) { + iCharWidth = 1000; + } else { + if (!m_pFont->GetCharWidth(wForm, iCharWidth, m_bCharCode)) + if (!m_pFont->GetCharWidth(pLastChar->m_wCharCode, iCharWidth, m_bCharCode)) { + iCharWidth = m_iDefChar; + } + } + iCharWidth *= m_iFontSize; + iCharWidth = iCharWidth * m_iHorizontalScale / 100; + pLastChar->m_iCharWidth = iCharWidth; + iLineWidth += iCharWidth; + iCharWidth = 0; + } + } + wForm = m_pArabicChar->GetFormChar(pCurChar, (bAlef ? NULL : pLastChar), NULL); + if (m_bVertical != FX_IsOdd(iRotation)) { + iCharWidth = 1000; + } else { + if (!m_pFont->GetCharWidth(wForm, iCharWidth, m_bCharCode)) + if (!m_pFont->GetCharWidth(pCurChar->m_wCharCode, iCharWidth, m_bCharCode)) { + iCharWidth = m_iDefChar; + } + } + iCharWidth *= m_iFontSize; + iCharWidth = iCharWidth * m_iHorizontalScale / 100; + pCurChar->m_iCharWidth = iCharWidth; + iLineWidth += iCharWidth; + m_pCurLine->m_iArabicChars ++; + if (!m_bSingleLine && !m_bOrphanLine && m_pCurLine->GetLineEnd() > m_iLineEnd + m_iTolerance) { + return EndBreak(FX_RTFBREAK_LineBreak); + } + return FX_RTFBREAK_None; +} +FX_DWORD CFX_RTFBreak::AppendChar_Others(CFX_RTFChar *pCurChar, FX_INT32 iRotation) +{ + FX_DWORD dwType = (pCurChar->m_dwCharProps & FX_CHARTYPEBITSMASK); + FX_WCHAR wForm; + if (dwType == FX_CHARTYPE_Numeric) { + if (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_ArabicNumber) { + wForm = pCurChar->m_wCharCode + 0x0630; + } else { + wForm = pCurChar->m_wCharCode; + } + } else if (m_bRTL || m_bVertical) { + wForm = FX_GetMirrorChar(pCurChar->m_wCharCode, pCurChar->m_dwCharProps, m_bRTL, m_bVertical); + } else { + wForm = pCurChar->m_wCharCode; + } + FX_INT32 iCharWidth = 0; + if (m_bVertical != FX_IsOdd(iRotation)) { + iCharWidth = 1000; + } else { + if (!m_pFont->GetCharWidth(wForm, iCharWidth, m_bCharCode)) { + iCharWidth = m_iDefChar; + } + } + iCharWidth *= m_iFontSize; + iCharWidth = iCharWidth * m_iHorizontalScale / 100; + iCharWidth += m_iCharSpace; + if (dwType == FX_CHARTYPE_Space && m_bWordSpace) { + iCharWidth += m_iWordSpace; + } + pCurChar->m_iCharWidth = iCharWidth; + m_pCurLine->m_iWidth += iCharWidth; + FX_BOOL bBreak = (dwType != FX_CHARTYPE_Space || (m_dwPolicies & FX_RTFBREAKPOLICY_SpaceBreak) != 0); + if (!m_bSingleLine && !m_bOrphanLine && bBreak && m_pCurLine->GetLineEnd() > m_iLineEnd + m_iTolerance) { + return EndBreak(FX_RTFBREAK_LineBreak); + } + return FX_RTFBREAK_None; +} +FX_DWORD CFX_RTFBreak::EndBreak(FX_DWORD dwStatus) +{ + FXSYS_assert(dwStatus >= FX_RTFBREAK_PieceBreak && dwStatus <= FX_RTFBREAK_PageBreak); + m_dwIdentity ++; + CFX_RTFPieceArray *pCurPieces = &m_pCurLine->m_LinePieces; + FX_INT32 iCount = pCurPieces->GetSize(); + if (iCount > 0) { + CFX_RTFPiece *pLastPiece = pCurPieces->GetPtrAt(-- iCount); + if (dwStatus > FX_RTFBREAK_PieceBreak) { + pLastPiece->m_dwStatus = dwStatus; + } else { + dwStatus = pLastPiece->m_dwStatus; + } + return dwStatus; + } else { + CFX_RTFLine *pLastLine = GetRTFLine(TRUE); + if (pLastLine != NULL) { + pCurPieces = &pLastLine->m_LinePieces; + iCount = pCurPieces->GetSize(); + if (iCount -- > 0) { + CFX_RTFPiece *pLastPiece = pCurPieces->GetPtrAt(iCount); + if (dwStatus > FX_RTFBREAK_PieceBreak) { + pLastPiece->m_dwStatus = dwStatus; + } else { + dwStatus = pLastPiece->m_dwStatus; + } + return dwStatus; + } + return FX_RTFBREAK_None; + } + iCount = m_pCurLine->CountChars(); + if (iCount < 1) { + return FX_RTFBREAK_None; + } + CFX_RTFChar &tc = m_pCurLine->GetChar(iCount - 1); + tc.m_dwStatus = dwStatus; + if (dwStatus <= FX_RTFBREAK_PieceBreak) { + return dwStatus; + } + } + m_iReady = (m_pCurLine == &m_RTFLine1) ? 1 : 2; + CFX_RTFLine *pNextLine = (m_pCurLine == &m_RTFLine1) ? &m_RTFLine2 : &m_RTFLine1; + FX_BOOL bAllChars = (m_iAlignment > FX_RTFLINEALIGNMENT_Right); + CFX_TPOArray tpos; + if (EndBreak_SplitLine(pNextLine, bAllChars, dwStatus)) { + goto EndBreak_Ret; + } + if (!m_bCharCode) { + EndBreak_BidiLine(tpos, dwStatus); + } + if (!m_bPagination && m_iAlignment > FX_RTFLINEALIGNMENT_Left) { + EndBreak_Alignment(tpos, bAllChars, dwStatus); + } +EndBreak_Ret: + m_pCurLine = pNextLine; + m_pCurLine->m_iStart = m_iLineStart; + CFX_RTFChar *pTC = GetLastChar(0); + m_dwCharType = pTC == NULL ? 0 : pTC->GetCharType(); + return dwStatus; +} +FX_BOOL CFX_RTFBreak::EndBreak_SplitLine(CFX_RTFLine *pNextLine, FX_BOOL bAllChars, FX_DWORD dwStatus) +{ + FX_BOOL bDone = FALSE; + if (!m_bSingleLine && !m_bOrphanLine && m_pCurLine->GetLineEnd() > m_iLineEnd + m_iTolerance) { + CFX_RTFChar &tc = m_pCurLine->GetChar(m_pCurLine->CountChars() - 1); + switch (tc.GetCharType()) { + case FX_CHARTYPE_Tab: + if ((m_dwPolicies & FX_RTFBREAKPOLICY_TabBreak) != 0) { + SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars); + bDone = TRUE; + } + break; + case FX_CHARTYPE_Control: + break; + case FX_CHARTYPE_Space: + if ((m_dwPolicies & FX_RTFBREAKPOLICY_SpaceBreak) != 0) { + SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars); + bDone = TRUE; + } + break; + default: + SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars); + bDone = TRUE; + break; + } + } + if (m_bPagination || m_pCurLine->m_iMBCSChars > 0) { + const CFX_RTFChar *pCurChars = m_pCurLine->m_LineChars.GetData(); + const CFX_RTFChar *pTC; + CFX_RTFPieceArray *pCurPieces = &m_pCurLine->m_LinePieces; + CFX_RTFPiece tp; + tp.m_pChars = &m_pCurLine->m_LineChars; + FX_BOOL bNew = TRUE; + FX_DWORD dwIdentity = (FX_DWORD) - 1; + FX_INT32 iLast = m_pCurLine->CountChars() - 1, j = 0; + for (FX_INT32 i = 0; i <= iLast;) { + pTC = pCurChars + i; + if (bNew) { + tp.m_iStartChar = i; + tp.m_iStartPos += tp.m_iWidth; + tp.m_iWidth = 0; + tp.m_dwStatus = pTC->m_dwStatus; + tp.m_iFontSize = pTC->m_iFontSize; + tp.m_iFontHeight = pTC->m_iFontHeight; + tp.m_iHorizontalScale = pTC->m_iHorizontalScale; + tp.m_iVerticalScale = pTC->m_iVertialScale; + tp.m_dwLayoutStyles = pTC->m_dwLayoutStyles; + dwIdentity = pTC->m_dwIdentity; + tp.m_dwIdentity = dwIdentity; + tp.m_pUserData = pTC->m_pUserData; + j = i; + bNew = FALSE; + } + if (i == iLast || pTC->m_dwStatus != FX_RTFBREAK_None || pTC->m_dwIdentity != dwIdentity) { + tp.m_iChars = i - j; + if (pTC->m_dwIdentity == dwIdentity) { + tp.m_dwStatus = pTC->m_dwStatus; + tp.m_iWidth += pTC->m_iCharWidth; + tp.m_iChars += 1; + i ++; + } + pCurPieces->Add(tp); + bNew = TRUE; + } else { + tp.m_iWidth += pTC->m_iCharWidth; + i ++; + } + } + return TRUE; + } + if (bAllChars && !bDone) { + FX_INT32 iEndPos = m_pCurLine->GetLineEnd(); + GetBreakPos(m_pCurLine->m_LineChars, iEndPos, bAllChars, TRUE); + } + return FALSE; +} +void CFX_RTFBreak::EndBreak_BidiLine(CFX_TPOArray &tpos, FX_DWORD dwStatus) +{ + FX_TPO tpo; + CFX_RTFPiece tp; + CFX_RTFChar *pTC; + FX_INT32 i, j; + CFX_RTFCharArray &chars = m_pCurLine->m_LineChars; + FX_INT32 iCount = m_pCurLine->CountChars(); + FX_BOOL bDone = (!m_bPagination && !m_bCharCode && (m_pCurLine->m_iArabicChars > 0 || m_bRTL)); + if (bDone) { + FX_INT32 iBidiNum = 0; + for (i = 0; i < iCount; i ++) { + pTC = chars.GetDataPtr(i); + pTC->m_iBidiPos = i; + if (pTC->GetCharType() != FX_CHARTYPE_Control) { + iBidiNum = i; + } + if (i == 0) { + pTC->m_iBidiLevel = 1; + } + } + FX_BidiLine(chars, iBidiNum + 1, m_bRTL ? 1 : 0); + } else { + for (i = 0; i < iCount; i ++) { + pTC = chars.GetDataPtr(i); + pTC->m_iBidiLevel = 0; + pTC->m_iBidiPos = 0; + pTC->m_iBidiOrder = 0; + } + } + tp.m_dwStatus = FX_RTFBREAK_PieceBreak; + tp.m_iStartPos = m_pCurLine->m_iStart; + tp.m_pChars = &chars; + CFX_RTFPieceArray *pCurPieces = &m_pCurLine->m_LinePieces; + FX_INT32 iBidiLevel = -1, iCharWidth; + FX_DWORD dwIdentity = (FX_DWORD) - 1; + i = j = 0; + while (i < iCount) { + pTC = chars.GetDataPtr(i); + if (iBidiLevel < 0) { + iBidiLevel = pTC->m_iBidiLevel; + iCharWidth = pTC->m_iCharWidth; + if (iCharWidth < 1) { + tp.m_iWidth = 0; + } else { + tp.m_iWidth = iCharWidth; + } + tp.m_iBidiLevel = iBidiLevel; + tp.m_iBidiPos = pTC->m_iBidiOrder; + tp.m_iFontSize = pTC->m_iFontSize; + tp.m_iFontHeight = pTC->m_iFontHeight; + tp.m_iHorizontalScale = pTC->m_iHorizontalScale; + tp.m_iVerticalScale = pTC->m_iVertialScale; + dwIdentity = pTC->m_dwIdentity; + tp.m_dwIdentity = dwIdentity; + tp.m_pUserData = pTC->m_pUserData; + tp.m_dwStatus = FX_RTFBREAK_PieceBreak; + i ++; + } else if (iBidiLevel != pTC->m_iBidiLevel || pTC->m_dwIdentity != dwIdentity) { + tp.m_iChars = i - tp.m_iStartChar; + pCurPieces->Add(tp); + tp.m_iStartPos += tp.m_iWidth; + tp.m_iStartChar = i; + tpo.index = j ++; + tpo.pos = tp.m_iBidiPos; + tpos.Add(tpo); + iBidiLevel = -1; + } else { + iCharWidth = pTC->m_iCharWidth; + if (iCharWidth > 0) { + tp.m_iWidth += iCharWidth; + } + i ++; + } + } + if (i > tp.m_iStartChar) { + tp.m_dwStatus = dwStatus; + tp.m_iChars = i - tp.m_iStartChar; + pCurPieces->Add(tp); + tpo.index = j; + tpo.pos = tp.m_iBidiPos; + tpos.Add(tpo); + } + if (!m_bCharCode) { + j = tpos.GetSize() - 1; + FX_TEXTLAYOUT_PieceSort(tpos, 0, j); + FX_INT32 iStartPos = m_pCurLine->m_iStart; + for (i = 0; i <= j; i ++) { + tpo = tpos.GetAt(i); + CFX_RTFPiece &ttp = pCurPieces->GetAt(tpo.index); + ttp.m_iStartPos = iStartPos; + iStartPos += ttp.m_iWidth; + } + } +} +void CFX_RTFBreak::EndBreak_Alignment(CFX_TPOArray &tpos, FX_BOOL bAllChars, FX_DWORD dwStatus) +{ + CFX_RTFPieceArray *pCurPieces = &m_pCurLine->m_LinePieces; + FX_INT32 iNetWidth = m_pCurLine->m_iWidth, iGapChars = 0, iCharWidth; + FX_INT32 iCount = pCurPieces->GetSize(); + FX_BOOL bFind = FALSE; + FX_DWORD dwCharType; + FX_INT32 i, j; + FX_TPO tpo; + for (i = iCount - 1; i > -1; i --) { + tpo = tpos.GetAt(i); + CFX_RTFPiece &ttp = pCurPieces->GetAt(tpo.index); + if (!bFind) { + iNetWidth = ttp.GetEndPos(); + } + FX_BOOL bArabic = FX_IsOdd(ttp.m_iBidiLevel); + j = bArabic ? 0 : ttp.m_iChars - 1; + while (j > -1 && j < ttp.m_iChars) { + const CFX_RTFChar &tc = ttp.GetChar(j); + if (tc.m_nBreakType == FX_LBT_DIRECT_BRK) { + iGapChars ++; + } + if (!bFind || !bAllChars) { + dwCharType = tc.GetCharType(); + if (dwCharType == FX_CHARTYPE_Space || dwCharType == FX_CHARTYPE_Control) { + if (!bFind) { + iCharWidth = tc.m_iCharWidth; + if (bAllChars && iCharWidth > 0) { + iNetWidth -= iCharWidth; + } + } + } else { + bFind = TRUE; + if (!bAllChars) { + break; + } + } + } + j += bArabic ? 1 : -1; + } + if (!bAllChars && bFind) { + break; + } + } + FX_INT32 iOffset = m_iLineEnd - iNetWidth; + FX_INT32 iLowerAlignment = (m_iAlignment & FX_RTFLINEALIGNMENT_LowerMask); + FX_INT32 iHigherAlignment = (m_iAlignment & FX_RTFLINEALIGNMENT_HigherMask); + if (iGapChars > 0 && (iHigherAlignment == FX_RTFLINEALIGNMENT_Distributed || (iHigherAlignment == FX_RTFLINEALIGNMENT_Justified && dwStatus != FX_RTFBREAK_ParagraphBreak))) { + FX_INT32 iStart = -1; + for (i = 0; i < iCount; i ++) { + tpo = tpos.GetAt(i); + CFX_RTFPiece &ttp = pCurPieces->GetAt(tpo.index); + if (iStart < 0) { + iStart = ttp.m_iStartPos; + } else { + ttp.m_iStartPos = iStart; + } + FX_INT32 k; + for (j = 0; j < ttp.m_iChars; j ++) { + CFX_RTFChar &tc = ttp.GetChar(j); + if (tc.m_nBreakType != FX_LBT_DIRECT_BRK || tc.m_iCharWidth < 0) { + continue; + } + k = iOffset / iGapChars; + tc.m_iCharWidth += k; + ttp.m_iWidth += k; + iOffset -= k; + iGapChars --; + if (iGapChars < 1) { + break; + } + } + iStart += ttp.m_iWidth; + } + } else if (iLowerAlignment > FX_RTFLINEALIGNMENT_Left) { + if (iLowerAlignment == FX_RTFLINEALIGNMENT_Center) { + iOffset /= 2; + } + if (iOffset > 0) { + for (i = 0; i < iCount; i ++) { + CFX_RTFPiece &ttp = pCurPieces->GetAt(i); + ttp.m_iStartPos += iOffset; + } + } + } +} +FX_INT32 CFX_RTFBreak::GetBreakPos(CFX_RTFCharArray &tca, FX_INT32 &iEndPos, FX_BOOL bAllChars, FX_BOOL bOnlyBrk) +{ + FX_INT32 iLength = tca.GetSize() - 1; + if (iLength < 1) { + return iLength; + } + FX_INT32 iBreak = -1, iBreakPos = -1, iIndirect = -1, iIndirectPos = -1, iLast = -1, iLastPos = -1; + if (m_bSingleLine || m_bOrphanLine || iEndPos <= m_iLineEnd) { + if (!bAllChars || m_bCharCode) { + return iLength; + } + iBreak = iLength; + iBreakPos = iEndPos; + } + CFX_RTFChar *pCharArray = tca.GetData(); + if (m_bCharCode) { + const CFX_RTFChar *pChar; + FX_INT32 iCharWidth; + while (iLength > 0) { + if (iEndPos <= m_iLineEnd) { + break; + } + pChar = pCharArray + iLength--; + iCharWidth = pChar->m_iCharWidth; + if (iCharWidth > 0) { + iEndPos -= iCharWidth; + } + } + return iLength; + } + FX_BOOL bSpaceBreak = (m_dwPolicies & FX_RTFBREAKPOLICY_SpaceBreak) != 0; + FX_BOOL bTabBreak = (m_dwPolicies & FX_RTFBREAKPOLICY_TabBreak) != 0; + FX_BOOL bNumberBreak = (m_dwPolicies & FX_RTFBREAKPOLICY_NumberBreak) != 0; + FX_BOOL bInfixBreak = (m_dwPolicies & FX_RTFBREAKPOLICY_InfixBreak) != 0; + FX_LINEBREAKTYPE eType; + FX_DWORD nCodeProp, nCur, nNext; + CFX_RTFChar *pCur = pCharArray + iLength--; + if (bAllChars) { + pCur->m_nBreakType = FX_LBT_UNKNOWN; + } + nCodeProp = pCur->m_dwCharProps; + nNext = nCodeProp & 0x003F; + FX_INT32 iCharWidth = pCur->m_iCharWidth; + if (iCharWidth > 0) { + iEndPos -= iCharWidth; + } + while (iLength >= 0) { + pCur = pCharArray + iLength; + nCodeProp = pCur->m_dwCharProps; + nCur = nCodeProp & 0x003F; + FX_BOOL bNeedBreak = FALSE; + if (nCur == FX_CBP_SP) { + bNeedBreak = !bSpaceBreak; + if (nNext == FX_CBP_SP) { + eType = bSpaceBreak ? FX_LBT_DIRECT_BRK : FX_LBT_PROHIBITED_BRK; + } else { + eType = *((const FX_LINEBREAKTYPE *)gs_FX_LineBreak_PairTable + (nCur << 5) + nNext); + } + } else if (nCur == FX_CBP_TB) { + bNeedBreak = !bTabBreak; + if (nNext == FX_CBP_TB) { + eType = bTabBreak ? FX_LBT_DIRECT_BRK : FX_LBT_PROHIBITED_BRK; + } else { + eType = *((const FX_LINEBREAKTYPE *)gs_FX_LineBreak_PairTable + (nCur << 5) + nNext); + } + } else if (bNumberBreak && nCur == FX_CBP_NU && nNext == FX_CBP_NU) { + eType = FX_LBT_DIRECT_BRK; + } else if (bInfixBreak && nCur == FX_CBP_IS && nNext == FX_CBP_IS) { + eType = FX_LBT_DIRECT_BRK; + } else { + if (nNext == FX_CBP_SP) { + eType = FX_LBT_PROHIBITED_BRK; + } else { + eType = *((const FX_LINEBREAKTYPE *)gs_FX_LineBreak_PairTable + (nCur << 5) + nNext); + } + } + if (bAllChars) { + pCur->m_nBreakType = eType; + } + if (!bOnlyBrk) { + iCharWidth = pCur->m_iCharWidth; + FX_BOOL bBreak = FALSE; + if (nCur == FX_CBP_TB && bTabBreak) { + bBreak = iCharWidth > 0 && iEndPos - iCharWidth <= m_iLineEnd; + } else { + bBreak = iEndPos <= m_iLineEnd; + } + if (m_bSingleLine || m_bOrphanLine || bBreak || bNeedBreak) { + if (eType == FX_LBT_DIRECT_BRK && iBreak < 0) { + iBreak = iLength; + iBreakPos = iEndPos; + if (!bAllChars) { + return iLength; + } + } else if (eType == FX_LBT_INDIRECT_BRK && iIndirect < 0) { + iIndirect = iLength; + iIndirectPos = iEndPos; + } + if (iLast < 0) { + iLast = iLength; + iLastPos = iEndPos; + } + } + if (iCharWidth > 0) { + iEndPos -= iCharWidth; + } + } + nNext = nCodeProp & 0x003F; + iLength --; + } + if (bOnlyBrk) { + return 0; + } + if (iBreak > -1) { + iEndPos = iBreakPos; + return iBreak; + } + if (iIndirect > -1) { + iEndPos = iIndirectPos; + return iIndirect; + } + if (iLast > -1) { + iEndPos = iLastPos; + return iLast; + } + return 0; +} +void CFX_RTFBreak::SplitTextLine(CFX_RTFLine *pCurLine, CFX_RTFLine *pNextLine, FX_BOOL bAllChars) +{ + FXSYS_assert(pCurLine != NULL && pNextLine != NULL); + FX_INT32 iCount = pCurLine->CountChars(); + if (iCount < 2) { + return; + } + FX_INT32 iEndPos = pCurLine->GetLineEnd(); + CFX_RTFCharArray &curChars = pCurLine->m_LineChars; + FX_INT32 iCharPos = GetBreakPos(curChars, iEndPos, bAllChars, FALSE); + if (iCharPos < 0) { + iCharPos = 0; + } + iCharPos ++; + if (iCharPos >= iCount) { + pNextLine->RemoveAll(TRUE); + CFX_Char *pTC = curChars.GetDataPtr(iCharPos - 1); + pTC->m_nBreakType = FX_LBT_UNKNOWN; + return; + } + CFX_RTFCharArray &nextChars = pNextLine->m_LineChars; + int cur_size = curChars.GetSize(); + nextChars.SetSize(cur_size - iCharPos); + FXSYS_memcpy(nextChars.GetData(), curChars.GetDataPtr(iCharPos), (cur_size - iCharPos) * sizeof(CFX_RTFChar)); + iCount -= iCharPos; + cur_size = curChars.GetSize(); + curChars.RemoveAt(cur_size - iCount, iCount); + pNextLine->m_iStart = pCurLine->m_iStart; + pNextLine->m_iWidth = pCurLine->GetLineEnd() - iEndPos; + pCurLine->m_iWidth = iEndPos; + CFX_RTFChar* tc = curChars.GetDataPtr(iCharPos - 1); + tc->m_nBreakType = FX_LBT_UNKNOWN; + iCount = nextChars.GetSize(); + CFX_RTFChar *pNextChars = nextChars.GetData(); + for (FX_INT32 i = 0; i < iCount; i ++) { + CFX_RTFChar* tc = pNextChars + i; + if (tc->GetCharType() >= FX_CHARTYPE_ArabicAlef) { + pCurLine->m_iArabicChars --; + pNextLine->m_iArabicChars ++; + } + if (tc->m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_MBCSCode) { + pCurLine->m_iMBCSChars --; + pNextLine->m_iMBCSChars ++; + } + tc->m_dwStatus = 0; + } +} +FX_INT32 CFX_RTFBreak::CountBreakPieces() const +{ + CFX_RTFPieceArray *pRTFPieces = GetRTFPieces(TRUE); + if (pRTFPieces == NULL) { + return 0; + } + return pRTFPieces->GetSize(); +} +const CFX_RTFPiece* CFX_RTFBreak::GetBreakPiece(FX_INT32 index) const +{ + CFX_RTFPieceArray *pRTFPieces = GetRTFPieces(TRUE); + if (pRTFPieces == NULL) { + return NULL; + } + if (index < 0 || index >= pRTFPieces->GetSize()) { + return NULL; + } + return pRTFPieces->GetPtrAt(index); +} +void CFX_RTFBreak::GetLineRect(CFX_RectF &rect) const +{ + rect.top = 0; + CFX_RTFLine *pRTFLine = GetRTFLine(TRUE); + if (pRTFLine == NULL) { + rect.left = ((FX_FLOAT)m_iLineStart) / 20000.0f; + rect.width = rect.height = 0; + return; + } + rect.left = ((FX_FLOAT)pRTFLine->m_iStart) / 20000.0f; + rect.width = ((FX_FLOAT)pRTFLine->m_iWidth) / 20000.0f; + CFX_RTFPieceArray &rtfPieces = pRTFLine->m_LinePieces; + FX_INT32 iCount = rtfPieces.GetSize(); + if (iCount < 1) { + rect.width = 0; + return; + } + CFX_RTFPiece *pBreakPiece; + FX_INT32 iLineHeight = 0, iMax; + for (FX_INT32 i = 0; i < iCount; i ++) { + pBreakPiece = rtfPieces.GetPtrAt(i); + FX_INT32 iFontHeight = FXSYS_round(pBreakPiece->m_iFontHeight * pBreakPiece->m_iVerticalScale / 100.0f); + iMax = FX_MAX(pBreakPiece->m_iFontSize, iFontHeight); + if (i == 0) { + iLineHeight = iMax; + } else if (iLineHeight < iMax) { + iLineHeight = iMax; + } + } + rect.height = ((FX_FLOAT)iLineHeight) / 20.0f; +} +void CFX_RTFBreak::ClearBreakPieces() +{ + CFX_RTFLine *pRTFLine = GetRTFLine(TRUE); + if (pRTFLine != NULL) { + pRTFLine->RemoveAll(TRUE); + } + m_iReady = 0; +} +void CFX_RTFBreak::Reset() +{ + m_dwCharType = 0; + m_RTFLine1.RemoveAll(TRUE); + m_RTFLine2.RemoveAll(TRUE); +} +FX_INT32 CFX_RTFBreak::GetDisplayPos(FX_LPCRTFTEXTOBJ pText, FXTEXT_CHARPOS *pCharPos, FX_BOOL bCharCode , CFX_WideString *pWSForms , FX_AdjustCharDisplayPos pAdjustPos ) const +{ + if (pText == NULL || pText->iLength < 1) { + return 0; + } + FXSYS_assert(pText->pStr != NULL && pText->pWidths != NULL && pText->pFont != NULL && pText->pRect != NULL); + FX_LPCWSTR pStr = pText->pStr; + FX_INT32 *pWidths = pText->pWidths; + FX_INT32 iLength = pText->iLength - 1; + IFX_Font *pFont = pText->pFont; + FX_DWORD dwStyles = pText->dwLayoutStyles; + CFX_RectF rtText(*pText->pRect); + FX_BOOL bRTLPiece = FX_IsOdd(pText->iBidiLevel); + FX_FLOAT fFontSize = pText->fFontSize; + FX_INT32 iFontSize = FXSYS_round(fFontSize * 20.0f); + FX_INT32 iAscent = pFont->GetAscent(); + FX_INT32 iDescent = pFont->GetDescent(); + FX_INT32 iMaxHeight = iAscent - iDescent; + FX_FLOAT fFontHeight = fFontSize; + FX_FLOAT fAscent = fFontHeight * (FX_FLOAT)iAscent / (FX_FLOAT)iMaxHeight; + FX_FLOAT fDescent = fFontHeight * (FX_FLOAT)iDescent / (FX_FLOAT)iMaxHeight; + FX_BOOL bVerticalDoc = (dwStyles & FX_RTFLAYOUTSTYLE_VerticalLayout) != 0; + FX_BOOL bVerticalChar = (dwStyles & FX_RTFLAYOUTSTYLE_VerticalChars) != 0; + FX_BOOL bArabicNumber = (dwStyles & FX_RTFLAYOUTSTYLE_ArabicNumber) != 0; + FX_BOOL bMBCSCode = (dwStyles & FX_RTFLAYOUTSTYLE_MBCSCode) != 0; + FX_INT32 iRotation = GetLineRotation(dwStyles) + pText->iCharRotation; + FX_INT32 iCharRotation; + FX_WCHAR wch, wPrev = 0xFEFF, wNext, wForm; + FX_INT32 iWidth, iCharWidth, iCharHeight; + FX_FLOAT fX, fY, fCharWidth, fCharHeight; + FX_INT32 iHorScale = pText->iHorizontalScale; + FX_INT32 iVerScale = pText->iVerticalScale; + FX_BOOL bEmptyChar; + FX_DWORD dwProps, dwCharType; + fX = rtText.left; + fY = rtText.top; + if (bVerticalDoc) { + fX += (rtText.width - fFontSize) / 2.0f; + if (bRTLPiece) { + fY = rtText.bottom(); + } + } else { + if (bRTLPiece) { + fX = rtText.right(); + } + fY += fAscent; + } + FX_INT32 iCount = 0; + for (FX_INT32 i = 0; i <= iLength; i ++) { + wch = *pStr ++; + iWidth = *pWidths ++; + if (!bMBCSCode) { + dwProps = FX_GetUnicodeProperties(wch); + dwCharType = (dwProps & FX_CHARTYPEBITSMASK); + if (dwCharType == FX_CHARTYPE_ArabicAlef && iWidth == 0) { + wPrev = 0xFEFF; + continue; + } + } else { + dwProps = 0; + dwCharType = 0; + } + if (iWidth != 0) { + iCharWidth = iWidth; + if (iCharWidth < 0) { + iCharWidth = -iCharWidth; + } + if (!bMBCSCode) { + bEmptyChar = (dwCharType >= FX_CHARTYPE_Tab && dwCharType <= FX_CHARTYPE_Control); + } else { + bEmptyChar = FALSE; + } + if (!bEmptyChar) { + iCount ++; + } + if (pCharPos != NULL) { + iCharWidth /= iFontSize; + wForm = wch; + if (!bMBCSCode) { + if (dwCharType >= FX_CHARTYPE_ArabicAlef) { + if (i < iLength) { + wNext = *pStr; + if (*pWidths < 0) { + if (i + 1 < iLength) { + wNext = pStr[1]; + } + } + } else { + wNext = 0xFEFF; + } + wForm = m_pArabicChar->GetFormChar(wch, wPrev, wNext); + } else if (bRTLPiece || bVerticalChar) { + wForm = FX_GetMirrorChar(wch, dwProps, bRTLPiece, bVerticalChar); + } else if (dwCharType == FX_CHARTYPE_Numeric && bArabicNumber) { + wForm = wch + 0x0630; + } + dwProps = FX_GetUnicodeProperties(wForm); + } + iCharRotation = iRotation; + if (!bMBCSCode && bVerticalChar && (dwProps & 0x8000) != 0) { + iCharRotation ++; + iCharRotation %= 4; + } + if (!bEmptyChar) { + if (bCharCode) { + pCharPos->m_GlyphIndex = wch; + } else { + pCharPos->m_GlyphIndex = pFont->GetGlyphIndex(wForm, bMBCSCode); + if(pCharPos->m_GlyphIndex == 0xFFFF) { + pCharPos->m_GlyphIndex = pFont->GetGlyphIndex(wch, bMBCSCode); + } + } + pCharPos->m_ExtGID = pCharPos->m_GlyphIndex; + pCharPos->m_FontCharWidth = iCharWidth; + if (pWSForms) { + *pWSForms += wForm; + } + } + if (bVerticalDoc) { + iCharHeight = iCharWidth; + iCharWidth = 1000; + } else { + iCharHeight = 1000; + } + fCharWidth = fFontSize * iCharWidth / 1000.0f; + fCharHeight = fFontSize * iCharHeight / 1000.0f; + if (!bMBCSCode && bRTLPiece && dwCharType != FX_CHARTYPE_Combination) { + if (bVerticalDoc) { + fY -= fCharHeight; + } else { + fX -= fCharWidth; + } + } + if (!bEmptyChar) { + CFX_PointF ptOffset; + ptOffset.Reset(); + FX_BOOL bAdjusted = FALSE; + if (pAdjustPos) { + bAdjusted = pAdjustPos(wForm, bMBCSCode, pFont, fFontSize, bVerticalChar, ptOffset); + } + if (!pAdjustPos && bVerticalChar && (dwProps & 0x00010000) != 0) { + CFX_Rect rtBBox; + rtBBox.Reset(); + if (pFont->GetCharBBox(wForm, rtBBox, bMBCSCode)) { + ptOffset.x = fFontSize * (850 - rtBBox.right()) / 1000.0f; + ptOffset.y = fFontSize * (1000 - rtBBox.height) / 2000.0f; + } + } + pCharPos->m_OriginX = fX + ptOffset.x; + pCharPos->m_OriginY = fY - ptOffset.y; + } + if (!bRTLPiece && dwCharType != FX_CHARTYPE_Combination) { + if (bVerticalDoc) { + fY += fCharHeight; + } else { + fX += fCharWidth; + } + } + if (!bEmptyChar) { + pCharPos->m_bGlyphAdjust = TRUE; + if (bVerticalDoc) { + if (iCharRotation == 0) { + pCharPos->m_AdjustMatrix[0] = -1; + pCharPos->m_AdjustMatrix[1] = 0; + pCharPos->m_AdjustMatrix[2] = 0; + pCharPos->m_AdjustMatrix[3] = 1; + pCharPos->m_OriginY += fAscent * iVerScale / 100.0f; + } else if (iCharRotation == 1) { + pCharPos->m_AdjustMatrix[0] = 0; + pCharPos->m_AdjustMatrix[1] = -1; + pCharPos->m_AdjustMatrix[2] = -1; + pCharPos->m_AdjustMatrix[3] = 0; + pCharPos->m_OriginX -= fDescent + fAscent * iVerScale / 100.0f - fAscent; + } else if (iCharRotation == 2) { + pCharPos->m_AdjustMatrix[0] = 1; + pCharPos->m_AdjustMatrix[1] = 0; + pCharPos->m_AdjustMatrix[2] = 0; + pCharPos->m_AdjustMatrix[3] = -1; + pCharPos->m_OriginX += fCharWidth; + pCharPos->m_OriginY += fAscent; + } else { + pCharPos->m_AdjustMatrix[0] = 0; + pCharPos->m_AdjustMatrix[1] = 1; + pCharPos->m_AdjustMatrix[2] = 1; + pCharPos->m_AdjustMatrix[3] = 0; + pCharPos->m_OriginX += fAscent; + pCharPos->m_OriginY += fCharWidth; + } + } else { + if (iCharRotation == 0) { + pCharPos->m_AdjustMatrix[0] = -1; + pCharPos->m_AdjustMatrix[1] = 0; + pCharPos->m_AdjustMatrix[2] = 0; + pCharPos->m_AdjustMatrix[3] = 1; + pCharPos->m_OriginY += fAscent * iVerScale / 100.0f - fAscent; + } else if (iCharRotation == 1) { + pCharPos->m_AdjustMatrix[0] = 0; + pCharPos->m_AdjustMatrix[1] = -1; + pCharPos->m_AdjustMatrix[2] = -1; + pCharPos->m_AdjustMatrix[3] = 0; + pCharPos->m_OriginX -= fDescent; + pCharPos->m_OriginY -= fAscent + fDescent; + } else if (iCharRotation == 2) { + pCharPos->m_AdjustMatrix[0] = 1; + pCharPos->m_AdjustMatrix[1] = 0; + pCharPos->m_AdjustMatrix[2] = 0; + pCharPos->m_AdjustMatrix[3] = -1; + pCharPos->m_OriginX += fCharWidth; + pCharPos->m_OriginY -= fAscent; + } else { + pCharPos->m_AdjustMatrix[0] = 0; + pCharPos->m_AdjustMatrix[1] = 1; + pCharPos->m_AdjustMatrix[2] = 1; + pCharPos->m_AdjustMatrix[3] = 0; + pCharPos->m_OriginX += fAscent * iVerScale / 100.0f; + } + } + if (iHorScale != 100 || iVerScale != 100) { + pCharPos->m_AdjustMatrix[0] = pCharPos->m_AdjustMatrix[0] * iHorScale / 100.0f; + pCharPos->m_AdjustMatrix[1] = pCharPos->m_AdjustMatrix[1] * iHorScale / 100.0f; + pCharPos->m_AdjustMatrix[2] = pCharPos->m_AdjustMatrix[2] * iVerScale / 100.0f; + pCharPos->m_AdjustMatrix[3] = pCharPos->m_AdjustMatrix[3] * iVerScale / 100.0f; + } + pCharPos ++; + } + } + } + if (iWidth > 0) { + wPrev = wch; + } + } + return iCount; +} +FX_INT32 CFX_RTFBreak::GetCharRects(FX_LPCRTFTEXTOBJ pText, CFX_RectFArray &rtArray, FX_BOOL bCharBBox ) const +{ + if (pText == NULL || pText->iLength < 1) { + return 0; + } + FXSYS_assert(pText->pStr != NULL && pText->pWidths != NULL && pText->pFont != NULL && pText->pRect != NULL); + FX_LPCWSTR pStr = pText->pStr; + FX_INT32 *pWidths = pText->pWidths; + FX_INT32 iLength = pText->iLength; + CFX_RectF rect(*pText->pRect); + FX_BOOL bRTLPiece = FX_IsOdd(pText->iBidiLevel); + FX_FLOAT fFontSize = pText->fFontSize; + FX_INT32 iFontSize = FXSYS_round(fFontSize * 20.0f); + FX_FLOAT fScale = fFontSize / 1000.0f; + IFX_Font *pFont = pText->pFont; + if (pFont == NULL) { + bCharBBox = FALSE; + } + CFX_Rect bbox; + bbox.Set(0, 0, 0, 0); + if (bCharBBox) { + bCharBBox = pFont->GetBBox(bbox); + } + FX_FLOAT fLeft = FX_MAX(0, bbox.left * fScale); + FX_FLOAT fHeight = FXSYS_fabs(bbox.height * fScale); + rtArray.RemoveAll(); + rtArray.SetSize(iLength); + FX_DWORD dwStyles = pText->dwLayoutStyles; + FX_BOOL bVertical = (dwStyles & FX_RTFLAYOUTSTYLE_VerticalLayout) != 0; + FX_BOOL bMBCSCode = (dwStyles & FX_RTFLAYOUTSTYLE_MBCSCode) != 0; + FX_BOOL bSingleLine = (dwStyles & FX_RTFLAYOUTSTYLE_SingleLine) != 0; + FX_BOOL bCombText = (dwStyles & FX_TXTLAYOUTSTYLE_CombText) != 0; + FX_WCHAR wch, wLineBreakChar = pText->wLineBreakChar; + FX_INT32 iCharSize; + FX_FLOAT fCharSize, fStart; + if (bVertical) { + fStart = bRTLPiece ? rect.bottom() : rect.top; + } else { + fStart = bRTLPiece ? rect.right() : rect.left; + } + for (FX_INT32 i = 0; i < iLength; i ++) { + wch = *pStr ++; + iCharSize = *pWidths ++; + fCharSize = (FX_FLOAT)iCharSize / 20000.0f; + FX_BOOL bRet = (!bSingleLine && FX_IsCtrlCode(wch)); + if (!(wch == L'\v' || wch == L'\f' || wch == 0x2028 || wch == 0x2029 || (wLineBreakChar != 0xFEFF && wch == wLineBreakChar))) { + bRet = FALSE; + } + if (bRet) { + iCharSize = iFontSize * 500; + fCharSize = fFontSize / 2.0f; + } + if (bVertical) { + rect.top = fStart; + if (bRTLPiece) { + rect.top -= fCharSize; + fStart -= fCharSize; + } else { + fStart += fCharSize; + } + rect.height = fCharSize; + } else { + rect.left = fStart; + if (bRTLPiece) { + rect.left -= fCharSize; + fStart -= fCharSize; + } else { + fStart += fCharSize; + } + rect.width = fCharSize; + } + if (bCharBBox && !bRet) { + FX_INT32 iCharWidth = 1000; + pFont->GetCharWidth(wch, iCharWidth); + FX_FLOAT fRTLeft = 0, fCharWidth = 0; + if (iCharWidth > 0) { + fCharWidth = iCharWidth * fScale; + fRTLeft = fLeft; + if (bCombText) { + fRTLeft = (rect.width - fCharWidth) / 2.0f; + } + } + CFX_RectF rtBBoxF; + if (bVertical) { + rtBBoxF.top = rect.left + fRTLeft; + rtBBoxF.left = rect.top + (rect.height - fHeight) / 2.0f; + rtBBoxF.height = fCharWidth; + rtBBoxF.width = fHeight; + rtBBoxF.left = FX_MAX(rtBBoxF.left, 0); + } else { + rtBBoxF.left = rect.left + fRTLeft; + rtBBoxF.top = rect.top + (rect.height - fHeight) / 2.0f; + rtBBoxF.width = fCharWidth; + rtBBoxF.height = fHeight; + rtBBoxF.top = FX_MAX(rtBBoxF.top, 0); + } + rtArray.SetAt(i, rtBBoxF); + continue; + } + rtArray.SetAt(i, rect); + } + return iLength; +} diff --git a/xfa/src/fgas/src/layout/fx_rtfbreak.h b/xfa/src/fgas/src/layout/fx_rtfbreak.h new file mode 100644 index 0000000000..bf5f1ee4b5 --- /dev/null +++ b/xfa/src/fgas/src/layout/fx_rtfbreak.h @@ -0,0 +1,180 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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_RTFBREAK_IMP +#define _FX_RTFBREAK_IMP +class CFX_RTFLine; +class CFX_RTFBreak; +class CFX_RTFLine : public CFX_Object +{ +public: + CFX_RTFLine() : m_LinePieces(16) + , m_iStart(0) + , m_iWidth(0) + , m_iArabicChars(0) + , m_iMBCSChars(0) + { + } + ~CFX_RTFLine() + { + RemoveAll(); + } + FX_INT32 CountChars() const + { + return m_LineChars.GetSize(); + } + CFX_RTFChar& GetChar(FX_INT32 index) + { + FXSYS_assert(index > -1 && index < m_LineChars.GetSize()); + return *m_LineChars.GetDataPtr(index); + } + CFX_RTFChar* GetCharPtr(FX_INT32 index) + { + FXSYS_assert(index > -1 && index < m_LineChars.GetSize()); + return m_LineChars.GetDataPtr(index); + } + FX_INT32 CountPieces() const + { + return m_LinePieces.GetSize(); + } + CFX_RTFPiece& GetPiece(FX_INT32 index) const + { + FXSYS_assert(index > -1 && index < m_LinePieces.GetSize()); + return m_LinePieces.GetAt(index); + } + CFX_RTFPiece* GetPiecePtr(FX_INT32 index) const + { + FXSYS_assert(index > -1 && index < m_LinePieces.GetSize()); + return m_LinePieces.GetPtrAt(index); + } + FX_INT32 GetLineEnd() const + { + return m_iStart + m_iWidth; + } + void RemoveAll(FX_BOOL bLeaveMemory = FALSE) + { + CFX_RTFChar *pChar; + IFX_Unknown *pUnknown; + FX_INT32 iCount = m_LineChars.GetSize(); + for (FX_INT32 i = 0; i < iCount; i ++) { + pChar = m_LineChars.GetDataPtr(i); + if ((pUnknown = pChar->m_pUserData) != NULL) { + pUnknown->Release(); + } + } + m_LineChars.RemoveAll(); + m_LinePieces.RemoveAll(bLeaveMemory); + m_iWidth = 0; + m_iArabicChars = 0; + m_iMBCSChars = 0; + } + CFX_RTFCharArray m_LineChars; + CFX_RTFPieceArray m_LinePieces; + FX_INT32 m_iStart; + FX_INT32 m_iWidth; + FX_INT32 m_iArabicChars; + FX_INT32 m_iMBCSChars; +}; +class CFX_RTFBreak : public IFX_RTFBreak, public CFX_Object +{ +public: + CFX_RTFBreak(FX_DWORD dwPolicies); + ~CFX_RTFBreak(); + virtual void Release() + { + delete this; + } + virtual void SetLineWidth(FX_FLOAT fLineStart, FX_FLOAT fLineEnd); + virtual void SetLinePos(FX_FLOAT fLinePos); + virtual FX_DWORD GetLayoutStyles() const + { + return m_dwLayoutStyles; + } + virtual void SetLayoutStyles(FX_DWORD dwLayoutStyles); + virtual void SetFont(IFX_Font *pFont); + virtual void SetFontSize(FX_FLOAT fFontSize); + virtual void SetTabWidth(FX_FLOAT fTabWidth); + virtual void AddPositionedTab(FX_FLOAT fTabPos); + virtual void SetPositionedTabs(const CFX_FloatArray &tabs); + virtual void ClearPositionedTabs(); + virtual void SetDefaultChar(FX_WCHAR wch); + virtual void SetLineBreakChar(FX_WCHAR wch); + virtual void SetLineBreakTolerance(FX_FLOAT fTolerance); + virtual void SetHorizontalScale(FX_INT32 iScale); + virtual void SetVerticalScale(FX_INT32 iScale); + virtual void SetCharRotation(FX_INT32 iCharRotation); + virtual void SetCharSpace(FX_FLOAT fCharSpace); + virtual void SetWordSpace(FX_BOOL bDefault, FX_FLOAT fWordSpace); + virtual void SetReadingOrder(FX_BOOL bRTL = FALSE); + virtual void SetAlignment(FX_INT32 iAlignment = FX_RTFLINEALIGNMENT_Left); + virtual void SetUserData(IFX_Unknown *pUserData); + virtual FX_DWORD AppendChar(FX_WCHAR wch); + virtual FX_DWORD EndBreak(FX_DWORD dwStatus = FX_RTFBREAK_PieceBreak); + virtual FX_INT32 CountBreakPieces() const; + virtual const CFX_RTFPiece* GetBreakPiece(FX_INT32 index) const; + virtual void GetLineRect(CFX_RectF &rect) const; + virtual void ClearBreakPieces(); + virtual void Reset(); + virtual FX_INT32 GetDisplayPos(FX_LPCRTFTEXTOBJ pText, FXTEXT_CHARPOS *pCharPos, FX_BOOL bCharCode = FALSE, CFX_WideString *pWSForms = NULL, FX_AdjustCharDisplayPos pAdjustPos = NULL) const; + virtual FX_INT32 GetCharRects(FX_LPCRTFTEXTOBJ pText, CFX_RectFArray &rtArray, FX_BOOL bCharBBox = FALSE) const; + FX_DWORD AppendChar_CharCode(FX_WCHAR wch); + FX_DWORD AppendChar_Combination(CFX_RTFChar *pCurChar, FX_INT32 iRotation); + FX_DWORD AppendChar_Tab(CFX_RTFChar *pCurChar, FX_INT32 iRotation); + FX_DWORD AppendChar_Control(CFX_RTFChar *pCurChar, FX_INT32 iRotation); + FX_DWORD AppendChar_Arabic(CFX_RTFChar *pCurChar, FX_INT32 iRotation); + FX_DWORD AppendChar_Others(CFX_RTFChar *pCurChar, FX_INT32 iRotation); +protected: + FX_DWORD m_dwPolicies; + IFX_ArabicChar *m_pArabicChar; + FX_INT32 m_iLineStart; + FX_INT32 m_iLineEnd; + FX_DWORD m_dwLayoutStyles; + FX_BOOL m_bPagination; + FX_BOOL m_bVertical; + FX_BOOL m_bSingleLine; + FX_BOOL m_bCharCode; + IFX_Font *m_pFont; + FX_INT32 m_iFontHeight; + FX_INT32 m_iFontSize; + FX_INT32 m_iTabWidth; + CFX_Int32Array m_PositionedTabs; + FX_BOOL m_bOrphanLine; + FX_WCHAR m_wDefChar; + FX_INT32 m_iDefChar; + FX_WCHAR m_wLineBreakChar; + FX_INT32 m_iHorizontalScale; + FX_INT32 m_iVerticalScale; + FX_INT32 m_iLineRotation; + FX_INT32 m_iCharRotation; + FX_INT32 m_iRotation; + FX_INT32 m_iCharSpace; + FX_BOOL m_bWordSpace; + FX_INT32 m_iWordSpace; + FX_BOOL m_bRTL; + FX_INT32 m_iAlignment; + IFX_Unknown *m_pUserData; + FX_DWORD m_dwCharType; + FX_DWORD m_dwIdentity; + CFX_RTFLine m_RTFLine1; + CFX_RTFLine m_RTFLine2; + CFX_RTFLine *m_pCurLine; + FX_INT32 m_iReady; + FX_INT32 m_iTolerance; + FX_INT32 GetLineRotation(FX_DWORD dwStyles) const; + void SetBreakStatus(); + CFX_RTFChar* GetLastChar(FX_INT32 index) const; + CFX_RTFLine* GetRTFLine(FX_BOOL bReady) const; + CFX_RTFPieceArray* GetRTFPieces(FX_BOOL bReady) const; + FX_DWORD GetUnifiedCharType(FX_DWORD dwType) const; + FX_INT32 GetLastPositionedTab() const; + FX_BOOL GetPositionedTab(FX_INT32 &iTabPos) const; + FX_INT32 GetBreakPos(CFX_RTFCharArray &tca, FX_INT32 &iEndPos, FX_BOOL bAllChars = FALSE, FX_BOOL bOnlyBrk = FALSE); + void SplitTextLine(CFX_RTFLine *pCurLine, CFX_RTFLine *pNextLine, FX_BOOL bAllChars = FALSE); + FX_BOOL EndBreak_SplitLine(CFX_RTFLine *pNextLine, FX_BOOL bAllChars, FX_DWORD dwStatus); + void EndBreak_BidiLine(CFX_TPOArray &tpos, FX_DWORD dwStatus); + void EndBreak_Alignment(CFX_TPOArray &tpos, FX_BOOL bAllChars, FX_DWORD dwStatus); +}; +#endif diff --git a/xfa/src/fgas/src/layout/fx_textbreak.cpp b/xfa/src/fgas/src/layout/fx_textbreak.cpp new file mode 100644 index 0000000000..0bb7b69585 --- /dev/null +++ b/xfa/src/fgas/src/layout/fx_textbreak.cpp @@ -0,0 +1,1653 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../fgas_base.h" +#include "fx_unicode.h" +#include "fx_textbreak.h" +extern const FX_DWORD gs_FX_TextLayout_CodeProperties[65536]; +extern const FX_WCHAR gs_FX_TextLayout_VerticalMirror[64]; +extern const FX_WCHAR gs_FX_TextLayout_BidiMirror[512]; +extern const FX_LINEBREAKTYPE gs_FX_LineBreak_PairTable[64][32]; +IFX_TxtBreak* IFX_TxtBreak::Create(FX_DWORD dwPolicies) +{ + return FX_NEW CFX_TxtBreak(dwPolicies); +} +CFX_TxtBreak::CFX_TxtBreak(FX_DWORD dwPolicies) + : m_dwPolicies(dwPolicies) + , m_pArabicChar(NULL) + , m_iLineWidth(2000000) + , m_dwLayoutStyles(0) + , m_bVertical(FALSE) + , m_bArabicContext(FALSE) + , m_bArabicShapes(FALSE) + , m_bRTL(FALSE) + , m_bSingleLine(FALSE) + , m_bCombText(FALSE) + , m_iArabicContext(1) + , m_iCurArabicContext(1) + , m_pFont(NULL) + , m_iFontSize(240) + , m_bEquidistant(TRUE) + , m_iTabWidth(720000) + , m_wDefChar(0xFEFF) + , m_wParagBreakChar(L'\n') + , m_iDefChar(0) + , m_iLineRotation(0) + , m_iCharRotation(0) + , m_iRotation(0) + , m_iAlignment(FX_TXTLINEALIGNMENT_Left) + , m_dwContextCharStyles(0) + , m_iCombWidth(360000) + , m_pUserData(NULL) + , m_dwCharType(0) + , m_bArabicNumber(FALSE) + , m_bArabicComma(FALSE) + , m_pCurLine(NULL) + , m_iReady(0) + , m_iTolerance(0) + , m_iHorScale(100) + , m_iVerScale(100) + , m_iCharSpace(0) +{ + m_bPagination = (m_dwPolicies & FX_TXTBREAKPOLICY_Pagination) != 0; + m_pArabicChar = IFX_ArabicChar::Create(); + if (m_bPagination) { + m_pTxtLine1 = FX_NEW CFX_TxtLine(sizeof(CFX_Char)); + m_pTxtLine2 = FX_NEW CFX_TxtLine(sizeof(CFX_Char)); + } else { + m_pTxtLine1 = FX_NEW CFX_TxtLine(sizeof(CFX_TxtChar)); + m_pTxtLine2 = FX_NEW CFX_TxtLine(sizeof(CFX_TxtChar)); + } + m_pCurLine = m_pTxtLine1; + ResetArabicContext(); +} +CFX_TxtBreak::~CFX_TxtBreak() +{ + Reset(); + delete m_pTxtLine1; + delete m_pTxtLine2; + m_pArabicChar->Release(); +} +void CFX_TxtBreak::SetLineWidth(FX_FLOAT fLineWidth) +{ + m_iLineWidth = FXSYS_round(fLineWidth * 20000.0f); + FXSYS_assert(m_iLineWidth >= 20000); +} +void CFX_TxtBreak::SetLinePos(FX_FLOAT fLinePos) +{ + FX_INT32 iLinePos = FXSYS_round(fLinePos * 20000.0f); + if (iLinePos < 0) { + iLinePos = 0; + } + if (iLinePos > m_iLineWidth) { + iLinePos = m_iLineWidth; + } + m_pCurLine->m_iStart = iLinePos; + m_pCurLine->m_iWidth += iLinePos; +} +void CFX_TxtBreak::SetLayoutStyles(FX_DWORD dwLayoutStyles) +{ + m_dwLayoutStyles = dwLayoutStyles; + m_bVertical = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_VerticalChars) != 0; + m_bArabicContext = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_ArabicContext) != 0; + m_bArabicShapes = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_ArabicShapes) != 0; + m_bRTL = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_RTLReadingOrder) != 0; + m_bSingleLine = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_SingleLine) != 0; + m_bCombText = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_CombText) != 0; + ResetArabicContext(); + m_iLineRotation = GetLineRotation(m_dwLayoutStyles); + m_iRotation = m_iLineRotation + m_iCharRotation; + m_iRotation %= 4; +} +void CFX_TxtBreak::SetFont(IFX_Font *pFont) +{ + if (pFont == NULL) { + return; + } + if (m_pFont == pFont) { + return; + } + SetBreakStatus(); + m_pFont = pFont; + m_iDefChar = 0; + if (m_wDefChar != 0xFEFF && m_pFont != NULL) { + m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE); + m_iDefChar *= m_iFontSize; + } +} +void CFX_TxtBreak::SetFontSize(FX_FLOAT fFontSize) +{ + FX_INT32 iFontSize = FXSYS_round(fFontSize * 20.0f); + if (m_iFontSize == iFontSize) { + return; + } + SetBreakStatus(); + m_iFontSize = iFontSize; + m_iDefChar = 0; + if (m_wDefChar != 0xFEFF && m_pFont != NULL) { + m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE); + m_iDefChar *= m_iFontSize; + } +} +void CFX_TxtBreak::SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant) +{ + m_iTabWidth = FXSYS_round(fTabWidth * 20000.0f); + if (m_iTabWidth < FX_TXTBREAK_MinimumTabWidth) { + m_iTabWidth = FX_TXTBREAK_MinimumTabWidth; + } + m_bEquidistant = bEquidistant; +} +void CFX_TxtBreak::SetDefaultChar(FX_WCHAR wch) +{ + m_wDefChar = wch; + m_iDefChar = 0; + if (m_wDefChar != 0xFEFF && m_pFont != NULL) { + m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE); + if (m_iDefChar < 0) { + m_iDefChar = 0; + } else { + m_iDefChar *= m_iFontSize; + } + } +} +void CFX_TxtBreak::SetParagraphBreakChar(FX_WCHAR wch) +{ + if (wch != L'\r' && wch != L'\n') { + return; + } + m_wParagBreakChar = wch; +} +void CFX_TxtBreak::SetLineBreakTolerance(FX_FLOAT fTolerance) +{ + m_iTolerance = FXSYS_round(fTolerance * 20000.0f); +} +void CFX_TxtBreak::SetCharRotation(FX_INT32 iCharRotation) +{ + if (iCharRotation < 0) { + iCharRotation += (-iCharRotation / 4 + 1) * 4; + } else if (iCharRotation > 3) { + iCharRotation -= (iCharRotation / 4) * 4; + } + if (m_iCharRotation == iCharRotation) { + return; + } + SetBreakStatus(); + m_iCharRotation = iCharRotation; + m_iRotation = m_iLineRotation + m_iCharRotation; + m_iRotation %= 4; +} +void CFX_TxtBreak::SetAlignment(FX_INT32 iAlignment) +{ + FXSYS_assert(iAlignment >= FX_TXTLINEALIGNMENT_Left && iAlignment <= FX_TXTLINEALIGNMENT_Distributed); + m_iAlignment = iAlignment; + ResetArabicContext(); +} +void CFX_TxtBreak::ResetContextCharStyles() +{ + m_dwContextCharStyles = m_bArabicContext ? m_iCurAlignment : m_iAlignment; + if (m_bArabicNumber) { + m_dwContextCharStyles |= FX_TXTCHARSTYLE_ArabicNumber; + } + if (m_bArabicComma) { + m_dwContextCharStyles |= FX_TXTCHARSTYLE_ArabicComma; + } + if ((m_bArabicContext && m_bCurRTL) || (!m_bArabicContext && m_bRTL)) { + m_dwContextCharStyles |= FX_TXTCHARSTYLE_RTLReadingOrder; + } + m_dwContextCharStyles |= (m_iArabicContext << 8); +} +FX_DWORD CFX_TxtBreak::GetContextCharStyles() const +{ + return m_dwContextCharStyles; +} +void CFX_TxtBreak::SetContextCharStyles(FX_DWORD dwCharStyles) +{ + m_iCurAlignment = dwCharStyles & 0x0F; + m_bArabicNumber = (dwCharStyles & FX_TXTCHARSTYLE_ArabicNumber) != 0; + m_bArabicComma = (dwCharStyles & FX_TXTCHARSTYLE_ArabicComma) != 0; + m_bCurRTL = (dwCharStyles & FX_TXTCHARSTYLE_RTLReadingOrder) != 0; + m_iCurArabicContext = m_iArabicContext = ((dwCharStyles & 0x0300) >> 8); + ResetContextCharStyles(); +} +void CFX_TxtBreak::SetCombWidth(FX_FLOAT fCombWidth) +{ + m_iCombWidth = FXSYS_round(fCombWidth * 20000.0f); +} +void CFX_TxtBreak::SetUserData(FX_LPVOID pUserData) +{ + if (m_pUserData == pUserData) { + return; + } + SetBreakStatus(); + m_pUserData = pUserData; +} +void CFX_TxtBreak::SetBreakStatus() +{ + if (m_bPagination) { + return; + } + FX_INT32 iCount = m_pCurLine->CountChars(); + if (iCount < 1) { + return; + } + CFX_TxtChar *pTC = (CFX_TxtChar*)m_pCurLine->GetCharPtr(iCount - 1); + if (pTC->m_dwStatus == 0) { + pTC->m_dwStatus = FX_TXTBREAK_PieceBreak; + } +} +void CFX_TxtBreak::SetHorizontalScale(FX_INT32 iScale) +{ + if (iScale < 0) { + iScale = 0; + } + if (iScale == m_iHorScale) { + return; + } + SetBreakStatus(); + m_iHorScale = iScale; +} +void CFX_TxtBreak::SetVerticalScale(FX_INT32 iScale) +{ + if (iScale < 0) { + iScale = 0; + } + if (iScale == m_iHorScale) { + return; + } + SetBreakStatus(); + m_iVerScale = iScale; +} +void CFX_TxtBreak::SetCharSpace(FX_FLOAT fCharSpace) +{ + m_iCharSpace = FXSYS_round(fCharSpace * 20000.0f); +} +static const FX_INT32 gs_FX_TxtLineRotations[8] = {0, 3, 1, 0, 2, 1, 3, 2}; +FX_INT32 CFX_TxtBreak::GetLineRotation(FX_DWORD dwStyles) const +{ + return gs_FX_TxtLineRotations[(dwStyles & 0x0E) >> 1]; +} +CFX_TxtChar* CFX_TxtBreak::GetLastChar(FX_INT32 index, FX_BOOL bOmitChar) const +{ + CFX_TxtCharArray &ca = *m_pCurLine->m_pLineChars; + FX_INT32 iCount = ca.GetSize(); + if (index < 0 || index >= iCount) { + return NULL; + } + CFX_TxtChar *pTC; + FX_INT32 iStart = iCount - 1; + while (iStart > -1) { + pTC = ca.GetDataPtr(iStart --); + if (bOmitChar && pTC->GetCharType() == FX_CHARTYPE_Combination) { + continue; + } + if (--index < 0) { + return pTC; + } + } + return NULL; +} +CFX_TxtLine* CFX_TxtBreak::GetTxtLine(FX_BOOL bReady) const +{ + if (!bReady) { + return m_pCurLine; + } + if (m_iReady == 1) { + return m_pTxtLine1; + } else if (m_iReady == 2) { + return m_pTxtLine2; + } else { + return NULL; + } +} +CFX_TxtPieceArray* CFX_TxtBreak::GetTxtPieces(FX_BOOL bReady) const +{ + CFX_TxtLine *pTxtLine = GetTxtLine(bReady); + if (pTxtLine == NULL) { + return NULL; + } + return pTxtLine->m_pLinePieces; +} +inline FX_DWORD CFX_TxtBreak::GetUnifiedCharType(FX_DWORD dwType) const +{ + return dwType >= FX_CHARTYPE_ArabicAlef ? FX_CHARTYPE_Arabic : dwType; +} +void CFX_TxtBreak::ResetArabicContext() +{ + if (m_bArabicContext) { + m_bCurRTL = m_iCurArabicContext > 1; + m_iCurAlignment = m_iCurArabicContext > 1 ? FX_TXTLINEALIGNMENT_Right : FX_TXTLINEALIGNMENT_Left; + m_iCurAlignment |= (m_iAlignment & FX_TXTLINEALIGNMENT_HigherMask); + m_bArabicNumber = m_iArabicContext >= 1 && m_bArabicShapes; + } else { + if (m_bPagination) { + m_bCurRTL = FALSE; + m_iCurAlignment = 0; + } else { + m_bCurRTL = m_bRTL; + m_iCurAlignment = m_iAlignment; + } + if (m_bRTL) { + m_bArabicNumber = m_iArabicContext >= 1; + } else { + m_bArabicNumber = m_iArabicContext > 1; + } + m_bArabicNumber = m_bArabicNumber && m_bArabicShapes; + } + m_bArabicComma = m_bArabicNumber; + ResetContextCharStyles(); +} +void CFX_TxtBreak::AppendChar_PageLoad(CFX_Char *pCurChar, FX_DWORD dwProps) +{ + if (!m_bPagination) { + ((CFX_TxtChar*)pCurChar)->m_dwStatus = 0; + ((CFX_TxtChar*)pCurChar)->m_pUserData = m_pUserData; + } + if (m_bArabicContext || m_bArabicShapes) { + FX_INT32 iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS; + FX_INT32 iArabicContext = (iBidiCls == FX_BIDICLASS_R || iBidiCls == FX_BIDICLASS_AL) ? 2 : ((iBidiCls == FX_BIDICLASS_L || iBidiCls == FX_BIDICLASS_S) ? 0 : 1); + if (iArabicContext != m_iArabicContext && iArabicContext != 1) { + m_iArabicContext = iArabicContext; + if (m_iCurArabicContext == 1) { + m_iCurArabicContext = iArabicContext; + } + ResetArabicContext(); + if (!m_bPagination) { + CFX_TxtChar *pLastChar = (CFX_TxtChar*)GetLastChar(1, FALSE); + if (pLastChar != NULL && pLastChar->m_dwStatus < 1) { + pLastChar->m_dwStatus = FX_TXTBREAK_PieceBreak; + } + } + } + } + pCurChar->m_dwCharStyles = m_dwContextCharStyles; +} +FX_DWORD CFX_TxtBreak::AppendChar_Combination(CFX_Char *pCurChar, FX_INT32 iRotation) +{ + FXSYS_assert(pCurChar != NULL); + FX_WCHAR wch = pCurChar->m_wCharCode; + FX_WCHAR wForm; + FX_INT32 iCharWidth = 0; + CFX_Char *pLastChar; + pCurChar->m_iCharWidth = -1; + if (m_bCombText) { + iCharWidth = m_iCombWidth; + } else { + if (m_bVertical != FX_IsOdd(iRotation)) { + iCharWidth = 1000; + } else { + wForm = wch; + if (!m_bPagination) { + pLastChar = GetLastChar(0, FALSE); + if (pLastChar != NULL && (((CFX_TxtChar*)pLastChar)->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicShadda) == 0) { + FX_BOOL bShadda = FALSE; + if (wch == 0x0651) { + FX_WCHAR wLast = pLastChar->m_wCharCode; + if (wLast >= 0x064C && wLast <= 0x0650) { + wForm = FX_GetArabicFromShaddaTable(wLast); + bShadda = TRUE; + } + } else if (wch >= 0x064C && wch <= 0x0650) { + if (pLastChar->m_wCharCode == 0x0651) { + wForm = FX_GetArabicFromShaddaTable(wch); + bShadda = TRUE; + } + } + if (bShadda) { + ((CFX_TxtChar*)pLastChar)->m_dwCharStyles |= FX_TXTCHARSTYLE_ArabicShadda; + ((CFX_TxtChar*)pLastChar)->m_iCharWidth = 0; + ((CFX_TxtChar*)pCurChar)->m_dwCharStyles |= FX_TXTCHARSTYLE_ArabicShadda; + } + } + } + if (!m_pFont->GetCharWidth(wForm, iCharWidth, FALSE)) { + iCharWidth = 0; + } + } + iCharWidth *= m_iFontSize; + iCharWidth = iCharWidth * m_iHorScale / 100; + } + pCurChar->m_iCharWidth = -iCharWidth; + return FX_TXTBREAK_None; +} +FX_DWORD CFX_TxtBreak::AppendChar_Tab(CFX_Char *pCurChar, FX_INT32 iRotation) +{ + m_dwCharType = FX_CHARTYPE_Tab; + if ((m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_ExpandTab) == 0) { + return FX_TXTBREAK_None; + } + FX_INT32 &iLineWidth = m_pCurLine->m_iWidth; + FX_INT32 iCharWidth; + if (m_bCombText) { + iCharWidth = m_iCombWidth; + } else { + if (m_bEquidistant) { + iCharWidth = iLineWidth; + iCharWidth = m_iTabWidth * (iCharWidth / m_iTabWidth + 1) - iCharWidth; + if (iCharWidth < FX_TXTBREAK_MinimumTabWidth) { + iCharWidth += m_iTabWidth; + } + } else { + iCharWidth = m_iTabWidth; + } + } + pCurChar->m_iCharWidth = iCharWidth; + iLineWidth += iCharWidth; + if (!m_bSingleLine && iLineWidth >= m_iLineWidth + m_iTolerance) { + return EndBreak(FX_TXTBREAK_LineBreak); + } + return FX_TXTBREAK_None; +} +FX_DWORD CFX_TxtBreak::AppendChar_Control(CFX_Char *pCurChar, FX_INT32 iRotation) +{ + m_dwCharType = FX_CHARTYPE_Control; + FX_DWORD dwRet = FX_TXTBREAK_None; + if (!m_bSingleLine) { + FX_WCHAR wch = pCurChar->m_wCharCode; + switch (wch) { + case L'\v': + case 0x2028: + dwRet = FX_TXTBREAK_LineBreak; + break; + case L'\f': + dwRet = FX_TXTBREAK_PageBreak; + break; + case 0x2029: + dwRet = FX_TXTBREAK_ParagraphBreak; + break; + default: + if (wch == m_wParagBreakChar) { + dwRet = FX_TXTBREAK_ParagraphBreak; + } + break; + } + if (dwRet != FX_TXTBREAK_None) { + dwRet = EndBreak(dwRet); + } + } + return dwRet; +} +FX_DWORD CFX_TxtBreak::AppendChar_Arabic(CFX_Char *pCurChar, FX_INT32 iRotation) +{ + FX_DWORD dwType = (pCurChar->m_dwCharProps & FX_CHARTYPEBITSMASK); + FX_INT32 &iLineWidth = m_pCurLine->m_iWidth; + FX_WCHAR wForm; + FX_INT32 iCharWidth = 0; + CFX_Char *pLastChar = NULL; + FX_BOOL bAlef = FALSE; + if (!m_bCombText && m_dwCharType >= FX_CHARTYPE_ArabicAlef && m_dwCharType <= FX_CHARTYPE_ArabicDistortion) { + pLastChar = GetLastChar(1); + if (pLastChar != NULL) { + iCharWidth = pLastChar->m_iCharWidth; + if (iCharWidth > 0) { + iLineWidth -= iCharWidth; + } + CFX_Char *pPrevChar = GetLastChar(2); + wForm = m_pArabicChar->GetFormChar(pLastChar, pPrevChar, pCurChar); + bAlef = (wForm == 0xFEFF && pLastChar->GetCharType() == FX_CHARTYPE_ArabicAlef); + FX_INT32 iLastRotation = pLastChar->m_nRotation + m_iLineRotation; + if (m_bVertical && (pLastChar->m_dwCharProps & 0x8000) != 0) { + iLastRotation ++; + } + if (m_bVertical != FX_IsOdd(iLastRotation)) { + iCharWidth = 1000; + } else { + m_pFont->GetCharWidth(wForm, iCharWidth, FALSE); + } + if (wForm == 0xFEFF) { + iCharWidth = m_iDefChar; + } + iCharWidth *= m_iFontSize; + iCharWidth = iCharWidth * m_iHorScale / 100; + pLastChar->m_iCharWidth = iCharWidth; + iLineWidth += iCharWidth; + iCharWidth = 0; + } + } + m_dwCharType = dwType; + wForm = m_pArabicChar->GetFormChar(pCurChar, bAlef ? NULL : pLastChar, NULL); + if (m_bCombText) { + iCharWidth = m_iCombWidth; + } else { + if (m_bVertical != FX_IsOdd(iRotation)) { + iCharWidth = 1000; + } else { + m_pFont->GetCharWidth(wForm, iCharWidth, FALSE); + } + if (wForm == 0xFEFF) { + iCharWidth = m_iDefChar; + } + iCharWidth *= m_iFontSize; + iCharWidth = iCharWidth * m_iHorScale / 100; + } + pCurChar->m_iCharWidth = iCharWidth; + iLineWidth += iCharWidth; + m_pCurLine->m_iArabicChars ++; + if (!m_bSingleLine && iLineWidth > m_iLineWidth + m_iTolerance) { + return EndBreak(FX_TXTBREAK_LineBreak); + } + return FX_TXTBREAK_None; +} +FX_DWORD CFX_TxtBreak::AppendChar_Others(CFX_Char *pCurChar, FX_INT32 iRotation) +{ + FX_DWORD dwProps = pCurChar->m_dwCharProps; + FX_DWORD dwType = (dwProps & FX_CHARTYPEBITSMASK); + FX_INT32 &iLineWidth = m_pCurLine->m_iWidth; + FX_INT32 iCharWidth = 0; + m_dwCharType = dwType; + FX_WCHAR wch = pCurChar->m_wCharCode; + FX_WCHAR wForm = wch; + if (dwType == FX_CHARTYPE_Numeric) { + if (m_bArabicNumber) { + wForm = wch + 0x0630; + pCurChar->m_dwCharStyles |= FX_TXTCHARSTYLE_ArabicIndic; + } + } else if (wch == L',') { + if (m_bArabicShapes && m_iCurArabicContext > 0) { + wForm = 0x060C; + pCurChar->m_dwCharStyles |= FX_TXTCHARSTYLE_ArabicComma; + } + } else if (m_bCurRTL || m_bVertical) { + wForm = FX_GetMirrorChar(wch, dwProps, m_bCurRTL, m_bVertical); + } + if (m_bCombText) { + iCharWidth = m_iCombWidth; + } else { + if (m_bVertical != FX_IsOdd(iRotation)) { + iCharWidth = 1000; + } else if (!m_pFont->GetCharWidth(wForm, iCharWidth, FALSE)) { + iCharWidth = m_iDefChar; + } + iCharWidth *= m_iFontSize; + iCharWidth = iCharWidth * m_iHorScale / 100; + } + iCharWidth += m_iCharSpace; + pCurChar->m_iCharWidth = iCharWidth; + iLineWidth += iCharWidth; + FX_BOOL bBreak = (dwType != FX_CHARTYPE_Space || (m_dwPolicies & FX_TXTBREAKPOLICY_SpaceBreak) != 0); + if (!m_bSingleLine && bBreak && iLineWidth > m_iLineWidth + m_iTolerance) { + return EndBreak(FX_TXTBREAK_LineBreak); + } + return FX_TXTBREAK_None; +} +typedef FX_DWORD (CFX_TxtBreak::*FX_TxtBreak_LPFAppendChar)(CFX_Char *pCurChar, FX_INT32 iRotation); +static const FX_TxtBreak_LPFAppendChar g_FX_TxtBreak_lpfAppendChar[16] = { + &CFX_TxtBreak::AppendChar_Others, + &CFX_TxtBreak::AppendChar_Tab, + &CFX_TxtBreak::AppendChar_Others, + &CFX_TxtBreak::AppendChar_Control, + &CFX_TxtBreak::AppendChar_Combination, + &CFX_TxtBreak::AppendChar_Others, + &CFX_TxtBreak::AppendChar_Others, + &CFX_TxtBreak::AppendChar_Arabic, + &CFX_TxtBreak::AppendChar_Arabic, + &CFX_TxtBreak::AppendChar_Arabic, + &CFX_TxtBreak::AppendChar_Arabic, + &CFX_TxtBreak::AppendChar_Arabic, + &CFX_TxtBreak::AppendChar_Arabic, + &CFX_TxtBreak::AppendChar_Others, + &CFX_TxtBreak::AppendChar_Others, + &CFX_TxtBreak::AppendChar_Others, +}; +FX_DWORD CFX_TxtBreak::AppendChar(FX_WCHAR wch) +{ + FX_DWORD dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch]; + FX_DWORD dwType = (dwProps & FX_CHARTYPEBITSMASK); + CFX_TxtChar *pCurChar = m_pCurLine->m_pLineChars->AddSpace(); + pCurChar->m_wCharCode = (FX_WORD)wch; + pCurChar->m_nRotation = m_iCharRotation; + pCurChar->m_dwCharProps = dwProps; + pCurChar->m_dwCharStyles = 0; + pCurChar->m_iCharWidth = 0; + pCurChar->m_iHorizontalScale = m_iHorScale; + pCurChar->m_iVertialScale = m_iVerScale; + pCurChar->m_dwStatus = 0; + pCurChar->m_iBidiClass = 0; + pCurChar->m_iBidiLevel = 0; + pCurChar->m_iBidiPos = 0; + pCurChar->m_iBidiOrder = 0; + pCurChar->m_pUserData = NULL; + AppendChar_PageLoad(pCurChar, dwProps); + FX_DWORD dwRet1 = FX_TXTBREAK_None; + if (dwType != FX_CHARTYPE_Combination && GetUnifiedCharType(m_dwCharType) != GetUnifiedCharType(dwType)) { + if (m_dwCharType > 0 && m_pCurLine->m_iWidth > m_iLineWidth + m_iTolerance && !m_bSingleLine) { + if (m_dwCharType != FX_CHARTYPE_Space || dwType != FX_CHARTYPE_Control) { + dwRet1 = EndBreak(FX_TXTBREAK_LineBreak); + FX_INT32 iCount = m_pCurLine->CountChars(); + if (iCount > 0) { + pCurChar = m_pCurLine->m_pLineChars->GetDataPtr(iCount - 1); + } + } + } + } + FX_INT32 iRotation = m_iRotation; + if (m_bVertical && (dwProps & 0x8000) != 0) { + iRotation = (iRotation + 1) % 4; + } + FX_DWORD dwRet2 = (this->*g_FX_TxtBreak_lpfAppendChar[dwType >> FX_CHARTYPEBITS])(pCurChar, iRotation); + return FX_MAX(dwRet1, dwRet2); +} +void CFX_TxtBreak::EndBreak_UpdateArabicShapes() +{ + FXSYS_assert(m_bArabicShapes); + FX_INT32 iCount = m_pCurLine->CountChars(); + if (iCount < 2) { + return; + } + FX_INT32 &iLineWidth = m_pCurLine->m_iWidth; + CFX_Char *pCur, *pNext; + pCur = m_pCurLine->GetCharPtr(0); + FX_BOOL bPrevNum = (pCur->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicIndic) != 0; + pCur = m_pCurLine->GetCharPtr(1); + FX_WCHAR wch, wForm; + FX_BOOL bNextNum; + FX_INT32 i = 1, iCharWidth, iRotation; + do { + i ++; + if (i < iCount) { + pNext = m_pCurLine->GetCharPtr(i); + bNextNum = (pNext->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicIndic) != 0; + } else { + pNext = NULL; + bNextNum = FALSE; + } + wch = pCur->m_wCharCode; + if (wch == L'.') { + if (bPrevNum && bNextNum) { + iRotation = m_iRotation; + if (m_bVertical && (pCur->m_dwCharProps & 0x8000) != 0) { + iRotation = ((iRotation + 1) & 0x03); + } + wForm = wch == L'.' ? 0x066B : 0x066C; + iLineWidth -= pCur->m_iCharWidth; + if (m_bCombText) { + iCharWidth = m_iCombWidth; + } else { + if (m_bVertical != FX_IsOdd(iRotation)) { + iCharWidth = 1000; + } else if (!m_pFont->GetCharWidth(wForm, iCharWidth, FALSE)) { + iCharWidth = m_iDefChar; + } + iCharWidth *= m_iFontSize; + iCharWidth = iCharWidth * m_iHorScale / 100; + } + pCur->m_iCharWidth = iCharWidth; + iLineWidth += iCharWidth; + } + } + bPrevNum = (pCur->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicIndic) != 0; + pCur = pNext; + } while (i < iCount); +} +FX_BOOL CFX_TxtBreak::EndBreak_SplitLine(CFX_TxtLine *pNextLine, FX_BOOL bAllChars, FX_DWORD dwStatus) +{ + FX_INT32 iCount = m_pCurLine->CountChars(); + FX_BOOL bDone = FALSE; + CFX_Char *pTC; + if (!m_bSingleLine && m_pCurLine->m_iWidth > m_iLineWidth + m_iTolerance) { + pTC = m_pCurLine->GetCharPtr(iCount - 1); + switch (pTC->GetCharType()) { + case FX_CHARTYPE_Tab: + case FX_CHARTYPE_Control: + break; + case FX_CHARTYPE_Space: + if ((m_dwPolicies & FX_TXTBREAKPOLICY_SpaceBreak) != 0) { + SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars); + bDone = TRUE; + } + break; + default: + SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars); + bDone = TRUE; + break; + } + } + iCount = m_pCurLine->CountChars(); + CFX_TxtPieceArray *pCurPieces = m_pCurLine->m_pLinePieces; + CFX_TxtPiece tp; + if (m_bPagination) { + tp.m_dwStatus = dwStatus; + tp.m_iStartPos = m_pCurLine->m_iStart; + tp.m_iWidth = m_pCurLine->m_iWidth; + tp.m_iStartChar = 0; + tp.m_iChars = iCount; + tp.m_pChars = m_pCurLine->m_pLineChars; + tp.m_pUserData = m_pUserData; + pTC = m_pCurLine->GetCharPtr(0); + tp.m_dwCharStyles = pTC->m_dwCharStyles; + tp.m_iHorizontalScale = pTC->m_iHorizontalScale; + tp.m_iVerticalScale = pTC->m_iVertialScale; + pCurPieces->Add(tp); + m_pCurLine = pNextLine; + m_dwCharType = 0; + return TRUE; + } + if (bAllChars && !bDone) { + FX_INT32 iEndPos = m_pCurLine->m_iWidth; + GetBreakPos(*m_pCurLine->m_pLineChars, iEndPos, bAllChars, TRUE); + } + return FALSE; +} +void CFX_TxtBreak::EndBreak_BidiLine(CFX_TPOArray &tpos, FX_DWORD dwStatus) +{ + CFX_TxtPiece tp; + FX_TPO tpo; + CFX_TxtChar *pTC; + FX_INT32 i, j; + CFX_TxtCharArray &chars = *m_pCurLine->m_pLineChars; + FX_INT32 iCount = m_pCurLine->CountChars(); + FX_BOOL bDone = (m_pCurLine->m_iArabicChars > 0 || m_bCurRTL); + if (!m_bPagination && bDone) { + FX_INT32 iBidiNum = 0; + for (i = 0; i < iCount; i ++) { + pTC = chars.GetDataPtr(i); + pTC->m_iBidiPos = i; + if (pTC->GetCharType() != FX_CHARTYPE_Control) { + iBidiNum = i; + } + if (i == 0) { + pTC->m_iBidiLevel = 1; + } + } + FX_BidiLine(chars, iBidiNum + 1, m_bCurRTL ? 1 : 0); + } + CFX_TxtPieceArray *pCurPieces = m_pCurLine->m_pLinePieces; + if (!m_bPagination && (bDone || (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_MutipleFormat) != 0)) { + tp.m_dwStatus = FX_TXTBREAK_PieceBreak; + tp.m_iStartPos = m_pCurLine->m_iStart; + tp.m_pChars = m_pCurLine->m_pLineChars; + FX_INT32 iBidiLevel = -1, iCharWidth; + i = 0, j = -1; + while (i < iCount) { + pTC = chars.GetDataPtr(i); + if (iBidiLevel < 0) { + iBidiLevel = pTC->m_iBidiLevel; + tp.m_iWidth = 0; + tp.m_iBidiLevel = iBidiLevel; + tp.m_iBidiPos = pTC->m_iBidiOrder; + tp.m_dwCharStyles = pTC->m_dwCharStyles; + tp.m_pUserData = pTC->m_pUserData; + tp.m_iHorizontalScale = pTC->m_iHorizontalScale; + tp.m_iVerticalScale = pTC->m_iVertialScale; + tp.m_dwStatus = FX_TXTBREAK_PieceBreak; + } + if (iBidiLevel != pTC->m_iBidiLevel || pTC->m_dwStatus != 0) { + if (iBidiLevel == pTC->m_iBidiLevel) { + tp.m_dwStatus = pTC->m_dwStatus; + iCharWidth = pTC->m_iCharWidth; + if (iCharWidth > 0) { + tp.m_iWidth += iCharWidth; + } + i ++; + } + tp.m_iChars = i - tp.m_iStartChar; + pCurPieces->Add(tp); + tp.m_iStartPos += tp.m_iWidth; + tp.m_iStartChar = i; + tpo.index = ++ j; + tpo.pos = tp.m_iBidiPos; + tpos.Add(tpo); + iBidiLevel = -1; + } else { + iCharWidth = pTC->m_iCharWidth; + if (iCharWidth > 0) { + tp.m_iWidth += iCharWidth; + } + i ++; + } + } + if (i > tp.m_iStartChar) { + tp.m_dwStatus = dwStatus; + tp.m_iChars = i - tp.m_iStartChar; + pCurPieces->Add(tp); + tpo.index = ++ j; + tpo.pos = tp.m_iBidiPos; + tpos.Add(tpo); + } + if (j > -1) { + if (j > 0) { + FX_TEXTLAYOUT_PieceSort(tpos, 0, j); + FX_INT32 iStartPos = 0; + for (i = 0; i <= j; i ++) { + tpo = tpos.GetAt(i); + CFX_TxtPiece &ttp = pCurPieces->GetAt(tpo.index); + ttp.m_iStartPos = iStartPos; + iStartPos += ttp.m_iWidth; + } + } + CFX_TxtPiece &ttp = pCurPieces->GetAt(j); + ttp.m_dwStatus = dwStatus; + } + } else { + tp.m_dwStatus = dwStatus; + tp.m_iStartPos = m_pCurLine->m_iStart; + tp.m_iWidth = m_pCurLine->m_iWidth; + tp.m_iStartChar = 0; + tp.m_iChars = iCount; + tp.m_pChars = m_pCurLine->m_pLineChars; + tp.m_pUserData = m_pUserData; + pTC = chars.GetDataPtr(0); + tp.m_dwCharStyles = pTC->m_dwCharStyles; + tp.m_iHorizontalScale = pTC->m_iHorizontalScale; + tp.m_iVerticalScale = pTC->m_iVertialScale; + pCurPieces->Add(tp); + tpo.index = 0; + tpo.pos = 0; + tpos.Add(tpo); + } +} +void CFX_TxtBreak::EndBreak_Alignment(CFX_TPOArray &tpos, FX_BOOL bAllChars, FX_DWORD dwStatus) +{ + FX_INT32 iNetWidth = m_pCurLine->m_iWidth, iGapChars = 0, iCharWidth; + CFX_TxtPieceArray *pCurPieces = m_pCurLine->m_pLinePieces; + FX_INT32 i, j, iCount = pCurPieces->GetSize(); + FX_BOOL bFind = FALSE; + FX_TPO tpo; + CFX_TxtChar *pTC; + FX_DWORD dwCharType; + for (i = iCount - 1; i > -1; i --) { + tpo = tpos.GetAt(i); + CFX_TxtPiece &ttp = pCurPieces->GetAt(tpo.index); + if (!bFind) { + iNetWidth = ttp.GetEndPos(); + } + FX_BOOL bArabic = FX_IsOdd(ttp.m_iBidiLevel); + j = bArabic ? 0 : ttp.m_iChars - 1; + while (j > -1 && j < ttp.m_iChars) { + pTC = ttp.GetCharPtr(j); + if (pTC->m_nBreakType == FX_LBT_DIRECT_BRK) { + iGapChars ++; + } + if (!bFind || !bAllChars) { + dwCharType = pTC->GetCharType(); + if (dwCharType == FX_CHARTYPE_Space || dwCharType == FX_CHARTYPE_Control) { + if (!bFind) { + iCharWidth = pTC->m_iCharWidth; + if (bAllChars && iCharWidth > 0) { + iNetWidth -= iCharWidth; + } + } + } else { + bFind = TRUE; + if (!bAllChars) { + break; + } + } + } + j += bArabic ? 1 : -1; + } + if (!bAllChars && bFind) { + break; + } + } + FX_INT32 iOffset = m_iLineWidth - iNetWidth; + FX_INT32 iLowerAlignment = (m_iCurAlignment & FX_TXTLINEALIGNMENT_LowerMask); + FX_INT32 iHigherAlignment = (m_iCurAlignment & FX_TXTLINEALIGNMENT_HigherMask); + if (iGapChars > 0 && (iHigherAlignment == FX_TXTLINEALIGNMENT_Distributed || (iHigherAlignment == FX_TXTLINEALIGNMENT_Justified && dwStatus != FX_TXTBREAK_ParagraphBreak))) { + FX_INT32 iStart = -1; + for (i = 0; i < iCount; i ++) { + tpo = tpos.GetAt(i); + CFX_TxtPiece &ttp = pCurPieces->GetAt(tpo.index); + if (iStart < -1) { + iStart = ttp.m_iStartPos; + } else { + ttp.m_iStartPos = iStart; + } + FX_INT32 k; + for (j = 0; j < ttp.m_iChars; j ++) { + pTC = ttp.GetCharPtr(j); + if (pTC->m_nBreakType != FX_LBT_DIRECT_BRK || pTC->m_iCharWidth < 0) { + continue; + } + k = iOffset / iGapChars; + pTC->m_iCharWidth += k; + ttp.m_iWidth += k; + iOffset -= k; + iGapChars --; + if (iGapChars < 1) { + break; + } + } + iStart += ttp.m_iWidth; + } + } else if (iLowerAlignment > FX_TXTLINEALIGNMENT_Left) { + if (iLowerAlignment == FX_TXTLINEALIGNMENT_Center) { + iOffset /= 2; + } + if (iOffset > 0) { + for (i = 0; i < iCount; i ++) { + CFX_TxtPiece &ttp = pCurPieces->GetAt(i); + ttp.m_iStartPos += iOffset; + } + } + } +} +FX_DWORD CFX_TxtBreak::EndBreak(FX_DWORD dwStatus) +{ + FXSYS_assert(dwStatus >= FX_TXTBREAK_PieceBreak && dwStatus <= FX_TXTBREAK_PageBreak); + CFX_TxtPieceArray *pCurPieces = m_pCurLine->m_pLinePieces; + FX_INT32 iCount = pCurPieces->GetSize(); + if (iCount > 0) { + CFX_TxtPiece *pLastPiece = pCurPieces->GetPtrAt(-- iCount); + if (dwStatus > FX_TXTBREAK_PieceBreak) { + pLastPiece->m_dwStatus = dwStatus; + } else { + dwStatus = pLastPiece->m_dwStatus; + } + return dwStatus; + } else { + CFX_TxtLine *pLastLine = GetTxtLine(TRUE); + if (pLastLine != NULL) { + pCurPieces = pLastLine->m_pLinePieces; + iCount = pCurPieces->GetSize(); + if (iCount -- > 0) { + CFX_TxtPiece *pLastPiece = pCurPieces->GetPtrAt(iCount); + if (dwStatus > FX_TXTBREAK_PieceBreak) { + pLastPiece->m_dwStatus = dwStatus; + } else { + dwStatus = pLastPiece->m_dwStatus; + } + return dwStatus; + } + return FX_TXTBREAK_None; + } + iCount = m_pCurLine->CountChars(); + if (iCount < 1) { + return FX_TXTBREAK_None; + } + if (!m_bPagination) { + CFX_TxtChar *pTC = m_pCurLine->GetCharPtr(iCount - 1); + pTC->m_dwStatus = dwStatus; + } + if (dwStatus <= FX_TXTBREAK_PieceBreak) { + return dwStatus; + } + } + m_iReady = (m_pCurLine == m_pTxtLine1) ? 1 : 2; + CFX_TxtLine *pNextLine = (m_pCurLine == m_pTxtLine1) ? m_pTxtLine2 : m_pTxtLine1; + FX_BOOL bAllChars = (m_iCurAlignment > FX_TXTLINEALIGNMENT_Right); + CFX_TPOArray tpos; + CFX_Char *pTC; + if (m_bArabicShapes) { + EndBreak_UpdateArabicShapes(); + } + if (EndBreak_SplitLine(pNextLine, bAllChars, dwStatus)) { + goto EndBreak_Ret; + } + EndBreak_BidiLine(tpos, dwStatus); + if (!m_bPagination && m_iCurAlignment > FX_TXTLINEALIGNMENT_Left) { + EndBreak_Alignment(tpos, bAllChars, dwStatus); + } +EndBreak_Ret: + m_pCurLine = pNextLine; + pTC = GetLastChar(0, FALSE); + m_dwCharType = pTC == NULL ? 0 : pTC->GetCharType(); + if (dwStatus == FX_TXTBREAK_ParagraphBreak) { + m_iArabicContext = m_iCurArabicContext = 1; + ResetArabicContext(); + } + return dwStatus; +} +FX_INT32 CFX_TxtBreak::GetBreakPos(CFX_TxtCharArray &ca, FX_INT32 &iEndPos, FX_BOOL bAllChars, FX_BOOL bOnlyBrk) +{ + FX_INT32 iLength = ca.GetSize() - 1; + if (iLength < 1) { + return iLength; + } + FX_INT32 iBreak = -1, iBreakPos = -1, iIndirect = -1, iIndirectPos = -1, iLast = -1, iLastPos = -1; + if (m_bSingleLine || iEndPos <= m_iLineWidth) { + if (!bAllChars) { + return iLength; + } + iBreak = iLength; + iBreakPos = iEndPos; + } + FX_BOOL bSpaceBreak = (m_dwPolicies & FX_TXTBREAKPOLICY_SpaceBreak) != 0; + FX_BOOL bNumberBreak = (m_dwPolicies & FX_TXTBREAKPOLICY_NumberBreak) != 0; + FX_LINEBREAKTYPE eType; + FX_DWORD nCodeProp, nCur, nNext; + CFX_Char *pCur = ca.GetDataPtr(iLength --); + if (bAllChars) { + pCur->m_nBreakType = FX_LBT_UNKNOWN; + } + nCodeProp = pCur->m_dwCharProps; + nNext = nCodeProp & 0x003F; + FX_INT32 iCharWidth = pCur->m_iCharWidth; + if (iCharWidth > 0) { + iEndPos -= iCharWidth; + } + while (iLength >= 0) { + pCur = ca.GetDataPtr(iLength); + nCodeProp = pCur->m_dwCharProps; + nCur = nCodeProp & 0x003F; + if (nCur == FX_CBP_SP) { + if (nNext == FX_CBP_SP) { + eType = bSpaceBreak ? FX_LBT_DIRECT_BRK : FX_LBT_PROHIBITED_BRK; + } else { + eType = *((const FX_LINEBREAKTYPE *)gs_FX_LineBreak_PairTable + (nCur << 5) + nNext); + } + } else if (bNumberBreak && nCur == FX_CBP_NU && nNext == FX_CBP_NU) { + eType = FX_LBT_DIRECT_BRK; + } else { + if (nNext == FX_CBP_SP) { + eType = FX_LBT_PROHIBITED_BRK; + } else { + eType = *((const FX_LINEBREAKTYPE *)gs_FX_LineBreak_PairTable + (nCur << 5) + nNext); + } + } + if (bAllChars) { + pCur->m_nBreakType = (FX_BYTE)eType; + } + if (!bOnlyBrk) { + if (m_bSingleLine || iEndPos <= m_iLineWidth || (nCur == FX_CBP_SP && !bSpaceBreak)) { + if (eType == FX_LBT_DIRECT_BRK && iBreak < 0) { + iBreak = iLength; + iBreakPos = iEndPos; + if (!bAllChars) { + return iLength; + } + } else if (eType == FX_LBT_INDIRECT_BRK && iIndirect < 0) { + iIndirect = iLength; + iIndirectPos = iEndPos; + } + if (iLast < 0) { + iLast = iLength; + iLastPos = iEndPos; + } + } + iCharWidth = pCur->m_iCharWidth; + if (iCharWidth > 0) { + iEndPos -= iCharWidth; + } + } + nNext = nCodeProp & 0x003F; + iLength --; + } + if (bOnlyBrk) { + return 0; + } + if (iBreak > -1) { + iEndPos = iBreakPos; + return iBreak; + } + if (iIndirect > -1) { + iEndPos = iIndirectPos; + return iIndirect; + } + if (iLast > -1) { + iEndPos = iLastPos; + return iLast; + } + return 0; +} +void CFX_TxtBreak::SplitTextLine(CFX_TxtLine *pCurLine, CFX_TxtLine *pNextLine, FX_BOOL bAllChars) +{ + FXSYS_assert(pCurLine != NULL && pNextLine != NULL); + FX_INT32 iCount = pCurLine->CountChars(); + if (iCount < 2) { + return; + } + FX_INT32 iEndPos = pCurLine->m_iWidth; + CFX_TxtCharArray &curChars = *pCurLine->m_pLineChars; + FX_INT32 iCharPos = GetBreakPos(curChars, iEndPos, bAllChars, FALSE); + if (iCharPos < 0) { + iCharPos = 0; + } + iCharPos ++; + if (iCharPos >= iCount) { + pNextLine->RemoveAll(TRUE); + CFX_Char *pTC = curChars.GetDataPtr(iCharPos - 1); + pTC->m_nBreakType = FX_LBT_UNKNOWN; + return; + } + CFX_TxtCharArray &nextChars = *pNextLine->m_pLineChars; + int cur_size = curChars.GetSize(); + nextChars.SetSize(cur_size - iCharPos); + FXSYS_memcpy(nextChars.GetData(), curChars.GetDataPtr(iCharPos), (cur_size - iCharPos) * sizeof(CFX_TxtChar)); + iCount -= iCharPos; + cur_size = curChars.GetSize(); + curChars.RemoveAt(cur_size - iCount, iCount); + pCurLine->m_iWidth = iEndPos; + CFX_TxtChar *pTC = curChars.GetDataPtr(iCharPos - 1); + pTC->m_nBreakType = FX_LBT_UNKNOWN; + iCount = nextChars.GetSize(); + FX_INT32 iCharWidth, iWidth = 0; + for (FX_INT32 i = 0; i < iCount; i ++) { + pTC = nextChars.GetDataPtr(i); + if (pTC->GetCharType() >= FX_CHARTYPE_ArabicAlef) { + pCurLine->m_iArabicChars --; + pNextLine->m_iArabicChars ++; + } + iCharWidth = pTC->m_iCharWidth; + if (iCharWidth > 0) { + iWidth += iCharWidth; + } + if (m_bPagination) { + continue; + } + pTC->m_dwStatus = 0; + } + pNextLine->m_iWidth = iWidth; +} +FX_INT32 CFX_TxtBreak::CountBreakChars() const +{ + CFX_TxtLine *pTxtLine = GetTxtLine(TRUE); + return pTxtLine == NULL ? 0 : pTxtLine->CountChars(); +} +FX_INT32 CFX_TxtBreak::CountBreakPieces() const +{ + CFX_TxtPieceArray *pTxtPieces = GetTxtPieces(TRUE); + if (pTxtPieces == NULL) { + return 0; + } + return pTxtPieces->GetSize(); +} +const CFX_TxtPiece* CFX_TxtBreak::GetBreakPiece(FX_INT32 index) const +{ + CFX_TxtPieceArray *pTxtPieces = GetTxtPieces(TRUE); + if (pTxtPieces == NULL) { + return NULL; + } + if (index < 0 || index >= pTxtPieces->GetSize()) { + return NULL; + } + return pTxtPieces->GetPtrAt(index); +} +void CFX_TxtBreak::ClearBreakPieces() +{ + CFX_TxtLine *pTxtLine = GetTxtLine(TRUE); + if (pTxtLine != NULL) { + pTxtLine->RemoveAll(TRUE); + } + m_iReady = 0; +} +void CFX_TxtBreak::Reset() +{ + m_dwCharType = 0; + m_iArabicContext = m_iCurArabicContext = 1; + ResetArabicContext(); + m_pTxtLine1->RemoveAll(TRUE); + m_pTxtLine2->RemoveAll(TRUE); +} +typedef struct _FX_FORMCHAR { + FX_WORD wch; + FX_WORD wForm; + FX_INT32 iWidth; +} FX_FORMCHAR, * FX_LPFORMCHAR; +typedef FX_FORMCHAR const * FX_LPCFORMCHAR; +FX_INT32 CFX_TxtBreak::GetDisplayPos(FX_LPCTXTRUN pTxtRun, FXTEXT_CHARPOS *pCharPos, FX_BOOL bCharCode , CFX_WideString *pWSForms , FX_AdjustCharDisplayPos pAdjustPos ) const +{ + if (pTxtRun == NULL || pTxtRun->iLength < 1) { + return 0; + } + IFX_TxtAccess *pAccess = pTxtRun->pAccess; + FX_LPVOID pIdentity = pTxtRun->pIdentity; + FX_LPCWSTR pStr = pTxtRun->pStr; + FX_INT32 *pWidths = pTxtRun->pWidths; + FX_INT32 iLength = pTxtRun->iLength - 1; + IFX_Font *pFont = pTxtRun->pFont; + FX_DWORD dwStyles = pTxtRun->dwStyles; + CFX_RectF rtText(*pTxtRun->pRect); + FX_BOOL bRTLPiece = (pTxtRun->dwCharStyles & FX_TXTCHARSTYLE_OddBidiLevel) != 0; + FX_BOOL bArabicNumber = (pTxtRun->dwCharStyles & FX_TXTCHARSTYLE_ArabicNumber) != 0; + FX_BOOL bArabicComma = (pTxtRun->dwCharStyles & FX_TXTCHARSTYLE_ArabicComma) != 0; + FX_FLOAT fFontSize = pTxtRun->fFontSize; + FX_INT32 iFontSize = FXSYS_round(fFontSize * 20.0f); + FX_INT32 iAscent = pFont->GetAscent(); + FX_INT32 iDescent = pFont->GetDescent(); + FX_INT32 iMaxHeight = iAscent - iDescent; + FX_FLOAT fFontHeight = fFontSize; + FX_FLOAT fAscent = fFontHeight * (FX_FLOAT)iAscent / (FX_FLOAT)iMaxHeight; + FX_FLOAT fDescent = fFontHeight * (FX_FLOAT)iDescent / (FX_FLOAT)iMaxHeight; + FX_BOOL bVerticalDoc = (dwStyles & FX_TXTLAYOUTSTYLE_VerticalLayout) != 0; + FX_BOOL bVerticalChar = (dwStyles & FX_TXTLAYOUTSTYLE_VerticalChars) != 0; + FX_INT32 iRotation = GetLineRotation(dwStyles) + pTxtRun->iCharRotation; + FX_INT32 iCharRotation; + FX_WCHAR wch, wPrev = 0xFEFF, wNext, wForm, wLast = 0xFEFF; + FX_INT32 iWidth, iCharWidth, iCharHeight; + FX_FLOAT fX, fY, fCharWidth, fCharHeight; + FX_INT32 iHorScale = pTxtRun->iHorizontalScale; + FX_INT32 iVerScale = pTxtRun->iVerticalScale; + FX_BOOL bSkipSpace = pTxtRun->bSkipSpace; + FX_BOOL bEmptyChar, bShadda = FALSE, bLam = FALSE; + FX_DWORD dwProps, dwCharType; + FX_FORMCHAR formChars[3]; + FX_FLOAT fYBase; + fX = rtText.left; + if (bVerticalDoc) { + fX += (rtText.width - fFontSize) / 2.0f; + fYBase = bRTLPiece ? rtText.bottom() : rtText.top; + fY = fYBase; + } else { + if (bRTLPiece) { + fX = rtText.right(); + } + fYBase = rtText.top + (rtText.height - fFontSize) / 2.0f; + fY = fYBase + fAscent; + } + FX_INT32 iCount = 0, iNext, iForms; + for (FX_INT32 i = 0; i <= iLength; i ++) { + if (pAccess != NULL) { + wch = pAccess->GetChar(pIdentity, i); + iWidth = pAccess->GetWidth(pIdentity, i); + } else { + wch = *pStr ++; + iWidth = *pWidths ++; + } + dwProps = FX_GetUnicodeProperties(wch); + dwCharType = (dwProps & FX_CHARTYPEBITSMASK); + if (dwCharType == FX_CHARTYPE_ArabicAlef && iWidth == 0) { + wPrev = 0xFEFF; + wLast = wch; + continue; + } + if (dwCharType >= FX_CHARTYPE_ArabicAlef) { + if (i < iLength) { + if (pAccess != NULL) { + iNext = i + 1; + while (iNext <= iLength) { + wNext = pAccess->GetChar(pIdentity, iNext); + dwProps = FX_GetUnicodeProperties(wNext); + if ((dwProps & FX_CHARTYPEBITSMASK) != FX_CHARTYPE_Combination) { + break; + } + iNext ++; + } + if (iNext > iLength) { + wNext = 0xFEFF; + } + } else { + FX_INT32 j = -1; + do { + j ++; + if (i + j >= iLength) { + break; + } + wNext = pStr[j]; + dwProps = FX_GetUnicodeProperties(wNext); + } while ((dwProps & FX_CHARTYPEBITSMASK) == FX_CHARTYPE_Combination); + if (i + j >= iLength) { + wNext = 0xFEFF; + } + } + } else { + wNext = 0xFEFF; + } + wForm = m_pArabicChar->GetFormChar(wch, wPrev, wNext); + bLam = (wPrev == 0x0644 && wch == 0x0644 && wNext == 0x0647); + } else if (dwCharType == FX_CHARTYPE_Combination) { + wForm = wch; + if (wch >= 0x064C && wch <= 0x0651) { + if (bShadda) { + wForm = 0xFEFF; + bShadda = FALSE; + } else { + wNext = 0xFEFF; + if (pAccess != NULL) { + iNext = i + 1; + if (iNext <= iLength) { + wNext = pAccess->GetChar(pIdentity, iNext); + } + } else { + if (i < iLength) { + wNext = *pStr; + } + } + if (wch == 0x0651) { + if (wNext >= 0x064C && wNext <= 0x0650) { + wForm = FX_GetArabicFromShaddaTable(wNext); + bShadda = TRUE; + } + } else { + if (wNext == 0x0651) { + wForm = FX_GetArabicFromShaddaTable(wch); + bShadda = TRUE; + } + } + } + } else { + bShadda = FALSE; + } + } else if (dwCharType == FX_CHARTYPE_Numeric) { + wForm = wch; + if (bArabicNumber) { + wForm += 0x0630; + } + } else if (wch == L'.') { + wForm = wch; + if (bArabicNumber) { + wNext = 0xFEFF; + if (pAccess != NULL) { + iNext = i + 1; + if (iNext <= iLength) { + wNext = pAccess->GetChar(pIdentity, iNext); + } + } else { + if (i < iLength) { + wNext = *pStr; + } + } + if (wNext >= L'0' && wNext <= L'9') { + wForm = 0x066B; + } + } + } else if (wch == L',') { + wForm = wch; + if (bArabicComma) { + wForm = 0x060C; + } + } else if (bRTLPiece || bVerticalChar) { + wForm = FX_GetMirrorChar(wch, dwProps, bRTLPiece, bVerticalChar); + } else { + wForm = wch; + } + if (dwCharType != FX_CHARTYPE_Combination) { + bShadda = FALSE; + } + if (dwCharType < FX_CHARTYPE_ArabicAlef) { + bLam = FALSE; + } + dwProps = FX_GetUnicodeProperties(wForm); + iCharRotation = iRotation; + if (bVerticalChar && (dwProps & 0x8000) != 0) { + iCharRotation ++; + } + iCharRotation %= 4; + bEmptyChar = (dwCharType >= FX_CHARTYPE_Tab && dwCharType <= FX_CHARTYPE_Control); + if (wForm == 0xFEFF) { + bEmptyChar = TRUE; + } + iForms = bLam ? 3 : 1; + iCount += (bEmptyChar && bSkipSpace) ? 0 : iForms; + if (pCharPos == NULL) { + if (iWidth > 0) { + wPrev = wch; + } + wLast = wch; + continue; + } + iCharWidth = iWidth; + if (iCharWidth < 0) { + iCharWidth = -iCharWidth; + } + iCharWidth /= iFontSize; + formChars[0].wch = wch; + formChars[0].wForm = wForm; + formChars[0].iWidth = iCharWidth; + if (bLam) { + formChars[1].wForm = 0x0651; + iCharWidth = 0; + pFont->GetCharWidth(0x0651, iCharWidth, FALSE); + formChars[1].iWidth = iCharWidth; + formChars[2].wForm = 0x0670; + iCharWidth = 0; + pFont->GetCharWidth(0x0670, iCharWidth, FALSE); + formChars[2].iWidth = iCharWidth; + } + for (FX_INT32 j = 0; j < iForms; j ++) { + wForm = (FX_WCHAR)formChars[j].wForm; + iCharWidth = formChars[j].iWidth; + if (j > 0) { + dwCharType = FX_CHARTYPE_Combination; + wch = wForm; + wLast = (FX_WCHAR)formChars[j - 1].wForm; + } + if (!bEmptyChar || (bEmptyChar && !bSkipSpace)) { + pCharPos->m_GlyphIndex = bCharCode ? wch : pFont->GetGlyphIndex(wForm, FALSE); + pCharPos->m_ExtGID = pCharPos->m_GlyphIndex; + pCharPos->m_FontCharWidth = iCharWidth; + if (pWSForms) { + *pWSForms += wForm; + } + } + if (bVerticalDoc) { + iCharHeight = iCharWidth; + iCharWidth = 1000; + } else { + iCharHeight = 1000; + } + fCharWidth = fFontSize * iCharWidth / 1000.0f; + fCharHeight = fFontSize * iCharHeight / 1000.0f; + if (bRTLPiece && dwCharType != FX_CHARTYPE_Combination) { + if (bVerticalDoc) { + fY -= fCharHeight; + } else { + fX -= fCharWidth; + } + } + if (!bEmptyChar || (bEmptyChar && !bSkipSpace)) { + pCharPos->m_OriginX = fX; + pCharPos->m_OriginY = fY; + if ((dwStyles & FX_TXTLAYOUTSTYLE_CombText) != 0) { + FX_INT32 iFormWidth = iCharWidth; + pFont->GetCharWidth(wForm, iFormWidth, FALSE); + FX_FLOAT fOffset = fFontSize * (iCharWidth - iFormWidth) / 2000.0f; + if (bVerticalDoc) { + pCharPos->m_OriginY += fOffset; + } else { + pCharPos->m_OriginX += fOffset; + } + } + if (dwCharType == FX_CHARTYPE_Combination) { + CFX_Rect rtBBox; + rtBBox.Reset(); + if (pFont->GetCharBBox(wForm, rtBBox, FALSE)) { + pCharPos->m_OriginY = fYBase + fFontSize - fFontSize * (FX_FLOAT)rtBBox.height / (FX_FLOAT)iMaxHeight; + } + if (wForm == wch && wLast != 0xFEFF) { + FX_DWORD dwLastProps = FX_GetUnicodeProperties(wLast); + if ((dwLastProps & FX_CHARTYPEBITSMASK) == FX_CHARTYPE_Combination) { + CFX_Rect rtBBox; + rtBBox.Reset(); + if (pFont->GetCharBBox(wLast, rtBBox, FALSE)) { + pCharPos->m_OriginY -= fFontSize * rtBBox.height / iMaxHeight; + } + } + } + } + CFX_PointF ptOffset; + ptOffset.Reset(); + FX_BOOL bAdjusted = FALSE; + if (pAdjustPos) { + bAdjusted = pAdjustPos(wForm, bCharCode, pFont, fFontSize, bVerticalChar, ptOffset); + } + if (!bAdjusted && bVerticalChar && (dwProps & 0x00010000) != 0) { + CFX_Rect rtBBox; + rtBBox.Reset(); + if (pFont->GetCharBBox(wForm, rtBBox, FALSE)) { + ptOffset.x = fFontSize * (850 - rtBBox.right()) / iMaxHeight; + ptOffset.y = fFontSize * (iAscent - rtBBox.top - 150) / iMaxHeight; + } + } + pCharPos->m_OriginX += ptOffset.x; + pCharPos->m_OriginY -= ptOffset.y; + } + if (!bRTLPiece && dwCharType != FX_CHARTYPE_Combination) { + if (bVerticalDoc) { + fY += fCharHeight; + } else { + fX += fCharWidth; + } + } + if (!bEmptyChar || (bEmptyChar && !bSkipSpace)) { + pCharPos->m_bGlyphAdjust = TRUE; + if (bVerticalDoc) { + if (iCharRotation == 0) { + pCharPos->m_AdjustMatrix[0] = -1; + pCharPos->m_AdjustMatrix[1] = 0; + pCharPos->m_AdjustMatrix[2] = 0; + pCharPos->m_AdjustMatrix[3] = 1; + pCharPos->m_OriginY += fAscent; + } else if (iCharRotation == 1) { + pCharPos->m_AdjustMatrix[0] = 0; + pCharPos->m_AdjustMatrix[1] = -1; + pCharPos->m_AdjustMatrix[2] = -1; + pCharPos->m_AdjustMatrix[3] = 0; + pCharPos->m_OriginX -= fDescent; + } else if (iCharRotation == 2) { + pCharPos->m_AdjustMatrix[0] = 1; + pCharPos->m_AdjustMatrix[1] = 0; + pCharPos->m_AdjustMatrix[2] = 0; + pCharPos->m_AdjustMatrix[3] = -1; + pCharPos->m_OriginX += fCharWidth; + pCharPos->m_OriginY += fAscent; + } else { + pCharPos->m_AdjustMatrix[0] = 0; + pCharPos->m_AdjustMatrix[1] = 1; + pCharPos->m_AdjustMatrix[2] = 1; + pCharPos->m_AdjustMatrix[3] = 0; + pCharPos->m_OriginX += fAscent; + } + } else { + if (iCharRotation == 0) { + pCharPos->m_AdjustMatrix[0] = -1; + pCharPos->m_AdjustMatrix[1] = 0; + pCharPos->m_AdjustMatrix[2] = 0; + pCharPos->m_AdjustMatrix[3] = 1; + } else if (iCharRotation == 1) { + pCharPos->m_AdjustMatrix[0] = 0; + pCharPos->m_AdjustMatrix[1] = -1; + pCharPos->m_AdjustMatrix[2] = -1; + pCharPos->m_AdjustMatrix[3] = 0; + pCharPos->m_OriginX -= fDescent; + pCharPos->m_OriginY -= fAscent + fDescent; + } else if (iCharRotation == 2) { + pCharPos->m_AdjustMatrix[0] = 1; + pCharPos->m_AdjustMatrix[1] = 0; + pCharPos->m_AdjustMatrix[2] = 0; + pCharPos->m_AdjustMatrix[3] = -1; + pCharPos->m_OriginX += fCharWidth; + pCharPos->m_OriginY -= fAscent; + } else { + pCharPos->m_AdjustMatrix[0] = 0; + pCharPos->m_AdjustMatrix[1] = 1; + pCharPos->m_AdjustMatrix[2] = 1; + pCharPos->m_AdjustMatrix[3] = 0; + pCharPos->m_OriginX += fAscent; + } + } + if (iHorScale != 100 || iVerScale != 100) { + pCharPos->m_AdjustMatrix[0] = pCharPos->m_AdjustMatrix[0] * iHorScale / 100.0f; + pCharPos->m_AdjustMatrix[1] = pCharPos->m_AdjustMatrix[1] * iHorScale / 100.0f; + pCharPos->m_AdjustMatrix[2] = pCharPos->m_AdjustMatrix[2] * iVerScale / 100.0f; + pCharPos->m_AdjustMatrix[3] = pCharPos->m_AdjustMatrix[3] * iVerScale / 100.0f; + } + pCharPos ++; + } + } + if (iWidth > 0) { + wPrev = (FX_WCHAR)formChars[0].wch; + } + wLast = wch; + } + return iCount; +} +FX_INT32 CFX_TxtBreak::GetCharRects(FX_LPCTXTRUN pTxtRun, CFX_RectFArray &rtArray, FX_BOOL bCharBBox ) const +{ + if (pTxtRun == NULL || pTxtRun->iLength < 1) { + return 0; + } + IFX_TxtAccess *pAccess = pTxtRun->pAccess; + FX_LPVOID pIdentity = pTxtRun->pIdentity; + FX_LPCWSTR pStr = pTxtRun->pStr; + FX_INT32 *pWidths = pTxtRun->pWidths; + FX_INT32 iLength = pTxtRun->iLength; + CFX_RectF rect(*pTxtRun->pRect); + FX_BOOL bRTLPiece = (pTxtRun->dwCharStyles & FX_TXTCHARSTYLE_OddBidiLevel) != 0; + FX_FLOAT fFontSize = pTxtRun->fFontSize; + FX_INT32 iFontSize = FXSYS_round(fFontSize * 20.0f); + FX_FLOAT fScale = fFontSize / 1000.0f; + IFX_Font *pFont = pTxtRun->pFont; + if (pFont == NULL) { + bCharBBox = FALSE; + } + CFX_Rect bbox; + bbox.Set(0, 0, 0, 0); + if (bCharBBox) { + bCharBBox = pFont->GetBBox(bbox); + } + FX_FLOAT fLeft = FX_MAX(0, bbox.left * fScale); + FX_FLOAT fHeight = FXSYS_fabs(bbox.height * fScale); + rtArray.RemoveAll(); + rtArray.SetSize(iLength); + FX_BOOL bVertical = (pTxtRun->dwStyles & FX_TXTLAYOUTSTYLE_VerticalLayout) != 0; + FX_BOOL bSingleLine = (pTxtRun->dwStyles & FX_TXTLAYOUTSTYLE_SingleLine) != 0; + FX_BOOL bCombText = (pTxtRun->dwStyles & FX_TXTLAYOUTSTYLE_CombText) != 0; + FX_WCHAR wch, wLineBreakChar = pTxtRun->wLineBreakChar; + FX_INT32 iCharSize; + FX_FLOAT fCharSize, fStart; + if (bVertical) { + fStart = bRTLPiece ? rect.bottom() : rect.top; + } else { + fStart = bRTLPiece ? rect.right() : rect.left; + } + for (FX_INT32 i = 0; i < iLength; i ++) { + if (pAccess != NULL) { + wch = pAccess->GetChar(pIdentity, i); + iCharSize = pAccess->GetWidth(pIdentity, i); + } else { + wch = *pStr ++; + iCharSize = *pWidths ++; + } + fCharSize = (FX_FLOAT)iCharSize / 20000.0f; + FX_BOOL bRet = (!bSingleLine && FX_IsCtrlCode(wch)); + if (!(wch == L'\v' || wch == L'\f' || wch == 0x2028 || wch == 0x2029 || (wLineBreakChar != 0xFEFF && wch == wLineBreakChar))) { + bRet = FALSE; + } + if (bRet) { + iCharSize = iFontSize * 500; + fCharSize = fFontSize / 2.0f; + } + if (bVertical) { + rect.top = fStart; + if (bRTLPiece) { + rect.top -= fCharSize; + fStart -= fCharSize; + } else { + fStart += fCharSize; + } + rect.height = fCharSize; + } else { + rect.left = fStart; + if (bRTLPiece) { + rect.left -= fCharSize; + fStart -= fCharSize; + } else { + fStart += fCharSize; + } + rect.width = fCharSize; + } + if (bCharBBox && !bRet) { + FX_INT32 iCharWidth = 1000; + pFont->GetCharWidth(wch, iCharWidth); + FX_FLOAT fRTLeft = 0, fCharWidth = 0; + if (iCharWidth > 0) { + fCharWidth = iCharWidth * fScale; + fRTLeft = fLeft; + if (bCombText) { + fRTLeft = (rect.width - fCharWidth) / 2.0f; + } + } + CFX_RectF rtBBoxF; + if (bVertical) { + rtBBoxF.top = rect.left + fRTLeft; + rtBBoxF.left = rect.top + (rect.height - fHeight) / 2.0f; + rtBBoxF.height = fCharWidth; + rtBBoxF.width = fHeight; + rtBBoxF.left = FX_MAX(rtBBoxF.left, 0); + } else { + rtBBoxF.left = rect.left + fRTLeft; + rtBBoxF.top = rect.top + (rect.height - fHeight) / 2.0f; + rtBBoxF.width = fCharWidth; + rtBBoxF.height = fHeight; + rtBBoxF.top = FX_MAX(rtBBoxF.top, 0); + } + rtArray.SetAt(i, rtBBoxF); + continue; + } + rtArray.SetAt(i, rect); + } + return iLength; +} diff --git a/xfa/src/fgas/src/layout/fx_textbreak.h b/xfa/src/fgas/src/layout/fx_textbreak.h new file mode 100644 index 0000000000..c5bbc40946 --- /dev/null +++ b/xfa/src/fgas/src/layout/fx_textbreak.h @@ -0,0 +1,171 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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_TEXTBREAK_IMP +#define _FX_TEXTBREAK_IMP +class CFX_TxtLine; +class CFX_Txtbreak; +class CFX_TxtLine : public CFX_Object +{ +public: + CFX_TxtLine(FX_INT32 iBlockSize) : m_iStart(0) + , m_iWidth(0) + , m_iArabicChars(0) + { + m_pLineChars = FX_NEW CFX_TxtCharArray; + m_pLinePieces = FXTARGET_New CFX_TxtPieceArray(16); + } + ~CFX_TxtLine() + { + RemoveAll(); + delete m_pLineChars; + FXTARGET_Delete m_pLinePieces; + } + FX_INT32 CountChars() const + { + return m_pLineChars->GetSize(); + } + CFX_TxtChar* GetCharPtr(FX_INT32 index) const + { + FXSYS_assert(index > -1 && index < m_pLineChars->GetSize()); + return m_pLineChars->GetDataPtr(index); + } + FX_INT32 CountPieces() const + { + return m_pLinePieces->GetSize(); + } + CFX_TxtPiece* GetPiecePtr(FX_INT32 index) const + { + FXSYS_assert(index > -1 && index < m_pLinePieces->GetSize()); + return m_pLinePieces->GetPtrAt(index); + } + void GetString(CFX_WideString &wsStr) const + { + FX_INT32 iCount = m_pLineChars->GetSize(); + FX_LPWSTR pBuf = wsStr.GetBuffer(iCount); + CFX_Char *pChar; + for (FX_INT32 i = 0; i < iCount; i ++) { + pChar = m_pLineChars->GetDataPtr(i); + *pBuf ++ = (FX_WCHAR)pChar->m_wCharCode; + } + wsStr.ReleaseBuffer(iCount); + } + void RemoveAll(FX_BOOL bLeaveMemory = FALSE) + { + m_pLineChars->RemoveAll(); + m_pLinePieces->RemoveAll(bLeaveMemory); + m_iWidth = 0; + m_iArabicChars = 0; + } + CFX_TxtCharArray *m_pLineChars; + CFX_TxtPieceArray *m_pLinePieces; + FX_INT32 m_iStart; + FX_INT32 m_iWidth; + FX_INT32 m_iArabicChars; +}; +class CFX_TxtBreak : public IFX_TxtBreak, public CFX_Object +{ +public: + CFX_TxtBreak(FX_DWORD dwPolicies); + ~CFX_TxtBreak(); + virtual void Release() + { + delete this; + } + virtual void SetLineWidth(FX_FLOAT fLineWidth); + virtual void SetLinePos(FX_FLOAT fLinePos); + virtual FX_DWORD GetLayoutStyles() const + { + return m_dwLayoutStyles; + } + virtual void SetLayoutStyles(FX_DWORD dwLayoutStyles); + virtual void SetFont(IFX_Font *pFont); + virtual void SetFontSize(FX_FLOAT fFontSize); + virtual void SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant); + virtual void SetDefaultChar(FX_WCHAR wch); + virtual void SetParagraphBreakChar(FX_WCHAR wch); + virtual void SetLineBreakTolerance(FX_FLOAT fTolerance); + virtual void SetHorizontalScale(FX_INT32 iScale); + virtual void SetVerticalScale(FX_INT32 iScale); + virtual void SetCharRotation(FX_INT32 iCharRotation); + virtual void SetCharSpace(FX_FLOAT fCharSpace); + virtual void SetAlignment(FX_INT32 iAlignment); + virtual FX_DWORD GetContextCharStyles() const; + virtual void SetContextCharStyles(FX_DWORD dwCharStyles); + virtual void SetCombWidth(FX_FLOAT fCombWidth); + virtual void SetUserData(FX_LPVOID pUserData); + virtual FX_DWORD AppendChar(FX_WCHAR wch); + virtual FX_DWORD EndBreak(FX_DWORD dwStatus = FX_TXTBREAK_PieceBreak); + virtual FX_INT32 CountBreakChars() const; + virtual FX_INT32 CountBreakPieces() const; + virtual const CFX_TxtPiece* GetBreakPiece(FX_INT32 index) const; + virtual void ClearBreakPieces(); + virtual void Reset(); + virtual FX_INT32 GetDisplayPos(FX_LPCTXTRUN pTxtRun, FXTEXT_CHARPOS *pCharPos, FX_BOOL bCharCode = FALSE, CFX_WideString *pWSForms = NULL, FX_AdjustCharDisplayPos pAdjustPos = NULL) const; + virtual FX_INT32 GetCharRects(FX_LPCTXTRUN pTxtRun, CFX_RectFArray &rtArray, FX_BOOL bCharBBox = FALSE) const; + void AppendChar_PageLoad(CFX_Char *pCurChar, FX_DWORD dwProps); + FX_DWORD AppendChar_Combination(CFX_Char *pCurChar, FX_INT32 iRotation); + FX_DWORD AppendChar_Tab(CFX_Char *pCurChar, FX_INT32 iRotation); + FX_DWORD AppendChar_Control(CFX_Char *pCurChar, FX_INT32 iRotation); + FX_DWORD AppendChar_Arabic(CFX_Char *pCurChar, FX_INT32 iRotation); + FX_DWORD AppendChar_Others(CFX_Char *pCurChar, FX_INT32 iRotation); +protected: + FX_DWORD m_dwPolicies; + FX_BOOL m_bPagination; + IFX_ArabicChar *m_pArabicChar; + FX_INT32 m_iLineWidth; + FX_DWORD m_dwLayoutStyles; + FX_BOOL m_bVertical; + FX_BOOL m_bArabicContext; + FX_BOOL m_bArabicShapes; + FX_BOOL m_bRTL; + FX_BOOL m_bSingleLine; + FX_BOOL m_bCombText; + FX_INT32 m_iArabicContext; + FX_INT32 m_iCurArabicContext; + IFX_Font *m_pFont; + FX_INT32 m_iFontSize; + FX_BOOL m_bEquidistant; + FX_INT32 m_iTabWidth; + FX_WCHAR m_wDefChar; + FX_WCHAR m_wParagBreakChar; + FX_INT32 m_iDefChar; + FX_INT32 m_iLineRotation; + FX_INT32 m_iCharRotation; + FX_INT32 m_iRotation; + FX_INT32 m_iAlignment; + FX_DWORD m_dwContextCharStyles; + FX_INT32 m_iCombWidth; + FX_LPVOID m_pUserData; + FX_DWORD m_dwCharType; + FX_BOOL m_bCurRTL; + FX_INT32 m_iCurAlignment; + FX_BOOL m_bArabicNumber; + FX_BOOL m_bArabicComma; + CFX_TxtLine *m_pTxtLine1; + CFX_TxtLine *m_pTxtLine2; + CFX_TxtLine *m_pCurLine; + FX_INT32 m_iReady; + FX_INT32 m_iTolerance; + FX_INT32 m_iHorScale; + FX_INT32 m_iVerScale; + FX_INT32 m_iCharSpace; + void SetBreakStatus(); + FX_INT32 GetLineRotation(FX_DWORD dwStyles) const; + CFX_TxtChar* GetLastChar(FX_INT32 index, FX_BOOL bOmitChar = TRUE) const; + CFX_TxtLine* GetTxtLine(FX_BOOL bReady) const; + CFX_TxtPieceArray* GetTxtPieces(FX_BOOL bReady) const; + FX_DWORD GetUnifiedCharType(FX_DWORD dwType) const; + void ResetArabicContext(); + void ResetContextCharStyles(); + void EndBreak_UpdateArabicShapes(); + FX_BOOL EndBreak_SplitLine(CFX_TxtLine *pNextLine, FX_BOOL bAllChars, FX_DWORD dwStatus); + void EndBreak_BidiLine(CFX_TPOArray &tpos, FX_DWORD dwStatus); + void EndBreak_Alignment(CFX_TPOArray &tpos, FX_BOOL bAllChars, FX_DWORD dwStatus); + FX_INT32 GetBreakPos(CFX_TxtCharArray &ca, FX_INT32 &iEndPos, FX_BOOL bAllChars = FALSE, FX_BOOL bOnlyBrk = FALSE); + void SplitTextLine(CFX_TxtLine *pCurLine, CFX_TxtLine *pNextLine, FX_BOOL bAllChars = FALSE); +}; +#endif diff --git a/xfa/src/fgas/src/layout/fx_unicode.cpp b/xfa/src/fgas/src/layout/fx_unicode.cpp new file mode 100644 index 0000000000..def5d707f5 --- /dev/null +++ b/xfa/src/fgas/src/layout/fx_unicode.cpp @@ -0,0 +1,146 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../fgas_base.h" +#include "fx_unicode.h" +void FX_TEXTLAYOUT_PieceSort(CFX_TPOArray &tpos, FX_INT32 iStart, FX_INT32 iEnd) +{ + FXSYS_assert(iStart > -1 && iStart < tpos.GetSize()); + FXSYS_assert(iEnd > -1 && iEnd < tpos.GetSize()); + if (iStart >= iEnd) { + return; + } + FX_INT32 i = iStart, j = iEnd; + FX_TPO *pCur = tpos.GetPtrAt(iStart), *pSort; + FX_INT32 v = pCur->pos; + while (i < j) { + while (j > i) { + pSort = tpos.GetPtrAt(j); + if (pSort->pos < v) { + FX_TPO t = *pSort; + *pSort = *pCur; + *pCur = t; + pCur = pSort; + break; + } + j --; + } + while (i < j) { + pSort = tpos.GetPtrAt(i); + if (pSort->pos > v) { + FX_TPO t = *pSort; + *pSort = *pCur; + *pCur = t; + pCur = pSort; + break; + } + i ++; + } + } + i --, j ++; + if (iStart < i) { + FX_TEXTLAYOUT_PieceSort(tpos, iStart, i); + } + if (j < iEnd) { + FX_TEXTLAYOUT_PieceSort(tpos, j, iEnd); + } +} +static const FX_JAPCHARPROPERTYEX gs_FX_JapCharPropertysEx[] = { + {0x3001, 0x13}, + {0x3002, 0x13}, + {0x3041, 0x23}, + {0x3043, 0x23}, + {0x3045, 0x23}, + {0x3047, 0x23}, + {0x3049, 0x23}, + {0x3063, 0x23}, + {0x3083, 0x23}, + {0x3085, 0x23}, + {0x3087, 0x23}, + {0x308E, 0x23}, + {0x3095, 0x23}, + {0x3096, 0x23}, + {0x30A1, 0x23}, + {0x30A3, 0x23}, + {0x30A5, 0x23}, + {0x30A7, 0x23}, + {0x30A9, 0x23}, + {0x30C3, 0x23}, + {0x30E3, 0x23}, + {0x30E5, 0x23}, + {0x30E7, 0x23}, + {0x30EE, 0x23}, + {0x30F5, 0x23}, + {0x30F6, 0x23}, + {0x30FB, 0x22}, + {0x31F0, 0x23}, + {0x31F1, 0x23}, + {0x31F2, 0x23}, + {0x31F3, 0x23}, + {0x31F4, 0x23}, + {0x31F5, 0x23}, + {0x31F6, 0x23}, + {0x31F7, 0x23}, + {0x31F8, 0x23}, + {0x31F9, 0x23}, + {0x31FA, 0x23}, + {0x31FB, 0x23}, + {0x31FC, 0x23}, + {0x31FD, 0x23}, + {0x31FE, 0x23}, + {0x31FF, 0x23}, +}; +FX_LPCJAPCHARPROPERTYEX FX_GetJapCharPropertyEx(FX_WCHAR wch) +{ + FX_INT32 iStart = 0; + FX_INT32 iEnd = sizeof(gs_FX_JapCharPropertysEx) / sizeof(FX_JAPCHARPROPERTYEX); + while (iStart <= iEnd) { + FX_INT32 iMid = (iStart + iEnd) / 2; + FX_WCHAR wJapChar = gs_FX_JapCharPropertysEx[iMid].wChar; + if (wch == wJapChar) { + return gs_FX_JapCharPropertysEx + iMid; + } else if (wch < wJapChar) { + iEnd = iMid - 1; + } else { + iStart = iMid + 1; + } + } + return NULL; +} +FX_BOOL FX_AdjustJapCharDisplayPos(FX_WCHAR wch, FX_BOOL bMBCSCode, IFX_Font *pFont, FX_FLOAT fFontSize, FX_BOOL bVertical, CFX_PointF &ptOffset) +{ + if (pFont == NULL || !bVertical) { + return FALSE; + } + if (wch < 0x3001 || wch > 0x31FF) { + return FALSE; + } + FX_LPCJAPCHARPROPERTYEX pJapChar = FX_GetJapCharPropertyEx(wch); + if (pJapChar == NULL) { + return FALSE; + } + CFX_Rect rtBBox; + rtBBox.Reset(); + if (pFont->GetCharBBox(wch, rtBBox, bMBCSCode)) { + switch (pJapChar->uAlign & 0xF0) { + case FX_JAPCHARPROPERTYEX_Top: + ptOffset.y = fFontSize * (1000 - rtBBox.height) / 1200.0f; + break; + case FX_JAPCHARPROPERTYEX_Middle: + ptOffset.y = fFontSize * (1000 - rtBBox.height) / 6000.0f; + break; + } + switch (pJapChar->uAlign & 0x0F) { + case FX_JAPCHARPROPERTYEX_Center: + ptOffset.x = fFontSize * (600 - rtBBox.right()) / 1000.0f; + break; + case FX_JAPCHARPROPERTYEX_Right: + ptOffset.x = fFontSize * (950 - rtBBox.right()) / 1000.0f; + break; + } + } + return TRUE; +} diff --git a/xfa/src/fgas/src/layout/fx_unicode.h b/xfa/src/fgas/src/layout/fx_unicode.h new file mode 100644 index 0000000000..5eadb5506f --- /dev/null +++ b/xfa/src/fgas/src/layout/fx_unicode.h @@ -0,0 +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 _FGAS_UNICODE_IMP +#define _FGAS_UNICODE_IMP +typedef struct _FX_TPO { + FX_INT32 index; + FX_INT32 pos; +} FX_TPO; +typedef CFX_MassArrayTemplate CFX_TPOArray; +void FX_TEXTLAYOUT_PieceSort(CFX_TPOArray &tpos, FX_INT32 iStart, FX_INT32 iEnd); +#endif diff --git a/xfa/src/fgas/src/localization/fx_datetime.cpp b/xfa/src/fgas/src/localization/fx_datetime.cpp new file mode 100644 index 0000000000..03ecb5bf48 --- /dev/null +++ b/xfa/src/fgas/src/localization/fx_datetime.cpp @@ -0,0 +1,548 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../fgas_base.h" +const FX_BYTE g_FXDaysPerMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; +const FX_BYTE g_FXDaysPerLeapMonth[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; +const FX_INT32 g_FXDaysBeforeMonth[12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; +const FX_INT32 g_FXDaysBeforeLeapMonth[12] = {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335}; +const FX_INT32 g_FXDaysPerYear = 365; +const FX_INT32 g_FXDaysPerLeapYear = 366; +const FX_INT32 g_FXDaysPer4Years = 1461; +const FX_INT32 g_FXDaysPer100Years = 36524; +const FX_INT32 g_FXDaysPer400Years = 146097; +const FX_INT64 g_FXMillisecondsPerSecond = 1000; +const FX_INT64 g_FXMillisecondsPerMinute = 60000; +const FX_INT64 g_FXMillisecondsPerHour = 3600000; +const FX_INT64 g_FXMillisecondsPerDay = 86400000; +#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || _FX_OS_ == _FX_WIN64_ +const FX_INT64 g_FXMillisecondsPerYear = 0x0757B12C00; +const FX_INT64 g_FXMillisecondsPerLeapYear = 0x075CD78800; +const FX_INT64 g_FXMillisecondsPer4Years = 0x1D63EB0C00; +const FX_INT64 g_FXMillisecondsPer100Years = 0x02DEBCCDD000; +const FX_INT64 g_FXMillisecondsPer400Years = 0x0B7AF85D9C00; +#endif +FX_BOOL FX_IsLeapYear(FX_INT32 iYear) +{ + FXSYS_assert(iYear != 0); + return ((iYear % 4) == 0 && (iYear % 100) != 0) || (iYear % 400) == 0; +} +FX_INT32 FX_DaysInYear(FX_INT32 iYear) +{ + FXSYS_assert(iYear != 0); + return FX_IsLeapYear(iYear) ? g_FXDaysPerLeapYear : g_FXDaysPerYear; +} +FX_BYTE FX_DaysInMonth(FX_INT32 iYear, FX_BYTE iMonth) +{ + FXSYS_assert(iYear != 0); + FXSYS_assert(iMonth >= 1 && iMonth <= 12); + const FX_BYTE *p = FX_IsLeapYear(iYear) ? g_FXDaysPerLeapMonth : g_FXDaysPerMonth; + return p[iMonth - 1]; +} +static FX_INT32 FX_DaysBeforeMonthInYear(FX_INT32 iYear, FX_BYTE iMonth) +{ + FXSYS_assert(iYear != 0); + FXSYS_assert(iMonth >= 1 && iMonth <= 12); + const FX_INT32 *p = FX_IsLeapYear(iYear) ? g_FXDaysBeforeLeapMonth : g_FXDaysBeforeMonth; + return p[iMonth - 1]; +} +static FX_INT64 FX_DateToDays(FX_INT32 iYear, FX_BYTE iMonth, FX_BYTE iDay, FX_BOOL bIncludeThisDay = FALSE) +{ + FXSYS_assert(iYear != 0); + FXSYS_assert(iMonth >= 1 && iMonth <= 12); + FXSYS_assert(iDay >= 1 && iDay <= FX_DaysInMonth(iYear, iMonth)); + FX_INT64 iDays = FX_DaysBeforeMonthInYear(iYear, iMonth); + iDays += iDay; + if (!bIncludeThisDay) { + iDays --; + } + if (iYear > 0) { + iYear --; + } else { + iDays -= FX_DaysInYear(iYear); + iYear ++; + } + return iDays + (FX_INT64)iYear * 365 + iYear / 4 - iYear / 100 + iYear / 400; +} +static void FX_DaysToDate(FX_INT64 iDays, FX_INT32 &iYear, FX_BYTE &iMonth, FX_BYTE &iDay) +{ + FX_BOOL bBC = iDays < 0; + if (bBC) { + iDays = -iDays; + } + iYear = 1; + iMonth = 1; + iDay = 1; + if (iDays >= g_FXDaysPer400Years) { + iYear += (FX_INT32)(iDays / g_FXDaysPer400Years * 400); + iDays %= g_FXDaysPer400Years; + } + if (iDays >= g_FXDaysPer100Years) { + if (iDays == g_FXDaysPer100Years * 4) { + iYear += 300; + iDays -= g_FXDaysPer100Years * 3; + } else { + iYear += (FX_INT32)(iDays / g_FXDaysPer100Years * 100); + iDays %= g_FXDaysPer100Years; + } + } + if (iDays >= g_FXDaysPer4Years) { + iYear += (FX_INT32)(iDays / g_FXDaysPer4Years * 4); + iDays %= g_FXDaysPer4Years; + } + while (TRUE) { + FX_INT32 iYearDays = FX_DaysInYear(iYear); + if (iDays < iYearDays) { + if (bBC) { + iYear = -iYear; + iDays = iYearDays - iDays; + } + break; + } + iYear ++; + iDays -= iYearDays; + } + while (TRUE) { + FX_INT32 iMonthDays = FX_DaysInMonth(iYear, iMonth); + if (iDays < iMonthDays) { + break; + } + iMonth ++; + iDays -= iMonthDays; + } + iDay += (FX_BYTE)iDays; +} +#if _FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_LINUX_EMBEDDED_ || _FX_OS_ == _FX_ANDROID_ || _FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_IOS_ +#include +#include +#endif +typedef struct _FXUT_SYSTEMTIME { + FX_WORD wYear; + FX_WORD wMonth; + FX_WORD wDayOfWeek; + FX_WORD wDay; + FX_WORD wHour; + FX_WORD wMinute; + FX_WORD wSecond; + FX_WORD wMilliseconds; +} FXUT_SYSTEMTIME; +void CFX_Unitime::Now() +{ + FXUT_SYSTEMTIME utLocal; +#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || _FX_OS_ == _FX_WIN64_ + ::GetLocalTime((LPSYSTEMTIME)&utLocal); +#elif _FX_OS_ != _FX_EMBEDDED_ +#if 1 + timeval curTime; + gettimeofday(&curTime, NULL); +#else + struct timespec curTime; + clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &curTime); +#endif + struct tm st; + localtime_r(&curTime.tv_sec, &st); + utLocal.wYear = st.tm_year + 1900; + utLocal.wMonth = st.tm_mon + 1; + utLocal.wDayOfWeek = st.tm_wday; + utLocal.wDay = st.tm_mday; + utLocal.wHour = st.tm_hour; + utLocal.wMinute = st.tm_min; + utLocal.wSecond = st.tm_sec; + utLocal.wMilliseconds = curTime.tv_usec / 1000; +#endif + Set(utLocal.wYear, (FX_BYTE)utLocal.wMonth, (FX_BYTE)utLocal.wDay, + (FX_BYTE)utLocal.wHour, (FX_BYTE)utLocal.wMinute, (FX_BYTE)utLocal.wSecond, (FX_WORD)utLocal.wMilliseconds); +} +void CFX_Unitime::SetGMTime() +{ + FXUT_SYSTEMTIME utLocal; +#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || _FX_OS_ == _FX_WIN64_ + ::GetSystemTime((LPSYSTEMTIME)&utLocal); +#elif _FX_OS_ != _FX_EMBEDDED_ +#if 1 + timeval curTime; + gettimeofday(&curTime, NULL); +#else + struct timespec curTime; + clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &curTime); +#endif + struct tm st; + gmtime_r(&curTime.tv_sec, &st); + utLocal.wYear = st.tm_year + 1900; + utLocal.wMonth = st.tm_mon + 1; + utLocal.wDayOfWeek = st.tm_wday; + utLocal.wDay = st.tm_mday; + utLocal.wHour = st.tm_hour; + utLocal.wMinute = st.tm_min; + utLocal.wSecond = st.tm_sec; + utLocal.wMilliseconds = curTime.tv_usec / 1000; +#endif + Set(utLocal.wYear, (FX_BYTE)utLocal.wMonth, (FX_BYTE)utLocal.wDay, + (FX_BYTE)utLocal.wHour, (FX_BYTE)utLocal.wMinute, (FX_BYTE)utLocal.wSecond, (FX_WORD)utLocal.wMilliseconds); +} +void CFX_Unitime::Set(FX_INT32 year, FX_BYTE month, FX_BYTE day, FX_BYTE hour, FX_BYTE minute, FX_BYTE second, FX_WORD millisecond) +{ + FXSYS_assert(hour <= 23); + FXSYS_assert(minute <= 59); + FXSYS_assert(second <= 59); + FXSYS_assert(millisecond <= 999); + m_iUnitime = (FX_INT64)hour * g_FXMillisecondsPerHour + (FX_INT64)minute * g_FXMillisecondsPerMinute + (FX_INT64)second * g_FXMillisecondsPerSecond + millisecond; + if (year > 0) { + m_iUnitime = m_iUnitime + FX_DateToDays(year, month, day, FALSE) * g_FXMillisecondsPerDay; + } +} +void CFX_Unitime::Set(FX_UNITIME t) +{ + m_iUnitime = t; +} +FX_INT32 CFX_Unitime::GetYear() const +{ + FX_INT32 iYear; + FX_BYTE iMonth, iDay; + FX_DaysToDate(GetDayOfAD(), iYear, iMonth, iDay); + return iYear; +} +FX_BYTE CFX_Unitime::GetMonth() const +{ + FX_INT32 iYear; + FX_BYTE iMonth, iDay; + FX_DaysToDate(GetDayOfAD(), iYear, iMonth, iDay); + return iMonth; +} +FX_BYTE CFX_Unitime::GetDay() const +{ + FX_INT32 iYear; + FX_BYTE iMonth, iDay; + FX_DaysToDate(GetDayOfAD(), iYear, iMonth, iDay); + return iDay; +} +FX_WEEKDAY CFX_Unitime::GetDayOfWeek() const +{ + FX_INT32 v = (FX_INT32)((m_iUnitime / g_FXMillisecondsPerDay + 1) % 7); + if (v < 0) { + v += 7; + } + return (FX_WEEKDAY)v; +} +FX_WORD CFX_Unitime::GetDayOfYear() const +{ + FX_INT32 iYear; + FX_BYTE iMonth, iDay; + FX_DaysToDate(GetDayOfAD(), iYear, iMonth, iDay); + return FX_DaysBeforeMonthInYear(iYear, iMonth) + iDay; +} +FX_INT64 CFX_Unitime::GetDayOfAD() const +{ + FX_BOOL bBC = m_iUnitime < 0; + FX_INT64 iDays = m_iUnitime / g_FXMillisecondsPerDay; + iDays += bBC ? -1 : 0; + if (bBC && (m_iUnitime % g_FXMillisecondsPerDay) == 0) { + iDays ++; + } + return iDays; +} +FX_BYTE CFX_Unitime::GetHour() const +{ + FX_INT32 v = (FX_INT32)(m_iUnitime % g_FXMillisecondsPerDay); + if (v < 0) { + v += g_FXMillisecondsPerDay; + } + return (FX_BYTE)(v / g_FXMillisecondsPerHour); +} +FX_BYTE CFX_Unitime::GetMinute() const +{ + FX_INT32 v = (FX_INT32)(m_iUnitime % g_FXMillisecondsPerHour); + if (v < 0) { + v += g_FXMillisecondsPerHour; + } + return (FX_BYTE)(v / g_FXMillisecondsPerMinute); +} +FX_BYTE CFX_Unitime::GetSecond() const +{ + FX_INT32 v = (FX_INT32)(m_iUnitime % g_FXMillisecondsPerMinute); + if (v < 0) { + v += g_FXMillisecondsPerMinute; + } + return (FX_BYTE)(v / g_FXMillisecondsPerSecond); +} +FX_WORD CFX_Unitime::GetMillisecond() const +{ + FX_INT32 v = (FX_INT32)(m_iUnitime % g_FXMillisecondsPerSecond); + if (v < 0) { + v += g_FXMillisecondsPerSecond; + } + return (FX_WORD)v; +} +FX_BOOL CFX_Unitime::AddYears(FX_INT32 iYears) +{ + FX_UNITIME ut = m_iUnitime; + if (ut < 0) { + ut = -ut; + } + FX_UNITIME r = ut % g_FXMillisecondsPerDay; + FX_INT32 iYear; + FX_BYTE iMonth, iDay; + FX_DaysToDate(GetDayOfAD(), iYear, iMonth, iDay); + iYear += iYears; + if (iYear == 0) { + iYear = iYears > 0 ? 1 : -1; + } + m_iUnitime = FX_DateToDays(iYear, iMonth, iDay, FALSE) * g_FXMillisecondsPerDay; + m_iUnitime += (iYear < 0) ? -r : r; + return TRUE; +} +FX_BOOL CFX_Unitime::AddMonths(FX_INT32 iMonths) +{ + FX_BOOL b = iMonths > 0; + FX_UNITIME ut = m_iUnitime; + if (ut < 0) { + ut = -ut; + } + FX_UNITIME r = ut % g_FXMillisecondsPerDay; + FX_INT32 iYear; + FX_BYTE iMonth, iDay; + FX_DaysToDate(GetDayOfAD(), iYear, iMonth, iDay); + iMonths += iMonth; + while (iMonths < 1) { + iYear --, iMonths += 12; + } + while (iMonths > 12) { + iYear ++, iMonths -= 12; + } + if (iYear == 0) { + iYear = b ? 1 : -1; + } + m_iUnitime = FX_DateToDays(iYear, (FX_BYTE)iMonths, iDay, FALSE) * g_FXMillisecondsPerDay; + m_iUnitime += (iYear < 0) ? -r : r; + return TRUE; +} +FX_BOOL CFX_Unitime::AddDays(FX_INT32 iDays) +{ + m_iUnitime += (FX_INT64)iDays * g_FXMillisecondsPerDay; + return TRUE; +} +FX_BOOL CFX_Unitime::AddHours(FX_INT32 iHours) +{ + m_iUnitime += (FX_INT64)iHours * g_FXMillisecondsPerHour; + return TRUE; +} +FX_BOOL CFX_Unitime::AddMinutes(FX_INT32 iMinutes) +{ + m_iUnitime += (FX_INT64)iMinutes * g_FXMillisecondsPerMinute; + return TRUE; +} +FX_BOOL CFX_Unitime::AddSeconds(FX_INT32 iSeconds) +{ + m_iUnitime += ((FX_INT64)iSeconds) * g_FXMillisecondsPerSecond; + return TRUE; +} +FX_BOOL CFX_Unitime::AddMilliseconds(FX_INT32 iMilliseconds) +{ + m_iUnitime += iMilliseconds; + return TRUE; +} +FX_BOOL CFX_DateTime::Set(FX_INT32 year, FX_BYTE month, FX_BYTE day, FX_BYTE hour, FX_BYTE minute, FX_BYTE second, FX_WORD millisecond) +{ + ASSERT(year != 0); + ASSERT(month >= 1 && month <= 12); + ASSERT(day >= 1 && day <= FX_DaysInMonth(year, month)); + ASSERT(hour <= 23); + ASSERT(minute <= 59); + ASSERT(second <= 59); + ASSERT(millisecond <= 999); + m_DateTime.Date.sDate.year = year; + m_DateTime.Date.sDate.month = month; + m_DateTime.Date.sDate.day = day; + m_DateTime.Time.sTime.hour = hour; + m_DateTime.Time.sTime.minute = minute; + m_DateTime.Time.sTime.second = second; + m_DateTime.Time.sTime.millisecond = millisecond; + return TRUE; +} +FX_BOOL CFX_DateTime::FromUnitime(FX_UNITIME t) +{ + CFX_Unitime ut(t); + FX_DaysToDate(ut.GetDayOfAD(), m_DateTime.Date.sDate.year, m_DateTime.Date.sDate.month, m_DateTime.Date.sDate.day); + m_DateTime.Date.sDate.day = ut.GetHour(); + m_DateTime.Time.sTime.minute = ut.GetMinute(); + m_DateTime.Time.sTime.second = ut.GetSecond(); + m_DateTime.Time.sTime.millisecond = ut.GetMillisecond(); + return TRUE; +} +FX_UNITIME CFX_DateTime::ToUnitime() const +{ + FX_UNITIME v = (FX_INT64)m_DateTime.Date.sDate.day * g_FXMillisecondsPerHour + (FX_INT64)m_DateTime.Time.sTime.minute * g_FXMillisecondsPerMinute + (FX_INT64)m_DateTime.Time.sTime.second * g_FXMillisecondsPerSecond + m_DateTime.Time.sTime.millisecond; + v += FX_DateToDays(m_DateTime.Date.sDate.year, m_DateTime.Date.sDate.month, m_DateTime.Date.sDate.day, FALSE) * g_FXMillisecondsPerDay; + return v; +} +FX_INT32 CFX_DateTime::GetYear() const +{ + return m_DateTime.Date.sDate.year; +} +FX_BYTE CFX_DateTime::GetMonth() const +{ + return m_DateTime.Date.sDate.month; +} +FX_BYTE CFX_DateTime::GetDay() const +{ + return m_DateTime.Date.sDate.day; +} +FX_WEEKDAY CFX_DateTime::GetDayOfWeek() const +{ + FX_INT32 v = (FX_INT32)(FX_DateToDays(m_DateTime.Date.sDate.year, m_DateTime.Date.sDate.month, m_DateTime.Date.sDate.day, TRUE) % 7); + if (v < 0) { + v += 7; + } + return (FX_WEEKDAY)v; +} +FX_WORD CFX_DateTime::GetDayOfYear() const +{ + return FX_DaysBeforeMonthInYear(m_DateTime.Date.sDate.year, m_DateTime.Date.sDate.month) + m_DateTime.Date.sDate.day; +} +FX_INT64 CFX_DateTime::GetDayOfAD() const +{ + return FX_DateToDays(m_DateTime.Date.sDate.year, m_DateTime.Date.sDate.month, m_DateTime.Date.sDate.day, TRUE); +} +FX_BYTE CFX_DateTime::GetHour() const +{ + return m_DateTime.Date.sDate.day; +} +FX_BYTE CFX_DateTime::GetMinute() const +{ + return m_DateTime.Time.sTime.minute; +} +FX_BYTE CFX_DateTime::GetSecond() const +{ + return m_DateTime.Time.sTime.second; +} +FX_WORD CFX_DateTime::GetMillisecond() const +{ + return m_DateTime.Time.sTime.millisecond; +} +FX_BOOL CFX_DateTime::AddYears(FX_INT32 iYears) +{ + if (iYears == 0) { + return FALSE; + } + FX_INT32 v = m_DateTime.Date.sDate.year + iYears; + if (v >= 0 && m_DateTime.Date.sDate.year < 0) { + v ++; + } else if (v <= 0 && m_DateTime.Date.sDate.year > 0) { + v --; + } + m_DateTime.Date.sDate.year = v; + return TRUE; +} +FX_BOOL CFX_DateTime::AddMonths(FX_INT32 iMonths) +{ + if (iMonths == 0) { + return FALSE; + } + FX_BOOL b = iMonths > 0; + iMonths += m_DateTime.Date.sDate.month; + while (iMonths < 1) { + m_DateTime.Date.sDate.year --; + if (m_DateTime.Date.sDate.year == 0) { + m_DateTime.Date.sDate.year = -1; + } + iMonths += 12; + } + while (iMonths > 12) { + m_DateTime.Date.sDate.year ++; + if (m_DateTime.Date.sDate.year == 0) { + m_DateTime.Date.sDate.year = 1; + } + iMonths -= 12; + } + if (m_DateTime.Date.sDate.year == 0) { + m_DateTime.Date.sDate.year = b ? 1 : -1; + } + m_DateTime.Date.sDate.month = (FX_BYTE)iMonths; + return TRUE; +} +FX_BOOL CFX_DateTime::AddDays(FX_INT32 iDays) +{ + if (iDays == 0) { + return FALSE; + } + FX_INT64 v1 = FX_DateToDays(m_DateTime.Date.sDate.year, m_DateTime.Date.sDate.month, m_DateTime.Date.sDate.day, TRUE); + FX_INT64 v2 = v1 + iDays; + if (v2 <= 0 && v1 > 0) { + v2 --; + } else if (v2 >= 0 && v1 < 0) { + v2 ++; + } + FX_DaysToDate(v2, m_DateTime.Date.sDate.year, m_DateTime.Date.sDate.month, m_DateTime.Date.sDate.day); + return TRUE; +} +FX_BOOL CFX_DateTime::AddHours(FX_INT32 iHours) +{ + if (iHours == 0) { + return FALSE; + } + iHours += m_DateTime.Date.sDate.day; + FX_INT32 iDays = iHours / 24; + iHours %= 24; + if (iHours < 0) { + iDays --, iHours += 24; + } + m_DateTime.Date.sDate.day = (FX_BYTE)iHours; + if (iDays != 0) { + AddDays(iDays); + } + return TRUE; +} +FX_BOOL CFX_DateTime::AddMinutes(FX_INT32 iMinutes) +{ + if (iMinutes == 0) { + return FALSE; + } + iMinutes += m_DateTime.Time.sTime.minute; + FX_INT32 iHours = iMinutes / 60; + iMinutes %= 60; + if (iMinutes < 0) { + iHours --, iMinutes += 60; + } + m_DateTime.Time.sTime.minute = (FX_BYTE)iMinutes; + if (iHours != 0) { + AddHours(iHours); + } + return TRUE; +} +FX_BOOL CFX_DateTime::AddSeconds(FX_INT32 iSeconds) +{ + if (iSeconds == 0) { + return FALSE; + } + iSeconds += m_DateTime.Time.sTime.second; + FX_INT32 iMinutes = iSeconds / 60; + iSeconds %= 60; + if (iSeconds < 0) { + iMinutes --, iSeconds += 60; + } + m_DateTime.Time.sTime.second = (FX_BYTE)iSeconds; + if (iMinutes != 0) { + AddMinutes(iMinutes); + } + return TRUE; +} +FX_BOOL CFX_DateTime::AddMilliseconds(FX_INT32 iMilliseconds) +{ + if (iMilliseconds == 0) { + return FALSE; + } + iMilliseconds += m_DateTime.Time.sTime.millisecond; + FX_INT32 iSeconds = (FX_INT32)(iMilliseconds / g_FXMillisecondsPerSecond); + iMilliseconds %= g_FXMillisecondsPerSecond; + if (iMilliseconds < 0) { + iSeconds --, iMilliseconds += g_FXMillisecondsPerSecond; + } + m_DateTime.Time.sTime.millisecond = (FX_WORD)iMilliseconds; + if (iSeconds != 0) { + AddSeconds(iSeconds); + } + return TRUE; +} diff --git a/xfa/src/fgas/src/localization/fx_locale.cpp b/xfa/src/fgas/src/localization/fx_locale.cpp new file mode 100644 index 0000000000..a932a6c1a3 --- /dev/null +++ b/xfa/src/fgas/src/localization/fx_locale.cpp @@ -0,0 +1,4954 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../fgas_base.h" +#include "fx_localeimp.h" +#define FX_LOCALECATEGORY_DateHash 0xbde9abde +#define FX_LOCALECATEGORY_TimeHash 0x2d71b00f +#define FX_LOCALECATEGORY_DateTimeHash 0x158c72ed +#define FX_LOCALECATEGORY_NumHash 0x0b4ff870 +#define FX_LOCALECATEGORY_TextHash 0x2d08af85 +#define FX_LOCALECATEGORY_ZeroHash 0x568cb500 +#define FX_LOCALECATEGORY_NullHash 0x052931bb +typedef struct _FX_LOCALESUBCATEGORYINFO { + FX_UINT32 uHash; + FX_LPCWSTR pName; + FX_INT32 eSubCategory; +} FX_LOCALESUBCATEGORYINFO, * FX_LPLOCALESUBCATEGORYINFO; +typedef FX_LOCALESUBCATEGORYINFO const * FX_LPCLOCALESUBCATEGORYINFO; +const static FX_LOCALESUBCATEGORYINFO g_FXLocaleDateTimeSubCatData[] = { + {0x14da2125, (FX_LPCWSTR)L"default", FX_LOCALEDATETIMESUBCATEGORY_Default}, + {0x9041d4b0, (FX_LPCWSTR)L"short", FX_LOCALEDATETIMESUBCATEGORY_Short}, + {0xa084a381, (FX_LPCWSTR)L"medium", FX_LOCALEDATETIMESUBCATEGORY_Medium}, + {0xcdce56b3, (FX_LPCWSTR)L"full", FX_LOCALEDATETIMESUBCATEGORY_Full}, + {0xf6b4afb0, (FX_LPCWSTR)L"long", FX_LOCALEDATETIMESUBCATEGORY_Long}, +}; +const static FX_INT32 g_iFXLocaleDateTimeSubCatCount = sizeof(g_FXLocaleDateTimeSubCatData) / sizeof(FX_LOCALESUBCATEGORYINFO); +const static FX_LOCALESUBCATEGORYINFO g_FXLocaleNumSubCatData[] = { + {0x46f95531, (FX_LPCWSTR)L"percent", FX_LOCALENUMPATTERN_Percent}, + {0x4c4e8acb, (FX_LPCWSTR)L"currency", FX_LOCALENUMPATTERN_Currency}, + {0x54034c2f, (FX_LPCWSTR)L"decimal", FX_LOCALENUMPATTERN_Decimal}, + {0x7568e6ae, (FX_LPCWSTR)L"integer", FX_LOCALENUMPATTERN_Integer}, +}; +const static FX_INT32 g_iFXLocaleNumSubCatCount = sizeof(g_FXLocaleNumSubCatData) / sizeof(FX_LOCALESUBCATEGORYINFO); +typedef struct _FX_LOCALETIMEZONEINFO { + FX_DWORD uHash; + FX_INT16 iHour; + FX_INT16 iMinute; +} FX_LOCALETIMEZONEINFO, * FX_LPLOCALETIMEZONEINFO; +typedef FX_LOCALETIMEZONEINFO const * FX_LPCLOCALETIMEZONEINFO; +const static FX_LOCALETIMEZONEINFO g_FXLocaleTimeZoneData[] = { + {FXBSTR_ID(0, 'C', 'D', 'T'), -5, 0}, {FXBSTR_ID(0, 'C', 'S', 'T'), -6, 0}, + {FXBSTR_ID(0, 'E', 'D', 'T'), -4, 0}, {FXBSTR_ID(0, 'E', 'S', 'T'), -5, 0}, + {FXBSTR_ID(0, 'M', 'D', 'T'), -6, 0}, {FXBSTR_ID(0, 'M', 'S', 'T'), -7, 0}, + {FXBSTR_ID(0, 'P', 'D', 'T'), -7, 0}, {FXBSTR_ID(0, 'P', 'S', 'T'), -8, 0}, +}; +const static FX_INT32 g_iFXLocaleTimeZoneCount = sizeof(g_FXLocaleTimeZoneData) / sizeof(FX_LOCALETIMEZONEINFO); +const static CFX_WideStringC gs_wsTextSymbols = FX_WSTRC(L"AXO09"); +const static CFX_WideStringC gs_wsTimeSymbols = FX_WSTRC(L"hHkKMSFAzZ"); +const static CFX_WideStringC gs_wsDateSymbols = FX_WSTRC(L"DJMEeGgYwW"); +const static CFX_WideStringC gs_wsConstChars = FX_WSTRC(L",-:/. "); +static FX_STRSIZE FX_Local_Find(FX_WSTR wsSymbols, FX_WCHAR ch, FX_STRSIZE nStart = 0) +{ + FX_STRSIZE nLength = wsSymbols.GetLength(); + if (nLength < 1 || nStart > nLength) { + return -1; + } + FX_LPCWSTR lpsz = (FX_LPCWSTR)FXSYS_wcschr(wsSymbols.GetPtr() + nStart, ch); + return (lpsz == NULL) ? -1 : (FX_STRSIZE)(lpsz - wsSymbols.GetPtr()); +} +const static FX_LPCWSTR gs_LocalNumberSymbols[] = { + (FX_LPCWSTR)L"decimal", (FX_LPCWSTR)L"grouping", (FX_LPCWSTR)L"percent", (FX_LPCWSTR)L"minus", (FX_LPCWSTR)L"zero", + (FX_LPCWSTR)L"currencySymbol", (FX_LPCWSTR)L"currencyName", +}; +IFX_Locale* IFX_Locale::Create(CXML_Element* pLocaleData) +{ + return FX_NEW CFX_Locale(pLocaleData); +} +CFX_Locale::CFX_Locale(CXML_Element* pLocaleData) +{ + m_pElement = pLocaleData; +} +CFX_Locale::~CFX_Locale() +{ +} +CFX_WideString CFX_Locale::GetName() +{ + return CFX_WideString(); +} +static CFX_WideString FX_GetXMLContent(FX_BSTR bsSpace, CXML_Element* pxmlElement, FX_BSTR bsTag, FX_WSTR wsName) +{ + CXML_Element* pDatePattern = NULL; + FX_INT32 nCount = pxmlElement->CountElements(bsSpace, bsTag); + FX_INT32 i = 0; + for (; i < nCount; i++) { + pDatePattern = pxmlElement->GetElement(bsSpace, bsTag, i); + if (pDatePattern->GetAttrValue(FX_BSTRC("name")) == wsName) { + break; + } + } + if (i < nCount && pDatePattern) { + return pDatePattern->GetContent(0); + } + return L""; +} +void CFX_Locale::GetNumbericSymbol(FX_LOCALENUMSYMBOL eType, CFX_WideString& wsNumSymbol) const +{ + if (!m_pElement) { + return; + } + CFX_ByteString bsSpace; + CFX_WideString wsName = gs_LocalNumberSymbols[eType]; + CXML_Element* pNumberSymbols = m_pElement->GetElement(bsSpace, FX_BSTRC("numberSymbols")); + if (!pNumberSymbols) { + return; + } + wsNumSymbol = FX_GetXMLContent(bsSpace, pNumberSymbols, FX_BSTRC("numberSymbol"), wsName); +} +void CFX_Locale::GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const +{ + if (!m_pElement) { + return; + } + CFX_ByteString bsSpace; + CXML_Element* pNumberSymbols = m_pElement->GetElement(bsSpace, FX_BSTRC("dateTimeSymbols")); + if (!pNumberSymbols) { + return; + } + wsDtSymbol = pNumberSymbols->GetContent(0); +} +static void FX_GetCalendarSymbol(CXML_Element* pXmlElement, const CFX_ByteString &symbol_type, FX_INT32 index, FX_BOOL bAbbr, CFX_WideString &wsName) +{ + CFX_ByteString bsSpace; + CFX_ByteString pstrSymbolNames = symbol_type + FX_BSTRC("Names"); + CXML_Element* pChild = pXmlElement->GetElement(bsSpace, FX_BSTRC("calendarSymbols")); + if (!pChild) { + return; + } + CXML_Element* pSymbolNames = pChild->GetElement(bsSpace, pstrSymbolNames); + if (!pSymbolNames) { + return; + } + if (pSymbolNames->GetAttrInteger(FX_BSTRC("abbr")) != bAbbr) { + pSymbolNames = pChild->GetElement(bsSpace, pstrSymbolNames, 1); + } + if (pSymbolNames && pSymbolNames->GetAttrInteger(FX_BSTRC("abbr")) == bAbbr) { + CXML_Element* pSymbolName = pSymbolNames->GetElement(bsSpace, symbol_type, index); + if (pSymbolName) { + wsName = pSymbolName->GetContent(0); + } + } +} +void CFX_Locale::GetMonthName(FX_INT32 nMonth, CFX_WideString& wsMonthName, FX_BOOL bAbbr ) const +{ + if (!m_pElement) { + return; + } + FX_GetCalendarSymbol(m_pElement, "month", nMonth, bAbbr, wsMonthName); +} +void CFX_Locale::GetDayName(FX_INT32 nWeek, CFX_WideString& wsDayName, FX_BOOL bAbbr ) const +{ + if (!m_pElement) { + return; + } + FX_GetCalendarSymbol(m_pElement, "day", nWeek, bAbbr, wsDayName); +} +void CFX_Locale::GetMeridiemName(CFX_WideString& wsMeridiemName, FX_BOOL bAM ) const +{ + if (!m_pElement) { + return; + } + FX_GetCalendarSymbol(m_pElement, "meridiem", bAM ? 0 : 1, FALSE, wsMeridiemName); +} +static FX_INT32 FX_ParseTimeZone(FX_LPCWSTR pStr, FX_INT32 iLen, FX_TIMEZONE& tz) +{ + tz.tzHour = 0; + tz.tzMinute = 0; + if (iLen < 0) { + return 0; + } + FX_INT32 iStart = 1; + FX_INT32 iEnd = iStart + 2; + while (iStart < iLen && iStart < iEnd) { + tz.tzHour = tz.tzHour * 10 + pStr[iStart++] - '0'; + } + if (iStart < iLen && pStr[iStart] == ':') { + iStart++; + } + iEnd = iStart + 2; + while (iStart < iLen && iStart < iEnd) { + tz.tzMinute = tz.tzMinute * 10 + pStr[iStart++] - '0'; + } + if (pStr[0] == '-') { + tz.tzHour = -tz.tzHour; + } + return iStart; +} +void CFX_Locale::GetTimeZone(FX_TIMEZONE& tz) const +{ + tz.tzHour = 0; + tz.tzMinute = 0; + if (!m_pElement) { + return; + } + CXML_Element* pxmlTimeZone = m_pElement->GetElement("", FX_BSTRC("timeZone")); + if (pxmlTimeZone) { + CFX_WideString wsTimeZone = pxmlTimeZone->GetContent(0); + FX_ParseTimeZone(wsTimeZone, wsTimeZone.GetLength(), tz); + } +} +void CFX_Locale::GetEraName(CFX_WideString& wsEraName, FX_BOOL bAD ) const +{ + if (!m_pElement) { + return; + } + FX_GetCalendarSymbol(m_pElement, "era", bAD ? 0 : 1, FALSE, wsEraName); +} +static void FX_GetPattern(CXML_Element* pXmlElement, const CFX_ByteString& bsCategory, const CFX_WideString& wsSubCategory, CFX_WideString& wsPattern) +{ + CFX_ByteString bsSpace; + CXML_Element* pDatePatterns = pXmlElement->GetElement(bsSpace, bsCategory + "s"); + if (!pDatePatterns) { + return; + } + wsPattern = FX_GetXMLContent(bsSpace, pDatePatterns, bsCategory, wsSubCategory); +} +static void FX_GetDateTimePattern(CXML_Element* pXmlElement, const CFX_ByteString& bsCategory, FX_LOCALEDATETIMESUBCATEGORY eType, CFX_WideString& wsPattern) +{ + CFX_WideString wsType = g_FXLocaleDateTimeSubCatData[eType].pName; + FX_GetPattern(pXmlElement, bsCategory, wsType, wsPattern); +} +void CFX_Locale::GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType, CFX_WideString& wsPattern) const +{ + if (!m_pElement) { + return; + } + FX_GetDateTimePattern(m_pElement, "datePattern", eType, wsPattern); +} +void CFX_Locale::GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType, CFX_WideString& wsPattern) const +{ + if (!m_pElement) { + return; + } + FX_GetDateTimePattern(m_pElement, "timePattern", eType, wsPattern); +} +void CFX_Locale::GetNumPattern(FX_LOCALENUMSUBCATEGORY eType, CFX_WideString& wsPattern) const +{ + CFX_WideString wsType = g_FXLocaleNumSubCatData[eType].pName; + FX_GetPattern(m_pElement, "numberPattern", wsType, wsPattern); +} +static FX_BOOL FX_IsDigit(FX_WCHAR c) +{ + return c >= '0' && c <= '9'; +} +static FX_BOOL FX_IsAlpha(FX_WCHAR c) +{ + return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); +} +static FX_BOOL FX_IsSpace(FX_WCHAR c) +{ + return (c == 0x20) || (c == 0x0d) || (c == 0x0a) || (c == 0x09); +} +static const FX_FLOAT gs_fraction_scales[] = {0.1f, 0.01f, 0.001f, 0.0001f, 0.00001f, 0.000001f, + 0.0000001f, 0.00000001f, 0.000000001f, 0.0000000001f, 0.00000000001f + }; +static const FX_INT32 gs_fraction_count = sizeof(gs_fraction_scales) / sizeof(FX_FLOAT); +class CFX_LCNumeric : public CFX_Object +{ +public: + CFX_LCNumeric(); + CFX_LCNumeric(FX_INT64 integral, FX_DWORD fractional = 0, FX_INT32 exponent = 0); + CFX_LCNumeric(FX_FLOAT dbRetValue); + CFX_LCNumeric(double dbvalue); + CFX_LCNumeric(CFX_WideString& wsNumeric); + + FX_FLOAT GetFloat() const; + double GetDouble() const; + CFX_WideString ToString() const; + CFX_WideString ToString(FX_INT32 nTreading, FX_BOOL bTrimTailZeros) const; + FX_INT64 m_Integral; + FX_DWORD m_Fractional; +#ifdef FX_NUM_DOUBLE + CFX_WideString m_wsValue; +#endif + FX_INT32 m_Exponent; +}; +static FX_BOOL FX_WStringToNumeric(const CFX_WideString& wsValue, CFX_LCNumeric& lcnum) +{ + FX_INT64 *pIntegral = &lcnum.m_Integral; + FX_DWORD *pFractional = &lcnum.m_Fractional; + FX_INT32 *pExponent = &lcnum.m_Exponent; + *pIntegral = 0; + *pFractional = 0; + *pExponent = 0; +#ifdef FX_NUM_DOUBLE + lcnum.m_wsValue.Empty(); +#endif + if (wsValue.IsEmpty()) { + return FALSE; + } + const FX_INT32 nIntegralMaxLen = 17; + FX_INT32 cc = 0; + FX_BOOL bNegative = FALSE, bExpSign = FALSE; + FX_LPCWSTR str = (FX_LPCWSTR)wsValue; + FX_INT32 len = wsValue.GetLength(); + while (cc < len && FX_IsSpace(str[cc])) { + cc++; + } + if (cc >= len) { + return FALSE; + } + if (str[cc] == '+') { + cc++; + } else if (str[cc] == '-') { + bNegative = TRUE; + cc++; + } + FX_INT32 nIntegralLen = 0; + while (cc < len) { + if (str[cc] == '.') { + break; + } + if (!FX_IsDigit(str[cc])) { + if ((str[cc] == 'E' || str[cc] == 'e')) { + break; + } else { + return FALSE; + } + } + if (nIntegralLen < nIntegralMaxLen) { + *pIntegral = *pIntegral * 10 + str[cc] - '0'; + nIntegralLen++; + } + cc ++; + } + *pIntegral = bNegative ? -*pIntegral : *pIntegral; + if (cc < len && str[cc] == '.') { + int scale = 0; + double fraction = 0.0; + cc ++; + while (cc < len) { + if (scale >= gs_fraction_count) { + while (cc < len) { + if (!FX_IsDigit(str[cc])) { + break; + } + cc++; + } + } + if (!FX_IsDigit(str[cc])) { + if ((str[cc] == 'E' || str[cc] == 'e')) { + break; + } else { + return FALSE; + } + } + fraction += gs_fraction_scales[scale] * (str[cc] - '0'); + scale ++; + cc ++; + } + *pFractional = (FX_DWORD)(fraction * 4294967296.0); + } + if (cc < len && (str[cc] == 'E' || str[cc] == 'e')) { + cc ++; + if (cc < len) { + if (str[cc] == '+') { + cc++; + } else if (str[cc] == '-') { + bExpSign = TRUE; + cc++; + } + } + while (cc < len) { + if (FX_IsDigit(str[cc])) { + return FALSE; + } + *pExponent = *pExponent * 10 + str[cc] - '0'; + cc ++; + } + *pExponent = bExpSign ? -*pExponent : *pExponent; + } +#ifdef FX_NUM_DOUBLE + else { + lcnum.m_wsValue = wsValue; + } +#endif + return TRUE; +} +CFX_LCNumeric::CFX_LCNumeric() +{ + m_Integral = 0; + m_Fractional = 0; + m_Exponent = 0; +} +CFX_LCNumeric::CFX_LCNumeric(FX_INT64 integral, FX_DWORD fractional , FX_INT32 exponent ) +{ + m_Integral = integral; + m_Fractional = fractional; + m_Exponent = exponent; +} +CFX_LCNumeric::CFX_LCNumeric(FX_FLOAT dbRetValue) +{ + m_Integral = (FX_INT64)dbRetValue; + m_Fractional = (FX_DWORD)(((dbRetValue > 0) ? (dbRetValue - m_Integral) : (m_Integral - dbRetValue)) * 4294967296); + m_Exponent = 0; +} +CFX_LCNumeric::CFX_LCNumeric(double dbvalue) +{ + m_Integral = (FX_INT64)dbvalue; + m_Fractional = (FX_DWORD)(((dbvalue > 0) ? (dbvalue - m_Integral) : (m_Integral - dbvalue)) * 4294967296); + m_Exponent = 0; +} +CFX_LCNumeric::CFX_LCNumeric(CFX_WideString& wsNumeric) +{ + FX_WStringToNumeric(wsNumeric, *this); +} +FX_FLOAT CFX_LCNumeric::GetFloat() const +{ + FX_FLOAT dbRetValue = m_Fractional / 4294967296.0f; + dbRetValue = m_Integral + (m_Integral >= 0 ? dbRetValue : -dbRetValue); + if (m_Exponent != 0) { + dbRetValue *= FXSYS_pow(10, (FX_FLOAT)m_Exponent); + } + return dbRetValue; +} +double CFX_LCNumeric::GetDouble() const +{ + double value = m_Fractional / 4294967296.0; + value = m_Integral + (m_Integral >= 0 ? value : -value); + if (m_Exponent != 0) { + value *= FXSYS_pow(10, (FX_FLOAT)m_Exponent); + } + return value; +} +CFX_WideString CFX_LCNumeric::ToString() const +{ + return ToString(8, TRUE); +} +CFX_WideString CFX_LCNumeric::ToString(FX_INT32 nTreading, FX_BOOL bTrimTailZeros) const +{ +#ifdef FX_NUM_DOUBLE + CFX_WideString wsResult; + if (!m_wsValue.IsEmpty()) { + const FX_INT32 nIntegralMaxLen = 17; + FX_INT32 cc = 0; + FX_BOOL bNegative = FALSE, bExpSign = FALSE; + FX_LPCWSTR str = (FX_LPCWSTR)m_wsValue; + FX_INT32 len = m_wsValue.GetLength(); + while (cc < len && FX_IsSpace(str[cc])) { + cc++; + } + if (cc >= len) { + return wsResult; + } + if (str[cc] == '+') { + cc++; + } else if (str[cc] == '-') { + bNegative = TRUE; + cc++; + } + FX_INT32 nIntegralLen = 0; + while (cc < len) { + if (str[cc] == '.') { + break; + } + if (!FX_IsDigit(str[cc])) { + if ((str[cc] == 'E' || str[cc] == 'e')) { + break; + } else { + return wsResult; + } + } + if (nIntegralLen < nIntegralMaxLen) { + *pIntegral = *pIntegral * 10 + str[cc] - '0'; + nIntegralLen++; + } + cc ++; + } + *pIntegral = bNegative ? -*pIntegral : *pIntegral; + if (cc < len && str[cc] == '.') { + int scale = 0; + double fraction = 0.0; + cc ++; + while (cc < len) { + if (scale >= gs_fraction_count) { + while (cc < len) { + if (!FX_IsDigit(str[cc])) { + break; + } + cc++; + } + } + if (!FX_IsDigit(str[cc])) { + if ((str[cc] == 'E' || str[cc] == 'e')) { + break; + } else { + return FALSE; + } + } + fraction += gs_fraction_scales[scale] * (str[cc] - '0'); + scale ++; + cc ++; + } + *pFractional = (FX_DWORD)(fraction * 4294967296.0); + } + } + double dbValeu = GetDouble(); + FX_INT64 iInte = (FX_INT64)dbValeu; + wsResult.Format((FX_LPCWSTR)L"%l", (FX_INT64)iInte); + if (m_Fractional) { + CFX_WideString wsFormat; + wsFormat.Format((FX_LPCWSTR)L"%%.%dG", nTreading); + double dblMantissa = (dbValeu > 0) ? (dbValeu - iInte) : (iInte - dbValeu); + CFX_WideString wsFrac; + wsFrac.Format((FX_LPCWSTR)wsFormat, dblMantissa); + wsResult += CFX_WideStringC((FX_LPCWSTR)wsFrac + 1, wsFrac.GetLength() - 1); + if (bTrimTailZeros && nTreading > 0) { + wsResult.TrimRight(L"0"); + wsResult.TrimRight(L"."); + } + } +#endif + CFX_WideString wsFormat; + wsFormat.Format((FX_LPCWSTR)L"%%.%df", nTreading); + CFX_WideString wsResult; + wsResult.Format(FX_LPCWSTR(wsFormat), GetDouble()); + if (bTrimTailZeros && nTreading > 0) { + wsResult.TrimRight(L"0"); + wsResult.TrimRight(L"."); + } + return wsResult; +} +IFX_FormatString* IFX_FormatString::Create(IFX_LocaleMgr* pLocaleMgr, FX_BOOL bUseLCID) +{ + if (!pLocaleMgr) { + return NULL; + } + return FX_NEW CFX_FormatString(pLocaleMgr, bUseLCID); +} +CFX_FormatString::CFX_FormatString(IFX_LocaleMgr* pLocaleMgr, FX_BOOL bUseLCID) + : m_pLocaleMgr(pLocaleMgr) + , m_bUseLCID(bUseLCID) +{ +} +CFX_FormatString::~CFX_FormatString() +{ +} +void CFX_FormatString::SplitFormatString(const CFX_WideString& wsFormatString, CFX_WideStringArray& wsPatterns) +{ + FX_INT32 iStrLen = wsFormatString.GetLength(); + FX_LPCWSTR pStr = (FX_LPCWSTR)wsFormatString; + FX_LPCWSTR pToken = pStr; + FX_LPCWSTR pEnd = pStr + iStrLen; + FX_BOOL iQuote = FALSE; + while (TRUE) { + if (pStr >= pEnd) { + CFX_WideString sub(pToken, pStr - pToken); + wsPatterns.Add(sub); + return; + } else if (*pStr == '\'') { + iQuote = !iQuote; + } else if (*pStr == L'|' && !iQuote) { + CFX_WideString sub(pToken, pStr - pToken); + wsPatterns.Add(sub); + pToken = pStr + 1; + } + pStr ++; + } +} +static CFX_WideString FX_GetLiteralText(FX_LPCWSTR pStrPattern, FX_INT32 &iPattern, FX_INT32 iLenPattern) +{ + CFX_WideString wsOutput; + if (pStrPattern[iPattern] != '\'') { + return wsOutput; + } + iPattern++; + FX_INT32 iQuote = 1; + while (iPattern < iLenPattern) { + if (pStrPattern[iPattern] == '\'') { + iQuote++; + if ((iPattern + 1 >= iLenPattern) || ((pStrPattern[iPattern + 1] != '\'') && (iQuote % 2 == 0))) { + break; + } else { + iQuote++; + } + iPattern++; + } else if (pStrPattern[iPattern] == '\\' && (iPattern + 1 < iLenPattern) && pStrPattern[iPattern + 1] == 'u') { + FX_INT32 iKeyValue = 0; + iPattern += 2; + FX_INT32 i = 0; + while (iPattern < iLenPattern && i++ < 4) { + FX_WCHAR ch = pStrPattern[iPattern++]; + if ((ch >= '0' && ch <= '9')) { + iKeyValue = iKeyValue * 16 + ch - '0'; + } else if ((ch >= 'a' && ch <= 'f')) { + iKeyValue = iKeyValue * 16 + ch - 'a' + 10; + } else if ((ch >= 'A' && ch <= 'F')) { + iKeyValue = iKeyValue * 16 + ch - 'A' + 10; + } + } + if (iKeyValue != 0) { + wsOutput += (FX_WCHAR)(iKeyValue & 0x0000FFFF); + } + continue; + } + wsOutput += pStrPattern[iPattern++]; + } + return wsOutput; +} +static CFX_WideString FX_GetLiteralTextReverse(FX_LPCWSTR pStrPattern, FX_INT32 &iPattern) +{ + CFX_WideString wsOutput; + if (pStrPattern[iPattern] != '\'') { + return wsOutput; + } + iPattern--; + FX_INT32 iQuote = 1; + while (iPattern >= 0) { + if (pStrPattern[iPattern] == '\'') { + iQuote++; + if (iPattern - 1 >= 0 || ((pStrPattern[iPattern - 1] != '\'') && (iQuote % 2 == 0))) { + break; + } else { + iQuote++; + } + iPattern--; + } else if (pStrPattern[iPattern] == '\\' && pStrPattern[iPattern + 1] == 'u') { + iPattern--; + FX_INT32 iKeyValue = 0; + FX_INT32 iLen = wsOutput.GetLength(); + FX_INT32 i = 1; + for (; i < iLen && i < 5; i++) { + FX_WCHAR ch = wsOutput[i]; + if ((ch >= '0' && ch <= '9')) { + iKeyValue = iKeyValue * 16 + ch - '0'; + } else if ((ch >= 'a' && ch <= 'f')) { + iKeyValue = iKeyValue * 16 + ch - 'a' + 10; + } else if ((ch >= 'A' && ch <= 'F')) { + iKeyValue = iKeyValue * 16 + ch - 'A' + 10; + } + } + if (iKeyValue != 0) { + wsOutput.Delete(0, i); + wsOutput = (FX_WCHAR)(iKeyValue & 0x0000FFFF) + wsOutput; + } + continue; + } + wsOutput = pStrPattern[iPattern--] + wsOutput; + } + return wsOutput; +} +FX_LOCALECATEGORY CFX_FormatString::GetCategory(const CFX_WideString& wsPattern) +{ + FX_LOCALECATEGORY eCategory = FX_LOCALECATEGORY_Unknown; + FX_INT32 ccf = 0; + FX_INT32 iLenf = wsPattern.GetLength(); + FX_LPCWSTR pStr = (FX_LPCWSTR)wsPattern; + FX_BOOL bBraceOpen = FALSE; + while (ccf < iLenf) { + if (pStr[ccf] == '\'') { + FX_GetLiteralText(pStr, ccf, iLenf); + } else if (!bBraceOpen && FX_Local_Find(gs_wsConstChars, pStr[ccf]) < 0) { + CFX_WideString wsCategory(pStr[ccf]); + ccf++; + while (TRUE) { + if (ccf == iLenf) { + return eCategory; + } + if ( pStr[ccf] == '.' || pStr[ccf] == '(') { + break; + } + if (pStr[ccf] == '{') { + bBraceOpen = TRUE; + break; + } + wsCategory += pStr[ccf]; + ccf++; + } + FX_DWORD dwHash = FX_HashCode_String_GetW(wsCategory, wsCategory.GetLength()); + if (dwHash == FX_LOCALECATEGORY_DateHash) { + if (eCategory == FX_LOCALECATEGORY_Time) { + return FX_LOCALECATEGORY_DateTime; + } + eCategory = FX_LOCALECATEGORY_Date; + } else if (dwHash == FX_LOCALECATEGORY_TimeHash) { + if (eCategory == FX_LOCALECATEGORY_Date) { + return FX_LOCALECATEGORY_DateTime; + } + eCategory = FX_LOCALECATEGORY_Time; + } else if (dwHash == FX_LOCALECATEGORY_DateTimeHash) { + return FX_LOCALECATEGORY_DateTime; + } else if (dwHash == FX_LOCALECATEGORY_TextHash) { + return FX_LOCALECATEGORY_Text; + } else if (dwHash == FX_LOCALECATEGORY_NumHash) { + return FX_LOCALECATEGORY_Num; + } else if (dwHash == FX_LOCALECATEGORY_ZeroHash) { + return FX_LOCALECATEGORY_Zero; + } else if (dwHash == FX_LOCALECATEGORY_NullHash) { + return FX_LOCALECATEGORY_Null; + } + } else if (pStr[ccf] == '}') { + bBraceOpen = FALSE; + } + ccf++; + } + return eCategory; +} +static FX_WORD FX_WStringToLCID(FX_LPCWSTR pstrLCID) +{ + if (!pstrLCID) { + return 0; + } + wchar_t* pEnd; + return (FX_WORD)wcstol((wchar_t*)pstrLCID, &pEnd, 16); +} +FX_WORD CFX_FormatString::GetLCID(const CFX_WideString& wsPattern) +{ + return FX_WStringToLCID(GetLocaleName(wsPattern)); +} +CFX_WideString CFX_FormatString::GetLocaleName(const CFX_WideString& wsPattern) +{ + FX_INT32 ccf = 0; + FX_INT32 iLenf = wsPattern.GetLength(); + FX_LPCWSTR pStr = (FX_LPCWSTR)wsPattern; + while (ccf < iLenf) { + if (pStr[ccf] == '\'') { + FX_GetLiteralText(pStr, ccf, iLenf); + } else if (pStr[ccf] == '(') { + ccf++; + CFX_WideString wsLCID; + while (ccf < iLenf && pStr[ccf] != ')') { + wsLCID += pStr[ccf++]; + } + return wsLCID; + } + ccf++; + } + return CFX_WideString(); +} +IFX_Locale* CFX_FormatString::GetTextFormat(const CFX_WideString &wsPattern, FX_WSTR wsCategory, CFX_WideString& wsPurgePattern) +{ + IFX_Locale* pLocale = NULL; + FX_INT32 ccf = 0; + FX_INT32 iLenf = wsPattern.GetLength(); + FX_LPCWSTR pStr = (FX_LPCWSTR)wsPattern; + FX_BOOL bBrackOpen = FALSE; + while (ccf < iLenf) { + if (pStr[ccf] == '\'') { + FX_INT32 iCurChar = ccf; + FX_GetLiteralText(pStr, ccf, iLenf); + wsPurgePattern += CFX_WideStringC(pStr + iCurChar, ccf - iCurChar + 1); + } else if (!bBrackOpen && FX_Local_Find(gs_wsConstChars, pStr[ccf]) < 0) { + CFX_WideString wsSearchCategory(pStr[ccf]); + ccf++; + while (ccf < iLenf && pStr[ccf] != '{' && pStr[ccf] != '.' && pStr[ccf] != '(') { + wsSearchCategory += pStr[ccf]; + ccf++; + } + if (wsSearchCategory != wsCategory) { + continue; + } + while (ccf < iLenf) { + if (pStr[ccf] == '(') { + ccf++; + CFX_WideString wsLCID; + while (ccf < iLenf && pStr[ccf] != ')') { + wsLCID += pStr[ccf++]; + } + pLocale = GetPatternLocale(wsLCID); + } else if (pStr[ccf] == '{') { + bBrackOpen = TRUE; + break; + } + ccf++; + } + } else if (pStr[ccf] != '}') { + wsPurgePattern += pStr[ccf]; + } + ccf++; + } + if (!bBrackOpen) { + wsPurgePattern = wsPattern; + } + if (!pLocale) { + pLocale = m_pLocaleMgr->GetDefLocale(); + } + return pLocale; +} +#define FX_NUMSTYLE_Percent 0x01 +#define FX_NUMSTYLE_Exponent 0x02 +#define FX_NUMSTYLE_DotVorv 0x04 +IFX_Locale* CFX_FormatString::GetNumericFormat(const CFX_WideString& wsPattern, FX_INT32& iDotIndex, FX_DWORD& dwStyle, CFX_WideString& wsPurgePattern) +{ + dwStyle = 0; + IFX_Locale* pLocale = NULL; + FX_INT32 ccf = 0; + FX_INT32 iLenf = wsPattern.GetLength(); + FX_LPCWSTR pStr = (FX_LPCWSTR)wsPattern; + FX_BOOL bFindDot = FALSE; + FX_BOOL bBrackOpen = FALSE; + while (ccf < iLenf) { + if (pStr[ccf] == '\'') { + FX_INT32 iCurChar = ccf; + FX_GetLiteralText(pStr, ccf, iLenf); + wsPurgePattern += CFX_WideStringC(pStr + iCurChar, ccf - iCurChar + 1); + } else if (!bBrackOpen && FX_Local_Find(gs_wsConstChars, pStr[ccf]) < 0) { + CFX_WideString wsCategory(pStr[ccf]); + ccf++; + while (ccf < iLenf && pStr[ccf] != '{' && pStr[ccf] != '.' && pStr[ccf] != '(') { + wsCategory += pStr[ccf]; + ccf++; + } + if (wsCategory != FX_WSTRC(L"num")) { + bBrackOpen = TRUE; + ccf = 0; + continue; + } + while (ccf < iLenf) { + if (pStr[ccf] == '(') { + ccf++; + CFX_WideString wsLCID; + while (ccf < iLenf && pStr[ccf] != ')') { + wsLCID += pStr[ccf++]; + } + pLocale = GetPatternLocale(wsLCID); + } else if (pStr[ccf] == '{') { + bBrackOpen = TRUE; + break; + } else if (pStr[ccf] == '.') { + CFX_WideString wsSubCategory; + ccf++; + while (ccf < iLenf && pStr[ccf] != '(' && pStr[ccf] != '{') { + wsSubCategory += pStr[ccf++]; + } + FX_DWORD dwSubHash = FX_HashCode_String_GetW(wsSubCategory, wsSubCategory.GetLength()); + FX_LOCALENUMSUBCATEGORY eSubCategory = FX_LOCALENUMPATTERN_Decimal; + for (FX_INT32 i = 0; i < g_iFXLocaleNumSubCatCount; i++) { + if (g_FXLocaleNumSubCatData[i].uHash == dwSubHash) { + eSubCategory = (FX_LOCALENUMSUBCATEGORY)g_FXLocaleNumSubCatData[i].eSubCategory; + break; + } + } + wsSubCategory.Empty(); + if (!pLocale) { + pLocale = m_pLocaleMgr->GetDefLocale(); + } + FXSYS_assert(pLocale != NULL); + pLocale->GetNumPattern(eSubCategory, wsSubCategory); + iDotIndex = wsSubCategory.Find('.'); + if (iDotIndex > 0) { + iDotIndex += wsPurgePattern.GetLength() ; + bFindDot = TRUE; + dwStyle |= FX_NUMSTYLE_DotVorv; + } + wsPurgePattern += wsSubCategory; + if (eSubCategory == FX_LOCALENUMPATTERN_Percent) { + dwStyle |= FX_NUMSTYLE_Percent; + } + continue; + } + ccf++; + } + } else if (pStr[ccf] == 'E') { + dwStyle |= FX_NUMSTYLE_Exponent; + wsPurgePattern += pStr[ccf]; + } else if (pStr[ccf] == '%') { + dwStyle |= FX_NUMSTYLE_Percent; + wsPurgePattern += pStr[ccf]; + } else if (pStr[ccf] != '}') { + wsPurgePattern += pStr[ccf]; + } + if (!bFindDot) { + if (pStr[ccf] == '.' || pStr[ccf] == 'V' || pStr[ccf] == 'v') { + bFindDot = TRUE; + iDotIndex = wsPurgePattern.GetLength() - 1; + dwStyle |= FX_NUMSTYLE_DotVorv; + } + } + ccf++; + } + if (!bFindDot) { + iDotIndex = wsPurgePattern.GetLength(); + } + if (!pLocale) { + pLocale = m_pLocaleMgr->GetDefLocale(); + } + return pLocale; +} +static FX_BOOL FX_GetNumericDotIndex(const CFX_WideString& wsNum, const CFX_WideString& wsDotSymbol, FX_INT32 &iDotIndex) +{ + FX_INT32 ccf = 0; + FX_INT32 iLenf = wsNum.GetLength(); + FX_LPCWSTR pStr = (FX_LPCWSTR)wsNum; + FX_INT32 iLenDot = wsDotSymbol.GetLength(); + while (ccf < iLenf) { + if (pStr[ccf] == '\'') { + FX_GetLiteralText(pStr, ccf, iLenf); + } else if (ccf + iLenDot <= iLenf && !FXSYS_wcsncmp(pStr + ccf, (FX_LPCWSTR)wsDotSymbol, iLenDot)) { + iDotIndex = ccf; + return TRUE; + } + ccf++; + } + iDotIndex = wsNum.Find('.'); + if (iDotIndex < 0) { + iDotIndex = iLenf; + return FALSE; + } + return TRUE; +} +FX_BOOL CFX_FormatString::ParseText(const CFX_WideString& wsSrcText, const CFX_WideString& wsPattern, CFX_WideString& wsValue) +{ + wsValue.Empty(); + if (wsSrcText.IsEmpty() || wsPattern.IsEmpty()) { + return FALSE; + } + CFX_WideString wsTextFormat; + IFX_Locale* pLocale = GetTextFormat(wsPattern, FX_WSTRC(L"text"), wsTextFormat); + if (wsTextFormat.IsEmpty()) { + return FALSE; + } + FX_INT32 iText = 0, iPattern = 0; + FX_LPCWSTR pStrText = (FX_LPCWSTR)wsSrcText; + FX_INT32 iLenText = wsSrcText.GetLength(); + FX_LPCWSTR pStrPattern = (FX_LPCWSTR)wsTextFormat; + FX_INT32 iLenPattern = wsTextFormat.GetLength(); + while (iPattern < iLenPattern && iText < iLenText) { + switch (pStrPattern[iPattern]) { + case '\'': { + CFX_WideString wsLiteral = FX_GetLiteralText(pStrPattern, iPattern, iLenPattern); + FX_INT32 iLiteralLen = wsLiteral.GetLength(); + if (iText + iLiteralLen > iLenText || FXSYS_wcsncmp(pStrText + iText, (FX_LPCWSTR)wsLiteral, iLiteralLen)) { + wsValue = wsSrcText; + return FALSE; + } + iText += iLiteralLen; + iPattern++; + break; + } + case 'A': + if (FX_IsAlpha(pStrText[iText])) { + wsValue += pStrText[iText]; + iText++; + } + iPattern++; + break; + case 'X': + wsValue += pStrText[iText]; + iText++; + iPattern++; + break; + case 'O': + case '0': + if (FX_IsDigit(pStrText[iText]) || FX_IsAlpha(pStrText[iText])) { + wsValue += pStrText[iText]; + iText++; + } + iPattern++; + break; + case '9': + if (FX_IsDigit(pStrText[iText])) { + wsValue += pStrText[iText]; + iText++; + } + iPattern++; + break; + default: + if (pStrPattern[iPattern] != pStrText[iText]) { + wsValue = wsSrcText; + return FALSE; + } + iPattern++; + iText++; + break; + } + } + return iPattern == iLenPattern && iText == iLenText; +} +FX_BOOL CFX_FormatString::ParseNum(const CFX_WideString& wsSrcNum, const CFX_WideString& wsPattern, FX_FLOAT &fValue) +{ + fValue = 0.0f; + if (wsSrcNum.IsEmpty() || wsPattern.IsEmpty()) { + return FALSE; + } + FX_INT32 dot_index_f = -1; + FX_DWORD dwFormatStyle = 0; + CFX_WideString wsNumFormat; + IFX_Locale* pLocale = GetNumericFormat(wsPattern, dot_index_f, dwFormatStyle, wsNumFormat); + if (!pLocale || wsNumFormat.IsEmpty()) { + return FALSE; + } + FX_INT32 iExponent = 0; + CFX_WideString wsDotSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsDotSymbol); + FX_INT32 iDotLen = wsDotSymbol.GetLength(); + CFX_WideString wsGroupSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Grouping, wsGroupSymbol); + FX_INT32 iGroupLen = wsGroupSymbol.GetLength(); + CFX_WideString wsMinus; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinus); + FX_INT32 iMinusLen = wsMinus.GetLength(); + int cc = 0, ccf = 0; + FX_LPCWSTR str = (FX_LPCWSTR)wsSrcNum; + int len = wsSrcNum.GetLength(); + FX_LPCWSTR strf = (FX_LPCWSTR)wsNumFormat; + int lenf = wsNumFormat.GetLength(); + double dbRetValue = 0; + double coeff = 1; + FX_BOOL bHavePercentSymbol = FALSE; + FX_BOOL bNeg = FALSE; + FX_BOOL bReverseParse = FALSE; + FX_INT32 dot_index = 0; + if (!FX_GetNumericDotIndex(wsSrcNum, wsDotSymbol, dot_index) && (dwFormatStyle & FX_NUMSTYLE_DotVorv)) { + bReverseParse = TRUE; + } + bReverseParse = FALSE; + if (bReverseParse) { + ccf = lenf - 1; + cc = len - 1; + while (ccf > dot_index_f && cc >= 0) { + switch (strf[ccf]) { + case '\'': { + CFX_WideString wsLiteral = FX_GetLiteralTextReverse(strf, ccf); + FX_INT32 iLiteralLen = wsLiteral.GetLength(); + cc -= iLiteralLen - 1; + if (cc < 0 || FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsLiteral, iLiteralLen)) { + return FALSE; + } + cc--; + ccf--; + break; + } + case '9': + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + dbRetValue = dbRetValue * coeff + (str[cc] - '0') * 0.1; + coeff *= 0.1; + cc--; + ccf--; + break; + case 'z': + if (cc >= 0) { + dbRetValue = dbRetValue * coeff + (str[cc] - '0') * 0.1; + coeff *= 0.1; + cc--; + } + ccf--; + break; + case 'Z': + if (str[cc] != ' ') { + dbRetValue = dbRetValue * coeff + (str[cc] - '0') * 0.1; + coeff *= 0.1; + } + cc--; + ccf--; + break; + case 'S': + if (str[cc] == '+' || str[cc] == ' ') { + cc--; + } else { + cc -= iMinusLen - 1; + if (cc < 0 || FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsMinus, iMinusLen)) { + return FALSE; + } + cc--; + bNeg = TRUE; + } + ccf--; + break; + case 's': + if (str[cc] == '+') { + cc--; + } else { + cc -= iMinusLen - 1; + if (cc < 0 || FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsMinus, iMinusLen)) { + return FALSE; + } + cc--; + bNeg = TRUE; + } + ccf--; + break; + case 'E': { + if (cc >= dot_index) { + return FALSE; + } + FX_BOOL bExpSign = FALSE; + while (cc >= 0) { + if (str[cc] == 'E' || str[cc] == 'e') { + break; + } + if (FX_IsDigit(str[cc])) { + iExponent = iExponent + (str[cc] - '0') * 10; + cc--; + continue; + } else if (str[cc] == '+') { + cc--; + continue; + } else if (cc - iMinusLen + 1 > 0 && !FXSYS_wcsncmp(str + (cc - iMinusLen + 1), (FX_LPCWSTR)wsMinus, iMinusLen)) { + bExpSign = TRUE; + cc -= iMinusLen; + } else { + return FALSE; + } + } + cc --; + iExponent = bExpSign ? -iExponent : iExponent; + ccf--; + } + break; + case '$': { + CFX_WideString wsSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol, wsSymbol); + FX_INT32 iSymbolLen = wsSymbol.GetLength(); + cc -= iSymbolLen - 1; + if (cc < 0 || FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsSymbol, iSymbolLen)) { + return FALSE; + } + cc--; + ccf--; + } + break; + case 'r': + if (ccf - 1 >= 0 && strf[ccf - 1] == 'c') { + if (str[cc] == 'R' && cc - 1 >= 0 && str[cc - 1] == 'C') { + bNeg = TRUE; + cc -= 2; + } + ccf -= 2; + } else { + ccf --; + } + break; + case 'R': + if (ccf - 1 >= 0 && strf[ccf - 1] == 'C') { + if (str[cc] == ' ') { + cc++; + } else if (str[cc] == 'R' && cc - 1 >= 0 && str[cc - 1] == 'C') { + bNeg = TRUE; + cc -= 2; + } + ccf -= 2; + } else { + ccf--; + } + break; + case 'b': + if (ccf - 1 >= 0 && strf[ccf - 1] == 'd') { + if (str[cc] == 'B' && cc - 1 >= 0 && str[cc - 1] == 'D') { + bNeg = TRUE; + cc -= 2; + } + ccf -= 2; + } else { + ccf --; + } + break; + case 'B': + if (ccf - 1 >= 0 && strf[ccf - 1] == 'D') { + if (str[cc] == ' ') { + cc++; + } else if (str[cc] == 'B' && cc - 1 >= 0 && str[cc - 1] == 'D') { + bNeg = TRUE; + cc -= 2; + } + ccf -= 2; + } else { + ccf--; + } + break; + case '.': + case 'V': + case 'v': + return FALSE; + case '%': { + CFX_WideString wsSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent, wsSymbol); + FX_INT32 iSysmbolLen = wsSymbol.GetLength(); + cc -= iSysmbolLen - 1; + if (cc < 0 || FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsSymbol, iSysmbolLen)) { + return FALSE; + } + cc--; + ccf--; + bHavePercentSymbol = TRUE; + } + break; + case '8': + while (ccf < lenf && strf[ccf] == '8') { + ccf++; + } + while (cc < len && FX_IsDigit(str[cc])) { + dbRetValue = (str[cc] - '0') * coeff + dbRetValue; + coeff *= 0.1; + cc++; + } + break; + case ',': { + if (cc >= 0) { + cc -= iGroupLen - 1; + if (cc >= 0 && FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsGroupSymbol, iGroupLen) == 0) { + cc--; + } else { + cc += iGroupLen - 1; + } + } + ccf--; + } + break; + case '(': + if (str[cc] == L'(') { + bNeg = TRUE; + } else if (str[cc] != L' ') { + return FALSE; + } + cc--; + ccf--; + break; + case ')': + if (str[cc] == L')') { + bNeg = TRUE; + } else if (str[cc] != L' ') { + return FALSE; + } + cc--; + ccf--; + break; + default: + if (strf[ccf] != str[cc]) { + return FALSE; + } + cc--; + ccf--; + } + } + dot_index = cc + 1; + } + ccf = dot_index_f - 1; + cc = dot_index - 1; + coeff = 1; + while (ccf >= 0 && cc >= 0) { + switch (strf[ccf]) { + case '\'': { + CFX_WideString wsLiteral = FX_GetLiteralTextReverse(strf, ccf); + FX_INT32 iLiteralLen = wsLiteral.GetLength(); + cc -= iLiteralLen - 1; + if (cc < 0 || FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsLiteral, iLiteralLen)) { + return FALSE; + } + cc--; + ccf--; + break; + } + case '9': + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + dbRetValue = dbRetValue + (str[cc] - '0') * coeff; + coeff *= 10; + cc--; + ccf--; + break; + case 'z': + if (FX_IsDigit(str[cc])) { + dbRetValue = dbRetValue + (str[cc] - '0') * coeff; + coeff *= 10; + cc--; + } + ccf--; + break; + case 'Z': + if (str[cc] != ' ') { + if (FX_IsDigit(str[cc])) { + dbRetValue = dbRetValue + (str[cc] - '0') * coeff; + coeff *= 10; + cc--; + } + } else { + cc--; + } + ccf--; + break; + case 'S': + if (str[cc] == '+' || str[cc] == ' ') { + cc--; + } else { + cc -= iMinusLen - 1; + if (cc < 0 || FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsMinus, iMinusLen)) { + return FALSE; + } + cc--; + bNeg = TRUE; + } + ccf--; + break; + case 's': + if (str[cc] == '+') { + cc--; + } else { + cc -= iMinusLen - 1; + if (cc < 0 || FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsMinus, iMinusLen)) { + return FALSE; + } + cc--; + bNeg = TRUE; + } + ccf--; + break; + case 'E': { + if (cc >= dot_index) { + return FALSE; + } + FX_BOOL bExpSign = FALSE; + while (cc >= 0) { + if (str[cc] == 'E' || str[cc] == 'e') { + break; + } + if (FX_IsDigit(str[cc])) { + iExponent = iExponent + (str[cc] - '0') * 10; + cc--; + continue; + } else if (str[cc] == '+') { + cc--; + continue; + } else if (cc - iMinusLen + 1 > 0 && !FXSYS_wcsncmp(str + (cc - iMinusLen + 1), (FX_LPCWSTR)wsMinus, iMinusLen)) { + bExpSign = TRUE; + cc -= iMinusLen; + } else { + return FALSE; + } + } + cc --; + iExponent = bExpSign ? -iExponent : iExponent; + ccf--; + } + break; + case '$': { + CFX_WideString wsSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol, wsSymbol); + FX_INT32 iSymbolLen = wsSymbol.GetLength(); + cc -= iSymbolLen - 1; + if (cc < 0 || FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsSymbol, iSymbolLen)) { + return FALSE; + } + cc--; + ccf--; + } + break; + case 'r': + if (ccf - 1 >= 0 && strf[ccf - 1] == 'c') { + if (str[cc] == 'R' && cc - 1 >= 0 && str[cc - 1] == 'C') { + bNeg = TRUE; + cc -= 2; + } + ccf -= 2; + } else { + ccf --; + } + break; + case 'R': + if (ccf - 1 >= 0 && strf[ccf - 1] == 'C') { + if (str[cc] == ' ') { + cc++; + } else if (str[cc] == 'R' && cc - 1 >= 0 && str[cc - 1] == 'C') { + bNeg = TRUE; + cc -= 2; + } + ccf -= 2; + } else { + ccf--; + } + break; + case 'b': + if (ccf - 1 >= 0 && strf[ccf - 1] == 'd') { + if (str[cc] == 'B' && cc - 1 >= 0 && str[cc - 1] == 'D') { + bNeg = TRUE; + cc -= 2; + } + ccf -= 2; + } else { + ccf --; + } + break; + case 'B': + if (ccf - 1 >= 0 && strf[ccf - 1] == 'D') { + if (str[cc] == ' ') { + cc++; + } else if (str[cc] == 'B' && cc - 1 >= 0 && str[cc - 1] == 'D') { + bNeg = TRUE; + cc -= 2; + } + ccf -= 2; + } else { + ccf--; + } + break; + case '.': + case 'V': + case 'v': + return FALSE; + case '%': { + CFX_WideString wsSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent, wsSymbol); + FX_INT32 iSysmbolLen = wsSymbol.GetLength(); + cc -= iSysmbolLen - 1; + if (cc < 0 || FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsSymbol, iSysmbolLen)) { + return FALSE; + } + cc--; + ccf--; + bHavePercentSymbol = TRUE; + } + break; + case '8': + return FALSE; + case ',': { + if (cc >= 0) { + cc -= iGroupLen - 1; + if (cc >= 0 && FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsGroupSymbol, iGroupLen) == 0) { + cc--; + } else { + cc += iGroupLen - 1; + } + } + ccf--; + } + break; + case '(': + if (str[cc] == L'(') { + bNeg = TRUE; + } else if (str[cc] != L' ') { + return FALSE; + } + cc--; + ccf--; + break; + case ')': + if (str[cc] == L')') { + bNeg = TRUE; + } else if (str[cc] != L' ') { + return FALSE; + } + cc--; + ccf--; + break; + default: + if (strf[ccf] != str[cc]) { + return FALSE; + } + cc--; + ccf--; + } + } + if (cc >= 0) { + return FALSE; + } + if (!bReverseParse) { + ccf = dot_index_f + 1; + cc = (dot_index == len) ? len : dot_index + 1; + coeff = 0.1; + while (cc < len && ccf < lenf) { + switch (strf[ccf]) { + case '\'': { + CFX_WideString wsLiteral = FX_GetLiteralText(strf, ccf, lenf); + FX_INT32 iLiteralLen = wsLiteral.GetLength(); + if (cc + iLiteralLen > len || FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsLiteral, iLiteralLen)) { + return FALSE; + } + cc += iLiteralLen; + ccf++; + break; + } + case '9': + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + { + dbRetValue = dbRetValue + (str[cc] - '0') * coeff; + coeff *= 0.1; + } + cc++; + ccf++; + break; + case 'z': + if (FX_IsDigit(str[cc])) { + dbRetValue = dbRetValue + (str[cc] - '0') * coeff; + coeff *= 0.1; + cc++; + } + ccf++; + break; + case 'Z': + if (str[cc] != ' ') { + if (FX_IsDigit(str[cc])) { + dbRetValue = dbRetValue + (str[cc] - '0') * coeff; + coeff *= 0.1; + cc++; + } + } else { + cc++; + } + ccf++; + break; + case 'S': + if (str[cc] == '+' || str[cc] == ' ') { + cc++; + } else { + if (cc + iMinusLen > len || FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsMinus, iMinusLen)) { + return FALSE; + } + bNeg = TRUE; + cc += iMinusLen; + } + ccf++; + break; + case 's': + if (str[cc] == '+') { + cc++; + } else { + if (cc + iMinusLen > len || FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsMinus, iMinusLen)) { + return FALSE; + } + bNeg = TRUE; + cc += iMinusLen; + } + ccf++; + break; + case 'E': { + if (cc >= len || (str[cc] != 'E' && str[cc] != 'e')) { + return FALSE; + } + FX_BOOL bExpSign = FALSE; + cc ++; + if (cc < len) { + if (str[cc] == '+') { + cc++; + } else if (str[cc] == '-') { + bExpSign = TRUE; + cc++; + } + } + while (cc < len) { + if (!FX_IsDigit(str[cc])) { + break; + } + iExponent = iExponent * 10 + str[cc] - '0'; + cc ++; + } + iExponent = bExpSign ? -iExponent : iExponent; + ccf++; + } + break; + case '$': { + CFX_WideString wsSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol, wsSymbol); + FX_INT32 iSymbolLen = wsSymbol.GetLength(); + if (cc + iSymbolLen > len || FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsSymbol, iSymbolLen)) { + return FALSE; + } + cc += iSymbolLen; + ccf++; + } + break; + case 'c': + if (ccf + 1 < lenf && strf[ccf + 1] == 'r') { + if (str[cc] == 'C' && cc + 1 < len && str[cc + 1] == 'R') { + bNeg = TRUE; + cc += 2; + } + ccf += 2; + } + break; + case 'C': + if (ccf + 1 < lenf && strf[ccf + 1] == 'R') { + if (str[cc] == ' ') { + cc++; + } else if (str[cc] == 'C' && cc + 1 < len && str[cc + 1] == 'R') { + bNeg = TRUE; + cc += 2; + } + ccf += 2; + } + break; + case 'd': + if (ccf + 1 < lenf && strf[ccf + 1] == 'b') { + if (str[cc] == 'D' && cc + 1 < len && str[cc + 1] == 'B') { + bNeg = TRUE; + cc += 2; + } + ccf += 2; + } + break; + case 'D': + if (ccf + 1 < lenf && strf[ccf + 1] == 'B') { + if (str[cc] == ' ') { + cc++; + } else if (str[cc] == 'D' && cc + 1 < len && str[cc + 1] == 'B') { + bNeg = TRUE; + cc += 2; + } + ccf += 2; + } + break; + case '.': + case 'V': + case 'v': + return FALSE; + case '%': { + CFX_WideString wsSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent, wsSymbol); + FX_INT32 iSysmbolLen = wsSymbol.GetLength(); + if (cc + iSysmbolLen <= len && !FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsSymbol, iSysmbolLen)) { + cc += iSysmbolLen; + } + ccf++; + bHavePercentSymbol = TRUE; + } + break; + case '8': { + while (ccf < lenf && strf[ccf] == '8') { + ccf++; + } + while (cc < len && FX_IsDigit(str[cc])) { + dbRetValue = (str[cc] - '0') * coeff + dbRetValue; + coeff *= 0.1; + cc++; + } + } + break; + case ',': { + if (cc + iGroupLen <= len && FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsGroupSymbol, iGroupLen) == 0) { + cc += iGroupLen; + } + ccf++; + } + break; + case '(': + if (str[cc] == L'(') { + bNeg = TRUE; + } else if (str[cc] != L' ') { + return FALSE; + } + cc++; + ccf++; + break; + case ')': + if (str[cc] == L')') { + bNeg = TRUE; + } else if (str[cc] != L' ') { + return FALSE; + } + cc++; + ccf++; + break; + default: + if (strf[ccf] != str[cc]) { + return FALSE; + } + cc++; + ccf++; + } + } + if (cc != len) { + return FALSE; + } + } + if (iExponent) { + dbRetValue *= FXSYS_pow(10, (FX_FLOAT)iExponent); + } + if (bHavePercentSymbol) { + dbRetValue /= 100.0; + } + if (bNeg) { + dbRetValue = -dbRetValue; + } + fValue = (FX_FLOAT)dbRetValue; + return TRUE; +} +void FX_ParseNumString(const CFX_WideString& wsNum, CFX_WideString& wsResult) +{ + FX_INT32 iCount = wsNum.GetLength(); + FX_LPCWSTR pStr = (FX_LPCWSTR)wsNum; + FX_LPWSTR pDst = wsResult.GetBuffer(iCount); + FX_INT32 nIndex = 0; + FX_BOOL bMinus = FALSE; + FX_INT32 i = 0; + for (i = 0; i < iCount; i++) { + FX_WCHAR wc = pStr[i]; + if (wc == '.') { + break; + } + if ((wc == L'0' || wc == L' ' || wc == '+') && nIndex == 0) { + continue; + } + if (wc == '-') { + pDst[nIndex++] = wc; + bMinus = TRUE; + continue; + } + if (wc == L'0' && nIndex == 1 && bMinus) { + continue; + } + pDst[nIndex++] = wc; + } + if (bMinus && nIndex == 1) { + pDst[nIndex++] = '0'; + } + if (nIndex == 0) { + wsResult.ReleaseBuffer(0); + pDst = wsResult.GetBuffer(iCount + 1); + pDst[nIndex++] = '0'; + } + FX_INT32 j = 0; + for (j = iCount - 1; j > i; j--) { + FX_WCHAR wc = pStr[j]; + if (wc != L'0' && wc != L' ') { + break; + } + } + if (j > i) { + pDst[nIndex++] = '.'; + FXSYS_wcsncpy(pDst + nIndex, pStr + i + 1, j - i); + nIndex += j - i; + } + wsResult.ReleaseBuffer(nIndex); +} +FX_BOOL CFX_FormatString::ParseNum(const CFX_WideString& wsSrcNum, const CFX_WideString& wsPattern, CFX_WideString &wsValue) +{ + wsValue.Empty(); + if (wsSrcNum.IsEmpty() || wsPattern.IsEmpty()) { + return FALSE; + } + FX_INT32 dot_index_f = -1; + FX_DWORD dwFormatStyle = 0; + CFX_WideString wsNumFormat; + IFX_Locale* pLocale = GetNumericFormat(wsPattern, dot_index_f, dwFormatStyle, wsNumFormat); + if (!pLocale || wsNumFormat.IsEmpty()) { + return FALSE; + } + FX_INT32 iExponent = 0; + CFX_WideString wsDotSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsDotSymbol); + FX_INT32 iDotLen = wsDotSymbol.GetLength(); + CFX_WideString wsGroupSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Grouping, wsGroupSymbol); + FX_INT32 iGroupLen = wsGroupSymbol.GetLength(); + CFX_WideString wsMinus; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinus); + FX_INT32 iMinusLen = wsMinus.GetLength(); + int cc = 0, ccf = 0; + FX_LPCWSTR str = (FX_LPCWSTR)wsSrcNum; + int len = wsSrcNum.GetLength(); + FX_LPCWSTR strf = (FX_LPCWSTR)wsNumFormat; + int lenf = wsNumFormat.GetLength(); + FX_BOOL bHavePercentSymbol = FALSE; + FX_BOOL bNeg = FALSE; + FX_BOOL bReverseParse = FALSE; + FX_INT32 dot_index = 0; + if (!FX_GetNumericDotIndex(wsSrcNum, wsDotSymbol, dot_index) && (dwFormatStyle & FX_NUMSTYLE_DotVorv)) { + bReverseParse = TRUE; + } + bReverseParse = FALSE; + ccf = dot_index_f - 1; + cc = dot_index - 1; + while (ccf >= 0 && cc >= 0) { + switch (strf[ccf]) { + case '\'': { + CFX_WideString wsLiteral = FX_GetLiteralTextReverse(strf, ccf); + FX_INT32 iLiteralLen = wsLiteral.GetLength(); + cc -= iLiteralLen - 1; + if (cc < 0 || FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsLiteral, iLiteralLen)) { + return FALSE; + } + cc--; + ccf--; + break; + } + case '9': + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + wsValue = CFX_WideStringC(str[cc]) + wsValue; + cc--; + ccf--; + break; + case 'z': + if (FX_IsDigit(str[cc])) { + wsValue = CFX_WideStringC(str[cc]) + wsValue; + cc--; + } + ccf--; + break; + case 'Z': + if (str[cc] != ' ') { + if (FX_IsDigit(str[cc])) { + wsValue = CFX_WideStringC(str[cc]) + wsValue; + cc--; + } + } else { + cc--; + } + ccf--; + break; + case 'S': + if (str[cc] == '+' || str[cc] == ' ') { + cc--; + } else { + cc -= iMinusLen - 1; + if (cc < 0 || FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsMinus, iMinusLen)) { + return FALSE; + } + cc--; + bNeg = TRUE; + } + ccf--; + break; + case 's': + if (str[cc] == '+') { + cc--; + } else { + cc -= iMinusLen - 1; + if (cc < 0 || FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsMinus, iMinusLen)) { + return FALSE; + } + cc--; + bNeg = TRUE; + } + ccf--; + break; + case 'E': { + if (cc >= dot_index) { + return FALSE; + } + FX_BOOL bExpSign = FALSE; + while (cc >= 0) { + if (str[cc] == 'E' || str[cc] == 'e') { + break; + } + if (FX_IsDigit(str[cc])) { + iExponent = iExponent + (str[cc] - '0') * 10; + cc--; + continue; + } else if (str[cc] == '+') { + cc--; + continue; + } else if (cc - iMinusLen + 1 > 0 && !FXSYS_wcsncmp(str + (cc - iMinusLen + 1), (FX_LPCWSTR)wsMinus, iMinusLen)) { + bExpSign = TRUE; + cc -= iMinusLen; + } else { + return FALSE; + } + } + cc --; + iExponent = bExpSign ? -iExponent : iExponent; + ccf--; + } + break; + case '$': { + CFX_WideString wsSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol, wsSymbol); + FX_INT32 iSymbolLen = wsSymbol.GetLength(); + cc -= iSymbolLen - 1; + if (cc < 0 || FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsSymbol, iSymbolLen)) { + return FALSE; + } + cc--; + ccf--; + } + break; + case 'r': + if (ccf - 1 >= 0 && strf[ccf - 1] == 'c') { + if (str[cc] == 'R' && cc - 1 >= 0 && str[cc - 1] == 'C') { + bNeg = TRUE; + cc -= 2; + } + ccf -= 2; + } else { + ccf --; + } + break; + case 'R': + if (ccf - 1 >= 0 && strf[ccf - 1] == 'C') { + if (str[cc] == ' ') { + cc++; + } else if (str[cc] == 'R' && cc - 1 >= 0 && str[cc - 1] == 'C') { + bNeg = TRUE; + cc -= 2; + } + ccf -= 2; + } else { + ccf--; + } + break; + case 'b': + if (ccf - 1 >= 0 && strf[ccf - 1] == 'd') { + if (str[cc] == 'B' && cc - 1 >= 0 && str[cc - 1] == 'D') { + bNeg = TRUE; + cc -= 2; + } + ccf -= 2; + } else { + ccf --; + } + break; + case 'B': + if (ccf - 1 >= 0 && strf[ccf - 1] == 'D') { + if (str[cc] == ' ') { + cc++; + } else if (str[cc] == 'B' && cc - 1 >= 0 && str[cc - 1] == 'D') { + bNeg = TRUE; + cc -= 2; + } + ccf -= 2; + } else { + ccf--; + } + break; + case '.': + case 'V': + case 'v': + return FALSE; + case '%': { + CFX_WideString wsSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent, wsSymbol); + FX_INT32 iSysmbolLen = wsSymbol.GetLength(); + cc -= iSysmbolLen - 1; + if (cc < 0 || FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsSymbol, iSysmbolLen)) { + return FALSE; + } + cc--; + ccf--; + bHavePercentSymbol = TRUE; + } + break; + case '8': + return FALSE; + case ',': { + if (cc >= 0) { + cc -= iGroupLen - 1; + if (cc >= 0 && FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsGroupSymbol, iGroupLen) == 0) { + cc--; + } else { + cc += iGroupLen - 1; + } + } + ccf--; + } + break; + case '(': + if (str[cc] == L'(') { + bNeg = TRUE; + } else if (str[cc] != L' ') { + return FALSE; + } + cc--; + ccf--; + break; + case ')': + if (str[cc] == L')') { + bNeg = TRUE; + } else if (str[cc] != L' ') { + return FALSE; + } + cc--; + ccf--; + break; + default: + if (strf[ccf] != str[cc]) { + return FALSE; + } + cc--; + ccf--; + } + } + if (cc >= 0) { + if (str[cc] == '-') { + bNeg = TRUE; + cc --; + } + if (cc >= 0) { + return FALSE; + } + } + if (dot_index < len && (dwFormatStyle & FX_NUMSTYLE_DotVorv)) { + wsValue += '.'; + } + if (!bReverseParse) { + ccf = dot_index_f + 1; + cc = (dot_index == len) ? len : dot_index + 1; + while (cc < len && ccf < lenf) { + switch (strf[ccf]) { + case '\'': { + CFX_WideString wsLiteral = FX_GetLiteralText(strf, ccf, lenf); + FX_INT32 iLiteralLen = wsLiteral.GetLength(); + if (cc + iLiteralLen > len || FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsLiteral, iLiteralLen)) { + return FALSE; + } + cc += iLiteralLen; + ccf++; + break; + } + case '9': + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + { + wsValue += str[cc]; + } + cc++; + ccf++; + break; + case 'z': + if (FX_IsDigit(str[cc])) { + wsValue += str[cc]; + cc++; + } + ccf++; + break; + case 'Z': + if (str[cc] != ' ') { + if (FX_IsDigit(str[cc])) { + wsValue += str[cc]; + cc++; + } + } else { + cc++; + } + ccf++; + break; + case 'S': + if (str[cc] == '+' || str[cc] == ' ') { + cc++; + } else { + if (cc + iMinusLen > len || FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsMinus, iMinusLen)) { + return FALSE; + } + bNeg = TRUE; + cc += iMinusLen; + } + ccf++; + break; + case 's': + if (str[cc] == '+') { + cc++; + } else { + if (cc + iMinusLen > len || FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsMinus, iMinusLen)) { + return FALSE; + } + bNeg = TRUE; + cc += iMinusLen; + } + ccf++; + break; + case 'E': { + if (cc >= len || (str[cc] != 'E' && str[cc] != 'e')) { + return FALSE; + } + FX_BOOL bExpSign = FALSE; + cc ++; + if (cc < len) { + if (str[cc] == '+') { + cc++; + } else if (str[cc] == '-') { + bExpSign = TRUE; + cc++; + } + } + while (cc < len) { + if (!FX_IsDigit(str[cc])) { + break; + } + iExponent = iExponent * 10 + str[cc] - '0'; + cc ++; + } + iExponent = bExpSign ? -iExponent : iExponent; + ccf++; + } + break; + case '$': { + CFX_WideString wsSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol, wsSymbol); + FX_INT32 iSymbolLen = wsSymbol.GetLength(); + if (cc + iSymbolLen > len || FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsSymbol, iSymbolLen)) { + return FALSE; + } + cc += iSymbolLen; + ccf++; + } + break; + case 'c': + if (ccf + 1 < lenf && strf[ccf + 1] == 'r') { + if (str[cc] == 'C' && cc + 1 < len && str[cc + 1] == 'R') { + bNeg = TRUE; + cc += 2; + } + ccf += 2; + } + break; + case 'C': + if (ccf + 1 < lenf && strf[ccf + 1] == 'R') { + if (str[cc] == ' ') { + cc++; + } else if (str[cc] == 'C' && cc + 1 < len && str[cc + 1] == 'R') { + bNeg = TRUE; + cc += 2; + } + ccf += 2; + } + break; + case 'd': + if (ccf + 1 < lenf && strf[ccf + 1] == 'b') { + if (str[cc] == 'D' && cc + 1 < len && str[cc + 1] == 'B') { + bNeg = TRUE; + cc += 2; + } + ccf += 2; + } + break; + case 'D': + if (ccf + 1 < lenf && strf[ccf + 1] == 'B') { + if (str[cc] == ' ') { + cc++; + } else if (str[cc] == 'D' && cc + 1 < len && str[cc + 1] == 'B') { + bNeg = TRUE; + cc += 2; + } + ccf += 2; + } + break; + case '.': + case 'V': + case 'v': + return FALSE; + case '%': { + CFX_WideString wsSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent, wsSymbol); + FX_INT32 iSysmbolLen = wsSymbol.GetLength(); + if (cc + iSysmbolLen <= len && !FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsSymbol, iSysmbolLen)) { + cc += iSysmbolLen; + } + ccf++; + bHavePercentSymbol = TRUE; + } + break; + case '8': { + while (ccf < lenf && strf[ccf] == '8') { + ccf++; + } + while (cc < len && FX_IsDigit(str[cc])) { + wsValue += str[cc]; + cc++; + } + } + break; + case ',': { + if (cc + iGroupLen <= len && FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsGroupSymbol, iGroupLen) == 0) { + cc += iGroupLen; + } + ccf++; + } + break; + case '(': + if (str[cc] == L'(') { + bNeg = TRUE; + } else if (str[cc] != L' ') { + return FALSE; + } + cc++; + ccf++; + break; + case ')': + if (str[cc] == L')') { + bNeg = TRUE; + } else if (str[cc] != L' ') { + return FALSE; + } + cc++; + ccf++; + break; + default: + if (strf[ccf] != str[cc]) { + return FALSE; + } + cc++; + ccf++; + } + } + if (cc != len) { + return FALSE; + } + } + if (iExponent || bHavePercentSymbol) { + CFX_Decimal decimal = CFX_Decimal(wsValue); + if (iExponent) { + decimal = decimal * CFX_Decimal(FXSYS_pow(10, (FX_FLOAT)iExponent)); + } + if (bHavePercentSymbol) { + decimal = decimal / CFX_Decimal(100); + } + wsValue = decimal; + } + if (bNeg) { + wsValue = CFX_WideStringC('-') + wsValue; + } + return TRUE; +} +FX_DATETIMETYPE CFX_FormatString::GetDateTimeFormat(const CFX_WideString& wsPattern, IFX_Locale*& pLocale, CFX_WideString &wsDatePattern, CFX_WideString &wsTimePattern) +{ + pLocale = NULL; + CFX_WideString wsTempPattern; + FX_LOCALECATEGORY eCategory = FX_LOCALECATEGORY_Unknown; + FX_INT32 ccf = 0; + FX_INT32 iLenf = wsPattern.GetLength(); + FX_LPCWSTR pStr = (FX_LPCWSTR)wsPattern; + FX_INT32 iFindCategory = 0; + FX_BOOL bBraceOpen = FALSE; + while (ccf < iLenf) { + if (pStr[ccf] == '\'') { + FX_INT32 iCurChar = ccf; + FX_GetLiteralText(pStr, ccf, iLenf); + wsTempPattern += CFX_WideStringC(pStr + iCurChar, ccf - iCurChar + 1); + } else if (!bBraceOpen && iFindCategory != 3 && FX_Local_Find(gs_wsConstChars, pStr[ccf]) < 0) { + CFX_WideString wsCategory(pStr[ccf]); + ccf++; + while (ccf < iLenf && pStr[ccf] != '{' && pStr[ccf] != '.' && pStr[ccf] != '(') { + if (pStr[ccf] == 'T') { + wsDatePattern = wsPattern.Left(ccf); + wsTimePattern = wsPattern.Right(wsPattern.GetLength() - ccf); + wsTimePattern.SetAt(0, ' '); + if (!pLocale) { + pLocale = m_pLocaleMgr->GetDefLocale(); + } + return FX_DATETIMETYPE_DateTime; + } + wsCategory += pStr[ccf]; + ccf++; + } + if (!(iFindCategory & 1) && wsCategory == FX_WSTRC(L"date")) { + iFindCategory |= 1; + eCategory = FX_LOCALECATEGORY_Date; + if (iFindCategory & 2) { + iFindCategory = 4; + } + } else if (!(iFindCategory & 2) && wsCategory == FX_WSTRC(L"time")) { + iFindCategory |= 2; + eCategory = FX_LOCALECATEGORY_Time; + } else if (wsCategory == FX_WSTRC(L"datetime")) { + iFindCategory = 3; + eCategory = FX_LOCALECATEGORY_DateTime; + } else { + continue; + } + while (ccf < iLenf) { + if (pStr[ccf] == '(') { + ccf++; + CFX_WideString wsLCID; + while (ccf < iLenf && pStr[ccf] != ')') { + wsLCID += pStr[ccf++]; + } + pLocale = GetPatternLocale(wsLCID); + } else if (pStr[ccf] == '{') { + bBraceOpen = TRUE; + break; + } else if (pStr[ccf] == '.') { + CFX_WideString wsSubCategory; + ccf++; + while (ccf < iLenf && pStr[ccf] != '(' && pStr[ccf] != '{') { + wsSubCategory += pStr[ccf++]; + } + FX_DWORD dwSubHash = FX_HashCode_String_GetW(wsSubCategory, wsSubCategory.GetLength()); + FX_LOCALEDATETIMESUBCATEGORY eSubCategory = FX_LOCALEDATETIMESUBCATEGORY_Medium; + for (FX_INT32 i = 0; i < g_iFXLocaleDateTimeSubCatCount; i++) { + if (g_FXLocaleDateTimeSubCatData[i].uHash == dwSubHash) { + eSubCategory = (FX_LOCALEDATETIMESUBCATEGORY)g_FXLocaleDateTimeSubCatData[i].eSubCategory; + break; + } + } + if (!pLocale) { + pLocale = m_pLocaleMgr->GetDefLocale(); + } + FXSYS_assert(pLocale != NULL); + switch (eCategory) { + case FX_LOCALECATEGORY_Date: + pLocale->GetDatePattern(eSubCategory, wsDatePattern); + wsDatePattern = wsTempPattern + wsDatePattern; + break; + case FX_LOCALECATEGORY_Time: + pLocale->GetTimePattern(eSubCategory, wsTimePattern); + wsTimePattern = wsTempPattern + wsTimePattern; + break; + case FX_LOCALECATEGORY_DateTime: + pLocale->GetDatePattern(eSubCategory, wsDatePattern); + wsDatePattern = wsTempPattern + wsDatePattern; + pLocale->GetTimePattern(eSubCategory, wsTimePattern); + break; + default: + break; + } + wsTempPattern.Empty(); + continue; + } + ccf++; + } + } else if (pStr[ccf] == '}') { + bBraceOpen = FALSE; + if (!wsTempPattern.IsEmpty()) { + if (eCategory == FX_LOCALECATEGORY_Time) { + wsTimePattern = wsTempPattern; + } else if (eCategory == FX_LOCALECATEGORY_Date) { + wsDatePattern = wsTempPattern; + } + wsTempPattern.Empty(); + } + } else { + wsTempPattern += pStr[ccf]; + } + ccf++; + } + if (!wsTempPattern.IsEmpty()) { + if (eCategory == FX_LOCALECATEGORY_Date) { + wsDatePattern += wsTempPattern; + } else { + wsTimePattern += wsTempPattern; + } + } + if (!pLocale) { + pLocale = m_pLocaleMgr->GetDefLocale(); + } + if (!iFindCategory) { + wsTimePattern.Empty(); + wsDatePattern = wsPattern; + } + return (FX_DATETIMETYPE)iFindCategory; +} +static FX_BOOL FX_ParseLocaleDate(const CFX_WideString& wsDate, const CFX_WideString& wsDatePattern, IFX_Locale* pLocale, CFX_Unitime &datetime, FX_INT32 &cc) +{ + FX_INT32 year = 1900; + FX_INT32 month = 1; + FX_INT32 day = 1; + FX_INT32 ccf = 0; + FX_LPCWSTR str = (FX_LPCWSTR)wsDate; + FX_INT32 len = wsDate.GetLength(); + FX_LPCWSTR strf = (FX_LPCWSTR)wsDatePattern; + FX_INT32 lenf = wsDatePattern.GetLength(); + while (cc < len && ccf < lenf) { + if (strf[ccf] == '\'') { + CFX_WideString wsLiteral = FX_GetLiteralText(strf, ccf, lenf); + FX_INT32 iLiteralLen = wsLiteral.GetLength(); + if (cc + iLiteralLen > len || FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsLiteral, iLiteralLen)) { + return FALSE; + } + cc += iLiteralLen; + ccf++; + continue; + } else if (FX_Local_Find(gs_wsDateSymbols, strf[ccf]) < 0) { + if (strf[ccf] != str[cc]) { + return FALSE; + } + cc++; + ccf++; + continue; + } + FX_DWORD dwSymbolNum = 1; + FX_DWORD dwSymbol = strf[ccf++]; + while (ccf < lenf && strf[ccf] == dwSymbol) { + ccf++; + dwSymbolNum++; + } + dwSymbol = (dwSymbol << 8) | (dwSymbolNum + '0'); + if (dwSymbol == FXBSTR_ID(0, 0, 'D', '1')) { + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + day = str[cc++] - '0'; + if (cc < len && FX_IsDigit(str[cc])) { + day = day * 10 + str[cc++] - '0'; + } + } else if (dwSymbol == FXBSTR_ID(0, 0, 'D', '2')) { + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + day = str[cc++] - '0'; + if (cc < len) { + day = day * 10 + str[cc++] - '0'; + } + } else if (dwSymbol == FXBSTR_ID(0, 0, 'J', '1')) { + int i = 0; + while (cc < len && i < 3 && FX_IsDigit(str[cc])) { + cc++; + i++; + } + } else if (dwSymbol == FXBSTR_ID(0, 0, 'J', '3')) { + cc += 3; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '1')) { + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + month = str[cc++] - '0'; + if (cc < len && FX_IsDigit(str[cc])) { + month = month * 10 + str[cc++] - '0'; + } + } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '2')) { + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + month = str[cc++] - '0'; + if (cc < len) { + month = month * 10 + str[cc++] - '0'; + } + } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '3')) { + CFX_WideString wsMonthNameAbbr; + FX_WORD i = 0; + for (; i < 12; i++) { + pLocale->GetMonthName(i, wsMonthNameAbbr, TRUE); + if (wsMonthNameAbbr.IsEmpty()) { + continue; + } + if (!FXSYS_wcsncmp((FX_LPCWSTR)wsMonthNameAbbr, str + cc, wsMonthNameAbbr.GetLength())) { + break; + } + } + if (i < 12) { + cc += wsMonthNameAbbr.GetLength(); + month = i + 1; + } + } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '4')) { + CFX_WideString wsMonthName; + FX_WORD i = 0; + for (; i < 12; i++) { + pLocale->GetMonthName(i, wsMonthName, FALSE); + if (wsMonthName.IsEmpty()) { + continue; + } + if (!FXSYS_wcsncmp((FX_LPCWSTR)wsMonthName, str + cc, wsMonthName.GetLength())) { + break; + } + } + if (i < 12) { + cc += wsMonthName.GetLength(); + month = i + 1; + } + } else if (dwSymbol == FXBSTR_ID(0, 0, 'E', '1')) { + cc += 1; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'E', '3')) { + CFX_WideString wsDayNameAbbr; + FX_WORD i = 0; + for (; i < 7; i++) { + pLocale->GetDayName(i, wsDayNameAbbr, TRUE); + if (wsDayNameAbbr.IsEmpty()) { + continue; + } + if (!FXSYS_wcsncmp((FX_LPCWSTR)wsDayNameAbbr, str + cc, wsDayNameAbbr.GetLength())) { + break; + } + } + if (i < 12) { + cc += wsDayNameAbbr.GetLength(); + } + } else if (dwSymbol == FXBSTR_ID(0, 0, 'E', '4')) { + CFX_WideString wsDayName; + FX_INT32 i = 0; + for (; i < 7; i++) { + pLocale->GetDayName(i, wsDayName, FALSE); + if (wsDayName == L"") { + continue; + } + if (!FXSYS_wcsncmp((FX_LPCWSTR)wsDayName, str + cc, wsDayName.GetLength())) { + break; + } + } + if (i < 12) { + cc += wsDayName.GetLength(); + } + } else if (dwSymbol == FXBSTR_ID(0, 0, 'e', '1')) { + cc += 1; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'G', '1')) { + cc += 2; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'Y', '2')) { + if (cc + 2 > len) { + return FALSE; + } + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + year = str[cc++] - '0'; + if (cc >= len || !FX_IsDigit(str[cc])) { + return FALSE; + } + year = year * 10 + str[cc++] - '0'; + if (year <= 29) { + year += 2000; + } else { + year += 1900; + } + } else if (dwSymbol == FXBSTR_ID(0, 0, 'Y', '4')) { + int i = 0; + year = 0; + if (cc + 4 > len) { + return FALSE; + } + while (i < 4) { + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + year = year * 10 + str[cc] - '0'; + cc++; + i++; + } + } else if (dwSymbol == FXBSTR_ID(0, 0, 'w', '1')) { + cc += 1; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'W', '2')) { + cc += 2; + } + } + CFX_Unitime ut; + ut.Set(year, month, day); + datetime = datetime + ut; + return cc; +} +static void FX_ResolveZone(FX_BYTE& wHour, FX_BYTE& wMinute, FX_TIMEZONE tzDiff, IFX_Locale* pLocale) +{ + FX_INT32 iMinuteDiff = wHour * 60 + wMinute; + FX_TIMEZONE tzLocale; + pLocale->GetTimeZone(tzLocale); + iMinuteDiff += tzLocale.tzHour * 60 + (tzLocale.tzHour < 0 ? -tzLocale.tzMinute : tzLocale.tzMinute); + iMinuteDiff -= tzDiff.tzHour * 60 + (tzDiff.tzHour < 0 ? -tzDiff.tzMinute : tzDiff.tzMinute); + while (iMinuteDiff > 1440) { + iMinuteDiff -= 1440; + } + while (iMinuteDiff < 0) { + iMinuteDiff += 1440; + } + wHour = iMinuteDiff / 60; + wMinute = iMinuteDiff % 60; +} +static FX_BOOL FX_ParseLocaleTime(const CFX_WideString& wsTime, const CFX_WideString& wsTimePattern, IFX_Locale* pLocale, CFX_Unitime &datetime, FX_INT32 &cc) +{ + FX_BYTE hour = 0; + FX_BYTE minute = 0; + FX_BYTE second = 0; + FX_WORD millisecond = 0; + FX_INT32 ccf = 0; + FX_LPCWSTR str = (FX_LPCWSTR)wsTime; + int len = wsTime.GetLength(); + FX_LPCWSTR strf = (FX_LPCWSTR)wsTimePattern; + int lenf = wsTimePattern.GetLength(); + FX_BOOL bHasA = FALSE; + FX_BOOL bPM = FALSE; + while (cc < len && ccf < lenf) { + if (strf[ccf] == '\'') { + CFX_WideString wsLiteral = FX_GetLiteralText(strf, ccf, lenf); + FX_INT32 iLiteralLen = wsLiteral.GetLength(); + if (cc + iLiteralLen > len || FXSYS_wcsncmp(str + cc, (FX_LPCWSTR)wsLiteral, iLiteralLen)) { + return FALSE; + } + cc += iLiteralLen; + ccf++; + continue; + } else if (FX_Local_Find(gs_wsTimeSymbols, strf[ccf]) == -1) { + if (strf[ccf] != str[cc]) { + return FALSE; + } + cc++; + ccf++; + continue; + } + FX_DWORD dwSymbolNum = 1; + FX_DWORD dwSymbol = strf[ccf++]; + while (ccf < lenf && strf[ccf] == dwSymbol) { + ccf++; + dwSymbolNum++; + } + dwSymbol = (dwSymbol << 8) | (dwSymbolNum + '0'); + if (dwSymbol == FXBSTR_ID(0, 0, 'k', '1') || dwSymbol == FXBSTR_ID(0, 0, 'H', '1') || dwSymbol == FXBSTR_ID(0, 0, 'h', '1') || dwSymbol == FXBSTR_ID(0, 0, 'K', '1')) { + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + hour = str[cc++] - '0'; + if (cc < len && FX_IsDigit(str[cc])) { + hour = hour * 10 + str[cc++] - '0'; + } + if (dwSymbol == FXBSTR_ID(0, 0, 'K', '1') && hour == 24) { + hour = 0; + } + } else if (dwSymbol == FXBSTR_ID(0, 0, 'k', '2') || dwSymbol == FXBSTR_ID(0, 0, 'H', '2') || dwSymbol == FXBSTR_ID(0, 0, 'h', '2') || dwSymbol == FXBSTR_ID(0, 0, 'K', '2')) { + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + hour = str[cc++] - '0'; + if (cc >= len) { + return FALSE; + } + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + hour = hour * 10 + str[cc++] - '0'; + if (dwSymbol == FXBSTR_ID(0, 0, 'K', '2') && hour == 24) { + hour = 0; + } + } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '1')) { + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + minute = str[cc++] - '0'; + if (cc < len && FX_IsDigit(str[cc])) { + minute = minute * 10 + str[cc++] - '0'; + } + } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '2')) { + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + minute = str[cc++] - '0'; + if (cc >= len) { + return FALSE; + } + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + minute = minute * 10 + str[cc++] - '0'; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'S', '1')) { + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + second = str[cc++] - '0'; + if (cc < len && FX_IsDigit(str[cc])) { + second = second * 10 + str[cc++] - '0'; + } + } else if (dwSymbol == FXBSTR_ID(0, 0, 'S', '2')) { + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + second = str[cc++] - '0'; + if (cc >= len) { + return FALSE; + } + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + second = second * 10 + str[cc++] - '0'; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'F', '3')) { + if (cc + 3 >= len) { + return FALSE; + } + int i = 0; + while (i < 3) { + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + millisecond = millisecond * 10 + str[cc++] - '0'; + i++; + } + } else if (dwSymbol == FXBSTR_ID(0, 0, 'A', '1')) { + CFX_WideString wsAM; + pLocale->GetMeridiemName(wsAM, TRUE); + CFX_WideString wsPM; + pLocale->GetMeridiemName(wsPM, FALSE); + if ((cc + wsAM.GetLength() <= len) && (CFX_WideStringC(str + cc, wsAM.GetLength()) == wsAM)) { + cc += wsAM.GetLength(); + bHasA = TRUE; + } else if ((cc + wsPM.GetLength() <= len) && (CFX_WideStringC(str + cc, wsPM.GetLength()) == wsPM)) { + cc += wsPM.GetLength(); + bHasA = TRUE; + bPM = TRUE; + } + } else if (dwSymbol == FXBSTR_ID(0, 0, 'Z', '1')) { + if (cc + 3 > len) { + continue; + } + FX_DWORD dwHash = str[cc++]; + dwHash = (dwHash << 8) | str[cc++]; + dwHash = (dwHash << 8) | str[cc++]; + if (dwHash == FXBSTR_ID(0, 'G', 'M', 'T')) { + FX_TIMEZONE tzDiff; + tzDiff.tzHour = 0; + tzDiff.tzMinute = 0; + if (cc < len && (str[cc] == '-' || str[cc] == '+')) { + cc += FX_ParseTimeZone(str + cc, len - cc, tzDiff); + } + FX_ResolveZone(hour, minute, tzDiff, pLocale); + } else { + FX_LPCLOCALETIMEZONEINFO pTimeZoneInfo = NULL; + FX_INT32 iStart = 0, iEnd = g_iFXLocaleTimeZoneCount - 1; + do { + FX_INT32 iMid = (iStart + iEnd) / 2; + FX_LPCLOCALETIMEZONEINFO pInfo = g_FXLocaleTimeZoneData + iMid; + if (dwHash == pInfo->uHash) { + pTimeZoneInfo = pInfo; + break; + } else if (dwHash < pInfo->uHash) { + iEnd = iMid - 1; + } else { + iStart = iMid + 1; + } + } while (iStart <= iEnd); + if (pTimeZoneInfo) { + hour += pTimeZoneInfo->iHour; + minute += pTimeZoneInfo->iHour > 0 ? pTimeZoneInfo->iMinute : -pTimeZoneInfo->iMinute; + } + } + } else if (dwSymbol == FXBSTR_ID(0, 0, 'z', '1')) { + if (str[cc] != 'Z') { + FX_TIMEZONE tzDiff; + cc += FX_ParseTimeZone(str + cc, len - cc, tzDiff); + FX_ResolveZone(hour, minute, tzDiff, pLocale); + } else { + cc++; + } + } + } + if (bHasA) { + if (bPM) { + hour += 12; + if (hour == 24) { + hour = 12; + } + } else { + if (hour == 12) { + hour = 0; + } + } + } + CFX_Unitime ut; + ut.Set(0, 0, 0, hour, minute, second, millisecond); + datetime = datetime + ut; + return cc; +} +FX_BOOL CFX_FormatString::ParseDateTime(const CFX_WideString& wsSrcDateTime, const CFX_WideString& wsPattern, FX_DATETIMETYPE eDateTimeType, CFX_Unitime& dtValue) +{ + dtValue.Set(0); + if (wsSrcDateTime.IsEmpty() || wsPattern.IsEmpty()) { + return FALSE; + } + CFX_WideString wsDatePattern, wsTimePattern; + IFX_Locale* pLocale = NULL; + FX_DATETIMETYPE eCategory = GetDateTimeFormat(wsPattern, pLocale, wsDatePattern, wsTimePattern); + if (!pLocale) { + return FALSE; + } + if (eCategory == FX_DATETIMETYPE_Unknown) { + eCategory = eDateTimeType; + } + if (eCategory == FX_DATETIMETYPE_Unknown) { + return FALSE; + } + if (eCategory == FX_DATETIMETYPE_TimeDate) { + FX_INT32 iStart = 0; + if (!FX_ParseLocaleTime(wsSrcDateTime, wsTimePattern, pLocale, dtValue, iStart)) { + return FALSE; + } + if (!FX_ParseLocaleDate(wsSrcDateTime, wsDatePattern, pLocale, dtValue, iStart)) { + return FALSE; + } + } else { + FX_INT32 iStart = 0; + if ((eCategory & FX_DATETIMETYPE_Date) && !FX_ParseLocaleDate(wsSrcDateTime, wsDatePattern, pLocale, dtValue, iStart)) { + return FALSE; + } + if ((eCategory & FX_DATETIMETYPE_Time) && !FX_ParseLocaleTime(wsSrcDateTime, wsTimePattern, pLocale, dtValue, iStart)) { + return FALSE; + } + } + return TRUE; +} +FX_BOOL CFX_FormatString::ParseZero(const CFX_WideString& wsSrcText, const CFX_WideString& wsPattern) +{ + CFX_WideString wsTextFormat; + IFX_Locale* pLocale = GetTextFormat(wsPattern, FX_WSTRC(L"zero"), wsTextFormat); + FX_INT32 iText = 0, iPattern = 0; + FX_LPCWSTR pStrText = (FX_LPCWSTR)wsSrcText; + FX_INT32 iLenText = wsSrcText.GetLength(); + FX_LPCWSTR pStrPattern = (FX_LPCWSTR)wsTextFormat; + FX_INT32 iLenPattern = wsTextFormat.GetLength(); + while (iPattern < iLenPattern && iText < iLenText) { + if (pStrPattern[iPattern] == '\'') { + CFX_WideString wsLiteral = FX_GetLiteralText(pStrPattern, iPattern, iLenPattern); + FX_INT32 iLiteralLen = wsLiteral.GetLength(); + if (iText + iLiteralLen > iLenText || FXSYS_wcsncmp(pStrText + iText, (FX_LPCWSTR)wsLiteral, iLiteralLen)) { + return FALSE; + } + iText += iLiteralLen; + iPattern++; + continue; + } else if (pStrPattern[iPattern] != pStrText[iText]) { + return FALSE; + } else { + iText++; + iPattern++; + } + } + return iPattern == iLenPattern && iText == iLenText; +} +FX_BOOL CFX_FormatString::ParseNull(const CFX_WideString& wsSrcText, const CFX_WideString& wsPattern) +{ + CFX_WideString wsTextFormat; + IFX_Locale* pLocale = GetTextFormat(wsPattern, FX_WSTRC(L"null"), wsTextFormat); + FX_INT32 iText = 0, iPattern = 0; + FX_LPCWSTR pStrText = (FX_LPCWSTR)wsSrcText; + FX_INT32 iLenText = wsSrcText.GetLength(); + FX_LPCWSTR pStrPattern = (FX_LPCWSTR)wsTextFormat; + FX_INT32 iLenPattern = wsTextFormat.GetLength(); + while (iPattern < iLenPattern && iText < iLenText) { + if (pStrPattern[iPattern] == '\'') { + CFX_WideString wsLiteral = FX_GetLiteralText(pStrPattern, iPattern, iLenPattern); + FX_INT32 iLiteralLen = wsLiteral.GetLength(); + if (iText + iLiteralLen > iLenText || FXSYS_wcsncmp(pStrText + iText, (FX_LPCWSTR)wsLiteral, iLiteralLen)) { + return FALSE; + } + iText += iLiteralLen; + iPattern++; + continue; + } else if (pStrPattern[iPattern] != pStrText[iText]) { + return FALSE; + } else { + iText++; + iPattern++; + } + } + return iPattern == iLenPattern && iText == iLenText; +} +FX_BOOL CFX_FormatString::FormatText(const CFX_WideString& wsSrcText, const CFX_WideString& wsPattern, CFX_WideString& wsOutput) +{ + if (wsPattern.IsEmpty()) { + return FALSE; + } + FX_INT32 iLenText = wsSrcText.GetLength(); + if (iLenText == 0) { + return FALSE; + } + CFX_WideString wsTextFormat; + IFX_Locale* pLocale = GetTextFormat(wsPattern, FX_WSTRC(L"text"), wsTextFormat); + FX_INT32 iText = 0, iPattern = 0; + FX_LPCWSTR pStrText = (FX_LPCWSTR)wsSrcText; + FX_LPCWSTR pStrPattern = (FX_LPCWSTR)wsTextFormat; + FX_INT32 iLenPattern = wsTextFormat.GetLength(); + while (iPattern < iLenPattern) { + switch (pStrPattern[iPattern]) { + case '\'': { + wsOutput += FX_GetLiteralText(pStrPattern, iPattern, iLenPattern); + iPattern++; + break; + } + case 'A': + if (iText >= iLenText || !FX_IsAlpha(pStrText[iText])) { + return FALSE; + } + wsOutput += pStrText[iText++]; + iPattern++; + break; + case 'X': + if (iText >= iLenText) { + return FALSE; + } + wsOutput += pStrText[iText++]; + iPattern++; + break; + case 'O': + case '0': + if (iText >= iLenText || (!FX_IsDigit(pStrText[iText]) && !FX_IsAlpha(pStrText[iText]))) { + return FALSE; + } + wsOutput += pStrText[iText++]; + iPattern++; + break; + case '9': + if (iText >= iLenText || !FX_IsDigit(pStrText[iText])) { + return FALSE; + } + wsOutput += pStrText[iText++]; + iPattern++; + break; + default: + wsOutput += pStrPattern[iPattern++]; + break; + } + } + return iText == iLenText; +} +static FX_INT32 FX_GetNumTrailingLimit(const CFX_WideString& wsFormat, int iDotPos, FX_BOOL &bTrimTailZeros) +{ + if (iDotPos < 0) { + return 0; + } + FX_INT32 iCount = wsFormat.GetLength(); + FX_INT32 iTreading = 0; + for (iDotPos ++; iDotPos < iCount; iDotPos ++) { + FX_WCHAR wc = wsFormat[iDotPos]; + if (wc == L'z' || wc == L'9' || wc == 'Z') { + iTreading ++; + bTrimTailZeros = (wc == L'9' ? FALSE : TRUE); + } + } + return iTreading; +} +FX_BOOL CFX_FormatString::FormatStrNum(FX_WSTR wsInputNum, const CFX_WideString& wsPattern, CFX_WideString& wsOutput) +{ + if (wsInputNum.IsEmpty() || wsPattern.IsEmpty()) { + return FALSE; + } + FX_INT32 dot_index_f = -1; + FX_DWORD dwNumStyle = 0; + CFX_WideString wsNumFormat; + IFX_Locale* pLocale = GetNumericFormat(wsPattern, dot_index_f, dwNumStyle, wsNumFormat); + if (!pLocale || wsNumFormat.IsEmpty()) { + return FALSE; + } + FX_INT32 cc = 0, ccf = 0; + FX_LPCWSTR strf = (FX_LPCWSTR)wsNumFormat; + int lenf = wsNumFormat.GetLength(); + CFX_WideString wsSrcNum = wsInputNum; + wsSrcNum.TrimLeft('0'); + if (wsSrcNum.IsEmpty() || wsSrcNum[0] == '.') { + wsSrcNum.Insert(0, '0'); + } + CFX_Decimal decimal = CFX_Decimal(wsSrcNum); + if (dwNumStyle & FX_NUMSTYLE_Percent) { + decimal = decimal * CFX_Decimal(100); + wsSrcNum = decimal; + } + FX_INT32 exponent = 0; + if (dwNumStyle & FX_NUMSTYLE_Exponent) { + int fixed_count = 0; + while (ccf < dot_index_f) { + switch (strf[ccf]) { + case '\'': + FX_GetLiteralText(strf, ccf, dot_index_f); + break; + case '9': + case 'z': + case 'Z': + fixed_count++; + break; + } + ccf++; + } + int threshold = 1; + while (fixed_count > 1) { + threshold *= 10; + fixed_count--; + } + if (decimal != CFX_Decimal(0)) { + if (decimal < CFX_Decimal(threshold)) { + decimal = decimal * CFX_Decimal(10); + exponent = -1; + while (decimal < CFX_Decimal(threshold)) { + decimal = decimal * CFX_Decimal(10); + exponent -= 1; + } + } else if (decimal > CFX_Decimal(threshold)) { + threshold *= 10; + while (decimal > CFX_Decimal(threshold)) { + decimal = decimal / CFX_Decimal(10); + exponent += 1; + } + } + } + } + FX_BOOL bTrimTailZeros = FALSE; + FX_INT32 iTreading = FX_GetNumTrailingLimit(wsNumFormat, dot_index_f, bTrimTailZeros); + FX_INT32 scale = decimal.GetScale(); + if (iTreading < scale) { + decimal.SetScale(iTreading); + wsSrcNum = decimal; + } + if (bTrimTailZeros && scale > 0 && iTreading > 0) { + wsSrcNum.TrimRight((FX_LPCWSTR)L"0"); + wsSrcNum.TrimRight((FX_LPCWSTR)L"."); + } + CFX_WideString wsGroupSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Grouping, wsGroupSymbol); + FX_BOOL bNeg = FALSE; + if (wsSrcNum[0] == '-') { + bNeg = TRUE; + wsSrcNum.Delete(0, 1); + } + FX_BOOL bAddNeg = FALSE; + FX_LPCWSTR str = (FX_LPCWSTR)wsSrcNum; + int len = wsSrcNum.GetLength(); + int dot_index = wsSrcNum.Find('.'); + if (dot_index == -1) { + dot_index = len; + } + ccf = dot_index_f - 1; + cc = dot_index - 1; + while (ccf >= 0) { + switch (strf[ccf]) { + case '9': + if (cc >= 0) { + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + wsOutput = CFX_WideStringC(str[cc]) + wsOutput; + cc--; + } else { + wsOutput = CFX_WideStringC(L'0') + wsOutput; + } + ccf--; + break; + case 'z': + if (cc >= 0) { + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + if (str[0] != '0') { + wsOutput = CFX_WideStringC(str[cc]) + wsOutput; + } + cc--; + } + ccf--; + break; + case 'Z': + if (cc >= 0) { + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + if (str[0] == '0') { + wsOutput = CFX_WideStringC(L' ') + wsOutput; + } else { + wsOutput = CFX_WideStringC(str[cc]) + wsOutput; + } + cc--; + } else { + wsOutput = CFX_WideStringC(L' ') + wsOutput; + } + ccf--; + break; + case 'S': + if (bNeg) { + CFX_WideString wsMinusSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusSymbol); + wsOutput = wsMinusSymbol + wsOutput; + bAddNeg = TRUE; + } else { + wsOutput = CFX_WideStringC(L' ') + wsOutput; + } + ccf--; + break; + case 's': + if (bNeg) { + CFX_WideString wsMinusSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusSymbol); + wsOutput = wsMinusSymbol + wsOutput; + bAddNeg = TRUE; + } + ccf--; + break; + case 'E': { + CFX_WideString wsExp; + wsExp.Format((FX_LPCWSTR)L"E%+d", exponent); + wsOutput = wsExp + wsOutput; + } + ccf--; + break; + case '$': { + CFX_WideString wsSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol, wsSymbol); + wsOutput = wsSymbol + wsOutput; + } + ccf--; + break; + case 'r': + if (ccf - 1 >= 0 && strf[ccf - 1] == 'c') { + if (bNeg) { + wsOutput = L"CR" + wsOutput; + } + ccf -= 2; + bAddNeg = TRUE; + } + break; + case 'R': + if (ccf - 1 >= 0 && strf[ccf - 1] == 'C') { + if (bNeg) { + wsOutput = L"CR" + wsOutput; + } else { + wsOutput = L" " + wsOutput; + } + ccf -= 2; + bAddNeg = TRUE; + } + break; + case 'b': + if (ccf - 1 >= 0 && strf[ccf - 1] == 'd') { + if (bNeg) { + wsOutput = L"db" + wsOutput; + } + ccf -= 2; + bAddNeg = TRUE; + } + break; + case 'B': + if (ccf - 1 >= 0 && strf[ccf - 1] == 'D') { + if (bNeg) { + wsOutput = L"DB" + wsOutput; + } else { + wsOutput = L" " + wsOutput; + } + ccf -= 2; + bAddNeg = TRUE; + } + break; + case '%': { + CFX_WideString wsSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent, wsSymbol); + wsOutput = wsSymbol + wsOutput; + } + ccf--; + break; + case ',': + if (cc >= 0) { + wsOutput = wsGroupSymbol + wsOutput; + } + ccf--; + break; + case '(': + if (bNeg) { + wsOutput = L"(" + wsOutput; + } else { + wsOutput = L" " + wsOutput; + } + bAddNeg = TRUE; + ccf--; + break; + case ')': + if (bNeg) { + wsOutput = L")" + wsOutput; + } else { + wsOutput = L" " + wsOutput; + } + ccf--; + break; + case '\'': + wsOutput = FX_GetLiteralTextReverse(strf, ccf) + wsOutput; + ccf--; + break; + default: + wsOutput = CFX_WideStringC(strf[ccf]) + wsOutput; + ccf--; + } + } + if (cc >= 0) { + int nPos = dot_index % 3; + wsOutput.Empty(); + for (FX_INT32 i = 0; i < dot_index; i++) { + if (i % 3 == nPos && i != 0) { + wsOutput += wsGroupSymbol; + } + wsOutput += wsSrcNum[i]; + } + if (dot_index < len) { + CFX_WideString wsSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsSymbol); + wsOutput += wsSymbol; + wsOutput += wsSrcNum.Right(len - dot_index - 1); + } + if (bNeg) { + CFX_WideString wsMinusymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusymbol); + wsOutput = wsMinusymbol + wsOutput; + } + return FALSE; + } + if (dot_index_f == wsNumFormat.GetLength()) { + if (!bAddNeg && bNeg) { + CFX_WideString wsMinusymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusymbol); + wsOutput = wsMinusymbol + wsOutput; + } + return TRUE; + } + CFX_WideString wsDotSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsDotSymbol); + if (strf[dot_index_f] == 'V') { + wsOutput += wsDotSymbol; + } else if (strf[dot_index_f] == '.') { + if (dot_index < len) { + wsOutput += wsDotSymbol; + } else { + if (strf[dot_index_f + 1] == '9' || strf[dot_index_f + 1] == 'Z') { + wsOutput += wsDotSymbol; + } + } + } + ccf = dot_index_f + 1; + cc = dot_index + 1; + while (ccf < lenf) { + switch (strf[ccf]) { + case '\'': + wsOutput += FX_GetLiteralText(strf, ccf, lenf); + ccf++; + break; + case '9': + if (cc < len) { + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + wsOutput += str[cc]; + cc++; + } else { + wsOutput += L'0'; + } + ccf++; + break; + case 'z': + if (cc < len) { + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + wsOutput += str[cc]; + cc++; + } + ccf++; + break; + case 'Z': + if (cc < len) { + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + wsOutput += str[cc]; + cc++; + } else { + wsOutput += L'0'; + } + ccf++; + break; + case 'E': { + CFX_WideString wsExp; + wsExp.Format((FX_LPCWSTR)L"E%+d", exponent); + wsOutput += wsExp; + } + ccf++; + break; + case '$': { + CFX_WideString wsSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol, wsSymbol); + wsOutput += wsSymbol; + } + ccf++; + break; + case 'c': + if (ccf + 1 < lenf && strf[ccf + 1] == 'r') { + if (bNeg) { + wsOutput += L"CR"; + } + ccf += 2; + bAddNeg = TRUE; + } + break; + case 'C': + if (ccf + 1 < lenf && strf[ccf + 1] == 'R') { + if (bNeg) { + wsOutput += L"CR"; + } else { + wsOutput += L" "; + } + ccf += 2; + bAddNeg = TRUE; + } + break; + case 'd': + if (ccf + 1 < lenf && strf[ccf + 1] == 'b') { + if (bNeg) { + wsOutput += L"db"; + } + ccf += 2; + bAddNeg = TRUE; + } + break; + case 'D': + if (ccf + 1 < lenf && strf[ccf + 1] == 'B') { + if (bNeg) { + wsOutput += L"DB"; + } else { + wsOutput += L" "; + } + ccf += 2; + bAddNeg = TRUE; + } + break; + case '%': { + CFX_WideString wsSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent, wsSymbol); + wsOutput += wsSymbol; + } + ccf++; + break; + case '8': { + while (ccf < lenf && strf[ccf] == '8') { + ccf++; + } + while (cc < len && FX_IsDigit(str[cc])) { + wsOutput += str[cc]; + cc++; + } + } + break; + case ',': + wsOutput += wsGroupSymbol; + ccf++; + break; + case '(': + if (bNeg) { + wsOutput += '('; + } else { + wsOutput += ' '; + } + bAddNeg = TRUE; + ccf++; + break; + case ')': + if (bNeg) { + wsOutput += ')'; + } else { + wsOutput += ' '; + } + ccf++; + break; + default: + ccf++; + } + } + if (!bAddNeg && bNeg) { + CFX_WideString wsMinusymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusymbol); + wsOutput = wsMinusymbol + wsOutput[0] + wsOutput.Mid(1, wsOutput.GetLength() - 1); + } + return TRUE; +} +FX_BOOL CFX_FormatString::FormatLCNumeric(CFX_LCNumeric& lcNum, const CFX_WideString& wsPattern, CFX_WideString& wsOutput) +{ + FX_INT32 dot_index_f = -1; + FX_DWORD dwNumStyle = 0; + CFX_WideString wsNumFormat; + IFX_Locale* pLocale = GetNumericFormat(wsPattern, dot_index_f, dwNumStyle, wsNumFormat); + if (!pLocale || wsNumFormat.IsEmpty()) { + return FALSE; + } + FX_INT32 cc = 0, ccf = 0; + FX_LPCWSTR strf = (FX_LPCWSTR)wsNumFormat; + int lenf = wsNumFormat.GetLength(); + double dbOrgRaw = lcNum.GetDouble(); + double dbRetValue = dbOrgRaw; + if (dwNumStyle & FX_NUMSTYLE_Percent) { + dbRetValue *= 100; + } + FX_INT32 exponent = 0; + if (dwNumStyle & FX_NUMSTYLE_Exponent) { + int fixed_count = 0; + while (ccf < dot_index_f) { + switch (strf[ccf]) { + case '\'': + FX_GetLiteralText(strf, ccf, dot_index_f); + break; + case '9': + case 'z': + case 'Z': + fixed_count++; + break; + } + ccf++; + } + int threshold = 1; + while (fixed_count > 1) { + threshold *= 10; + fixed_count--; + } + if (dbRetValue != 0) { + if (dbRetValue < threshold) { + dbRetValue *= 10; + exponent = -1; + while (dbRetValue < threshold) { + dbRetValue *= 10; + exponent -= 1; + } + } else if (dbRetValue > threshold) { + threshold *= 10; + while (dbRetValue > threshold) { + dbRetValue /= 10; + exponent += 1; + } + } + } + } + if (dwNumStyle & (FX_NUMSTYLE_Percent | FX_NUMSTYLE_Exponent)) { + lcNum = CFX_LCNumeric(dbRetValue); + } + FX_BOOL bTrimTailZeros = FALSE; + FX_INT32 iTreading = FX_GetNumTrailingLimit(wsNumFormat, dot_index_f, bTrimTailZeros); + CFX_WideString wsNumeric = lcNum.ToString(iTreading, bTrimTailZeros); + if (wsNumeric.IsEmpty()) { + return FALSE; + } + CFX_WideString wsGroupSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Grouping, wsGroupSymbol); + FX_BOOL bNeg = FALSE; + if (wsNumeric[0] == '-') { + bNeg = TRUE; + wsNumeric.Delete(0, 1); + } + FX_BOOL bAddNeg = FALSE; + FX_LPCWSTR str = (FX_LPCWSTR)wsNumeric; + int len = wsNumeric.GetLength(); + int dot_index = wsNumeric.Find('.'); + if (dot_index == -1) { + dot_index = len; + } + ccf = dot_index_f - 1; + cc = dot_index - 1; + while (ccf >= 0) { + switch (strf[ccf]) { + case '9': + if (cc >= 0) { + wsOutput = CFX_WideStringC(str[cc]) + wsOutput; + cc--; + } else { + wsOutput = CFX_WideStringC(L'0') + wsOutput; + } + ccf--; + break; + case 'z': + if (cc >= 0) { + if (lcNum.m_Integral != 0) { + wsOutput = CFX_WideStringC(str[cc]) + wsOutput; + } + cc--; + } + ccf--; + break; + case 'Z': + if (cc >= 0) { + if (lcNum.m_Integral == 0) { + wsOutput = CFX_WideStringC(L' ') + wsOutput; + } else { + wsOutput = CFX_WideStringC(str[cc]) + wsOutput; + } + cc--; + } else { + wsOutput = CFX_WideStringC(L' ') + wsOutput; + } + ccf--; + break; + case 'S': + if (bNeg) { + CFX_WideString wsMinusSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusSymbol); + wsOutput = wsMinusSymbol + wsOutput; + bAddNeg = TRUE; + } else { + wsOutput = CFX_WideStringC(L' ') + wsOutput; + } + ccf--; + break; + case 's': + if (bNeg) { + CFX_WideString wsMinusSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusSymbol); + wsOutput = wsMinusSymbol + wsOutput; + bAddNeg = TRUE; + } + ccf--; + break; + case 'E': { + CFX_WideString wsExp; + wsExp.Format((FX_LPCWSTR)L"E%+d", exponent); + wsOutput = wsExp + wsOutput; + } + ccf--; + break; + case '$': { + CFX_WideString wsSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol, wsSymbol); + wsOutput = wsSymbol + wsOutput; + } + ccf--; + break; + case 'r': + if (ccf - 1 >= 0 && strf[ccf - 1] == 'c') { + if (bNeg) { + wsOutput = L"CR" + wsOutput; + } + ccf -= 2; + bAddNeg = TRUE; + } + break; + case 'R': + if (ccf - 1 >= 0 && strf[ccf - 1] == 'C') { + if (bNeg) { + wsOutput = L"CR" + wsOutput; + } else { + wsOutput = L" " + wsOutput; + } + ccf -= 2; + bAddNeg = TRUE; + } + break; + case 'b': + if (ccf - 1 >= 0 && strf[ccf - 1] == 'd') { + if (bNeg) { + wsOutput = L"db" + wsOutput; + } + ccf -= 2; + bAddNeg = TRUE; + } + break; + case 'B': + if (ccf - 1 >= 0 && strf[ccf - 1] == 'D') { + if (bNeg) { + wsOutput = L"DB" + wsOutput; + } else { + wsOutput = L" " + wsOutput; + } + ccf -= 2; + bAddNeg = TRUE; + } + break; + case '%': { + CFX_WideString wsSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent, wsSymbol); + wsOutput = wsSymbol + wsOutput; + } + ccf--; + break; + case ',': + if (cc >= 0) { + wsOutput = wsGroupSymbol + wsOutput; + } + ccf--; + break; + case '(': + if (bNeg) { + wsOutput = L"(" + wsOutput; + } else { + wsOutput = L" " + wsOutput; + } + bAddNeg = TRUE; + ccf--; + break; + case ')': + if (bNeg) { + wsOutput = L")" + wsOutput; + } else { + wsOutput = L" " + wsOutput; + } + ccf--; + break; + case '\'': + wsOutput = FX_GetLiteralTextReverse(strf, ccf) + wsOutput; + ccf--; + break; + default: + wsOutput = CFX_WideStringC(strf[ccf]) + wsOutput; + ccf--; + } + } + if (cc >= 0) { + int nPos = dot_index % 3; + wsOutput.Empty(); + for (FX_INT32 i = 0; i < dot_index; i++) { + if (i % 3 == nPos && i != 0) { + wsOutput += wsGroupSymbol; + } + wsOutput += wsNumeric[i]; + } + if (dot_index < len) { + CFX_WideString wsSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsSymbol); + wsOutput += wsSymbol; + wsOutput += wsNumeric.Right(len - dot_index - 1); + } + if (bNeg) { + CFX_WideString wsMinusymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusymbol); + wsOutput = wsMinusymbol + wsOutput; + } + return FALSE; + } + if (dot_index_f == wsNumFormat.GetLength()) { + if (!bAddNeg && bNeg) { + CFX_WideString wsMinusymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusymbol); + wsOutput = wsMinusymbol + wsOutput; + } + return TRUE; + } + CFX_WideString wsDotSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsDotSymbol); + if (strf[dot_index_f] == 'V') { + wsOutput += wsDotSymbol; + } else if (strf[dot_index_f] == '.') { + if (dot_index < len) { + wsOutput += wsDotSymbol; + } else { + if (strf[dot_index_f + 1] == '9' || strf[dot_index_f + 1] == 'Z') { + wsOutput += wsDotSymbol; + } + } + } + ccf = dot_index_f + 1; + cc = dot_index + 1; + while (ccf < lenf) { + switch (strf[ccf]) { + case '\'': + wsOutput += FX_GetLiteralText(strf, ccf, lenf); + ccf++; + break; + case '9': + if (cc < len) { + wsOutput += str[cc]; + cc++; + } else { + wsOutput += L'0'; + } + ccf++; + break; + case 'z': + if (cc < len) { + wsOutput += str[cc]; + cc++; + } + ccf++; + break; + case 'Z': + if (cc < len) { + wsOutput += str[cc]; + cc++; + } else { + wsOutput += L'0'; + } + ccf++; + break; + case 'E': { + CFX_WideString wsExp; + wsExp.Format((FX_LPCWSTR)L"E%+d", exponent); + wsOutput += wsExp; + } + ccf++; + break; + case '$': { + CFX_WideString wsSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol, wsSymbol); + wsOutput += wsSymbol; + } + ccf++; + break; + case 'c': + if (ccf + 1 < lenf && strf[ccf + 1] == 'r') { + if (bNeg) { + wsOutput += L"CR"; + } + ccf += 2; + bAddNeg = TRUE; + } + break; + case 'C': + if (ccf + 1 < lenf && strf[ccf + 1] == 'R') { + if (bNeg) { + wsOutput += L"CR"; + } else { + wsOutput += L" "; + } + ccf += 2; + bAddNeg = TRUE; + } + break; + case 'd': + if (ccf + 1 < lenf && strf[ccf + 1] == 'b') { + if (bNeg) { + wsOutput += L"db"; + } + ccf += 2; + bAddNeg = TRUE; + } + break; + case 'D': + if (ccf + 1 < lenf && strf[ccf + 1] == 'B') { + if (bNeg) { + wsOutput += L"DB"; + } else { + wsOutput += L" "; + } + ccf += 2; + bAddNeg = TRUE; + } + break; + case '%': { + CFX_WideString wsSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent, wsSymbol); + wsOutput += wsSymbol; + } + ccf++; + break; + case '8': { + while (ccf < lenf && strf[ccf] == '8') { + ccf++; + } + while (cc < len && FX_IsDigit(str[cc])) { + wsOutput += str[cc]; + cc++; + } + } + break; + case ',': + wsOutput += wsGroupSymbol; + ccf++; + break; + case '(': + if (bNeg) { + wsOutput += '('; + } else { + wsOutput += ' '; + } + bAddNeg = TRUE; + ccf++; + break; + case ')': + if (bNeg) { + wsOutput += ')'; + } else { + wsOutput += ' '; + } + ccf++; + break; + default: + ccf++; + } + } + if (!bAddNeg && bNeg) { + CFX_WideString wsMinusymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusymbol); + wsOutput = wsOutput[0] + wsMinusymbol + wsOutput.Mid(1, wsOutput.GetLength() - 1); + } + return TRUE; +} +FX_BOOL CFX_FormatString::FormatNum(const CFX_WideString& wsSrcNum, const CFX_WideString& wsPattern, CFX_WideString& wsOutput) +{ + if (wsSrcNum.IsEmpty() || wsPattern.IsEmpty()) { + return FALSE; + } + return FormatStrNum(wsSrcNum, wsPattern, wsOutput); +} +FX_BOOL CFX_FormatString::FormatNum(FX_FLOAT fNum, const CFX_WideString& wsPattern, CFX_WideString& wsOutput) +{ + if (wsPattern.IsEmpty()) { + return FALSE; + } + CFX_LCNumeric lcNum(fNum); + return FormatLCNumeric(lcNum, wsPattern, wsOutput); +} +FX_BOOL FX_DateFromCanonical(const CFX_WideString& wsDate, CFX_Unitime& datetime) +{ + FX_INT32 year = 1900; + FX_INT32 month = 1; + FX_INT32 day = 1; + FX_WORD wYear = 0; + int cc_start = 0, cc = 0; + FX_LPCWSTR str = (FX_LPCWSTR)wsDate; + int len = wsDate.GetLength(); + if(len > 10) { + return FALSE; + } + while (cc < len && cc < 4) { + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + wYear = wYear * 10 + str[cc++] - '0'; + } + year = wYear; + if (cc < 4 || wYear < 1900) { + return FALSE; + } + if(cc < len) { + if (str[cc] == '-') { + cc++; + } + cc_start = cc; + FX_BYTE tmpM = 0; + while (cc < len && cc < cc_start + 2) { + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + tmpM = tmpM * 10 + str[cc++] - '0'; + } + month = tmpM; + if (cc == cc_start + 1 || tmpM > 12 || tmpM < 1) { + return FALSE; + } + if(cc < len) { + if (str[cc] == '-') { + cc++; + } + FX_BYTE tmpD = 0; + cc_start = cc; + while (cc < len && cc < cc_start + 2) { + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + tmpD = tmpD * 10 + str[cc++] - '0'; + } + day = tmpD; + if (tmpD < 1) { + return FALSE; + } + if ((tmpM == 1 || tmpM == 3 || tmpM == 5 || tmpM == 7 || tmpM == 8 || tmpM == 10 || tmpM == 12) && tmpD > 31) { + return FALSE; + } + if((tmpM == 4 || tmpM == 6 || tmpM == 9 || tmpM == 11) && tmpD > 30) { + return FALSE; + } + FX_BOOL iLeapYear; + if((wYear % 4 == 0 && wYear % 100 != 0 ) || wYear % 400 == 0) { + iLeapYear = TRUE; + } else { + iLeapYear = FALSE; + } + if ((iLeapYear && tmpM == 2 && tmpD > 29) || (!iLeapYear && tmpM == 2 && tmpD > 28)) { + return FALSE; + } + } + } + CFX_Unitime ut; + ut.Set(year, month, day); + datetime = datetime + ut; + return TRUE; +} +FX_BOOL FX_TimeFromCanonical(FX_WSTR wsTime, CFX_Unitime& datetime, IFX_Locale* pLocale) +{ + if (wsTime.GetLength() == 0) { + return FALSE; + } + FX_BYTE hour = 0; + FX_BYTE minute = 0; + FX_BYTE second = 0; + FX_WORD millisecond = 0; + int cc_start = 0, cc = cc_start; + FX_LPCWSTR str = (FX_LPCWSTR)wsTime.GetPtr(); + int len = wsTime.GetLength(); + while (cc < len && cc < 2) { + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + hour = hour * 10 + str[cc++] - '0'; + } + if (cc < 2 || hour >= 24) { + return FALSE; + } + if(cc < len) { + if (str[cc] == ':') { + cc++; + } + cc_start = cc; + while (cc < len && cc < cc_start + 2) { + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + minute = minute * 10 + str[cc++] - '0'; + } + if (cc == cc_start + 1 || minute >= 60) { + return FALSE; + } + if(cc < len) { + if (str[cc] == ':') { + cc++; + } + cc_start = cc; + while (cc < len && cc < cc_start + 2) { + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + second = second * 10 + str[cc++] - '0'; + } + if (cc == cc_start + 1 || second >= 60) { + return FALSE; + } + if(cc < len) { + if (str[cc] == '.') { + cc++; + cc_start = cc; + while (cc < len && cc < cc_start + 3) { + if (!FX_IsDigit(str[cc])) { + return FALSE; + } + millisecond = millisecond * 10 + str[cc++] - '0'; + } + if (cc < cc_start + 3 || millisecond >= 1000) { + return FALSE; + } + } + if(cc < len) { + FX_TIMEZONE tzDiff; + tzDiff.tzHour = 0; + tzDiff.tzMinute = 0; + if (str[cc] != 'Z') { + cc += FX_ParseTimeZone(str + cc, len - cc, tzDiff); + } + FX_ResolveZone(hour, minute, tzDiff, pLocale); + } + } + } + } + CFX_Unitime ut; + ut.Set(0, 0, 0, hour, minute, second, millisecond); + datetime = datetime + ut; + return TRUE; +} +static FX_WORD FX_GetSolarMonthDays(FX_WORD year, FX_WORD month) +{ + if (month % 2) { + return 31; + } else if (month == 2) { + return FX_IsLeapYear(year) ? 29 : 28; + } + return 30; +} +static FX_WORD FX_GetWeekDay(FX_WORD year, FX_WORD month, FX_WORD day) +{ + FX_WORD g_month_day[] = { 0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5 }; + FX_WORD nDays = (year - 1) % 7 + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400; + nDays += g_month_day[month - 1] + day; + if (FX_IsLeapYear(year) && month > 2) { + nDays++; + } + return nDays % 7; +} +static FX_WORD FX_GetWeekOfMonth(FX_WORD year, FX_WORD month, FX_WORD day) +{ + FX_WORD week_day = FX_GetWeekDay(year, month, 1); + FX_WORD week_index = 0; + week_index += day / 7; + day = day % 7; + if (week_day + day > 7) { + week_index++; + } + return week_index; +} +static FX_WORD FX_GetWeekOfYear(FX_WORD year, FX_WORD month, FX_WORD day) +{ + FX_WORD nDays = 0; + for (FX_WORD i = 1; i < month; i++) { + nDays += FX_GetSolarMonthDays(year, i); + } + nDays += day; + FX_WORD week_day = FX_GetWeekDay(year, 1, 1); + FX_WORD week_index = 1; + week_index += nDays / 7; + nDays = nDays % 7; + if (week_day + nDays > 7) { + week_index++; + } + return week_index; +} +static FX_BOOL FX_DateFormat(const CFX_WideString& wsDatePattern, IFX_Locale *pLocale, const CFX_Unitime &datetime, CFX_WideString& wsResult) +{ + FX_BOOL bRet = TRUE; + FX_INT32 year = datetime.GetYear(); + FX_BYTE month = datetime.GetMonth(); + FX_BYTE day = datetime.GetDay(); + FX_INT32 ccf = 0; + FX_LPCWSTR strf = (FX_LPCWSTR)wsDatePattern; + FX_INT32 lenf = wsDatePattern.GetLength(); + while (ccf < lenf) { + if (strf[ccf] == '\'') { + wsResult += FX_GetLiteralText(strf, ccf, lenf); + ccf++; + continue; + } else if (FX_Local_Find(gs_wsDateSymbols, strf[ccf]) < 0) { + wsResult += strf[ccf++]; + continue; + } + FX_DWORD dwSymbolNum = 1; + FX_DWORD dwSymbol = strf[ccf++]; + while (ccf < lenf && strf[ccf] == dwSymbol) { + ccf++; + dwSymbolNum++; + } + dwSymbol = (dwSymbol << 8) | (dwSymbolNum + '0'); + if (dwSymbol == FXBSTR_ID(0, 0, 'D', '1')) { + CFX_WideString wsDay; + wsDay.Format((FX_LPCWSTR)L"%d", day); + wsResult += wsDay; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'D', '2')) { + CFX_WideString wsDay; + wsDay.Format((FX_LPCWSTR)L"%02d", day); + wsResult += wsDay; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'J', '1')) { + FX_WORD nDays = 0; + for (int i = 1; i < month; i++) { + nDays += FX_GetSolarMonthDays(year, i); + } + nDays += day; + CFX_WideString wsDays; + wsDays.Format((FX_LPCWSTR)L"%d", nDays); + wsResult += wsDays; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'J', '3')) { + FX_WORD nDays = 0; + for (int i = 1; i < month; i++) { + nDays += FX_GetSolarMonthDays(year, i); + } + nDays += day; + CFX_WideString wsDays; + wsDays.Format((FX_LPCWSTR)L"%03d", nDays); + wsResult += wsDays; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '1')) { + CFX_WideString wsMonth; + wsMonth.Format((FX_LPCWSTR)L"%d", month); + wsResult += wsMonth; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '2')) { + CFX_WideString wsMonth; + wsMonth.Format((FX_LPCWSTR)L"%02d", month); + wsResult += wsMonth; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '3')) { + CFX_WideString wsTemp; + pLocale->GetMonthName(month - 1, wsTemp, TRUE); + wsResult += wsTemp; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '4')) { + CFX_WideString wsTemp; + pLocale->GetMonthName(month - 1, wsTemp, FALSE); + wsResult += wsTemp; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'E', '1')) { + FX_WORD wWeekDay = FX_GetWeekDay(year, month, day); + CFX_WideString wsWeekDay; + wsWeekDay.Format((FX_LPCWSTR)L"%d", wWeekDay + 1); + wsResult += wsWeekDay; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'E', '3')) { + FX_WORD wWeekDay = FX_GetWeekDay(year, month, day); + CFX_WideString wsTemp; + pLocale->GetDayName(wWeekDay, wsTemp, TRUE); + wsResult += wsTemp; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'E', '4')) { + FX_WORD wWeekDay = FX_GetWeekDay(year, month, day); + if (pLocale) { + CFX_WideString wsTemp; + pLocale->GetDayName(wWeekDay, wsTemp, FALSE); + wsResult += wsTemp; + } + } else if (dwSymbol == FXBSTR_ID(0, 0, 'e', '1')) { + FX_WORD wWeekDay = FX_GetWeekDay(year, month, day); + CFX_WideString wsWeekDay; + wsWeekDay.Format((FX_LPCWSTR)L"%d", wWeekDay ? wWeekDay : 7); + wsResult += wsWeekDay; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'G', '1')) { + CFX_WideString wsTemp; + pLocale->GetEraName(wsTemp, year < 0); + wsResult += wsTemp; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'Y', '2')) { + CFX_WideString wsYear; + wsYear.Format((FX_LPCWSTR)L"%02d", year % 100); + wsResult += wsYear; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'Y', '4')) { + CFX_WideString wsYear; + wsYear.Format((FX_LPCWSTR)L"%d", year); + wsResult += wsYear; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'w', '1')) { + FX_WORD week_index = FX_GetWeekOfMonth(year, month, day); + CFX_WideString wsWeekInMonth; + wsWeekInMonth.Format((FX_LPCWSTR)L"%d", week_index); + wsResult += wsWeekInMonth; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'W', '2')) { + FX_WORD week_index = FX_GetWeekOfYear(year, month, day); + CFX_WideString wsWeekInYear; + wsWeekInYear.Format((FX_LPCWSTR)L"%02d", week_index); + wsResult += wsWeekInYear; + } + } + return bRet; +} +static FX_BOOL FX_TimeFormat(const CFX_WideString& wsTimePattern, IFX_Locale *pLocale, const CFX_Unitime &datetime, CFX_WideString& wsResult) +{ + FX_BOOL bGMT = FALSE; + FX_BOOL bRet = TRUE; + FX_BYTE hour = datetime.GetHour(); + FX_BYTE minute = datetime.GetMinute(); + FX_BYTE second = datetime.GetSecond(); + FX_WORD millisecond = datetime.GetMillisecond(); + FX_INT32 ccf = 0; + FX_LPCWSTR strf = (FX_LPCWSTR)wsTimePattern; + FX_INT32 lenf = wsTimePattern.GetLength(); + FX_WORD wHour = hour; + FX_BOOL bPM = FALSE; + if (wsTimePattern.Find('A') != -1) { + if (wHour >= 12) { + bPM = TRUE; + } + } + while (ccf < lenf) { + if (strf[ccf] == '\'') { + wsResult += FX_GetLiteralText(strf, ccf, lenf); + ccf++; + continue; + } else if (FX_Local_Find(gs_wsTimeSymbols, strf[ccf]) < 0) { + wsResult += strf[ccf++]; + continue; + } + FX_DWORD dwSymbolNum = 1; + FX_DWORD dwSymbol = strf[ccf++]; + while (ccf < lenf && strf[ccf] == dwSymbol) { + ccf++; + dwSymbolNum++; + } + dwSymbol = (dwSymbol << 8) | (dwSymbolNum + '0'); + if (dwSymbol == FXBSTR_ID(0, 0, 'h', '1')) { + if (wHour > 12) { + wHour -= 12; + } + CFX_WideString wsHour; + wsHour.Format((FX_LPCWSTR)L"%d", wHour == 0 ? 12 : wHour); + wsResult += wsHour; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'h', '2')) { + if (wHour > 12) { + wHour -= 12; + } + CFX_WideString wsHour; + wsHour.Format((FX_LPCWSTR)L"%02d", wHour == 0 ? 12 : wHour); + wsResult += wsHour; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'K', '1')) { + CFX_WideString wsHour; + wsHour.Format((FX_LPCWSTR)L"%d", wHour == 0 ? 24 : wHour); + wsResult += wsHour; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'K', '2')) { + CFX_WideString wsHour; + wsHour.Format((FX_LPCWSTR)L"%02d", wHour == 0 ? 24 : wHour); + wsResult += wsHour; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'k', '1')) { + if (wHour > 12) { + wHour -= 12; + } + CFX_WideString wsHour; + wsHour.Format((FX_LPCWSTR)L"%d", wHour); + wsResult += wsHour; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'H', '1')) { + CFX_WideString wsHour; + wsHour.Format((FX_LPCWSTR)L"%d", wHour); + wsResult += wsHour; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'k', '2')) { + if (wHour > 12) { + wHour -= 12; + } + CFX_WideString wsHour; + wsHour.Format((FX_LPCWSTR)L"%02d", wHour); + wsResult += wsHour; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'H', '2')) { + CFX_WideString wsHour; + wsHour.Format((FX_LPCWSTR)L"%02d", wHour); + wsResult += wsHour; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '1')) { + CFX_WideString wsMinute; + wsMinute.Format((FX_LPCWSTR)L"%d", minute); + wsResult += wsMinute; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '2')) { + CFX_WideString wsMinute; + wsMinute.Format((FX_LPCWSTR)L"%02d", minute); + wsResult += wsMinute; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'S', '1')) { + CFX_WideString wsSecond; + wsSecond.Format((FX_LPCWSTR)L"%d", second); + wsResult += wsSecond; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'S', '2')) { + CFX_WideString wsSecond; + wsSecond.Format((FX_LPCWSTR)L"%02d", second); + wsResult += wsSecond; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'F', '3')) { + CFX_WideString wsMilliseconds; + wsMilliseconds.Format((FX_LPCWSTR)L"%03d", millisecond); + wsResult += wsMilliseconds; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'A', '1')) { + CFX_WideString wsMeridiem; + pLocale->GetMeridiemName(wsMeridiem, !bPM); + wsResult += wsMeridiem; + } else if (dwSymbol == FXBSTR_ID(0, 0, 'Z', '1')) { + wsResult += FX_WSTRC(L"GMT"); + FX_TIMEZONE tz; + pLocale->GetTimeZone(tz); + if (!bGMT && (tz.tzHour != 0 || tz.tzMinute != 0)) { + if (tz.tzHour < 0) { + wsResult += FX_WSTRC(L"-"); + } else { + wsResult += FX_WSTRC(L"+"); + } + CFX_WideString wsTimezone; + wsTimezone.Format((FX_LPCWSTR)L"%02d:%02d", FXSYS_abs(tz.tzHour), tz.tzMinute); + wsResult += wsTimezone; + } + } else if (dwSymbol == FXBSTR_ID(0, 0, 'z', '1')) { + FX_TIMEZONE tz; + pLocale->GetTimeZone(tz); + if (!bGMT && tz.tzHour != 0 && tz.tzMinute != 0) { + if (tz.tzHour < 0) { + wsResult += FX_WSTRC(L"-"); + } else { + wsResult += FX_WSTRC(L"+"); + } + CFX_WideString wsTimezone; + wsTimezone.Format((FX_LPCWSTR)L"%02d:%02d", FXSYS_abs(tz.tzHour), tz.tzMinute); + wsResult += wsTimezone; + } + } + } + return bRet; +} +static FX_BOOL FX_FormatDateTime(const CFX_Unitime& dt, const CFX_WideString& wsDatePattern, const CFX_WideString& wsTimePattern, + FX_BOOL bDateFirst, IFX_Locale* pLocale, CFX_WideString& wsOutput) +{ + FX_BOOL bRet = TRUE; + CFX_WideString wsDateOut, wsTimeOut; + if (!wsDatePattern.IsEmpty()) { + bRet &= FX_DateFormat(wsDatePattern, pLocale, dt, wsDateOut); + } + if (!wsTimePattern.IsEmpty()) { + bRet &= FX_TimeFormat(wsTimePattern, pLocale, dt, wsTimeOut); + } + wsOutput = bDateFirst ? wsDateOut + wsTimeOut : wsTimeOut + wsDateOut; + return bRet; +} +FX_BOOL CFX_FormatString::FormatDateTime(const CFX_WideString& wsSrcDateTime, const CFX_WideString& wsPattern, CFX_WideString& wsOutput) +{ + if (wsSrcDateTime.IsEmpty() || wsPattern.IsEmpty()) { + return FALSE; + } + CFX_WideString wsDatePattern, wsTimePattern; + IFX_Locale* pLocale = NULL; + FX_DATETIMETYPE eCategory = GetDateTimeFormat(wsPattern, pLocale, wsDatePattern, wsTimePattern); + if (pLocale == NULL || eCategory == FX_DATETIMETYPE_Unknown) { + return FALSE; + } + CFX_Unitime dt(0); + FX_INT32 iT = wsSrcDateTime.Find(L"T"); + if (iT < 0) { + if (eCategory == FX_DATETIMETYPE_Date) { + FX_DateFromCanonical(wsSrcDateTime, dt); + } else if (eCategory == FX_DATETIMETYPE_Time) { + FX_TimeFromCanonical(wsSrcDateTime, dt, pLocale); + } + } else { + FX_DateFromCanonical(wsSrcDateTime.Left(iT), dt); + FX_TimeFromCanonical(wsSrcDateTime.Right(wsSrcDateTime.GetLength() - iT - 1), dt, pLocale); + } + return FX_FormatDateTime(dt, wsDatePattern, wsTimePattern, eCategory != FX_DATETIMETYPE_TimeDate, pLocale, wsOutput); +} +FX_BOOL CFX_FormatString::FormatDateTime(const CFX_WideString& wsSrcDateTime, const CFX_WideString& wsPattern, CFX_WideString& wsOutput, FX_DATETIMETYPE eDateTimeType) +{ + if (wsSrcDateTime.IsEmpty() || wsPattern.IsEmpty()) { + return FALSE; + } + CFX_WideString wsDatePattern, wsTimePattern; + IFX_Locale* pLocale = NULL; + FX_DATETIMETYPE eCategory = GetDateTimeFormat(wsPattern, pLocale, wsDatePattern, wsTimePattern); + if (!pLocale) { + return FALSE; + } + if (eCategory == FX_DATETIMETYPE_Unknown) { + if (eDateTimeType == FX_DATETIMETYPE_Time) { + wsTimePattern = wsDatePattern; + wsDatePattern.Empty(); + } + eCategory = eDateTimeType; + } + if (eCategory == FX_DATETIMETYPE_Unknown) { + return FALSE; + } + CFX_Unitime dt(0); + FX_INT32 iT = wsSrcDateTime.Find(L"T"); + if (iT < 0) { + if (eCategory == FX_DATETIMETYPE_Date && FX_DateFromCanonical(wsSrcDateTime, dt)) { + return FX_FormatDateTime(dt, wsDatePattern, wsTimePattern, TRUE, pLocale, wsOutput); + } else if (eCategory == FX_DATETIMETYPE_Time && FX_TimeFromCanonical(wsSrcDateTime, dt, pLocale)) { + return FX_FormatDateTime(dt, wsDatePattern, wsTimePattern, TRUE, pLocale, wsOutput); + } + } else { + CFX_WideStringC wsSrcDate((FX_LPCWSTR)wsSrcDateTime, iT); + CFX_WideStringC wsSrcTime((FX_LPCWSTR)wsSrcDateTime + iT + 1, wsSrcDateTime.GetLength() - iT - 1); + if(wsSrcDate.IsEmpty() || wsSrcTime.IsEmpty()) { + return FALSE; + } + if(FX_DateFromCanonical(wsSrcDate, dt) && FX_TimeFromCanonical(wsSrcTime, dt, pLocale)) { + return FX_FormatDateTime(dt, wsDatePattern, wsTimePattern, eCategory != FX_DATETIMETYPE_TimeDate, pLocale, wsOutput); + } + } + return FALSE; +} +FX_BOOL CFX_FormatString::FormatDateTime(const CFX_Unitime& dt, const CFX_WideString& wsPattern, CFX_WideString& wsOutput) +{ + if (wsPattern.IsEmpty()) { + return FALSE; + } + CFX_WideString wsDatePattern, wsTimePattern; + IFX_Locale* pLocale = NULL; + FX_DATETIMETYPE eCategory = GetDateTimeFormat(wsPattern, pLocale, wsDatePattern, wsTimePattern); + if (!pLocale) { + return FALSE; + } + return FX_FormatDateTime(dt, wsPattern, wsTimePattern, eCategory != FX_DATETIMETYPE_TimeDate, pLocale, wsOutput); +} +FX_BOOL CFX_FormatString::FormatZero(const CFX_WideString& wsPattern, CFX_WideString& wsOutput) +{ + if (wsPattern.IsEmpty()) { + return FALSE; + } + CFX_WideString wsTextFormat; + IFX_Locale* pLocale = GetTextFormat(wsPattern, FX_WSTRC(L"zero"), wsTextFormat); + FX_INT32 iPattern = 0; + FX_LPCWSTR pStrPattern = (FX_LPCWSTR)wsTextFormat; + FX_INT32 iLenPattern = wsTextFormat.GetLength(); + while (iPattern < iLenPattern) { + if (pStrPattern[iPattern] == '\'') { + wsOutput += FX_GetLiteralText(pStrPattern, iPattern, iLenPattern); + iPattern++; + continue; + } else { + wsOutput += pStrPattern[iPattern++]; + continue; + } + } + return TRUE; +} +FX_BOOL CFX_FormatString::FormatNull(const CFX_WideString& wsPattern, CFX_WideString& wsOutput) +{ + if (wsPattern.IsEmpty()) { + return FALSE; + } + CFX_WideString wsTextFormat; + IFX_Locale* pLocale = GetTextFormat(wsPattern, FX_WSTRC(L"null"), wsTextFormat); + FX_INT32 iPattern = 0; + FX_LPCWSTR pStrPattern = (FX_LPCWSTR)wsTextFormat; + FX_INT32 iLenPattern = wsTextFormat.GetLength(); + while (iPattern < iLenPattern) { + if (pStrPattern[iPattern] == '\'') { + wsOutput += FX_GetLiteralText(pStrPattern, iPattern, iLenPattern); + iPattern++; + continue; + } else { + wsOutput += pStrPattern[iPattern++]; + continue; + } + } + return TRUE; +} +IFX_Locale* CFX_FormatString::GetPatternLocale(FX_WSTR wsLocale) +{ + if (m_bUseLCID) { + } + return m_pLocaleMgr->GetLocaleByName(wsLocale); +} +#define FXMATH_DECIMAL_SCALELIMIT 0x1c +#define FXMATH_DECIMAL_NEGMASK (0x80000000L) +#define FXMATH_DECIMAL_FORCEBOOL(x) (!(!(x))) +#define FXMATH_DECIMAL_MAKEFLAGS(NEG, SCALE) (((SCALE) << 0x10) | ((NEG) ? FXMATH_DECIMAL_NEGMASK : 0)) +#define FXMATH_DECIMAL_FLAGS2NEG(FLAGS) FXMATH_DECIMAL_FORCEBOOL((FLAGS) & FXMATH_DECIMAL_NEGMASK) +#define FXMATH_DECIMAL_FLAGS2SCALE(FLAGS) ((FX_UINT8)(((FLAGS) & ~FXMATH_DECIMAL_NEGMASK) >> 0x10)) +#define FXMATH_DECIMAL_RSHIFT32BIT(x) ((x)>>0x10>>0x10) +#define FXMATH_DECIMAL_LSHIFT32BIT(x) ((x)<<0x10<<0x10) +static inline FX_UINT8 fxmath_decimal_helper_div10(FX_UINT64& phi, FX_UINT64& pmid, FX_UINT64& plo) +{ + FX_UINT8 retVal; + pmid += FXMATH_DECIMAL_LSHIFT32BIT(phi % 0xA); + phi /= 0xA; + plo += FXMATH_DECIMAL_LSHIFT32BIT(pmid % 0xA); + pmid /= 0xA; + retVal = plo % 0xA; + plo /= 0xA; + return retVal; +} +static inline FX_UINT8 fxmath_decimal_helper_div10_any(FX_UINT64 nums[], FX_UINT8 numcount) +{ + FX_UINT8 retVal = 0; + for(int i = numcount - 1; i > 0; i --) { + nums[i - 1] += FXMATH_DECIMAL_LSHIFT32BIT(nums[i] % 0xA); + nums[i] /= 0xA; + } + if(numcount) { + retVal = nums[0] % 0xA; + nums[0] /= 0xA; + } + return retVal; +} +static inline void fxmath_decimal_helper_mul10(FX_UINT64& phi, FX_UINT64& pmid, FX_UINT64& plo) +{ + plo *= 0xA; + pmid = pmid * 0xA + FXMATH_DECIMAL_RSHIFT32BIT(plo); + plo = (FX_UINT32)plo; + phi = phi * 0xA + FXMATH_DECIMAL_RSHIFT32BIT(pmid); + pmid = (FX_UINT32)pmid; +} +static inline void fxmath_decimal_helper_mul10_any(FX_UINT64 nums[], FX_UINT8 numcount) +{ + nums[0] *= 0xA; + for(int i = 1; i < numcount; i++) { + nums[i] = nums[i] * 0xA + FXMATH_DECIMAL_RSHIFT32BIT (nums[i - 1]); + nums[i - 1] = (FX_UINT32)nums[i - 1]; + } +} +static inline void fxmath_decimal_helper_normalize(FX_UINT64& phi, FX_UINT64& pmid, FX_UINT64& plo) +{ + phi += FXMATH_DECIMAL_RSHIFT32BIT(pmid); + pmid = (FX_UINT32)pmid; + pmid += FXMATH_DECIMAL_RSHIFT32BIT(plo); + plo = (FX_UINT32)plo; + phi += FXMATH_DECIMAL_RSHIFT32BIT(pmid); + pmid = (FX_UINT32)pmid; +} +static inline void fxmath_decimal_helper_normalize_any(FX_UINT64 nums[], FX_UINT8 len) +{ + { + for(int i = len - 2; i > 0; i --) { + nums[i + 1] += FXMATH_DECIMAL_RSHIFT32BIT(nums[i]); + nums[i] = (FX_UINT32)nums[i]; + } + } + { + for(int i = 0; i < len - 1; i ++) { + nums[i + 1] += FXMATH_DECIMAL_RSHIFT32BIT(nums[i]); + nums[i] = (FX_UINT32)nums[i]; + } + } +} +static inline FX_INT8 fxmath_decimal_helper_raw_compare(FX_UINT32 hi1, FX_UINT32 mid1, FX_UINT32 lo1, FX_UINT32 hi2, FX_UINT32 mid2, FX_UINT32 lo2) +{ + FX_INT8 retVal = 0; + if (!retVal) { + retVal += (hi1 > hi2 ? 1 : (hi1 < hi2 ? -1 : 0)); + } + if (!retVal) { + retVal += (mid1 > mid2 ? 1 : (mid1 < mid2 ? -1 : 0)); + } + if (!retVal) { + retVal += (lo1 > lo2 ? 1 : (lo1 < lo2 ? -1 : 0)); + } + return retVal; +} +static inline FX_INT8 fxmath_decimal_helper_raw_compare_any(FX_UINT64 a[], FX_UINT8 al, FX_UINT64 b[], FX_UINT8 bl) +{ + FX_INT8 retVal = 0; + for(int i = FX_MAX(al - 1, bl - 1); i >= 0; i --) { + FX_UINT64 l = (i >= al ? 0 : a[i]), r = (i >= bl ? 0 : b[i]); + retVal += (l > r ? 1 : (l < r ? -1 : 0)); + if(retVal) { + return retVal; + } + } + return retVal; +} +static inline void fxmath_decimal_helper_dec_any(FX_UINT64 a[], FX_UINT8 al) +{ + for(int i = 0; i < al; i ++) { + if(a[i]--) { + return; + } + } +} +static inline void fxmath_decimal_helper_inc_any(FX_UINT64 a[], FX_UINT8 al) +{ + for(int i = 0; i < al; i ++) { + a[i]++; + if((FX_UINT32)a[i] == a[i]) { + return; + } + a[i] = 0; + } +} +static inline void fxmath_decimal_helper_raw_mul(FX_UINT64 a[], FX_UINT8 al, FX_UINT64 b[], FX_UINT8 bl, FX_UINT64 c[], FX_UINT8 cl) +{ + assert(al + bl <= cl); + { + for(int i = 0; i < cl; i++) { + c[i] = 0; + } + } + { + for(int i = 0; i < al; i++) { + for(int j = 0; j < bl; j++) { + FX_UINT64 m = (FX_UINT64)a[i] * b[j]; + c[i + j] += (FX_UINT32)m; + c[i + j + 1] += FXMATH_DECIMAL_RSHIFT32BIT(m); + } + } + } + { + for(int i = 0; i < cl - 1; i++) { + c[i + 1] += FXMATH_DECIMAL_RSHIFT32BIT(c[i]); + c[i] = (FX_UINT32)c[i]; + } + } + { + for(int i = 0; i < cl; i++) { + c[i] = (FX_UINT32)c[i]; + } + } +} +static inline void fxmath_decimal_helper_raw_div(FX_UINT64 a[], FX_UINT8 al, FX_UINT64 b[], FX_UINT8 bl, FX_UINT64 c[], FX_UINT8 cl) +{ + int i; + for(i = 0; i < cl; i++) { + c[i] = 0; + } + FX_UINT64 left[16] = {0}, right[16] = {0}; + left[0] = 0; + for(i = 0; i < al; i++) { + right[i] = a[i]; + } + FX_UINT64 tmp[16]; + while(fxmath_decimal_helper_raw_compare_any(left, al, right, al) <= 0) { + FX_UINT64 cur[16]; + for(i = 0; i < al; i++) { + cur[i] = left[i] + right[i]; + } + for(i = al - 1; i >= 0; i--) { + if(i) { + cur[i - 1] += FXMATH_DECIMAL_LSHIFT32BIT(cur[i] % 2); + } + cur[i] /= 2; + } + fxmath_decimal_helper_raw_mul(cur, al, b, bl, tmp, 16); + switch(fxmath_decimal_helper_raw_compare_any(tmp, 16, a, al)) { + case -1: + for(i = 0; i < 16; i++) { + left[i] = cur[i]; + } + left[0]++; + fxmath_decimal_helper_normalize_any(left, al); + break; + case 1: + for(i = 0; i < 16; i++) { + right[i] = cur[i]; + } + fxmath_decimal_helper_dec_any(right, al); + break; + case 0: + for(i = 0; i < FX_MIN(al, cl); i++) { + c[i] = cur[i]; + } + return; + } + } + for(i = 0; i < FX_MIN(al, cl); i++) { + c[i] = left[i]; + } +} +static inline FX_BOOL fxmath_decimal_helper_outofrange(FX_UINT64 a[], FX_UINT8 al, FX_UINT8 goal) +{ + for(int i = goal; i < al; i++) { + if(a[i]) { + return TRUE; + } + } + return FALSE; +} +static inline void fxmath_decimal_helper_shrinkintorange(FX_UINT64 a[], FX_UINT8 al, FX_UINT8 goal, FX_UINT8& scale) +{ + FX_BOOL bRoundUp = FALSE; + while(scale != 0 && (scale > FXMATH_DECIMAL_SCALELIMIT || fxmath_decimal_helper_outofrange(a, al, goal))) { + bRoundUp = fxmath_decimal_helper_div10_any(a, al) >= 5; + scale --; + } + if(bRoundUp) { + fxmath_decimal_helper_normalize_any(a, goal); + fxmath_decimal_helper_inc_any(a, goal); + } +} +static inline void fxmath_decimal_helper_truncate(FX_UINT64& phi, FX_UINT64& pmid, FX_UINT64& plo, FX_UINT8& scale, FX_UINT8 minscale = 0) +{ + while(scale > minscale) { + FX_UINT64 thi = phi, tmid = pmid, tlo = plo; + if(fxmath_decimal_helper_div10(thi, tmid, tlo) != 0) { + break; + } + phi = thi, pmid = tmid, plo = tlo; + scale--; + } +} +CFX_Decimal::CFX_Decimal() +{ + m_uLo = m_uMid = m_uHi = m_uFlags = 0; +} +CFX_Decimal::CFX_Decimal(FX_UINT64 val) +{ + m_uLo = (FX_UINT32)val; + m_uMid = (FX_UINT32)FXMATH_DECIMAL_RSHIFT32BIT(val); + m_uHi = 0; + m_uFlags = 0; +} +CFX_Decimal::CFX_Decimal(FX_UINT32 val) +{ + m_uLo = (FX_UINT32)val; + m_uMid = m_uHi = 0; + m_uFlags = 0; +} +CFX_Decimal::CFX_Decimal(FX_UINT32 lo, FX_UINT32 mid, FX_UINT32 hi, FX_BOOL neg, FX_UINT8 scale) +{ + scale = (scale > FXMATH_DECIMAL_SCALELIMIT ? 0 : scale); + m_uLo = lo; + m_uMid = mid; + m_uHi = hi; + m_uFlags = FXMATH_DECIMAL_MAKEFLAGS(neg && IsNotZero(), scale); +} +CFX_Decimal::CFX_Decimal(FX_INT32 val) +{ + if(val >= 0) { + *this = CFX_Decimal((FX_UINT32)val); + } else { + *this = CFX_Decimal((FX_UINT32) - val); + SetNegate(); + } +} +CFX_Decimal::CFX_Decimal(FX_INT64 val) +{ + if(val >= 0) { + *this = CFX_Decimal((FX_UINT64)val); + } else { + *this = CFX_Decimal((FX_UINT64) - val); + SetNegate(); + } +} +CFX_Decimal::CFX_Decimal(FX_FLOAT val, FX_UINT8 scale ) +{ + FX_FLOAT newval = fabs(val); + FX_UINT64 phi, pmid, plo; + plo = (FX_UINT64)newval; + pmid = (FX_UINT64)(newval / 1e32); + phi = (FX_UINT64)(newval / 1e64); + newval = FXSYS_fmod(newval, 1.0f); + for(FX_UINT8 iter = 0; iter < scale; iter++) { + fxmath_decimal_helper_mul10(phi, pmid, plo); + newval *= 10; + plo += (FX_UINT64)newval; + newval = FXSYS_fmod(newval, 1.0f); + } + plo += FXSYS_round(newval); + fxmath_decimal_helper_normalize(phi, pmid, plo); + m_uHi = (FX_UINT32)phi; + m_uMid = (FX_UINT32)pmid; + m_uLo = (FX_UINT32)plo; + m_uFlags = FXMATH_DECIMAL_MAKEFLAGS(val < 0 && IsNotZero(), scale); +} +CFX_Decimal::CFX_Decimal(FX_WSTR strObj) +{ + FX_LPCWSTR str = strObj.GetPtr(); + FX_LPCWSTR strBound = str + strObj.GetLength(); + FX_BOOL pointmet = 0; + FX_BOOL negmet = 0; + FX_UINT8 scale = 0; + m_uHi = m_uMid = m_uLo = 0; + while (str != strBound && *str == ' ') { + str++; + } + if (str != strBound && *str == '-') { + negmet = 1; + str++; + } else if (str != strBound && *str == '+') { + str++; + } + while (str != strBound && ((*str >= '0' && *str <= '9') || *str == '.') && scale < FXMATH_DECIMAL_SCALELIMIT) { + if (*str == '.') { + if(pointmet) { + goto cont; + } + pointmet = 1; + } else { + m_uHi = m_uHi * 0xA + FXMATH_DECIMAL_RSHIFT32BIT((FX_UINT64)m_uMid * 0xA); + m_uMid = m_uMid * 0xA + FXMATH_DECIMAL_RSHIFT32BIT((FX_UINT64)m_uLo * 0xA); + m_uLo = m_uLo * 0xA + (*str - '0'); + if(pointmet) { + scale++; + } + } +cont: + str++; + } + m_uFlags = FXMATH_DECIMAL_MAKEFLAGS(negmet && IsNotZero(), scale); +} +CFX_Decimal::CFX_Decimal(FX_BSTR strObj) +{ + CFX_WideString wstrObj; + wstrObj.ConvertFrom(strObj); + *this = CFX_Decimal(wstrObj); +} +CFX_Decimal::operator CFX_WideString() const +{ + CFX_WideString retString; + CFX_WideString tmpbuf; + FX_UINT64 phi = m_uHi, pmid = m_uMid, plo = m_uLo; + while(phi || pmid || plo) { + tmpbuf += fxmath_decimal_helper_div10(phi, pmid, plo) + '0'; + } + FX_UINT8 outputlen = (FX_UINT8)tmpbuf.GetLength(); + FX_UINT8 scale = (FX_UINT8)FXMATH_DECIMAL_FLAGS2SCALE(m_uFlags); + while (scale >= outputlen) { + tmpbuf += '0'; + outputlen++; + } + if (FXMATH_DECIMAL_FLAGS2NEG(m_uFlags) && IsNotZero()) { + retString += '-'; + } + for (FX_UINT8 idx = 0; idx < outputlen; idx++) { + if (idx == (outputlen - scale) && scale != 0) { + retString += '.'; + } + retString += tmpbuf[outputlen - 1 - idx]; + } + return retString; +} +CFX_Decimal::operator double() const +{ + double pow = (double)(1 << 16) * (1 << 16); + double base = ((double)m_uHi) * pow * pow + ((double)m_uMid) * pow + ((double)m_uLo); + FX_INT8 scale = FXMATH_DECIMAL_FLAGS2SCALE(m_uFlags); + FX_BOOL bNeg = FXMATH_DECIMAL_FLAGS2NEG(m_uFlags); + return (bNeg ? -1 : 1) * base * ::pow(10.0, -scale); +} +void CFX_Decimal::SetScale(FX_UINT8 newscale) +{ + FX_UINT8 oldscale = FXMATH_DECIMAL_FLAGS2SCALE(m_uFlags); + if (newscale > oldscale) { + FX_UINT64 phi = m_uHi, pmid = m_uMid, plo = m_uLo; + for (FX_UINT8 iter = 0; iter < newscale - oldscale; iter++) { + fxmath_decimal_helper_mul10(phi, pmid, plo); + } + m_uHi = (FX_UINT32)phi; + m_uMid = (FX_UINT32)pmid; + m_uLo = (FX_UINT32)plo; + m_uFlags = FXMATH_DECIMAL_MAKEFLAGS(FXMATH_DECIMAL_FLAGS2NEG(m_uFlags) && IsNotZero(), newscale); + } else if (newscale < oldscale) { + FX_UINT64 phi, pmid, plo; + phi = 0, pmid = 0, plo = 5; + { + for(FX_UINT8 iter = 0; iter < oldscale - newscale - 1; iter++) { + fxmath_decimal_helper_mul10(phi, pmid, plo); + } + } + phi += m_uHi; + pmid += m_uMid; + plo += m_uLo; + fxmath_decimal_helper_normalize(phi, pmid, plo); + { + for(FX_UINT8 iter = 0; iter < oldscale - newscale; iter++) { + fxmath_decimal_helper_div10(phi, pmid, plo); + } + } + m_uHi = (FX_UINT32)phi; + m_uMid = (FX_UINT32)pmid; + m_uLo = (FX_UINT32)plo; + m_uFlags = FXMATH_DECIMAL_MAKEFLAGS(FXMATH_DECIMAL_FLAGS2NEG(m_uFlags) && IsNotZero(), newscale); + } +} +FX_UINT8 CFX_Decimal::GetScale() +{ + FX_UINT8 oldscale = FXMATH_DECIMAL_FLAGS2SCALE(m_uFlags); + return oldscale; +} +void CFX_Decimal::SetAbs() +{ + m_uFlags &= ~FXMATH_DECIMAL_NEGMASK; +} +void CFX_Decimal::SetNegate() +{ + if(IsNotZero()) { + m_uFlags ^= FXMATH_DECIMAL_NEGMASK; + } +} +void CFX_Decimal::FloorOrCeil(FX_BOOL bFloor) +{ + FX_UINT64 nums[3] = {m_uLo, m_uMid, m_uHi}; + FX_BOOL bDataLoss = FALSE; + for(int i = FXMATH_DECIMAL_FLAGS2SCALE(m_uFlags); i > 0; i --) { + bDataLoss = fxmath_decimal_helper_div10_any(nums, 3) || bDataLoss; + } + if(bDataLoss && (bFloor ? FXMATH_DECIMAL_FLAGS2NEG(m_uFlags) : !FXMATH_DECIMAL_FLAGS2NEG(m_uFlags))) { + fxmath_decimal_helper_inc_any(nums, 3); + } + m_uHi = (FX_UINT32)nums[2]; + m_uMid = (FX_UINT32)nums[1]; + m_uLo = (FX_UINT32)nums[0]; + m_uFlags = FXMATH_DECIMAL_MAKEFLAGS(FXMATH_DECIMAL_FLAGS2NEG(m_uFlags) && IsNotZero(), 0); +} +void CFX_Decimal::SetFloor() +{ + FloorOrCeil(TRUE); +} +void CFX_Decimal::SetCeiling() +{ + FloorOrCeil(FALSE); +} +void CFX_Decimal::SetTruncate() +{ + FloorOrCeil(!FXMATH_DECIMAL_FLAGS2NEG(m_uFlags)); +} +void CFX_Decimal::Swap(CFX_Decimal& val) +{ + FX_UINT32 tmp; + tmp = m_uHi; + m_uHi = val.m_uHi; + val.m_uHi = tmp; + tmp = m_uMid; + m_uMid = val.m_uMid; + val.m_uMid = tmp; + tmp = m_uLo; + m_uLo = val.m_uLo; + val.m_uLo = tmp; + tmp = m_uFlags; + m_uFlags = val.m_uFlags; + val.m_uFlags = tmp; +} +FX_INT8 CFX_Decimal::Compare (const CFX_Decimal& val) const +{ + CFX_Decimal lhs = *this, rhs = val; + FX_INT8 retVal = 0; + if (FXMATH_DECIMAL_FLAGS2SCALE(lhs.m_uFlags) != FXMATH_DECIMAL_FLAGS2SCALE(rhs.m_uFlags)) { + FX_UINT8 scale = FX_MIN(FXMATH_DECIMAL_FLAGS2SCALE(lhs.m_uFlags), FXMATH_DECIMAL_FLAGS2SCALE(rhs.m_uFlags)); + lhs.SetScale(scale); + rhs.SetScale(scale); + } + retVal = - (FXMATH_DECIMAL_FLAGS2NEG(lhs.m_uFlags) - FXMATH_DECIMAL_FLAGS2NEG(rhs.m_uFlags)); + if (retVal) { + return retVal; + } + retVal = fxmath_decimal_helper_raw_compare(lhs.m_uHi, lhs.m_uMid, lhs.m_uLo, rhs.m_uHi, rhs.m_uMid, rhs.m_uLo); + return (FXMATH_DECIMAL_FLAGS2NEG(lhs.m_uFlags) ? - retVal : retVal); +} +CFX_Decimal CFX_Decimal::AddOrMinus(const CFX_Decimal& val, FX_BOOL isAdding) const +{ + CFX_Decimal lhs = *this, rhs = val; + if (FXMATH_DECIMAL_FLAGS2SCALE(lhs.m_uFlags) != FXMATH_DECIMAL_FLAGS2SCALE(rhs.m_uFlags)) { + FX_UINT8 scale = FX_MAX(FXMATH_DECIMAL_FLAGS2SCALE(lhs.m_uFlags), FXMATH_DECIMAL_FLAGS2SCALE(rhs.m_uFlags)); + lhs.SetScale(scale); + rhs.SetScale(scale); + } + if(!isAdding) { + rhs.SetNegate(); + } + FX_BOOL doRawAdd = (FXMATH_DECIMAL_FLAGS2NEG(lhs.m_uFlags) == FXMATH_DECIMAL_FLAGS2NEG(rhs.m_uFlags)); + if (doRawAdd) { + FX_UINT64 phi = lhs.m_uHi, pmid = lhs.m_uMid, plo = lhs.m_uLo; + phi += rhs.m_uHi; + pmid += rhs.m_uMid; + plo += rhs.m_uLo; + fxmath_decimal_helper_normalize(phi, pmid, plo); + if(FXMATH_DECIMAL_RSHIFT32BIT(phi) && FXMATH_DECIMAL_FLAGS2SCALE(lhs.m_uFlags) != 0) { + fxmath_decimal_helper_div10(phi, pmid, plo); + lhs.m_uFlags = FXMATH_DECIMAL_MAKEFLAGS(FXMATH_DECIMAL_FLAGS2NEG(lhs.m_uFlags), FXMATH_DECIMAL_FLAGS2SCALE(lhs.m_uFlags) - 1); + } + lhs.m_uHi = (FX_UINT32)phi; + lhs.m_uMid = (FX_UINT32)pmid; + lhs.m_uLo = (FX_UINT32)plo; + return lhs; + } else { + if(fxmath_decimal_helper_raw_compare(lhs.m_uHi, lhs.m_uMid, lhs.m_uLo, rhs.m_uHi, rhs.m_uMid, rhs.m_uLo) < 0) { + lhs.Swap(rhs); + } + lhs.m_uHi -= rhs.m_uHi; + if(lhs.m_uMid < rhs.m_uMid) { + lhs.m_uHi--; + } + lhs.m_uMid -= rhs.m_uMid; + if(lhs.m_uLo < rhs.m_uLo) { + if(!lhs.m_uMid) { + lhs.m_uHi--; + } + lhs.m_uMid--; + } + lhs.m_uLo -= rhs.m_uLo; + return lhs; + } +} +CFX_Decimal CFX_Decimal::Multiply(const CFX_Decimal& val) const +{ + FX_UINT64 a[3] = {m_uLo, m_uMid, m_uHi}, b[3] = {val.m_uLo, val.m_uMid, val.m_uHi}; + FX_UINT64 c[6]; + fxmath_decimal_helper_raw_mul(a, 3, b, 3, c, 6); + FX_BOOL neg = FXMATH_DECIMAL_FLAGS2NEG(m_uFlags) ^ FXMATH_DECIMAL_FLAGS2NEG(val.m_uFlags); + FX_UINT8 scale = FXMATH_DECIMAL_FLAGS2SCALE(m_uFlags) + FXMATH_DECIMAL_FLAGS2SCALE(val.m_uFlags); + fxmath_decimal_helper_shrinkintorange(c, 6, 3, scale); + return CFX_Decimal((FX_UINT32)c[0], (FX_UINT32)c[1], (FX_UINT32)c[2], neg, scale); +} +CFX_Decimal CFX_Decimal::Divide(const CFX_Decimal& val) const +{ + if(!val.IsNotZero()) { + return CFX_Decimal(); + } + FX_BOOL neg = FXMATH_DECIMAL_FLAGS2NEG(m_uFlags) ^ FXMATH_DECIMAL_FLAGS2NEG(val.m_uFlags); + FX_UINT64 a[7] = {m_uLo, m_uMid, m_uHi}, b[3] = {val.m_uLo, val.m_uMid, val.m_uHi}, c[7] = {0}; + FX_UINT8 scale = 0; + if(FXMATH_DECIMAL_FLAGS2SCALE(m_uFlags) < FXMATH_DECIMAL_FLAGS2SCALE(val.m_uFlags)) { + for(int i = FXMATH_DECIMAL_FLAGS2SCALE(val.m_uFlags) - FXMATH_DECIMAL_FLAGS2SCALE(m_uFlags); i > 0; i--) { + fxmath_decimal_helper_mul10_any(a, 7); + } + } else { + scale = FXMATH_DECIMAL_FLAGS2SCALE(m_uFlags) - FXMATH_DECIMAL_FLAGS2SCALE(val.m_uFlags); + } + FX_UINT8 minscale = scale; + if(!IsNotZero()) { + return CFX_Decimal(0, 0, 0, 0, minscale); + } + while(!a[6]) { + fxmath_decimal_helper_mul10_any(a, 7); + scale++; + } + fxmath_decimal_helper_div10_any(a, 7); + scale--; + fxmath_decimal_helper_raw_div(a, 6, b, 3, c, 7); + fxmath_decimal_helper_shrinkintorange(c, 6, 3, scale); + fxmath_decimal_helper_truncate(c[2], c[1], c[0], scale, minscale); + return CFX_Decimal((FX_UINT32)c[0], (FX_UINT32)c[1], (FX_UINT32)c[2], neg, scale); +} +CFX_Decimal CFX_Decimal::Modulus(const CFX_Decimal& val) const +{ + CFX_Decimal lhs = *this, rhs_abs = val; + rhs_abs.SetAbs(); + if(!rhs_abs.IsNotZero()) { + return *this; + } + while(TRUE) { + CFX_Decimal lhs_abs = lhs; + lhs_abs.SetAbs(); + if(lhs_abs < rhs_abs) { + break; + } + CFX_Decimal quot = lhs / rhs_abs; + quot.SetTruncate(); + lhs = lhs - quot * rhs_abs; + } + return lhs; +} +FX_BOOL CFX_Decimal::operator == (const CFX_Decimal& val) const +{ + return Compare(val) == 0; +} +FX_BOOL CFX_Decimal::operator <= (const CFX_Decimal& val) const +{ + return Compare(val) <= 0; +} +FX_BOOL CFX_Decimal::operator >= (const CFX_Decimal& val) const +{ + return Compare(val) >= 0; +} +FX_BOOL CFX_Decimal::operator != (const CFX_Decimal& val) const +{ + return Compare(val) != 0; +} +FX_BOOL CFX_Decimal::operator < (const CFX_Decimal& val) const +{ + return Compare(val) < 0; +} +FX_BOOL CFX_Decimal::operator > (const CFX_Decimal& val) const +{ + return Compare(val) > 0; +} +CFX_Decimal CFX_Decimal::operator + (const CFX_Decimal& val) const +{ + return AddOrMinus(val, TRUE); +} +CFX_Decimal CFX_Decimal::operator - (const CFX_Decimal& val) const +{ + return AddOrMinus(val, FALSE); +} +CFX_Decimal CFX_Decimal::operator * (const CFX_Decimal& val) const +{ + return Multiply(val); +} +CFX_Decimal CFX_Decimal::operator / (const CFX_Decimal& val) const +{ + return Divide(val); +} +CFX_Decimal CFX_Decimal::operator % (const CFX_Decimal& val) const +{ + return Modulus(val); +} diff --git a/xfa/src/fgas/src/localization/fx_localeimp.h b/xfa/src/fgas/src/localization/fx_localeimp.h new file mode 100644 index 0000000000..7698388020 --- /dev/null +++ b/xfa/src/fgas/src/localization/fx_localeimp.h @@ -0,0 +1,74 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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_LOCALE_IMP_H_ +#define _FX_LOCALE_IMP_H_ +class CFX_LCNumeric; +class CFX_Locale : public IFX_Locale, public CFX_Object +{ +public: + CFX_Locale(CXML_Element* pLocaleData); + virtual void Release() + { + delete this; + } + + virtual CFX_WideString GetName(); + virtual void GetNumbericSymbol(FX_LOCALENUMSYMBOL eType, CFX_WideString& wsNumSymbol) const; + + virtual void GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const; + virtual void GetMonthName(FX_INT32 nMonth, CFX_WideString& wsMonthName, FX_BOOL bAbbr = TRUE) const; + virtual void GetDayName(FX_INT32 nWeek, CFX_WideString& wsDayName, FX_BOOL bAbbr = TRUE) const; + virtual void GetMeridiemName(CFX_WideString& wsMeridiemName, FX_BOOL bAM = TRUE) const; + virtual void GetTimeZone(FX_TIMEZONE& tz) const; + virtual void GetEraName(CFX_WideString& wsEraName, FX_BOOL bAD = TRUE) const; + + virtual void GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType, CFX_WideString& wsPattern) const; + virtual void GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType, CFX_WideString& wsPattern) const; + virtual void GetNumPattern(FX_LOCALENUMSUBCATEGORY eType, CFX_WideString& wsPattern) const; +protected: + virtual ~CFX_Locale(); + CXML_Element* m_pElement; +}; +class CFX_FormatString : public IFX_FormatString, public CFX_Object +{ +public: + CFX_FormatString(IFX_LocaleMgr* pLocaleMgr, FX_BOOL bUseLCID); + virtual void Release() + { + delete this; + } + + virtual void SplitFormatString(const CFX_WideString& wsFormatString, CFX_WideStringArray& wsPatterns); + virtual FX_LOCALECATEGORY GetCategory(const CFX_WideString& wsPattern); + virtual FX_WORD GetLCID(const CFX_WideString& wsPattern); + virtual CFX_WideString GetLocaleName(const CFX_WideString& wsPattern); + virtual FX_BOOL ParseText(const CFX_WideString& wsSrcText, const CFX_WideString& wsPattern, CFX_WideString& wsValue); + virtual FX_BOOL ParseNum(const CFX_WideString& wsSrcNum, const CFX_WideString& wsPattern, FX_FLOAT &fValue); + virtual FX_BOOL ParseNum(const CFX_WideString& wsSrcNum, const CFX_WideString& wsPattern, CFX_WideString &wsValue); + virtual FX_BOOL ParseDateTime(const CFX_WideString& wsSrcDateTime, const CFX_WideString& wsPattern, FX_DATETIMETYPE eDateTimeType, CFX_Unitime& dtValue); + virtual FX_BOOL ParseZero(const CFX_WideString& wsSrcText, const CFX_WideString& wsPattern); + virtual FX_BOOL ParseNull(const CFX_WideString& wsSrcText, const CFX_WideString& wsPattern); + virtual FX_BOOL FormatText(const CFX_WideString& wsSrcText, const CFX_WideString& wsPattern, CFX_WideString& wsOutput); + virtual FX_BOOL FormatNum(const CFX_WideString& wsSrcNum, const CFX_WideString& wsPattern, CFX_WideString& wsOutput); + virtual FX_BOOL FormatNum(FX_FLOAT fNum, const CFX_WideString& wsPattern, CFX_WideString& wsOutput); + virtual FX_BOOL FormatDateTime(const CFX_WideString& wsSrcDateTime, const CFX_WideString& wsPattern, CFX_WideString& wsOutput); + virtual FX_BOOL FormatDateTime(const CFX_WideString& wsSrcDateTime, const CFX_WideString& wsPattern, CFX_WideString& wsOutput, FX_DATETIMETYPE eDateTimeType); + virtual FX_BOOL FormatDateTime(const CFX_Unitime& dt, const CFX_WideString& wsPattern, CFX_WideString& wsOutput); + virtual FX_BOOL FormatZero(const CFX_WideString& wsPattern, CFX_WideString& wsOutput); + virtual FX_BOOL FormatNull(const CFX_WideString& wsPattern, CFX_WideString& wsOutput); +protected: + virtual ~CFX_FormatString(); + IFX_Locale* GetTextFormat(const CFX_WideString &wsPattern, FX_WSTR wsCategory, CFX_WideString& wsPurgePattern); + IFX_Locale* GetNumericFormat(const CFX_WideString& wsPattern, FX_INT32& iDotIndex, FX_DWORD& dwStyle, CFX_WideString& wsPurgePattern); + FX_BOOL FormatStrNum(FX_WSTR wsInputNum, const CFX_WideString& wsPattern, CFX_WideString& wsOutput); + FX_BOOL FormatLCNumeric(CFX_LCNumeric& lcNum, const CFX_WideString& wsPattern, CFX_WideString& wsOutput); + FX_DATETIMETYPE GetDateTimeFormat(const CFX_WideString& wsPattern, IFX_Locale*& pLocale, CFX_WideString &wsDatePattern, CFX_WideString &wsTimePattern); + IFX_Locale* GetPatternLocale(FX_WSTR wsLocale); + IFX_LocaleMgr* m_pLocaleMgr; + FX_BOOL m_bUseLCID; +}; +#endif diff --git a/xfa/src/fgas/src/localization/fx_localemgr.cpp b/xfa/src/fgas/src/localization/fx_localemgr.cpp new file mode 100644 index 0000000000..3b93f101a3 --- /dev/null +++ b/xfa/src/fgas/src/localization/fx_localemgr.cpp @@ -0,0 +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 + +#include "../fgas_base.h" +#include "fx_localemgr.h" +IFX_LocaleMgr* FX_LocaleMgr_Create(FX_LPCWSTR pszLocalPath, FX_WORD wDefaultLCID) +{ + void* pPathHandle = FX_OpenFolder(pszLocalPath); + if (!pPathHandle) { + return NULL; + } + CFX_LocaleMgr* pLocaleMgr = FX_NEW CFX_LocaleMgr(wDefaultLCID); + CFX_WideString wsFileName; + FX_BOOL bFolder = FALSE; + while (FX_GetNextFile(pPathHandle, wsFileName, bFolder)) { + if (!bFolder) { + if (wsFileName.GetLength() < 4) { + continue; + } + CFX_WideString wsExt = wsFileName.Right(4); + wsExt.MakeLower(); + if (wsExt != L".xml") { + continue; + } + CFX_WideString wsFullPath(pszLocalPath); + wsFullPath += L"\\" + wsFileName; + IFX_FileRead* pRead = FX_CreateFileRead(wsFullPath); + if (!pRead) { + continue; + } + CXML_Element* pXmlLocale = CXML_Element::Parse(pRead); + pRead->Release(); + CFX_ByteString bssp = pXmlLocale->GetNamespace(); + if (bssp == "http://www.foxitsoftware.com/localization") { + CFX_WideString wsLCID = pXmlLocale->GetAttrValue("", "lcid"); + wchar_t* pEnd = NULL; + FX_DWORD dwLCID = wcstol(wsLCID, &pEnd, 16); + if (pLocaleMgr->m_lcid2xml.GetValueAt((FX_LPVOID)(FX_UINTPTR)dwLCID)) { + delete pXmlLocale; + } else { + pLocaleMgr->m_lcid2xml.SetAt((FX_LPVOID)(FX_UINTPTR)dwLCID, pXmlLocale); + } + } else { + delete pXmlLocale; + } + } + } + FX_CloseFolder(pPathHandle); + return pLocaleMgr; +} +CFX_LocaleMgr::CFX_LocaleMgr(FX_WORD wDefLCID) + : m_wDefLCID(wDefLCID) +{ +} +CFX_LocaleMgr::~CFX_LocaleMgr() +{ + FX_POSITION ps = m_lcid2locale.GetStartPosition(); + while (ps) { + FX_LPVOID plcid; + IFX_Locale* pLocale = NULL; + m_lcid2locale.GetNextAssoc(ps, plcid, (void*&)pLocale); + pLocale->Release(); + } + m_lcid2locale.RemoveAll(); + ps = m_lcid2xml.GetStartPosition(); + while (ps) { + FX_LPVOID plcid; + CXML_Element* pxml = NULL; + m_lcid2xml.GetNextAssoc(ps, plcid, (void*&)pxml); + delete pxml; + } + m_lcid2xml.RemoveAll(); +} +FX_WORD CFX_LocaleMgr::GetDefLocaleID() +{ + return m_wDefLCID; +} +IFX_Locale* CFX_LocaleMgr::GetDefLocale() +{ + return GetLocale(m_wDefLCID); +} +IFX_Locale* CFX_LocaleMgr::GetLocale(FX_WORD lcid) +{ + IFX_Locale* pLocale = (IFX_Locale*)m_lcid2locale.GetValueAt((FX_LPVOID)(FX_UINTPTR)lcid); + if (!pLocale) { + CXML_Element* pxml = (CXML_Element*)m_lcid2xml.GetValueAt((FX_LPVOID)(FX_UINTPTR)lcid); + if (pxml) { + pLocale = IFX_Locale::Create(pxml); + m_lcid2locale.SetAt((FX_LPVOID)(FX_UINTPTR)lcid, pLocale); + } + } + return pLocale; +} +IFX_Locale* CFX_LocaleMgr::GetLocaleByName(FX_WSTR wsLocaleName) +{ + return NULL; +} diff --git a/xfa/src/fgas/src/localization/fx_localemgr.h b/xfa/src/fgas/src/localization/fx_localemgr.h new file mode 100644 index 0000000000..b23940e8d5 --- /dev/null +++ b/xfa/src/fgas/src/localization/fx_localemgr.h @@ -0,0 +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 + +#ifndef _FX_LOCALEMGR_IMP_H_ +#define _FX_LOCALEMGR_IMP_H_ +class CFX_LocaleMgr : public IFX_LocaleMgr, public CFX_Object +{ +public: + CFX_LocaleMgr(FX_WORD wDefLCID); + virtual void Release() + { + delete this; + } + virtual FX_WORD GetDefLocaleID(); + virtual IFX_Locale* GetDefLocale(); + virtual IFX_Locale* GetLocale(FX_WORD lcid); + virtual IFX_Locale* GetLocaleByName(FX_WSTR wsLocaleName); + CFX_MapPtrToPtr m_lcid2xml; +protected: + ~CFX_LocaleMgr(); + CFX_MapPtrToPtr m_lcid2locale; + FX_WORD m_wDefLCID; +}; +#endif diff --git a/xfa/src/fgas/src/xml/fx_sax_imp.cpp b/xfa/src/fgas/src/xml/fx_sax_imp.cpp new file mode 100644 index 0000000000..b41ee3fef4 --- /dev/null +++ b/xfa/src/fgas/src/xml/fx_sax_imp.cpp @@ -0,0 +1,720 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../fgas_base.h" +#include "fx_sax_imp.h" +IFX_SAXReader* FX_SAXReader_Create() +{ + return FX_NEW CFX_SAXReader; +} +CFX_SAXFile::CFX_SAXFile() + : m_pFile(NULL) + , m_dwStart(0) + , m_dwEnd(0) + , m_dwCur(0) + , m_pBuf(NULL) + , m_dwBufSize(0) + , m_dwBufIndex(0) +{ +} +FX_BOOL CFX_SAXFile::StartFile(IFX_FileRead *pFile, FX_DWORD dwStart, FX_DWORD dwLen) +{ + FXSYS_assert(m_pFile == NULL && pFile != NULL); + FX_DWORD dwSize = pFile->GetSize(); + if (dwStart >= dwSize) { + return FALSE; + } + if (dwLen == -1 || dwStart + dwLen > dwSize) { + dwLen = dwSize - dwStart; + } + if (dwLen == 0) { + return FALSE; + } + m_dwBufSize = FX_MIN(dwLen, FX_SAXFILE_BUFSIZE); + m_pBuf = FX_Alloc(FX_BYTE, m_dwBufSize); + if (!m_pBuf) { + return FALSE; + } + if (!pFile->ReadBlock(m_pBuf, dwStart, m_dwBufSize)) { + return FALSE; + } + m_dwStart = dwStart; + m_dwEnd = dwStart + dwLen; + m_dwCur = dwStart; + m_pFile = pFile; + m_dwBufIndex = 0; + return TRUE; +} +FX_BOOL CFX_SAXFile::ReadNextBlock() +{ + FXSYS_assert(m_pFile != NULL); + FX_DWORD dwSize = m_dwEnd - m_dwCur; + if (dwSize == 0) { + return FALSE; + } + m_dwBufSize = FX_MIN(dwSize, FX_SAXFILE_BUFSIZE); + if (!m_pFile->ReadBlock(m_pBuf, m_dwCur, m_dwBufSize)) { + return FALSE; + } + m_dwBufIndex = 0; + return TRUE; +} +void CFX_SAXFile::Reset() +{ + if (m_pBuf) { + FX_Free(m_pBuf); + m_pBuf = NULL; + } + m_pFile = NULL; +} +#define FX_SAXCHARTYPE_Normal 0 +#define FX_SAXCHARTYPE_Space 1 +static FX_BYTE g_SAX_CharType[256] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; +CFX_SAXReader::CFX_SAXReader() + : m_File() + , m_pHandler(NULL) + , m_iState(-1) + , m_pRoot(NULL) + , m_pCurItem(NULL) + , m_dwItemID(0) + , m_iDataSize(256) + , m_iNameSize(256) + , m_pCommentContext(NULL) + , m_dwParseMode(0) +{ + m_pszData = (FX_LPBYTE)FX_Alloc(FX_BYTE, m_iDataSize); + m_pszName = (FX_LPBYTE)FX_Alloc(FX_BYTE, m_iNameSize); +} +CFX_SAXReader::~CFX_SAXReader() +{ + Reset(); + if (m_pszData) { + FX_Free(m_pszData); + m_pszData = NULL; + } + if (m_pszName) { + FX_Free(m_pszName); + m_pszName = NULL; + } +} +void CFX_SAXReader::Reset() +{ + m_File.Reset(); + CFX_SAXItem *pItem = m_pRoot; + while (pItem) { + CFX_SAXItem *pNext = pItem->m_pNext; + delete pItem; + pItem = pNext; + } + m_pRoot = NULL; + m_pCurItem = NULL; + m_dwItemID = 0; + m_SkipStack.RemoveAll(); + m_SkipChar = 0; + m_iDataLength = 0; + m_iEntityStart = -1; + m_iNameLength = 0; + m_iDataPos = 0; + if (m_pCommentContext) { + delete m_pCommentContext; + m_pCommentContext = NULL; + } +} +inline void CFX_SAXReader::Push() +{ + CFX_SAXItem *pNew = FX_NEW CFX_SAXItem; + pNew->m_dwID = ++m_dwItemID; + pNew->m_bSkip = m_pCurItem->m_bSkip; + pNew->m_pPrev = m_pCurItem; + m_pCurItem->m_pNext = pNew; + m_pCurItem = pNew; +} +inline void CFX_SAXReader::Pop() +{ + if (!m_pCurItem) { + return; + } + CFX_SAXItem *pPrev = m_pCurItem->m_pPrev; + pPrev->m_pNext = NULL; + delete m_pCurItem; + m_pCurItem = pPrev; +} +inline void CFX_SAXReader::AppendData(FX_BYTE ch) +{ + ReallocDataBuffer(); + m_pszData[m_iDataPos++] = ch; +} +inline void CFX_SAXReader::AppendName(FX_BYTE ch) +{ + ReallocNameBuffer(); + m_pszName[m_iDataPos++] = ch; +} +void CFX_SAXReader::ReallocDataBuffer() +{ + if (m_iDataPos < m_iDataSize) { + return; + } + if (m_iDataSize <= 1024 * 1024) { + m_iDataSize *= 2; + } else { + m_iDataSize += 1024 * 1024; + } + m_pszData = (FX_LPBYTE)FX_Realloc(FX_BYTE, m_pszData, m_iDataSize); +} +void CFX_SAXReader::ReallocNameBuffer() +{ + if (m_iDataPos < m_iNameSize) { + return; + } + if (m_iNameSize <= 1024 * 1024) { + m_iNameSize *= 2; + } else { + m_iNameSize += 1024 * 1024; + } + m_pszName = (FX_LPBYTE)FX_Realloc(FX_BYTE, m_pszName, m_iNameSize); +} +inline FX_BOOL CFX_SAXReader::SkipSpace(FX_BYTE ch) +{ + return (m_dwParseMode & FX_SAXPARSEMODE_NotSkipSpace) == 0 && ch < 0x21; +} +FX_INT32 CFX_SAXReader::StartParse(IFX_FileRead *pFile, FX_DWORD dwStart , FX_DWORD dwLen , FX_DWORD dwParseMode ) +{ + m_iState = -1; + Reset(); + if (!m_File.StartFile(pFile, dwStart, dwLen)) { + return -1; + } + m_iState = 0; + m_eMode = FX_SAXMODE_Text; + m_ePrevMode = FX_SAXMODE_Text; + m_bCharData = FALSE; + m_dwDataOffset = 0; + m_pRoot = m_pCurItem = FX_NEW CFX_SAXItem; + m_pCurItem->m_dwID = ++m_dwItemID; + m_dwParseMode = dwParseMode; + return 0; +} +typedef void (CFX_SAXReader::*FX_SAXReader_LPFParse)(); +static const FX_SAXReader_LPFParse g_FX_SAXReader_LPFParse[FX_SAXMODE_MAX] = { + &CFX_SAXReader::ParseText, + &CFX_SAXReader::ParseNodeStart, + &CFX_SAXReader::ParseDeclOrComment, + &CFX_SAXReader::ParseDeclNode, + &CFX_SAXReader::ParseComment, + &CFX_SAXReader::ParseCommentContent, + &CFX_SAXReader::ParseTagName, + &CFX_SAXReader::ParseTagAttributeName, + &CFX_SAXReader::ParseTagAttributeEqual, + &CFX_SAXReader::ParseTagAttributeValue, + &CFX_SAXReader::ParseMaybeClose, + &CFX_SAXReader::ParseTagClose, + &CFX_SAXReader::ParseTagEnd, + &CFX_SAXReader::ParseTargetData, +}; +FX_INT32 CFX_SAXReader::ContinueParse(IFX_Pause *pPause ) +{ + if (m_iState < 0 || m_iState > 99) { + return m_iState; + } + while(m_File.m_dwCur < m_File.m_dwEnd) { + FX_DWORD &index = m_File.m_dwBufIndex; + FX_DWORD size = m_File.m_dwBufSize; + FX_LPCBYTE pBuf = m_File.m_pBuf; + while (index < size) { + m_CurByte = pBuf[index]; + (this->*g_FX_SAXReader_LPFParse[m_eMode])(); + index ++; + } + m_File.m_dwCur += index; + m_iState = (m_File.m_dwCur - m_File.m_dwStart) * 100 / (m_File.m_dwEnd - m_File.m_dwStart); + if (m_File.m_dwCur >= m_File.m_dwEnd) { + break; + } + if (!m_File.ReadNextBlock()) { + m_iState = -2; + break; + } + m_dwDataOffset = 0; + if (pPause && pPause->NeedToPauseNow()) { + break; + } + } + return m_iState; +} +void CFX_SAXReader::ParseChar(FX_BYTE ch) +{ + ReallocDataBuffer(); + m_pszData[m_iDataPos] = ch; + if (m_iEntityStart > -1 && ch == ';') { + FX_INT32 iSaveEntityStart = m_iEntityStart; + CFX_ByteString csEntity(m_pszData + m_iEntityStart + 1, m_iDataPos - m_iEntityStart - 1); + FX_INT32 iLen = csEntity.GetLength(); + if (iLen > 0) { + if (csEntity[0] == '#') { + if ((m_dwParseMode & FX_SAXPARSEMODE_NotConvert_sharp) == 0) { + ch = 0; + FX_BYTE w; + if (iLen > 1 && csEntity[1] == 'x') { + for (FX_INT32 i = 2; i < iLen; i ++) { + w = csEntity[i]; + if (w >= '0' && w <= '9') { + ch = (ch << 4) + w - '0'; + } else if (w >= 'A' && w <= 'F') { + ch = (ch << 4) + w - 55; + } else if (w >= 'a' && w <= 'f') { + ch = (ch << 4) + w - 87; + } else { + break; + } + } + } else { + for (FX_INT32 i = 1; i < iLen; i ++) { + w = csEntity[i]; + if (w < '0' || w > '9') { + break; + } + ch = ch * 10 + w - '0'; + } + } + if (ch != 0) { + m_pszData[m_iEntityStart ++] = ch; + } + } + } else { + if (csEntity.Compare("amp") == 0) { + if ((m_dwParseMode & FX_SAXPARSEMODE_NotConvert_amp) == 0) { + m_pszData[m_iEntityStart ++] = '&'; + } + } else if (csEntity.Compare("lt") == 0) { + if ((m_dwParseMode & FX_SAXPARSEMODE_NotConvert_lt) == 0) { + m_pszData[m_iEntityStart ++] = '<'; + } + } else if (csEntity.Compare("gt") == 0) { + if ((m_dwParseMode & FX_SAXPARSEMODE_NotConvert_gt) == 0) { + m_pszData[m_iEntityStart ++] = '>'; + } + } else if (csEntity.Compare("apos") == 0) { + if ((m_dwParseMode & FX_SAXPARSEMODE_NotConvert_apos) == 0) { + m_pszData[m_iEntityStart ++] = '\''; + } + } else if (csEntity.Compare("quot") == 0) { + if ((m_dwParseMode & FX_SAXPARSEMODE_NotConvert_quot) == 0) { + m_pszData[m_iEntityStart ++] = '\"'; + } + } + } + } + if (iSaveEntityStart != m_iEntityStart) { + m_iDataPos = m_iEntityStart; + m_iEntityStart = -1; + } else { + m_iDataPos ++; + m_iEntityStart = -1; + } + } else { + if (m_iEntityStart < 0 && ch == '&') { + m_iEntityStart = m_iDataPos; + } + m_iDataPos ++; + } +} +void CFX_SAXReader::ParseText() +{ + if (m_CurByte == '<') { + if (m_iDataPos > 0) { + m_iDataLength = m_iDataPos; + m_iDataPos = 0; + if (m_pHandler) { + NotifyData(); + } + } + Push(); + m_dwNodePos = m_File.m_dwCur + m_File.m_dwBufIndex; + m_eMode = FX_SAXMODE_NodeStart; + return; + } + if (m_iDataPos < 1 && SkipSpace(m_CurByte)) { + return; + } + ParseChar(m_CurByte); +} +void CFX_SAXReader::ParseNodeStart() +{ + if (m_CurByte == '?') { + m_pCurItem->m_eNode = FX_SAXNODE_Instruction; + m_eMode = FX_SAXMODE_TagName; + return; + } + if (m_CurByte == '!') { + m_eMode = FX_SAXMODE_DeclOrComment; + return; + } + if (m_CurByte == '/') { + m_eMode = FX_SAXMODE_TagEnd; + return; + } + if (m_CurByte == '>') { + Pop(); + m_eMode = FX_SAXMODE_Text; + return; + } + if (m_CurByte > 0x20) { + m_dwDataOffset = m_File.m_dwBufIndex; + m_pCurItem->m_eNode = FX_SAXNODE_Tag; + m_eMode = FX_SAXMODE_TagName; + AppendData(m_CurByte); + } +} +void CFX_SAXReader::ParseDeclOrComment() +{ + if (m_CurByte == '-') { + m_eMode = FX_SAXMODE_Comment; + m_pCurItem->m_eNode = FX_SAXNODE_Comment; + if (m_pCommentContext == NULL) { + m_pCommentContext = FX_NEW CFX_SAXCommentContext; + } + m_pCommentContext->m_iHeaderCount = 1; + m_pCommentContext->m_iTailCount = 0; + } else { + m_eMode = FX_SAXMODE_DeclNode; + m_dwDataOffset = m_File.m_dwBufIndex; + m_SkipChar = '>'; + m_SkipStack.Add('>'); + SkipNode(); + } +} +void CFX_SAXReader::ParseComment() +{ + m_pCommentContext->m_iHeaderCount = 2; + m_dwNodePos = m_File.m_dwCur + m_File.m_dwBufIndex; + m_eMode = FX_SAXMODE_CommentContent; +} +void CFX_SAXReader::ParseCommentContent() +{ + if (m_CurByte == '-') { + m_pCommentContext->m_iTailCount++; + } else if (m_CurByte == '>' && m_pCommentContext->m_iTailCount == 2) { + m_iDataLength = m_iDataPos; + m_iDataPos = 0; + if (m_pHandler) { + NotifyTargetData(); + } + Pop(); + m_eMode = FX_SAXMODE_Text; + } else { + while (m_pCommentContext->m_iTailCount > 0) { + AppendData('-'); + m_pCommentContext->m_iTailCount--; + } + AppendData(m_CurByte); + } +} +void CFX_SAXReader::ParseDeclNode() +{ + SkipNode(); +} +void CFX_SAXReader::ParseTagName() +{ + if (m_CurByte < 0x21 || m_CurByte == '/' || m_CurByte == '>' || m_CurByte == '?') { + m_iDataLength = m_iDataPos; + m_iDataPos = 0; + if (m_pHandler) { + NotifyEnter(); + } + if (m_CurByte < 0x21) { + m_eMode = FX_SAXMODE_TagAttributeName; + } else if (m_CurByte == '/' || m_CurByte == '?') { + m_ePrevMode = m_eMode; + m_eMode = FX_SAXMODE_TagMaybeClose; + } else { + if (m_pHandler) { + NotifyBreak(); + } + m_eMode = FX_SAXMODE_Text; + } + } else { + AppendData(m_CurByte); + } +} +void CFX_SAXReader::ParseTagAttributeName() +{ + if (m_CurByte < 0x21 || m_CurByte == '=') { + if (m_iDataPos < 1 && m_CurByte < 0x21) { + return; + } + m_iNameLength = m_iDataPos; + m_iDataPos = 0; + m_SkipChar = 0; + m_eMode = m_CurByte == '=' ? FX_SAXMODE_TagAttributeValue : FX_SAXMODE_TagAttributeEqual; + return; + } + if (m_CurByte == '/' || m_CurByte == '>' || m_CurByte == '?') { + if (m_CurByte == '/' || m_CurByte == '?') { + m_ePrevMode = m_eMode; + m_eMode = FX_SAXMODE_TagMaybeClose; + } else { + if (m_pHandler) { + NotifyBreak(); + } + m_eMode = FX_SAXMODE_Text; + } + return; + } + if (m_iDataPos < 1) { + m_dwDataOffset = m_File.m_dwBufIndex; + } + AppendName(m_CurByte); +} +void CFX_SAXReader::ParseTagAttributeEqual() +{ + if (m_CurByte == '=') { + m_SkipChar = 0; + m_eMode = FX_SAXMODE_TagAttributeValue; + return; + } else if (m_pCurItem->m_eNode == FX_SAXNODE_Instruction) { + m_iDataPos = m_iNameLength; + AppendName(0x20); + m_eMode = FX_SAXMODE_TargetData; + ParseTargetData(); + } +} +void CFX_SAXReader::ParseTagAttributeValue() +{ + if (m_SkipChar) { + if (m_SkipChar == m_CurByte) { + { + m_iDataLength = m_iDataPos; + m_iDataPos = 0; + if (m_pHandler) { + NotifyAttribute(); + } + } + m_SkipChar = 0; + m_eMode = FX_SAXMODE_TagAttributeName; + return; + } + ParseChar(m_CurByte); + return; + } + if (m_CurByte < 0x21) { + return; + } + if (m_iDataPos < 1) { + if (m_CurByte == '\'' || m_CurByte == '\"') { + m_SkipChar = m_CurByte; + } + } +} +void CFX_SAXReader::ParseMaybeClose() +{ + if (m_CurByte == '>') { + if (m_pCurItem->m_eNode == FX_SAXNODE_Instruction) { + m_iNameLength = m_iDataPos; + m_iDataPos = 0; + if (m_pHandler) { + NotifyTargetData(); + } + } + ParseTagClose(); + m_eMode = FX_SAXMODE_Text; + } else if (m_ePrevMode == FX_SAXMODE_TagName) { + AppendData('/'); + m_eMode = FX_SAXMODE_TagName; + m_ePrevMode = FX_SAXMODE_Text; + ParseTagName(); + } else if (m_ePrevMode == FX_SAXMODE_TagAttributeName) { + AppendName('/'); + m_eMode = FX_SAXMODE_TagAttributeName; + m_ePrevMode = FX_SAXMODE_Text; + ParseTagAttributeName(); + } else if (m_ePrevMode == FX_SAXMODE_TargetData) { + AppendName('?'); + m_eMode = FX_SAXMODE_TargetData; + m_ePrevMode = FX_SAXMODE_Text; + ParseTargetData(); + } +} +void CFX_SAXReader::ParseTagClose() +{ + m_dwNodePos = m_File.m_dwCur + m_File.m_dwBufIndex; + if (m_pHandler) { + NotifyClose(); + } + Pop(); +} +void CFX_SAXReader::ParseTagEnd() +{ + if (m_CurByte < 0x21) { + return; + } + if (m_CurByte == '>') { + Pop(); + m_dwNodePos = m_File.m_dwCur + m_File.m_dwBufIndex; + m_iDataLength = m_iDataPos; + m_iDataPos = 0; + if (m_pHandler) { + NotifyEnd(); + } + Pop(); + m_eMode = FX_SAXMODE_Text; + } else { + ParseChar(m_CurByte); + } +} +void CFX_SAXReader::ParseTargetData() +{ + if (m_CurByte == '?') { + m_ePrevMode = m_eMode; + m_eMode = FX_SAXMODE_TagMaybeClose; + } else { + AppendName(m_CurByte); + } +} +void CFX_SAXReader::SkipNode() +{ + FX_INT32 iLen = m_SkipStack.GetSize(); + if (m_SkipChar == '\'' || m_SkipChar == '\"') { + if (m_CurByte != m_SkipChar) { + return; + } + iLen --; + FXSYS_assert(iLen > -1); + m_SkipStack.RemoveAt(iLen, 1); + m_SkipChar = iLen ? m_SkipStack[iLen - 1] : 0; + return; + } + switch (m_CurByte) { + case '<': + m_SkipChar = '>'; + m_SkipStack.Add('>'); + break; + case '[': + m_SkipChar = ']'; + m_SkipStack.Add(']'); + break; + case '(': + m_SkipChar = ')'; + m_SkipStack.Add(')'); + break; + case '\'': + m_SkipChar = '\''; + m_SkipStack.Add('\''); + break; + case '\"': + m_SkipChar = '\"'; + m_SkipStack.Add('\"'); + break; + default: + if (m_CurByte == m_SkipChar) { + iLen --; + m_SkipStack.RemoveAt(iLen, 1); + m_SkipChar = iLen ? m_SkipStack[iLen - 1] : 0; + if (iLen == 0 && m_CurByte == '>') { + m_iDataLength = m_iDataPos; + m_iDataPos = 0; + if (m_iDataLength >= 9 + && FXSYS_memcmp(m_pszData, "[CDATA[", 7 * sizeof(FX_BYTE)) == 0 + && FXSYS_memcmp(m_pszData + m_iDataLength - 2, "]]", 2 * sizeof(FX_BYTE)) == 0) { + Pop(); + m_iDataLength -= 9; + m_dwDataOffset += 7; + FXSYS_memmove(m_pszData , m_pszData + 7, m_iDataLength * sizeof(FX_BYTE)); + m_bCharData = TRUE; + if (m_pHandler) { + NotifyData(); + } + m_bCharData = FALSE; + } else { + Pop(); + } + m_eMode = FX_SAXMODE_Text; + } + } + break; + } + if (iLen > 0) { + ParseChar(m_CurByte); + } +} +void CFX_SAXReader::NotifyData() +{ + FXSYS_assert(m_pHandler != NULL); + if (m_pCurItem->m_eNode == FX_SAXNODE_Tag) + m_pHandler->OnTagData(m_pCurItem->m_pNode, m_bCharData ? FX_SAXNODE_CharData : FX_SAXNODE_Text, + CFX_ByteStringC(m_pszData, m_iDataLength), m_File.m_dwCur + m_dwDataOffset); +} +void CFX_SAXReader::NotifyEnter() +{ + FXSYS_assert(m_pHandler != NULL); + if (m_pCurItem->m_eNode == FX_SAXNODE_Tag || m_pCurItem->m_eNode == FX_SAXNODE_Instruction) { + m_pCurItem->m_pNode = m_pHandler->OnTagEnter(CFX_ByteStringC(m_pszData, m_iDataLength), m_pCurItem->m_eNode, m_dwNodePos); + } +} +void CFX_SAXReader::NotifyAttribute() +{ + FXSYS_assert(m_pHandler != NULL); + if (m_pCurItem->m_eNode == FX_SAXNODE_Tag || m_pCurItem->m_eNode == FX_SAXNODE_Instruction) { + m_pHandler->OnTagAttribute(m_pCurItem->m_pNode, CFX_ByteStringC(m_pszName, m_iNameLength), CFX_ByteStringC(m_pszData, m_iDataLength)); + } +} +void CFX_SAXReader::NotifyBreak() +{ + FXSYS_assert(m_pHandler != NULL); + if (m_pCurItem->m_eNode == FX_SAXNODE_Tag) { + m_pHandler->OnTagBreak(m_pCurItem->m_pNode); + } +} +void CFX_SAXReader::NotifyClose() +{ + FXSYS_assert(m_pHandler != NULL); + if (m_pCurItem->m_eNode == FX_SAXNODE_Tag || m_pCurItem->m_eNode == FX_SAXNODE_Instruction) { + m_pHandler->OnTagClose(m_pCurItem->m_pNode, m_dwNodePos); + } +} +void CFX_SAXReader::NotifyEnd() +{ + FXSYS_assert(m_pHandler != NULL); + if (m_pCurItem->m_eNode == FX_SAXNODE_Tag) { + m_pHandler->OnTagEnd(m_pCurItem->m_pNode, CFX_ByteStringC(m_pszData, m_iDataLength), m_dwNodePos); + } +} +void CFX_SAXReader::NotifyTargetData() +{ + FXSYS_assert(m_pHandler != NULL); + if (m_pCurItem->m_eNode == FX_SAXNODE_Instruction) { + m_pHandler->OnTargetData(m_pCurItem->m_pNode, m_pCurItem->m_eNode, CFX_ByteStringC(m_pszName, m_iNameLength), m_dwNodePos); + } else if (m_pCurItem->m_eNode == FX_SAXNODE_Comment) { + m_pHandler->OnTargetData(m_pCurItem->m_pNode, m_pCurItem->m_eNode, CFX_ByteStringC(m_pszData, m_iDataLength), m_dwNodePos); + } +} +void CFX_SAXReader::SkipCurrentNode() +{ + if (!m_pCurItem) { + return; + } + m_pCurItem->m_bSkip = TRUE; +} +void CFX_SAXReader::SetHandler(IFX_SAXReaderHandler *pHandler) +{ + m_pHandler = pHandler; +} diff --git a/xfa/src/fgas/src/xml/fx_sax_imp.h b/xfa/src/fgas/src/xml/fx_sax_imp.h new file mode 100644 index 0000000000..f18173183f --- /dev/null +++ b/xfa/src/fgas/src/xml/fx_sax_imp.h @@ -0,0 +1,140 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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_SAX_IMP_ +#define _FX_SAX_IMP_ +#define FX_SAXFILE_BUFSIZE 32768 +class CFX_SAXFile : public CFX_Object +{ +public: + CFX_SAXFile(); + FX_BOOL StartFile(IFX_FileRead *pFile, FX_DWORD dwStart, FX_DWORD dwLen); + FX_BOOL ReadNextBlock(); + void Reset(); + IFX_FileRead* m_pFile; + FX_DWORD m_dwStart; + FX_DWORD m_dwEnd; + FX_DWORD m_dwCur; + FX_LPBYTE m_pBuf; + FX_DWORD m_dwBufSize; + FX_DWORD m_dwBufIndex; +}; +enum FX_SAXMODE { + FX_SAXMODE_Text = 0, + FX_SAXMODE_NodeStart, + FX_SAXMODE_DeclOrComment, + FX_SAXMODE_DeclNode, + FX_SAXMODE_Comment, + FX_SAXMODE_CommentContent, + FX_SAXMODE_TagName, + FX_SAXMODE_TagAttributeName, + FX_SAXMODE_TagAttributeEqual, + FX_SAXMODE_TagAttributeValue, + FX_SAXMODE_TagMaybeClose, + FX_SAXMODE_TagClose, + FX_SAXMODE_TagEnd, + FX_SAXMODE_TargetData, + FX_SAXMODE_MAX, +}; +class CFX_SAXItem : public CFX_Object +{ +public: + CFX_SAXItem() : m_pNode(NULL) + , m_eNode(FX_SAXNODE_Unknown) + , m_dwID(0) + , m_bSkip(FALSE) + , m_pPrev(NULL) + , m_pNext(NULL) + {} + FX_LPVOID m_pNode; + FX_SAXNODE m_eNode; + FX_DWORD m_dwID; + FX_BOOL m_bSkip; + CFX_SAXItem* m_pPrev; + CFX_SAXItem* m_pNext; +}; +class CFX_SAXCommentContext : public CFX_Object +{ +public: + CFX_SAXCommentContext() : m_iHeaderCount(0) + , m_iTailCount(0) + { + } + FX_INT32 m_iHeaderCount; + FX_INT32 m_iTailCount; +}; +class CFX_SAXReader : public IFX_SAXReader, public CFX_Object +{ +public: + CFX_SAXReader(); + ~CFX_SAXReader(); + virtual void Release() + { + delete this; + } + virtual FX_INT32 StartParse(IFX_FileRead *pFile, FX_DWORD dwStart = 0, FX_DWORD dwLen = -1, FX_DWORD dwParseMode = 0); + virtual FX_INT32 ContinueParse(IFX_Pause *pPause = NULL); + virtual void SkipCurrentNode(); + virtual void SetHandler(IFX_SAXReaderHandler *pHandler); + void AppendData(FX_BYTE ch); + void AppendName(FX_BYTE ch); + void ParseText(); + void ParseNodeStart(); + void ParseInstruction(); + void ParseDeclOrComment(); + void ParseDeclNode(); + void ParseComment(); + void ParseCommentContent(); + void ParseTagName(); + void ParseTagAttributeName(); + void ParseTagAttributeEqual(); + void ParseTagAttributeValue(); + void ParseMaybeClose(); + void ParseTagClose(); + void ParseTagEnd(); + void ParseTargetData(); +protected: + CFX_SAXFile m_File; + IFX_SAXReaderHandler* m_pHandler; + FX_INT32 m_iState; + CFX_SAXItem* m_pRoot; + CFX_SAXItem* m_pCurItem; + FX_DWORD m_dwItemID; + FX_SAXMODE m_eMode; + FX_SAXMODE m_ePrevMode; + FX_BOOL m_bCharData; + FX_BYTE m_CurByte; + FX_DWORD m_dwDataOffset; + CFX_ByteArray m_SkipStack; + FX_BYTE m_SkipChar; + FX_DWORD m_dwNodePos; + FX_LPBYTE m_pszData; + FX_INT32 m_iDataSize; + FX_INT32 m_iDataLength; + FX_INT32 m_iEntityStart; + FX_INT32 m_iDataPos; + FX_LPBYTE m_pszName; + FX_INT32 m_iNameSize; + FX_INT32 m_iNameLength; + FX_DWORD m_dwParseMode; + CFX_SAXCommentContext *m_pCommentContext; + void Reset(); + void Push(); + void Pop(); + FX_BOOL SkipSpace(FX_BYTE ch); + void SkipNode(); + void NotifyData(); + void NotifyEnter(); + void NotifyAttribute(); + void NotifyBreak(); + void NotifyClose(); + void NotifyEnd(); + void NotifyTargetData(); + void ReallocDataBuffer(); + void ReallocNameBuffer(); + void ParseChar(FX_BYTE ch); +}; +#endif diff --git a/xfa/src/foxitlib.h b/xfa/src/foxitlib.h new file mode 100644 index 0000000000..f70c0770aa --- /dev/null +++ b/xfa/src/foxitlib.h @@ -0,0 +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 _FOXIT_LIB_H_ +#define _FOXIT_LIB_H_ +#include "../include/foxitxfa.h" +#include "./fgas/include/fgas.h" +#include "./fdp/include/fde.h" +#include "./fee/include/ifde_txtedtengine.h" +#include "./fee/include/ifde_txtedtpage.h" +#include "./fee/include/fx_wordbreak.h" +#endif diff --git a/xfa/src/fwl/src/basewidget/fwl_barcodeimp.cpp b/xfa/src/fwl/src/basewidget/fwl_barcodeimp.cpp new file mode 100644 index 0000000000..8ac141a686 --- /dev/null +++ b/xfa/src/fwl/src/basewidget/fwl_barcodeimp.cpp @@ -0,0 +1,247 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../core/include/fwl_targetimp.h" +#include "../core/include/fwl_noteimp.h" +#include "../core/include/fwl_widgetimp.h" +#include "include/fwl_editimp.h" +#include "include/fwl_barcodeimp.h" +IFWL_Barcode* IFWL_Barcode::Create() +{ + return new IFWL_Barcode; +} +IFWL_Barcode::IFWL_Barcode() +{ + m_pData = NULL; +} +IFWL_Barcode::~IFWL_Barcode() +{ + if (m_pData) { + delete (CFWL_BarcodeImp*)m_pData; + m_pData = NULL; + } +} +FWL_ERR IFWL_Barcode::Initialize(IFWL_Widget *pOuter) +{ + m_pData = FX_NEW CFWL_BarcodeImp(pOuter); + ((CFWL_BarcodeImp*)m_pData)->SetInterface(this); + return ((CFWL_BarcodeImp*)m_pData)->Initialize(); +} +FWL_ERR IFWL_Barcode::Initialize(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter) +{ + m_pData = FX_NEW CFWL_BarcodeImp(properties, pOuter); + ((CFWL_BarcodeImp*)m_pData)->SetInterface(this); + return ((CFWL_BarcodeImp*)m_pData)->Initialize(); +} +void IFWL_Barcode::SetType(BC_TYPE type) +{ + ((CFWL_BarcodeImp*)m_pData)->SetType(type); +} +FX_BOOL IFWL_Barcode::IsProtectedType() +{ + return ((CFWL_BarcodeImp*)m_pData)->IsProtectedType(); +} +CFWL_BarcodeImp::CFWL_BarcodeImp(IFWL_Widget *pOuter ) + : CFWL_EditImp(pOuter) + , m_pBarcodeEngine(NULL) + , m_dwStatus(0) + , m_type(BC_UNKNOWN) +{ +} +CFWL_BarcodeImp::CFWL_BarcodeImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter ) + : CFWL_EditImp(properties, pOuter) + , m_pBarcodeEngine(NULL) + , m_dwStatus(0) + , m_type(BC_UNKNOWN) +{ +} +CFWL_BarcodeImp::~CFWL_BarcodeImp() +{ + ReleaseBarcodeEngine(); +} +FWL_ERR CFWL_BarcodeImp::GetClassName(CFX_WideString &wsClass) const +{ + wsClass = FWL_CLASS_Barcode; + return FWL_ERR_Succeeded; +} +FX_DWORD CFWL_BarcodeImp::GetClassID() const +{ + return FWL_CLASSHASH_Barcode; +} +FWL_ERR CFWL_BarcodeImp::Initialize() +{ + if (!m_pDelegate) { + m_pDelegate = (IFWL_WidgetDelegate*) FX_NEW CFWL_BarcodeImpDelegate(this); + } + _FWL_ERR_CHECK_RETURN_VALUE_IF_FAIL(CFWL_EditImp::Initialize(), FWL_ERR_Indefinite); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_BarcodeImp::Finalize() +{ + if (m_pDelegate) { + delete (CFWL_BarcodeImpDelegate*)m_pDelegate; + m_pDelegate = NULL; + } + ReleaseBarcodeEngine(); + return CFWL_EditImp::Finalize(); +} +FWL_ERR CFWL_BarcodeImp::Update() +{ + if (IsLocked()) { + return FWL_ERR_Indefinite; + } + FWL_ERR ret = CFWL_EditImp::Update(); + GenerateBarcodeImageCache(); + return ret; +} +FWL_ERR CFWL_BarcodeImp::DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + _FWL_RETURN_VALUE_IF_FAIL(pGraphics, FWL_ERR_Indefinite); + _FWL_RETURN_VALUE_IF_FAIL(m_pProperties->m_pThemeProvider, FWL_ERR_Indefinite); + if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0) { + GenerateBarcodeImageCache(); + if (!m_pBarcodeEngine || (m_dwStatus & XFA_BCS_EncodeSuccess) == 0) { + return FWL_ERR_Succeeded; + } + CFX_Matrix mt; + mt.e = m_rtClient.left; + mt.f = m_rtClient.top; + if (pMatrix) { + mt.Concat(*pMatrix); + } + FX_INT32 errorCode = 0; + _FWL_RETURN_VALUE_IF_FAIL(m_pBarcodeEngine->RenderDevice(pGraphics->GetRenderDevice(), pMatrix, errorCode), FWL_ERR_Indefinite); + return FWL_ERR_Succeeded; + } + return CFWL_EditImp::DrawWidget(pGraphics, pMatrix); +} +void CFWL_BarcodeImp::GenerateBarcodeImageCache() +{ + if ((m_dwStatus & XFA_BCS_NeedUpdate) == 0) { + return; + } + m_dwStatus = 0;; + CreateBarcodeEngine(); + IFWL_BarcodeDP *pData = (IFWL_BarcodeDP*)m_pProperties->m_pDataProvider; + _FWL_RETURN_IF_FAIL(pData); + _FWL_RETURN_IF_FAIL(m_pBarcodeEngine); + CFX_WideString wsText; + _FWL_RETURN_IF_FAIL(GetText(wsText) == FWL_ERR_Succeeded); + CFWL_ThemePart part; + part.m_pWidget = m_pInterface; + IFWL_ThemeProvider *pTheme = GetAvailableTheme(); + IFX_Font* pFont = (IFX_Font*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_Font); + CFX_Font* pCXFont = (CFX_Font*)(pFont ? pFont->GetDevFont() : NULL); + if(pCXFont) { + m_pBarcodeEngine->SetFont(pCXFont); + } + FX_FLOAT* pFontSize = (FX_FLOAT*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_FontSize); + if(pFontSize) { + m_pBarcodeEngine->SetFontSize(*pFontSize); + } + FX_ARGB* pFontColor = (FX_ARGB*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_TextColor); + if(pFontColor) { + m_pBarcodeEngine->SetFontColor(*pFontColor); + } + m_pBarcodeEngine->SetHeight(FX_INT32(m_rtClient.height)); + m_pBarcodeEngine->SetWidth(FX_INT32(m_rtClient.width)); + FX_DWORD dwAttributeMask = pData->GetBarcodeAttributeMask(); + if (dwAttributeMask & FWL_BCDATTRIBUTE_CHARENCODING) { + m_pBarcodeEngine->SetCharEncoding (pData->GetCharEncoding()); + } + if (dwAttributeMask & FWL_BCDATTRIBUTE_MODULEHEIGHT) { + m_pBarcodeEngine->SetModuleHeight (pData->GetModuleHeight()); + } + if (dwAttributeMask & FWL_BCDATTRIBUTE_MODULEWIDTH) { + m_pBarcodeEngine->SetModuleWidth (pData->GetModuleWidth()); + } + if (dwAttributeMask & FWL_BCDATTRIBUTE_DATALENGTH) { + m_pBarcodeEngine->SetDataLength (pData->GetDataLength()); + } + if (dwAttributeMask & FWL_BCDATTRIBUTE_CALCHECKSUM) { + m_pBarcodeEngine->SetCalChecksum (pData->GetCalChecksum()); + } + if (dwAttributeMask & FWL_BCDATTRIBUTE_PRINTCHECKSUM) { + m_pBarcodeEngine->SetPrintChecksum (pData->GetPrintChecksum()); + } + if (dwAttributeMask & FWL_BCDATTRIBUTE_TEXTLOCATION) { + m_pBarcodeEngine->SetTextLocation (pData->GetTextLocation()); + } + if (dwAttributeMask & FWL_BCDATTRIBUTE_WIDENARROWRATIO) { + m_pBarcodeEngine->SetWideNarrowRatio (pData->GetWideNarrowRatio()); + } + if (dwAttributeMask & FWL_BCDATTRIBUTE_STARTCHAR) { + m_pBarcodeEngine->SetStartChar (pData->GetStartChar()); + } + if (dwAttributeMask & FWL_BCDATTRIBUTE_ENDCHAR) { + m_pBarcodeEngine->SetEndChar (pData->GetEndChar()); + } + if (dwAttributeMask & FWL_BCDATTRIBUTE_VERSION) { + m_pBarcodeEngine->SetVersion (pData->GetVersion()); + } + if (dwAttributeMask & FWL_BCDATTRIBUTE_ECLEVEL) { + m_pBarcodeEngine->SetErrorCorrectionLevel (pData->GetErrorCorrectionLevel()); + } + if (dwAttributeMask & FWL_BCDATTRIBUTE_TRUNCATED) { + m_pBarcodeEngine->SetTruncated (pData->GetTruncated()); + } + FX_INT32 errorCode = 0; + m_dwStatus = m_pBarcodeEngine->Encode(wsText, TRUE, errorCode) ? XFA_BCS_EncodeSuccess : 0; +} +void CFWL_BarcodeImp::CreateBarcodeEngine() +{ + if ((m_pBarcodeEngine == NULL) && (m_type != BC_UNKNOWN)) { + m_pBarcodeEngine = FX_Barcode_Create(m_type); + } +} +void CFWL_BarcodeImp::ReleaseBarcodeEngine() +{ + if (m_pBarcodeEngine) { + m_pBarcodeEngine->Release(); + m_pBarcodeEngine = NULL; + } +} +void CFWL_BarcodeImp::SetType(BC_TYPE type) +{ + if (m_type == type) { + return; + } + ReleaseBarcodeEngine(); + m_type = type; + m_dwStatus = XFA_BCS_NeedUpdate; +} +FWL_ERR CFWL_BarcodeImp::SetText(const CFX_WideString &wsText) +{ + ReleaseBarcodeEngine(); + m_dwStatus = XFA_BCS_NeedUpdate; + return CFWL_EditImp::SetText(wsText); +} +FX_BOOL CFWL_BarcodeImp::IsProtectedType() +{ + if (!m_pBarcodeEngine) { + return TRUE; + } + BC_TYPE tEngineType = m_pBarcodeEngine->GetType(); + if (tEngineType == BC_QR_CODE || tEngineType == BC_PDF417 || tEngineType == BC_DATAMATRIX) { + return TRUE; + } + return FALSE; +} +CFWL_BarcodeImpDelegate::CFWL_BarcodeImpDelegate(CFWL_BarcodeImp *pOwner) + : CFWL_EditImpDelegate(pOwner) +{ +} +FWL_ERR CFWL_BarcodeImpDelegate::OnProcessEvent(CFWL_Event *pEvent) +{ + FX_DWORD dwFlag = pEvent->GetClassID(); + if (dwFlag == FWL_EVTHASH_EDT_TextChanged) { + CFWL_BarcodeImp* pOwner = (CFWL_BarcodeImp*)m_pOwner; + pOwner->ReleaseBarcodeEngine(); + pOwner->m_dwStatus = XFA_BCS_NeedUpdate; + } + return CFWL_EditImpDelegate::OnProcessEvent(pEvent); +} diff --git a/xfa/src/fwl/src/basewidget/fwl_caretimp.cpp b/xfa/src/fwl/src/basewidget/fwl_caretimp.cpp new file mode 100644 index 0000000000..f8c7d09eb2 --- /dev/null +++ b/xfa/src/fwl/src/basewidget/fwl_caretimp.cpp @@ -0,0 +1,192 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../core/include/fwl_targetimp.h" +#include "../core/include/fwl_noteimp.h" +#include "../core/include/fwl_widgetimp.h" +#include "include/fwl_caretimp.h" +IFWL_Caret* IFWL_Caret::Create() +{ + return new IFWL_Caret; +} +IFWL_Caret::IFWL_Caret() +{ + m_pData = NULL; +} +IFWL_Caret::~IFWL_Caret() +{ + if (m_pData) { + delete (CFWL_CaretImp*)m_pData; + m_pData = NULL; + } +} +FWL_ERR IFWL_Caret::Initialize(IFWL_Widget *pOuter) +{ + m_pData = FX_NEW CFWL_CaretImp(pOuter); + ((CFWL_CaretImp*)m_pData)->SetInterface(this); + return ((CFWL_CaretImp*)m_pData)->Initialize(); +} +FWL_ERR IFWL_Caret::Initialize(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter) +{ + m_pData = FX_NEW CFWL_CaretImp(properties, pOuter); + ((CFWL_CaretImp*)m_pData)->SetInterface(this); + return ((CFWL_CaretImp*)m_pData)->Initialize(); +} +FWL_ERR IFWL_Caret::ShowCaret(FX_BOOL bFlag) +{ + return ((CFWL_CaretImp*)m_pData)->ShowCaret(bFlag); +} +FWL_ERR IFWL_Caret::GetFrequency(FX_DWORD &elapse) +{ + return ((CFWL_CaretImp*)m_pData)->GetFrequency(elapse); +} +FWL_ERR IFWL_Caret::SetFrequency(FX_DWORD elapse) +{ + return ((CFWL_CaretImp*)m_pData)->SetFrequency(elapse); +} +FWL_ERR IFWL_Caret::SetColor(CFX_Color crFill) +{ + return ((CFWL_CaretImp*)m_pData)->SetColor(crFill); +} +CFWL_CaretImp::CFWL_CaretImp(IFWL_Widget *pOuter) + : m_hTimer(NULL) +{ + m_dwElapse = 400; + m_pTimer = FX_NEW CFWL_CaretTimer(this); + m_bSetColor = FALSE; + SetStates(FWL_STATE_CAT_HightLight); +} +CFWL_CaretImp::CFWL_CaretImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter): m_hTimer(NULL) +{ + m_dwElapse = 400; + m_pTimer = FX_NEW CFWL_CaretTimer(this); + m_bSetColor = FALSE; + SetStates(FWL_STATE_CAT_HightLight); +} +CFWL_CaretImp::~CFWL_CaretImp() +{ + if (m_pTimer) { + delete m_pTimer; + m_pTimer = NULL; + } +} +FWL_ERR CFWL_CaretImp::GetClassName(CFX_WideString &wsClass) const +{ + wsClass = FWL_CLASS_Caret; + return FWL_ERR_Succeeded; +} +FX_DWORD CFWL_CaretImp::GetClassID() const +{ + return FWL_CLASSHASH_Caret; +} +FWL_ERR CFWL_CaretImp::Initialize() +{ + _FWL_ERR_CHECK_RETURN_VALUE_IF_FAIL(CFWL_WidgetImp::Initialize(), FWL_ERR_Indefinite); + m_pDelegate = (IFWL_WidgetDelegate*) FX_NEW CFWL_CaretImpDelegate(this); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_CaretImp::Finalize() +{ + if (m_hTimer) { + FWL_StopTimer(m_hTimer); + m_hTimer = NULL; + } + if (m_pDelegate) { + delete (CFWL_CaretImpDelegate*)m_pDelegate; + m_pDelegate = NULL; + } + return CFWL_WidgetImp::Finalize(); +} +FWL_ERR CFWL_CaretImp::DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix) +{ + _FWL_RETURN_VALUE_IF_FAIL(pGraphics, FWL_ERR_Indefinite); + if (!m_pProperties->m_pThemeProvider) { + m_pProperties->m_pThemeProvider = GetAvailableTheme(); + } + _FWL_RETURN_VALUE_IF_FAIL(m_pProperties->m_pThemeProvider, FWL_ERR_Indefinite); + DrawCaretBK(pGraphics, m_pProperties->m_pThemeProvider, pMatrix); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_CaretImp::ShowCaret(FX_BOOL bFlag) +{ + if (m_hTimer) { + FWL_StopTimer(m_hTimer); + m_hTimer = NULL; + } + if (bFlag) { + m_hTimer = FWL_StartTimer((IFWL_Timer *)m_pTimer, m_dwElapse); + } + return SetStates(FWL_WGTSTATE_Invisible, !bFlag); +} +FWL_ERR CFWL_CaretImp::GetFrequency(FX_DWORD &elapse) +{ + elapse = m_dwElapse; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_CaretImp::SetFrequency(FX_DWORD elapse) +{ + m_dwElapse = elapse; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_CaretImp::SetColor(CFX_Color crFill) +{ + m_bSetColor = TRUE; + m_crFill = crFill; + return FWL_ERR_Succeeded; +} +FX_BOOL CFWL_CaretImp::DrawCaretBK(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix) +{ + CFX_RectF rect; + GetWidgetRect(rect); + rect.Set(0, 0, rect.width, rect.height); + CFWL_ThemeBackground param; + param.m_pWidget = m_pInterface; + param.m_pGraphics = pGraphics; + param.m_rtPart = rect; + if (m_bSetColor) { + param.m_pData = &m_crFill; + } + if (!(m_pProperties->m_dwStates & FWL_STATE_CAT_HightLight)) { + return FWL_ERR_Succeeded; + } + param.m_iPart = FWL_PART_CAT_Background; + param.m_dwStates = FWL_PARTSTATE_CAT_HightLight; + if (pMatrix) { + param.m_matrix.Concat(*pMatrix); + } + pTheme->DrawBackground(¶m); + return FWL_ERR_Succeeded; +} +CFWL_CaretImp::CFWL_CaretTimer::CFWL_CaretTimer(CFWL_CaretImp *m_pCaret) +{ + this->m_pCaret = m_pCaret; +} +FX_INT32 CFWL_CaretImp::CFWL_CaretTimer::Run(FWL_HTIMER hTimer) +{ + if (m_pCaret->GetStates() & FWL_STATE_CAT_HightLight) { + m_pCaret->SetStates(FWL_STATE_CAT_HightLight, FALSE); + } else { + m_pCaret->SetStates(FWL_STATE_CAT_HightLight); + } + CFX_RectF rt; + m_pCaret->GetWidgetRect(rt); + rt.Set(0, 0, rt.width + 1, rt.height); + m_pCaret->Repaint(&rt); + return 1; +} +CFWL_CaretImpDelegate::CFWL_CaretImpDelegate(CFWL_CaretImp *pOwner) + : m_pOwner(pOwner) +{ +} +FX_INT32 CFWL_CaretImpDelegate::OnProcessMessage(CFWL_Message *pMessage) +{ + return 1; +} +FWL_ERR CFWL_CaretImpDelegate::OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix) +{ + return m_pOwner->DrawWidget(pGraphics, pMatrix); +} diff --git a/xfa/src/fwl/src/basewidget/fwl_checkboximp.cpp b/xfa/src/fwl/src/basewidget/fwl_checkboximp.cpp new file mode 100644 index 0000000000..89311b39f2 --- /dev/null +++ b/xfa/src/fwl/src/basewidget/fwl_checkboximp.cpp @@ -0,0 +1,606 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../core/include/fwl_targetimp.h" +#include "../core/include/fwl_noteimp.h" +#include "../core/include/fwl_widgetimp.h" +#include "../core/include/fwl_widgetmgrimp.h" +#include "include/fwl_checkboximp.h" +#define FWL_CKB_CaptionMargin 5 +IFWL_CheckBox* IFWL_CheckBox::Create() +{ + return new IFWL_CheckBox; +} +IFWL_CheckBox::IFWL_CheckBox() +{ + m_pData = NULL; +} +IFWL_CheckBox::~IFWL_CheckBox() +{ + if (m_pData) { + delete (CFWL_CheckBoxImp*)m_pData; + m_pData = NULL; + } +} +FWL_ERR IFWL_CheckBox::Initialize(IFWL_Widget *pOuter) +{ + m_pData = FX_NEW CFWL_CheckBoxImp(pOuter); + ((CFWL_CheckBoxImp*)m_pData)->SetInterface(this); + return ((CFWL_CheckBoxImp*)m_pData)->Initialize(); +} +FWL_ERR IFWL_CheckBox::Initialize(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter) +{ + m_pData = FX_NEW CFWL_CheckBoxImp(properties, pOuter); + ((CFWL_CheckBoxImp*)m_pData)->SetInterface(this); + return ((CFWL_CheckBoxImp*)m_pData)->Initialize(); +} +FX_INT32 IFWL_CheckBox::GetCheckState() +{ + return ((CFWL_CheckBoxImp*)m_pData)->GetCheckState(); +} +FWL_ERR IFWL_CheckBox::SetCheckState(FX_INT32 iCheck) +{ + return ((CFWL_CheckBoxImp*)m_pData)->SetCheckState(iCheck); +} +IFWL_RadioButton* IFWL_RadioButton::Create() +{ + return new IFWL_RadioButton; +} +IFWL_RadioButton::IFWL_RadioButton() +{ + m_pData = NULL; +} +IFWL_RadioButton::~IFWL_RadioButton() +{ + if (m_pData) { + delete (CFWL_CheckBoxImp*)m_pData; + m_pData = NULL; + } +} +FWL_ERR IFWL_RadioButton::Initialize(IFWL_Widget *pOuter) +{ + m_pData = FX_NEW CFWL_CheckBoxImp(pOuter); + ((CFWL_CheckBoxImp*)m_pData)->SetInterface(this); + return ((CFWL_CheckBoxImp*)m_pData)->Initialize(); +} +FWL_ERR IFWL_RadioButton::Initialize(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter) +{ + m_pData = FX_NEW CFWL_CheckBoxImp(properties, pOuter); + ((CFWL_CheckBoxImp*)m_pData)->SetInterface(this); + return ((CFWL_CheckBoxImp*)m_pData)->Initialize(); +} +CFWL_CheckBoxImp::CFWL_CheckBoxImp(IFWL_Widget *pOuter ) + : CFWL_WidgetImp(pOuter) + , m_dwTTOStyles(FDE_TTOSTYLE_SingleLine) + , m_iTTOAlign(FDE_TTOALIGNMENT_Center) + , m_bBtnDown(FALSE) +{ + m_rtClient.Reset(); + m_rtBox.Reset(); + m_rtCaption.Reset(); + m_rtFocus.Reset(); +} +CFWL_CheckBoxImp::CFWL_CheckBoxImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter ) + : CFWL_WidgetImp(properties, pOuter) + , m_dwTTOStyles(FDE_TTOSTYLE_SingleLine) + , m_iTTOAlign(FDE_TTOALIGNMENT_Center) + , m_bBtnDown(FALSE) +{ + m_rtClient.Reset(); + m_rtBox.Reset(); + m_rtCaption.Reset(); + m_rtFocus.Reset(); +} +CFWL_CheckBoxImp::~CFWL_CheckBoxImp() +{ +} +FWL_ERR CFWL_CheckBoxImp::GetClassName(CFX_WideString &wsClass) const +{ + wsClass = (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_RadioButton) ? FWL_CLASS_RadioButton : FWL_CLASS_CheckBox; + return FWL_ERR_Succeeded; +} +FX_DWORD CFWL_CheckBoxImp::GetClassID() const +{ + return m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_RadioButton ? FWL_CLASSHASH_RadioButton : FWL_CLASSHASH_CheckBox; +} +FWL_ERR CFWL_CheckBoxImp::Initialize() +{ + _FWL_ERR_CHECK_RETURN_VALUE_IF_FAIL(CFWL_WidgetImp::Initialize(), FWL_ERR_Indefinite); + m_pDelegate = (IFWL_WidgetDelegate*) FX_NEW CFWL_CheckBoxImpDelegate(this); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_CheckBoxImp::Finalize() +{ + if ( m_pDelegate) { + delete (CFWL_CheckBoxImpDelegate*)m_pDelegate; + m_pDelegate = NULL; + } + return CFWL_WidgetImp::Finalize(); +} +FWL_ERR CFWL_CheckBoxImp::GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize ) +{ + if (bAutoSize) { + rect.Set(0, 0, 0, 0); + if (!m_pProperties->m_pThemeProvider) { + m_pProperties->m_pThemeProvider = GetAvailableTheme(); + } + _FWL_RETURN_VALUE_IF_FAIL(m_pProperties->m_pThemeProvider, FWL_ERR_Indefinite); + _FWL_RETURN_VALUE_IF_FAIL(m_pProperties->m_pDataProvider, FWL_ERR_Indefinite); + CFX_WideString wsCaption; + m_pProperties->m_pDataProvider->GetCaption(m_pInterface, wsCaption); + if (wsCaption.GetLength() > 0) { + CFX_SizeF sz = CalcTextSize(wsCaption, + m_pProperties->m_pThemeProvider, + m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_MultiLine); + rect.Set(0, 0, sz.x, sz.y); + } + rect.Inflate(FWL_CKB_CaptionMargin, FWL_CKB_CaptionMargin); + IFWL_CheckBoxDP *pData = (IFWL_CheckBoxDP*)m_pProperties->m_pDataProvider; + FX_FLOAT fCheckBox = pData->GetBoxSize(m_pInterface); + rect.width += fCheckBox; + if (rect.height < fCheckBox) { + rect.height = fCheckBox; + } + CFWL_WidgetImp::GetWidgetRect(rect, TRUE); + } else { + rect = m_pProperties->m_rtWidget; + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_CheckBoxImp::Update() +{ + if (IsLocked()) { + return FWL_ERR_Indefinite; + } + if (!m_pProperties->m_pThemeProvider) { + m_pProperties->m_pThemeProvider = GetAvailableTheme(); + } + UpdateTextOutStyles(); + Layout(); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_CheckBoxImp::DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + _FWL_RETURN_VALUE_IF_FAIL(pGraphics, FWL_ERR_Indefinite); + _FWL_RETURN_VALUE_IF_FAIL(m_pProperties->m_pThemeProvider, FWL_ERR_Indefinite); + IFWL_ThemeProvider *pTheme = m_pProperties->m_pThemeProvider; + if (HasBorder()) { + DrawBorder(pGraphics, FWL_PART_CKB_Border, m_pProperties->m_pThemeProvider, pMatrix); + } + if (HasEdge()) { + DrawEdge(pGraphics, FWL_PART_CKB_Edge, pTheme, pMatrix); + } + FX_INT32 dwStates = GetPartStates(); + { + CFWL_ThemeBackground param; + param.m_pWidget = m_pInterface; + param.m_iPart = FWL_PART_CKB_Background; + param.m_dwStates = dwStates; + param.m_pGraphics = pGraphics; + if (pMatrix) { + param.m_matrix.Concat(*pMatrix); + } + param.m_rtPart = m_rtClient; + if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) { + param.m_pData = &m_rtFocus; + } + pTheme->DrawBackground(¶m); + param.m_iPart = FWL_PART_CKB_CheckBox; + param.m_rtPart = m_rtBox; + pTheme->DrawBackground(¶m); + } + _FWL_RETURN_VALUE_IF_FAIL(m_pProperties->m_pDataProvider, FWL_ERR_Indefinite); + { + CFX_WideString wsCaption; + m_pProperties->m_pDataProvider->GetCaption(m_pInterface, wsCaption); + FX_INT32 iLen = wsCaption.GetLength(); + _FWL_RETURN_VALUE_IF_FAIL(iLen > 0, FWL_ERR_Indefinite); + CFWL_ThemeText textParam; + textParam.m_pWidget = m_pInterface; + textParam.m_iPart = FWL_PART_CKB_Caption; + textParam.m_dwStates = dwStates; + textParam.m_pGraphics = pGraphics; + if(pMatrix) { + textParam.m_matrix.Concat(*pMatrix); + } + textParam.m_rtPart = m_rtCaption; + textParam.m_wsText = wsCaption; + textParam.m_dwTTOStyles = m_dwTTOStyles; + textParam.m_iTTOAlign = m_iTTOAlign; + pTheme->DrawText(&textParam); + } + return FWL_ERR_Succeeded; +} +FX_INT32 CFWL_CheckBoxImp::GetCheckState() +{ + if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_3State) + && ((m_pProperties->m_dwStates & FWL_STATE_CKB_CheckMask) == FWL_STATE_CKB_Neutral)) { + return 2; + } + if ((m_pProperties->m_dwStates & FWL_STATE_CKB_CheckMask) == FWL_STATE_CKB_Checked) { + return 1; + } + return 0; +} +FWL_ERR CFWL_CheckBoxImp::SetCheckState(FX_INT32 iCheck) +{ + m_pProperties->m_dwStates &= ~FWL_STATE_CKB_CheckMask; + switch(iCheck) { + case 0: { + break; + } + case 1: { + m_pProperties->m_dwStates |= FWL_STATE_CKB_Checked; + break; + } + case 2: { + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_3State) { + m_pProperties->m_dwStates |= FWL_STATE_CKB_Neutral; + } + break; + } + default: { + } + } + Repaint(&m_rtClient); + return FWL_ERR_Succeeded; +} +void CFWL_CheckBoxImp::Layout() +{ + FX_INT32 width = FX_INT32(m_pProperties->m_rtWidget.width + 0.5f); + FX_INT32 height = FX_INT32(m_pProperties->m_rtWidget.height + 0.5f); + m_pProperties->m_rtWidget.width = (FX_FLOAT)width; + m_pProperties->m_rtWidget.height = (FX_FLOAT)height; + GetClientRect(m_rtClient); + FX_FLOAT fBoxTop = m_rtClient.top; + FX_FLOAT fBoxLeft = m_rtClient.left; + FX_FLOAT fTextLeft = 0.0, fTextRight = 0.0; + FX_FLOAT fClientRight = m_rtClient.right(); + FX_FLOAT fClientBottom = m_rtClient.bottom(); + _FWL_RETURN_IF_FAIL(m_pProperties->m_pDataProvider); + IFWL_CheckBoxDP *pData = (IFWL_CheckBoxDP*)m_pProperties->m_pDataProvider; + FX_FLOAT fCheckBox = pData->GetBoxSize(m_pInterface); + switch (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_VLayoutMask) { + case FWL_STYLEEXT_CKB_Top: { + fBoxTop = m_rtClient.top; + break; + } + case FWL_STYLEEXT_CKB_Bottom: { + fBoxTop = fClientBottom - fCheckBox; + break; + } + case FWL_STYLEEXT_CKB_VCenter: + default: { + fBoxTop = m_rtClient.top + (m_rtClient.height - fCheckBox) / 2; + fBoxTop = FXSYS_floor(fBoxTop); + } + } + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_LeftText) { + fBoxLeft = fClientRight - fCheckBox; + fTextLeft = m_rtClient.left; + fTextRight = fBoxLeft; + } else { + fTextLeft = fBoxLeft + fCheckBox; + fTextRight = fClientRight; + } + m_rtBox.Set(fBoxLeft, fBoxTop, fCheckBox, fCheckBox); + m_rtCaption.Set(fTextLeft, m_rtClient.top, fTextRight - fTextLeft, m_rtClient.height); + m_rtCaption.Inflate(-FWL_CKB_CaptionMargin, -FWL_CKB_CaptionMargin); + CFX_RectF rtFocus; + rtFocus.Set(m_rtCaption.left, m_rtCaption.top, m_rtCaption.width, m_rtCaption.height); + CFX_WideString wsCaption; + m_pProperties->m_pDataProvider->GetCaption(m_pInterface, wsCaption); + if (wsCaption.IsEmpty()) { + m_rtFocus.Set(0, 0, 0, 0); + } else { + CalcTextRect(wsCaption, m_pProperties->m_pThemeProvider, m_dwTTOStyles, m_iTTOAlign, rtFocus); + if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_MultiLine) == 0) { + FX_FLOAT fWidth = FX_MAX(m_rtCaption.width, rtFocus.width); + FX_FLOAT fHeight = FX_MIN(m_rtCaption.height, rtFocus.height); + FX_FLOAT fLeft = m_rtCaption.left; + FX_FLOAT fTop = m_rtCaption.top; + if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_HLayoutMask) == FWL_STYLEEXT_CKB_Center) { + fLeft = m_rtCaption.left + (m_rtCaption.width - fWidth) / 2; + } else if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_HLayoutMask) == FWL_STYLEEXT_CKB_Right) { + fLeft = m_rtCaption.right() - fWidth; + } + if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_VLayoutMask) == FWL_STYLEEXT_CKB_VCenter) { + fTop = m_rtCaption.top + (m_rtCaption.height - fHeight) / 2; + } else if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_VLayoutMask) == FWL_STYLEEXT_CKB_Bottom) { + fTop = m_rtCaption.bottom() - fHeight; + } + m_rtFocus.Set(fLeft, fTop, fWidth, fHeight); + } else { + m_rtFocus.Set(rtFocus.left, rtFocus.top, rtFocus.width, rtFocus.height); + } + m_rtFocus.Inflate(1, 1); + } +} +FX_DWORD CFWL_CheckBoxImp::GetPartStates() +{ + FX_INT32 dwStates = FWL_PARTSTATE_CKB_UnChecked; + if ((m_pProperties->m_dwStates & FWL_STATE_CKB_CheckMask) == FWL_STATE_CKB_Neutral) { + dwStates = FWL_PARTSTATE_CKB_Neutral; + } else if ((m_pProperties->m_dwStates & FWL_STATE_CKB_CheckMask) == FWL_STATE_CKB_Checked) { + dwStates = FWL_PARTSTATE_CKB_Checked; + } + if (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) { + dwStates |= FWL_PARTSTATE_CKB_Disabled; + } else if (m_pProperties->m_dwStates & FWL_STATE_CKB_Hovered ) { + dwStates |= FWL_PARTSTATE_CKB_Hovered; + } else if (m_pProperties->m_dwStates & FWL_STATE_CKB_Pressed ) { + dwStates |= FWL_PARTSTATE_CKB_Pressed; + } else { + dwStates |= FWL_PARTSTATE_CKB_Normal; + } + if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) { + dwStates |= FWL_PARTSTATE_CKB_Focused; + } + return dwStates; +} +void CFWL_CheckBoxImp::UpdateTextOutStyles() +{ + m_iTTOAlign = FDE_TTOALIGNMENT_Center; + switch (m_pProperties->m_dwStyleExes & (FWL_STYLEEXT_CKB_HLayoutMask | FWL_STYLEEXT_CKB_VLayoutMask)) { + case FWL_STYLEEXT_CKB_Left | FWL_STYLEEXT_CKB_Top: { + m_iTTOAlign = FDE_TTOALIGNMENT_TopLeft; + break; + } + case FWL_STYLEEXT_CKB_Center | FWL_STYLEEXT_CKB_Top: { + m_iTTOAlign = FDE_TTOALIGNMENT_TopCenter; + break; + } + case FWL_STYLEEXT_CKB_Right | FWL_STYLEEXT_CKB_Top: { + m_iTTOAlign = FDE_TTOALIGNMENT_TopRight; + break; + } + case FWL_STYLEEXT_CKB_Left | FWL_STYLEEXT_CKB_VCenter: { + m_iTTOAlign = FDE_TTOALIGNMENT_CenterLeft; + break; + } + case FWL_STYLEEXT_CKB_Center | FWL_STYLEEXT_CKB_VCenter: { + m_iTTOAlign = FDE_TTOALIGNMENT_Center; + break; + } + case FWL_STYLEEXT_CKB_Right | FWL_STYLEEXT_CKB_VCenter: { + m_iTTOAlign = FDE_TTOALIGNMENT_CenterRight; + break; + } + case FWL_STYLEEXT_CKB_Left | FWL_STYLEEXT_CKB_Bottom: { + m_iTTOAlign = FDE_TTOALIGNMENT_BottomLeft; + break; + } + case FWL_STYLEEXT_CKB_Center | FWL_STYLEEXT_CKB_Bottom: { + m_iTTOAlign = FDE_TTOALIGNMENT_BottomCenter; + break; + } + case FWL_STYLEEXT_CKB_Right | FWL_STYLEEXT_CKB_Bottom: { + m_iTTOAlign = FDE_TTOALIGNMENT_BottomRight; + break; + } + default: { + } + } + m_dwTTOStyles = 0; + if (m_pProperties->m_dwStyleExes & FWL_WGTSTYLE_RTLReading) { + m_dwTTOStyles |= FDE_TTOSTYLE_RTL; + } + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_MultiLine) { + m_dwTTOStyles |= FDE_TTOSTYLE_LineWrap; + } else { + m_dwTTOStyles |= FDE_TTOSTYLE_SingleLine; + } +} +void CFWL_CheckBoxImp::NextStates() +{ + FX_DWORD dwFirststate = m_pProperties->m_dwStates; + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_RadioButton) { + if ((m_pProperties->m_dwStates & FWL_STATE_CKB_CheckMask) == FWL_STATE_CKB_Unchecked) { + IFWL_WidgetMgr *pWMgr = FWL_GetWidgetMgr(); + CFWL_WidgetMgr *pWidgetMgr = (CFWL_WidgetMgr* )pWMgr; + if (!pWidgetMgr->IsFormDisabled()) { + CFX_PtrArray radioarr; + pWidgetMgr->GetSameGroupRadioButton(m_pInterface, radioarr); + IFWL_CheckBox *pCheckBox = NULL; + FX_INT32 iCount = radioarr.GetSize(); + for (FX_INT32 i = 0; i < iCount; i++) { + pCheckBox = (IFWL_CheckBox *)radioarr[i]; + if (pCheckBox != m_pInterface && pCheckBox->GetStates() & FWL_STATE_CKB_Checked) { + pCheckBox->SetCheckState(0); + CFX_RectF rt; + pCheckBox->GetWidgetRect(rt); + rt.left = rt.top = 0; + m_pWidgetMgr->RepaintWidget(pCheckBox, &rt); + break; + } + } + } + m_pProperties->m_dwStates |= FWL_STATE_CKB_Checked; + } + } else { + if ((m_pProperties->m_dwStates & FWL_STATE_CKB_CheckMask) == FWL_STATE_CKB_Neutral) { + m_pProperties->m_dwStates &= ~FWL_STATE_CKB_CheckMask; + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_3State) { + m_pProperties->m_dwStates |= FWL_STATE_CKB_Checked; + } + } else if ((m_pProperties->m_dwStates & FWL_STATE_CKB_CheckMask) == FWL_STATE_CKB_Checked) { + m_pProperties->m_dwStates &= ~FWL_STATE_CKB_CheckMask; + } else { + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_3State) { + m_pProperties->m_dwStates |= FWL_STATE_CKB_Neutral; + } else { + m_pProperties->m_dwStates |= FWL_STATE_CKB_Checked; + } + } + } + Repaint(&m_rtClient); + FX_DWORD dwLaststate = m_pProperties->m_dwStates; + if (dwFirststate != dwLaststate) { + CFWL_EvtCkbCheckStateChanged wmCheckBoxState; + wmCheckBoxState.m_pSrcTarget = m_pInterface; + DispatchEvent(&wmCheckBoxState); + } +} +CFWL_CheckBoxImpDelegate::CFWL_CheckBoxImpDelegate(CFWL_CheckBoxImp *pOwner) + : m_pOwner(pOwner) +{ +} +FX_INT32 CFWL_CheckBoxImpDelegate::OnProcessMessage(CFWL_Message *pMessage) +{ + _FWL_RETURN_VALUE_IF_FAIL(pMessage, 0); + FX_DWORD dwMsgCode = pMessage->GetClassID(); + FX_INT32 iRet = 1; + switch (dwMsgCode) { + case FWL_MSGHASH_Activate: { + OnActivate(pMessage); + break; + } + case FWL_MSGHASH_SetFocus: + case FWL_MSGHASH_KillFocus: { + OnFocusChanged(pMessage, dwMsgCode == FWL_MSGHASH_SetFocus); + break; + } + case FWL_MSGHASH_Mouse: { + CFWL_MsgMouse *pMsg = (CFWL_MsgMouse*)pMessage; + FX_DWORD dwCmd = pMsg->m_dwCmd; + switch (dwCmd) { + case FWL_MSGMOUSECMD_LButtonDown: { + OnLButtonDown(pMsg); + break; + } + case FWL_MSGMOUSECMD_LButtonUp: { + OnLButtonUp(pMsg); + break; + } + case FWL_MSGMOUSECMD_MouseMove: { + OnMouseMove(pMsg); + break; + } + case FWL_MSGMOUSECMD_MouseLeave: { + OnMouseLeave(pMsg); + break; + } + default: { + } + } + break; + } + case FWL_MSGHASH_Key: { + CFWL_MsgKey *pKey = (CFWL_MsgKey*)pMessage; + if (pKey->m_dwCmd == FWL_MSGKEYCMD_KeyDown) { + OnKeyDown((CFWL_MsgKey*)pKey); + } + break; + } + default: { + iRet = 0; + } + } + CFWL_WidgetImpDelegate::OnProcessMessage(pMessage); + return iRet; +} +FWL_ERR CFWL_CheckBoxImpDelegate::OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix) +{ + return m_pOwner->DrawWidget(pGraphics, pMatrix); +} +void CFWL_CheckBoxImpDelegate::OnActivate(CFWL_Message *pMsg) +{ + m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Deactivated; + m_pOwner->Repaint(&(m_pOwner->m_rtClient)); +} +void CFWL_CheckBoxImpDelegate::OnFocusChanged(CFWL_Message *pMsg, FX_BOOL bSet ) +{ + if (bSet) { + m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused; + } else { + m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused; + } + m_pOwner->Repaint(&(m_pOwner->m_rtClient)); +} +void CFWL_CheckBoxImpDelegate::OnLButtonDown(CFWL_MsgMouse *pMsg) +{ + if (m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) { + return; + } + if ((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0) { + m_pOwner->SetFocus(TRUE); + } + m_pOwner->m_bBtnDown = TRUE; + m_pOwner->m_pProperties->m_dwStates &= ~ FWL_STATE_CKB_Hovered; + m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_CKB_Pressed; + m_pOwner->Repaint(&(m_pOwner->m_rtClient)); +} +void CFWL_CheckBoxImpDelegate::OnLButtonUp(CFWL_MsgMouse *pMsg) +{ + if (!m_pOwner->m_bBtnDown) { + return; + } + m_pOwner->m_bBtnDown = FALSE; + if (!m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) { + return; + } + m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_CKB_Hovered; + m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_CKB_Pressed; + m_pOwner->NextStates(); +} +void CFWL_CheckBoxImpDelegate::OnMouseMove(CFWL_MsgMouse *pMsg) +{ + if (m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) { + return; + } + FX_BOOL bRepaint = FALSE; + if (m_pOwner->m_bBtnDown) { + if (m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) { + if ((m_pOwner->m_pProperties->m_dwStates & FWL_STATE_CKB_Pressed) == 0) { + bRepaint = TRUE; + m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_CKB_Pressed; + } + if ((m_pOwner->m_pProperties->m_dwStates & FWL_STATE_CKB_Hovered)) { + bRepaint = TRUE; + m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_CKB_Hovered; + } + } else { + if (m_pOwner->m_pProperties->m_dwStates & FWL_STATE_CKB_Pressed) { + bRepaint = TRUE; + m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_CKB_Pressed; + } + if ((m_pOwner->m_pProperties->m_dwStates & FWL_STATE_CKB_Hovered) == 0) { + bRepaint = TRUE; + m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_CKB_Hovered; + } + } + } else { + if (m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) { + if ((m_pOwner->m_pProperties->m_dwStates & FWL_STATE_CKB_Hovered) == 0) { + bRepaint = TRUE; + m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_CKB_Hovered; + } + } + } + if (bRepaint) { + m_pOwner->Repaint(&(m_pOwner->m_rtBox)); + } +} +void CFWL_CheckBoxImpDelegate::OnMouseLeave(CFWL_MsgMouse *pMsg) +{ + if (m_pOwner->m_bBtnDown) { + m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_CKB_Hovered; + } else { + m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_CKB_Hovered; + } + m_pOwner->Repaint(&(m_pOwner->m_rtBox)); +} +void CFWL_CheckBoxImpDelegate::OnKeyDown(CFWL_MsgKey *pMsg) +{ + if (pMsg->m_dwKeyCode == FWL_VKEY_Tab) { + m_pOwner->DispatchKeyEvent(pMsg); + return; + } + if (pMsg->m_dwKeyCode == FWL_VKEY_Return || pMsg->m_dwKeyCode == FWL_VKEY_Space) { + m_pOwner->NextStates(); + } +} diff --git a/xfa/src/fwl/src/basewidget/fwl_comboboximp.cpp b/xfa/src/fwl/src/basewidget/fwl_comboboximp.cpp new file mode 100644 index 0000000000..0200f92eaa --- /dev/null +++ b/xfa/src/fwl/src/basewidget/fwl_comboboximp.cpp @@ -0,0 +1,1991 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../../src/core/include/fwl_threadimp.h" +#include "../../src/core/include/fwl_appimp.h" +#include "../core/include/fwl_targetimp.h" +#include "../core/include/fwl_noteimp.h" +#include "../core/include/fwl_widgetimp.h" +#include "../core/include/fwl_panelimp.h" +#include "../core/include/fwl_formimp.h" +#include "../core/include/fwl_widgetmgrimp.h" +#include "include/fwl_scrollbarimp.h" +#include "include/fwl_editimp.h" +#include "include/fwl_listboximp.h" +#include "include/fwl_formproxyimp.h" +#include "include/fwl_comboboximp.h" +IFWL_ComboBox* IFWL_ComboBox::Create() +{ + return new IFWL_ComboBox; +} +IFWL_ComboBox::IFWL_ComboBox() +{ + m_pData = NULL; +} +IFWL_ComboBox::~IFWL_ComboBox() +{ + if (m_pData) { + delete (CFWL_ComboBoxImp*)m_pData; + m_pData = NULL; + } +} +FWL_ERR IFWL_ComboBox::Initialize(IFWL_Widget *pOuter) +{ + m_pData = FX_NEW CFWL_ComboBoxImp(pOuter); + ((CFWL_ComboBoxImp*)m_pData)->SetInterface(this); + return ((CFWL_ComboBoxImp*)m_pData)->Initialize(); +} +FWL_ERR IFWL_ComboBox::Initialize(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter) +{ + m_pData = FX_NEW CFWL_ComboBoxImp(properties, pOuter); + ((CFWL_ComboBoxImp*)m_pData)->SetInterface(this); + return ((CFWL_ComboBoxImp*)m_pData)->Initialize(); +} +FX_INT32 IFWL_ComboBox::GetCurSel() +{ + return ((CFWL_ComboBoxImp*)m_pData)->GetCurSel(); +} +FWL_ERR IFWL_ComboBox::SetCurSel(FX_INT32 iSel) +{ + return ((CFWL_ComboBoxImp*)m_pData)->SetCurSel(iSel); +} +FWL_ERR IFWL_ComboBox::SetEditText(const CFX_WideString &wsText) +{ + return ((CFWL_ComboBoxImp*)m_pData)->SetEditText(wsText); +} +FX_INT32 IFWL_ComboBox::GetEditTextLength() const +{ + return ((CFWL_ComboBoxImp*)m_pData)->GetEditTextLength(); +} +FWL_ERR IFWL_ComboBox::GetEditText(CFX_WideString &wsText, FX_INT32 nStart, FX_INT32 nCount) const +{ + return ((CFWL_ComboBoxImp*)m_pData)->GetEditText(wsText, nStart, nCount); +} +FWL_ERR IFWL_ComboBox::SetEditSelRange(FX_INT32 nStart, FX_INT32 nCount) +{ + return ((CFWL_ComboBoxImp*)m_pData)->SetEditSelRange(nStart, nCount); +} +FX_INT32 IFWL_ComboBox::GetEditSelRange(FX_INT32 nIndex, FX_INT32 &nStart) +{ + return ((CFWL_ComboBoxImp*)m_pData)->GetEditSelRange(nIndex, nStart); +} +FX_INT32 IFWL_ComboBox::GetEditLimit() +{ + return ((CFWL_ComboBoxImp*)m_pData)->GetEditLimit(); +} +FWL_ERR IFWL_ComboBox::SetEditLimit(FX_INT32 nLimit) +{ + return ((CFWL_ComboBoxImp*)m_pData)->SetEditLimit(nLimit); +} +FWL_ERR IFWL_ComboBox::EditDoClipboard(FX_INT32 iCmd) +{ + return ((CFWL_ComboBoxImp*)m_pData)->EditDoClipboard(iCmd); +} +FX_BOOL IFWL_ComboBox::EditRedo(FX_BSTR bsRecord) +{ + return ((CFWL_ComboBoxImp*)m_pData)->EditRedo(bsRecord); +} +FX_BOOL IFWL_ComboBox::EditUndo(FX_BSTR bsRecord) +{ + return ((CFWL_ComboBoxImp*)m_pData)->EditUndo(bsRecord); +} +IFWL_ListBox* IFWL_ComboBox::GetListBoxt() +{ + return ((CFWL_ComboBoxImp*)m_pData)->GetListBoxt(); +} +FX_BOOL IFWL_ComboBox::AfterFocusShowDropList() +{ + return ((CFWL_ComboBoxImp*)m_pData)->AfterFocusShowDropList(); +} +FX_ERR IFWL_ComboBox::OpenDropDownList(FX_BOOL bActivate) +{ + return ((CFWL_ComboBoxImp*)m_pData)->OpenDropDownList(bActivate); +} +FX_BOOL IFWL_ComboBox::EditCanUndo() +{ + return ((CFWL_ComboBoxImp*)m_pData)->EditCanUndo(); +} +FX_BOOL IFWL_ComboBox::EditCanRedo() +{ + return ((CFWL_ComboBoxImp*)m_pData)->EditCanRedo(); +} +FX_BOOL IFWL_ComboBox::EditUndo() +{ + return ((CFWL_ComboBoxImp*)m_pData)->EditUndo(); +} +FX_BOOL IFWL_ComboBox::EditRedo() +{ + return ((CFWL_ComboBoxImp*)m_pData)->EditRedo(); +} +FX_BOOL IFWL_ComboBox::EditCanCopy() +{ + return ((CFWL_ComboBoxImp*)m_pData)->EditCanCopy(); +} +FX_BOOL IFWL_ComboBox::EditCanCut() +{ + return ((CFWL_ComboBoxImp*)m_pData)->EditCanCut(); +} +FX_BOOL IFWL_ComboBox::EditCanSelectAll() +{ + return ((CFWL_ComboBoxImp*)m_pData)->EditCanSelectAll(); +} +FX_BOOL IFWL_ComboBox::EditCopy(CFX_WideString &wsCopy) +{ + return ((CFWL_ComboBoxImp*)m_pData)->EditCopy(wsCopy); +} +FX_BOOL IFWL_ComboBox::EditCut(CFX_WideString &wsCut) +{ + return ((CFWL_ComboBoxImp*)m_pData)->EditCut(wsCut); +} +FX_BOOL IFWL_ComboBox::EditPaste(const CFX_WideString &wsPaste) +{ + return ((CFWL_ComboBoxImp*)m_pData)->EditPaste(wsPaste); +} +FX_BOOL IFWL_ComboBox::EditSelectAll() +{ + return ((CFWL_ComboBoxImp*)m_pData)->EditSelectAll(); +} +FX_BOOL IFWL_ComboBox::EditDelete() +{ + return ((CFWL_ComboBoxImp*)m_pData)->EditDelete(); +} +FX_BOOL IFWL_ComboBox::EditDeSelect() +{ + return ((CFWL_ComboBoxImp*)m_pData)->EditDeSelect(); +} +FWL_ERR IFWL_ComboBox::GetBBox(CFX_RectF &rect) +{ + return ((CFWL_ComboBoxImp*)m_pData)->GetBBox(rect); +} +FWL_ERR IFWL_ComboBox::EditModifyStylesEx(FX_DWORD dwStylesExAdded, + FX_DWORD dwStylesExRemoved) +{ + return ((CFWL_ComboBoxImp*)m_pData)->EditModifyStylesEx(dwStylesExAdded, + dwStylesExRemoved); +} +CFWL_ComboEdit::CFWL_ComboEdit(IFWL_Widget *pOuter) + : CFWL_EditImp(pOuter) +{ + FXSYS_assert(pOuter != NULL); + m_pOuter = (CFWL_ComboBoxImp*)(((IFWL_TargetData*)pOuter)->GetData()); +} +CFWL_ComboEdit::CFWL_ComboEdit(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter) + : CFWL_EditImp(properties, pOuter) +{ + FXSYS_assert(pOuter != NULL); + m_pOuter = (CFWL_ComboBoxImp*)(((IFWL_TargetData*)pOuter)->GetData()); +} + +CFWL_ComboEditDelegate::CFWL_ComboEditDelegate(CFWL_ComboEdit *pOwner) + : CFWL_EditImpDelegate(pOwner) + , m_pOwner(pOwner) +{ +} +FX_INT32 CFWL_ComboEditDelegate::OnProcessMessage(CFWL_Message *pMessage) +{ + _FWL_RETURN_VALUE_IF_FAIL(pMessage, 0); + FX_DWORD dwMsgCode = pMessage->GetClassID(); + FX_BOOL backDefault = TRUE; + switch (dwMsgCode) { + case FWL_MSGHASH_SetFocus: + case FWL_MSGHASH_KillFocus: { + if (dwMsgCode == FWL_MSGHASH_SetFocus) { + m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused; + } else { + m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused; + } + backDefault = FALSE; + break; + } + case FWL_MSGHASH_Mouse: { + CFWL_MsgMouse *pMsg = (CFWL_MsgMouse*)pMessage; + if ((pMsg->m_dwCmd == FWL_MSGMOUSECMD_LButtonDown) && + ((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0)) { + m_pOwner->SetSelected(); + m_pOwner->SetComboBoxFocus(TRUE); + } + break; + } + default: { + } + } + if (!backDefault) { + return 1; + } + return CFWL_EditImpDelegate::OnProcessMessage(pMessage); +} +void CFWL_ComboEdit::ClearSelected() +{ + ClearSelections(); + Repaint(&m_rtClient); +} +void CFWL_ComboEdit::SetSelected() +{ + FlagFocus(TRUE); + EndCaret(); + AddSelRange(0); +} +void CFWL_ComboEdit::EndCaret() +{ + m_pEdtEngine->MoveCaretPos(MC_End); +} +void CFWL_ComboEdit::FlagFocus(FX_BOOL bSet) +{ + if (bSet) { + m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused; + } else { + m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused; + ShowCaret(FALSE); + } +}; +void CFWL_ComboEdit::SetComboBoxFocus(FX_BOOL bSet) +{ + m_pOuter->SetFocus(bSet); +} +CFWL_ComboList::CFWL_ComboList(IFWL_Widget *pOuter) + : CFWL_ListBoxImp(pOuter) + , m_bNotifyOwner(TRUE) +{ + FXSYS_assert(pOuter != NULL); +} +CFWL_ComboList::CFWL_ComboList(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter) + : CFWL_ListBoxImp(properties, pOuter) + , m_bNotifyOwner(TRUE) +{ + FXSYS_assert(pOuter != NULL); +} +FWL_ERR CFWL_ComboList::Initialize() +{ + _FWL_ERR_CHECK_RETURN_VALUE_IF_FAIL(CFWL_ListBoxImp::Initialize(), FWL_ERR_Indefinite); + if (m_pDelegate) { + delete (CFWL_ComboListDelegate*)m_pDelegate; + m_pDelegate = NULL; + } + m_pDelegate = (IFWL_WidgetDelegate*)FX_NEW CFWL_ComboListDelegate(this); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ComboList::Finalize() +{ + if ( m_pDelegate) { + delete (CFWL_ComboListDelegate*)m_pDelegate; + m_pDelegate = NULL; + } + return CFWL_ListBoxImp::Finalize(); +} +FX_INT32 CFWL_ComboList::MatchItem(const CFX_WideString &wsMatch) +{ + if (wsMatch.IsEmpty()) { + return -1; + } + _FWL_RETURN_VALUE_IF_FAIL(m_pProperties->m_pDataProvider, -1); + IFWL_ListBoxDP *pData = (IFWL_ListBoxDP*)m_pProperties->m_pDataProvider; + FX_INT32 iCount = pData->CountItems(m_pInterface); + for (FX_INT32 i = 0; i < iCount; i ++) { + FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i); + CFX_WideString wsText; + pData->GetItemText(m_pInterface, hItem, wsText); + FX_STRSIZE pos = wsText.Find((FX_LPCWSTR)wsMatch); + if (!pos) { + return i; + } + } + return -1; +} +void CFWL_ComboList::ChangeSelected(FX_INT32 iSel) +{ + _FWL_RETURN_IF_FAIL(m_pProperties->m_pDataProvider); + IFWL_ListBoxDP *pData = (IFWL_ListBoxDP*)m_pProperties->m_pDataProvider; + FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, iSel); + CFX_RectF rtInvalidate; + rtInvalidate.Reset(); + FWL_HLISTITEM hOld = GetSelItem(0); + FX_INT32 iOld = pData->GetItemIndex(m_pInterface, hOld); + if (iOld == iSel) { + return; + } else if (iOld > -1) { + GetItemRect(iOld, rtInvalidate); + SetSelItem(hOld, FALSE); + } + if (hItem) { + CFX_RectF rect; + GetItemRect(iSel, rect); + rtInvalidate.Union(rect); + FWL_HLISTITEM hSel = pData->GetItem(m_pInterface, iSel); + SetSelItem(hSel, TRUE); + } + if (!rtInvalidate.IsEmpty()) { + Repaint(&rtInvalidate); + } +} +FX_INT32 CFWL_ComboList::CountItems() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pProperties->m_pDataProvider, 0); + IFWL_ListBoxDP *pData = (IFWL_ListBoxDP*)m_pProperties->m_pDataProvider; + return pData->CountItems(m_pInterface); +} +void CFWL_ComboList::GetItemRect(FX_INT32 nIndex, CFX_RectF &rtItem) +{ + IFWL_ListBoxDP *pData = (IFWL_ListBoxDP*)m_pProperties->m_pDataProvider; + FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, nIndex); + pData->GetItemRect(m_pInterface, hItem, rtItem); +} +void CFWL_ComboList::ClientToOuter(FX_FLOAT &fx, FX_FLOAT &fy) +{ + fx += m_pProperties->m_rtWidget.left, fy += m_pProperties->m_rtWidget.top; + IFWL_Widget *pOwner = GetOwner(); + _FWL_RETURN_IF_FAIL(pOwner); + pOwner->TransformTo(m_pOuter, fx, fy); +} +void CFWL_ComboList::SetFocus(FX_BOOL bSet) +{ + CFWL_WidgetImp::SetFocus(bSet); +} +CFWL_ComboListDelegate::CFWL_ComboListDelegate(CFWL_ComboList *pOwner) + : CFWL_ListBoxImpDelegate(pOwner) + , m_pOwner(pOwner) +{ +} +FX_INT32 CFWL_ComboListDelegate::OnProcessMessage(CFWL_Message *pMessage) +{ + _FWL_RETURN_VALUE_IF_FAIL(pMessage, 0); + FX_DWORD dwHashCode = pMessage->GetClassID(); + FX_BOOL backDefault = TRUE; + if (dwHashCode == FWL_MSGHASH_SetFocus || dwHashCode == FWL_MSGHASH_KillFocus) { + OnDropListFocusChanged(pMessage, dwHashCode == FWL_MSGHASH_SetFocus); + } else if (dwHashCode == FWL_MSGHASH_Mouse) { + CFWL_MsgMouse *pMsg = (CFWL_MsgMouse*)pMessage; + if (m_pOwner->IsShowScrollBar(TRUE) && m_pOwner->m_pVertScrollBar) { + CFX_RectF rect; + m_pOwner->m_pVertScrollBar->GetWidgetRect(rect); + if (rect.Contains(pMsg->m_fx, pMsg->m_fy)) { + pMsg->m_fx -= rect.left; + pMsg->m_fy -= rect.top; + IFWL_WidgetDelegate *pDelegate = m_pOwner->m_pVertScrollBar->SetDelegate(NULL); + return pDelegate->OnProcessMessage(pMsg); + } + } + FX_DWORD dwCmd = pMsg->m_dwCmd; + switch (dwCmd) { + case FWL_MSGMOUSECMD_MouseMove: { + backDefault = FALSE; + OnDropListMouseMove(pMsg); + break; + } + case FWL_MSGMOUSECMD_LButtonDown: { + backDefault = FALSE; + OnDropListLButtonDown(pMsg); + break; + } + case FWL_MSGMOUSECMD_LButtonUp: { + backDefault = FALSE; + OnDropListLButtonUp(pMsg); + break; + } + default: { + } + } + } else if (dwHashCode == FWL_MSGHASH_Key) { + CFWL_MsgKey *pMsg = (CFWL_MsgKey*)pMessage; + backDefault = !OnDropListKey(pMsg); + } + if (!backDefault) { + return 1; + } + return CFWL_ListBoxImpDelegate::OnProcessMessage(pMessage); +} +void CFWL_ComboListDelegate::OnDropListFocusChanged(CFWL_Message *pMsg, FX_BOOL bSet ) +{ + if (!bSet) { + CFWL_MsgKillFocus *pKill = (CFWL_MsgKillFocus*)pMsg; + CFWL_ComboBoxImp *pOuter = (CFWL_ComboBoxImp*)(((IFWL_TargetData*)m_pOwner->m_pOuter)->GetData()); + if (pKill->m_pSetFocus == (IFWL_Widget*)m_pOwner->m_pOuter || (IFWL_Widget*)pKill->m_pSetFocus == (IFWL_Widget*)pOuter->m_pEdit) { + pOuter->ShowDropList(FALSE); + } + } +} +FX_INT32 CFWL_ComboListDelegate::OnDropListMouseMove(CFWL_MsgMouse *pMsg) +{ + if (m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) { + if (m_pOwner->m_bNotifyOwner) { + m_pOwner->m_bNotifyOwner = FALSE; + } + if (m_pOwner->IsShowScrollBar(TRUE) && m_pOwner->m_pVertScrollBar) { + CFX_RectF rect; + m_pOwner->m_pVertScrollBar->GetWidgetRect(rect); + if (rect.Contains(pMsg->m_fx, pMsg->m_fy)) { + return 1; + } + } + FWL_HLISTITEM hItem = m_pOwner->GetItemAtPoint(pMsg->m_fx, pMsg->m_fy); + if (hItem) { + _FWL_RETURN_VALUE_IF_FAIL(m_pOwner->m_pProperties->m_pDataProvider, 0); + IFWL_ListBoxDP *pData = (IFWL_ListBoxDP*)m_pOwner->m_pProperties->m_pDataProvider; + FX_INT32 iSel = pData->GetItemIndex(m_pOwner->m_pInterface, hItem); + CFWL_EvtCmbHoverChanged event; + event.m_pSrcTarget = m_pOwner->m_pOuter; + event.m_iCurHover = iSel; + m_pOwner->DispatchEvent(&event); + m_pOwner->ChangeSelected(iSel); + } + } else if (m_pOwner->m_bNotifyOwner) { + m_pOwner->ClientToOuter(pMsg->m_fx, pMsg->m_fy); + CFWL_ComboBoxImp *pOuter = (CFWL_ComboBoxImp*)(((IFWL_TargetData*)m_pOwner->m_pOuter)->GetData()); + pOuter->m_pDelegate->OnProcessMessage(pMsg); + } + return 1; +} +FX_INT32 CFWL_ComboListDelegate::OnDropListLButtonDown(CFWL_MsgMouse *pMsg) +{ + if (m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) { + return 0; + } + CFWL_ComboBoxImp *pOuter = (CFWL_ComboBoxImp*)((IFWL_TargetData*)m_pOwner->m_pOuter)->GetData(); + pOuter->ShowDropList(FALSE); + return 1; +} +FX_INT32 CFWL_ComboListDelegate::OnDropListLButtonUp(CFWL_MsgMouse *pMsg) +{ + CFWL_ComboBoxImp *pOuter = (CFWL_ComboBoxImp*)((IFWL_TargetData*)m_pOwner->m_pOuter)->GetData(); + if (m_pOwner->m_bNotifyOwner) { + m_pOwner->ClientToOuter(pMsg->m_fx, pMsg->m_fy); + pOuter->m_pDelegate->OnProcessMessage(pMsg); + } else { + if (m_pOwner->IsShowScrollBar(TRUE) && m_pOwner->m_pVertScrollBar) { + CFX_RectF rect; + m_pOwner->m_pVertScrollBar->GetWidgetRect(rect); + if (rect.Contains(pMsg->m_fx, pMsg->m_fy)) { + return 1; + } + } + pOuter->ShowDropList(FALSE); + FWL_HLISTITEM hItem = m_pOwner->GetItemAtPoint(pMsg->m_fx, pMsg->m_fy); + if (hItem) { + pOuter->ProcessSelChanged(TRUE); + } + } + return 1; +} +FX_INT32 CFWL_ComboListDelegate::OnDropListKey(CFWL_MsgKey *pKey) +{ + CFWL_ComboBoxImp *pOuter = (CFWL_ComboBoxImp*)((IFWL_TargetData*)m_pOwner->m_pOuter)->GetData(); + FX_BOOL bPropagate = FALSE; + if (pKey->m_dwCmd == FWL_MSGKEYCMD_KeyDown) { + FX_DWORD dwKeyCode = pKey->m_dwKeyCode; + switch (dwKeyCode) { + case FWL_VKEY_Return: + case FWL_VKEY_Escape: { + pOuter->ShowDropList(FALSE); + return 1; + } + case FWL_VKEY_Up: + case FWL_VKEY_Down: { + OnDropListKeyDown(pKey); + IFWL_WidgetDelegate *pDelegate = pOuter->SetDelegate(NULL); + pOuter->ProcessSelChanged(FALSE); + return 1; + } + default: { + bPropagate = TRUE; + } + } + } else if (pKey->m_dwCmd == FWL_MSGKEYCMD_Char) { + bPropagate = TRUE; + } + if (bPropagate) { + pKey->m_pDstTarget = (IFWL_Widget*)m_pOwner->m_pOuter; + pOuter->m_pDelegate->OnProcessMessage(pKey); + return 1; + } + return 0; +} +void CFWL_ComboListDelegate::OnDropListKeyDown(CFWL_MsgKey *pKey) +{ + FX_DWORD dwKeyCode = pKey->m_dwKeyCode; + switch(dwKeyCode) { + case FWL_VKEY_Up: + case FWL_VKEY_Down: + case FWL_VKEY_Home: + case FWL_VKEY_End: { + CFWL_ComboBoxImp *pOuter = (CFWL_ComboBoxImp*)((IFWL_TargetData*)m_pOwner->m_pOuter)->GetData(); + IFWL_ListBoxDP *pData = (IFWL_ListBoxDP*)m_pOwner->m_pProperties->m_pDataProvider; + FWL_HLISTITEM hItem = pData->GetItem(m_pOwner->m_pInterface, pOuter->m_iCurSel); + hItem = m_pOwner->GetItem(hItem, dwKeyCode); + if (!hItem) { + break; + } + m_pOwner->SetSelection(hItem, hItem, TRUE); + m_pOwner->ScrollToVisible(hItem); + CFX_RectF rtInvalidate; + rtInvalidate.Set(0, + 0, + m_pOwner->m_pProperties->m_rtWidget.width, + m_pOwner->m_pProperties->m_rtWidget.height); + m_pOwner->Repaint(&rtInvalidate); + break; + } + default: { + } + } +} +CFWL_ComboBoxImp::CFWL_ComboBoxImp(IFWL_Widget *pOuter ) + : CFWL_WidgetImp(pOuter) + , m_pEdit(NULL) + , m_pListBox(NULL) + , m_pForm(NULL) + , m_bLButtonDown(FALSE) + , m_iCurSel(-1) + , m_iBtnState(FWL_PARTSTATE_CMB_Normal) + , m_fComboFormHandler(0) + , m_bNeedShowList(FALSE) +{ + m_rtClient.Reset(); + m_rtBtn.Reset(); + m_rtHandler.Reset(); +} +CFWL_ComboBoxImp::CFWL_ComboBoxImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter ) + : CFWL_WidgetImp(properties, pOuter) + , m_pEdit(NULL) + , m_pListBox(NULL) + , m_pForm(NULL) + , m_bLButtonDown(FALSE) + , m_iCurSel(-1) + , m_iBtnState(FWL_PARTSTATE_CMB_Normal) + , m_fComboFormHandler(0) + , m_bNeedShowList(FALSE) +{ + m_rtClient.Reset(); + m_rtBtn.Reset(); + m_rtHandler.Reset(); +} +CFWL_ComboBoxImp::~CFWL_ComboBoxImp() +{ + if (m_pEdit) { + m_pEdit->Release(); + m_pEdit = NULL; + } + if (m_pListBox) { + m_pListBox->Release(); + m_pListBox = NULL; + } +} +FWL_ERR CFWL_ComboBoxImp::GetClassName(CFX_WideString &wsClass) const +{ + wsClass = FWL_CLASS_ComboBox; + return FWL_ERR_Succeeded; +} +FX_DWORD CFWL_ComboBoxImp::GetClassID() const +{ + return FWL_CLASSHASH_ComboBox; +} +FWL_ERR CFWL_ComboBoxImp::Initialize() +{ + if (m_pWidgetMgr->IsFormDisabled()) { + return DisForm_Initialize(); + } + _FWL_ERR_CHECK_RETURN_VALUE_IF_FAIL(CFWL_WidgetImp::Initialize(), FWL_WGTSTATE_Invisible); + m_pDelegate = (IFWL_WidgetDelegate*)FX_NEW CFWL_ComboBoxImpDelegate(this); + CFWL_WidgetImpProperties prop; + prop.m_pThemeProvider = m_pProperties->m_pThemeProvider; + prop.m_dwStyles |= FWL_WGTSTYLE_Border | FWL_WGTSTYLE_VScroll; + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CMB_ListItemIconText) { + prop.m_dwStyleExes |= FWL_STYLEEXT_LTB_Icon; + } + prop.m_pDataProvider = m_pProperties->m_pDataProvider; + CFWL_ComboList *pList = FX_NEW CFWL_ComboList(prop, m_pInterface); + m_pListBox = IFWL_ListBox::Create(); + pList->SetInterface(m_pListBox); + ((IFWL_TargetData*)m_pListBox)->SetData(pList); + pList->Initialize(); + if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CMB_DropDown) && !m_pEdit) { + CFWL_ComboEdit *pEdit = FX_NEW CFWL_ComboEdit(m_pInterface); + m_pEdit = IFWL_Edit::Create(); + pEdit->SetInterface(m_pEdit); + ((IFWL_TargetData*)m_pEdit)->SetData(pEdit); + pEdit->Initialize(); + pEdit->SetOuter(m_pInterface); + } + if (m_pEdit) { + m_pEdit->SetParent(m_pInterface); + } + SetStates(m_pProperties->m_dwStates); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ComboBoxImp::Finalize() +{ + if (m_pEdit) { + m_pEdit->Finalize(); + } + m_pListBox->Finalize(); + if ( m_pDelegate) { + delete (CFWL_ComboBoxImpDelegate*)m_pDelegate; + m_pDelegate = NULL; + } + return CFWL_WidgetImp::Finalize(); +} +FWL_ERR CFWL_ComboBoxImp::GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize ) +{ + if (bAutoSize) { + rect.Reset(); + FX_BOOL bIsDropDown = IsDropDownStyle(); + if (bIsDropDown && m_pEdit) { + m_pEdit->GetWidgetRect(rect, TRUE); + } else { + rect.width = 100; + rect.height = 16; + } + if (!m_pProperties->m_pThemeProvider) { + ReSetTheme(); + } + FX_FLOAT *pFWidth = (FX_FLOAT*)GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth); + _FWL_RETURN_VALUE_IF_FAIL(pFWidth, FWL_ERR_Indefinite); + rect.Inflate(0, 0, *pFWidth, 0); + CFWL_WidgetImp::GetWidgetRect(rect, TRUE); + } else { + rect = m_pProperties->m_rtWidget; + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ComboBoxImp::ModifyStylesEx(FX_DWORD dwStylesExAdded, FX_DWORD dwStylesExRemoved) +{ + if (m_pWidgetMgr->IsFormDisabled()) { + return DisForm_ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved); + } + FX_BOOL bAddDropDown = dwStylesExAdded & FWL_STYLEEXT_CMB_DropDown; + FX_BOOL bRemoveDropDown = dwStylesExRemoved & FWL_STYLEEXT_CMB_DropDown; + if (bAddDropDown && !m_pEdit) { + CFWL_ComboEdit *pEdit = FX_NEW CFWL_ComboEdit(m_pInterface); + m_pEdit = IFWL_Edit::Create(); + pEdit->SetInterface(m_pEdit); + ((IFWL_TargetData*)m_pEdit)->SetData(pEdit); + pEdit->Initialize(); + pEdit->SetOuter(m_pInterface); + m_pEdit->SetParent(m_pInterface); + } else if (bRemoveDropDown && m_pEdit) { + m_pEdit->SetStates(FWL_WGTSTATE_Invisible, TRUE); + } + return CFWL_WidgetImp::ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved); +} +FWL_ERR CFWL_ComboBoxImp::Update() +{ + if (m_pWidgetMgr->IsFormDisabled()) { + return DisForm_Update(); + } + if (IsLocked()) { + return FWL_ERR_Indefinite; + } + ReSetTheme(); + FX_BOOL bDropDown = IsDropDownStyle(); + if (bDropDown && m_pEdit) { + ReSetEditAlignment(); + } + if (m_pProperties->m_pThemeProvider == NULL) { + m_pProperties->m_pThemeProvider = GetAvailableTheme(); + } + Layout(); + CFWL_ThemePart part; + part.m_pWidget = m_pInterface; + m_fComboFormHandler = *(FX_FLOAT *) m_pProperties->m_pThemeProvider->GetCapacity(&part, FWL_WGTCAPACITY_CMB_ComboFormHandler); + return FWL_ERR_Succeeded; +} +FX_DWORD CFWL_ComboBoxImp::HitTest(FX_FLOAT fx, FX_FLOAT fy) +{ + if (m_pWidgetMgr->IsFormDisabled()) { + return DisForm_HitTest(fx, fy); + } + return CFWL_WidgetImp::HitTest(fx, fy); +} +FWL_ERR CFWL_ComboBoxImp::DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + if (m_pWidgetMgr->IsFormDisabled()) { + return DisForm_DrawWidget(pGraphics, pMatrix); + } + _FWL_RETURN_VALUE_IF_FAIL(pGraphics, FWL_ERR_Indefinite); + _FWL_RETURN_VALUE_IF_FAIL(m_pProperties->m_pThemeProvider, FWL_ERR_Indefinite); + IFWL_ThemeProvider *pTheme = m_pProperties->m_pThemeProvider; + FX_BOOL bIsDropDown = IsDropDownStyle(); + if (HasBorder()) { + DrawBorder(pGraphics, FWL_PART_CMB_Border, pTheme, pMatrix); + } + if (HasEdge()) { + DrawEdge(pGraphics, FWL_PART_CMB_Edge, pTheme, pMatrix); + } + if (!bIsDropDown) { + CFX_RectF rtTextBk(m_rtClient); + rtTextBk.width -= m_rtBtn.width; + CFWL_ThemeBackground param; + param.m_pWidget = m_pInterface; + param.m_iPart = FWL_PART_CMB_Background; + param.m_pGraphics = pGraphics; + if (pMatrix) { + param.m_matrix.Concat(*pMatrix); + } + param.m_rtPart = rtTextBk; + if (m_iCurSel >= 0) { + IFWL_ListBoxDP* pData = (IFWL_ListBoxDP*)((CFWL_ComboList*)((IFWL_TargetData*)m_pListBox)->GetData())->m_pProperties->m_pDataProvider; + FX_LPVOID p = pData->GetItemData(m_pListBox, pData->GetItem(m_pListBox, m_iCurSel)); + if (p != NULL) { + param.m_pData = p; + } + } + if (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) { + param.m_dwStates = FWL_PARTSTATE_CMB_Disabled; + } else if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) && (m_iCurSel >= 0)) { + param.m_dwStates = FWL_PARTSTATE_CMB_Selected; + } else { + param.m_dwStates = FWL_PARTSTATE_CMB_Normal; + } + pTheme->DrawBackground(¶m); + if (m_iCurSel >= 0) { + _FWL_RETURN_VALUE_IF_FAIL(m_pListBox, FWL_ERR_Indefinite); + CFX_WideString wsText; + IFWL_ComboBoxDP *pData = (IFWL_ComboBoxDP *)m_pProperties->m_pDataProvider; + FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, m_iCurSel); + ((CFWL_ComboList*)((IFWL_TargetData*)m_pListBox)->GetData())->GetItemText(hItem, wsText); + CFWL_ThemeText param; + param.m_pWidget = m_pInterface; + param.m_iPart = FWL_PART_CMB_Caption; + param.m_dwStates = m_iBtnState; + param.m_pGraphics = pGraphics; + param.m_matrix.Concat(*pMatrix); + param.m_rtPart = rtTextBk; + param.m_dwStates = (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) ? FWL_PARTSTATE_CMB_Selected : FWL_PARTSTATE_CMB_Normal; + param.m_wsText = wsText; + param.m_dwTTOStyles = FDE_TTOSTYLE_SingleLine; + param.m_iTTOAlign = FDE_TTOALIGNMENT_CenterLeft; + pTheme->DrawText(¶m); + } + } + { + CFWL_ThemeBackground param; + param.m_pWidget = m_pInterface; + param.m_iPart = FWL_PART_CMB_DropDownButton; + param.m_dwStates = (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) ? FWL_PARTSTATE_CMB_Disabled : m_iBtnState; + param.m_pGraphics = pGraphics; + param.m_matrix.Concat(*pMatrix); + param.m_rtPart = m_rtBtn; + pTheme->DrawBackground(¶m); + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ComboBoxImp::SetThemeProvider(IFWL_ThemeProvider *pThemeProvider) +{ + _FWL_RETURN_VALUE_IF_FAIL(pThemeProvider, FWL_ERR_Indefinite); + m_pProperties->m_pThemeProvider = pThemeProvider; + if (m_pListBox && pThemeProvider->IsValidWidget(m_pListBox)) { + m_pListBox->SetThemeProvider(pThemeProvider); + } + if (m_pEdit && pThemeProvider->IsValidWidget(m_pEdit)) { + m_pEdit->SetThemeProvider(pThemeProvider); + } + return FWL_ERR_Succeeded; +} +FX_INT32 CFWL_ComboBoxImp::GetCurSel() +{ + return m_iCurSel; +} +FWL_ERR CFWL_ComboBoxImp::SetCurSel(FX_INT32 iSel) +{ + FX_INT32 iCount = ((CFWL_ComboList*)((IFWL_TargetData*)m_pListBox)->GetData())->CountItems(); + FX_BOOL bClearSel = iSel < 0 || iSel >= iCount; + FX_BOOL bDropDown = IsDropDownStyle(); + if (bDropDown && m_pEdit) { + if (bClearSel) { + m_pEdit->SetText(CFX_WideString()); + } else { + CFX_WideString wsText; + IFWL_ComboBoxDP *pData = (IFWL_ComboBoxDP *)m_pProperties->m_pDataProvider; + FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, iSel); + ((CFWL_ComboList*)((IFWL_TargetData*)m_pListBox)->GetData())->GetItemText(hItem, wsText); + m_pEdit->SetText(wsText); + } + m_pEdit->Update(); + } + m_iCurSel = bClearSel ? -1 : iSel; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ComboBoxImp::SetStates(FX_DWORD dwStates, FX_BOOL bSet ) +{ + FX_BOOL bIsDropDown = IsDropDownStyle(); + if (bIsDropDown && m_pEdit) { + m_pEdit->SetStates(dwStates, bSet); + } + if (m_pListBox) { + m_pListBox->SetStates(dwStates, bSet); + } + return CFWL_WidgetImp::SetStates(dwStates, bSet); +} +FWL_ERR CFWL_ComboBoxImp::SetEditText(const CFX_WideString &wsText) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdit, FWL_ERR_Indefinite); + m_pEdit->SetText(wsText); + return m_pEdit->Update(); +} +FX_INT32 CFWL_ComboBoxImp::GetEditTextLength() const +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdit, -1); + return m_pEdit->GetTextLength(); +} +FWL_ERR CFWL_ComboBoxImp::GetEditText(CFX_WideString &wsText, FX_INT32 nStart , FX_INT32 nCount ) const +{ + if (m_pEdit) { + return m_pEdit->GetText(wsText, nStart, nCount); + } else if (m_pListBox) { + IFWL_ComboBoxDP *pData = (IFWL_ComboBoxDP *)m_pProperties->m_pDataProvider; + FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, m_iCurSel); + return m_pListBox->GetItemText(hItem, wsText); + } + return FWL_ERR_Indefinite; +} +FWL_ERR CFWL_ComboBoxImp::SetEditSelRange(FX_INT32 nStart, FX_INT32 nCount ) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdit, FWL_ERR_Indefinite); + ((CFWL_ComboEdit*)((IFWL_TargetData*)m_pEdit)->GetData())->ClearSelected(); + m_pEdit->AddSelRange(nStart, nCount); + return FWL_ERR_Succeeded; +} +FX_INT32 CFWL_ComboBoxImp::GetEditSelRange(FX_INT32 nIndex, FX_INT32 &nStart) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdit, -1); + return m_pEdit->GetSelRange(nIndex, nStart); +} +FX_INT32 CFWL_ComboBoxImp::GetEditLimit() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdit, -1); + return m_pEdit->GetLimit(); +} +FWL_ERR CFWL_ComboBoxImp::SetEditLimit(FX_INT32 nLimit) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdit, FWL_ERR_Indefinite); + return m_pEdit->SetLimit(nLimit); +} +FWL_ERR CFWL_ComboBoxImp::EditDoClipboard(FX_INT32 iCmd) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdit, FWL_ERR_Indefinite); + return m_pEdit->DoClipboard(iCmd); +} +FX_BOOL CFWL_ComboBoxImp::EditRedo(FX_BSTR bsRecord) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdit, FALSE); + return m_pEdit->Redo(bsRecord); +} +FX_BOOL CFWL_ComboBoxImp::EditUndo(FX_BSTR bsRecord) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdit, FALSE); + return m_pEdit->Undo(bsRecord); +} +IFWL_ListBox* CFWL_ComboBoxImp::GetListBoxt() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pListBox, FALSE); + return m_pListBox; +} +FX_BOOL CFWL_ComboBoxImp::AfterFocusShowDropList() +{ + if (!m_bNeedShowList) { + return FALSE; + } + if (m_pEdit) { + MatchEditText(); + } + ShowDropList(TRUE); + m_bNeedShowList = FALSE; + return TRUE; +} +FX_ERR CFWL_ComboBoxImp::OpenDropDownList(FX_BOOL bActivate) +{ + ShowDropList(bActivate); + return FWL_ERR_Succeeded; +} +FX_BOOL CFWL_ComboBoxImp::EditCanUndo() +{ + return m_pEdit->CanUndo(); +} +FX_BOOL CFWL_ComboBoxImp::EditCanRedo() +{ + return m_pEdit->CanRedo(); +} +FX_BOOL CFWL_ComboBoxImp::EditUndo() +{ + return m_pEdit->Undo(); +} +FX_BOOL CFWL_ComboBoxImp::EditRedo() +{ + return m_pEdit->Redo(); +} +FX_BOOL CFWL_ComboBoxImp::EditCanCopy() +{ + return m_pEdit->CountSelRanges() > 0; +} +FX_BOOL CFWL_ComboBoxImp::EditCanCut() +{ + if (m_pEdit->GetStylesEx() & FWL_STYLEEXT_EDT_ReadOnly) { + return FALSE; + } + return m_pEdit->CountSelRanges() > 0; +} +FX_BOOL CFWL_ComboBoxImp::EditCanSelectAll() +{ + return m_pEdit->GetTextLength() > 0; +} +FX_BOOL CFWL_ComboBoxImp::EditCopy(CFX_WideString &wsCopy) +{ + return m_pEdit->Copy(wsCopy); +} +FX_BOOL CFWL_ComboBoxImp::EditCut(CFX_WideString &wsCut) +{ + return m_pEdit->Cut(wsCut); +} +FX_BOOL CFWL_ComboBoxImp::EditPaste(const CFX_WideString &wsPaste) +{ + return m_pEdit->Paste(wsPaste); +} +FX_BOOL CFWL_ComboBoxImp::EditSelectAll() +{ + return (m_pEdit->AddSelRange(0) == FWL_ERR_Succeeded) ? TRUE : FALSE; +} +FX_BOOL CFWL_ComboBoxImp::EditDelete() +{ + return (m_pEdit->ClearText() == FWL_ERR_Succeeded) ? TRUE : FALSE; +} +FX_BOOL CFWL_ComboBoxImp::EditDeSelect() +{ + return (m_pEdit->ClearSelections() == FWL_ERR_Succeeded) ? TRUE : FALSE; +} +FWL_ERR CFWL_ComboBoxImp::GetBBox(CFX_RectF &rect) +{ + if (m_pWidgetMgr->IsFormDisabled()) { + return DisForm_GetBBox(rect); + } + rect = m_pProperties->m_rtWidget; + if (m_pListBox && IsDropListShowed()) { + CFX_RectF rtList; + m_pListBox->GetWidgetRect(rtList); + rtList.Offset(rect.left, rect.top); + rect.Union(rtList); + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ComboBoxImp::EditModifyStylesEx(FX_DWORD dwStylesExAdded, + FX_DWORD dwStylesExRemoved) +{ + if (m_pEdit != NULL) { + return m_pEdit->ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved); + } else { + return FWL_ERR_Parameter_Invalid; + } +} +FX_FLOAT CFWL_ComboBoxImp::GetListHeight() +{ + return ((IFWL_ComboBoxDP*)m_pProperties->m_pDataProvider)->GetListHeight(m_pInterface); +} +void CFWL_ComboBoxImp::DrawStretchHandler(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix) +{ + CFWL_ThemeBackground param; + param.m_pGraphics = pGraphics; + param.m_iPart = FWL_PART_CMB_StretcgHandler; + param.m_dwStates = FWL_PARTSTATE_CMB_Normal; + param.m_pWidget = m_pInterface; + if (pMatrix) { + param.m_matrix.Concat(*pMatrix); + } + param.m_rtPart = m_rtHandler; + m_pProperties->m_pThemeProvider->DrawBackground(¶m); +} +void CFWL_ComboBoxImp::ShowDropList(FX_BOOL bActivate) +{ + if (m_pWidgetMgr->IsFormDisabled()) { + return DisForm_ShowDropList(bActivate); + } + FX_BOOL bDropList = IsDropListShowed(); + if(bDropList == bActivate) { + return; + } + if (!m_pForm) { + InitProxyForm(); + } + m_pListProxyDelegate->Reset(); + if (bActivate) { + ((CFWL_ComboList*)((IFWL_TargetData*)m_pListBox)->GetData())->ChangeSelected(m_iCurSel); + ReSetListItemAlignment(); + FX_DWORD dwStyleAdd = m_pProperties->m_dwStyleExes & (FWL_STYLEEXT_CMB_Sort | FWL_STYLEEXT_CMB_OwnerDraw); + m_pListBox->ModifyStylesEx(dwStyleAdd, 0); + m_pListBox->GetWidgetRect(m_rtList, TRUE); + FX_FLOAT fHeight = GetListHeight(); + if (fHeight > 0) { + if (m_rtList.height > GetListHeight()) { + m_rtList.height = GetListHeight(); + m_pListBox->ModifyStyles(FWL_WGTSTYLE_VScroll, 0); + } + } + CFX_RectF rtAnchor; + rtAnchor.Set(0, + 0, + m_pProperties->m_rtWidget.width, + m_pProperties->m_rtWidget.height); + FX_FLOAT fMinHeight = 0; + FX_FLOAT fMaxHeight = m_rtList.height; + if (m_rtList.width < m_rtClient.width) { + m_rtList.width = m_rtClient.width; + } + m_rtProxy = m_rtList; + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CMB_ListDrag) { + m_rtProxy.height += m_fComboFormHandler; + } + GetPopupPos(fMinHeight, m_rtProxy.height, rtAnchor, m_rtProxy); + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CMB_ListDrag) { + FX_FLOAT fx = 0; + FX_FLOAT fy = m_rtClient.top + m_rtClient.height / 2; + TransformTo(NULL, fx, fy); + m_bUpFormHandler = fy > m_rtProxy.top; + if (m_bUpFormHandler) { + m_rtHandler.Set(0, 0, m_rtList.width, m_fComboFormHandler); + m_rtList.top = m_fComboFormHandler; + } else { + m_rtHandler.Set(0, m_rtList.height, m_rtList.width, m_fComboFormHandler); + } + } + m_pForm->SetWidgetRect(m_rtProxy); + m_pForm->Update(); + m_pListBox->SetWidgetRect(m_rtList); + m_pListBox->Update(); + CFWL_EvtCmbPreDropDown ev; + ev.m_pSrcTarget = m_pInterface; + DispatchEvent(&ev); + m_fItemHeight = ((CFWL_ComboList*)((IFWL_TargetData*)m_pListBox)->GetData())->m_fItemHeight; + ((CFWL_ComboList*)((IFWL_TargetData*)m_pListBox)->GetData())->SetFocus(TRUE); + m_pForm->DoModal(); + ((CFWL_ComboList*)((IFWL_TargetData*)m_pListBox)->GetData())->SetFocus(FALSE); + } else { + m_pForm->EndDoModal(); + CFWL_EvtCmbCloseUp ev; + ev.m_pSrcTarget = m_pInterface; + DispatchEvent(&ev); + m_bLButtonDown = FALSE; + ((CFWL_ComboList*)((IFWL_TargetData*)m_pListBox)->GetData())->m_bNotifyOwner = TRUE; + SetFocus(TRUE); + } +} +FX_BOOL CFWL_ComboBoxImp::IsDropListShowed() +{ + return m_pForm && !(m_pForm->GetStates() & FWL_WGTSTATE_Invisible); +} +FX_BOOL CFWL_ComboBoxImp::IsDropDownStyle() const +{ + return m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CMB_DropDown; +} +void CFWL_ComboBoxImp::MatchEditText() +{ + CFX_WideString wsText; + m_pEdit->GetText(wsText); + FX_INT32 iMatch = ((CFWL_ComboList*)((IFWL_TargetData*)m_pListBox)->GetData())->MatchItem(wsText); + if (iMatch != m_iCurSel) { + ((CFWL_ComboList*)((IFWL_TargetData*)m_pListBox)->GetData())->ChangeSelected(iMatch); + if (iMatch >= 0) { + SynchrEditText(iMatch); + } + } else if (iMatch >= 0) { + ((CFWL_ComboEdit*)((IFWL_TargetData*)m_pEdit)->GetData())->SetSelected(); + } + m_iCurSel = iMatch; +} +void CFWL_ComboBoxImp::SynchrEditText(FX_INT32 iListItem) +{ + CFX_WideString wsText; + IFWL_ComboBoxDP *pData = (IFWL_ComboBoxDP *)m_pProperties->m_pDataProvider; + FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, iListItem); + ((CFWL_ComboList*)((IFWL_TargetData*)m_pListBox)->GetData())->GetItemText(hItem, wsText); + m_pEdit->SetText(wsText); + m_pEdit->Update(); + ((CFWL_ComboEdit*)((IFWL_TargetData*)m_pEdit)->GetData())->SetSelected(); +} +void CFWL_ComboBoxImp::Layout() +{ + if (m_pWidgetMgr->IsFormDisabled()) { + return DisForm_Layout(); + } + GetClientRect(m_rtClient); + FX_FLOAT *pFWidth = (FX_FLOAT*)GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth); + _FWL_RETURN_IF_FAIL(pFWidth); + FX_FLOAT fBtn = *pFWidth; + m_rtBtn.Set(m_rtClient.right() - fBtn, m_rtClient.top, fBtn, m_rtClient.height); + FX_BOOL bIsDropDown = IsDropDownStyle(); + if (bIsDropDown && m_pEdit) { + CFX_RectF rtEdit; + rtEdit.Set(m_rtClient.left, m_rtClient.top, m_rtClient.width - fBtn, m_rtClient.height); + m_pEdit->SetWidgetRect(rtEdit); + if (m_iCurSel >= 0) { + CFX_WideString wsText; + IFWL_ComboBoxDP *pData = (IFWL_ComboBoxDP *)m_pProperties->m_pDataProvider; + FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, m_iCurSel); + ((CFWL_ComboList*)((IFWL_TargetData*)m_pListBox)->GetData())->GetItemText(hItem, wsText); + m_pEdit->LockUpdate(); + m_pEdit->SetText(wsText); + m_pEdit->UnlockUpdate(); + } + m_pEdit->Update(); + } +} +void CFWL_ComboBoxImp::ReSetTheme() +{ + IFWL_ThemeProvider *pTheme = m_pProperties->m_pThemeProvider; + if (!pTheme) { + pTheme = GetAvailableTheme(); + m_pProperties->m_pThemeProvider = pTheme; + } + if (m_pListBox) { + if (!m_pListBox->GetThemeProvider() && pTheme->IsValidWidget(m_pListBox)) { + m_pListBox->SetThemeProvider(pTheme); + } + } + if (m_pEdit) { + if (!m_pEdit->GetThemeProvider() && pTheme->IsValidWidget(m_pEdit)) { + m_pEdit->SetThemeProvider(pTheme); + } + } +} +void CFWL_ComboBoxImp::ReSetEditAlignment() +{ + _FWL_RETURN_IF_FAIL(m_pEdit); + FX_DWORD dwStylExes = m_pProperties->m_dwStyleExes; + FX_DWORD dwAdd = 0; + switch (dwStylExes & FWL_STYLEEXT_CMB_EditHAlignMask) { + case FWL_STYLEEXT_CMB_EditHCenter: { + dwAdd |= FWL_STYLEEXT_EDT_HCenter; + break; + } + case FWL_STYLEEXT_CMB_EditHFar: { + dwAdd |= FWL_STYLEEXT_EDT_HFar; + break; + } + default: { + dwAdd |= FWL_STYLEEXT_EDT_HNear; + } + } + switch (dwStylExes & FWL_STYLEEXT_CMB_EditVAlignMask) { + case FWL_STYLEEXT_CMB_EditVCenter: { + dwAdd |= FWL_STYLEEXT_EDT_VCenter; + break; + } + case FWL_STYLEEXT_CMB_EditVFar: { + dwAdd |= FWL_STYLEEXT_EDT_VFar; + break; + } + default: { + dwAdd |= FWL_STYLEEXT_EDT_VNear; + } + } + if (dwStylExes & FWL_STYLEEXT_CMB_EditJustified) { + dwAdd |= FWL_STYLEEXT_EDT_Justified; + } + if (dwStylExes & FWL_STYLEEXT_CMB_EditDistributed) { + dwAdd |= FWL_STYLEEXT_EDT_Distributed; + } + m_pEdit->ModifyStylesEx(dwAdd, FWL_STYLEEXT_EDT_HAlignMask | + FWL_STYLEEXT_EDT_HAlignModeMask | + FWL_STYLEEXT_EDT_VAlignMask); +} +void CFWL_ComboBoxImp::ReSetListItemAlignment() +{ + _FWL_RETURN_IF_FAIL(m_pListBox); + FX_DWORD dwStylExes = m_pProperties->m_dwStyleExes; + FX_DWORD dwAdd = 0; + switch (dwStylExes & FWL_STYLEEXT_CMB_ListItemAlignMask) { + case FWL_STYLEEXT_CMB_ListItemCenterAlign: { + dwAdd |= FWL_STYLEEXT_LTB_CenterAlign; + } + case FWL_STYLEEXT_CMB_ListItemRightAlign: { + dwAdd |= FWL_STYLEEXT_LTB_RightAlign; + } + default: { + dwAdd |= FWL_STYLEEXT_LTB_LeftAlign; + } + } + m_pListBox->ModifyStylesEx(dwAdd, FWL_STYLEEXT_CMB_ListItemAlignMask); +} +void CFWL_ComboBoxImp::ProcessSelChanged(FX_BOOL bLButtonUp) +{ + IFWL_ComboBoxDP *pDatas = (IFWL_ComboBoxDP*)m_pProperties->m_pDataProvider; + m_iCurSel = pDatas->GetItemIndex(m_pInterface, m_pListBox->GetSelItem(0)); + FX_BOOL bDropDown = IsDropDownStyle(); + if (bDropDown) { + IFWL_ComboBoxDP *pData = (IFWL_ComboBoxDP*)m_pProperties->m_pDataProvider; + FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, m_iCurSel); + if (hItem) { + CFX_WideString wsText; + pData->GetItemText(m_pInterface, hItem, wsText); + if (m_pEdit) { + m_pEdit->SetText(wsText); + m_pEdit->Update(); + ((CFWL_ComboEdit*)((IFWL_TargetData*)m_pEdit)->GetData())->SetSelected(); + } + CFWL_EvtCmbSelChanged ev; + ev.bLButtonUp = bLButtonUp; + ev.m_pSrcTarget = m_pInterface; + ev.iArraySels.Add(m_iCurSel); + DispatchEvent(&ev); + } + } else { + Repaint(&m_rtClient); + } +} +void CFWL_ComboBoxImp::InitProxyForm() +{ + _FWL_RETURN_IF_FAIL(!m_pForm); + _FWL_RETURN_IF_FAIL(m_pListBox); + CFWL_WidgetImpProperties propForm; + propForm.m_pOwner = m_pInterface; + propForm.m_dwStyles = FWL_WGTSTYLE_Popup; + propForm.m_dwStates = FWL_WGTSTATE_Invisible; + m_pProxy = FX_NEW CFWL_FormProxyImp(propForm, m_pListBox); + m_pForm = IFWL_Form::Create(); + m_pProxy->SetInterface(m_pForm); + ((IFWL_TargetData*)m_pForm)->SetData(m_pProxy); + m_pProxy->Initialize(); + m_pListBox->SetParent((IFWL_Widget*)m_pForm); + m_pListProxyDelegate = FX_NEW CFWL_ComboProxyImpDelegate(m_pForm, this); + m_pProxy->SetDelegate((IFWL_WidgetDelegate*)m_pListProxyDelegate); +} +FWL_ERR CFWL_ComboBoxImp::DisForm_Initialize() +{ + _FWL_ERR_CHECK_RETURN_VALUE_IF_FAIL(CFWL_WidgetImp::Initialize(), FWL_WGTSTATE_Invisible); + m_pDelegate = (IFWL_WidgetDelegate*)FX_NEW CFWL_ComboBoxImpDelegate(this); + DisForm_InitComboList(); + DisForm_InitComboEdit(); + return FWL_ERR_Succeeded; +} +void CFWL_ComboBoxImp::DisForm_InitComboList() +{ + if (m_pListBox) { + return; + } + CFWL_WidgetImpProperties prop; + prop.m_pParent = (IFWL_Widget*)this->m_pInterface; + prop.m_dwStyles = FWL_WGTSTYLE_Border | FWL_WGTSTYLE_VScroll; + prop.m_dwStates = FWL_WGTSTATE_Invisible; + prop.m_pDataProvider = m_pProperties->m_pDataProvider; + prop.m_pThemeProvider = m_pProperties->m_pThemeProvider; + CFWL_ComboList *pList = FX_NEW CFWL_ComboList(prop, m_pInterface); + m_pListBox = IFWL_ListBox::Create(); + pList->SetInterface(m_pListBox); + ((IFWL_TargetData*)m_pListBox)->SetData(pList); + pList->Initialize(); +} +void CFWL_ComboBoxImp::DisForm_InitComboEdit() +{ + if (m_pEdit) { + return; + } + CFWL_WidgetImpProperties prop; + prop.m_pParent = (IFWL_Widget*)this->m_pInterface; + prop.m_pThemeProvider = m_pProperties->m_pThemeProvider; + if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CMB_DropDown) == 0) { + } + CFWL_ComboEdit *pEdit = FX_NEW CFWL_ComboEdit(prop, m_pInterface); + m_pEdit = IFWL_Edit::Create(); + pEdit->SetInterface(m_pEdit); + ((IFWL_TargetData*)m_pEdit)->SetData(pEdit); + pEdit->Initialize(); + pEdit->SetOuter(m_pInterface); +} +void CFWL_ComboBoxImp::DisForm_ShowDropList(FX_BOOL bActivate) +{ + FX_BOOL bDropList = DisForm_IsDropListShowed(); + if(bDropList == bActivate) { + return; + } + if (bActivate) { + CFWL_EvtCmbPreDropDown preEvent; + preEvent.m_pSrcTarget = m_pInterface; + DispatchEvent(&preEvent); + CFWL_ComboList* pComboList = (CFWL_ComboList*)(((IFWL_TargetData*)m_pListBox)->GetData()); + FX_INT32 iItems = pComboList->CountItems(); + if (iItems < 1) { + return; + } + ReSetListItemAlignment(); + pComboList->ChangeSelected(m_iCurSel); + FX_FLOAT fItemHeight = pComboList->GetItemHeigt(); + FX_FLOAT fBorder = GetBorderSize(); + FX_DWORD nWhere = 0; + FX_FLOAT fPopupRet = 0.0f; + FX_FLOAT fPopupMin = 0.0f; + if (iItems > 3) { + fPopupMin = fItemHeight * 3 + fBorder * 2; + } + FX_FLOAT fPopupMax = fItemHeight * iItems + fBorder * 2; + CFX_RectF rtList; + rtList.left = m_rtClient.left; + rtList.width = m_pProperties->m_rtWidget.width; + rtList.top = 0; + rtList.height = 0; + GetPopupPos(fPopupMin, fPopupMax, m_pProperties->m_rtWidget, rtList); + m_pListBox->SetWidgetRect(rtList); + m_pListBox->Update(); + } else { + SetFocus(TRUE); + } + m_pListBox->SetStates(FWL_WGTSTATE_Invisible, !bActivate); + if (bActivate) { + CFWL_EvtCmbPostDropDown postEvent; + postEvent.m_pSrcTarget = m_pInterface; + DispatchEvent(&postEvent); + } + CFX_RectF rect; + m_pListBox->GetWidgetRect(rect); + rect.Inflate(2, 2); + Repaint(&rect); +} +FX_BOOL CFWL_ComboBoxImp::DisForm_IsDropListShowed() +{ + return !(m_pListBox->GetStates() & FWL_WGTSTATE_Invisible); +} +FWL_ERR CFWL_ComboBoxImp::DisForm_ModifyStylesEx(FX_DWORD dwStylesExAdded, FX_DWORD dwStylesExRemoved) +{ + if (!m_pEdit) { + DisForm_InitComboEdit(); + } + FX_BOOL bAddDropDown = dwStylesExAdded & FWL_STYLEEXT_CMB_DropDown; + FX_BOOL bDelDropDown = dwStylesExRemoved & FWL_STYLEEXT_CMB_DropDown; + dwStylesExRemoved &= ~FWL_STYLEEXT_CMB_DropDown; + m_pProperties->m_dwStyleExes |= FWL_STYLEEXT_CMB_DropDown; + if (bAddDropDown) { + m_pEdit->ModifyStylesEx(0, FWL_STYLEEXT_EDT_ReadOnly); + } else if (bDelDropDown) { + m_pEdit->ModifyStylesEx(FWL_STYLEEXT_EDT_ReadOnly, 0); + } + return CFWL_WidgetImp::ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved); +} +FWL_ERR CFWL_ComboBoxImp::DisForm_Update() +{ + if (m_iLock) { + return FWL_ERR_Indefinite; + } + if (m_pEdit) { + ReSetEditAlignment(); + } + ReSetTheme(); + Layout(); + return FWL_ERR_Succeeded; +} +FX_DWORD CFWL_ComboBoxImp::DisForm_HitTest(FX_FLOAT fx, FX_FLOAT fy) +{ + CFX_RectF rect; + rect.Set(0, + 0, + m_pProperties->m_rtWidget.width - m_rtBtn.width, + m_pProperties->m_rtWidget.height); + if (rect.Contains(fx, fy)) { + return FWL_WGTHITTEST_Edit; + } + if (m_rtBtn.Contains(fx, fy)) { + return FWL_WGTHITTEST_Client; + } + if (DisForm_IsDropListShowed()) { + m_pListBox->GetWidgetRect(rect); + if (rect.Contains(fx, fy)) { + return FWL_WGTHITTEST_Client; + } + } + return FWL_WGTHITTEST_Unknown; +} +FWL_ERR CFWL_ComboBoxImp::DisForm_DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix) +{ + IFWL_ThemeProvider *pTheme = m_pProperties->m_pThemeProvider; + CFX_Matrix mtOrg; + mtOrg.Set(1, 0, 0, 1, 0, 0); + if (pMatrix) { + mtOrg = *pMatrix; + } + FX_BOOL bListShowed = m_pListBox && DisForm_IsDropListShowed(); + pGraphics->SaveGraphState(); + pGraphics->ConcatMatrix(&mtOrg); + if (!m_rtBtn.IsEmpty(0.1f)) { + CFWL_ThemeBackground param; + param.m_pWidget = (IFWL_Widget*)this->m_pInterface; + param.m_iPart = FWL_PART_CMB_DropDownButton; + param.m_dwStates = m_iBtnState; + param.m_pGraphics = pGraphics; + param.m_rtPart = m_rtBtn; + pTheme->DrawBackground(¶m); + } + pGraphics->RestoreGraphState(); + if (m_pEdit) { + CFX_RectF rtEdit; + m_pEdit->GetWidgetRect(rtEdit); + CFX_Matrix mt; + mt.Set(1, 0, 0, 1, rtEdit.left, rtEdit.top); + mt.Concat(mtOrg); + m_pEdit->DrawWidget(pGraphics, &mt); + } + if (bListShowed) { + CFX_RectF rtList; + m_pListBox->GetWidgetRect(rtList); + CFX_Matrix mt; + mt.Set(1, 0, 0, 1, rtList.left, rtList.top); + mt.Concat(mtOrg); + m_pListBox->DrawWidget(pGraphics, &mt); + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ComboBoxImp::DisForm_GetBBox(CFX_RectF &rect) +{ + rect = m_pProperties->m_rtWidget; + if (m_pListBox && DisForm_IsDropListShowed()) { + CFX_RectF rtList; + m_pListBox->GetWidgetRect(rtList); + rtList.Offset(rect.left, rect.top); + rect.Union(rtList); + } + return FWL_ERR_Succeeded; +} +void CFWL_ComboBoxImp::DisForm_Layout() +{ + GetClientRect(m_rtClient); + m_rtContent = m_rtClient; + FX_FLOAT *pFWidth = (FX_FLOAT*)GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth); + _FWL_RETURN_IF_FAIL(pFWidth); + FX_FLOAT borderWidth = 0; + { + borderWidth = FWL_PART_CMB_Border; + } + FX_FLOAT fBtn = *pFWidth; + if (!(this->GetStylesEx() & FWL_STYLEEXT_CMB_ReadOnly)) { + m_rtBtn.Set(m_rtClient.right() - fBtn, m_rtClient.top + borderWidth, + fBtn - borderWidth, m_rtClient.height - 2 * borderWidth); + } + CFX_RectF* pUIMargin = (CFX_RectF*)GetThemeCapacity(FWL_WGTCAPACITY_UIMargin); + if (pUIMargin) { + m_rtContent.Deflate(pUIMargin->left, pUIMargin->top, pUIMargin->width, pUIMargin->height); + } + FX_BOOL bIsDropDown = IsDropDownStyle(); + if (bIsDropDown && m_pEdit) { + CFX_RectF rtEdit; + rtEdit.Set(m_rtContent.left, + m_rtContent.top, m_rtContent.width - fBtn, m_rtContent.height); + m_pEdit->SetWidgetRect(rtEdit); + if (m_iCurSel >= 0) { + CFX_WideString wsText; + IFWL_ComboBoxDP *pData = (IFWL_ComboBoxDP *)m_pProperties->m_pDataProvider; + FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, m_iCurSel); + ((CFWL_ComboList*)((IFWL_TargetData*)m_pListBox)->GetData())->GetItemText(hItem, wsText); + m_pEdit->LockUpdate(); + m_pEdit->SetText(wsText); + m_pEdit->UnlockUpdate(); + } + m_pEdit->Update(); + } +} +CFWL_ComboBoxImpDelegate::CFWL_ComboBoxImpDelegate(CFWL_ComboBoxImp *pOwner) + : m_pOwner(pOwner) +{ +} +FX_INT32 CFWL_ComboBoxImpDelegate::OnProcessMessage(CFWL_Message *pMessage) +{ + if (m_pOwner->m_pWidgetMgr->IsFormDisabled()) { + return DisForm_OnProcessMessage(pMessage); + } + _FWL_RETURN_VALUE_IF_FAIL(pMessage, 0); + FX_DWORD dwMsgCode = pMessage->GetClassID(); + FX_BOOL iRet = 1; + switch (dwMsgCode) { + case FWL_MSGHASH_SetFocus: + case FWL_MSGHASH_KillFocus: { + OnFocusChanged(pMessage, dwMsgCode == FWL_MSGHASH_SetFocus); + break; + } + case FWL_MSGHASH_Mouse: { + CFWL_MsgMouse *pMsg = (CFWL_MsgMouse*)pMessage; + FX_DWORD dwCmd = pMsg->m_dwCmd; + switch(dwCmd) { + case FWL_MSGMOUSECMD_LButtonDown: { + OnLButtonDown(pMsg); + break; + } + case FWL_MSGMOUSECMD_LButtonUp: { + OnLButtonUp(pMsg); + break; + } + case FWL_MSGMOUSECMD_MouseMove: { + OnMouseMove(pMsg); + break; + } + case FWL_MSGMOUSECMD_MouseLeave: { + OnMouseLeave(pMsg); + break; + } + default: { + } + } + break; + } + case FWL_MSGHASH_Key: { + OnKey((CFWL_MsgKey*)pMessage); + break; + } + default: { + iRet = 0; + } + } + CFWL_WidgetImpDelegate::OnProcessMessage(pMessage); + return iRet; +} +FWL_ERR CFWL_ComboBoxImpDelegate::OnProcessEvent(CFWL_Event *pEvent) +{ + FX_DWORD dwFlag = pEvent->GetClassID(); + if (dwFlag == FWL_EVTHASH_LTB_DrawItem) { + CFWL_EvtCmbDrawItem pTemp; + pTemp.m_pSrcTarget = m_pOwner->m_pInterface; + pTemp.m_pGraphics = ((CFWL_EvtLtbDrawItem *)pEvent)->m_pGraphics; + pTemp.m_index = ((CFWL_EvtLtbDrawItem *)pEvent)->m_index; + pTemp.m_rtItem = ((CFWL_EvtLtbDrawItem *)pEvent)->m_rect; + m_pOwner->DispatchEvent(&pTemp); + } else if (dwFlag == FWL_EVTHASH_Scroll) { + FX_DWORD dwScrollCode = ((CFWL_EvtScroll*)pEvent)->m_iScrollCode; + FX_FLOAT fPos = ((CFWL_EvtScroll*)pEvent)->m_fPos; + CFWL_EvtScroll pScrollEv; + pScrollEv.m_pSrcTarget = m_pOwner->m_pInterface; + pScrollEv.m_iScrollCode = dwScrollCode; + pScrollEv.m_fPos = fPos; + m_pOwner->DispatchEvent(&pScrollEv); + } else if (dwFlag == FWL_EVTHASH_EDT_TextChanged) { + CFWL_EvtCmbEditChanged pTemp; + pTemp.m_pSrcTarget = m_pOwner->m_pInterface; + pTemp.wsInsert = ((CFWL_EvtEdtTextChanged *)pEvent)->wsInsert; + pTemp.wsDelete = ((CFWL_EvtEdtTextChanged *)pEvent)->wsDelete; + pTemp.nChangeType = ((CFWL_EvtEdtTextChanged *)pEvent)->nChangeType; + m_pOwner->DispatchEvent(&pTemp); + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ComboBoxImpDelegate::OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix) +{ + return m_pOwner->DrawWidget(pGraphics, pMatrix); +} +void CFWL_ComboBoxImpDelegate::OnFocusChanged(CFWL_Message *pMsg, FX_BOOL bSet ) +{ + IFWL_Target *pDstTarget = pMsg->m_pDstTarget; + IFWL_Target *pSrcTarget = pMsg->m_pSrcTarget; + FX_BOOL bDropDown = m_pOwner->IsDropDownStyle(); + if (bSet) { + m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused; + if (bDropDown && pSrcTarget != (IFWL_Widget*)m_pOwner->m_pListBox) { + _FWL_RETURN_IF_FAIL(m_pOwner->m_pEdit); + ((CFWL_ComboEdit*)((IFWL_TargetData*)m_pOwner->m_pEdit)->GetData())->SetSelected(); + } else { + m_pOwner->Repaint(&m_pOwner->m_rtClient); + } + } else { + m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused; + if (bDropDown && pDstTarget != (IFWL_Widget*)m_pOwner->m_pListBox) { + _FWL_RETURN_IF_FAIL(m_pOwner->m_pEdit); + ((CFWL_ComboEdit*)((IFWL_TargetData*)m_pOwner->m_pEdit)->GetData())->FlagFocus(FALSE); + ((CFWL_ComboEdit*)((IFWL_TargetData*)m_pOwner->m_pEdit)->GetData())->ClearSelected(); + } else { + m_pOwner->Repaint(&m_pOwner->m_rtClient); + } + } +} +void CFWL_ComboBoxImpDelegate::OnLButtonDown(CFWL_MsgMouse *pMsg) +{ + if (m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) { + return; + } + FX_BOOL bDropDown = m_pOwner->IsDropDownStyle(); + CFX_RectF& rtBtn = bDropDown ? m_pOwner->m_rtBtn : m_pOwner->m_rtClient; + FX_BOOL bClickBtn = rtBtn.Contains(pMsg->m_fx, pMsg->m_fy); + if (bClickBtn) { + if (bDropDown && m_pOwner->m_pEdit) { + m_pOwner->MatchEditText(); + } + m_pOwner->m_bLButtonDown = TRUE; + m_pOwner->m_iBtnState = FWL_PARTSTATE_CMB_Pressed; + m_pOwner->Repaint(&m_pOwner->m_rtClient); + m_pOwner->ShowDropList(TRUE); + m_pOwner->m_iBtnState = FWL_PARTSTATE_CMB_Normal; + m_pOwner->Repaint(&m_pOwner->m_rtClient); + } +} +void CFWL_ComboBoxImpDelegate::OnLButtonUp(CFWL_MsgMouse *pMsg) +{ + m_pOwner->m_bLButtonDown = FALSE; + if (m_pOwner->m_rtBtn.Contains(pMsg->m_fx, pMsg->m_fy)) { + m_pOwner->m_iBtnState = FWL_PARTSTATE_CMB_Hovered; + } else { + m_pOwner->m_iBtnState = FWL_PARTSTATE_CMB_Normal; + } + m_pOwner->Repaint(&m_pOwner->m_rtBtn); +} +void CFWL_ComboBoxImpDelegate::OnMouseMove(CFWL_MsgMouse *pMsg) +{ + FX_INT32 iOldState = m_pOwner->m_iBtnState; + if (m_pOwner->m_rtBtn.Contains(pMsg->m_fx, pMsg->m_fy)) { + m_pOwner->m_iBtnState = m_pOwner->m_bLButtonDown ? FWL_PARTSTATE_CMB_Pressed : FWL_PARTSTATE_CMB_Hovered; + } else { + m_pOwner->m_iBtnState = FWL_PARTSTATE_CMB_Normal; + } + if ( (iOldState != m_pOwner->m_iBtnState) && + !((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) == FWL_WGTSTATE_Disabled)) { + m_pOwner->Repaint(&m_pOwner->m_rtBtn); + } +} +void CFWL_ComboBoxImpDelegate::OnMouseLeave(CFWL_MsgMouse *pMsg) +{ + if (!m_pOwner->IsDropListShowed() && + !((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) == FWL_WGTSTATE_Disabled)) { + m_pOwner->m_iBtnState = FWL_PARTSTATE_CMB_Normal; + m_pOwner->Repaint(&m_pOwner->m_rtBtn); + } +} +void CFWL_ComboBoxImpDelegate::OnKey(CFWL_MsgKey *pMsg) +{ + FX_DWORD dwKeyCode = pMsg->m_dwKeyCode; + if (dwKeyCode == FWL_VKEY_Tab) { + m_pOwner->DispatchKeyEvent(pMsg); + return; + } + FX_BOOL bSubCtrlKey = pMsg->m_pDstTarget == m_pOwner->m_pInterface; + if (bSubCtrlKey) { + DoSubCtrlKey(pMsg); + } +} +void CFWL_ComboBoxImpDelegate::DoSubCtrlKey(CFWL_MsgKey *pMsg) +{ + FX_DWORD dwKeyCode = pMsg->m_dwKeyCode; + FX_BOOL bUp = dwKeyCode == FWL_VKEY_Up; + FX_BOOL bDown = dwKeyCode == FWL_VKEY_Down; + if (bUp || bDown) { + FX_INT32 iCount = ((CFWL_ComboList*)((IFWL_TargetData*)m_pOwner->m_pListBox)->GetData())->CountItems(); + if (iCount < 1) { + return; + } + FX_BOOL bMatchEqual = FALSE; + FX_INT32 iCurSel = m_pOwner->m_iCurSel; + FX_BOOL bDropDown = m_pOwner->IsDropDownStyle(); + if (bDropDown && m_pOwner->m_pEdit) { + CFX_WideString wsText; + m_pOwner->m_pEdit->GetText(wsText); + iCurSel = ((CFWL_ComboList*)((IFWL_TargetData*)m_pOwner->m_pListBox)->GetData())->MatchItem(wsText); + if (iCurSel >= 0) { + CFX_WideString wsTemp; + IFWL_ComboBoxDP *pData = (IFWL_ComboBoxDP *)m_pOwner->m_pProperties->m_pDataProvider; + FWL_HLISTITEM hItem = pData->GetItem(m_pOwner->m_pInterface, iCurSel); + ((CFWL_ComboList*)((IFWL_TargetData*)m_pOwner->m_pListBox)->GetData())->GetItemText(hItem, wsTemp); + bMatchEqual = wsText.Equal(wsTemp); + } + } + if (iCurSel < 0) { + iCurSel = 0; + } else if (!bDropDown || bMatchEqual) { + if ((bUp && iCurSel == 0) || (bDown && iCurSel == iCount - 1)) { + return; + } + if (bUp) { + iCurSel --; + } else { + iCurSel ++; + } + } + m_pOwner->m_iCurSel = iCurSel; + if (bDropDown && m_pOwner->m_pEdit) { + m_pOwner->SynchrEditText(m_pOwner->m_iCurSel); + } else { + m_pOwner->Repaint(&m_pOwner->m_rtClient); + } + return; + } + FX_BOOL bDropDown = m_pOwner->IsDropDownStyle(); + if (bDropDown) { + IFWL_WidgetDelegate *pDelegate = m_pOwner->m_pEdit->SetDelegate(NULL); + pDelegate->OnProcessMessage(pMsg); + } +} +FX_INT32 CFWL_ComboBoxImpDelegate::DisForm_OnProcessMessage(CFWL_Message *pMessage) +{ + _FWL_RETURN_VALUE_IF_FAIL(pMessage, 0); + FX_DWORD dwMsgCode = pMessage->GetClassID(); + FX_BOOL backDefault = TRUE; + switch (dwMsgCode) { + case FWL_MSGHASH_SetFocus: + case FWL_MSGHASH_KillFocus: { + backDefault = FALSE; + DisForm_OnFocusChanged(pMessage, dwMsgCode == FWL_MSGHASH_SetFocus); + break; + } + case FWL_MSGHASH_Mouse: { + backDefault = FALSE; + CFWL_MsgMouse *pMsg = (CFWL_MsgMouse*)pMessage; + FX_DWORD dwCmd = pMsg->m_dwCmd; + switch(dwCmd) { + case FWL_MSGMOUSECMD_LButtonDown: { + DisForm_OnLButtonDown(pMsg); + break; + } + case FWL_MSGMOUSECMD_LButtonUp: { + OnLButtonUp(pMsg); + break; + } + default: { + } + } + break; + } + case FWL_MSGHASH_Key: { + backDefault = FALSE; + CFWL_MsgKey *pKey = (CFWL_MsgKey*)pMessage; + if (pKey->m_dwCmd == FWL_MSGKEYCMD_KeyUp) { + break; + } + if (m_pOwner->DisForm_IsDropListShowed() && pKey->m_dwCmd == FWL_MSGKEYCMD_KeyDown) { + FX_DWORD dwKeyCode = pKey->m_dwKeyCode; + FX_BOOL bListKey = dwKeyCode == FWL_VKEY_Up || + dwKeyCode == FWL_VKEY_Down || + dwKeyCode == FWL_VKEY_Return || + dwKeyCode == FWL_VKEY_Escape; + if (bListKey) { + IFWL_WidgetDelegate *pDelegate = m_pOwner->m_pListBox->SetDelegate(NULL); + pDelegate->OnProcessMessage(pMessage); + break; + } + } + DisForm_OnKey((CFWL_MsgKey*)pMessage); + break; + } + default: { + } + } + if (!backDefault) { + return 1; + } + return CFWL_WidgetImpDelegate::OnProcessMessage(pMessage); +} +void CFWL_ComboBoxImpDelegate::DisForm_OnLButtonDown(CFWL_MsgMouse *pMsg) +{ + FX_BOOL bDropDown = m_pOwner->DisForm_IsDropListShowed(); + CFX_RectF& rtBtn = bDropDown ? m_pOwner->m_rtBtn : m_pOwner->m_rtClient; + FX_BOOL bClickBtn = rtBtn.Contains(pMsg->m_fx, pMsg->m_fy); + if (bClickBtn) { + if (m_pOwner->DisForm_IsDropListShowed()) { + m_pOwner->DisForm_ShowDropList(FALSE); + return; + } + { + if (m_pOwner->m_pEdit) { + m_pOwner->MatchEditText(); + } + m_pOwner->DisForm_ShowDropList(TRUE); + } + } +} +void CFWL_ComboBoxImpDelegate::DisForm_OnFocusChanged(CFWL_Message *pMsg, FX_BOOL bSet) +{ + IFWL_Target *pDstTarget = pMsg->m_pDstTarget; + IFWL_Target *pSrcTarget = pMsg->m_pSrcTarget; + FX_BOOL bDropDown = m_pOwner->IsDropDownStyle(); + if (bSet) { + m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused; + if ((m_pOwner->m_pEdit->GetStates() & FWL_WGTSTATE_Focused) == 0) { + CFWL_MsgSetFocus msg; + msg.m_pDstTarget = m_pOwner->m_pEdit; + msg.m_pSrcTarget = NULL; + IFWL_WidgetDelegate *pDelegate = m_pOwner->m_pEdit->SetDelegate(NULL); + pDelegate->OnProcessMessage(&msg); + } + } else { + m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused; + m_pOwner->DisForm_ShowDropList(FALSE); + CFWL_MsgKillFocus msg; + msg.m_pDstTarget = NULL; + msg.m_pSrcTarget = m_pOwner->m_pEdit; + IFWL_WidgetDelegate *pDelegate = m_pOwner->m_pEdit->SetDelegate(NULL); + pDelegate->OnProcessMessage(&msg); + } +} +void CFWL_ComboBoxImpDelegate::DisForm_OnKey(CFWL_MsgKey *pMsg) +{ + FX_DWORD dwKeyCode = pMsg->m_dwKeyCode; + FX_BOOL bUp = dwKeyCode == FWL_VKEY_Up; + FX_BOOL bDown = dwKeyCode == FWL_VKEY_Down; + if (bUp || bDown) { + CFWL_ComboList* pComboList = ((CFWL_ComboList*)((IFWL_TargetData*)(m_pOwner->m_pListBox))->GetData()); + FX_INT32 iCount = pComboList->CountItems(); + if (iCount < 1) { + return; + } + FX_BOOL bMatchEqual = FALSE; + FX_INT32 iCurSel = m_pOwner->m_iCurSel; + if (m_pOwner->m_pEdit) { + CFX_WideString wsText; + m_pOwner->m_pEdit->GetText(wsText); + iCurSel = pComboList->MatchItem(wsText); + if (iCurSel >= 0) { + CFX_WideString wsTemp; + FWL_HLISTITEM item = m_pOwner->m_pListBox->GetSelItem(iCurSel); + m_pOwner->m_pListBox->GetItemText(item, wsTemp); + bMatchEqual = wsText.Equal(wsTemp); + } + } + if (iCurSel < 0) { + iCurSel = 0; + } else if (bMatchEqual) { + if ((bUp && iCurSel == 0) || (bDown && iCurSel == iCount - 1)) { + return; + } + if (bUp) { + iCurSel --; + } else { + iCurSel ++; + } + } + m_pOwner->m_iCurSel = iCurSel; + m_pOwner->SynchrEditText(m_pOwner->m_iCurSel); + return; + } + if (m_pOwner->m_pEdit) { + IFWL_WidgetDelegate *pDelegate = m_pOwner->m_pEdit->SetDelegate(NULL); + pDelegate->OnProcessMessage(pMsg); + } +} +CFWL_ComboProxyImpDelegate::CFWL_ComboProxyImpDelegate(IFWL_Form *pForm, CFWL_ComboBoxImp *pComboBox) + : m_pForm(pForm) + , m_pComboBox(pComboBox) + , m_bLButtonDown(FALSE) + , m_bLButtonUpSelf(FALSE) + , m_fStartPos(0) +{ +} +FX_INT32 CFWL_ComboProxyImpDelegate::OnProcessMessage(CFWL_Message *pMessage) +{ + _FWL_RETURN_VALUE_IF_FAIL(pMessage, 0); + FX_DWORD dwMsgCode = pMessage->GetClassID(); + if (dwMsgCode == FWL_MSGHASH_Mouse) { + CFWL_MsgMouse *pMsg = (CFWL_MsgMouse*)pMessage; + FX_DWORD dwCmd = pMsg->m_dwCmd; + switch(dwCmd) { + case FWL_MSGMOUSECMD_LButtonDown: { + OnLButtonDown(pMsg); + break; + } + case FWL_MSGMOUSECMD_LButtonUp: { + OnLButtonUp(pMsg); + break; + } + case FWL_MSGMOUSECMD_MouseMove: { + OnMouseMove(pMsg); + break; + } + default: { + } + } + } + if (dwMsgCode == FWL_MSGHASH_Deactivate) { + OnDeactive((CFWL_MsgDeactivate*)pMessage); + } + if (dwMsgCode == FWL_MSGHASH_KillFocus || dwMsgCode == FWL_MSGHASH_SetFocus) { + OnFocusChanged((CFWL_MsgKillFocus*)pMessage, dwMsgCode == FWL_MSGHASH_SetFocus); + } + return CFWL_WidgetImpDelegate::OnProcessMessage(pMessage); +} +FWL_ERR CFWL_ComboProxyImpDelegate::OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix) +{ + m_pComboBox->DrawStretchHandler(pGraphics, pMatrix); + return FWL_ERR_Succeeded; +} +void CFWL_ComboProxyImpDelegate::OnLButtonDown(CFWL_MsgMouse *pMsg) +{ + IFWL_NoteThread *pThread = m_pForm->GetOwnerThread(); + _FWL_RETURN_IF_FAIL(pThread); + CFWL_NoteDriver *pDriver = (CFWL_NoteDriver*)pThread->GetNoteDriver(); + CFX_RectF rtWidget; + m_pForm->GetWidgetRect(rtWidget); + rtWidget.left = rtWidget.top = 0; + if (rtWidget.Contains(pMsg->m_fx, pMsg->m_fy)) { + m_bLButtonDown = TRUE; + pDriver->SetGrab(m_pForm, TRUE); + } else { + m_bLButtonDown = FALSE; + pDriver->SetGrab(m_pForm, FALSE); + m_pComboBox->ShowDropList(FALSE); + return; + } + IFWL_AdapterNative *pNative = FWL_GetAdapterNative(); + IFWL_AdapterCursorMgr *pCursorMgr = pNative->GetCursorMgr(); + FWL_HCURSOR hCursor = pCursorMgr->GetSystemCursor(FWL_CURSORTYPE_SizeNS); + pCursorMgr->SetCursor(hCursor); + pCursorMgr->ShowCursor(TRUE); + m_pForm->TransformTo(NULL, pMsg->m_fx, pMsg->m_fy); + m_fStartPos = pMsg->m_fy; +} +void CFWL_ComboProxyImpDelegate::OnLButtonUp(CFWL_MsgMouse *pMsg) +{ + m_bLButtonDown = FALSE; + IFWL_NoteThread *pThread = m_pForm->GetOwnerThread(); + _FWL_RETURN_IF_FAIL(pThread); + CFWL_NoteDriver *pDriver = (CFWL_NoteDriver*)pThread->GetNoteDriver(); + pDriver->SetGrab(m_pForm, FALSE); + if (m_bLButtonUpSelf) { + CFX_RectF rect; + m_pForm->GetWidgetRect(rect); + rect.left = rect.top = 0; + if (!rect.Contains(pMsg->m_fx, pMsg->m_fy) && m_pComboBox->IsDropListShowed()) { + m_pComboBox->ShowDropList(FALSE); + } + } else { + m_bLButtonUpSelf = TRUE; + } +} +void CFWL_ComboProxyImpDelegate::OnMouseMove(CFWL_MsgMouse *pMsg) +{ + IFWL_AdapterNative *pNative = FWL_GetAdapterNative(); + IFWL_AdapterCursorMgr *pCursorMgr = pNative->GetCursorMgr(); + FWL_CURSORTYPE cursorType = FWL_CURSORTYPE_Arrow; + if (m_pComboBox->m_rtHandler.Contains(pMsg->m_fx, pMsg->m_fy)) { + cursorType = FWL_CURSORTYPE_SizeNS; + } + FWL_HCURSOR hCursor = pCursorMgr->GetSystemCursor(cursorType); + pCursorMgr->SetCursor(hCursor); + pCursorMgr->ShowCursor(TRUE); + if (!m_bLButtonDown) { + return; + } + m_pForm->TransformTo(NULL, pMsg->m_fx, pMsg->m_fy); + FX_FLOAT fChanged = pMsg->m_fy - m_fStartPos; + if (m_pComboBox->m_bUpFormHandler) { + fChanged = m_fStartPos - pMsg->m_fy; + } + if (m_pComboBox->m_rtList.height + fChanged < m_pComboBox->m_fItemHeight) { + return; + } + m_pComboBox->m_rtList.height += fChanged; + m_pComboBox->m_rtProxy.height += fChanged; + if (m_pComboBox->m_bUpFormHandler) { + m_pComboBox->m_rtProxy.top -= fChanged; + m_pComboBox->m_rtHandler.Set(0, + 0, + m_pComboBox->m_rtList.width, + m_pComboBox->m_fComboFormHandler); + } else { + m_pComboBox->m_rtHandler.Set(0, + m_pComboBox->m_rtList.height, + m_pComboBox->m_rtList.width, + m_pComboBox->m_fComboFormHandler); + } + m_pForm->SetWidgetRect(m_pComboBox->m_rtProxy); + m_pComboBox->m_pListBox->SetWidgetRect(m_pComboBox->m_rtList); + m_pComboBox->m_pListBox->Update(); + m_fStartPos = pMsg->m_fy; +} +void CFWL_ComboProxyImpDelegate::OnDeactive(CFWL_MsgDeactivate *pMsg) +{ + m_pComboBox->ShowDropList(FALSE); +} +void CFWL_ComboProxyImpDelegate::OnFocusChanged(CFWL_MsgKillFocus *pMsg, FX_BOOL bSet ) +{ + if (!bSet) { + if (pMsg->m_pSetFocus == NULL) { + m_pComboBox->ShowDropList(FALSE); + } + } +} diff --git a/xfa/src/fwl/src/basewidget/fwl_datetimepickerimp.cpp b/xfa/src/fwl/src/basewidget/fwl_datetimepickerimp.cpp new file mode 100644 index 0000000000..b3e3b45dae --- /dev/null +++ b/xfa/src/fwl/src/basewidget/fwl_datetimepickerimp.cpp @@ -0,0 +1,1202 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../core/include/fwl_targetimp.h" +#include "../core/include/fwl_noteimp.h" +#include "../core/include/fwl_widgetimp.h" +#include "../core/include/fwl_panelimp.h" +#include "../core/include/fwl_formimp.h" +#include "../core/include/fwl_widgetmgrimp.h" +#include "include/fwl_formproxyimp.h" +#include "include/fwl_editimp.h" +#include "include/fwl_monthcalendarimp.h" +#include "include/fwl_datetimepickerimp.h" +#define FWL_DTP_WIDTH 100 +#define FWL_DTP_HEIGHT 20 +IFWL_DateTimePicker* IFWL_DateTimePicker::Create() +{ + return new IFWL_DateTimePicker; +} +FWL_ERR IFWL_DateTimeForm::Initialize(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter) +{ + m_pData = FX_NEW CFWL_FormProxyImp(properties, pOuter); + ((CFWL_FormProxyImp*)m_pData)->SetInterface(this); + return ((CFWL_FormProxyImp*)m_pData)->Initialize(); +} +FWL_ERR IFWL_DateTimeCalender::Initialize(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter) +{ + m_pData = FX_NEW CFWL_DateTimeCalendar(properties, pOuter); + ((CFWL_DateTimeCalendar*)m_pData)->SetInterface(this); + return ((CFWL_DateTimeCalendar*)m_pData)->Initialize(); +} +FWL_ERR IFWL_DateTimeEdit::Initialize(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter) +{ + m_pData = FX_NEW CFWL_DateTimeEdit(properties, pOuter); + ((CFWL_DateTimeEdit*)m_pData)->SetInterface(this); + return ((CFWL_DateTimeEdit*)m_pData)->Initialize(); +} +IFWL_DateTimePicker::IFWL_DateTimePicker() +{ + m_pData = NULL; +} +IFWL_DateTimePicker::~IFWL_DateTimePicker() +{ + if (m_pData) { + delete (CFWL_DateTimePickerImp*)m_pData; + m_pData = NULL; + } +} +FWL_ERR IFWL_DateTimePicker::Initialize(IFWL_Widget *pOuter) +{ + m_pData = FX_NEW CFWL_DateTimePickerImp(pOuter); + ((CFWL_DateTimePickerImp*)m_pData)->SetInterface(this); + return ((CFWL_DateTimePickerImp*)m_pData)->Initialize(); +} +FWL_ERR IFWL_DateTimePicker::Initialize(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter) +{ + m_pData = FX_NEW CFWL_DateTimePickerImp(properties, pOuter); + ((CFWL_DateTimePickerImp*)m_pData)->SetInterface(this); + return ((CFWL_DateTimePickerImp*)m_pData)->Initialize(); +} +FX_INT32 IFWL_DateTimePicker::CountSelRanges() +{ + return ((CFWL_DateTimePickerImp*)m_pData)->GetDataTimeEdit()->CountSelRanges(); +} +FX_INT32 IFWL_DateTimePicker::GetSelRange(FX_INT32 nIndex, FX_INT32 &nStart) +{ + return ((CFWL_DateTimePickerImp*)m_pData)->GetDataTimeEdit()->GetSelRange(nIndex, nStart); +} +FWL_ERR IFWL_DateTimePicker::GetCurSel(FX_INT32 &iYear, FX_INT32 &iMonth, FX_INT32 &iDay) +{ + return ((CFWL_DateTimePickerImp*)m_pData)->GetCurSel(iYear, iMonth, iDay); +} +FWL_ERR IFWL_DateTimePicker::SetCurSel(FX_INT32 iYear, FX_INT32 iMonth, FX_INT32 iDay) +{ + return ((CFWL_DateTimePickerImp*)m_pData)->SetCurSel(iYear, iMonth, iDay); +} +FWL_ERR IFWL_DateTimePicker::SetEditText(const CFX_WideString &wsText) +{ + return ((CFWL_DateTimePickerImp*)m_pData)->SetEditText(wsText); +} +FWL_ERR IFWL_DateTimePicker::GetEditText(CFX_WideString &wsText, FX_INT32 nStart, FX_INT32 nCount) const +{ + return ((CFWL_DateTimePickerImp*)m_pData)->GetEditText(wsText, nStart, nCount); +} +FX_BOOL IFWL_DateTimePicker::CanUndo() +{ + return ((CFWL_DateTimePickerImp*)m_pData)->CanUndo(); +} +FX_BOOL IFWL_DateTimePicker::CanRedo() +{ + return ((CFWL_DateTimePickerImp*)m_pData)->CanRedo(); +} +FX_BOOL IFWL_DateTimePicker::Undo() +{ + return ((CFWL_DateTimePickerImp*)m_pData)->Undo(); +} +FX_BOOL IFWL_DateTimePicker::Redo() +{ + return ((CFWL_DateTimePickerImp*)m_pData)->Redo(); +} +FX_BOOL IFWL_DateTimePicker::CanCopy() +{ + return ((CFWL_DateTimePickerImp*)m_pData)->CanCopy(); +} +FX_BOOL IFWL_DateTimePicker::CanCut() +{ + return ((CFWL_DateTimePickerImp*)m_pData)->CanCut(); +} +FX_BOOL IFWL_DateTimePicker::CanSelectAll() +{ + return ((CFWL_DateTimePickerImp*)m_pData)->CanSelectAll(); +} +FX_BOOL IFWL_DateTimePicker::Copy(CFX_WideString &wsCopy) +{ + return ((CFWL_DateTimePickerImp*)m_pData)->Copy(wsCopy); +} +FX_BOOL IFWL_DateTimePicker::Cut(CFX_WideString &wsCut) +{ + return ((CFWL_DateTimePickerImp*)m_pData)->Cut(wsCut); +} +FX_BOOL IFWL_DateTimePicker::Paste(const CFX_WideString &wsPaste) +{ + return ((CFWL_DateTimePickerImp*)m_pData)->Paste(wsPaste); +} +FX_BOOL IFWL_DateTimePicker::SelectAll() +{ + return ((CFWL_DateTimePickerImp*)m_pData)->SelectAll(); +} +FX_BOOL IFWL_DateTimePicker::Delete() +{ + return ((CFWL_DateTimePickerImp*)m_pData)->Delete(); +} +FX_BOOL IFWL_DateTimePicker::DeSelect() +{ + return ((CFWL_DateTimePickerImp*)m_pData)->DeSelect(); +} +FWL_ERR IFWL_DateTimePicker::GetBBox(CFX_RectF &rect) +{ + return ((CFWL_DateTimePickerImp*)m_pData)->GetBBox(rect); +} +FWL_ERR IFWL_DateTimePicker::SetEditLimit(FX_INT32 nLimit) +{ + return ((CFWL_DateTimePickerImp*)m_pData)->SetEditLimit(nLimit); +} +FWL_ERR IFWL_DateTimePicker::ModifyEditStylesEx(FX_DWORD dwStylesExAdded, FX_DWORD dwStylesExRemoved) +{ + return ((CFWL_DateTimePickerImp*)m_pData)->ModifyEditStylesEx(dwStylesExAdded, dwStylesExRemoved); +} +CFWL_DateTimeEdit::CFWL_DateTimeEdit(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter) + : CFWL_EditImp(properties, pOuter) +{ +} +FWL_ERR CFWL_DateTimeEdit::Initialize() +{ + m_pDelegate = (IFWL_WidgetDelegate*)FX_NEW CFWL_DateTimeEditDelegate(this); + _FWL_ERR_CHECK_RETURN_VALUE_IF_FAIL(CFWL_EditImp::Initialize(), FWL_ERR_Indefinite); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_DateTimeEdit::Finalize() +{ + if ( m_pDelegate) { + delete (CFWL_DateTimeEditDelegate*)m_pDelegate; + m_pDelegate = NULL; + } + return CFWL_EditImp::Finalize(); +} +CFWL_DateTimeEditDelegate::CFWL_DateTimeEditDelegate(CFWL_DateTimeEdit *pOwner) + : CFWL_EditImpDelegate(pOwner) + , m_pOwner(pOwner) +{ +} +FX_INT32 CFWL_DateTimeEditDelegate::OnProcessMessage(CFWL_Message *pMessage) +{ + if (m_pOwner->m_pWidgetMgr->IsFormDisabled()) { + return DisForm_OnProcessMessage(pMessage); + } + FX_DWORD dwHashCode = pMessage->GetClassID(); + if (dwHashCode == FWL_MSGHASH_SetFocus || dwHashCode == FWL_MSGHASH_KillFocus) { + IFWL_Widget *pOuter = m_pOwner->GetOuter(); + IFWL_WidgetDelegate *pDelegate = pOuter->SetDelegate(NULL); + pDelegate->OnProcessMessage(pMessage); + } + return 1; +} +FX_INT32 CFWL_DateTimeEditDelegate::DisForm_OnProcessMessage(CFWL_Message *pMessage) +{ + FX_DWORD dwHashCode = pMessage->GetClassID(); + if (m_pOwner->m_pWidgetMgr->IsFormDisabled()) { + if (dwHashCode == FWL_MSGHASH_Mouse) { + CFWL_MsgMouse *pMouse = (CFWL_MsgMouse*)pMessage; + if (pMouse->m_dwCmd == FWL_MSGMOUSECMD_LButtonDown || pMouse->m_dwCmd == FWL_MSGMOUSECMD_RButtonDown) { + if ((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0) { + m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused; + } + CFWL_DateTimePickerImp *pDateTime = (CFWL_DateTimePickerImp*)((IFWL_TargetData*)m_pOwner->m_pOuter)->GetData(); + if (pDateTime->IsMonthCalendarShowed()) { + CFX_RectF rtInvalidate; + pDateTime->GetWidgetRect(rtInvalidate); + pDateTime->ShowMonthCalendar(FALSE); + rtInvalidate.Offset(-rtInvalidate.left, -rtInvalidate.top); + pDateTime->Repaint(&rtInvalidate); + } + } + } else if (dwHashCode == FWL_MSGHASH_Key) { + return CFWL_EditImpDelegate::OnProcessMessage(pMessage); + } + } + return CFWL_EditImpDelegate::OnProcessMessage(pMessage); +} +CFWL_DateTimeCalendar::CFWL_DateTimeCalendar(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter) + : CFWL_MonthCalendarImp(properties, pOuter) +{ +} +FWL_ERR CFWL_DateTimeCalendar::Initialize() +{ + _FWL_ERR_CHECK_RETURN_VALUE_IF_FAIL(CFWL_MonthCalendarImp::Initialize(), FWL_ERR_Indefinite); + if (m_pDelegate) { + delete (CFWL_MonthCalendarImpDelegate*)m_pDelegate; + } + m_pDelegate = (IFWL_WidgetDelegate*)FX_NEW CFWL_DateTimeCalendarDelegate(this); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_DateTimeCalendar::Finalize() +{ + if ( m_pDelegate) { + delete (CFWL_DateTimeCalendarDelegate*)m_pDelegate; + m_pDelegate = NULL; + } + return CFWL_MonthCalendarImp::Finalize(); +} +CFWL_DateTimeCalendarDelegate::CFWL_DateTimeCalendarDelegate(CFWL_DateTimeCalendar *pOwner) + : CFWL_MonthCalendarImpDelegate(pOwner) + , m_pOwner(pOwner) +{ + m_bFlag = FALSE; +} +FX_INT32 CFWL_DateTimeCalendarDelegate::OnProcessMessage(CFWL_Message *pMessage) +{ + FX_DWORD dwCode = pMessage->GetClassID(); + if (dwCode == FWL_MSGHASH_SetFocus || dwCode == FWL_MSGHASH_KillFocus) { + IFWL_Widget *pOuter = m_pOwner->GetOuter(); + IFWL_WidgetDelegate *pDelegate = pOuter->SetDelegate(NULL); + return pDelegate->OnProcessMessage(pMessage); + } else if (dwCode == FWL_MSGHASH_Mouse) { + CFWL_MsgMouse *pMsg = (CFWL_MsgMouse*)pMessage; + if (pMsg->m_dwCmd == FWL_MSGMOUSECMD_LButtonDown) { + OnLButtonDownEx(pMsg); + return 1; + } else if (pMsg->m_dwCmd == FWL_MSGMOUSECMD_LButtonUp) { + OnLButtonUpEx(pMsg); + return 1; + } + } + return CFWL_MonthCalendarImpDelegate::OnProcessMessage(pMessage); +} +void CFWL_DateTimeCalendarDelegate::OnLButtonDownEx(CFWL_MsgMouse *pMsg) +{ + if (m_pOwner->m_rtLBtn.Contains(pMsg->m_fx, pMsg->m_fy)) { + m_pOwner->m_iLBtnPartStates = FWL_PARTSTATE_MCD_Pressed; + m_pOwner->PrevMonth(); + m_pOwner->Repaint(&m_pOwner->m_rtClient); + } else if (m_pOwner->m_rtRBtn.Contains(pMsg->m_fx, pMsg->m_fy)) { + m_pOwner->m_iRBtnPartStates |= FWL_PARTSTATE_MCD_Pressed; + m_pOwner->NextMonth(); + m_pOwner->Repaint(&m_pOwner->m_rtClient); + } else if (m_pOwner->m_rtToday.Contains(pMsg->m_fx, pMsg->m_fy)) { + if ((m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_NoToday ) == 0) { + m_pOwner->JumpToToday(); + m_pOwner->Repaint(&m_pOwner->m_rtClient); + } + } else { + IFWL_DateTimePicker *pIPicker = (IFWL_DateTimePicker *)m_pOwner->m_pOuter; + CFWL_DateTimePickerImp *pPicker = (CFWL_DateTimePickerImp *)((IFWL_TargetData *)pIPicker)->GetData(); + if (pPicker->IsMonthCalendarShowed()) { + m_bFlag = 1; + } + } +} +void CFWL_DateTimeCalendarDelegate::OnLButtonUpEx(CFWL_MsgMouse *pMsg) +{ + if (m_pOwner->m_pWidgetMgr->IsFormDisabled()) { + return DisForm_OnLButtonUpEx(pMsg); + } + if (m_pOwner->m_rtLBtn.Contains(pMsg->m_fx, pMsg->m_fy)) { + m_pOwner->m_iLBtnPartStates = 0; + m_pOwner->Repaint(&m_pOwner->m_rtLBtn); + return; + } + if (m_pOwner->m_rtRBtn.Contains(pMsg->m_fx, pMsg->m_fy)) { + m_pOwner->m_iRBtnPartStates = 0; + m_pOwner->Repaint(&m_pOwner->m_rtRBtn); + return; + } + if (m_pOwner->m_rtToday.Contains(pMsg->m_fx, pMsg->m_fy)) { + return; + } + FX_INT32 iOldSel = 0; + if (m_pOwner->m_arrSelDays.GetSize() > 0) { + iOldSel = m_pOwner->m_arrSelDays[0]; + } + FX_INT32 iCurSel = m_pOwner->GetDayAtPoint(pMsg->m_fx, pMsg->m_fy); + CFX_RectF rt; + IFWL_DateTimePicker *pIPicker = (IFWL_DateTimePicker *)m_pOwner->m_pOuter; + CFWL_DateTimePickerImp *pPicker = (CFWL_DateTimePickerImp *)((IFWL_TargetData *)pIPicker)->GetData(); + pPicker->m_pForm->GetWidgetRect(rt); + rt.Set(0, 0, rt.width, rt.height); + if (iCurSel > 0) { + LPDATEINFO lpDatesInfo = (LPDATEINFO)m_pOwner->m_arrDates.GetAt(iCurSel - 1); + CFX_RectF rtInvalidate(lpDatesInfo->rect); + if (iOldSel > 0 && iOldSel <= m_pOwner->m_arrDates.GetSize()) { + lpDatesInfo = (LPDATEINFO)m_pOwner->m_arrDates.GetAt(iOldSel - 1); + rtInvalidate.Union(lpDatesInfo->rect); + } + m_pOwner->AddSelDay(iCurSel); + _FWL_RETURN_IF_FAIL(m_pOwner->m_pOuter); + pPicker->ProcessSelChanged(m_pOwner->m_iCurYear, m_pOwner->m_iCurMonth, iCurSel); + pPicker->ShowMonthCalendar(FALSE); + } else if (m_bFlag && (!rt.Contains(pMsg->m_fx, pMsg->m_fy))) { + IFWL_DateTimePicker *pIPicker = (IFWL_DateTimePicker *)m_pOwner->m_pOuter; + CFWL_DateTimePickerImp *pPicker = (CFWL_DateTimePickerImp *)((IFWL_TargetData *)pIPicker)->GetData(); + pPicker->ShowMonthCalendar(FALSE); + } + m_bFlag = 0; +} +void CFWL_DateTimeCalendarDelegate::OnMouseMoveEx(CFWL_MsgMouse *pMsg) +{ + if (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_MultiSelect) { + return; + } + FX_BOOL bRepaint = FALSE; + CFX_RectF rtInvalidate; + rtInvalidate.Set(0, 0, 0, 0); + if (m_pOwner->m_rtDates.Contains(pMsg->m_fx, pMsg->m_fy)) { + FX_INT32 iHover = m_pOwner->GetDayAtPoint(pMsg->m_fx, pMsg->m_fy); + bRepaint = m_pOwner->m_iHovered != iHover; + if (bRepaint) { + if (m_pOwner->m_iHovered > 0) { + m_pOwner->GetDayRect(m_pOwner->m_iHovered, rtInvalidate); + } + if (iHover > 0) { + CFX_RectF rtDay; + m_pOwner->GetDayRect(iHover, rtDay); + if (rtInvalidate.IsEmpty()) { + rtInvalidate = rtDay; + } else { + rtInvalidate.Union(rtDay); + } + } + } + m_pOwner->m_iHovered = iHover; + CFWL_Event_DtpHoverChanged ev; + ev.hoverday = iHover; + m_pOwner->DispatchEvent(&ev); + } else { + bRepaint = m_pOwner->m_iHovered > 0; + if (bRepaint) { + m_pOwner->GetDayRect(m_pOwner->m_iHovered, rtInvalidate); + } + m_pOwner->m_iHovered = -1; + } + if (bRepaint && !rtInvalidate.IsEmpty()) { + m_pOwner->Repaint(&rtInvalidate); + } +} +FX_INT32 CFWL_DateTimeCalendarDelegate::DisForm_OnProcessMessage(CFWL_Message *pMessage) +{ + if (pMessage->GetClassID() == FWL_MSGHASH_Mouse) { + CFWL_MsgMouse *pMsg = (CFWL_MsgMouse*)pMessage; + if (pMsg->m_dwCmd == FWL_MSGMOUSECMD_LButtonUp) { + DisForm_OnLButtonUpEx(pMsg); + return 1; + } + } + return CFWL_MonthCalendarImpDelegate::OnProcessMessage(pMessage); +} +void CFWL_DateTimeCalendarDelegate::DisForm_OnLButtonUpEx(CFWL_MsgMouse *pMsg) +{ + if (m_pOwner->m_rtLBtn.Contains(pMsg->m_fx, pMsg->m_fy)) { + m_pOwner->m_iLBtnPartStates = 0; + m_pOwner->Repaint(&(m_pOwner->m_rtLBtn)); + return; + } + if (m_pOwner->m_rtRBtn.Contains(pMsg->m_fx, pMsg->m_fy)) { + m_pOwner->m_iRBtnPartStates = 0; + m_pOwner->Repaint(&(m_pOwner->m_rtRBtn)); + return; + } + if (m_pOwner->m_rtToday.Contains(pMsg->m_fx, pMsg->m_fy)) { + return; + } + FX_INT32 iOldSel = 0; + if (m_pOwner->m_arrSelDays.GetSize() > 0) { + iOldSel = m_pOwner->m_arrSelDays[0]; + } + FX_INT32 iCurSel = m_pOwner->GetDayAtPoint(pMsg->m_fx, pMsg->m_fy); + if (iCurSel > 0) { + LPDATEINFO lpDatesInfo = (LPDATEINFO)m_pOwner->m_arrDates.GetAt(iCurSel - 1); + CFX_RectF rtInvalidate(lpDatesInfo->rect); + if (iOldSel > 0 && iOldSel <= m_pOwner->m_arrDates.GetSize()) { + lpDatesInfo = (LPDATEINFO)m_pOwner->m_arrDates.GetAt(iOldSel - 1); + rtInvalidate.Union(lpDatesInfo->rect); + } + m_pOwner->AddSelDay(iCurSel); + CFWL_DateTimePickerImp *pDateTime = (CFWL_DateTimePickerImp*)((IFWL_TargetData*)m_pOwner->m_pOuter)->GetData(); + pDateTime->ProcessSelChanged(m_pOwner->m_iCurYear, m_pOwner->m_iCurMonth, iCurSel); + pDateTime->ShowMonthCalendar(FALSE); + } +} +CFWL_DateTimePickerImp::CFWL_DateTimePickerImp(IFWL_Widget *pOuter ) + : CFWL_WidgetImp(pOuter) + , m_bLBtnDown(FALSE) + , m_iBtnState(1) + , m_iYear(-1) + , m_iMonth(-1) + , m_iDay(-1) + , m_pEdit(NULL) + , m_pMonthCal(NULL) + , m_pForm(FALSE) +{ + m_rtBtn.Set(0, 0, 0, 0); +} +CFWL_DateTimePickerImp::CFWL_DateTimePickerImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter) + : CFWL_WidgetImp(properties, pOuter) + , m_bLBtnDown(FALSE) + , m_iBtnState(1) + , m_iYear(-1) + , m_iMonth(-1) + , m_iDay(-1) + , m_pEdit(NULL) + , m_pMonthCal(NULL) + , m_pForm(FALSE) +{ + m_rtBtn.Set(0, 0, 0, 0); +} +CFWL_DateTimePickerImp::~CFWL_DateTimePickerImp() +{ + if (m_pEdit) { + m_pEdit->Release(); + m_pEdit = NULL; + } + if (m_pMonthCal) { + m_pMonthCal->Release(); + m_pMonthCal = NULL; + } + if (m_pForm) { + m_pForm->Release(); + m_pForm = NULL; + } +} +FWL_ERR CFWL_DateTimePickerImp::GetClassName(CFX_WideString &wsClass) const +{ + wsClass = FWL_CLASS_DateTimePicker; + return FWL_ERR_Succeeded; +} +FX_DWORD CFWL_DateTimePickerImp::GetClassID() const +{ + return FWL_CLASSHASH_DateTimePicker; +} +FWL_ERR CFWL_DateTimePickerImp::Initialize() +{ + _FWL_ERR_CHECK_RETURN_VALUE_IF_FAIL(CFWL_WidgetImp::Initialize(), FWL_ERR_Indefinite); + m_pDelegate = (IFWL_WidgetDelegate*)FX_NEW CFWL_DateTimePickerImpDelegate(this); + m_pProperties->m_dwStyleExes = FWL_STYLEEXT_DTP_ShortDateFormat; + CFWL_WidgetImpProperties propMonth; + propMonth.m_dwStyles = FWL_WGTSTYLE_Popup | FWL_WGTSTYLE_Border; + propMonth.m_dwStates = FWL_WGTSTATE_Invisible; + propMonth.m_pDataProvider = &m_MonthCalendarDP; + propMonth.m_pParent = m_pInterface; + propMonth.m_pThemeProvider = m_pProperties->m_pThemeProvider; + m_pMonthCal = new IFWL_DateTimeCalender(); + m_pMonthCal->Initialize(propMonth, m_pInterface); + CFX_RectF rtMonthCal; + m_pMonthCal->GetWidgetRect(rtMonthCal, TRUE); + rtMonthCal.Set(0, 0, rtMonthCal.width, rtMonthCal.height); + m_pMonthCal->SetWidgetRect(rtMonthCal); + CFWL_WidgetImpProperties propEdit; + propEdit.m_pParent = m_pInterface; + propEdit.m_pThemeProvider = m_pProperties->m_pThemeProvider; + m_pEdit = new IFWL_DateTimeEdit(); + m_pEdit->Initialize(propEdit, m_pInterface); + RegisterEventTarget(m_pMonthCal); + RegisterEventTarget(m_pEdit); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_DateTimePickerImp::Finalize() +{ + if (m_pEdit) { + m_pEdit->Finalize(); + } + if (m_pMonthCal) { + m_pMonthCal->Finalize(); + } + if (m_pForm) { + m_pForm->Finalize(); + } + UnregisterEventTarget(); + if ( m_pDelegate) { + delete (CFWL_DateTimePickerImpDelegate*)m_pDelegate; + m_pDelegate = NULL; + } + return CFWL_WidgetImp::Finalize(); +} +FWL_ERR CFWL_DateTimePickerImp::GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize ) +{ + if (m_pWidgetMgr->IsFormDisabled()) { + return DisForm_GetWidgetRect(rect, bAutoSize); + } + if (bAutoSize) { + rect.Set(0, 0, FWL_DTP_WIDTH, FWL_DTP_HEIGHT); + CFWL_WidgetImp::GetWidgetRect(rect, TRUE); + } else { + rect = m_pProperties->m_rtWidget; + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_DateTimePickerImp::Update() +{ + if (m_pWidgetMgr->IsFormDisabled()) { + return DisForm_Update(); + } + if (m_iLock) { + return FWL_ERR_Indefinite; + } + if (!m_pProperties->m_pThemeProvider) { + m_pProperties->m_pThemeProvider = GetAvailableTheme(); + } + m_pEdit->SetThemeProvider(m_pProperties->m_pThemeProvider); + GetClientRect(m_rtClient); + FX_FLOAT *pFWidth = (FX_FLOAT*)GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth); + _FWL_RETURN_VALUE_IF_FAIL(pFWidth, FWL_ERR_Indefinite); + FX_FLOAT fBtn = *pFWidth; + m_rtBtn.Set(m_rtClient.right() - fBtn, m_rtClient.top, fBtn - 1, m_rtClient.height - 1); + CFX_RectF rtEdit; + rtEdit.Set(m_rtClient.left, m_rtClient.top, m_rtClient.width - fBtn, m_rtClient.height); + m_pEdit->SetWidgetRect(rtEdit); + ReSetEditAlignment(); + m_pEdit->Update(); + if (!(m_pMonthCal->GetThemeProvider())) { + m_pMonthCal->SetThemeProvider(m_pProperties->m_pThemeProvider); + } + if (m_pProperties->m_pDataProvider) { + IFWL_DateTimePickerDP *pData = (IFWL_DateTimePickerDP*)m_pProperties->m_pDataProvider; + pData->GetToday(m_pInterface, + m_MonthCalendarDP.m_iCurYear, + m_MonthCalendarDP.m_iCurMonth, + m_MonthCalendarDP.m_iCurDay); + } + CFX_RectF rtMonthCal; + m_pMonthCal->GetWidgetRect(rtMonthCal, TRUE); + CFX_RectF rtPopUp; + rtPopUp.Set(rtMonthCal.left, rtMonthCal.top + FWL_DTP_HEIGHT, rtMonthCal.width, rtMonthCal.height); + m_pMonthCal->SetWidgetRect(rtPopUp); + m_pMonthCal->Update(); + return FWL_ERR_Succeeded; +} +FX_DWORD CFWL_DateTimePickerImp::HitTest(FX_FLOAT fx, FX_FLOAT fy) +{ + if (m_pWidgetMgr->IsFormDisabled()) { + return DisForm_HitTest(fx, fy); + } + if (m_rtClient.Contains(fx, fy)) { + return FWL_WGTHITTEST_Client; + } + if (IsMonthCalendarShowed()) { + CFX_RectF rect; + m_pMonthCal->GetWidgetRect(rect); + if (rect.Contains(fx, fy)) { + return FWL_WGTHITTEST_Client; + } + } + return FWL_WGTHITTEST_Unknown; +} +FWL_ERR CFWL_DateTimePickerImp::DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + _FWL_RETURN_VALUE_IF_FAIL(pGraphics, FWL_ERR_Indefinite); + _FWL_RETURN_VALUE_IF_FAIL(m_pProperties->m_pThemeProvider, FWL_ERR_Indefinite); + IFWL_ThemeProvider *pTheme = m_pProperties->m_pThemeProvider; + if (HasBorder()) { + DrawBorder(pGraphics, FWL_PART_DTP_Border, pTheme, pMatrix); + } + if (HasEdge()) { + DrawEdge(pGraphics, FWL_PART_DTP_Edge, pTheme, pMatrix); + } + if (!m_rtBtn.IsEmpty()) { + DrawDropDownButton(pGraphics, pTheme, pMatrix); + } + if (m_pWidgetMgr->IsFormDisabled()) { + return DisForm_DrawWidget(pGraphics, pMatrix); + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_DateTimePickerImp::SetThemeProvider(IFWL_ThemeProvider *pTP) +{ + m_pProperties->m_pThemeProvider = pTP; + m_pMonthCal->SetThemeProvider(pTP); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_DateTimePickerImp::GetCurSel(FX_INT32 &iYear, FX_INT32 &iMonth, FX_INT32 &iDay) +{ + iYear = m_iYear; + iMonth = m_iMonth; + iDay = m_iDay; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_DateTimePickerImp::SetCurSel(FX_INT32 iYear, FX_INT32 iMonth, FX_INT32 iDay) +{ + _FWL_RETURN_VALUE_IF_FAIL(iYear > 0 && iYear < 3000, FWL_ERR_Indefinite); + _FWL_RETURN_VALUE_IF_FAIL(iMonth > 0 && iMonth < 13, FWL_ERR_Indefinite); + _FWL_RETURN_VALUE_IF_FAIL(iDay > 0 && iDay < 32, FWL_ERR_Indefinite); + m_iYear = iYear; + m_iMonth = iMonth; + m_iDay = iDay; + m_pMonthCal->SetSelect(iYear, iMonth, iDay); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_DateTimePickerImp::SetEditText(const CFX_WideString &wsText) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdit, FWL_ERR_Indefinite); + FX_INT32 iRet = m_pEdit->SetText(wsText); + Repaint(&m_rtClient); + CFWL_Event_DtpEditChanged ev; + ev.m_wsText = wsText; + DispatchEvent(&ev); + return iRet; +} +FWL_ERR CFWL_DateTimePickerImp::GetEditText(CFX_WideString &wsText, FX_INT32 nStart, FX_INT32 nCount) const +{ + if (m_pEdit) { + return m_pEdit->GetText(wsText, nStart, nCount); + } + return FWL_ERR_Indefinite; +} +FX_BOOL CFWL_DateTimePickerImp::CanUndo() +{ + return m_pEdit->CanUndo(); +} +FX_BOOL CFWL_DateTimePickerImp::CanRedo() +{ + return m_pEdit->CanRedo(); +} +FX_BOOL CFWL_DateTimePickerImp::Undo() +{ + return m_pEdit->Undo(); +} +FX_BOOL CFWL_DateTimePickerImp::Redo() +{ + return m_pEdit->Redo(); +} +FX_BOOL CFWL_DateTimePickerImp::CanCopy() +{ + FX_INT32 nCount = m_pEdit->CountSelRanges(); + return nCount > 0; +} +FX_BOOL CFWL_DateTimePickerImp::CanCut() +{ + if (m_pEdit->GetStylesEx() & FWL_STYLEEXT_EDT_ReadOnly) { + return FALSE; + } + FX_INT32 nCount = m_pEdit->CountSelRanges(); + return nCount > 0; +} +FX_BOOL CFWL_DateTimePickerImp::CanSelectAll() +{ + return m_pEdit->GetTextLength() > 0; +} +FX_BOOL CFWL_DateTimePickerImp::Copy(CFX_WideString &wsCopy) +{ + return m_pEdit->Copy(wsCopy); +} +FX_BOOL CFWL_DateTimePickerImp::Cut(CFX_WideString &wsCut) +{ + return m_pEdit->Cut(wsCut); +} +FX_BOOL CFWL_DateTimePickerImp::Paste(const CFX_WideString &wsPaste) +{ + return m_pEdit->Paste(wsPaste); +} +FX_BOOL CFWL_DateTimePickerImp::SelectAll() +{ + return (m_pEdit->AddSelRange(0) == FWL_ERR_Succeeded) ? TRUE : FALSE; +} +FX_BOOL CFWL_DateTimePickerImp::Delete() +{ + return (m_pEdit->ClearText() == FWL_ERR_Succeeded) ? TRUE : FALSE; +} +FX_BOOL CFWL_DateTimePickerImp::DeSelect() +{ + return (m_pEdit->ClearSelections() == FWL_ERR_Succeeded) ? TRUE : FALSE; +} +FWL_ERR CFWL_DateTimePickerImp::GetBBox(CFX_RectF &rect) +{ + if (m_pWidgetMgr->IsFormDisabled()) { + return DisForm_GetBBox(rect); + } + rect = m_pProperties->m_rtWidget; + if (IsMonthCalendarShowed()) { + CFX_RectF rtMonth; + m_pMonthCal->GetWidgetRect(rtMonth); + rtMonth.Offset(m_pProperties->m_rtWidget.left, m_pProperties->m_rtWidget.top); + rect.Union(rtMonth); + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_DateTimePickerImp::SetEditLimit(FX_INT32 nLimit) +{ + return m_pEdit->SetLimit(nLimit); +} +FWL_ERR CFWL_DateTimePickerImp::ModifyEditStylesEx(FX_DWORD dwStylesExAdded, FX_DWORD dwStylesExRemoved) +{ + return m_pEdit->ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved); +} +void CFWL_DateTimePickerImp::DrawDropDownButton(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix) +{ + if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_DTP_Spin) == FWL_STYLEEXT_DTP_Spin) { + CFWL_WidgetImpProperties prop; + prop.m_dwStyleExes |= FWL_STYLEEXE_SPB_Vert; + prop.m_pParent = m_pInterface; + prop.m_rtWidget = m_rtBtn; + IFWL_SpinButton *pSpin = IFWL_SpinButton::Create(); + pSpin->Initialize(prop, m_pInterface); + } else { + CFWL_ThemeBackground param; + param.m_pWidget = m_pInterface; + param.m_iPart = FWL_PART_DTP_DropDownButton; + param.m_dwStates = m_iBtnState; + param.m_pGraphics = pGraphics; + param.m_rtPart = m_rtBtn; + if (pMatrix) { + param.m_matrix.Concat(*pMatrix); + } + pTheme->DrawBackground(¶m); + } +} +void CFWL_DateTimePickerImp::FormatDateString(FX_INT32 iYear, FX_INT32 iMonth, FX_INT32 iDay, CFX_WideString &wsText) +{ + if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_DTP_ShortDateFormat) == FWL_STYLEEXT_DTP_ShortDateFormat) { + wsText.Format(FX_LPCWSTR(L"%d-%d-%d"), iYear, iMonth, iDay); + } else if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_DTP_LongDateFormat) == FWL_STYLEEXT_DTP_LongDateFormat) { + wsText.Format(FX_LPCWSTR(L"%d Year %d Month %d Day"), iYear, iMonth, iDay); + } else if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_DTP_TimeFormat) == FWL_STYLEEXT_DTP_TimeFormat) { + } +} +void CFWL_DateTimePickerImp::ShowMonthCalendar(FX_BOOL bActivate) +{ + if (m_pWidgetMgr->IsFormDisabled()) { + return DisForm_ShowMonthCalendar(bActivate); + } + if(IsMonthCalendarShowed() == bActivate) { + return; + } + if (!m_pForm) { + InitProxyForm(); + } + if (bActivate) { + CFX_RectF rtMonth; + m_pMonthCal->GetWidgetRect(rtMonth); + CFX_RectF rtAnchor; + rtAnchor.Set(0, + 0, + m_pProperties->m_rtWidget.width, + m_pProperties->m_rtWidget.height); + GetPopupPos(0, rtMonth.height, rtAnchor, rtMonth); + m_pForm->SetWidgetRect(rtMonth); + rtMonth.left = rtMonth.top = 0; + m_pMonthCal->SetStates(FWL_WGTSTATE_Invisible, !bActivate); + m_pMonthCal->SetWidgetRect(rtMonth); + m_pMonthCal->Update(); + m_pForm->DoModal(); + } else { + m_pForm->EndDoModal(); + } +} +FX_BOOL CFWL_DateTimePickerImp::IsMonthCalendarShowed() +{ + if (m_pWidgetMgr->IsFormDisabled()) { + return DisForm_IsMonthCalendarShowed(); + } + _FWL_RETURN_VALUE_IF_FAIL(m_pForm, FALSE); + return !(m_pForm->GetStates() & FWL_WGTSTATE_Invisible); +} +void CFWL_DateTimePickerImp::ReSetEditAlignment() +{ + _FWL_RETURN_IF_FAIL(m_pEdit); + FX_DWORD dwStylExes = m_pProperties->m_dwStyleExes; + FX_DWORD dwAdd = 0; + switch (dwStylExes & FWL_STYLEEXT_DTP_EditHAlignMask) { + case FWL_STYLEEXT_DTP_EditHCenter: { + dwAdd |= FWL_STYLEEXT_EDT_HCenter; + break; + } + case FWL_STYLEEXT_DTP_EditHFar: { + dwAdd |= FWL_STYLEEXT_EDT_HFar; + break; + } + default: { + dwAdd |= FWL_STYLEEXT_EDT_HNear; + } + } + switch (dwStylExes & FWL_STYLEEXT_DTP_EditVAlignMask) { + case FWL_STYLEEXT_DTP_EditVCenter: { + dwAdd |= FWL_STYLEEXT_EDT_VCenter; + break; + } + case FWL_STYLEEXT_DTP_EditVFar: { + dwAdd |= FWL_STYLEEXT_EDT_VFar; + break; + } + default: { + dwAdd |= FWL_STYLEEXT_EDT_VNear; + } + } + if (dwStylExes & FWL_STYLEEXT_DTP_EditJustified) { + dwAdd |= FWL_STYLEEXT_EDT_Justified; + } + if (dwStylExes & FWL_STYLEEXT_DTP_EditDistributed) { + dwAdd |= FWL_STYLEEXT_EDT_Distributed; + } + m_pEdit->ModifyStylesEx(dwAdd, FWL_STYLEEXT_EDT_HAlignMask | + FWL_STYLEEXT_EDT_HAlignModeMask | + FWL_STYLEEXT_EDT_VAlignMask); +} +void CFWL_DateTimePickerImp::ProcessSelChanged(FX_INT32 iYear, FX_INT32 iMonth, FX_INT32 iDay) +{ + m_iYear = iYear; + m_iMonth = iMonth; + m_iDay = iDay; + CFX_WideString wsText; + FormatDateString(m_iYear, m_iMonth, m_iDay, wsText); + m_pEdit->SetText(wsText); + m_pEdit->Update(); + Repaint(&m_rtClient); + CFWL_Event_DtpSelectChanged ev; + ev.m_pSrcTarget = m_pInterface; + ev.iYear = m_iYear; + ev.iMonth = m_iMonth; + ev.iDay = m_iDay; + DispatchEvent(&ev); +} +void CFWL_DateTimePickerImp::InitProxyForm() +{ + _FWL_RETURN_IF_FAIL(!m_pForm); + _FWL_RETURN_IF_FAIL(m_pMonthCal); + CFWL_WidgetImpProperties propForm; + propForm.m_dwStyles = FWL_WGTSTYLE_Popup; + propForm.m_dwStates = FWL_WGTSTATE_Invisible; + propForm.m_pOwner = m_pInterface; + m_pForm = new IFWL_DateTimeForm(); + m_pForm->Initialize(propForm, m_pMonthCal); + m_pMonthCal->SetParent((IFWL_Widget*)m_pForm); +} +IFWL_DateTimeEdit* CFWL_DateTimePickerImp::GetDataTimeEdit() +{ + return m_pEdit; +} +FWL_ERR CFWL_DateTimePickerImp::DisForm_Initialize() +{ + m_pProperties->m_dwStyleExes = FWL_STYLEEXT_DTP_ShortDateFormat; + DisForm_InitDateTimeCalendar(); + DisForm_InitDateTimeEdit(); + RegisterEventTarget(m_pMonthCal); + RegisterEventTarget(m_pEdit); + return FWL_ERR_Succeeded; +} +void CFWL_DateTimePickerImp::DisForm_InitDateTimeCalendar() +{ + if (m_pMonthCal) { + return; + } + CFWL_WidgetImpProperties propMonth; + propMonth.m_dwStyles = FWL_WGTSTYLE_Popup | FWL_WGTSTYLE_Border | FWL_WGTSTYLE_EdgeSunken; + propMonth.m_dwStates = FWL_WGTSTATE_Invisible; + propMonth.m_pParent = (IFWL_Widget*)this; + propMonth.m_pDataProvider = &m_MonthCalendarDP; + propMonth.m_pThemeProvider = m_pProperties->m_pThemeProvider; + m_pMonthCal = new IFWL_DateTimeCalender(); + m_pMonthCal->Initialize(propMonth, m_pInterface); + CFX_RectF rtMonthCal; + m_pMonthCal->GetWidgetRect(rtMonthCal, TRUE); + rtMonthCal.Set(0, 0, rtMonthCal.width, rtMonthCal.height); + m_pMonthCal->SetWidgetRect(rtMonthCal); +} +void CFWL_DateTimePickerImp::DisForm_InitDateTimeEdit() +{ + if (m_pEdit) { + return; + } + CFWL_WidgetImpProperties propEdit; + propEdit.m_pParent = (IFWL_Widget*)this; + propEdit.m_pThemeProvider = m_pProperties->m_pThemeProvider; + m_pEdit = new IFWL_DateTimeEdit(); + m_pEdit->Initialize(propEdit, m_pInterface); +} +FX_BOOL CFWL_DateTimePickerImp::DisForm_IsMonthCalendarShowed() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pMonthCal, FALSE); + return !(m_pMonthCal->GetStates() & FWL_WGTSTATE_Invisible); +} +void CFWL_DateTimePickerImp::DisForm_ShowMonthCalendar(FX_BOOL bActivate) +{ + FX_BOOL bShowed = IsMonthCalendarShowed(); + if(bShowed == bActivate) { + return; + } + if (bActivate) { + CFX_RectF rtMonthCal; + m_pMonthCal->GetWidgetRect(rtMonthCal, TRUE); + FX_DWORD dwPos = 0; + FX_FLOAT fPopupHeight = 0.0f; + FX_FLOAT fPopupMin = rtMonthCal.height; + FX_FLOAT fPopupMax = rtMonthCal.height; + CFX_RectF rtAnchor(m_pProperties->m_rtWidget); + rtAnchor.width = rtMonthCal.width; + rtMonthCal.left = m_rtClient.left; + rtMonthCal.top = rtAnchor.Height(); + GetPopupPos(fPopupMin, fPopupMax, rtAnchor, rtMonthCal); + m_pMonthCal->SetWidgetRect(rtMonthCal); + if (m_iYear > 0 && m_iMonth > 0 && m_iDay > 0) { + m_pMonthCal->SetSelect(m_iYear, m_iMonth, m_iDay); + } + m_pMonthCal->Update(); + } + m_pMonthCal->SetStates(FWL_WGTSTATE_Invisible, !bActivate); + if (bActivate) { + CFWL_MsgSetFocus msg; + msg.m_pDstTarget = m_pMonthCal; + msg.m_pSrcTarget = m_pEdit; + IFWL_WidgetDelegate *pDelegate = m_pEdit->SetDelegate(NULL); + pDelegate->OnProcessMessage(&msg); + } + CFX_RectF rtInvalidate, rtCal; + rtInvalidate.Set(0, + 0, + m_pProperties->m_rtWidget.width, + m_pProperties->m_rtWidget.height); + m_pMonthCal->GetWidgetRect(rtCal); + rtInvalidate.Union(rtCal); + rtInvalidate.Inflate(2, 2); + Repaint(&rtInvalidate); +} +FX_DWORD CFWL_DateTimePickerImp::DisForm_HitTest(FX_FLOAT fx, FX_FLOAT fy) +{ + CFX_RectF rect; + rect.Set(0, 0, m_pProperties->m_rtWidget.width, m_pProperties->m_rtWidget.height); + if (rect.Contains(fx, fy)) { + return FWL_WGTHITTEST_Edit; + } + if (DisForm_IsNeedShowButton()) { + rect.width += m_fBtn; + } + if (rect.Contains(fx, fy)) { + return FWL_WGTHITTEST_Client; + } + if (IsMonthCalendarShowed()) { + m_pMonthCal->GetWidgetRect(rect); + if (rect.Contains(fx, fy)) { + return FWL_WGTHITTEST_Client; + } + } + return FWL_WGTHITTEST_Unknown; +} +FX_BOOL CFWL_DateTimePickerImp::DisForm_IsNeedShowButton() +{ + FX_BOOL bFocus = m_pProperties->m_dwStates & FWL_WGTSTATE_Focused || + m_pMonthCal->GetStates() & FWL_WGTSTATE_Focused || + m_pEdit->GetStates() & FWL_WGTSTATE_Focused; + return bFocus ; +} +FWL_ERR CFWL_DateTimePickerImp::DisForm_Update() +{ + if (m_iLock) { + return FWL_ERR_Indefinite; + } + if (!m_pProperties->m_pThemeProvider) { + m_pProperties->m_pThemeProvider = GetAvailableTheme(); + } + m_pEdit->SetThemeProvider(m_pProperties->m_pThemeProvider); + GetClientRect(m_rtClient); + m_pEdit->SetWidgetRect(m_rtClient); + ReSetEditAlignment(); + m_pEdit->Update(); + if (m_pMonthCal->GetThemeProvider() == NULL) { + m_pMonthCal->SetThemeProvider(m_pProperties->m_pThemeProvider); + } + if (m_pProperties->m_pDataProvider) { + IFWL_DateTimePickerDP *pData = (IFWL_DateTimePickerDP*)m_pProperties->m_pDataProvider; + pData->GetToday((IFWL_Widget*)this, + m_MonthCalendarDP.m_iCurYear, + m_MonthCalendarDP.m_iCurMonth, + m_MonthCalendarDP.m_iCurDay); + } + FX_FLOAT *pWidth = (FX_FLOAT*)GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth); + _FWL_RETURN_VALUE_IF_FAIL(pWidth, 0); + m_fBtn = *pWidth; + CFX_RectF rtMonthCal; + m_pMonthCal->GetWidgetRect(rtMonthCal, TRUE); + CFX_RectF rtPopUp; + rtPopUp.Set(rtMonthCal.left, rtMonthCal.top + FWL_DTP_HEIGHT, rtMonthCal.width, rtMonthCal.height); + m_pMonthCal->SetWidgetRect(rtPopUp); + m_pMonthCal->Update(); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_DateTimePickerImp::DisForm_GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize) +{ + rect = m_pProperties->m_rtWidget; + if (DisForm_IsNeedShowButton()) { + rect.width += m_fBtn; + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_DateTimePickerImp::DisForm_GetBBox(CFX_RectF &rect) +{ + rect = m_pProperties->m_rtWidget; + if (DisForm_IsNeedShowButton()) { + rect.width += m_fBtn; + } + if (IsMonthCalendarShowed()) { + CFX_RectF rtMonth; + m_pMonthCal->GetWidgetRect(rtMonth); + rtMonth.Offset(m_pProperties->m_rtWidget.left, m_pProperties->m_rtWidget.top); + rect.Union(rtMonth); + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_DateTimePickerImp::DisForm_DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix) +{ + _FWL_RETURN_VALUE_IF_FAIL(pGraphics, FWL_ERR_Indefinite); + if (m_pEdit) { + CFX_RectF rtEdit; + m_pEdit->GetWidgetRect(rtEdit); + CFX_Matrix mt; + mt.Set(1, 0, 0, 1, rtEdit.left, rtEdit.top); + if (pMatrix) { + mt.Concat(*pMatrix); + } + m_pEdit->DrawWidget(pGraphics, &mt); + } + if (IsMonthCalendarShowed()) { + CFX_RectF rtMonth; + m_pMonthCal->GetWidgetRect(rtMonth); + CFX_Matrix mt; + mt.Set(1, 0, 0, 1, rtMonth.left, rtMonth.top); + if (pMatrix) { + mt.Concat(*pMatrix); + } + m_pMonthCal->DrawWidget(pGraphics, &mt); + } + return FWL_ERR_Succeeded; +} +CFWL_DateTimePickerImpDelegate::CFWL_DateTimePickerImpDelegate(CFWL_DateTimePickerImp *pOwner) + : m_pOwner(pOwner) +{ +} +FX_INT32 CFWL_DateTimePickerImpDelegate::OnProcessMessage(CFWL_Message *pMessage) +{ + _FWL_RETURN_VALUE_IF_FAIL(pMessage, 0); + FX_DWORD dwMsgCode = pMessage->GetClassID(); + FX_INT32 iRet = 1; + switch (dwMsgCode) { + case FWL_MSGHASH_SetFocus: + case FWL_MSGHASH_KillFocus: { + OnFocusChanged(pMessage, dwMsgCode == FWL_MSGHASH_SetFocus); + break; + } + case FWL_MSGHASH_Mouse: { + CFWL_MsgMouse *pMouse = (CFWL_MsgMouse*)pMessage; + FX_DWORD dwCmd = pMouse->m_dwCmd; + switch(dwCmd) { + case FWL_MSGMOUSECMD_LButtonDown: { + OnLButtonDown(pMouse); + break; + } + case FWL_MSGMOUSECMD_LButtonUp: { + OnLButtonUp(pMouse); + break; + } + case FWL_MSGMOUSECMD_MouseMove: { + OnMouseMove(pMouse); + break; + } + case FWL_MSGMOUSECMD_MouseLeave: { + OnMouseLeave(pMouse); + break; + } + default: { + } + } + break; + } + default: { + iRet = 0; + } + } + if(dwMsgCode == FWL_MSGHASH_Key && m_pOwner->m_pEdit->GetStates() & FWL_WGTSTATE_Focused) { + IFWL_WidgetDelegate *pDelegate = m_pOwner->m_pEdit->SetDelegate(NULL); + return pDelegate->OnProcessMessage(pMessage); + } + return CFWL_WidgetImpDelegate::OnProcessMessage(pMessage); +} +FWL_ERR CFWL_DateTimePickerImpDelegate::OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix) +{ + return m_pOwner->DrawWidget(pGraphics, pMatrix); +} +void CFWL_DateTimePickerImpDelegate::OnFocusChanged(CFWL_Message *pMsg, FX_BOOL bSet) +{ + _FWL_RETURN_IF_FAIL(pMsg); + if (m_pOwner->m_pWidgetMgr->IsFormDisabled()) { + return DisForm_OnFocusChanged(pMsg, bSet); + } + if (bSet) { + m_pOwner->m_pProperties->m_dwStates |= (FWL_WGTSTATE_Focused); + m_pOwner->Repaint(&m_pOwner->m_rtClient); + } else { + m_pOwner->m_pProperties->m_dwStates &= ~(FWL_WGTSTATE_Focused); + m_pOwner->Repaint(&m_pOwner->m_rtClient); + } + if(pMsg->m_pSrcTarget == (IFWL_Widget*)m_pOwner->m_pMonthCal && m_pOwner->IsMonthCalendarShowed()) { + m_pOwner->ShowMonthCalendar(FALSE); + } + m_pOwner->Repaint(&m_pOwner->m_rtClient); +} +void CFWL_DateTimePickerImpDelegate::OnLButtonDown(CFWL_MsgMouse *pMsg) +{ + _FWL_RETURN_IF_FAIL(pMsg); + if ((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0) { + m_pOwner->SetFocus(TRUE); + } + if (m_pOwner->m_rtBtn.Contains(pMsg->m_fx, pMsg->m_fy)) { + if (m_pOwner->IsMonthCalendarShowed()) { + m_pOwner->ShowMonthCalendar(FALSE); + CFWL_Event_DtpCloseUp ev; + m_pOwner->DispatchEvent(&ev); + } else { + if (!(m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_DTP_TimeFormat)) { + m_pOwner->ShowMonthCalendar(TRUE); + CFWL_Event_DtpDropDown ev; + m_pOwner->DispatchEvent(&ev); + } else { + } + m_pOwner->m_bLBtnDown = TRUE; + m_pOwner->Repaint(&m_pOwner->m_rtClient); + } + } +} +void CFWL_DateTimePickerImpDelegate::OnLButtonUp(CFWL_MsgMouse *pMsg) +{ + _FWL_RETURN_IF_FAIL(pMsg); + m_pOwner->m_bLBtnDown = FALSE; + if (m_pOwner->m_rtBtn.Contains(pMsg->m_fx, pMsg->m_fy)) { + m_pOwner->m_iBtnState = FWL_PARTSTATE_DTP_Hovered; + } else { + m_pOwner->m_iBtnState = FWL_PARTSTATE_DTP_Normal; + } + m_pOwner->Repaint(&m_pOwner->m_rtBtn); +} +void CFWL_DateTimePickerImpDelegate::OnMouseMove(CFWL_MsgMouse *pMsg) +{ + if (m_pOwner->m_rtBtn.Contains(pMsg->m_fx, pMsg->m_fy)) { + } else { + m_pOwner->m_iBtnState = FWL_PARTSTATE_DTP_Normal; + } + m_pOwner->Repaint(&m_pOwner->m_rtBtn); +} +void CFWL_DateTimePickerImpDelegate::OnMouseLeave(CFWL_MsgMouse *pMsg) +{ + _FWL_RETURN_IF_FAIL(pMsg); + m_pOwner->m_iBtnState = FWL_PARTSTATE_DTP_Normal; + m_pOwner->Repaint(&m_pOwner->m_rtBtn); +} +void CFWL_DateTimePickerImpDelegate::DisForm_OnFocusChanged(CFWL_Message *pMsg, FX_BOOL bSet) +{ + CFX_RectF rtInvalidate(m_pOwner->m_rtBtn); + if (bSet) { + m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused; + if ( m_pOwner->m_pEdit && !(m_pOwner->m_pEdit->GetStylesEx() & FWL_STYLEEXT_EDT_ReadOnly)) { + m_pOwner->m_rtBtn.Set(m_pOwner->m_pProperties->m_rtWidget.width, + 0, + m_pOwner->m_fBtn, + m_pOwner->m_pProperties->m_rtWidget.height - 1); + } + rtInvalidate = m_pOwner->m_rtBtn; + pMsg->m_pDstTarget = m_pOwner->m_pEdit; + IFWL_WidgetDelegate *pDelegate = m_pOwner->m_pEdit->SetDelegate(NULL); + pDelegate->OnProcessMessage(pMsg); + } else { + m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused; + m_pOwner->m_rtBtn.Set(0, 0, 0, 0); + if (m_pOwner->DisForm_IsMonthCalendarShowed()) { + m_pOwner->ShowMonthCalendar(FALSE); + } + if (m_pOwner->m_pEdit->GetStates() & FWL_WGTSTATE_Focused) { + pMsg->m_pSrcTarget = m_pOwner->m_pEdit; + IFWL_WidgetDelegate *pDelegate = m_pOwner->m_pEdit->SetDelegate(NULL); + pDelegate->OnProcessMessage(pMsg); + } + } + rtInvalidate.Inflate(2, 2); + m_pOwner->Repaint(&rtInvalidate); +} diff --git a/xfa/src/fwl/src/basewidget/fwl_editimp.cpp b/xfa/src/fwl/src/basewidget/fwl_editimp.cpp new file mode 100644 index 0000000000..c7bd922fc1 --- /dev/null +++ b/xfa/src/fwl/src/basewidget/fwl_editimp.cpp @@ -0,0 +1,2244 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../core/include/fwl_threadimp.h" +#include "../core/include/fwl_appimp.h" +#include "../core/include/fwl_targetimp.h" +#include "../core/include/fwl_noteimp.h" +#include "../core/include/fwl_widgetimp.h" +#include "../core/include/fwl_widgetmgrimp.h" +#include "include/fwl_scrollbarimp.h" +#include "include/fwl_editimp.h" +#include "include/fwl_caretimp.h" +IFWL_Edit* IFWL_Edit::Create() +{ + return new IFWL_Edit; +} +IFWL_Edit::IFWL_Edit() +{ + m_pData = NULL; +} +IFWL_Edit::~IFWL_Edit() +{ + if (m_pData) { + delete (CFWL_EditImp*)m_pData; + m_pData = NULL; + } +} +FWL_ERR IFWL_Edit::Initialize(IFWL_Widget *pOuter) +{ + m_pData = FX_NEW CFWL_EditImp(pOuter); + ((CFWL_EditImp*)m_pData)->SetInterface(this); + return ((CFWL_EditImp*)m_pData)->Initialize(); +} +FWL_ERR IFWL_Edit::Initialize(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter) +{ + m_pData = FX_NEW CFWL_EditImp(properties, pOuter); + ((CFWL_EditImp*)m_pData)->SetInterface(this); + return ((CFWL_EditImp*)m_pData)->Initialize(); +} +FWL_ERR IFWL_Edit::SetText(const CFX_WideString &wsText) +{ + return ((CFWL_EditImp*)m_pData)->SetText(wsText); +} +FX_INT32 IFWL_Edit::GetTextLength() const +{ + return ((CFWL_EditImp*)m_pData)->GetTextLength(); +} +FWL_ERR IFWL_Edit::GetText(CFX_WideString &wsText, FX_INT32 nStart, FX_INT32 nCount) const +{ + return ((CFWL_EditImp*)m_pData)->GetText(wsText, nStart, nCount); +} +FWL_ERR IFWL_Edit::ClearText() +{ + return ((CFWL_EditImp*)m_pData)->ClearText(); +} +FX_INT32 IFWL_Edit::GetCaretPos() const +{ + return ((CFWL_EditImp*)m_pData)->GetCaretPos(); +} +FX_INT32 IFWL_Edit::SetCaretPos(FX_INT32 nIndex, FX_BOOL bBefore) +{ + return ((CFWL_EditImp*)m_pData)->SetCaretPos(nIndex, bBefore); +} +FWL_ERR IFWL_Edit::AddSelRange(FX_INT32 nStart, FX_INT32 nCount) +{ + return ((CFWL_EditImp*)m_pData)->AddSelRange(nStart, nCount); +} +FX_INT32 IFWL_Edit::CountSelRanges() +{ + return ((CFWL_EditImp*)m_pData)->CountSelRanges(); +} +FX_INT32 IFWL_Edit::GetSelRange(FX_INT32 nIndex, FX_INT32 &nStart) +{ + return ((CFWL_EditImp*)m_pData)->GetSelRange(nIndex, nStart); +} +FWL_ERR IFWL_Edit::ClearSelections() +{ + return ((CFWL_EditImp*)m_pData)->ClearSelections(); +} +FX_INT32 IFWL_Edit::GetLimit() +{ + return ((CFWL_EditImp*)m_pData)->GetLimit(); +} +FWL_ERR IFWL_Edit::SetLimit(FX_INT32 nLimit) +{ + return ((CFWL_EditImp*)m_pData)->SetLimit(nLimit); +} +FWL_ERR IFWL_Edit::SetAliasChar(FX_WCHAR wAlias) +{ + return ((CFWL_EditImp*)m_pData)->SetAliasChar(wAlias); +} +FWL_ERR IFWL_Edit::SetFormatString(const CFX_WideString &wsFormat) +{ + return ((CFWL_EditImp*)m_pData)->SetFormatString(wsFormat); +} +FWL_ERR IFWL_Edit::Insert(FX_INT32 nStart, FX_LPCWSTR lpText, FX_INT32 nLen) +{ + return ((CFWL_EditImp*)m_pData)->Insert(nStart, lpText, nLen); +} +FWL_ERR IFWL_Edit::DeleteSelections() +{ + return ((CFWL_EditImp*)m_pData)->DeleteSelections(); +} +FWL_ERR IFWL_Edit::DeleteRange(FX_INT32 nStart, FX_INT32 nCount) +{ + return ((CFWL_EditImp*)m_pData)->DeleteRange(nStart, nCount); +} +FWL_ERR IFWL_Edit::ReplaceSelections(const CFX_WideStringC &wsReplace) +{ + return ((CFWL_EditImp*)m_pData)->ReplaceSelections(wsReplace); +} +FWL_ERR IFWL_Edit::Replace(FX_INT32 nStart, FX_INT32 nLen, const CFX_WideStringC &wsReplace) +{ + return ((CFWL_EditImp*)m_pData)->Replace(nStart, nLen, wsReplace); +} +FWL_ERR IFWL_Edit::DoClipboard(FX_INT32 iCmd) +{ + return ((CFWL_EditImp*)m_pData)->DoClipboard(iCmd); +} +FX_BOOL IFWL_Edit::Copy(CFX_WideString &wsCopy) +{ + return ((CFWL_EditImp*)m_pData)->Copy(wsCopy); +} +FX_BOOL IFWL_Edit::Cut(CFX_WideString &wsCut) +{ + return ((CFWL_EditImp*)m_pData)->Cut(wsCut); +} +FX_BOOL IFWL_Edit::Paste(const CFX_WideString &wsPaste) +{ + return ((CFWL_EditImp*)m_pData)->Paste(wsPaste); +} +FX_BOOL IFWL_Edit::Delete() +{ + return ((CFWL_EditImp*)m_pData)->Delete(); +} +FX_BOOL IFWL_Edit::Redo(FX_BSTR bsRecord) +{ + return ((CFWL_EditImp*)m_pData)->Redo(bsRecord); +} +FX_BOOL IFWL_Edit::Undo(FX_BSTR bsRecord) +{ + return ((CFWL_EditImp*)m_pData)->Undo(bsRecord); +} +FX_BOOL IFWL_Edit::Undo() +{ + return ((CFWL_EditImp*)m_pData)->Undo(); +} +FX_BOOL IFWL_Edit::Redo() +{ + return ((CFWL_EditImp*)m_pData)->Redo(); +} +FX_BOOL IFWL_Edit::CanUndo() +{ + return ((CFWL_EditImp*)m_pData)->CanUndo(); +} +FX_BOOL IFWL_Edit::CanRedo() +{ + return ((CFWL_EditImp*)m_pData)->CanRedo(); +} +FWL_ERR IFWL_Edit::SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant) +{ + return ((CFWL_EditImp*)m_pData)->SetTabWidth(fTabWidth, bEquidistant); +} +FWL_ERR IFWL_Edit::SetOuter(IFWL_Widget *pOuter) +{ + return ((CFWL_EditImp*)m_pData)->SetOuter(pOuter); +} +FWL_ERR IFWL_Edit::SetNumberRange(FX_INT32 iMin, FX_INT32 iMax) +{ + return ((CFWL_EditImp*)m_pData)->SetNumberRange(iMin, iMax); +} +FWL_ERR IFWL_Edit::SetBackColor(FX_DWORD dwColor) +{ + return ((CFWL_EditImp*)m_pData)->SetBackgroundColor(dwColor); +} +FWL_ERR IFWL_Edit::SetFont(const CFX_WideString &wsFont, FX_FLOAT fSize) +{ + return ((CFWL_EditImp*)m_pData)->SetFont(wsFont, fSize); +} +void IFWL_Edit::SetScrollOffset(FX_FLOAT fScrollOffset) +{ + return ((CFWL_EditImp*)m_pData)->SetScrollOffset(fScrollOffset); +} +FX_BOOL IFWL_Edit::GetSuggestWords(CFX_PointF pointf, CFX_ByteStringArray &sSuggest) +{ + return ((CFWL_EditImp*)m_pData)->GetSuggestWords(pointf, sSuggest); +} +FX_BOOL IFWL_Edit::ReplaceSpellCheckWord(CFX_PointF pointf, FX_BSTR bsReplace) +{ + return ((CFWL_EditImp*)m_pData)->ReplaceSpellCheckWord(pointf, bsReplace); +} +#define FWL_EDIT_Margin 3 +CFWL_EditImp::CFWL_EditImp(IFWL_Widget *pOuter ) + : CFWL_WidgetImp(pOuter) + , m_fVAlignOffset(0.0f) + , m_fScrollOffsetX(0.0f) + , m_fScrollOffsetY(0.0f) + , m_pEdtEngine(NULL) + , m_bLButtonDown(FALSE) + , m_nSelStart(0) + , m_nLimit(-1) + , m_fFontSize(0) + , m_pVertScrollBar(NULL) + , m_pHorzScrollBar(NULL) + , m_pCaret(NULL) + , m_iMin(-1) + , m_iMax(0xFFFFFFF) + , m_bSetRange(FALSE) + , m_pTextField(NULL) + , m_backColor(0) + , m_updateBackColor(FALSE) + , m_iCurRecord(-1) + , m_iMaxRecord(128) + , m_fSpaceAbove(0) + , m_fSpaceBelow(0) +{ + m_rtClient.Reset(); + m_rtEngine.Reset(); + m_rtStatic.Reset(); +} +CFWL_EditImp::CFWL_EditImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter ) + : CFWL_WidgetImp(properties, pOuter) + , m_fVAlignOffset(0.0f) + , m_fScrollOffsetX(0.0f) + , m_fScrollOffsetY(0.0f) + , m_pEdtEngine(NULL) + , m_bLButtonDown(FALSE) + , m_nSelStart(0) + , m_nLimit(-1) + , m_fFontSize(0) + , m_pVertScrollBar(NULL) + , m_pHorzScrollBar(NULL) + , m_pCaret(NULL) + , m_iMin(-1) + , m_iMax(0xFFFFFFF) + , m_bSetRange(FALSE) + , m_pTextField(NULL) + , m_backColor(0) + , m_updateBackColor(FALSE) + , m_iCurRecord(-1) + , m_iMaxRecord(128) + , m_fSpaceAbove(0) + , m_fSpaceBelow(0) +{ + m_rtClient.Reset(); + m_rtEngine.Reset(); + m_rtStatic.Reset(); +} +CFWL_EditImp::~CFWL_EditImp() +{ + if (m_pEdtEngine) { + m_pEdtEngine->Release(); + m_pEdtEngine = NULL; + } + if (m_pHorzScrollBar) { + m_pHorzScrollBar->Release(); + m_pHorzScrollBar = NULL; + } + if (m_pVertScrollBar) { + m_pVertScrollBar->Release(); + m_pVertScrollBar = NULL; + } + if (m_pCaret) { + m_pCaret->Release(); + m_pCaret = NULL; + } + ClearRecord(); +} +FWL_ERR CFWL_EditImp::GetClassName(CFX_WideString &wsClass) const +{ + wsClass = FWL_CLASS_Edit; + return FWL_ERR_Succeeded; +} +FX_DWORD CFWL_EditImp::GetClassID() const +{ + return FWL_CLASSHASH_Edit; +} +FWL_ERR CFWL_EditImp::Initialize() +{ + _FWL_ERR_CHECK_RETURN_VALUE_IF_FAIL(CFWL_WidgetImp::Initialize(), FWL_ERR_Indefinite); + if (!m_pDelegate) { + m_pDelegate = (IFWL_WidgetDelegate*)FX_NEW CFWL_EditImpDelegate(this); + } + InitCaret(); + if (!m_pEdtEngine) { + InitEngine(); + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_EditImp::Finalize() +{ + if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) { + ShowCaret(FALSE); + } + if (m_pHorzScrollBar) { + m_pHorzScrollBar->Finalize(); + } + if (m_pVertScrollBar) { + m_pVertScrollBar->Finalize(); + } + if ( m_pDelegate) { + delete (CFWL_EditImpDelegate*)m_pDelegate; + m_pDelegate = NULL; + } + return CFWL_WidgetImp::Finalize(); +} +FWL_ERR CFWL_EditImp::GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize ) +{ + if (bAutoSize) { + rect.Set(0, 0, 0, 0); + if (m_pEdtEngine) { + FX_INT32 iTextLen = m_pEdtEngine->GetTextLength(); + if (iTextLen > 0) { + CFX_WideString wsText; + m_pEdtEngine->GetText(wsText, 0); + CFX_SizeF sz = CalcTextSize(wsText, + m_pProperties->m_pThemeProvider, + m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_MultiLine); + rect.Set(0, 0, sz.x, sz.y); + } + } + CFWL_WidgetImp::GetWidgetRect(rect, TRUE); + } else { + rect = m_pProperties->m_rtWidget; + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_OuterScrollbar) { + if (IsShowScrollBar(TRUE)) { + FX_FLOAT *pfWidth = (FX_FLOAT*)GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth); + rect.width += *pfWidth; + rect.width += FWL_EDIT_Margin; + } + if (IsShowScrollBar(FALSE)) { + FX_FLOAT *pfWidth = (FX_FLOAT*)GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth); + rect.height += *pfWidth; + rect.height += FWL_EDIT_Margin; + } + } + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_EditImp::SetStates(FX_DWORD dwStates, FX_BOOL bSet ) +{ + if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Invisible) || (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)) { + ShowCaret(FALSE); + } + return CFWL_WidgetImp::SetStates(dwStates, bSet); +} +FWL_ERR CFWL_EditImp::SetWidgetRect(const CFX_RectF &rect) +{ + return CFWL_WidgetImp::SetWidgetRect(rect); +} +FWL_ERR CFWL_EditImp::Update() +{ + if (IsLocked()) { + return FWL_ERR_Indefinite; + } + if (!m_pProperties->m_pThemeProvider) { + m_pProperties->m_pThemeProvider = GetAvailableTheme(); + } + Layout(); + if (m_rtClient.IsEmpty()) { + return FWL_ERR_Indefinite; + } + UpdateEditEngine(); + UpdateVAlignment(); + UpdateScroll(); + InitCaret(); + return FWL_ERR_Succeeded; +} +FX_DWORD CFWL_EditImp::HitTest(FX_FLOAT fx, FX_FLOAT fy) +{ + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_OuterScrollbar) { + if (IsShowScrollBar(TRUE)) { + CFX_RectF rect; + m_pVertScrollBar->GetWidgetRect(rect); + if (rect.Contains(fx, fy)) { + return FWL_WGTHITTEST_VScrollBar; + } + } + if (IsShowScrollBar(FALSE)) { + CFX_RectF rect; + m_pHorzScrollBar->GetWidgetRect(rect); + if (rect.Contains(fx, fy)) { + return FWL_WGTHITTEST_HScrollBar; + } + } + } + if (m_rtClient.Contains(fx, fy)) { + return FWL_WGTHITTEST_Edit; + } + return FWL_WGTHITTEST_Unknown; +} +#define FX_EDIT_ISLATINWORD(u) (u == 0x2D || (u <= 0x005A && u >= 0x0041) || (u <= 0x007A && u >= 0x0061) || (u <= 0x02AF && u >= 0x00C0) || u == 0x0027) +static void AddSquigglyPath(CFX_Path& PathData, FX_FLOAT fStartX, FX_FLOAT fEndX, FX_FLOAT fY, FX_FLOAT fStep) +{ + PathData.MoveTo(fStartX, fY); + FX_FLOAT fx; + FX_INT32 i; + for (i = 1, fx = fStartX + fStep; fx < fEndX; fx += fStep, i++) { + PathData.LineTo(fx, fY + (i & 1)*fStep); + } +} +void CFWL_EditImp::AddSpellCheckObj(CFX_Path& PathData, FX_INT32 nStart, FX_INT32 nCount, FX_FLOAT fOffSetX, FX_FLOAT fOffSetY) +{ + FX_FLOAT fStartX = 0.0f; + FX_FLOAT fEndX = 0.0f; + FX_FLOAT fY = 0.0f; + FX_FLOAT fStep = 0.0f; + IFDE_TxtEdtPage *pPage = m_pEdtEngine->GetPage(0); + CFX_RectFArray rectArray; + CFX_RectF rectText; + const FDE_TXTEDTPARAMS* txtEdtParams = m_pEdtEngine->GetEditParams(); + FX_FLOAT fAsent = (FX_FLOAT)txtEdtParams->pFont->GetAscent() * txtEdtParams->fFontSize / 1000; + pPage->CalcRangeRectArray(nStart, nCount, rectArray); + for (int i = 0; i < rectArray.GetSize(); i++) { + rectText = rectArray.GetAt(i); + fY = rectText.top + fAsent + fOffSetY; + fStep = txtEdtParams->fFontSize / 16.0f; + fStartX = rectText.left + fOffSetX; + fEndX = fStartX + rectText.Width(); + AddSquigglyPath(PathData, fStartX, fEndX, fY, fStep); + } +} +FX_INT32 CFWL_EditImp::GetWordAtPoint(CFX_PointF pointf, FX_INT32& nCount) +{ + return 0; +} +FX_BOOL CFWL_EditImp::GetSuggestWords(CFX_PointF pointf, CFX_ByteStringArray &sSuggest) +{ + FX_INT32 nWordCount = 0; + FX_INT32 nWordStart = GetWordAtPoint(pointf, nWordCount); + if (nWordCount < 1) { + return FALSE; + } + CFX_WideString wsSpell; + GetText(wsSpell, nWordStart, nWordCount); + CFX_ByteString sLatinWord; + for (int i = 0; i < nWordCount; i++) { + if (!FX_EDIT_ISLATINWORD(wsSpell[i])) { + break; + } + sLatinWord += (FX_CHAR)wsSpell[i]; + } + if (sLatinWord.IsEmpty()) { + return FALSE; + } + CFWL_EvtEdtCheckWord checkWordEvent; + checkWordEvent.m_pSrcTarget = m_pInterface; + checkWordEvent.bsWord = sLatinWord; + checkWordEvent.bCheckWord = TRUE; + DispatchEvent(&checkWordEvent); + if (checkWordEvent.bCheckWord) { + return FALSE; + } + CFWL_EvtEdtGetSuggestWords suggestWordsEvent; + suggestWordsEvent.m_pSrcTarget = m_pInterface; + suggestWordsEvent.bsWord = sLatinWord; + suggestWordsEvent.bsArraySuggestWords = sSuggest; + suggestWordsEvent.bSuggestWords = FALSE; + DispatchEvent(&checkWordEvent); + return suggestWordsEvent.bSuggestWords; +} +FX_BOOL CFWL_EditImp::ReplaceSpellCheckWord(CFX_PointF pointf, FX_BSTR bsReplace) +{ + FX_INT32 nWordCount = 0; + FX_INT32 nWordStart = GetWordAtPoint(pointf, nWordCount); + if (nWordCount < 1) { + return FALSE; + } + CFX_WideString wsSpell; + GetText(wsSpell, nWordStart, nWordCount); + for (int i = 0; i < nWordCount; i++) { + if (!FX_EDIT_ISLATINWORD(wsSpell[i])) { + nWordCount = i; + break; + } + } + FX_INT32 nDestLen = bsReplace.GetLength(); + CFX_WideString wsDest; + FX_LPWSTR pBuffer = wsDest.GetBuffer(nDestLen); + for (FX_INT32 i = 0; i < nDestLen; i++) { + pBuffer[i] = bsReplace[i]; + } + wsDest.ReleaseBuffer(nDestLen); + Replace(nWordStart, nWordCount, wsDest); + return TRUE; +} +void CFWL_EditImp::DrawSpellCheck(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + pGraphics->SaveGraphState(); + if (pMatrix) { + pGraphics->ConcatMatrix((CFX_Matrix*)pMatrix); + } + FX_ARGB cr = 0xFFFF0000; + CFX_Color crLine(cr); + FX_FLOAT fWidth = 1.0f; + CFWL_EvtEdtCheckWord checkWordEvent; + checkWordEvent.m_pSrcTarget = m_pInterface; + CFX_ByteString sLatinWord; + CFX_Path pathSpell; + pathSpell.Create(); + FX_INT32 nStart = 0; + FX_FLOAT fOffSetX = m_rtEngine.left - m_fScrollOffsetX; + FX_FLOAT fOffSetY = m_rtEngine.top - m_fScrollOffsetY + m_fVAlignOffset; + CFX_WideString wsSpell; + this->GetText(wsSpell); + FX_INT32 nContentLen = wsSpell.GetLength(); + for (int i = 0; i < nContentLen; i++) { + if (FX_EDIT_ISLATINWORD(wsSpell[i])) { + if (sLatinWord.IsEmpty()) { + nStart = i; + } + sLatinWord += (FX_CHAR)wsSpell[i]; + } else { + checkWordEvent.bsWord = sLatinWord; + checkWordEvent.bCheckWord = TRUE; + DispatchEvent(&checkWordEvent); + if (!sLatinWord.IsEmpty() && !checkWordEvent.bCheckWord) { + AddSpellCheckObj(pathSpell, nStart, sLatinWord.GetLength(), fOffSetX, fOffSetY); + } + sLatinWord.Empty(); + } + } + checkWordEvent.bsWord = sLatinWord; + checkWordEvent.bCheckWord = TRUE; + DispatchEvent(&checkWordEvent); + if (!sLatinWord.IsEmpty() && !checkWordEvent.bCheckWord) { + AddSpellCheckObj(pathSpell, nStart, sLatinWord.GetLength(), fOffSetX, fOffSetY); + } + if (!pathSpell.IsEmpty()) { + CFX_RectF rtClip = m_rtEngine; + CFX_Matrix mt; + mt.Set(1, 0, 0, 1, fOffSetX, fOffSetY); + if (pMatrix) { + pMatrix->TransformRect(rtClip); + mt.Concat(*pMatrix); + } + pGraphics->SetClipRect(rtClip); + pGraphics->SetStrokeColor(&crLine); + pGraphics->SetLineWidth(0); + pGraphics->StrokePath(&pathSpell, NULL); + } + pGraphics->RestoreGraphState(); +} +FWL_ERR CFWL_EditImp::DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + _FWL_RETURN_VALUE_IF_FAIL(pGraphics, FWL_ERR_Indefinite); + _FWL_RETURN_VALUE_IF_FAIL(m_pProperties->m_pThemeProvider, FWL_ERR_Indefinite); + if (m_rtClient.IsEmpty()) { + return FWL_ERR_Indefinite; + } + IFWL_ThemeProvider *pTheme = m_pProperties->m_pThemeProvider; + if (!m_pWidgetMgr->IsFormDisabled()) { + DrawTextBk(pGraphics, pTheme, pMatrix); + } + if (m_pEdtEngine) { + DrawContent(pGraphics, pTheme, pMatrix); + } + if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) && !(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReadOnly)) { + DrawSpellCheck(pGraphics, pMatrix); + } + if (HasBorder()) { + DrawBorder(pGraphics, FWL_PART_EDT_Border, pTheme, pMatrix); + } + if (HasEdge()) { + DrawEdge(pGraphics, FWL_PART_EDT_Edge, pTheme, pMatrix); + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_EditImp::SetThemeProvider(IFWL_ThemeProvider *pThemeProvider) +{ + _FWL_RETURN_VALUE_IF_FAIL(pThemeProvider, FWL_ERR_Indefinite); + if (m_pHorzScrollBar) { + m_pHorzScrollBar->SetThemeProvider(pThemeProvider); + } + if (m_pVertScrollBar) { + m_pVertScrollBar->SetThemeProvider(pThemeProvider); + } + if (m_pCaret) { + m_pCaret->SetThemeProvider(pThemeProvider); + } + m_pProperties->m_pThemeProvider = pThemeProvider; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_EditImp::SetText(const CFX_WideString &wsText) +{ + m_pEdtEngine->SetText(wsText); + return FWL_ERR_Succeeded; +} +FX_INT32 CFWL_EditImp::GetTextLength() const +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdtEngine, -1); + return m_pEdtEngine->GetTextLength(); +} +FWL_ERR CFWL_EditImp::GetText(CFX_WideString &wsText, FX_INT32 nStart , FX_INT32 nCount ) const +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdtEngine, FWL_ERR_Succeeded); + m_pEdtEngine->GetText(wsText, nStart, nCount); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_EditImp::ClearText() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdtEngine, FWL_ERR_Succeeded); + m_pEdtEngine->ClearText(); + return FWL_ERR_Succeeded; +} +FX_INT32 CFWL_EditImp::GetCaretPos() const +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdtEngine, -1); + return m_pEdtEngine->GetCaretPos(); +} +FX_INT32 CFWL_EditImp::SetCaretPos(FX_INT32 nIndex, FX_BOOL bBefore ) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdtEngine, -1); + return m_pEdtEngine->SetCaretPos(nIndex, bBefore); +} +FWL_ERR CFWL_EditImp::AddSelRange(FX_INT32 nStart, FX_INT32 nCount ) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdtEngine, FWL_ERR_Succeeded); + m_pEdtEngine->AddSelRange(nStart, nCount); + return FWL_ERR_Succeeded; +} +FX_INT32 CFWL_EditImp::CountSelRanges() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdtEngine, 0); + return m_pEdtEngine->CountSelRanges(); + return FWL_ERR_Succeeded; +} +FX_INT32 CFWL_EditImp::GetSelRange(FX_INT32 nIndex, FX_INT32 &nStart) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdtEngine, -1); + return m_pEdtEngine->GetSelRange(nIndex, nStart); +} +FWL_ERR CFWL_EditImp::ClearSelections() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdtEngine, FWL_ERR_Succeeded); + m_pEdtEngine->ClearSelection(); + return FWL_ERR_Succeeded; +} +FX_INT32 CFWL_EditImp::GetLimit() +{ + return m_nLimit; +} +FWL_ERR CFWL_EditImp::SetLimit(FX_INT32 nLimit) +{ + m_nLimit = nLimit; + _FWL_RETURN_VALUE_IF_FAIL(m_pEdtEngine, FWL_ERR_Succeeded); + m_pEdtEngine->SetLimit(nLimit); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_EditImp::SetAliasChar(FX_WCHAR wAlias) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdtEngine, FWL_ERR_Indefinite); + m_pEdtEngine->SetAliasChar(wAlias); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_EditImp::SetFormatString(const CFX_WideString &wsFormat) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdtEngine, FWL_ERR_Succeeded); + m_pEdtEngine->SetFormatBlock(0, wsFormat); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_EditImp::Insert(FX_INT32 nStart, FX_LPCWSTR lpText, FX_INT32 nLen) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdtEngine, FWL_ERR_Succeeded); + if ( (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReadOnly) + || (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)) { + return FWL_ERR_Indefinite; + } + m_pEdtEngine->Insert(nStart, lpText, nLen); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_EditImp::DeleteSelections() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdtEngine, FWL_ERR_Succeeded); + FX_INT32 iCount = m_pEdtEngine->CountSelRanges(); + if (iCount > 0) { + m_pEdtEngine->Delete(-1); + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_EditImp::DeleteRange(FX_INT32 nStart, FX_INT32 nCount ) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdtEngine, FWL_ERR_Succeeded); + m_pEdtEngine->DeleteRange(nStart, nCount); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_EditImp::ReplaceSelections(const CFX_WideStringC &wsReplace) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdtEngine, FWL_ERR_Succeeded); + FX_INT32 iCount = m_pEdtEngine->CountSelRanges(); + for (int i = 0; i < iCount; i ++) { + FX_INT32 nStart; + FX_INT32 nCount = m_pEdtEngine->GetSelRange(i, nStart); + m_pEdtEngine->Replace(nStart, nCount, wsReplace); + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_EditImp::Replace(FX_INT32 nStart, FX_INT32 nLen, const CFX_WideStringC &wsReplace) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdtEngine, FWL_ERR_Succeeded); + m_pEdtEngine->Replace(nStart, nLen, wsReplace); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_EditImp::DoClipboard(FX_INT32 iCmd) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdtEngine, FWL_ERR_Succeeded); + if ( (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReadOnly) + || (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)) { + return FWL_ERR_Succeeded; + } + IFWL_AdapterNative *pNative = FWL_GetAdapterNative(); + _FWL_RETURN_VALUE_IF_FAIL(pNative, FWL_ERR_Indefinite); + IFWL_AdapterClipboardMgr *pClipBorder = pNative->GetClipboardMgr(); + _FWL_RETURN_VALUE_IF_FAIL(pClipBorder, FWL_ERR_Indefinite); + CFX_WideString wsText; + switch(iCmd) { + case 1: { + FX_INT32 nStart; + FX_INT32 nCount = m_pEdtEngine->GetSelRange(0, nStart); + if (nCount < 1) { + break; + } + m_pEdtEngine->GetText(wsText, nStart, nCount); + pClipBorder->SetStringData(wsText); + break; + } + case 2: { + FX_INT32 nStart; + FX_INT32 nCount = m_pEdtEngine->GetSelRange(0, nStart); + if (nCount < 1) { + break; + } + m_pEdtEngine->GetText(wsText, nStart, nCount); + m_pEdtEngine->DeleteRange(nStart, nCount); + m_pEdtEngine->ClearSelection(); + pClipBorder->SetStringData(wsText); + break; + } + case 3: { + pClipBorder->GetStringData(wsText); + FX_INT32 iLen = wsText.GetLength(); + if (iLen < 0) { + break; + } + if (wsText[iLen] == L'\0') { + if (iLen == 1) { + break; + } + iLen --; + wsText = wsText.Left(iLen); + } + FX_INT32 nPos = m_pEdtEngine->GetCaretPos(); + m_pEdtEngine->Insert(nPos, wsText, iLen); + break; + } + default: { + } + } + return FWL_ERR_Succeeded; +} +FX_BOOL CFWL_EditImp::Copy(CFX_WideString &wsCopy) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdtEngine, FALSE); + FX_INT32 nCount = m_pEdtEngine->CountSelRanges(); + if (nCount == 0) { + return FALSE; + } + wsCopy.Empty(); + CFX_WideString wsTemp; + FX_INT32 nStart, nLength; + for (FX_INT32 i = 0; i < nCount; i ++) { + nLength = m_pEdtEngine->GetSelRange(i, nStart); + m_pEdtEngine->GetText(wsTemp, nStart, nLength); + wsCopy += wsTemp; + wsTemp.Empty(); + } + return TRUE; +} +FX_BOOL CFWL_EditImp::Cut(CFX_WideString &wsCut) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdtEngine, FALSE); + FX_INT32 nCount = m_pEdtEngine->CountSelRanges(); + if (nCount == 0) { + return FALSE; + } + wsCut.Empty(); + CFX_WideString wsTemp; + FX_INT32 nStart, nLength; + for (FX_INT32 i = 0; i < nCount; i ++) { + nLength = m_pEdtEngine->GetSelRange(i, nStart); + m_pEdtEngine->GetText(wsTemp, nStart, nLength); + wsCut += wsTemp; + wsTemp.Empty(); + } + m_pEdtEngine->Delete(0); + return TRUE; +} +FX_BOOL CFWL_EditImp::Paste(const CFX_WideString &wsPaste) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdtEngine, FALSE); + FX_INT32 nCaret = m_pEdtEngine->GetCaretPos(); + FX_INT32 iError = m_pEdtEngine->Insert(nCaret, FX_LPCWSTR(wsPaste), wsPaste.GetLength()); + if (iError < 0) { + ProcessInsertError(iError); + return FALSE; + } + return TRUE; +} +FX_BOOL CFWL_EditImp::Delete() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdtEngine, FALSE); + FX_INT32 nCount = m_pEdtEngine->CountSelRanges(); + if (nCount < 1) { + return FALSE; + } + m_pEdtEngine->Delete(0); + return TRUE; +} +FX_BOOL CFWL_EditImp::Redo(FX_BSTR bsRecord) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdtEngine, FALSE); + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_NoRedoUndo) { + return TRUE; + } + return m_pEdtEngine->Redo(bsRecord); +} +FX_BOOL CFWL_EditImp::Undo(FX_BSTR bsRecord) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdtEngine, FALSE); + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_NoRedoUndo) { + return TRUE; + } + return m_pEdtEngine->Undo(bsRecord); +} +FX_BOOL CFWL_EditImp::Undo() +{ + if (!CanUndo()) { + return FALSE; + } + CFX_ByteString bsRecord = m_RecordArr[m_iCurRecord--]; + return Undo(bsRecord); +} +FX_BOOL CFWL_EditImp::Redo() +{ + if (!CanRedo()) { + return FALSE; + } + CFX_ByteString bsRecord = m_RecordArr[++m_iCurRecord]; + return Redo(bsRecord); +} +FX_BOOL CFWL_EditImp::CanUndo() +{ + return m_iCurRecord >= 0; +} +FX_BOOL CFWL_EditImp::CanRedo() +{ + return m_iCurRecord < m_RecordArr.GetSize() - 1; +} +FWL_ERR CFWL_EditImp::SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdtEngine, FWL_ERR_Succeeded); + FDE_LPTXTEDTPARAMS pParams = (FDE_LPTXTEDTPARAMS)m_pEdtEngine->GetEditParams(); + pParams->fTabWidth = fTabWidth; + pParams->bTabEquidistant = bEquidistant; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_EditImp::SetOuter(IFWL_Widget *pOuter) +{ + m_pOuter = pOuter; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_EditImp::SetNumberRange(FX_INT32 iMin, FX_INT32 iMax) +{ + m_iMin = iMin; + m_iMax = iMax; + m_bSetRange = TRUE; + return FWL_ERR_Succeeded; +} +void CFWL_EditImp::On_CaretChanged(IFDE_TxtEdtEngine *pEdit, FX_INT32 nPage, FX_BOOL bVisible ) +{ + if (m_rtEngine.IsEmpty()) { + return; + } + if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0) { + return; + } + FX_BOOL bRepaintContent = UpdateOffset(); + UpdateCaret(); + CFX_RectF rtInvalid; + rtInvalid.Set(0, 0, 0, 0); + FX_BOOL bRepaintScroll = FALSE; + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_MultiLine) { + IFWL_ScrollBar *pScroll = UpdateScroll(); + if (pScroll) { + pScroll->GetWidgetRect(rtInvalid); + bRepaintScroll = TRUE; + } + } + if (bRepaintContent || bRepaintScroll) { + if (bRepaintContent) { + rtInvalid.Union(m_rtEngine); + } + Repaint(&rtInvalid); + } +} +void CFWL_EditImp::On_TextChanged(IFDE_TxtEdtEngine *pEdit, FDE_TXTEDT_TEXTCHANGE_INFO &ChangeInfo) +{ + FX_DWORD dwStyleEx = m_pProperties->m_dwStyleExes; + if (dwStyleEx & FWL_STYLEEXT_EDT_VAlignMask) { + UpdateVAlignment(); + } + IFDE_TxtEdtPage *page = m_pEdtEngine->GetPage(0); + FX_FLOAT fContentWidth = page->GetContentsBox().width; + FX_FLOAT fContentHeight = page->GetContentsBox().height; + CFX_RectF rtTemp; + GetClientRect(rtTemp); + FX_BOOL bHSelfAdaption = m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_HSelfAdaption; + FX_BOOL bVSelfAdaption = m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_VSelfAdaption; + FX_BOOL bNeedUpdate = FALSE; + if (bHSelfAdaption || bVSelfAdaption) { + CFWL_EvtEdtPreSelfAdaption evt; + evt.m_pSrcTarget = m_pInterface; + evt.bHSelfAdaption = TRUE; + evt.bVSelfAdaption = TRUE; + FX_FLOAT fWidth; + FX_FLOAT fHight; + fWidth = bHSelfAdaption ? fContentWidth : m_pProperties->m_rtWidget.width; + fHight = bVSelfAdaption ? fContentHeight : m_pProperties->m_rtWidget.height; + evt.rtAfterChange.Set(0, 0, fWidth, fHight); + DispatchEvent(&evt); + if (!evt.bHSelfAdaption) { + ModifyStylesEx(0, FWL_STYLEEXT_EDT_HSelfAdaption | FWL_STYLEEXT_EDT_AutoHScroll); + } + if (!evt.bVSelfAdaption) { + ModifyStylesEx(0, FWL_STYLEEXT_EDT_VSelfAdaption | FWL_STYLEEXT_EDT_AutoVScroll); + } + bNeedUpdate = (bHSelfAdaption && !evt.bHSelfAdaption) || (bVSelfAdaption && !evt.bVSelfAdaption); + } + FX_FLOAT fContentWidth1 = fContentWidth; + FX_FLOAT fContentHeight1 = fContentHeight; + if (bNeedUpdate) { + UpdateEditParams(); + UpdateEditLayout(); + IFDE_TxtEdtPage *page1 = m_pEdtEngine->GetPage(0); + fContentWidth1 = page1->GetContentsBox().width; + fContentHeight1 = page1->GetContentsBox().height; + } + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_HSelfAdaption) { + rtTemp.width = FX_MAX(m_pProperties->m_rtWidget.width, fContentWidth1); + m_pProperties->m_rtWidget.width = fContentWidth1; + } + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_VSelfAdaption) { + rtTemp.height = FX_MAX(m_pProperties->m_rtWidget.height, fContentHeight1); + m_pProperties->m_rtWidget.height = fContentHeight1; + } + CFWL_EvtEdtTextChanged event; + event.m_pSrcTarget = m_pInterface; + event.nChangeType = ChangeInfo.nChangeType; + event.wsInsert = ChangeInfo.wsInsert; + event.wsDelete = ChangeInfo.wsDelete; + event.wsPrevText = ChangeInfo.wsPrevText; + DispatchEvent(&event); + LayoutScrollBar(); + Repaint(&rtTemp); +} +void CFWL_EditImp::On_SelChanged(IFDE_TxtEdtEngine *pEdit) +{ + CFX_RectF rtTemp; + GetClientRect(rtTemp); + Repaint(&rtTemp); +} +FX_BOOL CFWL_EditImp::On_PageLoad(IFDE_TxtEdtEngine *pEdit, FX_INT32 nPageIndex, FX_INT32 nPurpose) +{ + IFDE_TxtEdtEngine *pEdtEngine = m_pEdtEngine; + IFDE_TxtEdtPage *pPage = pEdtEngine->GetPage(nPageIndex); + _FWL_RETURN_VALUE_IF_FAIL(pPage, FALSE); + pPage->LoadPage(); + return TRUE; +} +FX_BOOL CFWL_EditImp::On_PageUnload(IFDE_TxtEdtEngine *pEdit, FX_INT32 nPageIndex, FX_INT32 nPurpose) +{ + IFDE_TxtEdtEngine *pEdtEngine = m_pEdtEngine; + IFDE_TxtEdtPage *pPage = pEdtEngine->GetPage(nPageIndex); + _FWL_RETURN_VALUE_IF_FAIL(pPage, FALSE); + pPage->UnloadPage(); + return TRUE; +} +void CFWL_EditImp::On_AddDoRecord(IFDE_TxtEdtEngine *pEdit, FX_BSTR bsDoRecord) +{ + AddDoRecord(bsDoRecord); + CFWL_WidgetImp *pSrcTarget = GetRootOuter(); + if (!pSrcTarget) { + pSrcTarget = this; + } + CFWL_EvtEdtAddDoRecord evt; + evt.m_pSrcTarget = m_pInterface; + evt.m_wsDoRecord = bsDoRecord; + m_pDelegate->OnProcessEvent(&evt); +} +FX_BOOL CFWL_EditImp::On_ValidateField(IFDE_TxtEdtEngine *pEdit, FX_INT32 nBlockIndex, FX_INT32 nFieldIndex, \ + const CFX_WideString &wsFieldText, FX_INT32 nCharIndex) +{ + return TRUE; +} +FX_BOOL CFWL_EditImp::On_ValidateBlock(IFDE_TxtEdtEngine *pEdit, FX_INT32 nBlockIndex) +{ + return TRUE; +} +FX_BOOL CFWL_EditImp::On_GetBlockFormatText(IFDE_TxtEdtEngine *pEdit, FX_INT32 nBlockIndex, CFX_WideString &wsBlockText) +{ + return FALSE; +} +FX_BOOL CFWL_EditImp::On_Validate(IFDE_TxtEdtEngine * pEdit, CFX_WideString &wsText) +{ + IFWL_Widget *pDst = GetOuter(); + if (!pDst) { + pDst = (IFWL_Widget*)this; + } + CFWL_EvtEdtValidate event; + event.pDstWidget = pDst; + event.m_pSrcTarget = m_pInterface; + event.wsInsert = wsText; + event.bValidate = TRUE; + DispatchEvent(&event); + return event.bValidate; +} +FWL_ERR CFWL_EditImp::SetBackgroundColor(FX_DWORD color) +{ + m_backColor = color; + m_updateBackColor = TRUE; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_EditImp::SetFont(const CFX_WideString &wsFont, FX_FLOAT fSize) +{ + m_wsFont = wsFont; + m_fFontSize = fSize; + return FWL_ERR_Succeeded; +} +void CFWL_EditImp::SetScrollOffset(FX_FLOAT fScrollOffset) +{ + m_fScrollOffsetY = fScrollOffset; +} +void CFWL_EditImp::DrawTextBk(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix ) +{ + CFWL_ThemeBackground param; + param.m_pWidget = m_pInterface; + param.m_iPart = FWL_PART_EDT_Background; + param.m_dwData = FWL_PARTDATA_EDT_Background; + param.m_dwStates = m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReadOnly ? + FWL_PARTSTATE_EDT_ReadOnly : FWL_PARTSTATE_EDT_Normal; + FX_DWORD dwStates = (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled); + if ( dwStates) { + param.m_dwStates = FWL_PARTSTATE_EDT_Disable; + } + param.m_pGraphics = pGraphics; + param.m_matrix = *pMatrix; + param.m_rtPart = m_rtClient; + pTheme->DrawBackground(¶m); + if (!IsShowScrollBar(TRUE) || !IsShowScrollBar(FALSE)) { + return; + } + CFX_RectF rtScorll; + m_pHorzScrollBar->GetWidgetRect(rtScorll); + FX_FLOAT fStaticWidth = rtScorll.height; + CFX_RectF rtStatic; + rtStatic.Set(m_rtClient.right() - rtScorll.height, + m_rtClient.bottom() - rtScorll.height, + rtScorll.height, + rtScorll.height); + param.m_dwData = FWL_PARTDATA_EDT_StaticBackground; + param.m_rtPart = rtStatic; + pTheme->DrawBackground(¶m); +} +void CFWL_EditImp::DrawContent(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix ) +{ + _FWL_RETURN_IF_FAIL(m_pEdtEngine); + IFDE_TxtEdtPage *pPage = m_pEdtEngine->GetPage(0); + _FWL_RETURN_IF_FAIL(pPage); + pGraphics->SaveGraphState(); + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_CombText) { + pGraphics->SaveGraphState(); + } + CFX_RectF rtClip = m_rtEngine; + FX_FLOAT fOffSetX = m_rtEngine.left - m_fScrollOffsetX; + FX_FLOAT fOffSetY = m_rtEngine.top - m_fScrollOffsetY + m_fVAlignOffset; + CFX_Matrix mt; + mt.Set(1, 0, 0, 1, fOffSetX, fOffSetY); + if (pMatrix) { + pMatrix->TransformRect(rtClip); + mt.Concat(*pMatrix); + } + FX_BOOL bShowSel = (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_NoHideSel) || (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused); + if (bShowSel) { + IFWL_Widget *pForm = m_pWidgetMgr->GetWidget(m_pInterface, FWL_WGTRELATION_SystemForm); + if (pForm) { + bShowSel = (pForm->GetStates() & FWL_WGTSTATE_Deactivated) != FWL_WGTSTATE_Deactivated; + } + } + FX_INT32 nSelCount = m_pEdtEngine->CountSelRanges(); + if (bShowSel && nSelCount > 0) { + FX_INT32 nPageCharStart = pPage->GetCharStart(); + FX_INT32 nPageCharCount = pPage->GetCharCount(); + FX_INT32 nPageCharEnd = nPageCharStart + nPageCharCount - 1; + FX_INT32 nCharCount; + FX_INT32 nCharStart; + CFX_RectFArray rectArr; + FX_INT32 i = 0; + for (i = 0; i < nSelCount; i ++) { + nCharCount = m_pEdtEngine->GetSelRange(i, nCharStart); + FX_INT32 nCharEnd = nCharStart + nCharCount - 1; + if (nCharEnd < nPageCharStart || nCharStart > nPageCharEnd) { + continue; + } + FX_INT32 nBgn = FX_MAX(nCharStart, nPageCharStart); + FX_INT32 nEnd = FX_MIN(nCharEnd, nPageCharEnd); + pPage->CalcRangeRectArray(nBgn - nPageCharStart, nEnd - nBgn + 1, rectArr); + } + FX_INT32 nCount = rectArr.GetSize(); + CFX_Path path; + path.Create(); + for (i = 0; i < nCount; i ++) { + rectArr[i].left += fOffSetX; + rectArr[i].top += fOffSetY; + path.AddRectangle(rectArr[i].left, + rectArr[i].top, + rectArr[i].width, + rectArr[i].height); + } + pGraphics->SetClipRect(rtClip); + CFWL_ThemeBackground param; + param.m_pGraphics = pGraphics; + param.m_matrix = *pMatrix; + param.m_pWidget = m_pInterface; + param.m_iPart = FWL_PART_EDT_Background; + param.m_pPath = &path; + pTheme->DrawBackground(¶m); + } + CFX_RenderDevice *pRenderDev = pGraphics->GetRenderDevice(); + _FWL_RETURN_IF_FAIL(pRenderDev); + IFDE_RenderDevice *pRenderDevice = IFDE_RenderDevice::Create(pRenderDev); + _FWL_RETURN_IF_FAIL(pRenderDevice); + IFDE_RenderContext *pRenderContext = IFDE_RenderContext::Create(); + _FWL_RETURN_IF_FAIL(pRenderContext); + pRenderDevice->SetClipRect(rtClip); + pRenderContext->StartRender(pRenderDevice, (IFDE_CanvasSet*)pPage, mt); + pRenderContext->DoRender(NULL); + pRenderContext->Release(); + pRenderDevice->Release(); + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_CombText) { + pGraphics->RestoreGraphState(); + CFX_Path path; + path.Create(); + FX_INT32 iLimit = m_nLimit > 0 ? m_nLimit : 1; + FX_FLOAT fStep = m_rtEngine.width / iLimit; + FX_FLOAT fLeft = m_rtEngine.left + 1; + for (FX_INT32 i = 1; i < iLimit; i++) { + fLeft += fStep; + path.AddLine(fLeft, m_rtClient.top, fLeft, m_rtClient.bottom()); + } + CFWL_ThemeBackground param; + param.m_pGraphics = pGraphics; + param.m_matrix = *pMatrix; + param.m_pWidget = m_pInterface; + param.m_iPart = FWL_PART_EDT_CombTextLine; + param.m_pPath = &path; + pTheme->DrawBackground(¶m); + } + pGraphics->RestoreGraphState(); +} +void CFWL_EditImp::UpdateEditEngine() +{ + UpdateEditParams(); + UpdateEditLayout(); + if (m_nLimit > -1) { + m_pEdtEngine->SetLimit(m_nLimit); + } +} +void CFWL_EditImp::UpdateEditParams() +{ + FDE_TXTEDTPARAMS params; + params.nHorzScale = 100; + params.fPlateWidth = m_rtEngine.width; + params.fPlateHeight = m_rtEngine.height; + if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_RTLLayout) { + params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_RTL; + } + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_VerticalLayout) { + params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_DocVertical; + } + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_VerticalChars) { + params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_CharVertial; + } + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReverseLine) { + params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_LineReserve; + } + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ArabicShapes) { + params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_ArabicShapes; + } + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ExpandTab) { + params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_ExpandTab; + } + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_CombText) { + params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_CombText; + } + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_LastLineHeight) { + params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_LastLineHeight; + } + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_Validate) { + params.dwMode |= FDE_TEXTEDITMODE_Validate; + } + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_Password) { + params.dwMode |= FDE_TEXTEDITMODE_Password; + } + switch (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_HAlignMask) { + case FWL_STYLEEXT_EDT_HNear: { + params.dwAlignment |= FDE_TEXTEDITALIGN_Left; + break; + } + case FWL_STYLEEXT_EDT_HCenter: { + params.dwAlignment |= FDE_TEXTEDITALIGN_Center; + break; + } + case FWL_STYLEEXT_EDT_HFar: { + params.dwAlignment |= FDE_TEXTEDITALIGN_Right; + break; + } + default: { + } + } + switch (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_HAlignModeMask) { + case FWL_STYLEEXT_EDT_Justified: { + params.dwAlignment |= FDE_TEXTEDITALIGN_Justified; + break; + } + case FWL_STYLEEXT_EDT_Distributed: { + params.dwAlignment |= FDE_TEXTEDITALIGN_Distributed; + break; + } + default: { + params.dwAlignment |= FDE_TEXTEDITALIGN_Normal; + } + } + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_MultiLine) { + params.dwMode |= FDE_TEXTEDITMODE_MultiLines; + if ((m_pProperties->m_dwStyles & FWL_WGTSTYLE_HScroll) == 0 && (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_AutoHScroll) == 0) { + params.dwMode |= FDE_TEXTEDITMODE_AutoLineWrap | FDE_TEXTEDITMODE_LimitArea_Horz; + } + if ((m_pProperties->m_dwStyles & FWL_WGTSTYLE_VScroll) == 0 && (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_AutoVScroll) == 0) { + params.dwMode |= FDE_TEXTEDITMODE_LimitArea_Vert; + } else { + params.fPlateHeight = 0x00FFFFFF; + } + } else { + if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_AutoHScroll) == 0) { + params.dwMode |= FDE_TEXTEDITMODE_LimitArea_Horz; + } + } + if ( (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReadOnly) + || (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)) { + params.dwMode |= FDE_TEXTEDITMODE_ReadOnly; + } + FX_FLOAT *pFontSize = (FX_FLOAT*)GetThemeCapacity(FWL_WGTCAPACITY_FontSize); + _FWL_RETURN_IF_FAIL(pFontSize); + m_fFontSize = *pFontSize; + FX_DWORD *pFontColor = (FX_DWORD*)GetThemeCapacity(FWL_WGTCAPACITY_TextColor); + _FWL_RETURN_IF_FAIL(pFontColor); + params.dwFontColor = *pFontColor; + FX_FLOAT *pLineHeight = (FX_FLOAT*)GetThemeCapacity(FWL_WGTCAPACITY_LineHeight); + _FWL_RETURN_IF_FAIL(pLineHeight); + params.fLineSpace = *pLineHeight; + IFX_Font *pFont = (IFX_Font*)GetThemeCapacity(FWL_WGTCAPACITY_Font); + _FWL_RETURN_IF_FAIL(pFont); + params.pFont = pFont; + params.fFontSize = m_fFontSize; + params.nLineCount = (FX_INT32)(params.fPlateHeight / params.fLineSpace); + if (params.nLineCount <= 0) { + params.nLineCount = 1; + } + params.fTabWidth = params.fFontSize * 1; + params.bTabEquidistant = TRUE; + params.wLineBreakChar = L'\n'; + params.nCharRotation = 0; + params.pEventSink = this; + m_pEdtEngine->SetEditParams(params); +} +void CFWL_EditImp::UpdateEditLayout() +{ + if (m_pEdtEngine->GetTextLength() <= 0) { + m_pEdtEngine->SetTextByStream(NULL); + } + IFDE_TxtEdtPage *pPage = m_pEdtEngine->GetPage(0); + if (pPage) { + pPage->UnloadPage(); + pPage = NULL; + } + m_pEdtEngine->StartLayout(); + m_pEdtEngine->DoLayout(NULL); + m_pEdtEngine->EndLayout(); + pPage = m_pEdtEngine->GetPage(0); + if (pPage) { + pPage->LoadPage(); + } +} +FX_BOOL CFWL_EditImp::UpdateOffset() +{ + CFX_RectF rtCaret; + m_pEdtEngine->GetCaretRect(rtCaret); + FX_FLOAT fOffSetX = m_rtEngine.left - m_fScrollOffsetX; + FX_FLOAT fOffSetY = m_rtEngine.top - m_fScrollOffsetY + m_fVAlignOffset; + rtCaret.Offset(fOffSetX, fOffSetY); + const CFX_RectF& rtEidt = m_rtEngine; + if (rtEidt.Contains(rtCaret)) { + IFDE_TxtEdtPage *pPage = m_pEdtEngine->GetPage(0); + _FWL_RETURN_VALUE_IF_FAIL(pPage, FALSE); + CFX_RectF rtFDE = pPage->GetContentsBox(); + rtFDE.Offset(fOffSetX, fOffSetY); + if (rtFDE.right() < rtEidt.right() && m_fScrollOffsetX > 0) { + m_fScrollOffsetX += rtFDE.right() - rtEidt.right(); + if (m_fScrollOffsetX < 0) { + m_fScrollOffsetX = 0; + } + } + if (rtFDE.bottom() < rtEidt.bottom() && m_fScrollOffsetY > 0) { + m_fScrollOffsetY += rtFDE.bottom() - rtEidt.bottom(); + if (m_fScrollOffsetY < 0) { + m_fScrollOffsetY = 0; + } + } + return FALSE; + } else { + FX_FLOAT offsetX = 0.0; + FX_FLOAT offsetY = 0.0; + if (rtCaret.left < rtEidt.left) { + offsetX = rtCaret.left - rtEidt.left; + } + if (rtCaret.right() > rtEidt.right()) { + offsetX = rtCaret.right() - rtEidt.right(); + } + if (rtCaret.top < rtEidt.top) { + offsetY = rtCaret.top - rtEidt.top; + } + if (rtCaret.bottom() > rtEidt.bottom()) { + offsetY = rtCaret.bottom() - rtEidt.bottom(); + } + if (!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_HSelfAdaption)) { + m_fScrollOffsetX += offsetX; + } + if (!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_VSelfAdaption)) { + m_fScrollOffsetY += offsetY; + } + if (m_fFontSize > m_rtEngine.height) { + m_fScrollOffsetY = 0; + } + return TRUE; + } +} +FX_BOOL CFWL_EditImp::UpdateOffset(IFWL_ScrollBar *pScrollBar, FX_FLOAT fPosChanged) +{ + if (pScrollBar == (IFWL_ScrollBar*)m_pHorzScrollBar) { + m_fScrollOffsetX += fPosChanged; + } else { + m_fScrollOffsetY += fPosChanged; + } + return TRUE; +} +void CFWL_EditImp::UpdateVAlignment() +{ + IFDE_TxtEdtPage *pPage = m_pEdtEngine->GetPage(0); + _FWL_RETURN_IF_FAIL(pPage); + const CFX_RectF& rtFDE = pPage->GetContentsBox(); + FX_FLOAT fOffsetY = 0.0f; + FX_FLOAT fSpaceAbove = 0.0f; + FX_FLOAT fSpaceBelow = 0.0f; + CFX_SizeF* pSpace = (CFX_SizeF*)GetThemeCapacity(FWL_WGTCAPACITY_SpaceAboveBelow); + if (pSpace) { + fSpaceAbove = pSpace->x; + fSpaceBelow = pSpace->y; + } + if (fSpaceAbove < 0.1f) { + fSpaceAbove = 0; + } + if (fSpaceBelow < 0.1f) { + fSpaceBelow = 0; + } + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_VCenter) { + fOffsetY = (m_rtEngine.height - rtFDE.height) / 2; + if (fOffsetY < (fSpaceAbove + fSpaceBelow) / 2 && fSpaceAbove < fSpaceBelow) { + return; + } + fOffsetY += (fSpaceAbove - fSpaceBelow) / 2; + } else if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_VFar) { + fOffsetY = (m_rtEngine.height - rtFDE.height); + fOffsetY -= fSpaceBelow; + } else { + fOffsetY += fSpaceAbove; + } + m_fVAlignOffset = fOffsetY; + if (m_fVAlignOffset < 0) { + m_fVAlignOffset = 0; + } +} +void CFWL_EditImp::UpdateCaret() +{ + CFX_RectF rtFDE; + m_pEdtEngine->GetCaretRect(rtFDE); + rtFDE.Offset(m_rtEngine.left - m_fScrollOffsetX, m_rtEngine.top - m_fScrollOffsetY + m_fVAlignOffset); + CFX_RectF rtCaret; + rtCaret.Set(rtFDE.left, rtFDE.top, rtFDE.width, rtFDE.height); + CFX_RectF temp = rtCaret; + CFX_RectF rtClient; + GetClientRect(rtClient); + rtCaret.Intersect(rtClient); + if (rtCaret.left > rtClient.right()) { + FX_FLOAT right = rtCaret.right(); + rtCaret.left = rtClient.right() - 1; + rtCaret.width = right - rtCaret.left; + } + FX_BOOL bIntersect = !rtCaret.IsEmpty(); + FX_BOOL bShow = TRUE; + FX_BOOL bShowWhole = FALSE; + if (!(m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) || !bIntersect) { + bShow = FALSE; + } + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_HSelfAdaption && temp.right() > m_rtEngine.right()) { + bShowWhole = TRUE; + } + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_VSelfAdaption && temp.bottom() > m_rtEngine.bottom()) { + bShowWhole = TRUE; + } else { + bShow = (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused && bIntersect); + } + if (bShowWhole) { + rtCaret = temp; + } + ShowCaret(bShow, &rtCaret); +} +IFWL_ScrollBar* CFWL_EditImp::UpdateScroll() +{ + FX_BOOL bShowHorz = m_pHorzScrollBar && ((m_pHorzScrollBar->GetStates() & FWL_WGTSTATE_Invisible) == 0); + FX_BOOL bShowVert = m_pVertScrollBar && ((m_pVertScrollBar->GetStates() & FWL_WGTSTATE_Invisible) == 0); + if (!bShowHorz && !bShowVert) { + return NULL; + } + IFDE_TxtEdtPage *pPage = m_pEdtEngine->GetPage(0); + _FWL_RETURN_VALUE_IF_FAIL(pPage, NULL); + const CFX_RectF &rtFDE = pPage->GetContentsBox(); + IFWL_ScrollBar *pRepaint = NULL; + if (bShowHorz) { + CFX_RectF rtScroll; + m_pHorzScrollBar->GetWidgetRect(rtScroll); + if (rtScroll.width < rtFDE.width) { + m_pHorzScrollBar->LockUpdate(); + FX_FLOAT fRange = rtFDE.width - rtScroll.width; + m_pHorzScrollBar->SetRange(0.0f, fRange); + FX_FLOAT fPos = m_fScrollOffsetX; + if (fPos < 0.0f) { + fPos = 0.0f; + } + if (fPos > fRange) { + fPos = fRange; + } + m_pHorzScrollBar->SetPos(fPos); + m_pHorzScrollBar->SetTrackPos(fPos); + m_pHorzScrollBar->SetPageSize(rtScroll.width); + m_pHorzScrollBar->SetStepSize(rtScroll.width / 10); + m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Disabled, FALSE); + m_pHorzScrollBar->UnlockUpdate(); + m_pHorzScrollBar->Update(); + pRepaint = (IFWL_ScrollBar*)m_pHorzScrollBar; + } else if ((m_pHorzScrollBar->GetStates() & FWL_WGTSTATE_Disabled) == 0) { + m_pHorzScrollBar->LockUpdate(); + m_pHorzScrollBar->SetRange(0, -1); + m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Disabled, TRUE); + m_pHorzScrollBar->UnlockUpdate(); + m_pHorzScrollBar->Update(); + pRepaint = (IFWL_ScrollBar*)m_pHorzScrollBar; + } + } + if (bShowVert) { + CFX_RectF rtScroll; + m_pVertScrollBar->GetWidgetRect(rtScroll); + if (rtScroll.height < rtFDE.height) { + m_pVertScrollBar->LockUpdate(); + FX_FLOAT fStep = m_pEdtEngine->GetEditParams()->fLineSpace; + FX_FLOAT fRange = rtFDE.height - m_rtEngine.height; + if (fRange < fStep) { + fRange = fStep; + } + m_pVertScrollBar->SetRange(0.0f, fRange); + FX_FLOAT fPos = m_fScrollOffsetY; + if (fPos < 0.0f) { + fPos = 0.0f; + } + if (fPos > fRange) { + fPos = fRange; + } + m_pVertScrollBar->SetPos(fPos); + m_pVertScrollBar->SetTrackPos(fPos); + m_pVertScrollBar->SetPageSize(rtScroll.height); + m_pVertScrollBar->SetStepSize(fStep); + m_pVertScrollBar->SetStates(FWL_WGTSTATE_Disabled, FALSE); + m_pVertScrollBar->UnlockUpdate(); + m_pVertScrollBar->Update(); + pRepaint = (IFWL_ScrollBar*)m_pVertScrollBar; + } else if ((m_pVertScrollBar->GetStates() & FWL_WGTSTATE_Disabled) == 0) { + m_pVertScrollBar->LockUpdate(); + m_pVertScrollBar->SetRange(0, -1); + m_pVertScrollBar->SetStates(FWL_WGTSTATE_Disabled, TRUE); + m_pVertScrollBar->UnlockUpdate(); + m_pVertScrollBar->Update(); + pRepaint = (IFWL_ScrollBar*)m_pVertScrollBar; + } + } + return pRepaint; +} +FX_BOOL CFWL_EditImp::IsShowScrollBar(FX_BOOL bVert) +{ + FX_BOOL bShow = (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ShowScrollbarFocus) ? (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == FWL_WGTSTATE_Focused : TRUE; + if (bVert) { + return bShow && (m_pProperties->m_dwStyles & FWL_WGTSTYLE_VScroll) && + (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_MultiLine) && IsContentHeightOverflow(); + } + return bShow && (m_pProperties->m_dwStyles & FWL_WGTSTYLE_HScroll) && (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_MultiLine); +} +FX_BOOL CFWL_EditImp::IsContentHeightOverflow() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pEdtEngine, FALSE); + IFDE_TxtEdtPage *pPage = m_pEdtEngine->GetPage(0); + _FWL_RETURN_VALUE_IF_FAIL(pPage, FALSE); + return pPage->GetContentsBox().height > m_rtEngine.height + 1.0f; +} +FX_INT32 CFWL_EditImp::AddDoRecord(FX_BSTR bsDoRecord) +{ + FX_INT32 nCount = m_RecordArr.GetSize(); + if (m_iCurRecord == nCount - 1) { + if (nCount == m_iMaxRecord) { + m_RecordArr.RemoveAt(0); + m_iCurRecord --; + } + } else { + for (FX_INT32 i = nCount - 1; i > m_iCurRecord; i --) { + m_RecordArr.RemoveAt(i); + } + } + m_RecordArr.Add(bsDoRecord); + return m_iCurRecord = m_RecordArr.GetSize() - 1; +} +void CFWL_EditImp::Layout() +{ + GetClientRect(m_rtClient); + m_rtEngine = m_rtClient; + FX_FLOAT *pfWidth = (FX_FLOAT*)GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth); + _FWL_RETURN_IF_FAIL(pfWidth); + FX_FLOAT fWidth = *pfWidth; + if (!m_pOuter) { + CFX_RectF* pUIMargin = (CFX_RectF*)GetThemeCapacity(FWL_WGTCAPACITY_UIMargin); + if (pUIMargin) { + m_rtEngine.Deflate(pUIMargin->left, pUIMargin->top, pUIMargin->width, pUIMargin->height); + } + } else if (m_pOuter->GetClassID() == FWL_CLASSHASH_DateTimePicker) { + CFWL_ThemePart part; + part.m_pWidget = m_pOuter; + CFX_RectF* pUIMargin = (CFX_RectF*)m_pOuter->GetThemeProvider()->GetCapacity(&part, FWL_WGTCAPACITY_UIMargin); + if (pUIMargin) { + m_rtEngine.Deflate(pUIMargin->left, pUIMargin->top, pUIMargin->width, pUIMargin->height); + } + } + FX_BOOL bShowVertScrollbar = IsShowScrollBar(TRUE); + FX_BOOL bShowHorzScrollbar = IsShowScrollBar(FALSE); + if (bShowVertScrollbar) { + InitScrollBar(); + CFX_RectF rtVertScr; + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_OuterScrollbar) { + rtVertScr.Set(m_rtClient.right() + FWL_EDIT_Margin, + m_rtClient.top, fWidth, m_rtClient.height); + } else { + rtVertScr.Set(m_rtClient.right() - fWidth, m_rtClient.top, fWidth, m_rtClient.height); + if (bShowHorzScrollbar) { + rtVertScr.height -= fWidth; + } + m_rtEngine.width -= fWidth; + } + m_pVertScrollBar->SetWidgetRect(rtVertScr); + m_pVertScrollBar->SetStates(FWL_WGTSTATE_Invisible, FALSE); + m_pVertScrollBar->Update(); + } else if (m_pVertScrollBar) { + m_pVertScrollBar->SetStates(FWL_WGTSTATE_Invisible, TRUE); + } + if (bShowHorzScrollbar) { + InitScrollBar(FALSE); + CFX_RectF rtHoriScr; + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_OuterScrollbar) { + rtHoriScr.Set(m_rtClient.left, m_rtClient.bottom() + FWL_EDIT_Margin, m_rtClient.width, fWidth); + } else { + rtHoriScr.Set(m_rtClient.left, m_rtClient.bottom() - fWidth, m_rtClient.width, fWidth); + if (bShowVertScrollbar) { + rtHoriScr.width -= fWidth; + } + m_rtEngine.height -= fWidth; + } + m_pHorzScrollBar->SetWidgetRect(rtHoriScr); + m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Invisible, FALSE); + m_pHorzScrollBar->Update(); + } else if (m_pHorzScrollBar) { + m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Invisible, TRUE); + } +} +void CFWL_EditImp::LayoutScrollBar() +{ + if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ShowScrollbarFocus) == 0) { + return; + } + FX_FLOAT* pfWidth = NULL; + FX_BOOL bShowVertScrollbar = IsShowScrollBar(TRUE); + FX_BOOL bShowHorzScrollbar = IsShowScrollBar(FALSE); + if (bShowVertScrollbar) { + if (!m_pVertScrollBar) { + pfWidth = (FX_FLOAT*)GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth); + FX_FLOAT fWidth = pfWidth ? *pfWidth : 0; + InitScrollBar(); + CFX_RectF rtVertScr; + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_OuterScrollbar) { + rtVertScr.Set(m_rtClient.right() + FWL_EDIT_Margin, + m_rtClient.top, fWidth, m_rtClient.height); + } else { + rtVertScr.Set(m_rtClient.right() - fWidth, m_rtClient.top, fWidth, m_rtClient.height); + if (bShowHorzScrollbar) { + rtVertScr.height -= fWidth; + } + } + m_pVertScrollBar->SetWidgetRect(rtVertScr); + m_pVertScrollBar->Update(); + } + m_pVertScrollBar->SetStates(FWL_WGTSTATE_Invisible, FALSE); + } else if (m_pVertScrollBar) { + m_pVertScrollBar->SetStates(FWL_WGTSTATE_Invisible, TRUE); + } + if (bShowHorzScrollbar) { + if (!m_pHorzScrollBar) { + pfWidth = !pfWidth ? (FX_FLOAT*)GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth) : pfWidth; + FX_FLOAT fWidth = pfWidth ? *pfWidth : 0; + InitScrollBar(FALSE); + CFX_RectF rtHoriScr; + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_OuterScrollbar) { + rtHoriScr.Set(m_rtClient.left, m_rtClient.bottom() + FWL_EDIT_Margin, m_rtClient.width, fWidth); + } else { + rtHoriScr.Set(m_rtClient.left, m_rtClient.bottom() - fWidth, m_rtClient.width, fWidth); + if (bShowVertScrollbar) { + rtHoriScr.width -= (fWidth); + } + } + m_pHorzScrollBar->SetWidgetRect(rtHoriScr); + m_pHorzScrollBar->Update(); + } + m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Invisible, FALSE); + } else if (m_pHorzScrollBar) { + m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Invisible, TRUE); + } + if (bShowVertScrollbar || bShowHorzScrollbar) { + UpdateScroll(); + } +} +void CFWL_EditImp::DeviceToEngine(CFX_PointF &pt) +{ + pt.x += -m_rtEngine.left + m_fScrollOffsetX; + pt.y += -m_rtEngine.top - m_fVAlignOffset + m_fScrollOffsetY; +} +void CFWL_EditImp::InitScrollBar(FX_BOOL bVert ) +{ + if ((bVert && m_pVertScrollBar) || (!bVert && m_pHorzScrollBar)) { + return; + } + CFWL_WidgetImpProperties prop; + prop.m_dwStyleExes = bVert ? FWL_STYLEEXT_SCB_Vert : FWL_STYLEEXT_SCB_Horz; + prop.m_dwStates = FWL_WGTSTATE_Disabled | FWL_WGTSTATE_Invisible; + prop.m_pParent = m_pInterface; + prop.m_pThemeProvider = m_pProperties->m_pThemeProvider; + IFWL_ScrollBar *pScrollBar = IFWL_ScrollBar::Create(); + pScrollBar->Initialize(prop, m_pInterface); + bVert ? (m_pVertScrollBar = pScrollBar) : (m_pHorzScrollBar = pScrollBar); +} +void CFWL_EditImp::InitEngine() +{ + if (m_pEdtEngine) { + return; + } + m_pEdtEngine = IFDE_TxtEdtEngine::Create(); +} +extern FX_BOOL FWL_ShowCaret(IFWL_Widget *pWidget, FX_BOOL bVisible, const CFX_RectF *pRtAnchor); +void CFWL_EditImp::ShowCaret(FX_BOOL bVisible, CFX_RectF *pRect ) +{ + if (m_pCaret) { + m_pCaret->ShowCaret(bVisible); + if (bVisible && !pRect->IsEmpty()) { + m_pCaret->SetWidgetRect(*pRect); + } + Repaint(&m_rtEngine); + } else { + IFWL_Widget *pOuter = (IFWL_Widget*)m_pInterface; + if (bVisible) { + pRect->Offset(m_pProperties->m_rtWidget.left, m_pProperties->m_rtWidget.top); + } + while (pOuter->GetOuter()) { + pOuter = pOuter->GetOuter(); + if (bVisible) { + CFX_RectF rtOuter; + pOuter->GetWidgetRect(rtOuter); + pRect->Offset(rtOuter.left, rtOuter.top); + } + } + FWL_ShowCaret(pOuter, bVisible, pRect); + } +} +FX_BOOL CFWL_EditImp::ValidateNumberChar(FX_WCHAR cNum) +{ + if (!m_pEdtEngine) { + return FALSE; + } + if (!m_bSetRange) { + return TRUE; + } + CFX_WideString wsOld, wsText; + m_pEdtEngine->GetText(wsText, 0); + if (wsText.IsEmpty()) { + if (cNum == L'0') { + return FALSE; + } + return TRUE; + } + FX_INT32 caretPos = m_pEdtEngine->GetCaretPos(); + FX_INT32 iSel = CountSelRanges(); + if (iSel == 0) { + if (cNum == L'0' && caretPos == 0) { + return FALSE; + } + FX_INT32 nLen = wsText.GetLength(); + CFX_WideString l = wsText.Mid(0, caretPos); + CFX_WideString r = wsText.Mid(caretPos, nLen - caretPos); + CFX_WideString wsNew = l + cNum + r; + if (wsNew.GetInteger() <= m_iMax) { + return TRUE; + } + } else { + if (wsText.GetInteger() <= m_iMax) { + return TRUE; + } + } + return FALSE; +} +void CFWL_EditImp::InitCaret() +{ + if (!m_pCaret) { + if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_InnerCaret)) { + m_pCaret = IFWL_Caret::Create(); + m_pCaret->Initialize(m_pInterface); + m_pCaret->SetParent(m_pInterface); + m_pCaret->SetStates(m_pProperties->m_dwStates); + } + } else if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_InnerCaret) == 0) { + m_pCaret->Release(); + m_pCaret = NULL; + } +} +void CFWL_EditImp::ClearRecord() +{ + m_iCurRecord = -1; + m_RecordArr.RemoveAll(); +} +void CFWL_EditImp::ProcessInsertError(FX_INT32 iError) +{ + switch (iError) { + case -2: { + CFWL_EvtEdtTextFull textFullEvent; + textFullEvent.m_pSrcTarget = m_pInterface; + DispatchEvent(&textFullEvent); + break; + } + default: { + } + } +} +CFWL_EditImpDelegate::CFWL_EditImpDelegate(CFWL_EditImp *pOwner) + : m_pOwner(pOwner) +{ +} +FX_INT32 CFWL_EditImpDelegate::OnProcessMessage(CFWL_Message *pMessage) +{ + _FWL_RETURN_VALUE_IF_FAIL(pMessage, 0); + FX_DWORD dwMsgCode = pMessage->GetClassID(); + FX_INT32 iRet = 1; + switch (dwMsgCode) { + case FWL_MSGHASH_Activate: { + DoActivate((CFWL_MsgActivate*)pMessage); + break; + } + case FWL_MSGHASH_Deactivate: { + DoDeactivate((CFWL_MsgDeactivate*)pMessage); + break; + } + case FWL_MSGHASH_SetFocus: + case FWL_MSGHASH_KillFocus: { + OnFocusChanged(pMessage, dwMsgCode == FWL_MSGHASH_SetFocus); + break; + } + case FWL_MSGHASH_Mouse: { + CFWL_MsgMouse *pMsg = (CFWL_MsgMouse*)pMessage; + FX_DWORD dwCmd = pMsg->m_dwCmd; + switch(dwCmd) { + case FWL_MSGMOUSECMD_LButtonDown: { + OnLButtonDown(pMsg); + break; + } + case FWL_MSGMOUSECMD_LButtonUp: { + OnLButtonUp(pMsg); + break; + } + case FWL_MSGMOUSECMD_LButtonDblClk: { + OnButtonDblClk(pMsg); + break; + } + case FWL_MSGMOUSECMD_MouseMove: { + OnMouseMove(pMsg); + break; + } + case FWL_MSGMOUSECMD_RButtonDown: { + DoButtonDown(pMsg); + break; + } + default: { + } + } + break; + } + case FWL_MSGHASH_Key: { + CFWL_MsgKey *pKey = (CFWL_MsgKey*)pMessage; + FX_DWORD dwCmd = pKey->m_dwCmd; + if (dwCmd == FWL_MSGKEYCMD_KeyDown) { + OnKeyDown(pKey); + } else if (dwCmd == FWL_MSGKEYCMD_Char) { + OnChar(pKey); + } + break; + } + default: { + iRet = 0; + } + } + CFWL_WidgetImpDelegate::OnProcessMessage(pMessage); + return iRet; +} +FWL_ERR CFWL_EditImpDelegate::OnProcessEvent(CFWL_Event *pEvent) +{ + _FWL_RETURN_VALUE_IF_FAIL(pEvent, FWL_ERR_Indefinite); + FX_DWORD dwHashCode = pEvent->GetClassID(); + if (dwHashCode != FWL_EVTHASH_Scroll) { + return FWL_ERR_Succeeded; + } + IFWL_Widget *pSrcTarget = pEvent->m_pSrcTarget; + if ((pSrcTarget == (IFWL_Widget*)m_pOwner->m_pVertScrollBar && m_pOwner->m_pVertScrollBar) || (pSrcTarget == (IFWL_Widget*)m_pOwner->m_pHorzScrollBar && m_pOwner->m_pHorzScrollBar)) { + FX_DWORD dwScrollCode = ((CFWL_EvtScroll*)pEvent)->m_iScrollCode; + FX_FLOAT fPos = ((CFWL_EvtScroll*)pEvent)->m_fPos; + OnScroll((IFWL_ScrollBar*)pSrcTarget, dwScrollCode, fPos); + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_EditImpDelegate::OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix) +{ + return m_pOwner->DrawWidget(pGraphics, pMatrix); +} +void CFWL_EditImpDelegate::DoActivate(CFWL_MsgActivate *pMsg) +{ + m_pOwner->m_pProperties->m_dwStates |= ~FWL_WGTSTATE_Deactivated; + m_pOwner->Repaint(&m_pOwner->m_rtClient); +} +void CFWL_EditImpDelegate::DoDeactivate(CFWL_MsgDeactivate *pMsg) +{ + m_pOwner->m_pProperties->m_dwStates &= FWL_WGTSTATE_Deactivated; + m_pOwner->Repaint(&m_pOwner->m_rtClient); +} +void CFWL_EditImpDelegate::DoButtonDown(CFWL_MsgMouse *pMsg) +{ + if ((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0) { + m_pOwner->SetFocus(TRUE); + } + if (!m_pOwner->m_pEdtEngine) { + m_pOwner->UpdateEditEngine(); + } + IFDE_TxtEdtPage *pPage = m_pOwner->m_pEdtEngine->GetPage(0); + _FWL_RETURN_IF_FAIL(pPage); + CFX_PointF pt; + pt.Set(pMsg->m_fx, pMsg->m_fy); + m_pOwner->DeviceToEngine(pt); + FX_BOOL bBefore = TRUE; + FX_INT32 nIndex = pPage->GetCharIndex(pt, bBefore); + if (nIndex < 0) { + nIndex = 0; + } + m_pOwner->m_pEdtEngine->SetCaretPos(nIndex, bBefore); +} +void CFWL_EditImpDelegate::OnFocusChanged(CFWL_Message *pMsg, FX_BOOL bSet) +{ + FX_DWORD dwStyleEx = m_pOwner->GetStylesEx(); + FX_BOOL bRepaint = dwStyleEx & FWL_STYLEEXT_EDT_InnerCaret; + if (bSet) { + m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused; + if (!m_pOwner->m_pEdtEngine) { + m_pOwner->UpdateEditEngine(); + } + m_pOwner->UpdateVAlignment(); + m_pOwner->UpdateOffset(); + m_pOwner->UpdateCaret(); + } else if (m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) { + m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused; + m_pOwner->ShowCaret(FALSE); + if (m_pOwner->m_pEdtEngine && (dwStyleEx & FWL_STYLEEXT_EDT_NoHideSel) == 0) { + FX_INT32 nSel = m_pOwner->CountSelRanges(); + if (nSel > 0) { + m_pOwner->ClearSelections(); + bRepaint = TRUE; + } + m_pOwner->SetCaretPos(0); + m_pOwner->UpdateOffset(); + } + m_pOwner->ClearRecord(); + } + m_pOwner->LayoutScrollBar(); + if (bRepaint) { + CFX_RectF rtInvalidate; + rtInvalidate.Set(0, + 0, + m_pOwner->m_pProperties->m_rtWidget.width, + m_pOwner->m_pProperties->m_rtWidget.height); + m_pOwner->Repaint(&rtInvalidate); + } +} +void CFWL_EditImpDelegate::OnLButtonDown(CFWL_MsgMouse *pMsg) +{ + DoCursor(pMsg); + if(m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) { + return; + } + m_pOwner->m_bLButtonDown = TRUE; + m_pOwner->SetGrab(TRUE); + DoButtonDown(pMsg); + FX_INT32 nIndex = m_pOwner->m_pEdtEngine->GetCaretPos(); + FX_BOOL bRepaint = FALSE; + FX_INT32 iCount = m_pOwner->m_pEdtEngine->CountSelRanges(); + if (iCount > 0) { + m_pOwner->m_pEdtEngine->ClearSelection(); + bRepaint = TRUE; + } + FX_BOOL bShift = pMsg->m_dwFlags & FWL_KEYFLAG_Shift; + if (bShift && m_pOwner->m_nSelStart != nIndex) { + FX_INT32 iStart = FX_MIN(m_pOwner->m_nSelStart, nIndex); + FX_INT32 iEnd = FX_MAX(m_pOwner->m_nSelStart, nIndex); + m_pOwner->m_pEdtEngine->AddSelRange(iStart, iEnd - iStart); + bRepaint = TRUE; + } else { + m_pOwner->m_nSelStart = nIndex; + } + if (bRepaint) { + m_pOwner->Repaint(&m_pOwner->m_rtEngine); + } +} +void CFWL_EditImpDelegate::OnLButtonUp(CFWL_MsgMouse *pMsg) +{ + DoCursor(pMsg); + m_pOwner->m_bLButtonDown = FALSE; + m_pOwner->SetGrab(FALSE); +} +void CFWL_EditImpDelegate::OnButtonDblClk(CFWL_MsgMouse *pMsg) +{ + _FWL_RETURN_IF_FAIL(m_pOwner->m_pEdtEngine); + DoCursor(pMsg); + IFDE_TxtEdtPage *pPage = m_pOwner->m_pEdtEngine->GetPage(0); + _FWL_RETURN_IF_FAIL(pPage); + CFX_PointF pt; + pt.Set(pMsg->m_fx, pMsg->m_fy); + m_pOwner->DeviceToEngine(pt); + FX_INT32 nCount = 0; + FX_INT32 nIndex = pPage->SelectWord(pt, nCount); + if (nIndex < 0) { + return; + } + m_pOwner->m_pEdtEngine->AddSelRange(nIndex, nCount); + m_pOwner->m_pEdtEngine->SetCaretPos(nIndex + nCount - 1, FALSE); + m_pOwner->Repaint(&m_pOwner->m_rtEngine); +} +void CFWL_EditImpDelegate::OnMouseMove(CFWL_MsgMouse *pMsg) +{ + _FWL_RETURN_IF_FAIL(m_pOwner->m_pEdtEngine); + DoCursor(pMsg); + if (m_pOwner->m_nSelStart == -1 || !m_pOwner->m_bLButtonDown) { + return; + } + IFDE_TxtEdtPage *pPage = m_pOwner->m_pEdtEngine->GetPage(0); + _FWL_RETURN_IF_FAIL(pPage); + CFX_PointF pt; + pt.Set(pMsg->m_fx, pMsg->m_fy); + m_pOwner->DeviceToEngine(pt); + FX_BOOL bBefore = TRUE; + FX_INT32 nIndex = pPage->GetCharIndex(pt, bBefore); + m_pOwner->m_pEdtEngine->SetCaretPos(nIndex, bBefore); + nIndex = m_pOwner->m_pEdtEngine->GetCaretPos(); + m_pOwner->m_pEdtEngine->ClearSelection(); + if (nIndex != m_pOwner->m_nSelStart) { + FX_INT32 nLen = m_pOwner->m_pEdtEngine->GetTextLength(); + if (m_pOwner->m_nSelStart >= nLen) { + m_pOwner->m_nSelStart = nLen; + } + m_pOwner->m_pEdtEngine->AddSelRange(FX_MIN(m_pOwner->m_nSelStart, nIndex), FXSYS_abs(nIndex - m_pOwner->m_nSelStart)); + } +} +void CFWL_EditImpDelegate::OnKeyDown(CFWL_MsgKey *pMsg) +{ + _FWL_RETURN_IF_FAIL(m_pOwner->m_pEdtEngine); + FDE_TXTEDTMOVECARET MoveCaret = MC_MoveNone; + FX_BOOL bShift = pMsg->m_dwFlags & FWL_KEYFLAG_Shift; + FX_BOOL bCtrl = pMsg->m_dwFlags & FWL_KEYFLAG_Ctrl; + FX_DWORD dwKeyCode = pMsg->m_dwKeyCode; + switch (dwKeyCode) { + case FWL_VKEY_Left: { + MoveCaret = MC_Left; + break; + } + case FWL_VKEY_Right: { + MoveCaret = MC_Right; + break; + } + case FWL_VKEY_Up: { + MoveCaret = MC_Up; + break; + } + case FWL_VKEY_Down: { + MoveCaret = MC_Down; + break; + } + case FWL_VKEY_Home: { + if (bCtrl) { + MoveCaret = MC_Home; + } else { + MoveCaret = MC_LineStart; + } + break; + } + case FWL_VKEY_End: { + if (bCtrl) { + MoveCaret = MC_End; + } else { + MoveCaret = MC_LineEnd; + } + break; + } + case FWL_VKEY_Insert: { + break; + } + case FWL_VKEY_Delete: { + if ( (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReadOnly) + || (m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)) { + break; + } + FX_INT32 nCaret = m_pOwner->m_pEdtEngine->GetCaretPos(); +#if (_FX_OS_==_FX_MACOSX_) + m_pOwner->m_pEdtEngine->Delete(nCaret, TRUE); +#else + m_pOwner->m_pEdtEngine->Delete(nCaret); +#endif + break; + } + case FWL_VKEY_F2: { + break; + } + case FWL_VKEY_Tab: { + m_pOwner->DispatchKeyEvent(pMsg); + break; + } + default: { +#if (_FX_OS_==_FX_MACOSX_) + if (pMsg->m_dwFlags & FWL_KEYFLAG_Command) +#else + if (pMsg->m_dwFlags & FWL_KEYFLAG_Ctrl) +#endif + { + if (dwKeyCode == 0x43 || dwKeyCode == 0x63) { + m_pOwner->DoClipboard(1); + return; + } + if (dwKeyCode == 0x58 || dwKeyCode == 0x78) { + m_pOwner->DoClipboard(2); + return; + } + if (dwKeyCode == 0x56 || dwKeyCode == 0x76) { + m_pOwner->DoClipboard(3); + return; + } + } + } + } + if (MoveCaret != MC_MoveNone) { + m_pOwner->m_pEdtEngine->MoveCaretPos(MoveCaret, bShift, bCtrl); + } +} +void CFWL_EditImpDelegate::OnChar(CFWL_MsgKey *pMsg) +{ + if ( (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReadOnly) + || ( m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)) { + return; + } + _FWL_RETURN_IF_FAIL(m_pOwner->m_pEdtEngine); + FX_INT32 iError = 0; + FX_WCHAR c = (FX_WCHAR)pMsg->m_dwKeyCode; + FX_INT32 nCaret = m_pOwner->m_pEdtEngine->GetCaretPos(); + switch (c) { + case FWL_VKEY_Back: { + m_pOwner->m_pEdtEngine->Delete(nCaret, TRUE); + break; + } + case 0x0A: { + break; + } + case FWL_VKEY_Escape: { + break; + } + case FWL_VKEY_Tab: { + iError = m_pOwner->m_pEdtEngine->Insert(nCaret, FX_LPCWSTR(L"\t"), 1); + break; + } + case FWL_VKEY_Return: { + if (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_WantReturn) { + iError = m_pOwner->m_pEdtEngine->Insert(nCaret, FX_LPCWSTR(L"\n"), 1); + } + break; + } + default: { + if (!m_pOwner->m_pWidgetMgr->IsFormDisabled()) { + if (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_Number) { + if (((pMsg->m_dwKeyCode < FWL_VKEY_0) && (pMsg->m_dwKeyCode != 0x2E && pMsg->m_dwKeyCode != 0x2D)) || pMsg->m_dwKeyCode > FWL_VKEY_9) { + break; + } + if (!m_pOwner->ValidateNumberChar(c)) { + break; + } + } + } +#if (_FX_OS_==_FX_MACOSX_) + if (pMsg->m_dwFlags & FWL_KEYFLAG_Command) +#else + if (pMsg->m_dwFlags & FWL_KEYFLAG_Ctrl) +#endif + { + break; + } + iError = m_pOwner->m_pEdtEngine->Insert(nCaret, &c, 1); + break; + } + } + if (iError < 0) { + m_pOwner->ProcessInsertError(iError); + } +} +FX_BOOL CFWL_EditImpDelegate::OnScroll(IFWL_ScrollBar *pScrollBar, FX_DWORD dwCode, FX_FLOAT fPos) +{ + CFX_SizeF fs; + pScrollBar->GetRange(fs.x, fs.y); + FX_FLOAT iCurPos = pScrollBar->GetPos(); + FX_FLOAT fStep = pScrollBar->GetStepSize(); + switch (dwCode) { + case FWL_SCBCODE_Min: { + fPos = fs.x; + break; + } + case FWL_SCBCODE_Max: { + fPos = fs.y; + break; + } + case FWL_SCBCODE_StepBackward: { + fPos -= fStep; + if (fPos < fs.x + fStep / 2) { + fPos = fs.x; + } + break; + } + case FWL_SCBCODE_StepForward: { + fPos += fStep; + if (fPos > fs.y - fStep / 2) { + fPos = fs.y; + } + break; + } + case FWL_SCBCODE_PageBackward: { + fPos -= pScrollBar->GetPageSize(); + if (fPos < fs.x) { + fPos = fs.x; + } + break; + } + case FWL_SCBCODE_PageForward: { + fPos += pScrollBar->GetPageSize(); + if (fPos > fs.y) { + fPos = fs.y; + } + break; + } + case FWL_SCBCODE_Pos: + case FWL_SCBCODE_TrackPos: { + break; + } + case FWL_SCBCODE_EndScroll: { + return FALSE; + } + default: { + } + } + if (iCurPos != fPos) { + pScrollBar->SetPos(fPos); + pScrollBar->SetTrackPos(fPos); + m_pOwner->UpdateOffset(pScrollBar, fPos - iCurPos); + if (m_pOwner->m_pEdtEngine) { + m_pOwner->UpdateCaret(); + } + CFX_RectF rect; + m_pOwner->GetWidgetRect(rect); + CFX_RectF rtInvalidate; + rtInvalidate.Set(0, 0, rect.width + 2, rect.height + 2); + m_pOwner->Repaint(&rtInvalidate); + } + return TRUE; +} +void CFWL_EditImpDelegate::DoCursor(CFWL_MsgMouse *pMsg) +{ + if (m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) { + IFWL_AdapterNative *pNative = FWL_GetAdapterNative(); + IFWL_AdapterCursorMgr *pCursorMgr = pNative->GetCursorMgr(); + if (NULL != pCursorMgr) { + FWL_HCURSOR hCursor = pCursorMgr->GetSystemCursor(FWL_CURSORTYPE_InputBeam); + pCursorMgr->SetCursor(hCursor); + pCursorMgr->ShowCursor(TRUE); + } + } +} diff --git a/xfa/src/fwl/src/basewidget/fwl_formproxyimp.cpp b/xfa/src/fwl/src/basewidget/fwl_formproxyimp.cpp new file mode 100644 index 0000000000..ced1fbe6f9 --- /dev/null +++ b/xfa/src/fwl/src/basewidget/fwl_formproxyimp.cpp @@ -0,0 +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 + +#include "../../../foxitlib.h" +#include "../core/include/fwl_targetimp.h" +#include "../core/include/fwl_noteimp.h" +#include "../core/include/fwl_widgetimp.h" +#include "../core/include/fwl_panelimp.h" +#include "../core/include/fwl_formimp.h" +#include "include/fwl_formproxyimp.h" +CFWL_FormProxyImp::CFWL_FormProxyImp(IFWL_Widget *pOuter ) + : CFWL_FormImp(pOuter) +{ +} +CFWL_FormProxyImp::CFWL_FormProxyImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter ) + : CFWL_FormImp(properties, pOuter) +{ +} +CFWL_FormProxyImp::~CFWL_FormProxyImp() +{ +} +FWL_ERR CFWL_FormProxyImp::GetClassName(CFX_WideString &wsClass) const +{ + wsClass = FWL_CLASS_FormProxy; + return FWL_ERR_Succeeded; +} +FX_DWORD CFWL_FormProxyImp::GetClassID() const +{ + return FWL_CLASSHASH_FormProxy; +} +FX_BOOL CFWL_FormProxyImp::IsInstance(FX_WSTR wsClass) const +{ + if (wsClass == CFX_WideStringC(FWL_CLASS_FormProxy)) { + return TRUE; + } + return CFWL_FormImp::IsInstance(wsClass); +} +FWL_ERR CFWL_FormProxyImp::Initialize() +{ + _FWL_ERR_CHECK_RETURN_VALUE_IF_FAIL(CFWL_WidgetImp::Initialize(), FWL_ERR_Indefinite); + m_pDelegate = (IFWL_WidgetDelegate *)FX_NEW CFWL_FormProxyImpDelegate(this); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_FormProxyImp::Finalize() +{ + if ( m_pDelegate) { + delete (CFWL_FormProxyImpDelegate*)m_pDelegate; + m_pDelegate = NULL; + } + return CFWL_WidgetImp::Finalize(); +} +FWL_ERR CFWL_FormProxyImp::Update() +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_FormProxyImp::DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + return FWL_ERR_Succeeded; +} +CFWL_FormProxyImpDelegate::CFWL_FormProxyImpDelegate(CFWL_FormProxyImp *pOwner) + : m_pOwner(pOwner) +{ +} +FX_INT32 CFWL_FormProxyImpDelegate::OnProcessMessage(CFWL_Message *pMessage) +{ + IFWL_WidgetDelegate *pDelegate = m_pOwner->m_pOuter->SetDelegate(NULL); + return pDelegate->OnProcessMessage(pMessage); +} diff --git a/xfa/src/fwl/src/basewidget/fwl_listboximp.cpp b/xfa/src/fwl/src/basewidget/fwl_listboximp.cpp new file mode 100644 index 0000000000..bafb964ee6 --- /dev/null +++ b/xfa/src/fwl/src/basewidget/fwl_listboximp.cpp @@ -0,0 +1,1255 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../core/include/fwl_targetimp.h" +#include "../core/include/fwl_noteimp.h" +#include "../core/include/fwl_widgetimp.h" +#include "include/fwl_scrollbarimp.h" +#include "include/fwl_listboximp.h" +#define FWL_LISTBOX_ItemTextMargin 2 +IFWL_ListBox* IFWL_ListBox::Create() +{ + return new IFWL_ListBox; +} +IFWL_ListBox::IFWL_ListBox() +{ + m_pData = NULL; +} +IFWL_ListBox::~IFWL_ListBox() +{ + if (m_pData) { + delete (CFWL_ListBoxImp*)m_pData; + m_pData = NULL; + } +} +FWL_ERR IFWL_ListBox::Initialize(IFWL_Widget *pOuter) +{ + m_pData = FX_NEW CFWL_ListBoxImp(pOuter); + ((CFWL_ListBoxImp*)m_pData)->SetInterface(this); + return ((CFWL_ListBoxImp*)m_pData)->Initialize(); +} +FWL_ERR IFWL_ListBox::Initialize(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter) +{ + m_pData = FX_NEW CFWL_ListBoxImp(properties, pOuter); + ((CFWL_ListBoxImp*)m_pData)->SetInterface(this); + return ((CFWL_ListBoxImp*)m_pData)->Initialize(); +} +FX_INT32 IFWL_ListBox::CountSelItems() +{ + return ((CFWL_ListBoxImp*)m_pData)->CountSelItems(); +} +FWL_HLISTITEM IFWL_ListBox::GetSelItem(FX_INT32 nIndexSel) +{ + return ((CFWL_ListBoxImp*)m_pData)->GetSelItem(nIndexSel); +} +FX_INT32 IFWL_ListBox::GetSelIndex(FX_INT32 nIndex) +{ + return ((CFWL_ListBoxImp*)m_pData)->GetSelIndex(nIndex); +} +FWL_ERR IFWL_ListBox::SetSelItem(FWL_HLISTITEM hItem, FX_BOOL bSelect) +{ + return ((CFWL_ListBoxImp*)m_pData)->SetSelItem(hItem, bSelect); +} +FWL_ERR IFWL_ListBox::GetItemText(FWL_HLISTITEM hItem, CFX_WideString &wsText) +{ + return ((CFWL_ListBoxImp*)m_pData)->GetItemText(hItem, wsText); +} +FWL_ERR IFWL_ListBox::GetScrollPos(FX_FLOAT &fPos, FX_BOOL bVert) +{ + return ((CFWL_ListBoxImp*)m_pData)->GetScrollPos(fPos, bVert); +} +FWL_ERR* IFWL_ListBox::Sort(IFWL_ListBoxCompare *pCom) +{ + return ((CFWL_ListBoxImp*)m_pData)->Sort(pCom); +} +CFWL_ListBoxImp::CFWL_ListBoxImp(IFWL_Widget *pOuter ) + : CFWL_WidgetImp(pOuter) + , m_pHorzScrollBar(NULL) + , m_pVertScrollBar(NULL) + , m_dwTTOStyles(0) + , m_iTTOAligns(0) + , m_hAnchor(NULL) + , m_fScorllBarWidth(0) + , m_bLButtonDown(FALSE) + , m_pScrollBarTP(NULL) +{ + m_rtClient.Reset(); + m_rtConent.Reset(); + m_rtStatic.Reset(); +} +CFWL_ListBoxImp::CFWL_ListBoxImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter ) + : CFWL_WidgetImp(properties, pOuter) + , m_pHorzScrollBar(NULL) + , m_pVertScrollBar(NULL) + , m_dwTTOStyles(0) + , m_iTTOAligns(0) + , m_hAnchor(NULL) + , m_fScorllBarWidth(0) + , m_bLButtonDown(FALSE) + , m_pScrollBarTP(NULL) +{ + m_rtClient.Reset(); + m_rtConent.Reset(); + m_rtStatic.Reset(); +} +CFWL_ListBoxImp::~CFWL_ListBoxImp() +{ + if (m_pVertScrollBar) { + m_pVertScrollBar->Release(); + m_pVertScrollBar = NULL; + } + if (m_pHorzScrollBar) { + m_pHorzScrollBar->Release(); + m_pHorzScrollBar = NULL; + } +} +FWL_ERR CFWL_ListBoxImp::GetClassName(CFX_WideString &wsClass) const +{ + wsClass = FWL_CLASS_ListBox; + return FWL_ERR_Succeeded; +} +FX_DWORD CFWL_ListBoxImp::GetClassID() const +{ + return FWL_CLASSHASH_ListBox; +} +FWL_ERR CFWL_ListBoxImp::Initialize() +{ + _FWL_ERR_CHECK_RETURN_VALUE_IF_FAIL(CFWL_WidgetImp::Initialize(), FWL_ERR_Indefinite); + m_pDelegate = (IFWL_WidgetDelegate*)FX_NEW CFWL_ListBoxImpDelegate(this); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ListBoxImp::Finalize() +{ + if (m_pVertScrollBar) { + m_pVertScrollBar->Finalize(); + } + if (m_pHorzScrollBar) { + m_pHorzScrollBar->Finalize(); + } + if (m_pDelegate) { + delete (CFWL_ListBoxImpDelegate*)m_pDelegate; + m_pDelegate = NULL; + } + return CFWL_WidgetImp::Finalize(); +} +FWL_ERR CFWL_ListBoxImp::GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize ) +{ + if (bAutoSize) { + rect.Set(0, 0, 0, 0); + if (!m_pProperties->m_pThemeProvider) { + m_pProperties->m_pThemeProvider = GetAvailableTheme(); + } + CFX_SizeF fs = CalcSize(TRUE); + rect.Set(0, 0, fs.x, fs.y); + CFWL_WidgetImp::GetWidgetRect(rect, TRUE); + } else { + rect = m_pProperties->m_rtWidget; + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ListBoxImp::Update() +{ + if (IsLocked()) { + return FWL_ERR_Indefinite; + } + if (!m_pProperties->m_pThemeProvider) { + m_pProperties->m_pThemeProvider = GetAvailableTheme(); + } + m_iTTOAligns = FDE_TTOALIGNMENT_Center; + switch(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_AlignMask) { + case FWL_STYLEEXT_LTB_LeftAlign: { + m_iTTOAligns = FDE_TTOALIGNMENT_CenterLeft; + break; + } + case FWL_STYLEEXT_LTB_RightAlign: { + m_iTTOAligns = FDE_TTOALIGNMENT_CenterRight; + break; + } + case FWL_STYLEEXT_LTB_CenterAlign: + default: { + m_iTTOAligns = FDE_TTOALIGNMENT_Center; + } + } + if (m_pProperties->m_dwStyleExes & FWL_WGTSTYLE_RTLReading) { + m_dwTTOStyles |= FDE_TTOSTYLE_RTL; + } + m_dwTTOStyles |= FDE_TTOSTYLE_SingleLine; + m_fScorllBarWidth = GetScrollWidth(); + SortItem(); + CalcSize(); + return FWL_ERR_Succeeded; +} +FX_DWORD CFWL_ListBoxImp::HitTest(FX_FLOAT fx, FX_FLOAT fy) +{ + if (IsShowScrollBar(FALSE)) { + CFX_RectF rect; + m_pHorzScrollBar->GetWidgetRect(rect); + if (rect.Contains(fx, fy)) { + return FWL_WGTHITTEST_HScrollBar; + } + } + if (IsShowScrollBar(TRUE)) { + CFX_RectF rect; + m_pVertScrollBar->GetWidgetRect(rect); + if (rect.Contains(fx, fy)) { + return FWL_WGTHITTEST_VScrollBar; + } + } + if (m_rtClient.Contains(fx, fy)) { + return FWL_WGTHITTEST_Client; + } + return FWL_WGTHITTEST_Unknown; +} +FWL_ERR CFWL_ListBoxImp::DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + _FWL_RETURN_VALUE_IF_FAIL(pGraphics, FWL_ERR_Indefinite); + _FWL_RETURN_VALUE_IF_FAIL(m_pProperties->m_pThemeProvider, FWL_ERR_Indefinite); + IFWL_ThemeProvider *pTheme = m_pProperties->m_pThemeProvider; + pGraphics->SaveGraphState(); + if (HasBorder()) { + DrawBorder(pGraphics, FWL_PART_LTB_Border, pTheme, pMatrix); + } + if (HasEdge()) { + DrawEdge(pGraphics, FWL_PART_LTB_Edge, pTheme, pMatrix); + } + CFX_RectF rtClip(m_rtConent); + if (IsShowScrollBar(FALSE)) { + rtClip.height -= m_fScorllBarWidth; + } + if (IsShowScrollBar(TRUE)) { + rtClip.width -= m_fScorllBarWidth; + } + if (pMatrix) { + pMatrix->TransformRect(rtClip); + } + pGraphics->SetClipRect(rtClip); + if ((m_pProperties->m_dwStyles & FWL_WGTSTYLE_NoBackground) == 0) { + DrawBkground(pGraphics, pTheme, pMatrix); + } + DrawItems(pGraphics, pTheme, pMatrix); + pGraphics->RestoreGraphState(); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ListBoxImp::SetThemeProvider(IFWL_ThemeProvider *pThemeProvider) +{ + _FWL_RETURN_VALUE_IF_FAIL(pThemeProvider, FWL_ERR_Indefinite); + if (!pThemeProvider->IsValidWidget(m_pInterface)) { + m_pScrollBarTP = pThemeProvider; + return FWL_ERR_Succeeded; + } + m_pProperties->m_pThemeProvider = pThemeProvider; + return FWL_ERR_Succeeded; +} +FX_INT32 CFWL_ListBoxImp::CountSelItems() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pProperties->m_pDataProvider, 0); + FX_INT32 iRet = 0; + IFWL_ListBoxDP *pData = (IFWL_ListBoxDP*)m_pProperties->m_pDataProvider; + FX_INT32 iCount = pData->CountItems(m_pInterface); + for (FX_INT32 i = 0; i < iCount; i ++) { + FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i); + if (!hItem) { + continue; + } + FX_DWORD dwStyle = pData->GetItemStyles(m_pInterface, hItem); + if (dwStyle & FWL_ITEMSTATE_LTB_Selected) { + iRet ++; + } + } + return iRet; +} +FWL_HLISTITEM CFWL_ListBoxImp::GetSelItem(FX_INT32 nIndexSel) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pProperties->m_pDataProvider, NULL); + FX_INT32 index = 0; + IFWL_ListBoxDP *pData = (IFWL_ListBoxDP*)m_pProperties->m_pDataProvider; + FX_INT32 iCount = pData->CountItems(m_pInterface); + for (FX_INT32 i = 0; i < iCount; i ++) { + FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i); + if (!hItem) { + return NULL; + } + FX_DWORD dwStyle = pData->GetItemStyles(m_pInterface, hItem); + if (dwStyle & FWL_ITEMSTATE_LTB_Selected) { + if (index == nIndexSel) { + return hItem; + } else { + index ++; + } + } + } + return NULL; +} +FX_INT32 CFWL_ListBoxImp::GetSelIndex(FX_INT32 nIndex) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pProperties->m_pDataProvider, -1); + FX_INT32 index = 0; + IFWL_ListBoxDP *pData = (IFWL_ListBoxDP*)m_pProperties->m_pDataProvider; + FX_INT32 iCount = pData->CountItems(m_pInterface); + for (FX_INT32 i = 0; i < iCount; i ++) { + FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i); + if (!hItem) { + return -1; + } + FX_DWORD dwStyle = pData->GetItemStyles(m_pInterface, hItem); + if (dwStyle & FWL_ITEMSTATE_LTB_Selected) { + if (index == nIndex) { + return i; + } else { + index ++; + } + } + } + return -1; +} +FWL_ERR CFWL_ListBoxImp::SetSelItem(FWL_HLISTITEM hItem, FX_BOOL bSelect ) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pProperties->m_pDataProvider, FWL_ERR_Indefinite); + if (!hItem) { + if (bSelect) { + SelectAll(); + } else { + ClearSelection(); + SetFocusItem(NULL); + } + return FWL_ERR_Indefinite; + } + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiSelection) { + SetSelectionDirect(hItem, bSelect); + } else { + SetSelection(hItem, hItem, bSelect); + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ListBoxImp::GetItemText(FWL_HLISTITEM hItem, CFX_WideString &wsText) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pProperties->m_pDataProvider, FWL_ERR_Indefinite); + IFWL_ListBoxDP *pData = (IFWL_ListBoxDP*)m_pProperties->m_pDataProvider; + _FWL_RETURN_VALUE_IF_FAIL(hItem, FWL_ERR_Indefinite); + pData->GetItemText(m_pInterface, hItem, wsText); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ListBoxImp::GetScrollPos(FX_FLOAT &fPos, FX_BOOL bVert ) +{ + if ((bVert && IsShowScrollBar(TRUE)) || (!bVert && IsShowScrollBar(FALSE))) { + IFWL_ScrollBar *pScrollBar = bVert ? m_pVertScrollBar : m_pHorzScrollBar; + fPos = pScrollBar->GetPos(); + return FWL_ERR_Succeeded; + } + return FWL_ERR_Indefinite; +} +FWL_ERR* CFWL_ListBoxImp::Sort(IFWL_ListBoxCompare *pCom) +{ + FWL_HLISTITEM hTemp; + IFWL_ListBoxDP *pData = (IFWL_ListBoxDP*)m_pProperties->m_pDataProvider; + FX_INT32 sz = pData->CountItems(m_pInterface); + for (FX_INT32 i = 0; i < sz - 1; i++) { + for (FX_INT32 j = i + 1; j < sz; j++) { + if (pCom->Compare(pData->GetItem(m_pInterface, i), pData->GetItem(m_pInterface, j)) > 0) { + hTemp = pData->GetItem(m_pInterface, i); + pData->SetItemIndex(m_pInterface, pData->GetItem(m_pInterface, j), i); + pData->SetItemIndex(m_pInterface, hTemp, j); + } + } + } + return FWL_ERR_Succeeded; +} +FWL_HLISTITEM CFWL_ListBoxImp::GetItem(FWL_HLISTITEM hItem, FX_DWORD dwKeyCode) +{ + FWL_HLISTITEM hRet = NULL; + switch(dwKeyCode) { + case FWL_VKEY_Up: + case FWL_VKEY_Down: + case FWL_VKEY_Home: + case FWL_VKEY_End: { + FX_BOOL bUp = dwKeyCode == FWL_VKEY_Up; + FX_BOOL bDown = dwKeyCode == FWL_VKEY_Down; + FX_BOOL bHome = dwKeyCode == FWL_VKEY_Home; + FX_BOOL bEnd = dwKeyCode == FWL_VKEY_End; + IFWL_ListBoxDP *pData = (IFWL_ListBoxDP*)m_pProperties->m_pDataProvider; + FX_INT32 iDstItem = -1; + if (bUp || bDown) { + FX_INT32 index = pData->GetItemIndex(m_pInterface, hItem); + iDstItem = dwKeyCode == FWL_VKEY_Up ? index - 1 : index + 1; + } else if (bHome) { + iDstItem = 0; + } else { + FX_INT32 iCount = pData->CountItems(m_pInterface); + iDstItem = iCount - 1; + } + hRet = pData->GetItem(m_pInterface, iDstItem); + break; + } + default: { + } + } + return hRet; +} +void CFWL_ListBoxImp::SetSelection(FWL_HLISTITEM hStart, FWL_HLISTITEM hEnd, FX_BOOL bSelected) +{ + IFWL_ListBoxDP *pData = (IFWL_ListBoxDP*)m_pProperties->m_pDataProvider; + FX_INT32 iStart = pData->GetItemIndex(m_pInterface, hStart); + FX_INT32 iEnd = pData->GetItemIndex(m_pInterface, hEnd); + if (iStart > iEnd) { + FX_INT32 iTemp = iStart; + iStart = iEnd; + iEnd = iTemp; + } + if (bSelected) { + FX_INT32 iCount = pData->CountItems(m_pInterface); + for (FX_INT32 i = 0; i < iCount; i++ ) { + FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i); + SetSelectionDirect(hItem, FALSE); + } + } + for (; iStart <= iEnd; iStart++) { + FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, iStart); + SetSelectionDirect(hItem, bSelected); + } +} +void CFWL_ListBoxImp::SetSelectionDirect(FWL_HLISTITEM hItem, FX_BOOL bSelect) +{ + IFWL_ListBoxDP *pData = (IFWL_ListBoxDP*)m_pProperties->m_pDataProvider; + FX_DWORD dwOldStyle = pData->GetItemStyles(m_pInterface, hItem); + bSelect ? dwOldStyle |= FWL_ITEMSTATE_LTB_Selected + : dwOldStyle &= ~FWL_ITEMSTATE_LTB_Selected; + pData->SetItemStyles(m_pInterface, hItem, dwOldStyle); +} +FX_BOOL CFWL_ListBoxImp::IsItemSelected(FWL_HLISTITEM hItem) +{ + IFWL_ListBoxDP *pData = (IFWL_ListBoxDP*)m_pProperties->m_pDataProvider; + FX_DWORD dwState = pData->GetItemStyles(m_pInterface, hItem); + return (dwState & FWL_ITEMSTATE_LTB_Selected) != 0; +} +void CFWL_ListBoxImp::ClearSelection() +{ + FX_BOOL bMulti = m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiSelection; + IFWL_ListBoxDP *pData = (IFWL_ListBoxDP*)m_pProperties->m_pDataProvider; + FX_INT32 iCount = pData->CountItems(m_pInterface); + for (FX_INT32 i = 0; i < iCount; i++ ) { + FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i); + FX_DWORD dwState = pData->GetItemStyles(m_pInterface, hItem); + FX_BOOL bFindSel = dwState & FWL_ITEMSTATE_LTB_Selected; + if (!bFindSel) { + continue; + } + SetSelectionDirect(hItem, FALSE); + if (!bMulti) { + return; + } + } +} +void CFWL_ListBoxImp::SelectAll() +{ + FX_BOOL bMulti = m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiSelection; + if (!bMulti) { + return; + } + IFWL_ListBoxDP *pData = (IFWL_ListBoxDP*)m_pProperties->m_pDataProvider; + FX_INT32 iCount = pData->CountItems(m_pInterface); + if (iCount > 0) { + FWL_HLISTITEM hItemStart = pData->GetItem(m_pInterface, 0); + FWL_HLISTITEM hItemEnd = pData->GetItem(m_pInterface, iCount - 1); + SetSelection(hItemStart, hItemEnd, FALSE); + } +} +FWL_HLISTITEM CFWL_ListBoxImp::GetFocusedItem() +{ + IFWL_ListBoxDP *pData = (IFWL_ListBoxDP*)m_pProperties->m_pDataProvider; + FX_INT32 iCount = pData->CountItems(m_pInterface); + for (FX_INT32 i = 0; i < iCount; i++) { + FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i); + _FWL_RETURN_VALUE_IF_FAIL(hItem, NULL); + if (pData->GetItemStyles(m_pInterface, hItem) & FWL_ITEMSTATE_LTB_Focused) { + return hItem; + } + } + return NULL; +} +void CFWL_ListBoxImp::SetFocusItem(FWL_HLISTITEM hItem) +{ + IFWL_ListBoxDP *pData = (IFWL_ListBoxDP*)m_pProperties->m_pDataProvider; + FWL_HLISTITEM hFocus = GetFocusedItem(); + if (hItem != hFocus) { + if (hFocus) { + FX_DWORD dwStyle = pData->GetItemStyles(m_pInterface, hFocus); + dwStyle &= ~FWL_ITEMSTATE_LTB_Focused; + pData->SetItemStyles(m_pInterface, hFocus, dwStyle); + } + if (hItem) { + FX_DWORD dwStyle = pData->GetItemStyles(m_pInterface, hItem); + dwStyle |= FWL_ITEMSTATE_LTB_Focused; + pData->SetItemStyles(m_pInterface, hItem, dwStyle); + } + } +} +FWL_HLISTITEM CFWL_ListBoxImp::GetItemAtPoint(FX_FLOAT fx, FX_FLOAT fy) +{ + fx -= m_rtConent.left, fy -= m_rtConent.top; + FX_FLOAT fPosX = 0.0f; + if (m_pHorzScrollBar) { + fPosX = m_pHorzScrollBar->GetPos(); + } + FX_FLOAT fPosY = 0.0; + if (m_pVertScrollBar) { + fPosY = m_pVertScrollBar->GetPos(); + } + IFWL_ListBoxDP *pData = (IFWL_ListBoxDP*)m_pProperties->m_pDataProvider; + FX_INT32 nCount = pData->CountItems(m_pInterface); + for (FX_INT32 i = 0; i < nCount; i ++) { + FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i); + if (!hItem) { + continue; + } + CFX_RectF rtItem; + pData->GetItemRect(m_pInterface, hItem, rtItem); + rtItem.Offset(-fPosX, -fPosY); + if (rtItem.Contains(fx, fy)) { + return hItem; + } + } + return NULL; +} +FX_BOOL CFWL_ListBoxImp::GetItemCheckRect(FWL_HLISTITEM hItem, CFX_RectF &rtCheck) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pProperties->m_pDataProvider, FALSE); + if (!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_Check)) { + return FALSE; + } + IFWL_ListBoxDP *pData = (IFWL_ListBoxDP*)m_pProperties->m_pDataProvider; + pData->GetItemCheckRect(m_pInterface, hItem, rtCheck); + return TRUE; +} +FX_BOOL CFWL_ListBoxImp::GetItemChecked(FWL_HLISTITEM hItem) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pProperties->m_pDataProvider, FALSE); + if (!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_Check)) { + return FALSE; + } + IFWL_ListBoxDP *pData = (IFWL_ListBoxDP*)m_pProperties->m_pDataProvider; + return (pData->GetItemCheckState(m_pInterface, hItem) & FWL_ITEMSTATE_LTB_Checked); +} +FX_BOOL CFWL_ListBoxImp::SetItemChecked(FWL_HLISTITEM hItem, FX_BOOL bChecked) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pProperties->m_pDataProvider, FALSE); + if (!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_Check)) { + return FALSE; + } + IFWL_ListBoxDP *pData = (IFWL_ListBoxDP*)m_pProperties->m_pDataProvider; + FX_DWORD dwCheckState = pData->GetItemCheckState(m_pInterface, hItem); + if (bChecked) { + pData->SetItemCheckState(m_pInterface, hItem, FWL_ITEMSTATE_LTB_Checked); + } else { + pData->SetItemCheckState(m_pInterface, hItem, 0); + } + return TRUE; +} +FX_BOOL CFWL_ListBoxImp::ScrollToVisible(FWL_HLISTITEM hItem) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pVertScrollBar, FALSE); + CFX_RectF rtItem; + IFWL_ListBoxDP *pData = (IFWL_ListBoxDP*)m_pProperties->m_pDataProvider; + pData->GetItemRect(m_pInterface, hItem, rtItem); + FX_BOOL bScroll = FALSE; + FX_FLOAT fPosY = m_pVertScrollBar->GetPos(); + rtItem.Offset(0, - fPosY + m_rtConent.top); + if (rtItem.top < m_rtConent.top) { + fPosY += rtItem.top - m_rtConent.top; + bScroll = TRUE; + } else if (rtItem.bottom() > m_rtConent.bottom()) { + fPosY += rtItem.bottom() - m_rtConent.bottom(); + bScroll = TRUE; + } + if (!bScroll) { + return FALSE; + } + m_pVertScrollBar->SetPos(fPosY); + m_pVertScrollBar->SetTrackPos(fPosY); + Repaint(&m_rtClient); + return TRUE; +} +void CFWL_ListBoxImp::DrawBkground(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix ) +{ + _FWL_RETURN_IF_FAIL(pGraphics); + _FWL_RETURN_IF_FAIL(pTheme); + CFWL_ThemeBackground param; + param.m_pWidget = m_pInterface; + param.m_iPart = FWL_PART_LTB_Background; + param.m_dwStates = 0; + param.m_pGraphics = pGraphics; + param.m_matrix.Concat(*pMatrix); + param.m_rtPart = m_rtClient; + if (IsShowScrollBar(FALSE) && IsShowScrollBar(TRUE)) { + param.m_pData = &m_rtStatic; + } + if (!IsEnabled()) { + param.m_dwStates = FWL_PARTSTATE_LTB_Disabled; + } + pTheme->DrawBackground(¶m); +} +void CFWL_ListBoxImp::DrawItems(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix ) +{ + FX_FLOAT fPosX = 0.0f; + if (m_pHorzScrollBar) { + fPosX = m_pHorzScrollBar->GetPos(); + } + FX_FLOAT fPosY = 0.0f; + if (m_pVertScrollBar) { + fPosY = m_pVertScrollBar->GetPos(); + } + CFX_RectF rtView(m_rtConent); + if (m_pHorzScrollBar) { + rtView.height -= m_fScorllBarWidth; + } + if (m_pVertScrollBar) { + rtView.width -= m_fScorllBarWidth; + } + FX_BOOL bMultiCol = m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiColumn; + IFWL_ListBoxDP *pData = (IFWL_ListBoxDP*)m_pProperties->m_pDataProvider; + FX_INT32 iCount = pData->CountItems(m_pInterface); + for (FX_INT32 i = 0; i < iCount; i ++) { + FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i); + if (!hItem) { + continue; + } + CFX_RectF rtItem; + pData->GetItemRect(m_pInterface, hItem, rtItem); + rtItem.Offset(m_rtConent.left - fPosX, m_rtConent.top - fPosY); + if (rtItem.bottom() < m_rtConent.top) { + continue; + } + if (rtItem.top >= m_rtConent.bottom()) { + break; + } + if (bMultiCol && rtItem.left > m_rtConent.right()) { + break; + } + if (GetStylesEx() & FWL_STYLEEXT_LTB_OwnerDraw) { + CFWL_EvtLtbDrawItem ev; + ev.m_pSrcTarget = m_pInterface; + ev.m_pGraphics = pGraphics; + ev.m_matrix = *pMatrix; + ev.m_index = i; + ev.m_rect = rtItem; + DispatchEvent(&ev); + } else { + DrawItem(pGraphics, pTheme, hItem, i, rtItem, pMatrix); + } + } +} +void CFWL_ListBoxImp::DrawItem(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, FWL_HLISTITEM hItem, FX_INT32 Index, const CFX_RectF &rtItem, const CFX_Matrix *pMatrix ) +{ + IFWL_ListBoxDP *pData = (IFWL_ListBoxDP*)m_pProperties->m_pDataProvider; + FX_DWORD dwItemStyles = pData->GetItemStyles(m_pInterface, hItem); + FX_DWORD dwPartStates = FWL_PARTSTATE_LTB_Normal; + if (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) { + dwPartStates = FWL_PARTSTATE_LTB_Disabled; + } else if (dwItemStyles & FWL_ITEMSTATE_LTB_Selected) { + dwPartStates = FWL_PARTSTATE_LTB_Selected; + } + if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused && dwItemStyles & FWL_ITEMSTATE_LTB_Focused) { + dwPartStates |= FWL_PARTSTATE_LTB_Focused; + } + FWL_ListBoxItemData itemData; + itemData.pDataProvider = pData; + itemData.iIndex = Index; + { + CFWL_ThemeBackground param; + param.m_pWidget = m_pInterface; + param.m_iPart = FWL_PART_LTB_ListItem; + param.m_dwStates = dwPartStates; + param.m_pGraphics = pGraphics; + param.m_matrix.Concat(*pMatrix); + param.m_rtPart = rtItem; + param.m_dwData = (FX_DWORD)(FX_UINTPTR)(&itemData); + CFX_RectF rtFocus(rtItem); + param.m_pData = &rtFocus; + if (m_pVertScrollBar && !m_pHorzScrollBar && (dwPartStates & FWL_PARTSTATE_LTB_Focused)) { + param.m_rtPart.left += 1; + param.m_rtPart.width -= (m_fScorllBarWidth + 1); + rtFocus.Deflate(0.5, 0.5, 1 + m_fScorllBarWidth, 1); + } + pTheme->DrawBackground(¶m); + } + { + FX_BOOL bHasIcon = GetStylesEx() & FWL_STYLEEXT_LTB_Icon; + if (bHasIcon) { + CFX_RectF rtDIB; + CFX_DIBitmap *pDib = pData->GetItemIcon(m_pInterface, hItem); + rtDIB.Set(rtItem.left, rtItem.top, rtItem.height, rtItem.height); + if (pDib) { + CFWL_ThemeBackground param; + param.m_pWidget = m_pInterface; + param.m_iPart = FWL_PART_LTB_Icon; + param.m_pGraphics = pGraphics; + param.m_matrix.Concat(*pMatrix); + param.m_rtPart = rtDIB; + param.m_dwData = (FX_DWORD)(FX_UINTPTR)(&itemData); + param.m_pImage = pDib; + pTheme->DrawBackground(¶m); + } + } + FX_BOOL bHasCheck = GetStylesEx() & FWL_STYLEEXT_LTB_Check; + if (bHasCheck) { + CFX_RectF rtCheck; + rtCheck.Set(rtItem.left, rtItem.top, rtItem.height, rtItem.height); + rtCheck.Deflate(2, 2, 2, 2); + pData->SetItemCheckRect(m_pInterface, hItem, rtCheck); + CFWL_ThemeBackground param; + param.m_pWidget = m_pInterface; + param.m_iPart = FWL_PART_LTB_Check; + param.m_pGraphics = pGraphics; + if (GetItemChecked(hItem)) { + param.m_dwStates = FWL_PARTSTATE_LTB_Checked; + } else { + param.m_dwStates = FWL_PARTSTATE_LTB_UnChecked; + } + param.m_matrix.Concat(*pMatrix); + param.m_rtPart = rtCheck; + param.m_dwData = (FX_DWORD)(FX_UINTPTR)(&itemData); + pTheme->DrawBackground(¶m); + } + CFX_WideString wsText; + pData->GetItemText(m_pInterface, hItem, wsText); + if (wsText.GetLength() <= 0) { + return; + } + CFX_RectF rtText(rtItem); + rtText.Deflate(FWL_LISTBOX_ItemTextMargin, FWL_LISTBOX_ItemTextMargin); + if (bHasIcon || bHasCheck) { + rtText.Deflate(rtItem.height, 0, 0, 0); + } + CFWL_ThemeText textParam; + textParam.m_pWidget = m_pInterface; + textParam.m_iPart = FWL_PART_LTB_ListItem; + textParam.m_dwStates = dwPartStates; + textParam.m_pGraphics = pGraphics; + textParam.m_matrix.Concat(*pMatrix); + textParam.m_rtPart = rtText; + textParam.m_wsText = wsText; + textParam.m_dwTTOStyles = m_dwTTOStyles; + textParam.m_iTTOAlign = m_iTTOAligns; + textParam.m_dwData = (FX_DWORD)(FX_UINTPTR)(&itemData); + pTheme->DrawText(&textParam); + } +} +CFX_SizeF CFWL_ListBoxImp::CalcSize(FX_BOOL bAutoSize ) +{ + CFX_SizeF fs; + fs.Set(0, 0); + _FWL_RETURN_VALUE_IF_FAIL(m_pProperties->m_pThemeProvider, fs); + GetClientRect(m_rtClient); + m_rtConent = m_rtClient; + CFX_RectF rtUIMargin; + rtUIMargin.Set(0, 0, 0, 0); + if (!m_pOuter) { + CFX_RectF* pUIMargin = (CFX_RectF*)GetThemeCapacity(FWL_WGTCAPACITY_UIMargin); + if (pUIMargin) { + m_rtConent.Deflate(pUIMargin->left, pUIMargin->top, pUIMargin->width, pUIMargin->height); + } + } + FX_FLOAT fWidth = 0; + if (m_pProperties->m_pThemeProvider->IsCustomizedLayout(m_pInterface)) { + IFWL_ListBoxDP *pData = (IFWL_ListBoxDP*)m_pProperties->m_pDataProvider; + if (!bAutoSize) { + } + FX_INT32 iCount = pData->CountItems(m_pInterface); + for (FX_INT32 i = 0; i < iCount; i ++) { + FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i); + CFWL_ThemePart itemPart; + itemPart.m_pWidget = m_pInterface; + itemPart.m_iPart = FWL_PART_LTB_ListItem; + itemPart.m_pData = m_pProperties->m_pDataProvider; + itemPart.m_dwData = i; + CFX_RectF r; + m_pProperties->m_pThemeProvider->GetPartRect(&itemPart, r); + if (!bAutoSize) { + CFX_RectF rtItem; + rtItem.Set(m_rtClient.left, m_rtClient.top + fs.y, r.width, r.height); + IFWL_ListBoxDP *pData = (IFWL_ListBoxDP*)m_pProperties->m_pDataProvider; + pData->SetItemRect(m_pInterface, hItem, rtItem); + } + fs.y += r.height; + if (fs.x < r.width) { + fs.x = r.width; + fWidth = r.width; + } + } + } else { + fWidth = GetMaxTextWidth(); + fWidth += 2 * FWL_LISTBOX_ItemTextMargin; + if (!bAutoSize) { + FX_FLOAT fActualWidth = m_rtClient.width - rtUIMargin.left - rtUIMargin.width; + if (fWidth < fActualWidth) { + fWidth = fActualWidth; + } + } + IFWL_ListBoxDP *pData = (IFWL_ListBoxDP*)m_pProperties->m_pDataProvider; + m_fItemHeight = GetItemHeigt(); + FX_BOOL bHasIcon; + bHasIcon = GetStylesEx() & FWL_STYLEEXT_LTB_Icon; + if (bHasIcon) { + fWidth += m_fItemHeight; + } + FX_INT32 iCount = pData->CountItems(m_pInterface); + for (FX_INT32 i = 0; i < iCount; i ++) { + FWL_HLISTITEM htem = pData->GetItem(m_pInterface, i); + GetItemSize(fs, htem, fWidth, m_fItemHeight, bAutoSize); + } + } + if (bAutoSize) { + return fs; + } + FX_FLOAT iWidth = m_rtClient.width - rtUIMargin.left - rtUIMargin.width; + FX_FLOAT iHeight = m_rtClient.height; + FX_BOOL bShowVertScr = (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_ShowScrollBarAlaways) && + (m_pProperties->m_dwStyles & FWL_WGTSTYLE_VScroll); + FX_BOOL bShowHorzScr = (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_ShowScrollBarAlaways) && + (m_pProperties->m_dwStyles & FWL_WGTSTYLE_HScroll); + if (!bShowVertScr && m_pProperties->m_dwStyles & FWL_WGTSTYLE_VScroll && + (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiColumn) == 0) { + bShowVertScr = (fs.y > iHeight); + } + if (!bShowHorzScr && m_pProperties->m_dwStyles & FWL_WGTSTYLE_HScroll) { + bShowHorzScr = (fs.x > iWidth); + } + CFX_SizeF szRange; + if (bShowVertScr) { + if (!m_pVertScrollBar) { + InitScrollBar(); + } + CFX_RectF rtScrollBar; + rtScrollBar.Set(m_rtClient.right() - m_fScorllBarWidth, + m_rtClient.top, + m_fScorllBarWidth, + m_rtClient.height - 1); + if (bShowHorzScr) { + rtScrollBar.height -= m_fScorllBarWidth; + } + m_pVertScrollBar->SetWidgetRect(rtScrollBar); + szRange.x = 0, szRange.y = fs.y - m_rtConent.height; + if (szRange.y < m_fItemHeight) { + szRange.y = m_fItemHeight; + } + m_pVertScrollBar->SetRange(szRange.x, szRange.y); + m_pVertScrollBar->SetPageSize(rtScrollBar.height * 9 / 10); + m_pVertScrollBar->SetStepSize(m_fItemHeight); + FX_FLOAT fPos = m_pVertScrollBar->GetPos(); + if (fPos < 0) { + fPos = 0; + } + if (fPos > szRange.y) { + fPos = szRange.y; + } + m_pVertScrollBar->SetPos(fPos); + m_pVertScrollBar->SetTrackPos(fPos); + if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_ShowScrollBarFocus) == 0 || (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused)) { + m_pVertScrollBar->SetStates(FWL_WGTSTATE_Invisible, FALSE); + } + m_pVertScrollBar->Update(); + } else if (m_pVertScrollBar) { + m_pVertScrollBar->SetPos(0); + m_pVertScrollBar->SetTrackPos(0); + m_pVertScrollBar->SetStates(FWL_WGTSTATE_Invisible, TRUE); + } + if (bShowHorzScr) { + if (!m_pHorzScrollBar) { + InitScrollBar(FALSE); + } + CFX_RectF rtScrollBar; + rtScrollBar.Set(m_rtClient.left, + m_rtClient.bottom() - m_fScorllBarWidth, + m_rtClient.width, + m_fScorllBarWidth); + if (bShowVertScr) { + rtScrollBar.width -= m_fScorllBarWidth; + } + m_pHorzScrollBar->SetWidgetRect(rtScrollBar); + szRange.x = 0, szRange.y = fs.x - rtScrollBar.width; + m_pHorzScrollBar->SetRange(szRange.x, szRange.y); + m_pHorzScrollBar->SetPageSize(fWidth * 9 / 10); + m_pHorzScrollBar->SetStepSize(fWidth / 10); + FX_FLOAT fPos = m_pHorzScrollBar->GetPos(); + if (fPos < 0) { + fPos = 0; + } + if (fPos > szRange.y) { + fPos = szRange.y; + } + m_pHorzScrollBar->SetPos(fPos); + m_pHorzScrollBar->SetTrackPos(fPos); + if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_ShowScrollBarFocus) == 0 || (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused)) { + m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Invisible, FALSE); + } + m_pHorzScrollBar->Update(); + } else if (m_pHorzScrollBar) { + m_pHorzScrollBar->SetPos(0); + m_pHorzScrollBar->SetTrackPos(0); + m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Invisible, TRUE); + } + if (bShowVertScr && bShowHorzScr) { + m_rtStatic.Set(m_rtClient.right() - m_fScorllBarWidth, + m_rtClient.bottom() - m_fScorllBarWidth, + m_fScorllBarWidth, + m_fScorllBarWidth); + } + return fs; +} +void CFWL_ListBoxImp::GetItemSize(CFX_SizeF &size, FWL_HLISTITEM hItem, FX_FLOAT fWidth, FX_FLOAT m_fItemHeight, FX_BOOL bAutoSize) +{ + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiColumn) { + } else { + if (!bAutoSize) { + CFX_RectF rtItem; + rtItem.Set(0, size.y, fWidth, m_fItemHeight); + IFWL_ListBoxDP *pData = (IFWL_ListBoxDP*)m_pProperties->m_pDataProvider; + pData->SetItemRect(m_pInterface, hItem, rtItem); + } + size.x = fWidth; + size.y += m_fItemHeight; + } +} +FX_FLOAT CFWL_ListBoxImp::GetMaxTextWidth() +{ + FX_FLOAT fRet = 0.0f; + IFWL_ListBoxDP *pData = (IFWL_ListBoxDP*)m_pProperties->m_pDataProvider; + FX_INT32 iCount = pData->CountItems(m_pInterface); + for (FX_INT32 i = 0; i < iCount; i ++) { + FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i); + if (!hItem) { + continue; + } + CFX_WideString wsText; + pData->GetItemText(m_pInterface, hItem, wsText); + CFX_SizeF sz = CalcTextSize(wsText, m_pProperties->m_pThemeProvider); + if (sz.x > fRet) { + fRet = sz.x; + } + } + return fRet; +} +FX_FLOAT CFWL_ListBoxImp::GetScrollWidth() +{ + FX_FLOAT *pfWidth = (FX_FLOAT*)GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth); + _FWL_RETURN_VALUE_IF_FAIL(pfWidth, 0); + return *pfWidth; +} +FX_FLOAT CFWL_ListBoxImp::GetItemHeigt() +{ + FX_FLOAT *pfFont = (FX_FLOAT*)GetThemeCapacity(FWL_WGTCAPACITY_FontSize); + _FWL_RETURN_VALUE_IF_FAIL(pfFont, 20); + return *pfFont + 2 * FWL_LISTBOX_ItemTextMargin; +} +void CFWL_ListBoxImp::InitScrollBar(FX_BOOL bVert ) +{ + if ((bVert && m_pVertScrollBar) || (!bVert && m_pHorzScrollBar)) { + return; + } + CFWL_WidgetImpProperties prop; + prop.m_dwStyleExes = bVert ? FWL_STYLEEXT_SCB_Vert : FWL_STYLEEXT_SCB_Horz; + prop.m_dwStates = FWL_WGTSTATE_Invisible; + prop.m_pParent = m_pInterface; + prop.m_pThemeProvider = m_pScrollBarTP; + IFWL_ScrollBar *pScrollBar = IFWL_ScrollBar::Create(); + pScrollBar->Initialize(prop, m_pInterface); + bVert ? (m_pVertScrollBar = pScrollBar) : (m_pHorzScrollBar = pScrollBar); +} +void CFWL_ListBoxImp::SortItem() +{ +} +FX_BOOL CFWL_ListBoxImp::IsShowScrollBar(FX_BOOL bVert) +{ + IFWL_ScrollBar* pScrollbar = bVert ? m_pVertScrollBar : m_pHorzScrollBar; + if (!pScrollbar || (pScrollbar->GetStates() & FWL_WGTSTATE_Invisible)) { + return FALSE; + } + return !(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_ShowScrollBarFocus) || (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused); +} +void CFWL_ListBoxImp::ProcessSelChanged() +{ + CFWL_EvtLtbSelChanged selEvent; + selEvent.m_pSrcTarget = m_pInterface; + CFX_Int32Array arrSels; + FX_INT32 iCount = CountSelItems(); + for (FX_INT32 i = 0; i < iCount; i ++) { + FWL_HLISTITEM item = GetSelItem(i); + if (item == NULL) { + continue; + } + selEvent.iarraySels.Add(i); + } + DispatchEvent(&selEvent); +} +CFWL_ListBoxImpDelegate::CFWL_ListBoxImpDelegate(CFWL_ListBoxImp *pOwner) + : m_pOwner(pOwner) +{ +} +FX_INT32 CFWL_ListBoxImpDelegate::OnProcessMessage(CFWL_Message *pMessage) +{ + _FWL_RETURN_VALUE_IF_FAIL(pMessage, 0); + if (!m_pOwner->IsEnabled()) { + return 1; + } + FX_DWORD dwMsgCode = pMessage->GetClassID(); + FX_INT32 iRet = 1; + switch (dwMsgCode) { + case FWL_MSGHASH_SetFocus: + case FWL_MSGHASH_KillFocus: { + OnFocusChanged(pMessage, dwMsgCode == FWL_MSGHASH_SetFocus); + break; + } + case FWL_MSGHASH_Mouse: { + CFWL_MsgMouse *pMsg = (CFWL_MsgMouse*)pMessage; + FX_DWORD dwCmd = pMsg->m_dwCmd; + switch (dwCmd) { + case FWL_MSGMOUSECMD_LButtonDown: { + OnLButtonDown(pMsg); + break; + } + case FWL_MSGMOUSECMD_LButtonUp: { + OnLButtonUp(pMsg); + break; + } + default: { + } + } + break; + } + case FWL_MSGHASH_MouseWheel: { + OnMouseWheel((CFWL_MsgMouseWheel*)pMessage); + break; + } + case FWL_MSGHASH_Key: { + CFWL_MsgKey *pMsg = (CFWL_MsgKey*)pMessage; + FX_DWORD dwCmd = pMsg->m_dwCmd; + if (dwCmd == FWL_MSGKEYCMD_KeyDown) { + OnKeyDown(pMsg); + } + break; + } + default: { + iRet = 0; + } + } + CFWL_WidgetImpDelegate::OnProcessMessage(pMessage); + return iRet; +} +FWL_ERR CFWL_ListBoxImpDelegate::OnProcessEvent(CFWL_Event *pEvent) +{ + _FWL_RETURN_VALUE_IF_FAIL(pEvent, FWL_ERR_Indefinite); + FX_DWORD dwHashCode = pEvent->GetClassID(); + if (pEvent->GetClassID() != FWL_EVTHASH_Scroll) { + return FWL_ERR_Succeeded; + } + IFWL_Widget *pSrcTarget = pEvent->m_pSrcTarget; + if ((pSrcTarget == (IFWL_Widget*)m_pOwner->m_pVertScrollBar && m_pOwner->m_pVertScrollBar) || (pSrcTarget == (IFWL_Widget*)m_pOwner->m_pHorzScrollBar && m_pOwner->m_pHorzScrollBar)) { + FX_DWORD dwScrollCode = ((CFWL_EvtScroll*)pEvent)->m_iScrollCode; + FX_FLOAT fPos = ((CFWL_EvtScroll*)pEvent)->m_fPos; + OnScroll((IFWL_ScrollBar*)pSrcTarget, dwScrollCode, fPos); + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ListBoxImpDelegate::OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix) +{ + return m_pOwner->DrawWidget(pGraphics, pMatrix); +} +void CFWL_ListBoxImpDelegate::OnFocusChanged(CFWL_Message *pMsg, FX_BOOL bSet) +{ + if (m_pOwner->GetStylesEx() & FWL_STYLEEXT_LTB_ShowScrollBarFocus) { + if (m_pOwner->m_pVertScrollBar) { + m_pOwner->m_pVertScrollBar->SetStates(FWL_WGTSTATE_Invisible, !bSet); + } + if (m_pOwner->m_pHorzScrollBar) { + m_pOwner->m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Invisible, !bSet); + } + } + if (bSet) { + m_pOwner->m_pProperties->m_dwStates |= (FWL_WGTSTATE_Focused); + } else { + m_pOwner->m_pProperties->m_dwStates &= ~(FWL_WGTSTATE_Focused); + } + m_pOwner->Repaint(&m_pOwner->m_rtClient); +} +void CFWL_ListBoxImpDelegate::OnLButtonDown(CFWL_MsgMouse *pMsg) +{ + m_pOwner->m_bLButtonDown = TRUE; + if ((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0) { + m_pOwner->SetFocus(TRUE); + } + FWL_HLISTITEM hItem = m_pOwner->GetItemAtPoint(pMsg->m_fx, pMsg->m_fy); + if (!hItem) { + return; + } + if (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiSelection) { + if (pMsg->m_dwFlags & FWL_KEYFLAG_Ctrl) { + FX_BOOL bSelected = m_pOwner->IsItemSelected(hItem); + m_pOwner->SetSelectionDirect(hItem, !bSelected); + m_pOwner->m_hAnchor = hItem; + } else if (pMsg->m_dwFlags & FWL_KEYFLAG_Shift) { + if (m_pOwner->m_hAnchor) { + m_pOwner->SetSelection(m_pOwner->m_hAnchor, hItem, TRUE); + } else { + m_pOwner->SetSelectionDirect(hItem, TRUE); + } + } else { + m_pOwner->SetSelection(hItem, hItem, TRUE); + m_pOwner->m_hAnchor = hItem; + } + } else { + m_pOwner->SetSelection(hItem, hItem, TRUE); + } + if (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_Check) { + FWL_HLISTITEM hSelectedItem = m_pOwner->GetItemAtPoint(pMsg->m_fx, pMsg->m_fy); + CFX_RectF rtCheck; + m_pOwner->GetItemCheckRect(hSelectedItem, rtCheck); + FX_BOOL bChecked = m_pOwner->GetItemChecked(hItem); + if (rtCheck.Contains(pMsg->m_fx, pMsg->m_fy)) { + if (bChecked) { + m_pOwner->SetItemChecked(hItem, FALSE); + } else { + m_pOwner->SetItemChecked(hItem, TRUE); + } + m_pOwner->Update(); + } + } + m_pOwner->SetFocusItem(hItem); + m_pOwner->ScrollToVisible(hItem); + m_pOwner->SetGrab(TRUE); + m_pOwner->ProcessSelChanged(); + m_pOwner->Repaint(&m_pOwner->m_rtClient); +} +void CFWL_ListBoxImpDelegate::OnLButtonUp(CFWL_MsgMouse *pMsg) +{ + if (m_pOwner->m_bLButtonDown) { + m_pOwner->m_bLButtonDown = FALSE; + m_pOwner->SetGrab(FALSE); + DispatchSelChangedEv(); + } +} +void CFWL_ListBoxImpDelegate::OnMouseWheel(CFWL_MsgMouseWheel *pMsg) +{ + if (!m_pOwner->IsShowScrollBar(TRUE)) { + return; + } + IFWL_WidgetDelegate *pDelegate = m_pOwner->m_pVertScrollBar->SetDelegate(NULL); + pDelegate->OnProcessMessage(pMsg); +} +void CFWL_ListBoxImpDelegate::OnKeyDown(CFWL_MsgKey *pMsg) +{ + FX_DWORD dwKeyCode = pMsg->m_dwKeyCode; + switch(dwKeyCode) { + case FWL_VKEY_Tab: + case FWL_VKEY_Up: + case FWL_VKEY_Down: + case FWL_VKEY_Home: + case FWL_VKEY_End: { + FWL_HLISTITEM hItem = m_pOwner->GetFocusedItem(); + hItem = m_pOwner->GetItem(hItem, dwKeyCode); + FX_BOOL bShift = pMsg->m_dwFlags & FWL_KEYFLAG_Shift; + FX_BOOL bCtrl = pMsg->m_dwFlags & FWL_KEYFLAG_Ctrl; + OnVK(hItem, bShift, bCtrl); + DispatchSelChangedEv(); + m_pOwner->ProcessSelChanged(); + break; + } + default: { + } + } +} +void CFWL_ListBoxImpDelegate::OnVK(FWL_HLISTITEM hItem, FX_BOOL bShift, FX_BOOL bCtrl) +{ + if (!hItem) { + return; + } + if (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiSelection) { + if (bCtrl) { + } else if (bShift) { + if (m_pOwner->m_hAnchor) { + m_pOwner->SetSelection(m_pOwner->m_hAnchor, hItem, TRUE); + } else { + m_pOwner->SetSelectionDirect(hItem, TRUE); + } + } else { + m_pOwner->SetSelection(hItem, hItem, TRUE); + m_pOwner->m_hAnchor = hItem; + } + } else { + m_pOwner->SetSelection(hItem, hItem, TRUE); + } + m_pOwner->SetFocusItem(hItem); + m_pOwner->ScrollToVisible(hItem); + { + CFX_RectF rtInvalidate; + rtInvalidate.Set(0, + 0, + m_pOwner->m_pProperties->m_rtWidget.width, + m_pOwner->m_pProperties->m_rtWidget.height); + m_pOwner->Repaint(&rtInvalidate); + } +} +FX_BOOL CFWL_ListBoxImpDelegate::OnScroll(IFWL_ScrollBar *pScrollBar, FX_DWORD dwCode, FX_FLOAT fPos) +{ + CFX_SizeF fs; + pScrollBar->GetRange(fs.x, fs.y); + FX_FLOAT iCurPos = pScrollBar->GetPos(); + FX_FLOAT fStep = pScrollBar->GetStepSize(); + switch (dwCode) { + case FWL_SCBCODE_Min: { + fPos = fs.x; + break; + } + case FWL_SCBCODE_Max: { + fPos = fs.y; + break; + } + case FWL_SCBCODE_StepBackward: { + fPos -= fStep; + if (fPos < fs.x + fStep / 2) { + fPos = fs.x; + } + break; + } + case FWL_SCBCODE_StepForward: { + fPos += fStep; + if (fPos > fs.y - fStep / 2) { + fPos = fs.y; + } + break; + } + case FWL_SCBCODE_PageBackward: { + fPos -= pScrollBar->GetPageSize(); + if (fPos < fs.x) { + fPos = fs.x; + } + break; + } + case FWL_SCBCODE_PageForward: { + fPos += pScrollBar->GetPageSize(); + if (fPos > fs.y) { + fPos = fs.y; + } + break; + } + case FWL_SCBCODE_Pos: + case FWL_SCBCODE_TrackPos: + break; + case FWL_SCBCODE_EndScroll: + return FALSE; + } + if (iCurPos != fPos) { + pScrollBar->SetPos(fPos); + pScrollBar->SetTrackPos(fPos); + m_pOwner->Repaint(&m_pOwner->m_rtClient); + } + return TRUE; +} +void CFWL_ListBoxImpDelegate::DispatchSelChangedEv() +{ + CFWL_EvtLtbSelChanged ev; + ev.m_pSrcTarget = m_pOwner->m_pInterface; + m_pOwner->DispatchEvent(&ev); +} diff --git a/xfa/src/fwl/src/basewidget/fwl_monthcalendarimp.cpp b/xfa/src/fwl/src/basewidget/fwl_monthcalendarimp.cpp new file mode 100644 index 0000000000..fa8deb8d41 --- /dev/null +++ b/xfa/src/fwl/src/basewidget/fwl_monthcalendarimp.cpp @@ -0,0 +1,1113 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../core/include/fwl_targetimp.h" +#include "../core/include/fwl_noteimp.h" +#include "../core/include/fwl_widgetimp.h" +#include "include/fwl_monthcalendarimp.h" +#define MONTHCAL_HSEP_HEIGHT 1 +#define MONTHCAL_VSEP_WIDTH 1 +#define MONTHCAL_HMARGIN 3 +#define MONTHCAL_VMARGIN 2 +#define MONTHCAL_ROWS 9 +#define MONTHCAL_COLUMNS 7 +#define MONTHCAL_HEADER_BTN_VMARGIN 7 +#define MONTHCAL_HEADER_BTN_HMARGIN 5 +IFWL_MonthCalendar* IFWL_MonthCalendar::Create() +{ + return new IFWL_MonthCalendar; +} +IFWL_MonthCalendar::IFWL_MonthCalendar() +{ + m_pData = NULL; +} +IFWL_MonthCalendar::~IFWL_MonthCalendar() +{ + if (m_pData) { + delete (CFWL_MonthCalendarImp*)m_pData; + m_pData = NULL; + } +} +FWL_ERR IFWL_MonthCalendar::Initialize(IFWL_Widget *pOuter) +{ + m_pData = FX_NEW CFWL_MonthCalendarImp(pOuter); + ((CFWL_MonthCalendarImp*)m_pData)->SetInterface(this); + return ((CFWL_MonthCalendarImp*)m_pData)->Initialize(); +} +FWL_ERR IFWL_MonthCalendar::Initialize(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter) +{ + m_pData = FX_NEW CFWL_MonthCalendarImp(properties, pOuter); + ((CFWL_MonthCalendarImp*)m_pData)->SetInterface(this); + return ((CFWL_MonthCalendarImp*)m_pData)->Initialize(); +} +FX_INT32 IFWL_MonthCalendar::CountSelect() +{ + return ((CFWL_MonthCalendarImp*)m_pData)->CountSelect(); +} +FX_BOOL IFWL_MonthCalendar::GetSelect(FX_INT32 &iYear, FX_INT32 &iMonth, FX_INT32 &iDay, FX_INT32 nIndex) +{ + return ((CFWL_MonthCalendarImp*)m_pData)->GetSelect(iYear, iMonth, iDay, nIndex); +} +FX_BOOL IFWL_MonthCalendar::SetSelect(FX_INT32 iYear, FX_INT32 iMonth, FX_INT32 iDay) +{ + return ((CFWL_MonthCalendarImp*)m_pData)->SetSelect(iYear, iMonth, iDay); +} +CFWL_MonthCalendarImp::CFWL_MonthCalendarImp(IFWL_Widget *pOuter ) + : CFWL_WidgetImp(pOuter) + , m_iLBtnPartStates(FWL_PARTSTATE_MCD_Normal) + , m_iRBtnPartStates(FWL_PARTSTATE_MCD_Normal) + , m_iCurMonth(1) + , m_iCurYear(2011) + , m_iYear(2011) + , m_iMonth(1) + , m_iDay(1) + , m_iHovered(-1) +{ + m_rtHead.Reset(); + m_rtWeek.Reset(); + m_rtLBtn.Reset(); + m_rtRBtn.Reset(); + m_rtDates.Reset(); + m_rtHSep.Reset(); + m_rtHeadText.Reset(); + m_rtToday.Reset(); + m_rtTodayFlag.Reset(); + m_rtClient.Reset(); + m_rtWeekNum.Reset(); + m_rtWeekNumSep.Reset(); + m_szHead.Reset(); + m_szCell.Reset(); + m_szToday.Reset(); + m_pDateTime = new CFX_DateTime; + m_bInit = FALSE; + m_iMaxSel = 1; +} +CFWL_MonthCalendarImp::CFWL_MonthCalendarImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter) + : CFWL_WidgetImp(properties, pOuter) + , m_iLBtnPartStates(FWL_PARTSTATE_MCD_Normal) + , m_iRBtnPartStates(FWL_PARTSTATE_MCD_Normal) + , m_iCurMonth(1) + , m_iCurYear(2011) + , m_iYear(2011) + , m_iMonth(1) + , m_iDay(1) + , m_iHovered(-1) +{ + m_rtHead.Reset(); + m_rtWeek.Reset(); + m_rtLBtn.Reset(); + m_rtRBtn.Reset(); + m_rtDates.Reset(); + m_rtHSep.Reset(); + m_rtHeadText.Reset(); + m_rtToday.Reset(); + m_rtTodayFlag.Reset(); + m_rtClient.Reset(); + m_rtWeekNum.Reset(); + m_rtWeekNumSep.Reset(); + m_szHead.Reset(); + m_szCell.Reset(); + m_szToday.Reset(); + m_pDateTime = new CFX_DateTime; + m_bInit = FALSE; + m_iMaxSel = 1; +} +CFWL_MonthCalendarImp::~CFWL_MonthCalendarImp() +{ + ClearDateItem(); + delete m_pDateTime; + m_arrSelDays.RemoveAll(); +} +FWL_ERR CFWL_MonthCalendarImp::GetClassName(CFX_WideString &wsClass) const +{ + wsClass = FWL_CLASS_MonthCalendar; + return FWL_ERR_Succeeded; +} +FX_DWORD CFWL_MonthCalendarImp::GetClassID() const +{ + return FWL_CLASSHASH_MonthCalendar; +} +FWL_ERR CFWL_MonthCalendarImp::Initialize() +{ + _FWL_ERR_CHECK_RETURN_VALUE_IF_FAIL(CFWL_WidgetImp::Initialize(), FWL_ERR_Indefinite); + m_pDelegate = (IFWL_WidgetDelegate*)FX_NEW CFWL_MonthCalendarImpDelegate(this); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_MonthCalendarImp::Finalize() +{ + if ( m_pDelegate) { + delete (CFWL_MonthCalendarImpDelegate*)m_pDelegate; + m_pDelegate = NULL; + } + return CFWL_WidgetImp::Finalize(); +} +FWL_ERR CFWL_MonthCalendarImp::GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize ) +{ + if (bAutoSize) { + CFX_SizeF fs = CalcSize(TRUE); + rect.Set(0, 0, fs.x, fs.y); + CFWL_WidgetImp::GetWidgetRect(rect, TRUE); + } else { + rect = m_pProperties->m_rtWidget; + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_MonthCalendarImp::Update() +{ + if (IsLocked()) { + return FWL_ERR_Indefinite; + } + if (!m_pProperties->m_pThemeProvider) { + m_pProperties->m_pThemeProvider = GetAvailableTheme(); + } + GetCapValue(); + if (!m_bInit) { + m_bInit = InitDate(); + } + ClearDateItem(); + ReSetDateItem(); + LayOut(); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_MonthCalendarImp::DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + _FWL_RETURN_VALUE_IF_FAIL(pGraphics, FWL_ERR_Indefinite); + if (m_pProperties->m_pThemeProvider == NULL) { + m_pProperties->m_pThemeProvider = GetAvailableTheme(); + } + IFWL_ThemeProvider *pTheme = m_pProperties->m_pThemeProvider; + if (HasBorder()) { + DrawBorder(pGraphics, FWL_PART_MCD_Border, pTheme, pMatrix); + } + if (HasEdge()) { + DrawEdge(pGraphics, FWL_PART_MCD_Edge, pTheme, pMatrix); + } + DrawBkground(pGraphics, pTheme, pMatrix); + DrawHeadBK(pGraphics, pTheme, pMatrix); + DrawLButton(pGraphics, pTheme, pMatrix); + DrawRButton(pGraphics, pTheme, pMatrix); + DrawSeperator(pGraphics, pTheme, pMatrix); + DrawDatesInBK(pGraphics, pTheme, pMatrix); + DrawDatesInCircle(pGraphics, pTheme, pMatrix); + DrawCaption(pGraphics, pTheme, pMatrix); + DrawWeek(pGraphics, pTheme, pMatrix); + DrawDatesIn(pGraphics, pTheme, pMatrix); + DrawDatesOut(pGraphics, pTheme, pMatrix); + DrawToday(pGraphics, pTheme, pMatrix); + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_WeekNumbers) { + DrawWeekNumberSep(pGraphics, pTheme, pMatrix); + DrawWeekNumber(pGraphics, pTheme, pMatrix); + } + return FWL_ERR_Succeeded; +} +FX_INT32 CFWL_MonthCalendarImp::CountSelect() +{ + return m_arrSelDays.GetSize(); +} +FX_BOOL CFWL_MonthCalendarImp::GetSelect(FX_INT32 &iYear, FX_INT32 &iMonth, FX_INT32 &iDay, FX_INT32 nIndex ) +{ + if (nIndex >= m_arrSelDays.GetSize()) { + return FALSE; + } + iYear = m_iCurYear; + iMonth = m_iCurMonth; + iDay = m_arrSelDays[nIndex]; + return TRUE; +} +FX_BOOL CFWL_MonthCalendarImp::SetSelect(FX_INT32 iYear, FX_INT32 iMonth, FX_INT32 iDay) +{ + ChangeToMonth(iYear, iMonth); + return AddSelDay(iDay); +} +void CFWL_MonthCalendarImp::DrawBkground(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix) +{ + CFWL_ThemeBackground params; + params.m_pWidget = m_pInterface; + params.m_iPart = FWL_PART_MCD_Background; + params.m_pGraphics = pGraphics; + params.m_dwStates = FWL_PARTSTATE_MCD_Normal; + params.m_rtPart = m_rtClient; + if (pMatrix) { + params.m_matrix.Concat(*pMatrix); + } + pTheme->DrawBackground(¶ms); +} +void CFWL_MonthCalendarImp::DrawHeadBK(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix) +{ + CFWL_ThemeBackground params; + params.m_pWidget = m_pInterface; + params.m_iPart = FWL_PART_MCD_Header; + params.m_pGraphics = pGraphics; + params.m_dwStates = FWL_PARTSTATE_MCD_Normal; + params.m_rtPart = m_rtHead; + if (pMatrix) { + params.m_matrix.Concat(*pMatrix); + } + pTheme->DrawBackground(¶ms); +} +void CFWL_MonthCalendarImp::DrawLButton(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix) +{ + CFWL_ThemeBackground params; + params.m_pWidget = m_pInterface; + params.m_iPart = FWL_PART_MCD_LBtn; + params.m_pGraphics = pGraphics; + params.m_dwStates = m_iLBtnPartStates; + params.m_rtPart = m_rtLBtn; + if (pMatrix) { + params.m_matrix.Concat(*pMatrix); + } + pTheme->DrawBackground(¶ms); +} +void CFWL_MonthCalendarImp::DrawRButton(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix) +{ + CFWL_ThemeBackground params; + params.m_pWidget = m_pInterface; + params.m_iPart = FWL_PART_MCD_RBtn; + params.m_pGraphics = pGraphics; + params.m_dwStates = m_iRBtnPartStates; + params.m_rtPart = m_rtRBtn; + if (pMatrix) { + params.m_matrix.Concat(*pMatrix); + } + pTheme->DrawBackground(¶ms); +} +void CFWL_MonthCalendarImp::DrawCaption(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix) +{ + CFWL_ThemeText textParam; + textParam.m_pWidget = m_pInterface; + textParam.m_iPart = FWL_PART_MCD_Caption; + textParam.m_dwStates = FWL_PARTSTATE_MCD_Normal; + textParam.m_pGraphics = pGraphics; + FX_INT32 iYear; + FX_INT32 iMonth; + iYear = m_iCurYear; + iMonth = m_iCurMonth; + CFX_WideString wsCation; + GetHeadText(iYear, iMonth, wsCation); + textParam.m_wsText = wsCation; + m_szHead = CalcTextSize(textParam.m_wsText, m_pProperties->m_pThemeProvider); + CalcHeadSize(); + textParam.m_rtPart = m_rtHeadText; + textParam.m_dwTTOStyles = FDE_TTOSTYLE_SingleLine; + textParam.m_iTTOAlign = FDE_TTOALIGNMENT_Center; + if (pMatrix) { + textParam.m_matrix.Concat(*pMatrix); + } + pTheme->DrawText(&textParam); +} +void CFWL_MonthCalendarImp::DrawSeperator(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix) +{ + CFWL_ThemeBackground params; + params.m_pWidget = m_pInterface; + params.m_iPart = FWL_PART_MCD_HSeparator; + params.m_pGraphics = pGraphics; + params.m_dwStates = FWL_PARTSTATE_MCD_Normal; + params.m_rtPart = m_rtHSep; + if (pMatrix) { + params.m_matrix.Concat(*pMatrix); + } + pTheme->DrawBackground(¶ms); +} +void CFWL_MonthCalendarImp::DrawDatesInBK(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix) +{ + CFWL_ThemeBackground params; + params.m_pWidget = m_pInterface; + params.m_iPart = FWL_PART_MCD_DateInBK; + params.m_pGraphics = pGraphics; + if (pMatrix) { + params.m_matrix.Concat(*pMatrix); + } + FX_INT32 iCount = m_arrDates.GetSize(); + for (FX_INT32 j = 0; j < iCount; j ++) { + LPDATEINFO pDataInfo = (LPDATEINFO)m_arrDates.GetAt(j); + if (pDataInfo->dwStates & FWL_ITEMSTATE_MCD_Selected) { + params.m_dwStates |= FWL_PARTSTATE_MCD_Selected; + if (((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_NoTodayCircle) == 0) && pDataInfo->dwStates & FWL_ITEMSTATE_MCD_Flag) { + params.m_dwStates |= FWL_PARTSTATE_MCD_Flagged; + } + if (pDataInfo->dwStates & FWL_ITEMSTATE_MCD_Focused) { + params.m_dwStates |= FWL_PARTSTATE_MCD_Focused; + } + } else if (j == m_iHovered - 1) { + params.m_dwStates |= FWL_PARTSTATE_MCD_Hovered; + } else if (pDataInfo->dwStates & FWL_ITEMSTATE_MCD_Flag) { + params.m_dwStates = FWL_PARTSTATE_MCD_Flagged; + pTheme->DrawBackground(¶ms); + } + params.m_rtPart = pDataInfo->rect; + pTheme->DrawBackground(¶ms); + params.m_dwStates = 0; + } +} +void CFWL_MonthCalendarImp::DrawWeek(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix) +{ + CFWL_ThemeText params; + params.m_pWidget = m_pInterface; + params.m_iPart = FWL_PART_MCD_Week; + params.m_pGraphics = pGraphics; + params.m_dwStates = FWL_PARTSTATE_MCD_Normal; + params.m_iTTOAlign = FDE_TTOALIGNMENT_Center; + FX_INT32 iWeek; + iWeek = m_pDateTime->GetDayOfWeek(); + CFX_RectF rtDayOfWeek; + const FX_WCHAR* pWeekDay[] = { + (FX_WCHAR *)L"Sun", (FX_WCHAR *)L"Mon", (FX_WCHAR *)L"Tue", + (FX_WCHAR *)L"Wed", (FX_WCHAR *)L"Thu", (FX_WCHAR *)L"Fri", (FX_WCHAR *)L"Sat" + }; + if (pMatrix) { + params.m_matrix.Concat(*pMatrix); + } + for (FX_INT32 i = 0; i < 7; i++) { + rtDayOfWeek.Set(m_rtWeek.left + i * (m_szCell.x + MONTHCAL_HMARGIN * 2), + m_rtWeek.top, + m_szCell.x, + m_szCell.y); + CFX_WideString *wsWeekDay = NULL; + wsWeekDay = (CFX_WideString *)pTheme->GetCapacity(¶ms, i + FWL_MCCAPACITY_Sun); + params.m_rtPart = rtDayOfWeek; + params.m_wsText = *wsWeekDay; + params.m_dwTTOStyles = FDE_TTOSTYLE_SingleLine; + pTheme->DrawText(¶ms); + } +} +void CFWL_MonthCalendarImp::DrawWeekNumber(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix) +{ + CFWL_ThemeText params; + params.m_pWidget = m_pInterface; + params.m_iPart = FWL_PART_MCD_WeekNum; + params.m_pGraphics = pGraphics; + params.m_dwStates = FWL_PARTSTATE_MCD_Normal; + params.m_iTTOAlign = FDE_TTOALIGNMENT_CenterLeft; + CFX_WideString wsWeekNum; + params.m_dwTTOStyles = FDE_TTOSTYLE_SingleLine; + params.m_iTTOAlign = FDE_TTOALIGNMENT_Center; + if (pMatrix) { + params.m_matrix.Concat(*pMatrix); + } + FX_INT32 iWeekNum = 0; + FX_INT32 iMonthNum = m_pDateTime->GetMonth(); + FX_INT32 iDayNum = FX_DaysInMonth(m_iCurYear, iMonthNum); + FX_INT32 iTemp = 0; + FX_FLOAT fVStartPos = m_rtClient.top + m_fHeadHei + m_fHSepHei; + FX_FLOAT fHStartPos = m_rtClient.left; + for (FX_INT32 i = 1; i <= iDayNum; i += 7) { + iTemp ++; + iWeekNum = CalWeekNumber(m_iCurYear, iMonthNum, i); + m_rtWeekNum.Set(fHStartPos, fVStartPos + m_fDateCellHei * iTemp, m_fWeekNumWid, m_fDateCellHei); + wsWeekNum.Format(FX_LPCWSTR(L"%d"), iWeekNum); + params.m_wsText = wsWeekNum; + params.m_rtPart = m_rtWeekNum; + pTheme->DrawText(¶ms); + } +} +void CFWL_MonthCalendarImp::DrawWeekNumberSep(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix) +{ + CFWL_ThemeBackground params; + params.m_pWidget = m_pInterface; + params.m_iPart = FWL_PART_MCD_WeekNumSep; + params.m_pGraphics = pGraphics; + params.m_dwStates = FWL_PARTSTATE_MCD_Normal; + params.m_rtPart = m_rtWeekNumSep; + if (pMatrix) { + params.m_matrix.Concat(*pMatrix); + } + pTheme->DrawBackground(¶ms); +} +void CFWL_MonthCalendarImp::DrawToday(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix) +{ + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_NoToday) { + return; + } + CFWL_ThemeText params; + params.m_pWidget = m_pInterface; + params.m_iPart = FWL_PART_MCD_Today; + params.m_pGraphics = pGraphics; + params.m_dwStates = FWL_PARTSTATE_MCD_Normal; + params.m_iTTOAlign = FDE_TTOALIGNMENT_CenterLeft; + CFX_WideString *wsDay = NULL; + wsDay = (CFX_WideString *)pTheme->GetCapacity(¶ms, FWL_MCCAPACITY_Today); + CFX_WideString wsText; + GetTodayText(m_iYear, m_iMonth, m_iDay, wsText); + params.m_wsText = *wsDay + wsText; + m_szToday = CalcTextSize(params.m_wsText, m_pProperties->m_pThemeProvider); + CalcTodaySize(); + params.m_rtPart = m_rtToday; + params.m_dwTTOStyles = FDE_TTOSTYLE_SingleLine; + if (pMatrix) { + params.m_matrix.Concat(*pMatrix); + } + pTheme->DrawText(¶ms); +} +void CFWL_MonthCalendarImp::DrawDatesIn(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix) +{ + CFWL_ThemeText params; + params.m_pWidget = m_pInterface; + params.m_iPart = FWL_PART_MCD_DatesIn; + params.m_pGraphics = pGraphics; + params.m_dwStates = FWL_PARTSTATE_MCD_Normal; + params.m_iTTOAlign = FDE_TTOALIGNMENT_Center; + if (pMatrix) { + params.m_matrix.Concat(*pMatrix); + } + FX_INT32 iCount = m_arrDates.GetSize(); + for (FX_INT32 j = 0; j < iCount; j ++) { + LPDATEINFO pDataInfo = (LPDATEINFO)m_arrDates.GetAt(j); + params.m_wsText = pDataInfo->wsDay; + params.m_rtPart = pDataInfo->rect; + params.m_dwStates = pDataInfo->dwStates; + if (j + 1 == m_iHovered) { + params.m_dwStates |= FWL_PARTSTATE_MCD_Hovered; + } + params.m_dwTTOStyles = FDE_TTOSTYLE_SingleLine; + pTheme->DrawText(¶ms); + } +} +void CFWL_MonthCalendarImp::DrawDatesOut(CFX_Graphics *pGraphics, IFWL_ThemeProvider* pTheme, const CFX_Matrix *pMatrix) +{ + CFWL_ThemeText params; + params.m_pWidget = m_pInterface; + params.m_iPart = FWL_PART_MCD_DatesOut; + params.m_pGraphics = pGraphics; + params.m_dwStates = FWL_PARTSTATE_MCD_Normal; + params.m_iTTOAlign = FDE_TTOALIGNMENT_Center; + if (pMatrix) { + params.m_matrix.Concat(*pMatrix); + } + pTheme->DrawText(¶ms); +} +void CFWL_MonthCalendarImp::DrawDatesInCircle(CFX_Graphics *pGraphics, IFWL_ThemeProvider* pTheme, const CFX_Matrix *pMatrix) +{ + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_NoTodayCircle) { + return; + } + if (m_iMonth != m_iCurMonth || m_iYear != m_iCurYear) { + return; + } + if (m_iDay < 1 || m_iDay > m_arrDates.GetSize()) { + return; + } + LPDATEINFO pDate = (LPDATEINFO)m_arrDates[m_iDay - 1]; + _FWL_RETURN_IF_FAIL(pDate); + CFWL_ThemeBackground params; + params.m_pWidget = m_pInterface; + params.m_iPart = FWL_PART_MCD_DateInCircle; + params.m_pGraphics = pGraphics; + params.m_rtPart = pDate->rect; + params.m_dwStates = FWL_PARTSTATE_MCD_Normal; + if (pMatrix) { + params.m_matrix.Concat(*pMatrix); + } + pTheme->DrawBackground(¶ms); +} +void CFWL_MonthCalendarImp::DrawTodayCircle(CFX_Graphics *pGraphics, IFWL_ThemeProvider* pTheme, const CFX_Matrix *pMatrix) +{ + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_NoToday) { + return; + } + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_NoTodayCircle) { + return; + } + CFWL_ThemeBackground params; + params.m_pWidget = m_pInterface; + params.m_iPart = FWL_PART_MCD_TodayCircle; + params.m_pGraphics = pGraphics; + params.m_dwStates = FWL_PARTSTATE_MCD_Normal; + params.m_rtPart = m_rtTodayFlag; + if (pMatrix) { + params.m_matrix.Concat(*pMatrix); + } + pTheme->DrawBackground(¶ms); +} +CFX_SizeF CFWL_MonthCalendarImp::CalcSize(FX_BOOL bAutoSize) +{ + CFX_SizeF fs; + fs.Set(0, 0); + _FWL_RETURN_VALUE_IF_FAIL(m_pProperties->m_pThemeProvider, fs); + if (bAutoSize) { + CFWL_ThemePart params; + params.m_pWidget = m_pInterface; + IFWL_ThemeProvider *pTheme = m_pProperties->m_pThemeProvider; + CFX_WideString *wsText = NULL; + FX_FLOAT fMaxWeekW = 0.0f; + FX_FLOAT fMaxWeekH = 0.0f; + for (FX_DWORD week = FWL_MCCAPACITY_Sun; week <= FWL_MCCAPACITY_Sat; week++) { + wsText = (CFX_WideString *)pTheme->GetCapacity(¶ms, week); + CFX_SizeF sz = CalcTextSize(*wsText, m_pProperties->m_pThemeProvider); + fMaxWeekW = (fMaxWeekW >= sz.x) ? fMaxWeekW : sz.x; + fMaxWeekH = (fMaxWeekH >= sz.y) ? fMaxWeekH : sz.y; + } + FX_FLOAT fDayMaxW = 0.0f; + FX_FLOAT fDayMaxH = 0.0f; + for (int day = 10; day <= 31; day++) { + CFX_WideString wsDay; + wsDay.Format((FX_LPCWSTR)L"%d", day); + CFX_SizeF sz = CalcTextSize(wsDay, m_pProperties->m_pThemeProvider); + fDayMaxW = (fDayMaxW >= sz.x) ? fDayMaxW : sz.x; + fDayMaxH = (fDayMaxH >= sz.y) ? fDayMaxH : sz.y; + } + m_szCell.x = FX_FLOAT((fMaxWeekW >= fDayMaxW) ? (int)(fMaxWeekW + 0.5) : (int)(fDayMaxW + 0.5)); + m_szCell.y = (fMaxWeekH >= fDayMaxH) ? fMaxWeekH : fDayMaxH; + fs.x = m_szCell.x * MONTHCAL_COLUMNS + MONTHCAL_HMARGIN * MONTHCAL_COLUMNS * 2 + MONTHCAL_HEADER_BTN_HMARGIN * 2; + FX_FLOAT fMonthMaxW = 0.0f; + FX_FLOAT fMonthMaxH = 0.0f; + for (FX_DWORD month = FWL_MCCAPACITY_January; month <= FWL_MCCAPACITY_December; month++) { + wsText = (CFX_WideString *)pTheme->GetCapacity(¶ms, month); + CFX_SizeF sz = CalcTextSize(*wsText, m_pProperties->m_pThemeProvider); + fMonthMaxW = (fMonthMaxW >= sz.x) ? fMonthMaxW : sz.x; + fMonthMaxH = (fMonthMaxH >= sz.y) ? fMonthMaxH : sz.y; + } + CFX_WideString wsYear; + GetHeadText(m_iYear, m_iMonth, wsYear); + CFX_SizeF szYear = CalcTextSize(wsYear, m_pProperties->m_pThemeProvider); + fMonthMaxH = (fMonthMaxH >= szYear.y) ? fMonthMaxH : szYear.y; + m_szHead.Set(fMonthMaxW + szYear.x, fMonthMaxH); + fMonthMaxW = m_szHead.x + MONTHCAL_HEADER_BTN_HMARGIN * 2 + m_szCell.x * 2; + fs.x = (fs.x >= fMonthMaxW) ? fs.x : fMonthMaxW; + CFX_WideString wsToday; + GetTodayText(m_iYear, m_iMonth, m_iDay, wsToday); + wsText = (CFX_WideString *)pTheme->GetCapacity(¶ms, FWL_MCCAPACITY_Today); + m_wsToday = *wsText + wsToday; + m_szToday = CalcTextSize(wsToday, m_pProperties->m_pThemeProvider); + m_szToday.y = (m_szToday.y >= m_szCell.y) ? m_szToday.y : m_szCell.y; + fs.y = m_szCell.x + m_szCell.y * (MONTHCAL_ROWS - 2) + m_szToday.y + MONTHCAL_VMARGIN * MONTHCAL_ROWS * 2 + MONTHCAL_HEADER_BTN_VMARGIN * 4; + } else { + GetClientRect(m_rtClient); + fs.Set(m_rtClient.width, m_rtClient.height); + } + return fs; +} +void CFWL_MonthCalendarImp::CalcHeadSize() +{ + FX_FLOAT fHeadHMargin = (m_rtClient.width - m_szHead.x) / 2; + FX_FLOAT fHeadVMargin = (m_szCell.x - m_szHead.y) / 2; + m_rtHeadText.Set(m_rtClient.left + fHeadHMargin, + m_rtClient.top + MONTHCAL_HEADER_BTN_VMARGIN + MONTHCAL_VMARGIN + fHeadVMargin, + m_szHead.x, + m_szHead.y); +} +void CFWL_MonthCalendarImp::CalcTodaySize() +{ + m_rtTodayFlag.Set(m_rtClient.left + MONTHCAL_HEADER_BTN_HMARGIN + MONTHCAL_HMARGIN, + m_rtDates.bottom() + MONTHCAL_HEADER_BTN_VMARGIN + MONTHCAL_VMARGIN, + m_szCell.x, + m_szToday.y); + m_rtToday.Set(m_rtClient.left + MONTHCAL_HEADER_BTN_HMARGIN + m_szCell.x + MONTHCAL_HMARGIN * 2 , + m_rtDates.bottom() + MONTHCAL_HEADER_BTN_VMARGIN + MONTHCAL_VMARGIN, + m_szToday.x, + m_szToday.y); +} +void CFWL_MonthCalendarImp::LayOut() +{ + GetClientRect(m_rtClient); + { + m_rtHead.Set(m_rtClient.left + MONTHCAL_HEADER_BTN_HMARGIN, + m_rtClient.top, + m_rtClient.width - MONTHCAL_HEADER_BTN_HMARGIN * 2, + m_szCell.x + (MONTHCAL_HEADER_BTN_VMARGIN + MONTHCAL_VMARGIN) * 2); + m_rtWeek.Set(m_rtClient.left + MONTHCAL_HEADER_BTN_HMARGIN, + m_rtHead.bottom(), + m_rtClient.width - MONTHCAL_HEADER_BTN_HMARGIN * 2, + m_szCell.y + MONTHCAL_VMARGIN * 2); + m_rtLBtn.Set(m_rtClient.left + MONTHCAL_HEADER_BTN_HMARGIN, + m_rtClient.top + MONTHCAL_HEADER_BTN_VMARGIN, + m_szCell.x, + m_szCell.x); + m_rtRBtn.Set(m_rtClient.left + m_rtClient.width - MONTHCAL_HEADER_BTN_HMARGIN - m_szCell.x, + m_rtClient.top + MONTHCAL_HEADER_BTN_VMARGIN, + m_szCell.x, + m_szCell.x); + m_rtHSep.Set(m_rtClient.left + MONTHCAL_HEADER_BTN_HMARGIN + MONTHCAL_HMARGIN, + m_rtWeek.bottom() - MONTHCAL_VMARGIN, + m_rtClient.width - (MONTHCAL_HEADER_BTN_HMARGIN + MONTHCAL_HMARGIN) * 2, + MONTHCAL_HSEP_HEIGHT); + m_rtDates.Set(m_rtClient.left + MONTHCAL_HEADER_BTN_HMARGIN, + m_rtWeek.bottom(), + m_rtClient.width - MONTHCAL_HEADER_BTN_HMARGIN * 2, + m_szCell.y * (MONTHCAL_ROWS - 3) + MONTHCAL_VMARGIN * (MONTHCAL_ROWS - 3) * 2); + } + CalDateItem(); +} +void CFWL_MonthCalendarImp::CalDateItem() +{ + FX_BOOL bNewWeek = FALSE; + FX_INT32 iWeekOfMonth = 0; + FX_FLOAT fLeft = m_rtDates.left; + FX_FLOAT fTop = m_rtDates.top; + FX_INT32 iCount = m_arrDates.GetSize(); + for (FX_INT32 i = 0; i < iCount; i ++) { + LPDATEINFO pDateInfo = (LPDATEINFO)m_arrDates.GetAt(i); + if (bNewWeek) { + iWeekOfMonth ++; + bNewWeek = FALSE; + } + pDateInfo->rect.Set(fLeft + pDateInfo->iDayOfWeek * (m_szCell.x + (MONTHCAL_HMARGIN * 2)), + fTop + iWeekOfMonth * (m_szCell.y + (MONTHCAL_VMARGIN * 2)), + m_szCell.x + (MONTHCAL_HMARGIN * 2), + m_szCell.y + (MONTHCAL_VMARGIN * 2)); + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_WeekNumbers) { + pDateInfo->rect.Offset(m_fWeekNumWid, 0); + } + if (pDateInfo->iDayOfWeek >= 6) { + bNewWeek = TRUE; + } + } +} +void CFWL_MonthCalendarImp::GetCapValue() +{ + if (!m_pProperties->m_pThemeProvider) { + m_pProperties->m_pThemeProvider = GetAvailableTheme(); + } + IFWL_ThemeProvider *pTheme = m_pProperties->m_pThemeProvider; + CFWL_ThemePart part; + part.m_pWidget = m_pInterface; + m_fHeadWid = *(FX_FLOAT*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEADER_WIDTH); + m_fHeadHei = *(FX_FLOAT*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEADER_Height); + m_fHeadBtnWid = *(FX_FLOAT*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEADER_BTN_WIDTH); + m_fHeadBtnHei = *(FX_FLOAT*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEADER_BTN_HEIGHT); + m_fHeadBtnHMargin = *(FX_FLOAT*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEADER_BTN_HMARGIN); + m_fHeadBtnVMargin = *(FX_FLOAT*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEADER_BTN_VMARGIN); + m_fHeadTextWid = *(FX_FLOAT*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEADER_TEXTWIDHT); + m_fHeadTextHei = *(FX_FLOAT*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEADER_TEXTHEIGHT); + m_fHeadTextHMargin = *(FX_FLOAT*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEADER_TEXT_HMARGIN); + m_fHeadTextVMargin = *(FX_FLOAT*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEADER_TEXT_VMARGIN); + m_fHSepWid = *(FX_FLOAT*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HSEP_WIDTH); + m_fHSepHei = *(FX_FLOAT*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HSEP_HEIGHT); + m_fWeekNumWid = *(FX_FLOAT*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_WEEKNUM_WIDTH); + m_fSepDOffset = *(FX_FLOAT*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_SEP_DOFFSET); + m_fSepX = *(FX_FLOAT*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_SEP_X); + m_fSepY = *(FX_FLOAT*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_SEP_Y); + m_fWeekNumHeigh = *(FX_FLOAT*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_WEEKNUM_HEIGHT); + m_fWeekWid = *(FX_FLOAT*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_WEEK_WIDTH); + m_fWeekHei = *(FX_FLOAT*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_WEEK_HEIGHT); + m_fDateCellWid = *(FX_FLOAT*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_DATES_CELL_WIDTH); + m_fDateCellHei = *(FX_FLOAT*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_DATES_CELL_HEIGHT); + m_fTodayWid = *(FX_FLOAT*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_TODAY_WIDHT); + m_fTodayHei = *(FX_FLOAT*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_TODAY_HEIGHT); + m_fTodayFlagWid = *(FX_FLOAT*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_TODAY_FLAG_WIDHT); + m_fMCWid = *(FX_FLOAT*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_WIDTH); + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_WeekNumbers) { + m_fMCWid += m_fWeekNumWid; + } + m_fMCHei = *(FX_FLOAT*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEIGHT); +} +FX_INT32 CFWL_MonthCalendarImp::CalWeekNumber(FX_INT32 iYear, FX_INT32 iMonth, FX_INT32 iDay) +{ + return 0; +} +FX_BOOL CFWL_MonthCalendarImp::GetMinDate(FX_INT32 &iYear, FX_INT32 &iMonth, FX_INT32 &iDay) +{ + iYear = m_dtMin.iYear; + iMonth = m_dtMin.iMonth; + iDay = m_dtMin.iDay; + return TRUE; +} +FX_BOOL CFWL_MonthCalendarImp::SetMinDate(FX_INT32 iYear, FX_INT32 iMonth, FX_INT32 iDay) +{ + m_dtMin = DATE(iYear, iMonth, iDay); + return TRUE; +} +FX_BOOL CFWL_MonthCalendarImp::GetMaxDate(FX_INT32 &iYear, FX_INT32 &iMonth, FX_INT32 &iDay) +{ + iYear = m_dtMax.iYear; + iMonth = m_dtMax.iMonth; + iDay = m_dtMax.iDay; + return TRUE; +} +FX_BOOL CFWL_MonthCalendarImp::SetMaxDate(FX_INT32 iYear, FX_INT32 iMonth, FX_INT32 iDay) +{ + m_dtMax = DATE(iYear, iMonth, iDay); + return TRUE; +} +FX_BOOL CFWL_MonthCalendarImp::InitDate() +{ + if (m_pProperties->m_pDataProvider) { + IFWL_MonthCalendarDP *pDateProv = (IFWL_MonthCalendarDP*)(m_pProperties->m_pDataProvider); + m_iYear = pDateProv->GetCurYear(m_pInterface); + m_iMonth = pDateProv->GetCurMonth(m_pInterface); + m_iDay = pDateProv->GetCurDay(m_pInterface); + m_iCurYear = m_iYear; + m_iCurMonth = m_iMonth; + } else { + m_iDay = 1; + m_iMonth = 1; + m_iYear = 1; + m_iCurYear = m_iYear; + m_iCurMonth = m_iMonth; + } + GetTodayText(m_iYear, m_iMonth, m_iDay, m_wsToday); + GetHeadText(m_iCurYear, m_iCurMonth, m_wsHead); + { + m_dtMin = DATE(1500, 12, 1); + m_dtMax = DATE(2200, 1, 1); + } + return TRUE; +} +void CFWL_MonthCalendarImp::ClearDateItem() +{ + FX_INT32 iCount = m_arrDates.GetSize(); + for (FX_INT32 i = 0; i < iCount; i ++) { + LPDATEINFO pData = (LPDATEINFO)m_arrDates.GetAt(i); + delete pData; + } + m_arrDates.RemoveAll(); +} +void CFWL_MonthCalendarImp::ReSetDateItem() +{ + m_pDateTime->Set(m_iCurYear, m_iCurMonth, 1); + FX_INT32 iDays = FX_DaysInMonth(m_iCurYear, m_iCurMonth); + FX_INT32 iDayOfWeek = m_pDateTime->GetDayOfWeek(); + for (FX_INT32 i = 0; i < iDays; i ++) { + if (iDayOfWeek >= 7) { + iDayOfWeek = 0; + } + CFX_WideString wsDay; + wsDay.Format(FX_LPCWSTR(L"%d"), i + 1); + FX_DWORD dwStates = 0; + if (m_iYear == m_iCurYear && m_iMonth == m_iCurMonth && m_iDay == (i + 1)) { + dwStates |= FWL_ITEMSTATE_MCD_Flag; + } + if (m_arrSelDays.Find(i + 1) != -1) { + dwStates |= FWL_ITEMSTATE_MCD_Selected; + } + CFX_RectF rtDate; + rtDate.Set(0, 0, 0, 0); + LPDATEINFO pData = new DATEINFO(i + 1, iDayOfWeek, dwStates, rtDate, wsDay); + m_arrDates.Add(pData); + iDayOfWeek++; + } +} +FX_BOOL CFWL_MonthCalendarImp::NextMonth() +{ + FX_INT32 iYear = m_iCurYear, iMonth = m_iCurMonth; + if (iMonth >= 12) { + iMonth = 1; + iYear++; + } else { + iMonth ++; + } + DATE dt(m_iCurYear, m_iCurMonth, 1); + if (!(dt < m_dtMax)) { + return FALSE; + } + m_iCurYear = iYear, m_iCurMonth = iMonth; + ChangeToMonth(m_iCurYear, m_iCurMonth); + return TRUE; +} +FX_BOOL CFWL_MonthCalendarImp::PrevMonth() +{ + FX_INT32 iYear = m_iCurYear, iMonth = m_iCurMonth; + if (iMonth <= 1) { + iMonth = 12; + iYear --; + } else { + iMonth --; + } + DATE dt(m_iCurYear, m_iCurMonth, 1); + if (!(dt > m_dtMin)) { + return FALSE; + } + m_iCurYear = iYear, m_iCurMonth = iMonth; + ChangeToMonth(m_iCurYear, m_iCurMonth); + return TRUE; +} +void CFWL_MonthCalendarImp::ChangeToMonth(FX_INT32 iYear, FX_INT32 iMonth) +{ + m_iCurYear = iYear; + m_iCurMonth = iMonth; + m_iHovered = -1; + ClearDateItem(); + ReSetDateItem(); + CalDateItem(); + GetHeadText(m_iCurYear, m_iCurMonth, m_wsHead); +} +FX_BOOL CFWL_MonthCalendarImp::RemoveSelDay(FX_INT32 iDay, FX_BOOL bAll) +{ + if (iDay == -1 && !bAll) { + return FALSE; + } + if (bAll) { + FX_INT32 iCount = m_arrSelDays.GetSize(); + FX_INT32 iDatesCount = m_arrDates.GetSize(); + for (FX_INT32 i = 0; i < iCount; i ++) { + FX_INT32 iSelDay = m_arrSelDays.GetAt(i); + if (iSelDay <= iDatesCount) { + LPDATEINFO pDateInfo = (LPDATEINFO)m_arrDates.GetAt(iSelDay - 1); + pDateInfo->dwStates &= ~FWL_ITEMSTATE_MCD_Selected; + } + } + m_arrSelDays.RemoveAll(); + } else { + FX_INT32 index = m_arrSelDays.Find(iDay); + if (index == -1) { + return FALSE; + } + FX_INT32 iSelDay = m_arrSelDays.GetAt(iDay); + FX_INT32 iDatesCount = m_arrDates.GetSize(); + if (iSelDay <= iDatesCount) { + LPDATEINFO pDateInfo = (LPDATEINFO)m_arrDates.GetAt(iSelDay - 1); + pDateInfo->dwStates &= ~FWL_ITEMSTATE_MCD_Selected; + } + m_arrSelDays.RemoveAt(index); + } + return TRUE; +} +FX_BOOL CFWL_MonthCalendarImp::AddSelDay(FX_INT32 iDay) +{ + FXSYS_assert(iDay > 0); + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_MultiSelect) { + } else { + if (m_arrSelDays.Find(iDay) == -1) { + RemoveSelDay(-1, TRUE); + if (iDay <= m_arrDates.GetSize()) { + LPDATEINFO pDateInfo = (LPDATEINFO)m_arrDates.GetAt(iDay - 1); + pDateInfo->dwStates |= FWL_ITEMSTATE_MCD_Selected; + } + m_arrSelDays.Add(iDay); + } + } + return TRUE; +} +FX_BOOL CFWL_MonthCalendarImp::JumpToToday() +{ + if (m_iYear != m_iCurYear || m_iMonth != m_iCurMonth) { + m_iCurYear = m_iYear; + m_iCurMonth = m_iMonth; + ChangeToMonth(m_iYear, m_iMonth); + AddSelDay(m_iDay); + } else { + if (m_arrSelDays.Find(m_iDay) == -1) { + AddSelDay(m_iDay); + } + } + return TRUE; +} +void CFWL_MonthCalendarImp::GetHeadText(FX_INT32 iYear, FX_INT32 iMonth, CFX_WideString &wsHead) +{ + FXSYS_assert(iMonth > 0 && iMonth < 13); + static FX_LPWSTR pMonth[] = { + FX_LPWSTR(L"January"), + FX_LPWSTR(L"February"), + FX_LPWSTR(L"March"), + FX_LPWSTR(L"April"), + FX_LPWSTR(L"May"), + FX_LPWSTR(L"June"), + FX_LPWSTR(L"July"), + FX_LPWSTR(L"August"), + FX_LPWSTR(L"September"), + FX_LPWSTR(L"October"), + FX_LPWSTR(L"November"), + FX_LPWSTR(L"December") + }; + wsHead.Format(FX_LPCWSTR(L"%s, %d"), pMonth[iMonth - 1], iYear); +} +void CFWL_MonthCalendarImp::GetTodayText(FX_INT32 iYear, FX_INT32 iMonth, FX_INT32 iDay, CFX_WideString &wsToday) +{ + wsToday.Format(FX_LPCWSTR(L", %d/%d/%d"), iDay, iMonth, iYear); +} +FX_INT32 CFWL_MonthCalendarImp::GetDayAtPoint(FX_FLOAT x, FX_FLOAT y) +{ + FX_INT32 iCount = m_arrDates.GetSize(); + for (FX_INT32 i = 0; i < iCount; i++) { + LPDATEINFO pDateInfo = (LPDATEINFO)m_arrDates.GetAt(i); + if (pDateInfo->rect.Contains(x, y)) { + return ++i; + } + } + return -1; +} +FX_BOOL CFWL_MonthCalendarImp::GetDayRect(FX_INT32 iDay, CFX_RectF &rtDay) +{ + if (iDay <= 0 || iDay > m_arrDates.GetSize()) { + return FALSE; + } + LPDATEINFO pDateInfo = (LPDATEINFO)m_arrDates[iDay - 1]; + _FWL_RETURN_VALUE_IF_FAIL(pDateInfo, FALSE); + rtDay = pDateInfo->rect; + return TRUE; +} +CFWL_MonthCalendarImpDelegate::CFWL_MonthCalendarImpDelegate(CFWL_MonthCalendarImp *pOwner) + : m_pOwner(pOwner) +{ +} +FX_INT32 CFWL_MonthCalendarImpDelegate::OnProcessMessage(CFWL_Message *pMessage) +{ + _FWL_RETURN_VALUE_IF_FAIL(pMessage, 0); + FX_DWORD dwMsgCode = pMessage->GetClassID(); + FX_INT32 iRet = 1; + switch (dwMsgCode) { + case FWL_MSGHASH_SetFocus: + case FWL_MSGHASH_KillFocus: { + OnFocusChanged(pMessage, dwMsgCode == FWL_MSGHASH_SetFocus); + break; + } + case FWL_MSGHASH_Key: { + break; + } + case FWL_MSGHASH_Mouse: { + CFWL_MsgMouse* pMouse = (CFWL_MsgMouse*)pMessage; + FX_DWORD dwCmd = pMouse->m_dwCmd; + switch(dwCmd) { + case FWL_MSGMOUSECMD_LButtonDown: { + OnLButtonDown(pMouse); + break; + } + case FWL_MSGMOUSECMD_LButtonUp: { + OnLButtonUp(pMouse); + break; + } + case FWL_MSGMOUSECMD_MouseMove: { + OnMouseMove((CFWL_MsgMouse*)pMouse); + break; + } + case FWL_MSGMOUSECMD_MouseLeave: { + OnMouseLeave((CFWL_MsgMouse*)pMouse); + break; + } + default: { + break; + } + } + break; + } + default: { + iRet = 0; + break; + } + } + CFWL_WidgetImpDelegate::OnProcessMessage(pMessage); + return iRet; +} +FWL_ERR CFWL_MonthCalendarImpDelegate::OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix) +{ + return m_pOwner->DrawWidget(pGraphics, pMatrix); +} +void CFWL_MonthCalendarImpDelegate::OnActivate(CFWL_Message *pMsg) +{ + return; +} +void CFWL_MonthCalendarImpDelegate::OnFocusChanged(CFWL_Message *pMsg, FX_BOOL bSet) +{ + if (bSet) { + m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused; + } else { + m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused; + } + m_pOwner->Repaint(&m_pOwner->m_rtClient); +} +void CFWL_MonthCalendarImpDelegate::OnLButtonDown(CFWL_MsgMouse *pMsg) +{ + if (m_pOwner->m_rtLBtn.Contains(pMsg->m_fx, pMsg->m_fy)) { + m_pOwner->m_iLBtnPartStates = FWL_PARTSTATE_MCD_Pressed; + m_pOwner->PrevMonth(); + m_pOwner->Repaint(&m_pOwner->m_rtClient); + } else if (m_pOwner->m_rtRBtn.Contains(pMsg->m_fx, pMsg->m_fy)) { + m_pOwner->m_iRBtnPartStates |= FWL_PARTSTATE_MCD_Pressed; + m_pOwner->NextMonth(); + m_pOwner->Repaint(&m_pOwner->m_rtClient); + } else if (m_pOwner->m_rtToday.Contains(pMsg->m_fx, pMsg->m_fy)) { + if ((m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_NoToday ) == 0) { + m_pOwner->JumpToToday(); + m_pOwner->Repaint(&m_pOwner->m_rtClient); + } + } else { + if (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_MultiSelect) { + } else { + FX_INT32 iOldSel = 0; + if (m_pOwner->m_arrSelDays.GetSize() > 0) { + iOldSel = m_pOwner->m_arrSelDays[0]; + } else { + return; + } + FX_INT32 iCurSel = m_pOwner->GetDayAtPoint(pMsg->m_fx, pMsg->m_fy); + FX_BOOL bSelChanged = iCurSel > 0 && iCurSel != iOldSel; + if (bSelChanged) { + LPDATEINFO lpDatesInfo = (LPDATEINFO)m_pOwner->m_arrDates.GetAt(iCurSel - 1); + CFX_RectF rtInvalidate(lpDatesInfo->rect); + if (iOldSel > 0) { + lpDatesInfo = (LPDATEINFO)m_pOwner->m_arrDates.GetAt(iOldSel - 1); + rtInvalidate.Union(lpDatesInfo->rect); + } + m_pOwner->AddSelDay(iCurSel); + CFWL_EvtClick wmClick; + wmClick.m_pSrcTarget = m_pOwner->m_pInterface; + m_pOwner->DispatchEvent(&wmClick); + CFWL_EventMcdDateChanged wmDateSelected; + wmDateSelected.m_iStartDay = iCurSel; + wmDateSelected.m_iEndDay = iCurSel; + wmDateSelected.m_iOldMonth = m_pOwner->m_iCurMonth; + wmDateSelected.m_iOldYear = m_pOwner->m_iCurYear; + wmDateSelected.m_pSrcTarget = (IFWL_MonthCalendar *)m_pOwner->m_pInterface; + m_pOwner->DispatchEvent(&wmDateSelected); + m_pOwner->Repaint(&rtInvalidate); + } + } + } +} +void CFWL_MonthCalendarImpDelegate::OnLButtonUp(CFWL_MsgMouse *pMsg) +{ + if (m_pOwner->m_rtLBtn.Contains(pMsg->m_fx, pMsg->m_fy)) { + m_pOwner->m_iLBtnPartStates = 0; + m_pOwner->Repaint(&m_pOwner->m_rtLBtn); + } else if (m_pOwner->m_rtRBtn.Contains(pMsg->m_fx, pMsg->m_fy)) { + m_pOwner->m_iRBtnPartStates = 0; + m_pOwner->Repaint(&m_pOwner->m_rtRBtn); + } else if (m_pOwner->m_rtDates.Contains(pMsg->m_fx, pMsg->m_fy)) { + FX_INT32 iDay = m_pOwner->GetDayAtPoint(pMsg->m_fx, pMsg->m_fy); + if (iDay != -1) { + m_pOwner->AddSelDay(iDay); + } + } +} +void CFWL_MonthCalendarImpDelegate::OnMouseMove(CFWL_MsgMouse *pMsg) +{ + if (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_MultiSelect) { + return; + } + FX_BOOL bRepaint = FALSE; + CFX_RectF rtInvalidate; + rtInvalidate.Set(0, 0, 0, 0); + if (m_pOwner->m_rtDates.Contains(pMsg->m_fx, pMsg->m_fy)) { + FX_INT32 iHover = m_pOwner->GetDayAtPoint(pMsg->m_fx, pMsg->m_fy); + bRepaint = m_pOwner->m_iHovered != iHover; + if (bRepaint) { + if (m_pOwner->m_iHovered > 0) { + m_pOwner->GetDayRect(m_pOwner->m_iHovered, rtInvalidate); + } + if (iHover > 0) { + CFX_RectF rtDay; + m_pOwner->GetDayRect(iHover, rtDay); + if (rtInvalidate.IsEmpty()) { + rtInvalidate = rtDay; + } else { + rtInvalidate.Union(rtDay); + } + } + } + m_pOwner->m_iHovered = iHover; + } else { + bRepaint = m_pOwner->m_iHovered > 0; + if (bRepaint) { + m_pOwner->GetDayRect(m_pOwner->m_iHovered, rtInvalidate); + } + m_pOwner->m_iHovered = -1; + } + if (bRepaint && !rtInvalidate.IsEmpty()) { + m_pOwner->Repaint(&rtInvalidate); + } +} +void CFWL_MonthCalendarImpDelegate::OnMouseLeave(CFWL_MsgMouse *pMsg) +{ + if (m_pOwner->m_iHovered > 0) { + CFX_RectF rtInvalidate; + rtInvalidate.Set(0, 0, 0, 0); + m_pOwner->GetDayRect(m_pOwner->m_iHovered, rtInvalidate); + m_pOwner->m_iHovered = -1; + if (!rtInvalidate.IsEmpty()) { + m_pOwner->Repaint(&rtInvalidate); + } + } +} diff --git a/xfa/src/fwl/src/basewidget/fwl_pictureboximp.cpp b/xfa/src/fwl/src/basewidget/fwl_pictureboximp.cpp new file mode 100644 index 0000000000..03f821518d --- /dev/null +++ b/xfa/src/fwl/src/basewidget/fwl_pictureboximp.cpp @@ -0,0 +1,172 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../core/include/fwl_targetimp.h" +#include "../core/include/fwl_noteimp.h" +#include "../core/include/fwl_widgetimp.h" +#include "include/fwl_pictureboximp.h" +IFWL_PictureBox* IFWL_PictureBox::Create() +{ + return new IFWL_PictureBox; +} +IFWL_PictureBox::IFWL_PictureBox() +{ + m_pData = NULL; +} +IFWL_PictureBox::~IFWL_PictureBox() +{ + if (m_pData) { + delete (CFWL_PictureBoxImp*)m_pData; + m_pData = NULL; + } +} +FWL_ERR IFWL_PictureBox::Initialize(IFWL_Widget *pOuter) +{ + m_pData = FX_NEW CFWL_PictureBoxImp(pOuter); + ((CFWL_PictureBoxImp*)m_pData)->SetInterface(this); + return ((CFWL_PictureBoxImp*)m_pData)->Initialize(); +} +FWL_ERR IFWL_PictureBox::Initialize(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter) +{ + m_pData = FX_NEW CFWL_PictureBoxImp(properties, pOuter); + ((CFWL_PictureBoxImp*)m_pData)->SetInterface(this); + return ((CFWL_PictureBoxImp*)m_pData)->Initialize(); +} +CFWL_PictureBoxImp::CFWL_PictureBoxImp(IFWL_Widget *pOuter ) + : CFWL_WidgetImp(pOuter) + , m_bTop(FALSE) + , m_bVCenter(FALSE) + , m_bButton(FALSE) +{ + m_rtClient.Reset(); + m_rtImage.Reset(); + m_matrix.Reset(); +} +CFWL_PictureBoxImp::CFWL_PictureBoxImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter ) + : CFWL_WidgetImp(properties, pOuter) + , m_bTop(FALSE) + , m_bVCenter(FALSE) + , m_bButton(FALSE) +{ + m_rtClient.Reset(); + m_rtImage.Reset(); + m_matrix.Reset(); +} +CFWL_PictureBoxImp::~CFWL_PictureBoxImp() +{ +} +FWL_ERR CFWL_PictureBoxImp::GetClassName(CFX_WideString &wsClass) const +{ + wsClass = FWL_CLASS_PictureBox; + return FWL_ERR_Succeeded; +} +FX_DWORD CFWL_PictureBoxImp::GetClassID() const +{ + return FWL_CLASSHASH_PictureBox; +} +FWL_ERR CFWL_PictureBoxImp::Initialize() +{ + _FWL_ERR_CHECK_RETURN_VALUE_IF_FAIL(CFWL_WidgetImp::Initialize(), FWL_ERR_Indefinite); + m_pDelegate = (IFWL_WidgetDelegate*) FX_NEW CFWL_PictureBoxImpDelegate(this); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_PictureBoxImp::Finalize() +{ + if ( m_pDelegate) { + delete (CFWL_PictureBoxImpDelegate*)m_pDelegate; + m_pDelegate = NULL; + } + return CFWL_WidgetImp::Finalize(); +} +FWL_ERR CFWL_PictureBoxImp::GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize ) +{ + if (bAutoSize) { + rect.Set(0, 0, 0, 0); + _FWL_RETURN_VALUE_IF_FAIL(m_pProperties->m_pDataProvider, FWL_ERR_Indefinite); + CFX_DIBitmap *pBitmap = ((IFWL_PictureBoxDP*)m_pProperties->m_pDataProvider)->GetPicture(m_pInterface); + if (pBitmap) { + rect.Set(0, 0, (FX_FLOAT)pBitmap->GetWidth(), (FX_FLOAT)pBitmap->GetHeight()); + } + CFWL_WidgetImp::GetWidgetRect(rect, TRUE); + } else { + rect = m_pProperties->m_rtWidget; + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_PictureBoxImp::Update() +{ + if (IsLocked()) { + return FWL_ERR_Succeeded; + } + if (!m_pProperties->m_pThemeProvider) { + m_pProperties->m_pThemeProvider = GetAvailableTheme(); + } + GetClientRect(m_rtClient); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_PictureBoxImp::DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + _FWL_RETURN_VALUE_IF_FAIL(pGraphics, FWL_ERR_Indefinite); + _FWL_RETURN_VALUE_IF_FAIL(m_pProperties->m_pThemeProvider, FWL_ERR_Indefinite); + IFWL_ThemeProvider *pTheme = GetAvailableTheme(); + if (HasBorder()) { + DrawBorder(pGraphics, FWL_PART_PTB_Border, pTheme, pMatrix ); + } + if (HasEdge()) { + DrawEdge(pGraphics, FWL_PART_PTB_Edge, pTheme, pMatrix); + } + DrawBkground(pGraphics, pTheme, pMatrix); + return FWL_ERR_Succeeded; +} +void CFWL_PictureBoxImp::DrawBkground(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix) +{ + _FWL_RETURN_IF_FAIL(m_pProperties->m_pDataProvider); + CFX_DIBitmap *pPicture = ((IFWL_PictureBoxDP*)m_pProperties->m_pDataProvider)->GetPicture(m_pInterface); + CFX_Matrix matrix; + ((IFWL_PictureBoxDP*)m_pProperties->m_pDataProvider)->GetMatrix(m_pInterface, matrix); + if (!pPicture) { + return; + } + matrix.Concat(*pMatrix); + FX_FLOAT fx = (FX_FLOAT)pPicture->GetWidth(); + FX_FLOAT fy = (FX_FLOAT)pPicture->GetHeight(); + if (fx > m_rtClient.width) { + fx = m_rtClient.width; + } + if (fy > m_rtClient.height) { + fy = m_rtClient.height; + } + CFX_PointF pt; + pt.Set((m_rtClient.width - fx) / 2, (m_rtClient.height - fy) / 2); + pGraphics->DrawImage(pPicture, pt, &matrix); +} +FX_BOOL CFWL_PictureBoxImp::VStyle(FX_BOOL dwStyle) +{ + switch(dwStyle & FWL_STYLEEXT_PTB_VAlignMask) { + case FWL_STYLEEXT_PTB_Top: { + return m_bTop = TRUE; + break; + } + case FWL_STYLEEXT_PTB_Vcenter: { + return m_bVCenter = TRUE; + break; + } + case FWL_STYLEEXT_PTB_Bottom: { + return m_bButton = TRUE; + break; + } + } + return FALSE; +} +CFWL_PictureBoxImpDelegate::CFWL_PictureBoxImpDelegate(CFWL_PictureBoxImp *pOwner) + : m_pOwner(pOwner) +{ +} +FWL_ERR CFWL_PictureBoxImpDelegate::OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix) +{ + return m_pOwner->DrawWidget(pGraphics, pMatrix); +} diff --git a/xfa/src/fwl/src/basewidget/fwl_pushbuttonimp.cpp b/xfa/src/fwl/src/basewidget/fwl_pushbuttonimp.cpp new file mode 100644 index 0000000000..b3228e41f2 --- /dev/null +++ b/xfa/src/fwl/src/basewidget/fwl_pushbuttonimp.cpp @@ -0,0 +1,542 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../core/include/fwl_targetimp.h" +#include "../core/include/fwl_noteimp.h" +#include "../core/include/fwl_widgetimp.h" +#include "include/fwl_pushbuttonimp.h" +IFWL_PushButton *IFWL_PushButton::Create() +{ + return new IFWL_PushButton; +} +FWL_ERR IFWL_PushButton::Initialize(IFWL_Widget *pOuter) +{ + m_pData = FX_NEW CFWL_PushButtonImp(pOuter); + ((CFWL_PushButtonImp*)m_pData)->SetInterface(this); + return ((CFWL_PushButtonImp*)m_pData)->Initialize(); +} +FWL_ERR IFWL_PushButton::Initialize(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter) +{ + m_pData = FX_NEW CFWL_PushButtonImp(properties, pOuter); + ((CFWL_PushButtonImp*)m_pData)->SetInterface(this); + return ((CFWL_PushButtonImp*)m_pData)->Initialize(); +} +IFWL_PushButton::IFWL_PushButton() +{ + m_pData = NULL; +} +IFWL_PushButton::~IFWL_PushButton() +{ + if (m_pData) { + delete (CFWL_PushButtonImp*)m_pData; + m_pData = NULL; + } +} +CFWL_PushButtonImp::CFWL_PushButtonImp(IFWL_Widget *pOuter ) + : CFWL_WidgetImp(pOuter) + , m_bBtnDown(FALSE) + , m_dwTTOStyles(FDE_TTOSTYLE_SingleLine) + , m_iTTOAlign(FDE_TTOALIGNMENT_Center) +{ + m_rtClient.Set(0, 0, 0, 0); + m_rtCaption.Set(0, 0, 0, 0); +} +CFWL_PushButtonImp::CFWL_PushButtonImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter ) + : CFWL_WidgetImp(properties, pOuter) + , m_bBtnDown(FALSE) + , m_dwTTOStyles(FDE_TTOSTYLE_SingleLine) + , m_iTTOAlign(FDE_TTOALIGNMENT_Center) +{ + m_rtClient.Set(0, 0, 0, 0); + m_rtCaption.Set(0, 0, 0, 0); +} +CFWL_PushButtonImp::~CFWL_PushButtonImp() +{ +} +FWL_ERR CFWL_PushButtonImp::GetClassName(CFX_WideString &wsClass) const +{ + wsClass = FWL_CLASS_PushButton; + return FWL_ERR_Succeeded; +} +FX_DWORD CFWL_PushButtonImp::GetClassID() const +{ + return FWL_CLASSHASH_PushButton; +} +FWL_ERR CFWL_PushButtonImp::Initialize() +{ + _FWL_ERR_CHECK_RETURN_VALUE_IF_FAIL(CFWL_WidgetImp::Initialize(), FWL_ERR_Indefinite); + m_pDelegate = (IFWL_WidgetDelegate*) FX_NEW CFWL_PushButtonImpDelegate(this); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_PushButtonImp::Finalize() +{ + if( m_pDelegate) { + delete (CFWL_PushButtonImpDelegate*)m_pDelegate; + m_pDelegate = NULL; + } + return CFWL_WidgetImp::Finalize(); +} +FWL_ERR CFWL_PushButtonImp::GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize ) +{ + if (bAutoSize) { + rect.Set(0, 0, 0, 0); + if (m_pProperties->m_pThemeProvider == NULL) { + m_pProperties->m_pThemeProvider = GetAvailableTheme(); + } + CFX_WideString wsCaption; + IFWL_PushButtonDP *pData = (IFWL_PushButtonDP*)m_pProperties->m_pDataProvider; + if (pData) { + pData->GetCaption(m_pInterface, wsCaption); + } + FX_INT32 iLen = wsCaption.GetLength(); + if (iLen > 0) { + CFX_SizeF sz = CalcTextSize(wsCaption, m_pProperties->m_pThemeProvider); + rect.Set(0, 0, sz.x, sz.y); + } + FX_FLOAT *fcaption = (FX_FLOAT*)GetThemeCapacity(FWL_WGTCAPACITY_PSB_Margin); + rect.Inflate(*fcaption, *fcaption); + CFWL_WidgetImp::GetWidgetRect(rect, TRUE); + } else { + rect = m_pProperties->m_rtWidget; + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_PushButtonImp::SetStates(FX_DWORD dwStates, FX_BOOL bSet ) +{ + if ((dwStates & FWL_WGTSTATE_Disabled) && bSet) { + m_pProperties->m_dwStates = FWL_WGTSTATE_Disabled; + return FWL_ERR_Succeeded; + } + return CFWL_WidgetImp::SetStates(dwStates, bSet); +} +FWL_ERR CFWL_PushButtonImp::Update() +{ + if (IsLocked()) { + return FWL_ERR_Indefinite; + } + if (!m_pProperties->m_pThemeProvider) { + m_pProperties->m_pThemeProvider = GetAvailableTheme(); + } + UpdateTextOutStyles(); + GetClientRect(m_rtClient); + m_rtCaption = m_rtClient; + FX_FLOAT *fcaption = (FX_FLOAT*)GetThemeCapacity(FWL_WGTCAPACITY_PSB_Margin); + m_rtCaption.Inflate(-*fcaption, -*fcaption); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_PushButtonImp::DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + _FWL_RETURN_VALUE_IF_FAIL(pGraphics, FWL_ERR_Indefinite); + _FWL_RETURN_VALUE_IF_FAIL(m_pProperties->m_pThemeProvider, FWL_ERR_Indefinite); + IFWL_PushButtonDP *pData = (IFWL_PushButtonDP*)m_pProperties->m_pDataProvider; + CFX_DIBitmap *pPicture = NULL; + IFWL_ThemeProvider *pTheme = m_pProperties->m_pThemeProvider; + if (HasBorder()) { + DrawBorder(pGraphics, FWL_PART_PSB_Border, m_pProperties->m_pThemeProvider, pMatrix); + } + if (HasEdge()) { + DrawEdge(pGraphics, FWL_PART_PSB_Edge, m_pProperties->m_pThemeProvider, pMatrix); + } + DrawBkground(pGraphics, m_pProperties->m_pThemeProvider, pMatrix); + CFX_Matrix matrix; + matrix.Concat(*pMatrix); + FX_FLOAT iPicwidth = 0; + FX_FLOAT ipicheight = 0; + CFX_WideString wsCaption; + if (pData) { + pData->GetCaption(m_pInterface, wsCaption); + } + CFX_RectF rtText; + rtText.Set(0, 0, 0 , 0); + if (!wsCaption.IsEmpty()) { + CalcTextRect(wsCaption, pTheme, 0, m_iTTOAlign, rtText); + } + switch(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_PSB_ModeMask) { + case FWL_STYLEEXT_PSB_TextOnly: + DrawText(pGraphics, m_pProperties->m_pThemeProvider, &matrix); + break; + case FWL_STYLEEXT_PSB_IconOnly: + if (pData) { + pPicture = pData->GetPicture(m_pInterface); + } + if (pPicture) { + CFX_PointF point; + switch(m_iTTOAlign) { + case 0: { + point.x = m_rtClient.left; + point.y = m_rtClient.top; + break; + } + case 1: { + point.x = m_rtClient.left + (m_rtClient.width / 2 - pPicture->GetWidth() / 2); + point.y = m_rtClient.top; + break; + } + case 2: + point.x = m_rtClient.left + m_rtClient.width - pPicture->GetWidth(); + point.y = m_rtClient.top; + break; + case 4: + point.x = m_rtClient.left; + point.y = m_rtClient.top + m_rtClient.height / 2 - pPicture->GetHeight() / 2; + break; + case 5: + point.x = m_rtClient.left + (m_rtClient.width / 2 - pPicture->GetWidth() / 2); + point.y = m_rtClient.top + m_rtClient.height / 2 - pPicture->GetHeight() / 2; + break; + case 6: + point.x = m_rtClient.left + m_rtClient.width - pPicture->GetWidth(); + point.y = m_rtClient.top + m_rtClient.height / 2 - pPicture->GetHeight() / 2; + break; + case 8: + point.x = m_rtClient.left; + point.y = m_rtClient.top + m_rtClient.height - pPicture->GetHeight(); + break; + case 9: + point.x = m_rtClient.left + (m_rtClient.width / 2 - pPicture->GetWidth() / 2); + point.y = m_rtClient.top + m_rtClient.height - pPicture->GetHeight(); + break; + case 10: + point.x = m_rtClient.left + m_rtClient.width - pPicture->GetWidth(); + point.y = m_rtClient.top + m_rtClient.height - pPicture->GetHeight(); + break; + } + pGraphics->DrawImage(pPicture, point, &matrix); + } + break; + case FWL_STYLEEXT_PSB_TextIcon: + if (pPicture) { + CFX_PointF point; + switch(m_iTTOAlign) { + case 0: { + point.x = m_rtClient.left; + point.y = m_rtClient.top; + iPicwidth = (FX_FLOAT)(pPicture->GetWidth() - 7); + ipicheight = pPicture->GetHeight() / 2 - m_rtCaption.top - rtText.height / 2; + break; + } + case 1: { + point.x = m_rtClient.left + (m_rtClient.width / 2 - (pPicture->GetWidth() + rtText.width) / 2); + point.y = m_rtClient.top; + iPicwidth = pPicture->GetWidth() - ((m_rtClient.width) / 2 - rtText.width / 2 - point.x) + rtText.width / 2 - 7; + ipicheight = pPicture->GetHeight() / 2 - m_rtCaption.top - rtText.height / 2; + break; + } + case 2: + point.x = m_rtClient.left + m_rtClient.width - pPicture->GetWidth() - rtText.width; + point.y = m_rtClient.top; + iPicwidth = m_rtClient.left + m_rtClient.width - point.x - pPicture->GetWidth() - rtText.width + 7; + ipicheight = pPicture->GetHeight() / 2 - m_rtCaption.top - rtText.height / 2; + break; + case 4: + point.x = m_rtClient.left; + point.y = m_rtClient.top + m_rtClient.height / 2 - pPicture->GetHeight() / 2; + iPicwidth = m_rtClient.left + pPicture->GetWidth() - 7; + break; + case 5: + point.x = m_rtClient.left + (m_rtClient.width / 2 - (pPicture->GetWidth() + rtText.width) / 2); + point.y = m_rtClient.top + m_rtClient.height / 2 - pPicture->GetHeight() / 2; + iPicwidth = pPicture->GetWidth() - ((m_rtClient.width) / 2 - rtText.width / 2 - point.x) + rtText.width / 2 - 7; + break; + case 6: + point.x = m_rtClient.left + m_rtClient.width - pPicture->GetWidth() - rtText.width; + point.y = m_rtClient.top + m_rtClient.height / 2 - pPicture->GetHeight() / 2; + iPicwidth = m_rtClient.left + m_rtClient.width - point.x - pPicture->GetWidth() - rtText.width + 7; + break; + case 8: + point.x = m_rtClient.left; + point.y = m_rtClient.top + m_rtClient.height - pPicture->GetHeight(); + iPicwidth = (FX_FLOAT)(pPicture->GetWidth() - 7); + ipicheight -= rtText.height / 2; + break; + case 9: + point.x = m_rtClient.left + (m_rtClient.width / 2 - (pPicture->GetWidth() + rtText.width) / 2); + point.y = m_rtClient.top + m_rtClient.height - pPicture->GetHeight(); + iPicwidth = pPicture->GetWidth() - ((m_rtClient.width) / 2 - rtText.width / 2 - point.x) + rtText.width / 2 - 7; + ipicheight -= rtText.height / 2; + break; + case 10: + point.x = m_rtClient.left + m_rtClient.width - pPicture->GetWidth() - rtText.width; + point.y = m_rtClient.top + m_rtClient.height - pPicture->GetHeight(); + iPicwidth = m_rtClient.left + m_rtClient.width - point.x - pPicture->GetWidth() - rtText.width + 7; + ipicheight -= rtText.height / 2; + break; + } + pGraphics->DrawImage(pPicture, point, &matrix); + } + matrix.e += m_rtClient.left + iPicwidth; + matrix.f += m_rtClient.top + ipicheight; + DrawText(pGraphics, m_pProperties->m_pThemeProvider, &matrix); + break; + } + return FWL_ERR_Succeeded; +} +void CFWL_PushButtonImp::DrawBkground(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix) +{ + CFWL_ThemeBackground param; + param.m_pWidget = m_pInterface; + param.m_iPart = FWL_PART_PSB_Background; + param.m_dwStates = GetPartStates(); + param.m_pGraphics = pGraphics; + if (pMatrix) { + param.m_matrix.Concat(*pMatrix); + } + param.m_rtPart = m_rtClient; + if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) { + param.m_pData = &m_rtCaption; + } + pTheme->DrawBackground(¶m); +} +void CFWL_PushButtonImp::DrawText(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix) +{ + _FWL_RETURN_IF_FAIL(m_pProperties->m_pDataProvider); + CFX_WideString wsCaption; + m_pProperties->m_pDataProvider->GetCaption(m_pInterface, wsCaption); + if (wsCaption.IsEmpty()) { + return; + } + CFWL_ThemeText param; + param.m_pWidget = m_pInterface; + param.m_iPart = FWL_PART_PSB_Caption; + param.m_dwStates = GetPartStates(); + param.m_pGraphics = pGraphics; + if (pMatrix) { + param.m_matrix.Concat(*pMatrix); + } + param.m_rtPart = m_rtCaption; + param.m_wsText = wsCaption; + param.m_dwTTOStyles = m_dwTTOStyles; + param.m_iTTOAlign = m_iTTOAlign; + pTheme->DrawText(¶m); +} +FX_DWORD CFWL_PushButtonImp::GetPartStates() +{ + FX_DWORD dwStates = FWL_PARTSTATE_PSB_Normal; + if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) { + dwStates |= FWL_PARTSTATE_PSB_Focused; + } + if (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) { + dwStates = FWL_PARTSTATE_PSB_Disabled; + } else if (m_pProperties->m_dwStates & FWL_STATE_PSB_Pressed) { + dwStates |= FWL_PARTSTATE_PSB_Pressed; + } else if (m_pProperties->m_dwStates & FWL_STATE_PSB_Hovered) { + dwStates |= FWL_PARTSTATE_PSB_Hovered; + } else if (m_pProperties->m_dwStates & FWL_STATE_PSB_Default) { + dwStates |= FWL_PARTSTATE_PSB_Default; + } + return dwStates; +} +void CFWL_PushButtonImp::UpdateTextOutStyles() +{ + m_iTTOAlign = FDE_TTOALIGNMENT_Center; + switch(m_pProperties->m_dwStyleExes & (FWL_STYLEEXT_PSB_HLayoutMask | FWL_STYLEEXT_PSB_VLayoutMask)) { + case FWL_STYLEEXT_PSB_Left | FWL_STYLEEXT_PSB_Top: { + m_iTTOAlign = FDE_TTOALIGNMENT_TopLeft; + break; + } + case FWL_STYLEEXT_PSB_Center | FWL_STYLEEXT_PSB_Top: { + m_iTTOAlign = FDE_TTOALIGNMENT_TopCenter; + break; + } + case FWL_STYLEEXT_PSB_Right | FWL_STYLEEXT_PSB_Top: { + m_iTTOAlign = FDE_TTOALIGNMENT_TopRight; + break; + } + case FWL_STYLEEXT_PSB_Left | FWL_STYLEEXT_PSB_VCenter: { + m_iTTOAlign = FDE_TTOALIGNMENT_CenterLeft; + break; + } + case FWL_STYLEEXT_PSB_Center | FWL_STYLEEXT_PSB_VCenter: { + m_iTTOAlign = FDE_TTOALIGNMENT_Center; + break; + } + case FWL_STYLEEXT_PSB_Right | FWL_STYLEEXT_PSB_VCenter: { + m_iTTOAlign = FDE_TTOALIGNMENT_CenterRight; + break; + } + case FWL_STYLEEXT_PSB_Left | FWL_STYLEEXT_PSB_Bottom: { + m_iTTOAlign = FDE_TTOALIGNMENT_BottomLeft; + break; + } + case FWL_STYLEEXT_PSB_Center | FWL_STYLEEXT_PSB_Bottom: { + m_iTTOAlign = FDE_TTOALIGNMENT_BottomCenter; + break; + } + case FWL_STYLEEXT_PSB_Right | FWL_STYLEEXT_PSB_Bottom: { + m_iTTOAlign = FDE_TTOALIGNMENT_BottomRight; + break; + } + default: { + } + } + m_dwTTOStyles = FDE_TTOSTYLE_SingleLine; + if (m_pProperties->m_dwStyleExes & FWL_WGTSTYLE_RTLReading) { + m_dwTTOStyles |= FDE_TTOSTYLE_RTL; + } +} +CFWL_PushButtonImpDelegate::CFWL_PushButtonImpDelegate(CFWL_PushButtonImp *pOwner) + : m_pOwner(pOwner) +{ +} +FX_INT32 CFWL_PushButtonImpDelegate::OnProcessMessage(CFWL_Message *pMessage) +{ + _FWL_RETURN_VALUE_IF_FAIL(pMessage, 0); + if (!m_pOwner->IsEnabled()) { + return 1; + } + FX_INT32 iRet = 1; + FX_DWORD dwMsgCode = pMessage->GetClassID(); + switch (dwMsgCode) { + case FWL_MSGHASH_SetFocus: + case FWL_MSGHASH_KillFocus: { + OnFocusChanged(pMessage, dwMsgCode == FWL_MSGHASH_SetFocus); + break; + } + case FWL_MSGHASH_Mouse: { + CFWL_MsgMouse *pMsg = (CFWL_MsgMouse*)pMessage; + FX_DWORD dwCmd = pMsg->m_dwCmd; + switch (dwCmd) { + case FWL_MSGMOUSECMD_LButtonDown: { + OnLButtonDown(pMsg); + break; + } + case FWL_MSGMOUSECMD_LButtonUp: { + OnLButtonUp(pMsg); + break; + } + case FWL_MSGMOUSECMD_MouseMove: { + OnMouseMove(pMsg); + break; + } + case FWL_MSGMOUSECMD_MouseLeave: { + OnMouseLeave(pMsg); + break; + } + default: { + } + } + break; + } + case FWL_MSGHASH_Key: { + CFWL_MsgKey *pKey = (CFWL_MsgKey*)pMessage; + if (pKey->m_dwCmd == FWL_MSGKEYCMD_KeyDown) { + OnKeyDown((CFWL_MsgKey*)pKey); + } + break; + } + default: { + iRet = 0; + break; + } + } + CFWL_WidgetImpDelegate::OnProcessMessage(pMessage); + return iRet; +} +FWL_ERR CFWL_PushButtonImpDelegate::OnProcessEvent(CFWL_Event *pEvent) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_PushButtonImpDelegate::OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + return m_pOwner->DrawWidget(pGraphics, pMatrix); +} +void CFWL_PushButtonImpDelegate::OnFocusChanged(CFWL_Message *pMsg, FX_BOOL bSet ) +{ + if (bSet) { + m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused; + } else { + m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused; + } + m_pOwner->Repaint(&m_pOwner->m_rtClient); +} +void CFWL_PushButtonImpDelegate::OnLButtonDown(CFWL_MsgMouse *pMsg) +{ + if ((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0) { + m_pOwner->SetFocus(TRUE); + } + m_pOwner->m_bBtnDown = TRUE; + m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_PSB_Hovered; + m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_PSB_Pressed; + m_pOwner->Repaint(&m_pOwner->m_rtClient); +} +void CFWL_PushButtonImpDelegate::OnLButtonUp(CFWL_MsgMouse *pMsg) +{ + m_pOwner->m_bBtnDown = FALSE; + if (m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) { + m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Pressed; + m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_PSB_Hovered; + } else { + m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Hovered; + m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Pressed; + } + if (m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) { + CFWL_EvtClick wmClick; + wmClick.m_pSrcTarget = (IFWL_PushButton*)m_pOwner->m_pInterface; + m_pOwner->DispatchEvent(&wmClick); + } + m_pOwner->Repaint(&m_pOwner->m_rtClient); +} +void CFWL_PushButtonImpDelegate::OnMouseMove(CFWL_MsgMouse *pMsg) +{ + FX_BOOL bRepaint = FALSE; + if (m_pOwner->m_bBtnDown) { + if (m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) { + if ((m_pOwner->m_pProperties->m_dwStates & FWL_STATE_PSB_Pressed) == 0) { + m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_PSB_Pressed; + bRepaint = TRUE; + } + if (m_pOwner->m_pProperties->m_dwStates & FWL_STATE_PSB_Hovered) { + m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Hovered; + bRepaint = TRUE; + } + } else { + if (m_pOwner->m_pProperties->m_dwStates & FWL_STATE_PSB_Pressed) { + m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Pressed; + bRepaint = TRUE; + } + if ((m_pOwner->m_pProperties->m_dwStates & FWL_STATE_PSB_Hovered) == 0) { + m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_PSB_Hovered; + bRepaint = TRUE; + } + } + } else { + if (!m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) { + return; + } + if ((m_pOwner->m_pProperties->m_dwStates & FWL_STATE_PSB_Hovered) == 0) { + m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_PSB_Hovered; + bRepaint = TRUE; + } + } + if (bRepaint) { + m_pOwner->Repaint(&m_pOwner->m_rtClient); + } +} +void CFWL_PushButtonImpDelegate::OnMouseLeave(CFWL_MsgMouse *pMsg) +{ + m_pOwner->m_bBtnDown = FALSE; + m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Hovered; + m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Pressed; + m_pOwner->Repaint(&m_pOwner->m_rtClient); +} +void CFWL_PushButtonImpDelegate::OnKeyDown(CFWL_MsgKey *pMsg) +{ + if (pMsg->m_dwKeyCode == FWL_VKEY_Return) { + CFWL_EvtMouse wmMouse; + wmMouse.m_pSrcTarget = m_pOwner->m_pInterface; + wmMouse.m_dwCmd = FWL_MSGMOUSECMD_LButtonUp; + m_pOwner->DispatchEvent(&wmMouse); + CFWL_EvtClick wmClick; + wmClick.m_pSrcTarget = (IFWL_PushButton*)m_pOwner->m_pInterface; + m_pOwner->DispatchEvent(&wmClick); + return; + } + if (pMsg->m_dwKeyCode != FWL_VKEY_Tab) { + return; + } + m_pOwner->DispatchKeyEvent(pMsg); +} diff --git a/xfa/src/fwl/src/basewidget/fwl_scrollbarimp.cpp b/xfa/src/fwl/src/basewidget/fwl_scrollbarimp.cpp new file mode 100644 index 0000000000..8162c9d9e8 --- /dev/null +++ b/xfa/src/fwl/src/basewidget/fwl_scrollbarimp.cpp @@ -0,0 +1,852 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../core/include/fwl_targetimp.h" +#include "../core/include/fwl_noteimp.h" +#include "../core/include/fwl_widgetimp.h" +#include "include/fwl_scrollbarimp.h" +#define FWL_SCROLLBAR_Elapse 500 +#define FWL_SCROLLBAR_MinThumb 5 +IFWL_ScrollBar* IFWL_ScrollBar::Create() +{ + return new IFWL_ScrollBar; +} +IFWL_ScrollBar::IFWL_ScrollBar() +{ + m_pData = NULL; +} +IFWL_ScrollBar::~IFWL_ScrollBar() +{ + if (m_pData) { + delete (CFWL_ScrollBarImp*)m_pData; + m_pData = NULL; + } +} +FWL_ERR IFWL_ScrollBar::Initialize(IFWL_Widget *pOuter) +{ + m_pData = FX_NEW CFWL_ScrollBarImp(pOuter); + ((CFWL_ScrollBarImp*)m_pData)->SetInterface(this); + return ((CFWL_ScrollBarImp*)m_pData)->Initialize(); +} +FWL_ERR IFWL_ScrollBar::Initialize(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter) +{ + m_pData = FX_NEW CFWL_ScrollBarImp(properties, pOuter); + ((CFWL_ScrollBarImp*)m_pData)->SetInterface(this); + return ((CFWL_ScrollBarImp*)m_pData)->Initialize(); +} +FX_BOOL IFWL_ScrollBar::IsVertical() +{ + return ((CFWL_ScrollBarImp*)m_pData)->IsVertical(); +} +FWL_ERR IFWL_ScrollBar::GetRange(FX_FLOAT &fMin, FX_FLOAT &fMax) +{ + return ((CFWL_ScrollBarImp*)m_pData)->GetRange(fMin, fMax); +} +FWL_ERR IFWL_ScrollBar::SetRange(FX_FLOAT fMin, FX_FLOAT fMax) +{ + return ((CFWL_ScrollBarImp*)m_pData)->SetRange(fMin, fMax); +} +FX_FLOAT IFWL_ScrollBar::GetPageSize() +{ + return ((CFWL_ScrollBarImp*)m_pData)->GetPageSize(); +} +FWL_ERR IFWL_ScrollBar::SetPageSize(FX_FLOAT fPageSize) +{ + return ((CFWL_ScrollBarImp*)m_pData)->SetPageSize(fPageSize); +} +FX_FLOAT IFWL_ScrollBar::GetStepSize() +{ + return ((CFWL_ScrollBarImp*)m_pData)->GetStepSize(); +} +FWL_ERR IFWL_ScrollBar::SetStepSize(FX_FLOAT fStepSize) +{ + return ((CFWL_ScrollBarImp*)m_pData)->SetStepSize(fStepSize); +} +FX_FLOAT IFWL_ScrollBar::GetPos() +{ + return ((CFWL_ScrollBarImp*)m_pData)->GetPos(); +} +FWL_ERR IFWL_ScrollBar::SetPos(FX_FLOAT fPos) +{ + return ((CFWL_ScrollBarImp*)m_pData)->SetPos(fPos); +} +FX_FLOAT IFWL_ScrollBar::GetTrackPos() +{ + return ((CFWL_ScrollBarImp*)m_pData)->GetTrackPos(); +} +FWL_ERR IFWL_ScrollBar::SetTrackPos(FX_FLOAT fTrackPos) +{ + return ((CFWL_ScrollBarImp*)m_pData)->SetTrackPos(fTrackPos); +} +FX_BOOL IFWL_ScrollBar::DoScroll(FX_DWORD dwCode, FX_FLOAT fPos) +{ + return ((CFWL_ScrollBarImp*)m_pData)->DoScroll(dwCode, fPos); +} +CFWL_ScrollBarImp::CFWL_ScrollBarImp(IFWL_Widget *pOuter ) + : CFWL_WidgetImp(pOuter) + , m_hTimer(NULL) + , m_fRangeMin(0) + , m_fRangeMax(-1) + , m_fPageSize(0) + , m_fStepSize(0) + , m_fPos(0) + , m_fTrackPos(0) + , m_iMinButtonState(FWL_PARTSTATE_SCB_Normal) + , m_iMaxButtonState(FWL_PARTSTATE_SCB_Normal) + , m_iThumbButtonState(FWL_PARTSTATE_SCB_Normal) + , m_fLastTrackPos(0) + , m_cpTrackPointX(0) + , m_cpTrackPointY(0) + , m_iMinTrackState(FWL_PARTSTATE_SCB_Normal) + , m_iMaxTrackState(FWL_PARTSTATE_SCB_Normal) + , m_iMouseWheel(0) + , m_bTrackMouseLeave(FALSE) + , m_bMouseHover(FALSE) + , m_bRepaintThumb(FALSE) + , m_bMouseDown(FALSE) + , m_fButtonLen(0) + , m_bMinSize(FALSE) + , m_bCustomLayout(FALSE) + , m_fMinThumb(FWL_SCROLLBAR_MinThumb) +{ + m_rtClient.Reset(); + m_rtThumb.Reset(); + m_rtMinBtn.Reset(); + m_rtMaxBtn.Reset(); + m_rtMinTrack.Reset(); + m_rtMaxTrack.Reset(); +} +CFWL_ScrollBarImp::CFWL_ScrollBarImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget* pOuter ) + : CFWL_WidgetImp(properties, pOuter) + , m_hTimer(NULL) + , m_fRangeMin(0) + , m_fRangeMax(-1) + , m_fPageSize(0) + , m_fStepSize(0) + , m_fPos(0) + , m_fTrackPos(0) + , m_iMinButtonState(FWL_PARTSTATE_SCB_Normal) + , m_iMaxButtonState(FWL_PARTSTATE_SCB_Normal) + , m_iThumbButtonState(FWL_PARTSTATE_SCB_Normal) + , m_fLastTrackPos(0) + , m_cpTrackPointX(0) + , m_cpTrackPointY(0) + , m_iMinTrackState(FWL_PARTSTATE_SCB_Normal) + , m_iMaxTrackState(FWL_PARTSTATE_SCB_Normal) + , m_iMouseWheel(0) + , m_bTrackMouseLeave(FALSE) + , m_bMouseHover(FALSE) + , m_bRepaintThumb(FALSE) + , m_bMouseDown(FALSE) + , m_fButtonLen(0) + , m_bMinSize(FALSE) + , m_bCustomLayout(FALSE) + , m_fMinThumb(FWL_SCROLLBAR_MinThumb) +{ + m_rtClient.Reset(); + m_rtThumb.Reset(); + m_rtMinBtn.Reset(); + m_rtMaxBtn.Reset(); + m_rtMinTrack.Reset(); + m_rtMaxTrack.Reset(); +} +CFWL_ScrollBarImp::~CFWL_ScrollBarImp() +{ +} +FWL_ERR CFWL_ScrollBarImp::GetClassName(CFX_WideString &wsClass) const +{ + wsClass = FWL_CLASS_ScrollBar; + return FWL_ERR_Succeeded; +} +FX_DWORD CFWL_ScrollBarImp::GetClassID() const +{ + return FWL_CLASSHASH_ScrollBar; +} +FWL_ERR CFWL_ScrollBarImp::Initialize() +{ + _FWL_ERR_CHECK_RETURN_VALUE_IF_FAIL(CFWL_WidgetImp::Initialize(), FWL_ERR_Indefinite); + m_pDelegate = (IFWL_WidgetDelegate*)FX_NEW CFWL_ScrollBarImpDelegate(this); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ScrollBarImp::Finalize() +{ + if ( m_pDelegate) { + delete (CFWL_ScrollBarImpDelegate*)m_pDelegate; + m_pDelegate = NULL; + } + return CFWL_WidgetImp::Finalize(); +} +FWL_ERR CFWL_ScrollBarImp::GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize ) +{ + if (bAutoSize) { + rect.Set(0, 0, 0, 0); + FX_FLOAT *pfMinWidth = (FX_FLOAT*)GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth); + _FWL_RETURN_VALUE_IF_FAIL(pfMinWidth, FWL_ERR_Indefinite); + if (IsVertical()) { + rect.Set(0, 0, (*pfMinWidth), (*pfMinWidth) * 3); + } else { + rect.Set(0, 0, (*pfMinWidth) * 3, (*pfMinWidth)); + } + CFWL_WidgetImp::GetWidgetRect(rect, TRUE); + } else { + rect = m_pProperties->m_rtWidget; + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ScrollBarImp::Update() +{ + if (IsLocked()) { + return FWL_ERR_Indefinite; + } + if (!m_pProperties->m_pThemeProvider) { + m_pProperties->m_pThemeProvider = GetAvailableTheme(); + } + Layout(); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ScrollBarImp::DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + _FWL_RETURN_VALUE_IF_FAIL(pGraphics, FWL_ERR_Indefinite); + _FWL_RETURN_VALUE_IF_FAIL(m_pProperties->m_pThemeProvider, FWL_ERR_Indefinite); + IFWL_ThemeProvider *pTheme = m_pProperties->m_pThemeProvider; + if (HasBorder()) { + DrawBorder(pGraphics, FWL_PART_SCB_Border, pTheme, pMatrix); + } + if (HasEdge()) { + DrawEdge(pGraphics, FWL_PART_SCB_Edge, pTheme, pMatrix); + } + DrawTrack(pGraphics, pTheme, TRUE, pMatrix); + DrawTrack(pGraphics, pTheme, FALSE, pMatrix); + DrawArrowBtn(pGraphics, pTheme, TRUE, pMatrix); + DrawArrowBtn(pGraphics, pTheme, FALSE, pMatrix); + DrawThumb(pGraphics, pTheme, pMatrix); + return FWL_ERR_Succeeded; +} +inline FX_BOOL CFWL_ScrollBarImp::IsVertical() +{ + return m_pProperties->m_dwStyleExes & FWL_STYLEEXT_SCB_Vert; +} +FWL_ERR CFWL_ScrollBarImp::GetRange(FX_FLOAT &fMin, FX_FLOAT &fMax) +{ + fMin = m_fRangeMin; + fMax = m_fRangeMax; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ScrollBarImp::SetRange(FX_FLOAT fMin, FX_FLOAT fMax) +{ + m_fRangeMin = fMin; + m_fRangeMax = fMax; + return FWL_ERR_Succeeded; +} +FX_FLOAT CFWL_ScrollBarImp::GetPageSize() +{ + return m_fPageSize; +} +FWL_ERR CFWL_ScrollBarImp::SetPageSize(FX_FLOAT fPageSize) +{ + m_fPageSize = fPageSize; + return FWL_ERR_Succeeded; +} +FX_FLOAT CFWL_ScrollBarImp::GetStepSize() +{ + return m_fStepSize; +} +FWL_ERR CFWL_ScrollBarImp::SetStepSize(FX_FLOAT fStepSize) +{ + m_fStepSize = fStepSize; + return FWL_ERR_Succeeded; +} +FX_FLOAT CFWL_ScrollBarImp::GetPos() +{ + return m_fPos; +} +FWL_ERR CFWL_ScrollBarImp::SetPos(FX_FLOAT fPos) +{ + m_fPos = fPos; + return FWL_ERR_Succeeded; +} +FX_FLOAT CFWL_ScrollBarImp::GetTrackPos() +{ + return m_fTrackPos; +} +FWL_ERR CFWL_ScrollBarImp::SetTrackPos(FX_FLOAT fTrackPos) +{ + m_fTrackPos = fTrackPos; + CalcThumbButtonRect(m_rtThumb); + CalcMinTrackRect(m_rtMinTrack); + CalcMaxTrackRect(m_rtMaxTrack); + return FWL_ERR_Succeeded; +} +FX_BOOL CFWL_ScrollBarImp::DoScroll(FX_DWORD dwCode, FX_FLOAT fPos ) +{ + switch (dwCode) { + case FWL_SCBCODE_Min: + case FWL_SCBCODE_Max: + case FWL_SCBCODE_PageBackward: + case FWL_SCBCODE_PageForward: + case FWL_SCBCODE_StepBackward: + break; + case FWL_SCBCODE_StepForward: + break; + case FWL_SCBCODE_Pos: + case FWL_SCBCODE_TrackPos: + case FWL_SCBCODE_EndScroll: + break; + default: { + return FALSE; + } + } + return OnScroll(dwCode, fPos); +} +FX_INT32 CFWL_ScrollBarImp::Run(FWL_HTIMER hTimer) +{ + if (m_hTimer) { + FWL_StopTimer(m_hTimer); + } + if (!SendEvent()) { + m_hTimer = FWL_StartTimer(this, 0); + } + return 1; +} +FWL_ERR CFWL_ScrollBarImp::SetOuter(IFWL_Widget *pOuter) +{ + m_pOuter = pOuter; + return FWL_ERR_Succeeded; +} +void CFWL_ScrollBarImp::DrawTrack(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, FX_BOOL bLower , const CFX_Matrix *pMatrix ) +{ + CFWL_ThemeBackground param; + param.m_pWidget = m_pInterface; + param.m_iPart = bLower ? FWL_PART_SCB_LowerTrack : FWL_PART_SCB_UpperTrack; + param.m_dwStates = (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) ? + FWL_PARTSTATE_SCB_Disabled : (bLower ? m_iMinTrackState : m_iMaxTrackState); + param.m_pGraphics = pGraphics; + param.m_matrix.Concat(*pMatrix); + param.m_rtPart = bLower ? m_rtMinTrack : m_rtMaxTrack; + pTheme->DrawBackground(¶m); +} +void CFWL_ScrollBarImp::DrawArrowBtn(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, FX_BOOL bMinBtn , const CFX_Matrix *pMatrix ) +{ + CFWL_ThemeBackground param; + param.m_pWidget = m_pInterface; + param.m_iPart = bMinBtn ? FWL_PART_SCB_ForeArrow : FWL_PART_SCB_BackArrow; + param.m_dwStates = (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) ? + FWL_PARTSTATE_SCB_Disabled : (bMinBtn ? m_iMinButtonState : m_iMaxButtonState); + param.m_pGraphics = pGraphics; + param.m_matrix.Concat(*pMatrix); + param.m_rtPart = bMinBtn ? m_rtMinBtn : m_rtMaxBtn; + if (param.m_rtPart.height > 0 && param.m_rtPart.width > 0) { + pTheme->DrawBackground(¶m); + } +} +void CFWL_ScrollBarImp::DrawThumb(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix ) +{ + if (!IsEnabled()) { + } + CFWL_ThemeBackground param; + param.m_pWidget = m_pInterface; + param.m_iPart = FWL_PART_SCB_Thumb; + param.m_dwStates = (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) ? + FWL_PARTSTATE_SCB_Disabled : m_iThumbButtonState; + param.m_pGraphics = pGraphics; + param.m_matrix.Concat(*pMatrix); + param.m_rtPart = m_rtThumb; + pTheme->DrawBackground(¶m); +} +void CFWL_ScrollBarImp::Layout() +{ + IFWL_ThemeProvider *pTheme = m_pProperties->m_pThemeProvider; + CFWL_ThemePart part; + part.m_pWidget = m_pInterface; + m_fMinThumb = *(FX_FLOAT*)pTheme->GetCapacity(&part, FWL_CAPACITY_SCB_Size); + m_bCustomLayout = pTheme->IsCustomizedLayout(m_pInterface); + GetClientRect(m_rtClient); + CalcButtonLen(); + CalcMinButtonRect(m_rtMinBtn); + CalcMaxButtonRect(m_rtMaxBtn); + CalcThumbButtonRect(m_rtThumb); + CalcMinTrackRect(m_rtMinTrack); + CalcMaxTrackRect(m_rtMaxTrack); +} +void CFWL_ScrollBarImp::CalcButtonLen() +{ + m_fButtonLen = IsVertical() ? m_rtClient.width : m_rtClient.height; + FX_FLOAT fLength = IsVertical() ? m_rtClient.height : m_rtClient.width; + if (fLength < m_fButtonLen * 2) { + m_fButtonLen = fLength / 2; + m_bMinSize = TRUE; + } else { + m_bMinSize = FALSE; + } +} +void CFWL_ScrollBarImp::CalcMinButtonRect(CFX_RectF &rect) +{ + if (m_bCustomLayout) { + IFWL_ThemeProvider *pTheme = m_pProperties->m_pThemeProvider; + CFWL_ThemePart pPart; + pPart.m_rtPart = m_rtMinBtn; + pPart.m_pWidget = m_pInterface; + pPart.m_iPart = FWL_PART_SCB_ForeArrow; + pPart.m_dwStates = (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) ? FWL_PARTSTATE_SCB_Disabled : m_iMinButtonState; + pTheme->GetPartRect(&pPart, rect); + } else { + rect.left = m_rtClient.left; + rect.top = m_rtClient.top; + rect.width = IsVertical() ? m_rtClient.width : m_fButtonLen; + rect.height = IsVertical() ? m_fButtonLen : m_rtClient.height; + } +} +void CFWL_ScrollBarImp::CalcMaxButtonRect(CFX_RectF &rect) +{ + if (m_bCustomLayout) { + IFWL_ThemeProvider *pTheme = m_pProperties->m_pThemeProvider; + CFWL_ThemePart pPart; + pPart.m_rtPart = m_rtMaxBtn; + pPart.m_pWidget = m_pInterface; + pPart.m_iPart = FWL_PART_SCB_BackArrow; + pPart.m_dwStates = (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) ? FWL_PARTSTATE_SCB_Disabled : m_iMaxButtonState; + pTheme->GetPartRect(&pPart, rect); + } else { + rect.left = IsVertical() ? m_rtClient.left : m_rtClient.right() - m_fButtonLen; + rect.top = IsVertical() ? m_rtClient.bottom() - m_fButtonLen : m_rtClient.top; + rect.width = IsVertical() ? m_rtClient.width : m_fButtonLen; + rect.height = IsVertical() ? m_fButtonLen : m_rtClient.height; + } +} +void CFWL_ScrollBarImp::CalcThumbButtonRect(CFX_RectF &rect) +{ + if (!IsEnabled()) { + m_rtThumb.Reset(); + return; + } + if (m_bMinSize) { + m_rtThumb.Empty(); + return; + } + FX_FLOAT fRange = m_fRangeMax - m_fRangeMin; + memset(&rect, 0, sizeof(CFX_Rect)); + if (fRange < 0) { + if (IsVertical()) { + rect.Set(m_rtClient.left, m_rtMaxBtn.bottom(), m_rtClient.width, 0); + } else { + rect.Set(m_rtMaxBtn.right(), m_rtClient.top, 0, m_rtClient.height); + } + return; + } + CFX_RectF rtClient = m_rtClient; + FX_FLOAT fLength = IsVertical() ? rtClient.height : rtClient.width; + FX_FLOAT fSize = m_fButtonLen; + if (m_bCustomLayout) { + if (IsVertical()) { + fLength = fLength - m_rtMinBtn.height - m_rtMaxBtn.height; + if (fLength < m_rtMinBtn.height || fLength < m_rtMaxBtn.height) { + fLength = 0.0f; + } + } else { + fLength = fLength - m_rtMinBtn.width - m_rtMaxBtn.width; + if (fLength < m_rtMinBtn.width || fLength < m_rtMaxBtn.width) { + fLength = 0.0f; + } + } + } else { + fLength -= fSize * 2.0f; + if (fLength < fSize) { + fLength = 0.0f; + } + } + FX_FLOAT fThumbSize = fLength * fLength / (fRange + fLength); + if (fThumbSize < m_fMinThumb) { + fThumbSize = m_fMinThumb; + } + FX_FLOAT fDiff = fLength - fThumbSize; + if (fDiff < 0.0f) { + fDiff = 0.0f; + } + FX_FLOAT fTrackPos = m_fTrackPos; + if (fTrackPos > m_fRangeMax) { + fTrackPos = m_fRangeMax; + } + if (fTrackPos < m_fRangeMin) { + fTrackPos = m_fRangeMin; + } + _FWL_RETURN_IF_FAIL(fRange); + if (m_bCustomLayout) { + FX_FLOAT iPos = fDiff * (fTrackPos - m_fRangeMin) / fRange; + rect.left = rtClient.left; + if (!IsVertical()) { + if ((m_rtMinBtn.right() == m_rtMaxBtn.left && m_rtMinBtn.width > 0 && m_rtMaxBtn.width > 0) || (0 == m_rtMinBtn.width && 0 == m_rtMaxBtn.width)) { + rect.left += iPos; + } else { + rect.left += m_rtMinBtn.right() + iPos; + } + } + rect.top = rtClient.top; + if (IsVertical()) { + if ((m_rtMinBtn.bottom() == m_rtMaxBtn.top && m_rtMinBtn.height > 0 && m_rtMaxBtn.height > 0) || (0 == m_rtMinBtn.height && 0 == m_rtMaxBtn.height)) { + rect.top += iPos; + } else { + rect.top += m_rtMinBtn.bottom() + iPos; + } + } + rect.width = IsVertical() ? rtClient.width : fThumbSize; + rect.height = IsVertical() ? fThumbSize : rtClient.height; + } else { + FX_FLOAT iPos = fSize + fDiff * (fTrackPos - m_fRangeMin) / fRange; + rect.left = rtClient.left; + if (!IsVertical()) { + rect.left += iPos; + } + rect.top = rtClient.top; + if (IsVertical()) { + rect.top += iPos; + } + rect.width = IsVertical() ? rtClient.width : fThumbSize; + rect.height = IsVertical() ? fThumbSize : rtClient.height; + } +} +void CFWL_ScrollBarImp::CalcMinTrackRect(CFX_RectF &rect) +{ + if (m_bMinSize) { + rect.Empty(); + return; + } + FX_FLOAT fBottom = m_rtThumb.bottom(); + FX_FLOAT fRight = m_rtThumb.right(); + FX_FLOAT ix = (m_rtThumb.left + fRight) / 2; + FX_FLOAT iy = (m_rtThumb.top + fBottom) / 2; + rect.left = m_rtClient.left; + rect.top = m_rtClient.top; + FX_BOOL bVertical = IsVertical(); + rect.width = bVertical ? m_rtClient.width : ix; + rect.height = bVertical ? iy : m_rtClient.height; + if (m_bCustomLayout) { + if (bVertical) { + if (0 == m_rtMinBtn.height && 0 == m_rtMaxBtn.height) { + rect.top = m_rtClient.top; + } else if (m_rtMinBtn.top < m_rtThumb.top) { + rect.top = m_rtMinBtn.bottom(); + rect.height -= (m_rtMinBtn.bottom() - m_rtClient.top); + } + } else { + if (0 == m_rtMinBtn.width && 0 == m_rtMaxBtn.width) { + rect.left = m_rtClient.left; + } else if (m_rtMinBtn.left < m_rtThumb.left) { + rect.left = m_rtMinBtn.right(); + rect.width -= (m_rtMinBtn.right() - m_rtClient.left); + } + } + } +} +void CFWL_ScrollBarImp::CalcMaxTrackRect(CFX_RectF &rect) +{ + if (m_bMinSize) { + rect.Empty(); + return; + } + FX_FLOAT ix = (m_rtThumb.left + m_rtThumb.right()) / 2; + FX_FLOAT iy = (m_rtThumb.top + m_rtThumb.bottom()) / 2; + FX_BOOL bVertical = IsVertical(); + rect.left = bVertical ? m_rtClient.left : ix; + rect.top = bVertical ? iy : m_rtClient.top; + rect.width = bVertical ? m_rtClient.width : m_rtClient.right() - ix; + rect.height = bVertical ? m_rtClient.bottom() - iy : m_rtClient.height; + if (m_bCustomLayout) { + if (bVertical) { + if (m_rtMinBtn.top > m_rtThumb.top && m_rtMinBtn.height > 0 && m_rtMaxBtn.height > 0) { + rect.height -= (m_rtClient.bottom() - m_rtMinBtn.top); + } else if (m_rtMinBtn.height > 0 && m_rtMaxBtn.height > 0) { + rect.height -= (m_rtClient.bottom() - m_rtMaxBtn.top); + } + } else { + if (m_rtMinBtn.left > m_rtThumb.left && m_rtMinBtn.width > 0 && m_rtMaxBtn.width > 0) { + rect.width -= (m_rtClient.right() - m_rtMinBtn.left); + } else if (m_rtMinBtn.width > 0 && m_rtMaxBtn.width > 0) { + rect.width -= (m_rtClient.right() - m_rtMaxBtn.left); + } + } + } +} +FX_FLOAT CFWL_ScrollBarImp::GetTrackPointPos(FX_FLOAT fx, FX_FLOAT fy) +{ + FX_FLOAT fDiffX = fx - m_cpTrackPointX; + FX_FLOAT fDiffY = fy - m_cpTrackPointY; + FX_FLOAT fRange = m_fRangeMax - m_fRangeMin; + FX_FLOAT fPos; + if (m_bCustomLayout) { + if (IsVertical()) { + if (0 == m_rtMinBtn.height && 0 == m_rtMaxBtn.height) { + fPos = fRange * fDiffY / (m_rtClient.height - m_rtThumb.height); + } else if (m_rtMinBtn.bottom() == m_rtMaxBtn.top) { + fPos = fRange * fDiffY / (m_rtMinBtn.top - m_rtClient.top - m_rtThumb.height); + } else { + fPos = fRange * fDiffY / (m_rtMaxBtn.top - m_rtMinBtn.bottom() - m_rtThumb.height); + } + } else { + if (0 == m_rtMinBtn.width && 0 == m_rtMaxBtn.width) { + fPos = fRange * fDiffX / (m_rtClient.width - m_rtThumb.width); + } else if (m_rtMinBtn.right() == m_rtMaxBtn.left) { + fPos = fRange * fDiffX / (m_rtMinBtn.left - m_rtClient.left - m_rtThumb.width); + } else { + fPos = fRange * fDiffX / (m_rtMaxBtn.left - m_rtMinBtn.right() - m_rtThumb.width); + } + } + } else { + if (IsVertical()) { + fPos = fRange * fDiffY / (m_rtMaxBtn.top - m_rtMinBtn.bottom() - m_rtThumb.height); + } else { + fPos = fRange * fDiffX / (m_rtMaxBtn.left - m_rtMinBtn.right() - m_rtThumb.width); + } + } + fPos += m_fLastTrackPos; + if (fPos < m_fRangeMin) { + fPos = m_fRangeMin; + } + if (fPos > m_fRangeMax) { + fPos = m_fRangeMax; + } + return fPos; +} +void CFWL_ScrollBarImp::GetTrackRect(CFX_RectF &rect, FX_BOOL bLower ) +{ + FX_BOOL bDisabled = m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled; + if (bDisabled || m_bCustomLayout) { + rect = bLower ? m_rtMinTrack : m_rtMaxTrack; + } else { + FX_FLOAT fW = m_rtThumb.width / 2; + FX_FLOAT fH = m_rtThumb.height / 2; + FX_BOOL bVert = IsVertical(); + if (bLower) { + if (bVert) { + FX_FLOAT fMinTrackHeight = m_rtMinTrack.height - fH - m_rtMinBtn.height; + fMinTrackHeight = (fMinTrackHeight >= 0.0f) ? fMinTrackHeight : 0.0f; + rect.Set(m_rtMinTrack.left, + m_rtMinTrack.top + m_rtMinBtn.height, + m_rtMinTrack.width, + fMinTrackHeight); + } else { + FX_FLOAT fMinTrackWidth = m_rtMinTrack.width - fW - m_rtMinBtn.width + 2; + fMinTrackWidth = (fMinTrackWidth >= 0.0f) ? fMinTrackWidth : 0.0f; + rect.Set(m_rtMinTrack.left + m_rtMinBtn.width - 1, + m_rtMinTrack.top, + fMinTrackWidth, + m_rtMinTrack.height); + } + } else { + if (bVert) { + FX_FLOAT fMaxTrackHeight = m_rtMaxTrack.height - fH - m_rtMaxBtn.height; + fMaxTrackHeight = (fMaxTrackHeight >= 0.0f) ? fMaxTrackHeight : 0.0f; + rect.Set(m_rtMaxTrack.left, + m_rtMaxTrack.top + fH, + m_rtMaxTrack.width, + fMaxTrackHeight); + } else { + FX_FLOAT fMaxTrackWidth = m_rtMaxTrack.width - fW - m_rtMaxBtn.width + 2; + fMaxTrackWidth = (fMaxTrackWidth >= 0.0f) ? fMaxTrackWidth : 0.0f; + rect.Set(m_rtMaxTrack.left + fW, + m_rtMaxTrack.top, + fMaxTrackWidth, + m_rtMaxTrack.height); + } + } + } +} +FX_BOOL CFWL_ScrollBarImp::SendEvent() +{ + if (m_iMinButtonState == FWL_PARTSTATE_SCB_Pressed) { + DoScroll(FWL_SCBCODE_StepBackward, m_fTrackPos); + return FALSE; + } + if (m_iMaxButtonState == FWL_PARTSTATE_SCB_Pressed) { + DoScroll(FWL_SCBCODE_StepForward, m_fTrackPos); + return FALSE; + } + if (m_iMinTrackState == FWL_PARTSTATE_SCB_Pressed) { + DoScroll(FWL_SCBCODE_PageBackward, m_fTrackPos); + return m_rtThumb.Contains(m_cpTrackPointX, m_cpTrackPointY); + } + if (m_iMaxTrackState == FWL_PARTSTATE_SCB_Pressed) { + DoScroll(FWL_SCBCODE_PageForward, m_fTrackPos); + return m_rtThumb.Contains(m_cpTrackPointX, m_cpTrackPointY); + } + if (m_iMouseWheel) { + FX_WORD dwCode = m_iMouseWheel < 0 ? FWL_SCBCODE_StepForward : FWL_SCBCODE_StepBackward; + DoScroll(dwCode, m_fTrackPos); + } + return TRUE; +} +FX_BOOL CFWL_ScrollBarImp::OnScroll(FX_DWORD dwCode, FX_FLOAT fPos) +{ + FX_BOOL bRet = TRUE; + CFWL_EvtScroll ev; + ev.m_iScrollCode = dwCode; + ev.m_pSrcTarget = m_pInterface; + ev.m_fPos = fPos; + ev.m_pRet = &bRet; + DispatchEvent(&ev); + return bRet; +} +CFWL_ScrollBarImpDelegate::CFWL_ScrollBarImpDelegate(CFWL_ScrollBarImp *pOwner) + : m_pOwner(pOwner) +{ +} +FX_INT32 CFWL_ScrollBarImpDelegate::OnProcessMessage(CFWL_Message *pMessage) +{ + _FWL_RETURN_VALUE_IF_FAIL(pMessage, 0); + FX_INT32 iRet = 1; + FX_DWORD dwMsgCode = pMessage->GetClassID(); + if (dwMsgCode == FWL_MSGHASH_Mouse) { + CFWL_MsgMouse *pMsg = (CFWL_MsgMouse*)pMessage; + FX_DWORD dwCmd = pMsg->m_dwCmd; + switch (dwCmd) { + case FWL_MSGMOUSECMD_LButtonDown: { + OnLButtonDown(pMsg->m_dwFlags, pMsg->m_fx, pMsg->m_fy); + break; + } + case FWL_MSGMOUSECMD_LButtonUp: { + OnLButtonUp(pMsg->m_dwFlags, pMsg->m_fx, pMsg->m_fy); + break; + } + case FWL_MSGMOUSECMD_MouseMove: { + OnMouseMove(pMsg->m_dwFlags, pMsg->m_fx, pMsg->m_fy); + break; + } + case FWL_MSGMOUSECMD_MouseLeave: { + OnMouseLeave(); + break; + } + default: { + iRet = 0; + } + } + } else if (dwMsgCode == FWL_MSGHASH_MouseWheel) { + CFWL_MsgMouseWheel *pMsg = (CFWL_MsgMouseWheel*)pMessage; + OnMouseWheel(pMsg->m_fx, pMsg->m_fy, pMsg->m_dwFlags, pMsg->m_fDeltaX, pMsg->m_fDeltaY); + } else { + iRet = 0; + } + return iRet; +} +FWL_ERR CFWL_ScrollBarImpDelegate::OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix) +{ + return m_pOwner->DrawWidget(pGraphics, pMatrix); +} +void CFWL_ScrollBarImpDelegate::OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + if (!m_pOwner->IsEnabled()) { + return; + } + m_pOwner->m_bMouseDown = TRUE; + m_pOwner->SetGrab(TRUE); + m_pOwner->m_cpTrackPointX = fx; + m_pOwner->m_cpTrackPointY = fy; + m_pOwner->m_fLastTrackPos = m_pOwner->m_fTrackPos; + if (m_pOwner->m_rtMinBtn.Contains(fx, fy)) { + DoMouseDown(0, m_pOwner->m_rtMinBtn, m_pOwner->m_iMinButtonState, fx, fy); + } else { + if (m_pOwner->m_rtThumb.Contains(fx, fy)) { + DoMouseDown(1, m_pOwner->m_rtThumb, m_pOwner->m_iThumbButtonState, fx, fy); + } else { + if (m_pOwner->m_rtMaxBtn.Contains(fx, fy)) { + DoMouseDown(2, m_pOwner->m_rtMaxBtn, m_pOwner->m_iMaxButtonState, fx, fy); + } else { + if (m_pOwner->m_rtMinTrack.Contains(fx, fy)) { + DoMouseDown(3, m_pOwner->m_rtMinTrack, m_pOwner->m_iMinTrackState, fx, fy); + } else { + DoMouseDown(4, m_pOwner->m_rtMaxTrack, m_pOwner->m_iMaxTrackState, fx, fy); + } + } + } + } + if (!m_pOwner->SendEvent()) { + m_pOwner->m_hTimer = FWL_StartTimer(m_pOwner, FWL_SCROLLBAR_Elapse); + } +} +void CFWL_ScrollBarImpDelegate::OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + FWL_StopTimer(m_pOwner->m_hTimer); + m_pOwner->m_bMouseDown = FALSE; + DoMouseUp(0, m_pOwner->m_rtMinBtn, m_pOwner->m_iMinButtonState, fx, fy); + DoMouseUp(1, m_pOwner->m_rtThumb, m_pOwner->m_iThumbButtonState, fx, fy); + DoMouseUp(2, m_pOwner->m_rtMaxBtn, m_pOwner->m_iMaxButtonState, fx, fy); + DoMouseUp(3, m_pOwner->m_rtMinTrack, m_pOwner->m_iMinTrackState, fx, fy); + DoMouseUp(4, m_pOwner->m_rtMaxTrack, m_pOwner->m_iMaxTrackState, fx, fy); + m_pOwner->SetGrab(FALSE); +} +void CFWL_ScrollBarImpDelegate::OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + DoMouseMove(0, m_pOwner->m_rtMinBtn, m_pOwner->m_iMinButtonState, fx, fy); + DoMouseMove(1, m_pOwner->m_rtThumb, m_pOwner->m_iThumbButtonState, fx, fy); + DoMouseMove(2, m_pOwner->m_rtMaxBtn, m_pOwner->m_iMaxButtonState, fx, fy); + DoMouseMove(3, m_pOwner->m_rtMinTrack, m_pOwner->m_iMinTrackState, fx, fy); + DoMouseMove(4, m_pOwner->m_rtMaxTrack, m_pOwner->m_iMaxTrackState, fx, fy); +} +void CFWL_ScrollBarImpDelegate::OnMouseLeave() +{ + DoMouseLeave(0, m_pOwner->m_rtMinBtn, m_pOwner->m_iMinButtonState); + DoMouseLeave(1, m_pOwner->m_rtThumb, m_pOwner->m_iThumbButtonState); + DoMouseLeave(2, m_pOwner->m_rtMaxBtn, m_pOwner->m_iMaxButtonState); + DoMouseLeave(3, m_pOwner->m_rtMinTrack, m_pOwner->m_iMinTrackState); + DoMouseLeave(4, m_pOwner->m_rtMaxTrack, m_pOwner->m_iMaxTrackState); +} +void CFWL_ScrollBarImpDelegate::OnMouseWheel(FX_FLOAT fx, FX_FLOAT fy, FX_DWORD dwFlags, FX_FLOAT fDeltaX, FX_FLOAT fDeltaY) +{ + m_pOwner->m_iMouseWheel = (FX_INT32)fDeltaX; + m_pOwner->SendEvent(); + m_pOwner->m_iMouseWheel = 0; +} +void CFWL_ScrollBarImpDelegate::DoMouseDown(FX_INT32 iItem, const CFX_RectF &rtItem, FX_INT32 &iState, FX_FLOAT fx, FX_FLOAT fy) +{ + if (!rtItem.Contains(fx, fy)) { + return; + } + if (iState == FWL_PARTSTATE_SCB_Pressed) { + return; + } + iState = FWL_PARTSTATE_SCB_Pressed; + m_pOwner->Repaint(&rtItem); +} +void CFWL_ScrollBarImpDelegate::DoMouseUp(FX_INT32 iItem, const CFX_RectF &rtItem, FX_INT32 &iState, FX_FLOAT fx, FX_FLOAT fy) +{ + FX_INT32 iNewState = rtItem.Contains(fx, fy) ? FWL_PARTSTATE_SCB_Hovered : FWL_PARTSTATE_SCB_Normal; + if (iState == iNewState) { + return; + } + iState = iNewState; + m_pOwner->Repaint(&rtItem); + m_pOwner->OnScroll(FWL_SCBCODE_EndScroll, m_pOwner->m_fTrackPos); +} +void CFWL_ScrollBarImpDelegate::DoMouseMove(FX_INT32 iItem, const CFX_RectF &rtItem, FX_INT32 &iState, FX_FLOAT fx, FX_FLOAT fy) +{ + if (!m_pOwner->m_bMouseDown) { + FX_INT32 iNewState = rtItem.Contains(fx, fy) ? FWL_PARTSTATE_SCB_Hovered : FWL_PARTSTATE_SCB_Normal; + if (iState == iNewState) { + return; + } + iState = iNewState; + m_pOwner->Repaint(&rtItem); + } else if ((2 == iItem) && (m_pOwner->m_iThumbButtonState == FWL_PARTSTATE_SCB_Pressed)) { + FX_FLOAT fPos = m_pOwner->GetTrackPointPos(fx, fy); + m_pOwner->m_fTrackPos = fPos; + m_pOwner->OnScroll(FWL_SCBCODE_TrackPos, fPos); + } +} +void CFWL_ScrollBarImpDelegate::DoMouseLeave(FX_INT32 iItem, const CFX_RectF &rtItem, FX_INT32 &iState) +{ + if (iState == FWL_PARTSTATE_SCB_Normal) { + return; + } + iState = FWL_PARTSTATE_SCB_Normal; + m_pOwner->Repaint(&rtItem); +} +void CFWL_ScrollBarImpDelegate::DoMouseHover(FX_INT32 iItem, const CFX_RectF &rtItem, FX_INT32 &iState) +{ + if (iState == FWL_PARTSTATE_SCB_Hovered) { + return; + } + iState = FWL_PARTSTATE_SCB_Hovered; + m_pOwner->Repaint(&rtItem); +} diff --git a/xfa/src/fwl/src/basewidget/fwl_spinbuttonimp.cpp b/xfa/src/fwl/src/basewidget/fwl_spinbuttonimp.cpp new file mode 100644 index 0000000000..f5f56955fa --- /dev/null +++ b/xfa/src/fwl/src/basewidget/fwl_spinbuttonimp.cpp @@ -0,0 +1,450 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../core/include/fwl_targetimp.h" +#include "../core/include/fwl_noteimp.h" +#include "../core/include/fwl_widgetimp.h" +#include "include/fwl_spinbuttonimp.h" +#define FWL_SPN_MinWidth 18 +#define FWL_SPN_MinHeight 32 +#define FWL_SPIN_Elapse 200 +IFWL_SpinButton* IFWL_SpinButton::Create() +{ + return new IFWL_SpinButton; +} +IFWL_SpinButton::IFWL_SpinButton() +{ + m_pData = NULL; +} +IFWL_SpinButton::~IFWL_SpinButton() +{ + if (m_pData) { + delete (CFWL_SpinButtonImp*)m_pData; + m_pData = NULL; + } +} +FWL_ERR IFWL_SpinButton::Initialize(IFWL_Widget *pOuter) +{ + m_pData = FX_NEW CFWL_SpinButtonImp; + ((CFWL_SpinButtonImp*)m_pData)->SetInterface(this); + return ((CFWL_SpinButtonImp*)m_pData)->Initialize(); +} +FWL_ERR IFWL_SpinButton::Initialize(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter) +{ + m_pData = FX_NEW CFWL_SpinButtonImp(properties); + ((CFWL_SpinButtonImp*)m_pData)->SetInterface(this); + return ((CFWL_SpinButtonImp*)m_pData)->Initialize(); +} +FWL_ERR IFWL_SpinButton::EnableButton(FX_BOOL bEnable, FX_BOOL bUp) +{ + return ((CFWL_SpinButtonImp*)m_pData)->EnableButton(bEnable, bUp); +} +FX_BOOL IFWL_SpinButton::IsButtonEnable(FX_BOOL bUp) +{ + return ((CFWL_SpinButtonImp*)m_pData)->IsButtonEnable(bUp); +} +CFWL_SpinButtonImp::CFWL_SpinButtonImp(IFWL_Widget* pOuter ) + : CFWL_WidgetImp(pOuter) + , m_dwUpState(FWL_PARTSTATE_SPB_Normal) + , m_dwDnState(FWL_PARTSTATE_SPB_Normal) + , m_bLButtonDwn(FALSE) + , m_iButtonIndex(0) + , m_hTimer(NULL) +{ + m_rtClient.Reset(); + m_rtUpButton.Reset(); + m_rtDnButton.Reset(); + m_pProperties->m_dwStyleExes |= FWL_STYLEEXE_SPB_Vert; +} +CFWL_SpinButtonImp::CFWL_SpinButtonImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter) + : CFWL_WidgetImp(properties, pOuter) + , m_dwUpState(FWL_PARTSTATE_SPB_Normal) + , m_dwDnState(FWL_PARTSTATE_SPB_Normal) + , m_bLButtonDwn(FALSE) + , m_iButtonIndex(0) + , m_hTimer(NULL) +{ + m_rtClient.Reset(); + m_rtUpButton.Reset(); + m_rtDnButton.Reset(); + m_pProperties->m_dwStyleExes |= FWL_STYLEEXE_SPB_Vert; +} +CFWL_SpinButtonImp::~CFWL_SpinButtonImp() +{ +} +FWL_ERR CFWL_SpinButtonImp::GetClassName(CFX_WideString &wsClass) const +{ + wsClass = FWL_CLASS_SpinButton; + return FWL_ERR_Succeeded; +} +FX_DWORD CFWL_SpinButtonImp::GetClassID() const +{ + return FWL_CLASSHASH_SpinButton; +} +FWL_ERR CFWL_SpinButtonImp::Initialize() +{ + _FWL_ERR_CHECK_RETURN_VALUE_IF_FAIL(CFWL_WidgetImp::Initialize(), FWL_ERR_Indefinite); + m_pDelegate = (IFWL_WidgetDelegate*) FX_NEW CFWL_SpinButtonImpDelegate(this); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SpinButtonImp::Finalize() +{ + if ( m_pDelegate) { + delete (CFWL_SpinButtonImpDelegate*)m_pDelegate; + m_pDelegate = NULL; + } + return CFWL_WidgetImp::Finalize(); +} +FWL_ERR CFWL_SpinButtonImp::GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize) +{ + if (bAutoSize) { + rect.Set(0, 0, FWL_SPN_MinWidth, FWL_SPN_MinHeight); + CFWL_WidgetImp::GetWidgetRect(rect, TRUE); + } else { + rect = m_pProperties->m_rtWidget; + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SpinButtonImp::Update() +{ + if (IsLocked()) { + return FWL_ERR_Indefinite; + } + GetClientRect(m_rtClient); + if (m_pProperties->m_dwStyleExes & FWL_STYLEEXE_SPB_Vert) { + m_rtUpButton.Set(m_rtClient.top, m_rtClient.left, m_rtClient.width, m_rtClient.height / 2); + m_rtDnButton.Set(m_rtClient.left, m_rtClient.top + m_rtClient.height / 2, m_rtClient.width, m_rtClient.height / 2); + } else { + m_rtUpButton.Set(m_rtClient.left, m_rtClient.top, m_rtClient.width / 2, m_rtClient.height); + m_rtDnButton.Set(m_rtClient.left + m_rtClient.width / 2, m_rtClient.top, m_rtClient.width / 2, m_rtClient.height); + } + return FWL_ERR_Succeeded; +} +FX_DWORD CFWL_SpinButtonImp::HitTest(FX_FLOAT fx, FX_FLOAT fy) +{ + if (m_rtClient.Contains(fx, fy)) { + return FWL_WGTHITTEST_Client; + } + if (HasBorder() && (m_rtClient.Contains(fx, fy))) { + return FWL_WGTHITTEST_Border; + } + if (HasEdge()) { + CFX_RectF rtEdge; + GetEdgeRect(rtEdge); + if (rtEdge.Contains(fx, fy)) { + return FWL_PART_SPB_Edge; + } + } + if (m_rtUpButton.Contains(fx, fy)) { + return FWL_WGTHITTEST_SPB_UpButton; + } + if (m_rtDnButton.Contains(fx, fy)) { + return FWL_WGTHITTEST_SPB_DownButton; + } + return FWL_WGTHITTEST_Unknown; +} +FWL_ERR CFWL_SpinButtonImp::DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix) +{ + _FWL_RETURN_VALUE_IF_FAIL(pGraphics, FWL_ERR_Indefinite); + CFX_RectF rtClip(m_rtClient); + if (pMatrix != NULL) { + pMatrix->TransformRect(rtClip); + } + IFWL_ThemeProvider *pTheme = GetAvailableTheme(); + if (HasBorder()) { + DrawBorder(pGraphics, FWL_PART_SPB_Border, pTheme, pMatrix); + } + if (HasEdge()) { + DrawEdge(pGraphics, FWL_PART_SPB_Edge, pTheme, pMatrix); + } + DrawUpButton(pGraphics, pTheme, pMatrix); + DrawDownButton(pGraphics, pTheme, pMatrix); + return FWL_ERR_Succeeded; +} +FX_INT32 CFWL_SpinButtonImp::Run(FWL_HTIMER hTimer) +{ + if (m_hTimer) { + CFWL_EvtSpbClick wmPosChanged; + wmPosChanged.m_pSrcTarget = m_pInterface; + wmPosChanged.m_bUp = m_iButtonIndex == 0; + DispatchEvent(&wmPosChanged); + } + return 1; +} +FWL_ERR CFWL_SpinButtonImp::EnableButton(FX_BOOL bEnable, FX_BOOL bUp) +{ + if (bUp) { + if (bEnable) { + m_dwUpState = FWL_PARTSTATE_SPB_Normal; + } else { + m_dwUpState = FWL_PARTSTATE_SPB_Disabled; + } + } else { + if (bEnable) { + m_dwDnState = FWL_PARTSTATE_SPB_Normal; + } else { + m_dwDnState = FWL_PARTSTATE_SPB_Disabled; + } + } + return FWL_ERR_Succeeded; +} +FX_BOOL CFWL_SpinButtonImp::IsButtonEnable(FX_BOOL bUp) +{ + if (bUp) { + return (m_dwUpState != FWL_PARTSTATE_SPB_Disabled); + } + return (m_dwDnState != FWL_PARTSTATE_SPB_Disabled); +} +void CFWL_SpinButtonImp::DrawUpButton(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix) +{ + CFWL_ThemeBackground params; + params.m_pWidget = m_pInterface; + params.m_iPart = FWL_PART_SPB_UpButton; + params.m_pGraphics = pGraphics; + params.m_dwStates = m_dwUpState + 1; + if (pMatrix) { + params.m_matrix.Concat(*pMatrix); + } + params.m_rtPart = m_rtUpButton; + pTheme->DrawBackground(¶ms); +} +void CFWL_SpinButtonImp::DrawDownButton(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix) +{ + CFWL_ThemeBackground params; + params.m_pWidget = m_pInterface; + params.m_iPart = FWL_PART_SPB_DownButton; + params.m_pGraphics = pGraphics; + params.m_dwStates = m_dwDnState + 1; + if (pMatrix) { + params.m_matrix.Concat(*pMatrix); + } + params.m_rtPart = m_rtDnButton; + pTheme->DrawBackground(¶ms); +} +CFWL_SpinButtonImpDelegate::CFWL_SpinButtonImpDelegate(CFWL_SpinButtonImp *pOwner) + : m_pOwner(pOwner) +{ +} +FX_INT32 CFWL_SpinButtonImpDelegate::OnProcessMessage(CFWL_Message *pMessage) +{ + _FWL_RETURN_VALUE_IF_FAIL(pMessage, 0); + FX_INT32 iRet = 1; + FX_DWORD dwMsgCode = pMessage->GetClassID(); + switch (dwMsgCode) { + case FWL_MSGHASH_SetFocus: + case FWL_MSGHASH_KillFocus: { + OnFocusChanged(pMessage, dwMsgCode == FWL_MSGHASH_SetFocus); + break; + } + case FWL_MSGHASH_Mouse: { + CFWL_MsgMouse *pMsg = (CFWL_MsgMouse*)pMessage; + FX_DWORD dwCmd = pMsg->m_dwCmd; + switch (dwCmd) { + case FWL_MSGMOUSECMD_LButtonDown: { + OnLButtonDown(pMsg); + break; + } + case FWL_MSGMOUSECMD_LButtonUp: { + OnLButtonUp(pMsg); + break; + } + case FWL_MSGMOUSECMD_MouseMove: { + OnMouseMove(pMsg); + break; + } + case FWL_MSGMOUSECMD_MouseLeave: { + OnMouseLeave(pMsg); + break; + } + default: { + } + } + break; + } + case FWL_MSGHASH_Key: { + CFWL_MsgKey *pKey = (CFWL_MsgKey*)pMessage; + if (pKey->m_dwCmd == FWL_MSGKEYCMD_KeyDown) { + OnKeyDown((CFWL_MsgKey*)pKey); + } + break; + } + default: { + iRet = 0; + break; + } + } + CFWL_WidgetImpDelegate::OnProcessMessage(pMessage); + return iRet; +} +FWL_ERR CFWL_SpinButtonImpDelegate::OnProcessEvent(CFWL_Event *pEvent) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SpinButtonImpDelegate::OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + return m_pOwner->DrawWidget(pGraphics, pMatrix); +} +void CFWL_SpinButtonImpDelegate::OnFocusChanged(CFWL_Message *pMsg, FX_BOOL bSet ) +{ + if (bSet) { + m_pOwner->m_pProperties->m_dwStates |= (FWL_WGTSTATE_Focused); + } else { + m_pOwner->m_pProperties->m_dwStates &= ~(FWL_WGTSTATE_Focused); + } + m_pOwner->Repaint(&m_pOwner->m_rtClient); +} +void CFWL_SpinButtonImpDelegate::OnLButtonDown(CFWL_MsgMouse *pMsg) +{ + m_pOwner->m_bLButtonDwn = TRUE; + m_pOwner->SetGrab(TRUE); + m_pOwner->SetFocus(TRUE); + _FWL_RETURN_IF_FAIL(m_pOwner->m_pProperties->m_pDataProvider); + FX_BOOL bUpPress = (m_pOwner->m_rtUpButton.Contains(pMsg->m_fx, pMsg->m_fy) && + m_pOwner->IsButtonEnable(TRUE)); + FX_BOOL bDnPress = (m_pOwner->m_rtDnButton.Contains(pMsg->m_fx, pMsg->m_fy) && + m_pOwner->IsButtonEnable(FALSE)); + if (!bUpPress && !bDnPress) { + return; + } + if (bUpPress) { + m_pOwner->m_iButtonIndex = 0; + m_pOwner->m_dwUpState = FWL_PARTSTATE_SPB_Pressed; + } + if (bDnPress) { + m_pOwner->m_iButtonIndex = 1; + m_pOwner->m_dwDnState = FWL_PARTSTATE_SPB_Pressed; + } + CFWL_EvtSpbClick wmPosChanged; + wmPosChanged.m_pSrcTarget = m_pOwner->m_pInterface; + wmPosChanged.m_bUp = bUpPress; + m_pOwner->DispatchEvent(&wmPosChanged); + m_pOwner->Repaint(bUpPress ? &m_pOwner->m_rtUpButton : &m_pOwner->m_rtDnButton); + m_pOwner->m_hTimer = FWL_StartTimer(m_pOwner, FWL_SPIN_Elapse); +} +void CFWL_SpinButtonImpDelegate::OnLButtonUp(CFWL_MsgMouse *pMsg) +{ + if (m_pOwner->m_pProperties->m_dwStates & FWL_PARTSTATE_SPB_Disabled) { + return; + } + m_pOwner->m_bLButtonDwn = FALSE; + m_pOwner->SetGrab(FALSE); + m_pOwner->SetFocus(FALSE); + if (m_pOwner->m_hTimer) { + FWL_StopTimer(m_pOwner->m_hTimer); + m_pOwner->m_hTimer = NULL; + } + FX_BOOL bRepaint = FALSE; + CFX_RectF rtInvalidate; + if (m_pOwner->m_dwUpState == FWL_PARTSTATE_SPB_Pressed && m_pOwner->IsButtonEnable(TRUE)) { + m_pOwner->m_dwUpState = FWL_PARTSTATE_SPB_Normal; + bRepaint = TRUE; + rtInvalidate = m_pOwner->m_rtUpButton; + } else if (m_pOwner->m_dwDnState == FWL_PARTSTATE_SPB_Pressed && m_pOwner->IsButtonEnable(FALSE)) { + m_pOwner->m_dwDnState = FWL_PARTSTATE_SPB_Normal; + bRepaint = TRUE; + rtInvalidate = m_pOwner->m_rtDnButton; + } + if (bRepaint) { + m_pOwner->Repaint(&rtInvalidate); + } +} +void CFWL_SpinButtonImpDelegate::OnMouseMove(CFWL_MsgMouse *pMsg) +{ + _FWL_RETURN_IF_FAIL(m_pOwner->m_pProperties->m_pDataProvider); + if (m_pOwner->m_bLButtonDwn) { + return; + } + FX_BOOL bRepaint = FALSE; + CFX_RectF rtInvlidate; + rtInvlidate.Reset(); + if (m_pOwner->m_rtUpButton.Contains(pMsg->m_fx, pMsg->m_fy)) { + if (m_pOwner->IsButtonEnable(TRUE)) { + if (m_pOwner->m_dwUpState == FWL_PARTSTATE_SPB_Hovered) { + m_pOwner->m_dwUpState = FWL_PARTSTATE_SPB_Hovered; + bRepaint = TRUE; + rtInvlidate = m_pOwner->m_rtUpButton; + } + if (m_pOwner->m_dwDnState != FWL_PARTSTATE_SPB_Normal && m_pOwner->IsButtonEnable(FALSE)) { + m_pOwner->m_dwDnState = FWL_PARTSTATE_SPB_Normal; + if (bRepaint) { + rtInvlidate.Union(m_pOwner->m_rtDnButton); + } else { + rtInvlidate = m_pOwner->m_rtDnButton; + } + bRepaint = TRUE; + } + } + if (!m_pOwner->IsButtonEnable(FALSE)) { + m_pOwner->EnableButton(FALSE, FALSE); + } + } else if (m_pOwner->m_rtDnButton.Contains(pMsg->m_fx, pMsg->m_fy)) { + if (m_pOwner->IsButtonEnable(FALSE)) { + if (m_pOwner->m_dwDnState != FWL_PARTSTATE_SPB_Hovered) { + m_pOwner->m_dwDnState = FWL_PARTSTATE_SPB_Hovered; + bRepaint = TRUE; + rtInvlidate = m_pOwner->m_rtDnButton; + } + if (m_pOwner->m_dwUpState != FWL_PARTSTATE_SPB_Normal && m_pOwner->IsButtonEnable(TRUE)) { + m_pOwner->m_dwUpState = FWL_PARTSTATE_SPB_Normal; + if (bRepaint) { + rtInvlidate.Union(m_pOwner->m_rtUpButton); + } else { + rtInvlidate = m_pOwner->m_rtUpButton; + } + bRepaint = TRUE; + } + } + } else if (m_pOwner->m_dwUpState != FWL_PARTSTATE_SPB_Normal || m_pOwner->m_dwDnState != FWL_PARTSTATE_SPB_Normal) { + if (m_pOwner->m_dwUpState != FWL_PARTSTATE_SPB_Normal) { + m_pOwner->m_dwUpState = FWL_PARTSTATE_SPB_Normal; + bRepaint = TRUE; + rtInvlidate = m_pOwner->m_rtUpButton; + } + if (m_pOwner->m_dwDnState != FWL_PARTSTATE_SPB_Normal) { + m_pOwner->m_dwDnState = FWL_PARTSTATE_SPB_Normal; + if (bRepaint) { + rtInvlidate.Union(m_pOwner->m_rtDnButton); + } else { + rtInvlidate = m_pOwner->m_rtDnButton; + } + bRepaint = TRUE; + } + } + if (bRepaint) { + m_pOwner->Repaint(&rtInvlidate); + } +} +void CFWL_SpinButtonImpDelegate::OnMouseLeave(CFWL_MsgMouse *pMsg) +{ + _FWL_RETURN_IF_FAIL(pMsg); + if (m_pOwner->m_dwUpState != FWL_PARTSTATE_SPB_Normal && m_pOwner->IsButtonEnable(TRUE)) { + m_pOwner->m_dwUpState = FWL_PARTSTATE_SPB_Normal; + } + if (m_pOwner->m_dwDnState != FWL_PARTSTATE_SPB_Normal && m_pOwner->IsButtonEnable(FALSE)) { + m_pOwner->m_dwDnState = FWL_PARTSTATE_SPB_Normal; + } + m_pOwner->Repaint(&m_pOwner->m_rtClient); +} +void CFWL_SpinButtonImpDelegate::OnKeyDown(CFWL_MsgKey *pMsg) +{ + _FWL_RETURN_IF_FAIL(m_pOwner->m_pProperties->m_pDataProvider); + FX_BOOL bUp = pMsg->m_dwKeyCode == FWL_VKEY_Up || pMsg->m_dwKeyCode == FWL_VKEY_Left; + FX_BOOL bDown = pMsg->m_dwKeyCode == FWL_VKEY_Down || pMsg->m_dwKeyCode == FWL_VKEY_Right; + if (!bUp && !bDown) { + return; + } + FX_BOOL bUpEnable = m_pOwner->IsButtonEnable(TRUE); + FX_BOOL bDownEnable = m_pOwner->IsButtonEnable(FALSE); + if (!bUpEnable && !bDownEnable) { + return; + } + CFWL_EvtSpbClick wmPosChanged; + wmPosChanged.m_pSrcTarget = m_pOwner->m_pInterface; + wmPosChanged.m_bUp = bUpEnable; + m_pOwner->DispatchEvent(&wmPosChanged); + m_pOwner->Repaint(bUpEnable ? &m_pOwner->m_rtUpButton : &m_pOwner->m_rtDnButton); +} diff --git a/xfa/src/fwl/src/basewidget/fwl_tooltipctrlimp.cpp b/xfa/src/fwl/src/basewidget/fwl_tooltipctrlimp.cpp new file mode 100644 index 0000000000..157d2fff73 --- /dev/null +++ b/xfa/src/fwl/src/basewidget/fwl_tooltipctrlimp.cpp @@ -0,0 +1,338 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../core/include/fwl_targetimp.h" +#include "../core/include/fwl_noteimp.h" +#include "../core/include/fwl_widgetimp.h" +#include "../core/include/fwl_panelimp.h" +#include "../core/include/fwl_formimp.h" +#include "include/fwl_tooltipctrlimp.h" +IFWL_ToolTip *IFWL_ToolTip::Create() +{ + return new IFWL_ToolTip; +} +FWL_ERR IFWL_ToolTip::Initialize(IFWL_Widget *pOuter) +{ + m_pData = FX_NEW CFWL_ToolTipImp(pOuter); + ((CFWL_ToolTipImp*)m_pData)->SetInterface(this); + return ((CFWL_ToolTipImp*)m_pData)->Initialize(); +} +FWL_ERR IFWL_ToolTip::Initialize(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter) +{ + m_pData = FX_NEW CFWL_ToolTipImp(properties, pOuter); + ((CFWL_ToolTipImp*)m_pData)->SetInterface(this); + return ((CFWL_ToolTipImp*)m_pData)->Initialize(); +} +FWL_ERR IFWL_ToolTip::SetAnchor(const CFX_RectF &rtAnchor) +{ + return ((CFWL_ToolTipImp*)m_pData)->SetAnchor( rtAnchor); +} +FWL_ERR IFWL_ToolTip::Show() +{ + return ((CFWL_ToolTipImp*)m_pData)->Show(); +} +FWL_ERR IFWL_ToolTip::Hide() +{ + return ((CFWL_ToolTipImp*)m_pData)->Hide(); +} +IFWL_ToolTip::IFWL_ToolTip() +{ + m_pData = NULL; +} +IFWL_ToolTip::~IFWL_ToolTip() +{ + if (m_pData) { + delete (CFWL_ToolTipImp*)m_pData; + m_pData = NULL; + } +} +CFWL_ToolTipImp::CFWL_ToolTipImp(IFWL_Widget *pOuter ) + : CFWL_FormImp(pOuter) + , m_bBtnDown(FALSE) + , m_dwTTOStyles(FDE_TTOSTYLE_SingleLine) + , m_iTTOAlign(FDE_TTOALIGNMENT_Center) + , m_hTimerShow(NULL) + , m_hTimerHide(NULL) + , m_pTimer(NULL) +{ + m_rtClient.Set(0, 0, 0, 0); + m_rtCaption.Set(0, 0, 0, 0); + m_pTimer = NULL; + m_TimerShow.m_pToolTip = this; + m_TimerHide.m_pToolTip = this; +} +CFWL_ToolTipImp::CFWL_ToolTipImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter ) + : CFWL_FormImp(properties, pOuter) + , m_bBtnDown(FALSE) + , m_dwTTOStyles(FDE_TTOSTYLE_SingleLine) + , m_iTTOAlign(FDE_TTOALIGNMENT_Center) + , m_hTimerShow(NULL) + , m_hTimerHide(NULL) + , m_pTimer(NULL) +{ + m_rtClient.Set(0, 0, 0, 0); + m_rtCaption.Set(0, 0, 0, 0); + m_rtAnchor.Set(0, 0, 0, 0); + m_TimerShow.m_pToolTip = this; + m_TimerHide.m_pToolTip = this; +} +CFWL_ToolTipImp::~CFWL_ToolTipImp() +{ + if (m_pTimer) { + delete m_pTimer; + m_pTimer = NULL; + } +} +FWL_ERR CFWL_ToolTipImp::GetClassName(CFX_WideString &wsClass) const +{ + wsClass = FWL_CLASS_ToolTip; + return FWL_ERR_Succeeded; +} +FX_DWORD CFWL_ToolTipImp::GetClassID() const +{ + return FWL_CLASSHASH_ToolTip; +} +FWL_ERR CFWL_ToolTipImp::Initialize() +{ + m_pProperties->m_dwStyles |= FWL_WGTSTYLE_Popup; + m_pProperties->m_dwStyles &= ~FWL_WGTSTYLE_Child; + _FWL_ERR_CHECK_RETURN_VALUE_IF_FAIL(CFWL_WidgetImp::Initialize(), FWL_ERR_Indefinite); + m_pDelegate = (IFWL_WidgetDelegate*) FX_NEW CFWL_ToolTipImpDelegate(this); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ToolTipImp::Finalize() +{ + if ( m_pDelegate) { + delete (CFWL_ToolTipImpDelegate*)m_pDelegate; + m_pDelegate = NULL; + } + return CFWL_WidgetImp::Finalize(); +} +FWL_ERR CFWL_ToolTipImp::GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize ) +{ + if (bAutoSize) { + rect.Set(0, 0, 0, 0); + if (m_pProperties->m_pThemeProvider == NULL) { + m_pProperties->m_pThemeProvider = GetAvailableTheme(); + } + CFX_WideString wsCaption; + IFWL_ToolTipDP *pData = (IFWL_ToolTipDP*)m_pProperties->m_pDataProvider; + if (pData) { + pData->GetCaption(m_pInterface, wsCaption); + } + FX_INT32 iLen = wsCaption.GetLength(); + if (iLen > 0) { + CFX_SizeF sz = CalcTextSize(wsCaption, m_pProperties->m_pThemeProvider); + rect.Set(0, 0, sz.x, sz.y); + rect.width += FWL_WGTCAPACITY_CXBorder * 25; + rect.height += FWL_WGTCAPACITY_CYBorder * 8; + } + CFWL_WidgetImp::GetWidgetRect(rect, TRUE); + } else { + rect = m_pProperties->m_rtWidget; + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ToolTipImp::Update() +{ + if (IsLocked()) { + return FWL_ERR_Indefinite; + } + if (!m_pProperties->m_pThemeProvider) { + m_pProperties->m_pThemeProvider = GetAvailableTheme(); + } + UpdateTextOutStyles(); + GetClientRect(m_rtClient); + m_rtCaption = m_rtClient; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ToolTipImp::GetClientRect(CFX_RectF &rect) +{ + FX_FLOAT x = 0; + FX_FLOAT y = 0; + FX_FLOAT t = 0; + IFWL_ThemeProvider *pTheme = m_pProperties->m_pThemeProvider; + if (pTheme) { + CFWL_ThemePart part; + part.m_pWidget = m_pInterface; + FX_FLOAT * value = NULL; + value = (FX_FLOAT *) pTheme->GetCapacity(&part, FWL_WGTCAPACITY_CXBorder); + x = *value; + value = (FX_FLOAT *) pTheme->GetCapacity(&part, FWL_WGTCAPACITY_CYBorder); + y = *value; + } + rect = m_pProperties->m_rtWidget; + rect.Offset(-rect.left, -rect.top); + rect.Deflate(x, t, x, y); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ToolTipImp::DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + IFWL_ToolTipTarget * toolTipTarget = CFWL_ToolTipContainer::getInstance()->GetCurrentToolTipTarget(); + if (toolTipTarget && !toolTipTarget->UseDefaultTheme()) { + return toolTipTarget->DrawToolTip(pGraphics, pMatrix, m_pInterface); + } + _FWL_RETURN_VALUE_IF_FAIL(pGraphics, FWL_ERR_Indefinite); + _FWL_RETURN_VALUE_IF_FAIL(m_pProperties->m_pThemeProvider, FWL_ERR_Indefinite); + IFWL_ThemeProvider *pTheme = m_pProperties->m_pThemeProvider; + DrawBkground(pGraphics, pTheme, pMatrix); + DrawText(pGraphics, pTheme, pMatrix); + return FWL_ERR_Succeeded; +} +void CFWL_ToolTipImp::DrawBkground(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix) +{ + CFWL_ThemeBackground param; + param.m_pWidget = m_pInterface; + param.m_iPart = FWL_PART_TTP_Background; + param.m_dwStates = m_pProperties->m_dwStates; + param.m_pGraphics = pGraphics; + if (pMatrix) { + param.m_matrix.Concat(*pMatrix); + } + param.m_rtPart = m_rtClient; + if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) { + param.m_pData = &m_rtCaption; + } + pTheme->DrawBackground(¶m); +} +void CFWL_ToolTipImp::DrawText(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix) +{ + _FWL_RETURN_IF_FAIL(m_pProperties->m_pDataProvider); + CFX_WideString wsCaption; + m_pProperties->m_pDataProvider->GetCaption(m_pInterface, wsCaption); + if (wsCaption.IsEmpty()) { + return; + } + CFWL_ThemeText param; + param.m_pWidget = m_pInterface; + param.m_iPart = FWL_PART_TTP_Caption; + param.m_dwStates = m_pProperties->m_dwStates; + param.m_pGraphics = pGraphics; + if (pMatrix) { + param.m_matrix.Concat(*pMatrix); + } + param.m_rtPart = m_rtCaption; + param.m_wsText = wsCaption; + param.m_dwTTOStyles = m_dwTTOStyles; + param.m_iTTOAlign = m_iTTOAlign; + pTheme->DrawText(¶m); +} +void CFWL_ToolTipImp::UpdateTextOutStyles() +{ + m_iTTOAlign = FDE_TTOALIGNMENT_Center; + m_dwTTOStyles = FDE_TTOSTYLE_SingleLine; + if (m_pProperties->m_dwStyleExes & FWL_WGTSTYLE_RTLReading) { + m_dwTTOStyles |= FDE_TTOSTYLE_RTL; + } + if ( m_pProperties->m_dwStyleExes & FWL_STYLEEXT_TTP_Multiline) { + m_dwTTOStyles &= ~FDE_TTOSTYLE_SingleLine; + } +} +FWL_ERR CFWL_ToolTipImp::SetAnchor(const CFX_RectF &rtAnchor) +{ + m_rtAnchor = rtAnchor; + return TRUE; +} +FWL_ERR CFWL_ToolTipImp::Show() +{ + IFWL_ToolTipDP *pData = (IFWL_ToolTipDP*)m_pProperties->m_pDataProvider; + FX_INT32 nInitDelay = pData->GetInitialDelay(m_pInterface); + if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Invisible)) { + m_hTimerShow = FWL_StartTimer( &m_TimerShow, nInitDelay, FALSE); + } + return TRUE; +} +FWL_ERR CFWL_ToolTipImp::Hide() +{ + SetStates( FWL_WGTSTATE_Invisible, TRUE); + if ( m_hTimerHide) { + FWL_StopTimer(m_hTimerHide); + m_hTimerHide = NULL; + } + if ( m_hTimerShow) { + FWL_StopTimer(m_hTimerShow); + m_hTimerShow = NULL; + } + return TRUE; +} +FWL_ERR CFWL_ToolTipImp::SetStates(FX_DWORD dwStates, FX_BOOL bSet ) +{ + if ( (dwStates & FWL_WGTSTATE_Invisible) && !bSet) { + IFWL_ToolTipDP *pData = (IFWL_ToolTipDP*)m_pProperties->m_pDataProvider; + FX_INT32 nAutoPopDelay = pData->GetAutoPopDelay(m_pInterface); + m_hTimerHide = FWL_StartTimer( &m_TimerHide, nAutoPopDelay, FALSE); + } + return CFWL_WidgetImp::SetStates(dwStates, bSet); +} +void CFWL_ToolTipImp::RefreshToolTipPos() +{ + if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_TTP_NoAnchor) == 0) { + CFX_RectF rtPopup; + CFX_RectF rtWidget(m_pProperties->m_rtWidget); + CFX_RectF rtAnchor(m_rtAnchor); + rtPopup.Set( 0, 0, 0, 0); + FX_FLOAT fx = rtAnchor.Center().x + 20; + FX_FLOAT fy = rtAnchor.Center().y + 20; + rtPopup.Set( fx, fy, rtWidget.Width(), rtWidget.Height()); + FX_FLOAT fScreenWidth = 0; + FX_FLOAT fScreenHeight = 0; + GetScreenSize(fScreenWidth, fScreenHeight); + if (rtPopup.bottom() > fScreenHeight) { + rtPopup.Offset( 0, fScreenHeight - rtPopup.bottom()); + } + if ( rtPopup.right() > fScreenWidth) { + rtPopup.Offset( fScreenWidth - rtPopup.right(), 0); + } + if ( rtPopup.left < 0) { + rtPopup.Offset(0 - rtPopup.left, 0); + } + if ( rtPopup.top < 0) { + rtPopup.Offset( 0, 0 - rtPopup.top); + } + SetWidgetRect(rtPopup); + Update(); + } +} +CFWL_ToolTipImp::CFWL_ToolTipTimer::CFWL_ToolTipTimer(CFWL_ToolTipImp * pToolTip) + : m_pToolTip(pToolTip) +{ +} +FX_INT32 CFWL_ToolTipImp::CFWL_ToolTipTimer::Run(FWL_HTIMER hTimer) +{ + if (m_pToolTip->m_hTimerShow == hTimer && m_pToolTip->m_hTimerShow) { + if (m_pToolTip->GetStates() & FWL_WGTSTATE_Invisible) { + m_pToolTip->SetStates(FWL_WGTSTATE_Invisible, FALSE); + m_pToolTip->RefreshToolTipPos(); + FWL_StopTimer(m_pToolTip->m_hTimerShow); + m_pToolTip->m_hTimerShow = NULL; + return TRUE; + } + } + if (m_pToolTip->m_hTimerHide == hTimer && m_pToolTip->m_hTimerHide) { + m_pToolTip->SetStates(FWL_WGTSTATE_Invisible, TRUE); + FWL_StopTimer(m_pToolTip->m_hTimerHide); + m_pToolTip->m_hTimerHide = NULL; + return TRUE; + } + return TRUE; +} +CFWL_ToolTipImpDelegate::CFWL_ToolTipImpDelegate(CFWL_ToolTipImp *pOwner) + : m_pOwner(pOwner) +{ +} +FX_INT32 CFWL_ToolTipImpDelegate::OnProcessMessage(CFWL_Message *pMessage) +{ + return CFWL_WidgetImpDelegate::OnProcessMessage(pMessage); +} +FWL_ERR CFWL_ToolTipImpDelegate::OnProcessEvent(CFWL_Event *pEvent) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ToolTipImpDelegate::OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + return m_pOwner->DrawWidget(pGraphics, pMatrix); +} diff --git a/xfa/src/fwl/src/basewidget/fxmath_barcodeimp.cpp b/xfa/src/fwl/src/basewidget/fxmath_barcodeimp.cpp new file mode 100644 index 0000000000..c56932b4fa --- /dev/null +++ b/xfa/src/fwl/src/basewidget/fxmath_barcodeimp.cpp @@ -0,0 +1,400 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "include/fxmath_barcodeimp.h" +static CBC_CodeBase* FX_Barcode_CreateBarCodeEngineObject(BC_TYPE type) +{ + switch(type) { + case BC_CODE39: + return FX_NEW CBC_Code39(); + case BC_CODABAR: + return FX_NEW CBC_Codabar(); + case BC_CODE128: + return FX_NEW CBC_Code128(BC_CODE128_B); + case BC_CODE128_B: + return FX_NEW CBC_Code128(BC_CODE128_B); + case BC_CODE128_C: + return FX_NEW CBC_Code128(BC_CODE128_C); + case BC_EAN8: + return FX_NEW CBC_EAN8(); + case BC_UPCA: + return FX_NEW CBC_UPCA(); + case BC_EAN13: + return FX_NEW CBC_EAN13(); + case BC_QR_CODE: + return FX_NEW CBC_QRCode(); + case BC_PDF417: + return FX_NEW CBC_PDF417I(); + case BC_DATAMATRIX: + return FX_NEW CBC_DataMatrix(); + case BC_UNKNOWN: + default: + return NULL; + } +} +CFX_Barcode::CFX_Barcode() +{ +} +CFX_Barcode::~CFX_Barcode() +{ + if(m_pBCEngine) { + delete m_pBCEngine; + m_pBCEngine = NULL; + } +} +FX_BOOL CFX_Barcode::Crreate(BC_TYPE type) +{ + m_pBCEngine = FX_Barcode_CreateBarCodeEngineObject(type); + return m_pBCEngine != NULL; +} +void CFX_Barcode::Release() +{ + delete this; +} +BC_TYPE CFX_Barcode::GetType() +{ + return m_pBCEngine ? m_pBCEngine->GetType() : BC_UNKNOWN; +} +FX_BOOL CFX_Barcode::SetCharEncoding(BC_CHAR_ENCODING encoding) +{ + return m_pBCEngine ? m_pBCEngine->SetCharEncoding(encoding) : FALSE; +} +FX_BOOL CFX_Barcode::SetModuleHeight(FX_INT32 moduleHeight) +{ + return m_pBCEngine ? m_pBCEngine->SetModuleHeight(moduleHeight) : FALSE; +} +FX_BOOL CFX_Barcode::SetModuleWidth(FX_INT32 moduleWidth) +{ + return m_pBCEngine ? m_pBCEngine->SetModuleWidth(moduleWidth) : FALSE; +} +FX_BOOL CFX_Barcode::SetHeight(FX_INT32 height) +{ + return m_pBCEngine ? m_pBCEngine->SetHeight(height) : FALSE; +} +FX_BOOL CFX_Barcode::SetWidth(FX_INT32 width) +{ + return m_pBCEngine ? m_pBCEngine->SetWidth(width) : FALSE; +} +FX_BOOL CFX_Barcode::CheckContentValidity(FX_WSTR contents) +{ + switch(GetType()) { + case BC_CODE39: + case BC_CODABAR: + case BC_CODE128: + case BC_CODE128_B: + case BC_CODE128_C: + case BC_EAN8: + case BC_EAN13: + case BC_UPCA: + return m_pBCEngine ? ((CBC_OneCode*)m_pBCEngine)->CheckContentValidity(contents) + : TRUE; + default: + return TRUE; + } +} +FX_BOOL CFX_Barcode::SetPrintChecksum(FX_BOOL checksum) +{ + switch(GetType()) { + case BC_CODE39: + case BC_CODABAR: + case BC_CODE128: + case BC_CODE128_B: + case BC_CODE128_C: + case BC_EAN8: + case BC_EAN13: + case BC_UPCA: + return m_pBCEngine ? (((CBC_OneCode*)m_pBCEngine)->SetPrintChecksum(checksum), TRUE) + : FALSE; + default: + return FALSE; + } +} +FX_BOOL CFX_Barcode::SetDataLength(FX_INT32 length) +{ + switch(GetType()) { + case BC_CODE39: + case BC_CODABAR: + case BC_CODE128: + case BC_CODE128_B: + case BC_CODE128_C: + case BC_EAN8: + case BC_EAN13: + case BC_UPCA: + return m_pBCEngine ? (((CBC_OneCode*)m_pBCEngine)->SetDataLength(length), TRUE) + : FALSE; + default: + return FALSE; + } +} +FX_BOOL CFX_Barcode::SetCalChecksum(FX_INT32 state) +{ + switch(GetType()) { + case BC_CODE39: + case BC_CODABAR: + case BC_CODE128: + case BC_CODE128_B: + case BC_CODE128_C: + case BC_EAN8: + case BC_EAN13: + case BC_UPCA: + return m_pBCEngine ? (((CBC_OneCode*)m_pBCEngine)->SetCalChecksum(state), TRUE) + : FALSE; + default: + return FALSE; + } +} +FX_BOOL CFX_Barcode::SetFont(CFX_Font* pFont) +{ + switch(GetType()) { + case BC_CODE39: + case BC_CODABAR: + case BC_CODE128: + case BC_CODE128_B: + case BC_CODE128_C: + case BC_EAN8: + case BC_EAN13: + case BC_UPCA: + return m_pBCEngine ? ((CBC_OneCode*)m_pBCEngine)->SetFont(pFont) + : FALSE; + default: + return FALSE; + } +} +FX_BOOL CFX_Barcode::SetFontSize(FX_FLOAT size) +{ + switch(GetType()) { + case BC_CODE39: + case BC_CODABAR: + case BC_CODE128: + case BC_CODE128_B: + case BC_CODE128_C: + case BC_EAN8: + case BC_EAN13: + case BC_UPCA: + return m_pBCEngine ? (((CBC_OneCode*)m_pBCEngine)->SetFontSize(size), TRUE) + : FALSE; + default: + return FALSE; + } +} +FX_BOOL CFX_Barcode::SetFontStyle(FX_INT32 style) +{ + switch(GetType()) { + case BC_CODE39: + case BC_CODABAR: + case BC_CODE128: + case BC_CODE128_B: + case BC_CODE128_C: + case BC_EAN8: + case BC_EAN13: + case BC_UPCA: + return m_pBCEngine ? (((CBC_OneCode*)m_pBCEngine)->SetFontStyle(style), TRUE) + : FALSE; + default: + return FALSE; + } +} +FX_BOOL CFX_Barcode::SetFontColor(FX_ARGB color) +{ + switch(GetType()) { + case BC_CODE39: + case BC_CODABAR: + case BC_CODE128: + case BC_CODE128_B: + case BC_CODE128_C: + case BC_EAN8: + case BC_EAN13: + case BC_UPCA: + return m_pBCEngine ? (((CBC_OneCode*)m_pBCEngine)->SetFontColor(color), TRUE) + : FALSE; + default: + return FALSE; + } +} +FX_BOOL CFX_Barcode::SetTextLocation(BC_TEXT_LOC location) +{ + typedef FX_BOOL (CBC_CodeBase::*memptrtype)(BC_TEXT_LOC); + memptrtype memptr = NULL; + switch(GetType()) { + case BC_CODE39: + memptr = (memptrtype)&CBC_Code39::SetTextLocation; + break; + case BC_CODABAR: + memptr = (memptrtype)&CBC_Codabar::SetTextLocation; + break; + case BC_CODE128: + case BC_CODE128_B: + case BC_CODE128_C: + memptr = (memptrtype)&CBC_Code128::SetTextLocation; + break; + default: + break; + } + return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(location) + : FALSE; +} +FX_BOOL CFX_Barcode::SetWideNarrowRatio(FX_INT32 ratio) +{ + typedef FX_BOOL (CBC_CodeBase::*memptrtype)(FX_INT32); + memptrtype memptr = NULL; + switch(GetType()) { + case BC_CODE39: + memptr = (memptrtype)&CBC_Code39::SetWideNarrowRatio; + break; + case BC_CODABAR: + memptr = (memptrtype)&CBC_Codabar::SetWideNarrowRatio; + break; + default: + break; + } + return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(ratio) + : FALSE; +} +FX_BOOL CFX_Barcode::SetStartChar(FX_CHAR start) +{ + typedef FX_BOOL (CBC_CodeBase::*memptrtype)(FX_CHAR); + memptrtype memptr = NULL; + switch(GetType()) { + case BC_CODABAR: + memptr = (memptrtype)&CBC_Codabar::SetStartChar; + break; + default: + break; + } + return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(start) + : FALSE; +} +FX_BOOL CFX_Barcode::SetEndChar(FX_CHAR end) +{ + typedef FX_BOOL (CBC_CodeBase::*memptrtype)(FX_CHAR); + memptrtype memptr = NULL; + switch(GetType()) { + case BC_CODABAR: + memptr = (memptrtype)&CBC_Codabar::SetEndChar; + break; + default: + break; + } + return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(end) + : FALSE; +} +FX_BOOL CFX_Barcode::SetVersion(FX_INT32 version) +{ + typedef FX_BOOL (CBC_CodeBase::*memptrtype)(FX_INT32); + memptrtype memptr = NULL; + switch(GetType()) { + case BC_QR_CODE: + memptr = (memptrtype)&CBC_QRCode::SetVersion; + break; + default: + break; + } + return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(version) + : FALSE; +} +FX_BOOL CFX_Barcode::SetErrorCorrectionLevel(FX_INT32 level) +{ + typedef FX_BOOL (CBC_CodeBase::*memptrtype)(FX_INT32); + memptrtype memptr = NULL; + switch(GetType()) { + case BC_QR_CODE: + memptr = (memptrtype)&CBC_QRCode::SetErrorCorrectionLevel; + break; + case BC_PDF417: + memptr = (memptrtype)&CBC_PDF417I::SetErrorCorrectionLevel; + break; + default: + return FALSE; + } + return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(level) + : FALSE; +} +FX_BOOL CFX_Barcode::SetTruncated(FX_BOOL truncated) +{ + typedef void (CBC_CodeBase::*memptrtype)(FX_BOOL); + memptrtype memptr = NULL; + switch(GetType()) { + case BC_PDF417: + memptr = (memptrtype)&CBC_PDF417I::SetTruncated; + break; + default: + break; + } + return m_pBCEngine && memptr ? ((m_pBCEngine->*memptr)(truncated), TRUE) + : FALSE; +} +#ifndef BCExceptionNO +#define BCExceptionNO 0 +#endif +#ifndef BCExceptionFormatException +#define BCExceptionFormatException 8 +#endif +#ifndef BCExceptionUnSupportedBarcode +#define BCExceptionUnSupportedBarcode 18 +#endif +FX_BOOL CFX_Barcode::Encode(FX_WSTR contents, FX_BOOL isDevice, FX_INT32 &e) +{ + if(!m_pBCEngine) { + return FALSE; + } + return m_pBCEngine->Encode(contents, isDevice, e); +} +FX_BOOL CFX_Barcode::RenderDevice(CFX_RenderDevice* device, const CFX_Matrix* matirx, FX_INT32 &e) +{ + if (!m_pBCEngine) { + return FALSE; + } + return m_pBCEngine->RenderDevice(device, matirx, e); +} +FX_BOOL CFX_Barcode::RenderBitmap(CFX_DIBitmap *&pOutBitmap, FX_INT32 &e) +{ + if (!m_pBCEngine) { + return FALSE; + } + return m_pBCEngine->RenderBitmap(pOutBitmap, e); +} +#define BC_TYPE_MIN BC_CODE39 +#define BC_TYPE_MAX BC_DATAMATRIX +CFX_WideString CFX_Barcode::Decode(FX_BYTE* buf, FX_INT32 width, FX_INT32 height, FX_INT32 &errorCode) +{ + for(BC_TYPE t = BC_TYPE_MIN; t <= BC_TYPE_MAX; t = (BC_TYPE)((FX_INT32)t + 1)) { + CBC_CodeBase* pTmpEngine = FX_Barcode_CreateBarCodeEngineObject(t); + if(!pTmpEngine) { + continue; + } + CFX_WideString ret = pTmpEngine->Decode(buf, width, height, errorCode); + if(errorCode == BCExceptionNO) { + return ret; + } + } + errorCode = BCExceptionUnSupportedBarcode; + return CFX_WideString(); +} +CFX_WideString CFX_Barcode::Decode(CFX_DIBitmap *pBitmap, FX_INT32 &errorCode) +{ + for(BC_TYPE t = BC_TYPE_MIN; t <= BC_TYPE_MAX; t = (BC_TYPE)((FX_INT32)t + 1)) { + CBC_CodeBase* pTmpEngine = FX_Barcode_CreateBarCodeEngineObject(t); + if(!pTmpEngine) { + continue; + } + CFX_WideString ret = pTmpEngine->Decode(pBitmap, errorCode); + if(errorCode == BCExceptionNO) { + return ret; + } + } + errorCode = BCExceptionUnSupportedBarcode; + return CFX_WideString(); +} +IFX_Barcode* FX_Barcode_Create(BC_TYPE type) +{ + CFX_Barcode* pBarcode = FX_NEW CFX_Barcode; + if (pBarcode->Crreate(type)) { + return pBarcode; + } + pBarcode->Release(); + return NULL; +} diff --git a/xfa/src/fwl/src/basewidget/include/fwl_barcodeimp.h b/xfa/src/fwl/src/basewidget/include/fwl_barcodeimp.h new file mode 100644 index 0000000000..7a4681b6f8 --- /dev/null +++ b/xfa/src/fwl/src/basewidget/include/fwl_barcodeimp.h @@ -0,0 +1,51 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FWL_BARCODE_IMP_H +#define _FWL_BARCODE_IMP_H +class CFWL_WidgetImp; +class CFWL_WidgetImpProperties; +class CFWL_WidgetImpDelegate; +class CFWL_EditImp; +class CFWL_EditImpDelegate; +class IFWL_Widget; +class CFWL_BarcodeEdit; +class CFWL_BarcodeEditDelegate; +class CFWL_BarcodeImp; +class CFWL_BarcodeImpDelegate; +#define XFA_BCS_NeedUpdate 0x0001 +#define XFA_BCS_EncodeSuccess 0x0002 +class CFWL_BarcodeImp : public CFWL_EditImp +{ +public: + CFWL_BarcodeImp(IFWL_Widget *pOuter = NULL); + CFWL_BarcodeImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter = NULL); + virtual ~CFWL_BarcodeImp(); + virtual FWL_ERR GetClassName(CFX_WideString &wsClass) const; + virtual FX_DWORD GetClassID() const; + virtual FWL_ERR Initialize(); + virtual FWL_ERR Finalize(); + virtual FWL_ERR Update(); + virtual FWL_ERR DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); + virtual FWL_ERR SetText(const CFX_WideString &wsText); + virtual void SetType(BC_TYPE type); + FX_BOOL IsProtectedType(); +protected: + void GenerateBarcodeImageCache(); + void CreateBarcodeEngine(); + void ReleaseBarcodeEngine(); + IFX_Barcode *m_pBarcodeEngine; + FX_DWORD m_dwStatus; + BC_TYPE m_type; + friend class CFWL_BarcodeImpDelegate; +}; +class CFWL_BarcodeImpDelegate : public CFWL_EditImpDelegate +{ +public: + CFWL_BarcodeImpDelegate(CFWL_BarcodeImp *pOwner); + virtual FWL_ERR OnProcessEvent(CFWL_Event *pEvent); +}; +#endif diff --git a/xfa/src/fwl/src/basewidget/include/fwl_caretimp.h b/xfa/src/fwl/src/basewidget/include/fwl_caretimp.h new file mode 100644 index 0000000000..fcae080130 --- /dev/null +++ b/xfa/src/fwl/src/basewidget/include/fwl_caretimp.h @@ -0,0 +1,63 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FWL_CARET_IMP_H +#define _FWL_CARET_IMP_H +class CFWL_WidgetImp; +class CFWL_WidgetImpProperties; +class CFWL_WidgetImpDelegate; +class IFWL_Widget; +class CFWL_CaretImp; +class CFWL_CaretImpDelegate; +class CFWL_CaretImp : public CFWL_WidgetImp +{ +public: + CFWL_CaretImp(IFWL_Widget *pOuter = NULL); + CFWL_CaretImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter = NULL); + virtual ~CFWL_CaretImp(); + + virtual FWL_ERR GetClassName(CFX_WideString &wsClass) const; + virtual FX_DWORD GetClassID() const; + + virtual FWL_ERR Initialize(); + virtual FWL_ERR Finalize(); + + virtual FWL_ERR DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); + + virtual FWL_ERR ShowCaret(FX_BOOL bFlag = TRUE); + virtual FWL_ERR GetFrequency(FX_DWORD &elapse); + virtual FWL_ERR SetFrequency(FX_DWORD elapse); + virtual FWL_ERR SetColor(CFX_Color crFill); +protected: + FX_BOOL DrawCaretBK(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix); + class CFWL_CaretTimer : public CFX_Object + { + public: + CFWL_CaretTimer(CFWL_CaretImp *m_pCaret); + virtual FX_INT32 Run(FWL_HTIMER hTimer); + CFWL_CaretImp *m_pCaret; + + }; + CFWL_CaretTimer *m_pTimer; + FWL_HTIMER m_hTimer; + FX_DWORD m_dwElapse; + CFX_Color m_crFill; + FX_BOOL m_bSetColor; + friend class CFWL_CaretImpDelegate; + friend class CFWL_CaretTimer; + +}; +class CFWL_CaretImpDelegate : public CFWL_WidgetImpDelegate +{ +public: + CFWL_CaretImpDelegate(CFWL_CaretImp *pOwner); + virtual FX_INT32 OnProcessMessage(CFWL_Message *pMessage); + virtual FWL_ERR OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); + +protected: + CFWL_CaretImp *m_pOwner; +}; +#endif diff --git a/xfa/src/fwl/src/basewidget/include/fwl_checkboximp.h b/xfa/src/fwl/src/basewidget/include/fwl_checkboximp.h new file mode 100644 index 0000000000..0e538f32d6 --- /dev/null +++ b/xfa/src/fwl/src/basewidget/include/fwl_checkboximp.h @@ -0,0 +1,60 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FWL_CHECKBOX_IMP_H +#define _FWL_CHECKBOX_IMP_H +class CFWL_WidgetImp; +class CFWL_WidgetImpProperties; +class CFWL_WidgetImpDelegate; +class IFWL_Widget; +class CFWL_CheckBoxImp; +class CFWL_CheckBoxImpDelegate; +class CFWL_CheckBoxImp : public CFWL_WidgetImp +{ +public: + CFWL_CheckBoxImp(IFWL_Widget *pOuter = NULL); + CFWL_CheckBoxImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter = NULL); + ~CFWL_CheckBoxImp(); + virtual FWL_ERR GetClassName(CFX_WideString &wsClass) const; + virtual FX_DWORD GetClassID() const; + virtual FWL_ERR Initialize(); + virtual FWL_ERR Finalize(); + virtual FWL_ERR GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize = FALSE); + virtual FWL_ERR Update(); + virtual FWL_ERR DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); + virtual FX_INT32 GetCheckState(); + virtual FWL_ERR SetCheckState(FX_INT32 iCheck); +protected: + void Layout(); + FX_DWORD GetPartStates(); + void UpdateTextOutStyles(); + void NextStates(); + CFX_RectF m_rtClient; + CFX_RectF m_rtBox; + CFX_RectF m_rtCaption; + CFX_RectF m_rtFocus; + FX_DWORD m_dwTTOStyles; + FX_INT32 m_iTTOAlign; + FX_BOOL m_bBtnDown; + friend class CFWL_CheckBoxImpDelegate; +}; +class CFWL_CheckBoxImpDelegate : public CFWL_WidgetImpDelegate +{ +public: + CFWL_CheckBoxImpDelegate(CFWL_CheckBoxImp *pOwner); + virtual FX_INT32 OnProcessMessage(CFWL_Message *pMessage); + virtual FWL_ERR OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); +protected: + void OnActivate(CFWL_Message *pMsg); + void OnFocusChanged(CFWL_Message *pMsg, FX_BOOL bSet = TRUE); + void OnLButtonDown(CFWL_MsgMouse *pMsg); + void OnLButtonUp(CFWL_MsgMouse *pMsg); + void OnMouseMove(CFWL_MsgMouse *pMsg); + void OnMouseLeave(CFWL_MsgMouse *pMsg); + void OnKeyDown(CFWL_MsgKey *pMsg); + CFWL_CheckBoxImp *m_pOwner; +}; +#endif diff --git a/xfa/src/fwl/src/basewidget/include/fwl_comboboximp.h b/xfa/src/fwl/src/basewidget/include/fwl_comboboximp.h new file mode 100644 index 0000000000..250ef35e79 --- /dev/null +++ b/xfa/src/fwl/src/basewidget/include/fwl_comboboximp.h @@ -0,0 +1,227 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FWL_COMBOBOX_IMP_H +#define _FWL_COMBOBOX_IMP_H +class CFWL_WidgetImp; +class CFWL_WidgetImpProperties; +class CFWL_WidgetImpDelegate; +class CFWL_EditImp; +class CFWL_EditImpDelegate; +class CFWL_ListBoxImp; +class CFWL_ListBoxImpDelegate; +class CFWL_FormProxyImp; +class IFWL_Widget; +class CFWL_ComboEdit; +class CFWL_ComboEditDelegate; +class CFWL_ComboList; +class CFWL_ComboListDelegate; +class CFWL_ComboBoxImp; +class CFWL_ComboBoxImpDelegate; +class CFWL_ComboProxyImpDelegate; +class CFWL_ComboEdit : public CFWL_EditImp +{ +public: + CFWL_ComboEdit(IFWL_Widget *pOuter); + CFWL_ComboEdit(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter = NULL); + + void ClearSelected(); + void SetSelected(); + void EndCaret(); + void FlagFocus(FX_BOOL bSet); +protected: + void SetComboBoxFocus(FX_BOOL bSet); + CFWL_ComboBoxImp *m_pOuter; + friend class CFWL_ComboEditDelegate; +}; +class CFWL_ComboEditDelegate : public CFWL_EditImpDelegate +{ +public: + CFWL_ComboEditDelegate(CFWL_ComboEdit *pOwner); + virtual FX_INT32 OnProcessMessage(CFWL_Message *pMessage); +protected: + CFWL_ComboEdit *m_pOwner; +}; +class CFWL_ComboList : public CFWL_ListBoxImp +{ +public: + CFWL_ComboList(IFWL_Widget *pOuter); + CFWL_ComboList(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter); + virtual FWL_ERR Initialize(); + virtual FWL_ERR Finalize(); + FX_INT32 MatchItem(const CFX_WideString &wsMatch); + void ChangeSelected(FX_INT32 iSel); + FX_INT32 CountItems(); + void GetItemRect(FX_INT32 nIndex, CFX_RectF &rtItem); + void ClientToOuter(FX_FLOAT &fx, FX_FLOAT &fy); + void SetFocus(FX_BOOL bSet); + FX_BOOL m_bNotifyOwner; + friend class CFWL_ComboListDelegate; + friend class CFWL_ComboBoxImp; +}; +class CFWL_ComboListDelegate : public CFWL_ListBoxImpDelegate +{ +public: + CFWL_ComboListDelegate(CFWL_ComboList *pOwner); + virtual FX_INT32 OnProcessMessage(CFWL_Message *pMessage); +protected: + void OnDropListFocusChanged(CFWL_Message *pMsg, FX_BOOL bSet = TRUE); + FX_INT32 OnDropListMouseMove(CFWL_MsgMouse *pMsg); + FX_INT32 OnDropListLButtonDown(CFWL_MsgMouse *pMsg); + FX_INT32 OnDropListLButtonUp(CFWL_MsgMouse *pMsg); + FX_INT32 OnDropListKey(CFWL_MsgKey *pKey); + void OnDropListKeyDown(CFWL_MsgKey *pKey); + CFWL_ComboList *m_pOwner; +}; +class CFWL_ComboBoxImp : public CFWL_WidgetImp +{ +public: + CFWL_ComboBoxImp(IFWL_Widget *pOuter = NULL); + CFWL_ComboBoxImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter = NULL); + virtual ~CFWL_ComboBoxImp(); + virtual FWL_ERR GetClassName(CFX_WideString &wsClass) const; + virtual FX_DWORD GetClassID() const; + virtual FWL_ERR Initialize(); + virtual FWL_ERR Finalize(); + virtual FWL_ERR GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize = FALSE); + virtual FWL_ERR ModifyStylesEx(FX_DWORD dwStylesExAdded, FX_DWORD dwStylesExRemoved); + virtual FWL_ERR SetStates(FX_DWORD dwStates, FX_BOOL bSet = TRUE); + virtual FWL_ERR Update(); + virtual FX_DWORD HitTest(FX_FLOAT fx, FX_FLOAT fy); + virtual FWL_ERR DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); + virtual FWL_ERR SetThemeProvider(IFWL_ThemeProvider *pThemeProvider); + virtual FX_INT32 GetCurSel(); + virtual FWL_ERR SetCurSel(FX_INT32 iSel); + virtual FWL_ERR SetEditText(const CFX_WideString &wsText); + virtual FX_INT32 GetEditTextLength() const; + virtual FWL_ERR GetEditText(CFX_WideString &wsText, FX_INT32 nStart = 0, FX_INT32 nCount = -1) const; + virtual FWL_ERR SetEditSelRange(FX_INT32 nStart, FX_INT32 nCount = -1); + virtual FX_INT32 GetEditSelRange(FX_INT32 nIndex, FX_INT32 &nStart); + virtual FX_INT32 GetEditLimit(); + virtual FWL_ERR SetEditLimit(FX_INT32 nLimit); + virtual FWL_ERR EditDoClipboard(FX_INT32 iCmd); + virtual FX_BOOL EditRedo(FX_BSTR bsRecord); + virtual FX_BOOL EditUndo(FX_BSTR bsRecord); + virtual IFWL_ListBox* GetListBoxt(); + virtual FX_BOOL AfterFocusShowDropList(); + virtual FX_ERR OpenDropDownList(FX_BOOL bActivate); + virtual FX_BOOL EditCanUndo(); + virtual FX_BOOL EditCanRedo(); + virtual FX_BOOL EditUndo(); + virtual FX_BOOL EditRedo(); + virtual FX_BOOL EditCanCopy(); + virtual FX_BOOL EditCanCut(); + virtual FX_BOOL EditCanSelectAll(); + virtual FX_BOOL EditCopy(CFX_WideString &wsCopy); + virtual FX_BOOL EditCut(CFX_WideString &wsCut); + virtual FX_BOOL EditPaste(const CFX_WideString &wsPaste); + virtual FX_BOOL EditSelectAll(); + virtual FX_BOOL EditDelete(); + virtual FX_BOOL EditDeSelect(); + virtual FWL_ERR GetBBox(CFX_RectF &rect); + virtual FWL_ERR EditModifyStylesEx(FX_DWORD dwStylesExAdded, FX_DWORD dwStylesExRemoved); +protected: + void DrawStretchHandler(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix); + FX_FLOAT GetListHeight(); + void ShowDropList(FX_BOOL bActivate); + FX_BOOL IsDropListShowed(); + FX_BOOL IsDropDownStyle() const; + void MatchEditText(); + void SynchrEditText(FX_INT32 iListItem); + void Layout(); + void ReSetTheme(); + void ReSetEditAlignment(); + void ReSetListItemAlignment(); + void ProcessSelChanged(FX_BOOL bLButtonUp); + void InitProxyForm(); +protected: + FWL_ERR DisForm_Initialize(); + void DisForm_InitComboList(); + void DisForm_InitComboEdit(); + void DisForm_ShowDropList(FX_BOOL bActivate); + FX_BOOL DisForm_IsDropListShowed(); + FWL_ERR DisForm_ModifyStylesEx(FX_DWORD dwStylesExAdded, FX_DWORD dwStylesExRemoved); + FWL_ERR DisForm_Update(); + FX_DWORD DisForm_HitTest(FX_FLOAT fx, FX_FLOAT fy); + FWL_ERR DisForm_DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); + FWL_ERR DisForm_GetBBox(CFX_RectF &rect); + void DisForm_Layout(); +protected: + CFX_RectF m_rtClient; + CFX_RectF m_rtContent; + CFX_RectF m_rtBtn; + CFX_RectF m_rtList; + CFX_RectF m_rtProxy; + CFX_RectF m_rtHandler; + IFWL_Edit *m_pEdit; + IFWL_ListBox *m_pListBox; + IFWL_Form *m_pForm; + FX_BOOL m_bLButtonDown; + FX_BOOL m_bUpFormHandler; + FX_INT32 m_iCurSel; + FX_INT32 m_iBtnState; + FX_FLOAT m_fComboFormHandler; + FX_FLOAT m_fItemHeight; + FX_BOOL m_bNeedShowList; + CFWL_FormProxyImp *m_pProxy; + CFWL_ComboProxyImpDelegate *m_pListProxyDelegate; + + friend class CFWL_ComboList; + friend class CFWL_ComboEdit; + friend class CFWL_ComboEditDelegate; + friend class CFWL_ComboListDelegate; + friend class CFWL_ComboBoxImpDelegate; + friend class CFWL_ComboProxyImpDelegate; +}; +class CFWL_ComboBoxImpDelegate : public CFWL_WidgetImpDelegate +{ +public: + CFWL_ComboBoxImpDelegate(CFWL_ComboBoxImp *pOwner); + virtual FX_INT32 OnProcessMessage(CFWL_Message *pMessage); + virtual FWL_ERR OnProcessEvent(CFWL_Event *pEvent); + virtual FWL_ERR OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); + +protected: + void OnFocusChanged(CFWL_Message *pMsg, FX_BOOL bSet = TRUE); + void OnLButtonDown(CFWL_MsgMouse *pMsg); + void OnLButtonUp(CFWL_MsgMouse *pMsg); + void OnMouseMove(CFWL_MsgMouse *pMsg); + void OnMouseLeave(CFWL_MsgMouse *pMsg); + void OnKey(CFWL_MsgKey *pMsg); + void DoSubCtrlKey(CFWL_MsgKey *pMsg); +protected: + FX_INT32 DisForm_OnProcessMessage(CFWL_Message *pMessage); + void DisForm_OnLButtonDown(CFWL_MsgMouse *pMsg); + void DisForm_OnFocusChanged(CFWL_Message *pMsg, FX_BOOL bSet = TRUE); + void DisForm_OnKey(CFWL_MsgKey *pMsg); +protected: + CFWL_ComboBoxImp *m_pOwner; + friend class CFWL_ComboEditDelegate; + friend class CFWL_ComboListDelegate; +}; +class CFWL_ComboProxyImpDelegate : public CFWL_WidgetImpDelegate +{ +public: + CFWL_ComboProxyImpDelegate(IFWL_Form *pForm, CFWL_ComboBoxImp *pComboBox); + virtual FX_INT32 OnProcessMessage(CFWL_Message *pMessage); + virtual FWL_ERR OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); + void Reset() + { + m_bLButtonUpSelf = FALSE; + } +protected: + void OnLButtonDown(CFWL_MsgMouse *pMsg); + void OnLButtonUp(CFWL_MsgMouse *pMsg); + void OnMouseMove(CFWL_MsgMouse *pMsg); + void OnDeactive(CFWL_MsgDeactivate *pMsg); + void OnFocusChanged(CFWL_MsgKillFocus *pMsg, FX_BOOL bSet ); + FX_BOOL m_bLButtonDown; + FX_BOOL m_bLButtonUpSelf; + FX_FLOAT m_fStartPos; + IFWL_Form *m_pForm; + CFWL_ComboBoxImp *m_pComboBox; +}; +#endif diff --git a/xfa/src/fwl/src/basewidget/include/fwl_datetimepickerimp.h b/xfa/src/fwl/src/basewidget/include/fwl_datetimepickerimp.h new file mode 100644 index 0000000000..cc8db6ada1 --- /dev/null +++ b/xfa/src/fwl/src/basewidget/include/fwl_datetimepickerimp.h @@ -0,0 +1,206 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FWL_DATETIMEPICKER_IMP_H +#define _FWL_DATETIMEPICKER_IMP_H +class CFWL_WidgetImp; +class CFWL_WidgetImpProperties; +class CFWL_WidgetImpDelegate; +class CFWL_EditImp; +class CFWL_EditImpDelegate; +class CFWL_MonthCalendarImp; +class CFWL_MonthCalendarImpDelegate; +class CFWL_FormProxyImp; +class CFWL_DateTimeEdit; +class CFWL_DateTimeEditDelegate; +class CFWL_DateTimeCalendar; +class CFWL_DateTimeCalendarDelegate; +class CFWL_DateTimePickerImp; +class CFWL_DateTimePickerImpDelegate; +class IFWL_DateTimeForm : public IFWL_Form +{ +public: + FWL_ERR Initialize(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter = NULL); +}; +class IFWL_DateTimeCalender : public IFWL_MonthCalendar +{ +public: + FWL_ERR Initialize(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter = NULL); +}; +class IFWL_DateTimeEdit : public IFWL_Edit +{ +public: + FWL_ERR Initialize(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter = NULL); +}; +class CFWL_DateTimeEdit : public CFWL_EditImp +{ +public: + CFWL_DateTimeEdit(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter); + virtual FWL_ERR Initialize(); + virtual FWL_ERR Finalize(); +protected: + friend class CFWL_DateTimeEditDelegate; +}; +class CFWL_DateTimeEditDelegate : public CFWL_EditImpDelegate +{ +public: + CFWL_DateTimeEditDelegate(CFWL_DateTimeEdit *pOwner); + virtual FX_INT32 OnProcessMessage(CFWL_Message *pMessage); +private: + FX_INT32 DisForm_OnProcessMessage(CFWL_Message *pMessage); + +protected: + CFWL_DateTimeEdit *m_pOwner; +}; +class CFWL_DateTimeCalendar : public CFWL_MonthCalendarImp +{ +public: + CFWL_DateTimeCalendar(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter); + virtual FWL_ERR Initialize(); + virtual FWL_ERR Finalize(); +protected: + friend class CFWL_DateTimeCalendarDelegate; +}; +class CFWL_DateTimeCalendarDelegate : public CFWL_MonthCalendarImpDelegate +{ +public: + CFWL_DateTimeCalendarDelegate(CFWL_DateTimeCalendar *pOwner); + virtual FX_INT32 OnProcessMessage(CFWL_Message *pMessage); + void OnLButtonDownEx(CFWL_MsgMouse *pMsg); + void OnLButtonUpEx(CFWL_MsgMouse *pMsg); + void OnMouseMoveEx(CFWL_MsgMouse *pMsg); +private: + FX_INT32 DisForm_OnProcessMessage(CFWL_Message *pMessage); + void DisForm_OnLButtonUpEx(CFWL_MsgMouse *pMsg); +protected: + CFWL_DateTimeCalendar *m_pOwner; + FX_BOOL m_bFlag; +}; +class CFWL_DateTimePickerImp : public CFWL_WidgetImp +{ +public: + CFWL_DateTimePickerImp(IFWL_Widget *pOuter = NULL); + CFWL_DateTimePickerImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter = NULL); + virtual ~CFWL_DateTimePickerImp(); + virtual FWL_ERR GetClassName(CFX_WideString &wsClass) const; + virtual FX_DWORD GetClassID() const; + virtual FWL_ERR Initialize(); + virtual FWL_ERR Finalize(); + virtual FWL_ERR GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize = FALSE); + virtual FWL_ERR Update(); + virtual FX_DWORD HitTest(FX_FLOAT fx, FX_FLOAT fy); + virtual FWL_ERR DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); + virtual FWL_ERR SetThemeProvider(IFWL_ThemeProvider *pTP); + virtual FWL_ERR GetCurSel(FX_INT32 &iYear, FX_INT32 &iMonth, FX_INT32 &iDay); + virtual FWL_ERR SetCurSel(FX_INT32 iYear, FX_INT32 iMonth, FX_INT32 iDay); + virtual FWL_ERR SetEditText(const CFX_WideString &wsText); + virtual FWL_ERR GetEditText(CFX_WideString &wsText, FX_INT32 nStart = 0, FX_INT32 nCount = -1) const; +public: + virtual FX_BOOL CanUndo(); + virtual FX_BOOL CanRedo(); + virtual FX_BOOL Undo(); + virtual FX_BOOL Redo(); + virtual FX_BOOL CanCopy(); + virtual FX_BOOL CanCut(); + virtual FX_BOOL CanSelectAll(); + virtual FX_BOOL Copy(CFX_WideString &wsCopy); + virtual FX_BOOL Cut(CFX_WideString &wsCut); + virtual FX_BOOL Paste(const CFX_WideString &wsPaste); + virtual FX_BOOL SelectAll(); + virtual FX_BOOL Delete(); + virtual FX_BOOL DeSelect(); + virtual FWL_ERR GetBBox(CFX_RectF &rect); + virtual FWL_ERR SetEditLimit(FX_INT32 nLimit); + virtual FWL_ERR ModifyEditStylesEx(FX_DWORD dwStylesExAdded, FX_DWORD dwStylesExRemoved); +public: + IFWL_DateTimeEdit* GetDataTimeEdit(); +protected: + void DrawDropDownButton(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix); + void FormatDateString(FX_INT32 iYear, FX_INT32 iMonth, FX_INT32 iDay, CFX_WideString &wsText); + void ShowMonthCalendar(FX_BOOL bActivate); + FX_BOOL IsMonthCalendarShowed(); + void ReSetEditAlignment(); + void InitProxyForm(); + void ProcessSelChanged(FX_INT32 iYear, FX_INT32 iMonth, FX_INT32 iDay); +private: + FWL_ERR DisForm_Initialize(); + void DisForm_InitDateTimeCalendar(); + void DisForm_InitDateTimeEdit(); + FX_BOOL DisForm_IsMonthCalendarShowed(); + void DisForm_ShowMonthCalendar(FX_BOOL bActivate); + FX_DWORD DisForm_HitTest(FX_FLOAT fx, FX_FLOAT fy); + FX_BOOL DisForm_IsNeedShowButton(); + FWL_ERR DisForm_Update(); + FWL_ERR DisForm_GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize = FALSE); + FWL_ERR DisForm_GetBBox(CFX_RectF &rect); + FWL_ERR DisForm_DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); +protected: + + CFX_RectF m_rtBtn; + CFX_RectF m_rtClient; + FX_INT32 m_iBtnState; + FX_INT32 m_iYear; + FX_INT32 m_iMonth; + FX_INT32 m_iDay; + FX_BOOL m_bLBtnDown; + IFWL_DateTimeEdit *m_pEdit; + IFWL_DateTimeCalender *m_pMonthCal; + IFWL_DateTimeForm *m_pForm; + FX_FLOAT m_fBtn; + class CFWL_MonthCalendarImpDP : public IFWL_MonthCalendarDP + { + public: + CFWL_MonthCalendarImpDP() + { + m_iCurYear = 2010; + m_iCurMonth = 3; + m_iCurDay = 29; + } + virtual FWL_ERR GetCaption(IFWL_Widget *pWidget, CFX_WideString &wsCaption) + { + return FWL_ERR_Succeeded; + } + virtual FX_INT32 GetCurDay(IFWL_Widget *pWidget) + { + return m_iCurDay; + } + virtual FX_INT32 GetCurMonth(IFWL_Widget *pWidget) + { + return m_iCurMonth; + } + virtual FX_INT32 GetCurYear(IFWL_Widget *pWidget) + { + return m_iCurYear; + } + FX_INT32 m_iCurDay; + FX_INT32 m_iCurYear; + FX_INT32 m_iCurMonth; + }; + + CFWL_MonthCalendarImpDP m_MonthCalendarDP; + friend class CFWL_DateTimeEditDelegate; + friend class CFWL_DateTimeCalendar; + friend class CFWL_DateTimeCalendarDelegate; + friend class CFWL_DateTimePickerImpDelegate; +}; +class CFWL_DateTimePickerImpDelegate : public CFWL_WidgetImpDelegate +{ +public: + CFWL_DateTimePickerImpDelegate(CFWL_DateTimePickerImp *pOwner); + virtual FX_INT32 OnProcessMessage(CFWL_Message *pMessage); + virtual FWL_ERR OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); +protected: + void OnFocusChanged(CFWL_Message *pMsg, FX_BOOL bSet = TRUE); + void OnLButtonDown(CFWL_MsgMouse *pMsg); + void OnLButtonUp(CFWL_MsgMouse *pMsg); + void OnMouseMove(CFWL_MsgMouse *pMsg); + void OnMouseLeave(CFWL_MsgMouse *pMsg); + + CFWL_DateTimePickerImp *m_pOwner; +private: + void DisForm_OnFocusChanged(CFWL_Message *pMsg, FX_BOOL bSet = TRUE); +}; +#endif diff --git a/xfa/src/fwl/src/basewidget/include/fwl_editimp.h b/xfa/src/fwl/src/basewidget/include/fwl_editimp.h new file mode 100644 index 0000000000..b5671e659c --- /dev/null +++ b/xfa/src/fwl/src/basewidget/include/fwl_editimp.h @@ -0,0 +1,169 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FWL_EDIT_IMP_H +#define _FWL_EDIT_IMP_H +class CFWL_WidgetImp; +class CFWL_WidgetImpProperties; +class CFWL_WidgetImpDelegate; +class CFWL_ScrollBarImp; +class IFWL_Caret; +class IFWL_AdapterTextField; +class CFWL_EditImp; +class CFWL_EditImpDelegate; +class CFWL_EditImp : public CFWL_WidgetImp, public IFDE_TxtEdtEventSink +{ +public: + CFWL_EditImp(IFWL_Widget *pOuter = NULL); + CFWL_EditImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter = NULL); + ~CFWL_EditImp(); + virtual FWL_ERR GetClassName(CFX_WideString &wsClass) const; + virtual FX_DWORD GetClassID() const; + virtual FWL_ERR Initialize(); + virtual FWL_ERR Finalize(); + virtual FWL_ERR GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize = FALSE); + virtual FWL_ERR SetWidgetRect(const CFX_RectF &rect); + virtual FWL_ERR Update(); + virtual FX_DWORD HitTest(FX_FLOAT fx, FX_FLOAT fy); + virtual FWL_ERR SetStates(FX_DWORD dwStates, FX_BOOL bSet = TRUE); + virtual FWL_ERR DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); + virtual FWL_ERR SetThemeProvider(IFWL_ThemeProvider *pThemeProvider); + virtual FWL_ERR SetText(const CFX_WideString &wsText); + virtual FX_INT32 GetTextLength() const; + virtual FWL_ERR GetText(CFX_WideString &wsText, FX_INT32 nStart = 0, FX_INT32 nCount = -1) const; + virtual FWL_ERR ClearText(); + virtual FX_INT32 GetCaretPos() const; + virtual FX_INT32 SetCaretPos(FX_INT32 nIndex, FX_BOOL bBefore = TRUE); + virtual FWL_ERR AddSelRange(FX_INT32 nStart, FX_INT32 nCount = -1); + virtual FX_INT32 CountSelRanges(); + virtual FX_INT32 GetSelRange(FX_INT32 nIndex, FX_INT32 &nStart); + virtual FWL_ERR ClearSelections(); + virtual FX_INT32 GetLimit(); + virtual FWL_ERR SetLimit(FX_INT32 nLimit); + virtual FWL_ERR SetAliasChar(FX_WCHAR wAlias); + virtual FWL_ERR SetFormatString(const CFX_WideString &wsFormat); + virtual FWL_ERR Insert(FX_INT32 nStart, FX_LPCWSTR lpText, FX_INT32 nLen); + virtual FWL_ERR DeleteSelections(); + virtual FWL_ERR DeleteRange(FX_INT32 nStart, FX_INT32 nCount = -1); + virtual FWL_ERR ReplaceSelections(const CFX_WideStringC &wsReplace); + virtual FWL_ERR Replace(FX_INT32 nStart, FX_INT32 nLen, const CFX_WideStringC &wsReplace); + virtual FWL_ERR DoClipboard(FX_INT32 iCmd); + virtual FX_BOOL Copy(CFX_WideString &wsCopy); + virtual FX_BOOL Cut(CFX_WideString &wsCut); + virtual FX_BOOL Paste(const CFX_WideString &wsPaste); + virtual FX_BOOL Delete(); + virtual FX_BOOL Redo(FX_BSTR bsRecord); + virtual FX_BOOL Undo(FX_BSTR bsRecord); + virtual FX_BOOL Undo(); + virtual FX_BOOL Redo(); + virtual FX_BOOL CanUndo(); + virtual FX_BOOL CanRedo(); + virtual FWL_ERR SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant); + virtual FWL_ERR SetOuter(IFWL_Widget *pOuter); + virtual FWL_ERR SetNumberRange(FX_INT32 iMin, FX_INT32 iMax); + virtual void On_CaretChanged(IFDE_TxtEdtEngine *pEdit, FX_INT32 nPage, FX_BOOL bVisible = TRUE); + virtual void On_TextChanged(IFDE_TxtEdtEngine * pEdit, FDE_TXTEDT_TEXTCHANGE_INFO &ChangeInfo); + virtual void On_PageCountChanged(IFDE_TxtEdtEngine *pEdit) {} + virtual void On_SelChanged(IFDE_TxtEdtEngine *pEdit); + virtual FX_BOOL On_PageLoad(IFDE_TxtEdtEngine *pEdit, FX_INT32 nPageIndex, FX_INT32 nPurpose); + virtual FX_BOOL On_PageUnload(IFDE_TxtEdtEngine *pEdit, FX_INT32 nPageIndex, FX_INT32 nPurpose); + virtual FX_BOOL On_PageChange(IFDE_TxtEdtEngine *pEdit, FX_BOOL bPageUp = TRUE) + { + return TRUE; + } + virtual void On_AddDoRecord(IFDE_TxtEdtEngine *pEdit, FX_BSTR bsDoRecord); + virtual FX_BOOL On_ValidateField(IFDE_TxtEdtEngine *pEdit, FX_INT32 nBlockIndex, FX_INT32 nFieldIndex, \ + const CFX_WideString &wsFieldText, FX_INT32 nCharIndex); + virtual FX_BOOL On_ValidateBlock(IFDE_TxtEdtEngine *pEdit, FX_INT32 nBlockIndex); + virtual FX_BOOL On_GetBlockFormatText(IFDE_TxtEdtEngine *pEdit, FX_INT32 nBlockIndex, CFX_WideString &wsBlockText); + virtual FX_BOOL On_Validate(IFDE_TxtEdtEngine * pEdit, CFX_WideString &wsText); + virtual FWL_ERR SetBackgroundColor(FX_DWORD color); + virtual FWL_ERR SetFont(const CFX_WideString &wsFont, FX_FLOAT fSize); + void SetScrollOffset(FX_FLOAT fScrollOffset); + FX_BOOL GetSuggestWords(CFX_PointF pointf, CFX_ByteStringArray &sSuggest); + FX_BOOL ReplaceSpellCheckWord(CFX_PointF pointf, FX_BSTR bsReplace); +protected: + void DrawTextBk(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix = NULL); + void DrawContent(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix = NULL); + void UpdateEditEngine(); + void UpdateEditParams(); + void UpdateEditLayout(); + FX_BOOL UpdateOffset(); + FX_BOOL UpdateOffset(IFWL_ScrollBar *pScrollBar, FX_FLOAT fPosChanged); + void UpdateVAlignment(); + void UpdateCaret(); + IFWL_ScrollBar* UpdateScroll(); + void Layout(); + void LayoutScrollBar(); + void DeviceToEngine(CFX_PointF &pt); + void InitScrollBar(FX_BOOL bVert = TRUE); + void InitEngine(); + virtual void ShowCaret(FX_BOOL bVisible, CFX_RectF *pRect = NULL); + FX_BOOL ValidateNumberChar(FX_WCHAR cNum); + void InitCaret(); + void ClearRecord(); + FX_BOOL IsShowScrollBar(FX_BOOL bVert); + FX_BOOL IsContentHeightOverflow(); + FX_INT32 AddDoRecord(FX_BSTR bsDoRecord); + void ProcessInsertError(FX_INT32 iError); + + void DrawSpellCheck(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); + void AddSpellCheckObj(CFX_Path& PathData, FX_INT32 nStart, FX_INT32 nCount, FX_FLOAT fOffSetX, FX_FLOAT fOffSetY); + FX_INT32 GetWordAtPoint(CFX_PointF pointf, FX_INT32& nCount); + CFX_RectF m_rtClient; + CFX_RectF m_rtEngine; + CFX_RectF m_rtStatic; + FX_FLOAT m_fVAlignOffset; + FX_FLOAT m_fScrollOffsetX; + FX_FLOAT m_fScrollOffsetY; + IFDE_TxtEdtEngine* m_pEdtEngine; + FX_BOOL m_bLButtonDown; + FX_INT32 m_nSelStart; + FX_INT32 m_nLimit; + FX_FLOAT m_fSpaceAbove; + FX_FLOAT m_fSpaceBelow; + FX_FLOAT m_fFontSize; + FX_ARGB m_argbSel; + FX_BOOL m_bSetRange; + FX_INT32 m_iMin; + FX_INT32 m_iMax; + IFWL_ScrollBar* m_pVertScrollBar; + IFWL_ScrollBar* m_pHorzScrollBar; + IFWL_Caret* m_pCaret; + IFWL_AdapterTextField* m_pTextField; + CFX_WideString m_wsCache; + friend class CFWL_TxtEdtEventSink; + friend class CFWL_EditImpDelegate; + FX_DWORD m_backColor; + FX_BOOL m_updateBackColor; + CFX_WideString m_wsFont; + CFX_ByteStringArray m_RecordArr; + FX_INT32 m_iCurRecord; + FX_INT32 m_iMaxRecord; +}; +class CFWL_EditImpDelegate : public CFWL_WidgetImpDelegate +{ +public: + CFWL_EditImpDelegate(CFWL_EditImp *pOwner); + virtual FX_INT32 OnProcessMessage(CFWL_Message *pMessage); + virtual FWL_ERR OnProcessEvent(CFWL_Event *pEvent); + virtual FWL_ERR OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); +protected: + void DoActivate(CFWL_MsgActivate *pMsg); + void DoDeactivate(CFWL_MsgDeactivate *pMsg); + void DoButtonDown(CFWL_MsgMouse *pMsg); + void OnFocusChanged(CFWL_Message *pMsg, FX_BOOL bSet = TRUE); + void OnLButtonDown(CFWL_MsgMouse *pMsg); + void OnLButtonUp(CFWL_MsgMouse *pMsg); + void OnButtonDblClk(CFWL_MsgMouse *pMsg); + void OnMouseMove(CFWL_MsgMouse *pMsg); + void OnKeyDown(CFWL_MsgKey *pMsg); + void OnChar(CFWL_MsgKey *pMsg); + FX_BOOL OnScroll(IFWL_ScrollBar *pScrollBar, FX_DWORD dwCode, FX_FLOAT fPos); + void DoCursor(CFWL_MsgMouse *pMsg); + CFWL_EditImp *m_pOwner; +}; +#endif diff --git a/xfa/src/fwl/src/basewidget/include/fwl_formproxyimp.h b/xfa/src/fwl/src/basewidget/include/fwl_formproxyimp.h new file mode 100644 index 0000000000..def7eb9650 --- /dev/null +++ b/xfa/src/fwl/src/basewidget/include/fwl_formproxyimp.h @@ -0,0 +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 _FWL_FORMPROXY_IMP_H +#define _FWL_FORMPROXY_IMP_H +class CFWL_WidgetImp; +class CFWL_WidgetImpProperties; +class CFWL_WidgetImpDelegate; +class CFWL_FormImp; +class CFWL_FormProxyImp; +class CFWL_FormProxyImpDelegate; +class CFWL_FormProxyImp : public CFWL_FormImp +{ +public: + CFWL_FormProxyImp(IFWL_Widget *pOuter); + CFWL_FormProxyImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter); + ~CFWL_FormProxyImp(); + virtual FWL_ERR GetClassName(CFX_WideString &wsClass) const; + virtual FX_DWORD GetClassID() const; + virtual FX_BOOL IsInstance(FX_WSTR wsClass) const; + virtual FWL_ERR Initialize(); + virtual FWL_ERR Finalize(); + virtual FWL_ERR Update(); + virtual FWL_ERR DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); +protected: + friend class CFWL_FormProxyImpDelegate; +}; +class CFWL_FormProxyImpDelegate : public CFWL_WidgetImpDelegate +{ +public: + CFWL_FormProxyImpDelegate(CFWL_FormProxyImp *pOwner); + virtual FX_INT32 OnProcessMessage(CFWL_Message *pMessage); +protected: + CFWL_FormProxyImp *m_pOwner; +}; +#endif diff --git a/xfa/src/fwl/src/basewidget/include/fwl_listboximp.h b/xfa/src/fwl/src/basewidget/include/fwl_listboximp.h new file mode 100644 index 0000000000..51d605885f --- /dev/null +++ b/xfa/src/fwl/src/basewidget/include/fwl_listboximp.h @@ -0,0 +1,98 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FWL_LISTBOX_IMP_H +#define _FWL_LISTBOX_IMP_H +class CFWL_WidgetImp; +class CFWL_WidgetImpProperties; +class CFWL_WidgetImpDelegate; +class CFWL_ScrollBarImp; +class IFWL_Widget; +class CFWL_ListBoxImp; +class CFWL_ListBoxImpDelegate; +class CFWL_ListBoxImp : public CFWL_WidgetImp +{ +public: + CFWL_ListBoxImp(IFWL_Widget *pOuter = NULL); + CFWL_ListBoxImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter = NULL); + ~CFWL_ListBoxImp(); + virtual FWL_ERR GetClassName(CFX_WideString &wsClass) const; + virtual FX_DWORD GetClassID() const; + virtual FWL_ERR Initialize(); + virtual FWL_ERR Finalize(); + virtual FWL_ERR GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize = FALSE); + virtual FWL_ERR Update(); + virtual FX_DWORD HitTest(FX_FLOAT fx, FX_FLOAT fy); + virtual FWL_ERR DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); + virtual FWL_ERR SetThemeProvider(IFWL_ThemeProvider *pThemeProvider); + virtual FX_INT32 CountSelItems(); + virtual FWL_HLISTITEM GetSelItem(FX_INT32 nIndexSel); + virtual FX_INT32 GetSelIndex(FX_INT32 nIndex); + virtual FWL_ERR SetSelItem(FWL_HLISTITEM hItem, FX_BOOL bSelect = TRUE); + virtual FWL_ERR GetItemText(FWL_HLISTITEM hItem, CFX_WideString &wsText); + virtual FWL_ERR GetScrollPos(FX_FLOAT &fPos, FX_BOOL bVert = TRUE); + virtual FWL_ERR* Sort(IFWL_ListBoxCompare *pCom); +protected: + FWL_HLISTITEM GetItem(FWL_HLISTITEM hItem, FX_DWORD dwKeyCode); + void SetSelection(FWL_HLISTITEM hStart, FWL_HLISTITEM hEnd, FX_BOOL bSelected); + void SetSelectionDirect(FWL_HLISTITEM hItem, FX_BOOL bSelect); + FX_BOOL IsItemSelected(FWL_HLISTITEM hItem); + void ClearSelection(); + void SelectAll(); + FWL_HLISTITEM GetFocusedItem(); + void SetFocusItem(FWL_HLISTITEM hItem); + FWL_HLISTITEM GetItemAtPoint(FX_FLOAT fx, FX_FLOAT fy); + FX_BOOL GetItemCheckRect(FWL_HLISTITEM hItem, CFX_RectF &rtCheck); + FX_BOOL SetItemChecked(FWL_HLISTITEM hItem, FX_BOOL bChecked); + FX_BOOL GetItemChecked(FWL_HLISTITEM hItem); + FX_BOOL ScrollToVisible(FWL_HLISTITEM hItem); + void DrawBkground(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix = NULL); + void DrawItems(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix = NULL); + void DrawItem(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, FWL_HLISTITEM hItem, FX_INT32 Index, const CFX_RectF &rtItem, const CFX_Matrix *pMatrix = NULL); + void DrawStatic(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme); + CFX_SizeF CalcSize(FX_BOOL bAutoSize = FALSE); + void GetItemSize(CFX_SizeF &size, FWL_HLISTITEM hItem, FX_FLOAT fWidth, FX_FLOAT fHeight, FX_BOOL bAutoSize = FALSE); + FX_FLOAT GetMaxTextWidth(); + FX_FLOAT GetScrollWidth(); + FX_FLOAT GetItemHeigt(); + void InitScrollBar(FX_BOOL bVert = TRUE); + void SortItem(); + FX_BOOL IsShowScrollBar(FX_BOOL bVert); + void ProcessSelChanged(); +protected: + CFX_RectF m_rtClient; + CFX_RectF m_rtStatic; + CFX_RectF m_rtConent; + IFWL_ScrollBar* m_pHorzScrollBar; + IFWL_ScrollBar* m_pVertScrollBar; + FX_DWORD m_dwTTOStyles; + FX_INT32 m_iTTOAligns; + FWL_HLISTITEM m_hAnchor; + FX_FLOAT m_fItemHeight; + FX_FLOAT m_fScorllBarWidth; + FX_BOOL m_bLButtonDown; + IFWL_ThemeProvider *m_pScrollBarTP; + friend class CFWL_ListBoxImpDelegate; +}; +class CFWL_ListBoxImpDelegate : public CFWL_WidgetImpDelegate +{ +public: + CFWL_ListBoxImpDelegate(CFWL_ListBoxImp *pOwner); + virtual FX_INT32 OnProcessMessage(CFWL_Message *pMessage); + virtual FWL_ERR OnProcessEvent(CFWL_Event *pEvent); + virtual FWL_ERR OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); +protected: + void OnFocusChanged(CFWL_Message *pMsg, FX_BOOL bSet = TRUE); + void OnLButtonDown(CFWL_MsgMouse *pMsg); + void OnLButtonUp(CFWL_MsgMouse *pMsg); + void OnMouseWheel(CFWL_MsgMouseWheel *pMsg); + void OnKeyDown(CFWL_MsgKey *pMsg); + void OnVK(FWL_HLISTITEM hItem, FX_BOOL bShift, FX_BOOL bCtrl); + FX_BOOL OnScroll(IFWL_ScrollBar *pScrollBar, FX_DWORD dwCode, FX_FLOAT fPos); + void DispatchSelChangedEv(); + CFWL_ListBoxImp *m_pOwner; +}; +#endif diff --git a/xfa/src/fwl/src/basewidget/include/fwl_monthcalendarimp.h b/xfa/src/fwl/src/basewidget/include/fwl_monthcalendarimp.h new file mode 100644 index 0000000000..fc4da5864f --- /dev/null +++ b/xfa/src/fwl/src/basewidget/include/fwl_monthcalendarimp.h @@ -0,0 +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 + +#ifndef _FWL_MONTHCALENDAR_IMP_H +#define _FWL_MONTHCALENDAR_IMP_H +class CFWL_WidgetImp; +class CFWL_WidgetImpProperties; +class CFWL_WidgetImpDelegate; +class IFWL_Widget; +class IFDE_DateTime; +class CFDE_DateTime; +extern FX_BYTE FX_DaysInMonth(FX_INT32 iYear, FX_BYTE iMonth); +class CFWL_MonthCalendarImp; +class CFWL_MonthCalendarImpDelegate; +class CFWL_MonthCalendarImp : public CFWL_WidgetImp +{ +public: + CFWL_MonthCalendarImp(IFWL_Widget *pOuter = NULL); + CFWL_MonthCalendarImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter = NULL); + ~CFWL_MonthCalendarImp(); + virtual FWL_ERR GetClassName(CFX_WideString &wsClass) const; + virtual FX_DWORD GetClassID() const; + virtual FWL_ERR Initialize(); + virtual FWL_ERR Finalize(); + virtual FWL_ERR GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize = FALSE); + virtual FWL_ERR Update(); + virtual FWL_ERR DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); + virtual FX_INT32 CountSelect(); + virtual FX_BOOL GetSelect(FX_INT32 &iYear, FX_INT32 &iMonth, FX_INT32 &iDay, FX_INT32 nIndex = 0); + virtual FX_BOOL SetSelect(FX_INT32 iYear, FX_INT32 iMonth, FX_INT32 iDay); +protected: + void DrawBkground(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix); + void DrawHeadBK(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix); + void DrawLButton(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix); + void DrawRButton(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix); + void DrawCaption(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix); + void DrawSeperator(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix); + void DrawDatesInBK(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix); + void DrawWeek(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix); + void DrawWeekNumber(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix); + void DrawWeekNumberSep(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix); + void DrawToday(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix); + void DrawDatesIn(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix); + void DrawDatesOut(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix); + void DrawDatesInCircle(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix); + void DrawTodayCircle(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix); + CFX_SizeF CalcSize(FX_BOOL bAutoSize = FALSE); + void LayOut(); + void CalcHeadSize(); + void CalcTodaySize(); + void CalDateItem(); + void GetCapValue(); + FX_INT32 CalWeekNumber(FX_INT32 iYear, FX_INT32 iMonth, FX_INT32 iDay); + + FX_BOOL GetMinDate(FX_INT32 &iYear, FX_INT32 &iMonth, FX_INT32 &iDay); + FX_BOOL SetMinDate(FX_INT32 iYear, FX_INT32 iMonth, FX_INT32 iDay); + FX_BOOL GetMaxDate(FX_INT32 &iYear, FX_INT32 &iMonth, FX_INT32 &iDay); + FX_BOOL SetMaxDate(FX_INT32 iYear, FX_INT32 iMonth, FX_INT32 iDay); + FX_BOOL InitDate(); + void ClearDateItem(); + void ReSetDateItem(); + FX_BOOL NextMonth(); + FX_BOOL PrevMonth(); + void ChangeToMonth(FX_INT32 iYear, FX_INT32 iMonth); + FX_BOOL RemoveSelDay(FX_INT32 iDay, FX_BOOL bAll = FALSE); + FX_BOOL AddSelDay(FX_INT32 iDay); + FX_BOOL JumpToToday(); + void GetHeadText(FX_INT32 iYear, FX_INT32 iMonth, CFX_WideString &wsHead); + void GetTodayText(FX_INT32 iYear, FX_INT32 iMonth, FX_INT32 iDay, CFX_WideString &wsToday); + FX_INT32 GetDayAtPoint(FX_FLOAT x, FX_FLOAT y); + FX_BOOL GetDayRect(FX_INT32 iDay, CFX_RectF &rtDay); + typedef struct _DATE { + _DATE() + { + iYear = 0; + iMonth = 0; + iDay = 0; + } + _DATE(FX_INT32 year, FX_INT32 month, FX_INT32 day) : iYear(year), iMonth(month), iDay(day) {} + FX_BOOL operator < (const _DATE &right) + { + if (iYear < right.iYear) { + return TRUE; + } else if (iYear == right.iYear) { + if (iMonth < right.iMonth) { + return TRUE; + } else if (iMonth == right.iMonth) { + return iDay < right.iDay; + } + } + return FALSE; + } + FX_BOOL operator > (const _DATE &right) + { + if (iYear > right.iYear) { + return TRUE; + } else if (iYear == right.iYear) { + if (iMonth > right.iMonth) { + return TRUE; + } else if (iMonth == right.iMonth) { + return iDay > right.iDay; + } + } + return FALSE; + } + FX_INT32 iYear; + FX_INT32 iMonth; + FX_INT32 iDay; + + } DATE, *LPDATE; + FX_BOOL m_bInit; + CFX_RectF m_rtHead; + CFX_RectF m_rtWeek; + CFX_RectF m_rtLBtn; + CFX_RectF m_rtRBtn; + CFX_RectF m_rtDates; + CFX_RectF m_rtHSep; + CFX_RectF m_rtHeadText; + CFX_RectF m_rtToday; + CFX_RectF m_rtTodayFlag; + CFX_RectF m_rtWeekNum; + CFX_RectF m_rtWeekNumSep; + CFX_RectF m_rtTemp; + CFX_WideString m_wsHead; + CFX_WideString m_wsToday; + CFX_DateTime *m_pDateTime; + CFX_PtrArray m_arrDates; + FX_INT32 m_iCurYear; + FX_INT32 m_iCurMonth; + FX_INT32 m_iYear; + FX_INT32 m_iMonth; + FX_INT32 m_iDay; + FX_INT32 m_iHovered; + FX_INT32 m_iLBtnPartStates; + FX_INT32 m_iRBtnPartStates; + DATE m_dtMin; + DATE m_dtMax; + CFX_SizeF m_szHead; + CFX_SizeF m_szCell; + CFX_SizeF m_szToday; + typedef CFX_ArrayTemplate CFWL_Int32Array; + CFWL_Int32Array m_arrSelDays; + FX_INT32 m_iMaxSel; + CFX_RectF m_rtClient; + FX_FLOAT m_fHeadWid; + FX_FLOAT m_fHeadHei; + FX_FLOAT m_fHeadBtnWid; + FX_FLOAT m_fHeadBtnHei; + FX_FLOAT m_fHeadBtnHMargin; + FX_FLOAT m_fHeadBtnVMargin; + FX_FLOAT m_fHeadTextWid; + FX_FLOAT m_fHeadTextHei; + FX_FLOAT m_fHeadTextHMargin; + FX_FLOAT m_fHeadTextVMargin; + FX_FLOAT m_fHSepWid; + FX_FLOAT m_fHSepHei; + + FX_FLOAT m_fWeekNumWid; + FX_FLOAT m_fSepDOffset; + FX_FLOAT m_fSepX; + FX_FLOAT m_fSepY; + + FX_FLOAT m_fWeekNumHeigh; + FX_FLOAT m_fWeekWid; + FX_FLOAT m_fWeekHei; + FX_FLOAT m_fDateCellWid; + FX_FLOAT m_fDateCellHei; + + FX_FLOAT m_fTodayWid; + FX_FLOAT m_fTodayHei; + FX_FLOAT m_fTodayFlagWid; + + FX_FLOAT m_fMCWid; + FX_FLOAT m_fMCHei; + friend class CFWL_MonthCalendarImpDelegate; +}; +typedef struct _DATEINFO { + _DATEINFO(FX_INT32 day, FX_INT32 dayofweek, FX_DWORD dwSt, CFX_RectF rc, CFX_WideString &wsday) : iDay(day), iDayOfWeek(dayofweek), dwStates(dwSt), rect(rc), wsDay(wsday) {} + FX_INT32 iDay; + FX_INT32 iDayOfWeek; + FX_DWORD dwStates; + CFX_RectF rect; + CFX_WideString wsDay; +} DATEINFO, *LPDATEINFO; +class CFWL_MonthCalendarImpDelegate : public CFWL_WidgetImpDelegate +{ +public: + CFWL_MonthCalendarImpDelegate(CFWL_MonthCalendarImp *pOwner); + virtual FX_INT32 OnProcessMessage(CFWL_Message *pMessage); + virtual FWL_ERR OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); +protected: + void OnActivate(CFWL_Message *pMsg); + void OnFocusChanged(CFWL_Message *pMsg, FX_BOOL bSet = TRUE); + void OnLButtonDown(CFWL_MsgMouse *pMsg); + void OnLButtonUp(CFWL_MsgMouse *pMsg); + void OnMouseMove(CFWL_MsgMouse *pMsg); + void OnMouseLeave(CFWL_MsgMouse *pMsg); + CFWL_MonthCalendarImp *m_pOwner; +}; +#endif diff --git a/xfa/src/fwl/src/basewidget/include/fwl_pictureboximp.h b/xfa/src/fwl/src/basewidget/include/fwl_pictureboximp.h new file mode 100644 index 0000000000..038ebeb535 --- /dev/null +++ b/xfa/src/fwl/src/basewidget/include/fwl_pictureboximp.h @@ -0,0 +1,47 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FWL_PICTUREBOX_IMP_H +#define _FWL_PICTUREBOX_IMP_H +class CFWL_WidgetImp; +class CFWL_WidgetImpProperties; +class CFWL_WidgetImpDelegate; +class IFWL_Widget; +class CFWL_PictureBoxImp; +class CFWL_PictureBoxImpDelegate; +class CFWL_PictureBoxImp : public CFWL_WidgetImp +{ +public: + CFWL_PictureBoxImp(IFWL_Widget *pOuter = NULL); + CFWL_PictureBoxImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter = NULL); + ~CFWL_PictureBoxImp(); + virtual FWL_ERR GetClassName(CFX_WideString &wsClass) const; + virtual FX_DWORD GetClassID() const; + virtual FWL_ERR Initialize(); + virtual FWL_ERR Finalize(); + virtual FWL_ERR GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize = FALSE); + virtual FWL_ERR Update(); + virtual FWL_ERR DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); +protected: + void DrawBkground(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix = NULL); + FX_BOOL VStyle(FX_BOOL dwStyle); + CFX_RectF m_rtClient; + CFX_RectF m_rtImage; + CFX_Matrix m_matrix; + FX_BOOL m_bTop; + FX_BOOL m_bVCenter; + FX_BOOL m_bButton; + friend class CFWL_PictureBoxImpDelegate; +}; +class CFWL_PictureBoxImpDelegate : public CFWL_WidgetImpDelegate +{ +public: + CFWL_PictureBoxImpDelegate(CFWL_PictureBoxImp *pOwner); + virtual FWL_ERR OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); +protected: + CFWL_PictureBoxImp *m_pOwner; +}; +#endif diff --git a/xfa/src/fwl/src/basewidget/include/fwl_pushbuttonimp.h b/xfa/src/fwl/src/basewidget/include/fwl_pushbuttonimp.h new file mode 100644 index 0000000000..1688da887c --- /dev/null +++ b/xfa/src/fwl/src/basewidget/include/fwl_pushbuttonimp.h @@ -0,0 +1,57 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FWL_PUSHBUTTON_IMP_H +#define _FWL_PUSHBUTTON_IMP_H +class CFWL_WidgetImp; +class CFWL_WidgetImpProperties; +class CFWL_WidgetImpDelegate; +class IFWL_Widget; +class CFWL_PushButtonImp; +class CFWL_PushButtonImpDelegate; +class CFWL_PushButtonImp : public CFWL_WidgetImp +{ +public: + CFWL_PushButtonImp(IFWL_Widget *pOuter = NULL); + CFWL_PushButtonImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter = NULL); + virtual ~CFWL_PushButtonImp(); + virtual FWL_ERR GetClassName(CFX_WideString &wsClass) const; + virtual FX_DWORD GetClassID() const; + virtual FWL_ERR Initialize(); + virtual FWL_ERR Finalize(); + virtual FWL_ERR GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize = FALSE); + virtual FWL_ERR SetStates(FX_DWORD dwStates, FX_BOOL bSet = TRUE); + virtual FWL_ERR Update(); + virtual FWL_ERR DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); +protected: + void DrawBkground(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix); + void DrawText(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix); + FX_DWORD GetPartStates(); + void UpdateTextOutStyles(); + CFX_RectF m_rtClient; + CFX_RectF m_rtCaption; + FX_BOOL m_bBtnDown; + FX_DWORD m_dwTTOStyles; + FX_INT32 m_iTTOAlign; + friend class CFWL_PushButtonImpDelegate; +}; +class CFWL_PushButtonImpDelegate : public CFWL_WidgetImpDelegate +{ +public: + CFWL_PushButtonImpDelegate(CFWL_PushButtonImp *pOwner); + virtual FX_INT32 OnProcessMessage(CFWL_Message *pMessage); + virtual FWL_ERR OnProcessEvent(CFWL_Event *pEvent); + virtual FWL_ERR OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); +protected: + void OnFocusChanged(CFWL_Message *pMsg, FX_BOOL bSet = TRUE); + void OnLButtonDown(CFWL_MsgMouse *pMsg); + void OnLButtonUp(CFWL_MsgMouse *pMsg); + void OnMouseMove(CFWL_MsgMouse *pMsg); + void OnMouseLeave(CFWL_MsgMouse *pMsg); + void OnKeyDown(CFWL_MsgKey *pMsg); + CFWL_PushButtonImp *m_pOwner; +}; +#endif diff --git a/xfa/src/fwl/src/basewidget/include/fwl_scrollbarimp.h b/xfa/src/fwl/src/basewidget/include/fwl_scrollbarimp.h new file mode 100644 index 0000000000..e4073b5fc7 --- /dev/null +++ b/xfa/src/fwl/src/basewidget/include/fwl_scrollbarimp.h @@ -0,0 +1,113 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FWL_SCROLLBAR_IMP_H +#define _FWL_SCROLLBAR_IMP_H +class CFWL_WidgetImp; +class CFWL_WidgetImpProperties; +class CFWL_WidgetImpDelegate; +class IFWL_Widget; +class IFWL_Timer; +class IFWL_TimerDelegate; +class CFWL_ScrollBarImp; +class CFWL_ScrollBarImpDelegate; +class CFWL_ScrollBarImp : public CFWL_WidgetImp, public IFWL_Timer +{ +public: + CFWL_ScrollBarImp(IFWL_Widget *pOuter = NULL); + CFWL_ScrollBarImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter = NULL); + ~CFWL_ScrollBarImp(); + virtual FWL_ERR GetClassName(CFX_WideString &wsClass) const; + virtual FX_DWORD GetClassID() const; + virtual FWL_ERR Initialize(); + virtual FWL_ERR Finalize(); + virtual FWL_ERR GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize = FALSE); + virtual FWL_ERR Update(); + virtual FWL_ERR DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); + virtual FX_BOOL IsVertical() ; + virtual FWL_ERR GetRange(FX_FLOAT &fMin, FX_FLOAT &fMax); + virtual FWL_ERR SetRange(FX_FLOAT fMin, FX_FLOAT fMax); + virtual FX_FLOAT GetPageSize(); + virtual FWL_ERR SetPageSize(FX_FLOAT fPageSize); + virtual FX_FLOAT GetStepSize(); + virtual FWL_ERR SetStepSize(FX_FLOAT fStepSize); + virtual FX_FLOAT GetPos(); + virtual FWL_ERR SetPos(FX_FLOAT fPos); + virtual FX_FLOAT GetTrackPos(); + virtual FWL_ERR SetTrackPos(FX_FLOAT fTrackPos); + virtual FX_BOOL DoScroll(FX_DWORD dwCode, FX_FLOAT fPos = 0.0f); + virtual FWL_ERR SetOuter(IFWL_Widget *pOuter); + virtual FX_INT32 Run(FWL_HTIMER hTimer); +protected: + void DrawTrack(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, FX_BOOL bLower = TRUE, const CFX_Matrix *pMatrix = NULL); + void DrawArrowBtn(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, FX_BOOL bMinBtn = TRUE, const CFX_Matrix *pMatrix = NULL); + void DrawThumb(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix = NULL); + void Layout(); + void CalcButtonLen(); + void CalcMinButtonRect(CFX_RectF &rect); + void CalcMaxButtonRect(CFX_RectF &rect); + void CalcThumbButtonRect(CFX_RectF &rect); + void CalcMinTrackRect(CFX_RectF &rect); + void CalcMaxTrackRect(CFX_RectF &rect); + + FX_FLOAT GetTrackPointPos(FX_FLOAT fx, FX_FLOAT fy); + void GetTrackRect(CFX_RectF &rect, FX_BOOL bLower = TRUE); + FX_BOOL SendEvent(); + FX_BOOL OnScroll(FX_DWORD dwCode, FX_FLOAT fPos); + FWL_HTIMER m_hTimer; + FX_FLOAT m_fRangeMin; + FX_FLOAT m_fRangeMax; + FX_FLOAT m_fPageSize; + FX_FLOAT m_fStepSize; + FX_FLOAT m_fPos; + FX_FLOAT m_fTrackPos; + FX_INT32 m_iMinButtonState; + FX_INT32 m_iMaxButtonState; + FX_INT32 m_iThumbButtonState; + FX_INT32 m_iMinTrackState; + FX_INT32 m_iMaxTrackState; + FX_FLOAT m_fLastTrackPos; + FX_FLOAT m_cpTrackPointX; + FX_FLOAT m_cpTrackPointY; + FX_INT32 m_iMouseWheel; + FX_BOOL m_bTrackMouseLeave; + FX_BOOL m_bMouseHover; + FX_BOOL m_bMouseDown; + FX_BOOL m_bRepaintThumb; + + FX_FLOAT m_fButtonLen; + FX_BOOL m_bMinSize; + CFX_RectF m_rtClient; + CFX_RectF m_rtThumb; + CFX_RectF m_rtMinBtn; + CFX_RectF m_rtMaxBtn; + CFX_RectF m_rtMinTrack; + CFX_RectF m_rtMaxTrack; + FX_BOOL m_bCustomLayout; + FX_FLOAT m_fMinThumb; + friend class CFWL_ScrollBarImpDelegate; +}; +class CFWL_ScrollBarImpDelegate : public CFWL_WidgetImpDelegate +{ +public: + CFWL_ScrollBarImpDelegate(CFWL_ScrollBarImp *pOwner); + virtual FX_INT32 OnProcessMessage(CFWL_Message *pMessage); + virtual FWL_ERR OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); +protected: + void OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + void OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + void OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + void OnMouseLeave(); + void OnMouseWheel(FX_FLOAT fx, FX_FLOAT fy, FX_DWORD dwFlags, FX_FLOAT fDeltaX, FX_FLOAT fDeltaY); + void DoMouseDown(FX_INT32 iItem, const CFX_RectF &rtItem, FX_INT32 &iState, FX_FLOAT fx, FX_FLOAT fy); + void DoMouseUp(FX_INT32 iItem, const CFX_RectF &rtItem, FX_INT32 &iState, FX_FLOAT fx, FX_FLOAT fy); + void DoMouseMove(FX_INT32 iItem, const CFX_RectF &rtItem, FX_INT32 &iState, FX_FLOAT fx, FX_FLOAT fy); + void DoMouseLeave(FX_INT32 iItem, const CFX_RectF &rtItem, FX_INT32 &iState); + void DoMouseHover(FX_INT32 iItem, const CFX_RectF &rtItem, FX_INT32 &iState); + + CFWL_ScrollBarImp *m_pOwner; +}; +#endif diff --git a/xfa/src/fwl/src/basewidget/include/fwl_spinbuttonimp.h b/xfa/src/fwl/src/basewidget/include/fwl_spinbuttonimp.h new file mode 100644 index 0000000000..2275a40f90 --- /dev/null +++ b/xfa/src/fwl/src/basewidget/include/fwl_spinbuttonimp.h @@ -0,0 +1,62 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FWL_SPINBUTTON_IMP_H +#define _FWL_SPINBUTTON_IMP_H +class CFWL_WidgetImp; +class CFWL_WidgetImpProperties; +class CFWL_WidgetImpDelegate; +class IFWL_Widget; +class IFWL_Timer; +class CFWL_SpinButtonImp; +class CFWL_SpinButtonImpDelegate; +class CFWL_SpinButtonImp : public CFWL_WidgetImp, public IFWL_Timer +{ +public: + CFWL_SpinButtonImp(IFWL_Widget *pOuter = NULL); + CFWL_SpinButtonImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter = NULL); + ~CFWL_SpinButtonImp(); + virtual FWL_ERR GetClassName(CFX_WideString &wsClass) const; + virtual FX_DWORD GetClassID() const; + virtual FWL_ERR Initialize(); + virtual FWL_ERR Finalize(); + virtual FWL_ERR GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize = FALSE); + virtual FWL_ERR Update(); + virtual FX_DWORD HitTest(FX_FLOAT fx, FX_FLOAT fy); + virtual FWL_ERR DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); + virtual FX_INT32 Run(FWL_HTIMER hTimer); + FWL_ERR EnableButton(FX_BOOL bEnable, FX_BOOL bUp = TRUE); + FX_BOOL IsButtonEnable(FX_BOOL bUp = TRUE); +protected: + void DrawUpButton(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix); + void DrawDownButton(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix); + CFX_RectF m_rtClient; + CFX_RectF m_rtUpButton; + CFX_RectF m_rtDnButton; + FX_DWORD m_dwUpState; + FX_DWORD m_dwDnState; + FX_INT32 m_iButtonIndex; + FX_BOOL m_bLButtonDwn; + FWL_HTIMER m_hTimer; + friend class CFWL_SpinButtonImpDelegate; +}; +class CFWL_SpinButtonImpDelegate : public CFWL_WidgetImpDelegate +{ +public: + CFWL_SpinButtonImpDelegate(CFWL_SpinButtonImp *pOwner); + virtual FX_INT32 OnProcessMessage(CFWL_Message *pMessage); + virtual FWL_ERR OnProcessEvent(CFWL_Event *pEvent); + virtual FWL_ERR OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); +protected: + void OnFocusChanged(CFWL_Message *pMsg, FX_BOOL bSet = TRUE); + void OnLButtonDown(CFWL_MsgMouse *pMsg); + void OnLButtonUp(CFWL_MsgMouse *pMsg); + void OnMouseMove(CFWL_MsgMouse *pMsg); + void OnMouseLeave(CFWL_MsgMouse *pMsg); + void OnKeyDown(CFWL_MsgKey *pMsg); + CFWL_SpinButtonImp *m_pOwner; +}; +#endif diff --git a/xfa/src/fwl/src/basewidget/include/fwl_tooltipctrlimp.h b/xfa/src/fwl/src/basewidget/include/fwl_tooltipctrlimp.h new file mode 100644 index 0000000000..7317f3fe5b --- /dev/null +++ b/xfa/src/fwl/src/basewidget/include/fwl_tooltipctrlimp.h @@ -0,0 +1,78 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FWL_ToolTip_IMP_H +#define _FWL_ToolTip_IMP_H +class CFWL_WidgetImp; +class CFWL_WidgetImpProperties; +class CFWL_WidgetImpDelegate; +class IFWL_Widget; +class IFWL_Timer; +class CFWL_ToolTipImp; +class CFWL_ToolTipImpDelegate; +class CFWL_ToolTipImp : public CFWL_FormImp +{ +public: + CFWL_ToolTipImp(IFWL_Widget *pOuter = NULL); + CFWL_ToolTipImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter = NULL); + virtual ~CFWL_ToolTipImp(); + virtual FWL_ERR GetClassName(CFX_WideString &wsClass) const; + virtual FX_DWORD GetClassID() const; + virtual FWL_ERR Initialize(); + virtual FWL_ERR Finalize(); + virtual FWL_ERR GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize = FALSE); + virtual FWL_ERR Update(); + virtual FWL_ERR DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); + virtual FWL_ERR SetStates(FX_DWORD dwStates, FX_BOOL bSet ); + virtual FWL_ERR GetClientRect(CFX_RectF &rect); + FWL_ERR SetAnchor(const CFX_RectF &rtAnchor); + FWL_ERR Show(); + FWL_ERR Hide(); +protected: + void DrawBkground(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix); + void DrawText(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix); + void UpdateTextOutStyles(); + void RefreshToolTipPos(); + class CFWL_ToolTipTimer : public IFWL_Timer + { + public: + CFWL_ToolTipTimer() {}; + ~CFWL_ToolTipTimer() {}; + CFWL_ToolTipTimer(CFWL_ToolTipImp * pToolTip); + virtual FX_INT32 Run(FWL_HTIMER hTimer); + CFWL_ToolTipImp *m_pToolTip; + }; + CFX_RectF m_rtClient; + CFX_RectF m_rtCaption; + FX_BOOL m_bBtnDown; + FX_DWORD m_dwTTOStyles; + FX_INT32 m_iTTOAlign; + CFX_RectF m_rtAnchor; + FWL_HTIMER m_hTimerShow; + FWL_HTIMER m_hTimerHide; + CFWL_ToolTipTimer* m_pTimer; + CFWL_ToolTipTimer m_TimerShow; + CFWL_ToolTipTimer m_TimerHide; + friend class CFWL_ToolTipImpDelegate; + friend class CFWL_ToolTipTimer; +}; +class CFWL_ToolTipImpDelegate : public CFWL_WidgetImpDelegate +{ +public: + CFWL_ToolTipImpDelegate(CFWL_ToolTipImp *pOwner); + virtual FX_INT32 OnProcessMessage(CFWL_Message *pMessage); + virtual FWL_ERR OnProcessEvent(CFWL_Event *pEvent); + virtual FWL_ERR OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); +protected: + void OnFocusChanged(CFWL_Message *pMsg, FX_BOOL bSet = TRUE); + void OnLButtonDown(CFWL_MsgMouse *pMsg); + void OnLButtonUp(CFWL_MsgMouse *pMsg); + void OnMouseMove(CFWL_MsgMouse *pMsg); + void OnMouseLeave(CFWL_MsgMouse *pMsg); + void OnKeyDown(CFWL_MsgKey *pMsg); + CFWL_ToolTipImp *m_pOwner; +}; +#endif diff --git a/xfa/src/fwl/src/basewidget/include/fxmath_barcodeimp.h b/xfa/src/fwl/src/basewidget/include/fxmath_barcodeimp.h new file mode 100644 index 0000000000..bb859968f2 --- /dev/null +++ b/xfa/src/fwl/src/basewidget/include/fxmath_barcodeimp.h @@ -0,0 +1,45 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FXMATH_BARCODEIMP_H_ +#define _FXMATH_BARCODEIMP_H_ +class CFX_Barcode : public IFX_Barcode, public CFX_Object +{ +public: + CFX_Barcode(); + ~CFX_Barcode(); + FX_BOOL Crreate(BC_TYPE type); + virtual void Release(); + virtual BC_TYPE GetType(); + virtual FX_BOOL Encode(FX_WSTR contents, FX_BOOL isDevice, FX_INT32 &e); + virtual FX_BOOL RenderDevice(CFX_RenderDevice* device, const CFX_Matrix* matirx, FX_INT32 &e); + virtual FX_BOOL RenderBitmap(CFX_DIBitmap *&pOutBitmap, FX_INT32 &e); + virtual CFX_WideString Decode(FX_BYTE* buf, FX_INT32 width, FX_INT32 height, FX_INT32 &errorCode); + virtual CFX_WideString Decode(CFX_DIBitmap *pBitmap, FX_INT32 &errorCode); + virtual FX_BOOL SetCharEncoding(BC_CHAR_ENCODING encoding); + virtual FX_BOOL SetModuleHeight(FX_INT32 moduleHeight); + virtual FX_BOOL SetModuleWidth(FX_INT32 moduleWidth); + virtual FX_BOOL SetHeight(FX_INT32 height); + virtual FX_BOOL SetWidth(FX_INT32 width); + virtual FX_BOOL CheckContentValidity(FX_WSTR contents); + virtual FX_BOOL SetPrintChecksum(FX_BOOL checksum); + virtual FX_BOOL SetDataLength(FX_INT32 length); + virtual FX_BOOL SetCalChecksum(FX_INT32 state); + virtual FX_BOOL SetFont(CFX_Font* pFont); + virtual FX_BOOL SetFontSize(FX_FLOAT size); + virtual FX_BOOL SetFontStyle(FX_INT32 style); + virtual FX_BOOL SetFontColor(FX_ARGB color); + virtual FX_BOOL SetTextLocation(BC_TEXT_LOC location); + virtual FX_BOOL SetWideNarrowRatio(FX_INT32 ratio); + virtual FX_BOOL SetStartChar(FX_CHAR start); + virtual FX_BOOL SetEndChar(FX_CHAR end); + virtual FX_BOOL SetVersion(FX_INT32 version); + virtual FX_BOOL SetErrorCorrectionLevel(FX_INT32 level); + virtual FX_BOOL SetTruncated(FX_BOOL truncated); +protected: + CBC_CodeBase* m_pBCEngine; +}; +#endif diff --git a/xfa/src/fwl/src/core/fwl_appimp.cpp b/xfa/src/fwl/src/core/fwl_appimp.cpp new file mode 100644 index 0000000000..70e46e6a41 --- /dev/null +++ b/xfa/src/fwl/src/core/fwl_appimp.cpp @@ -0,0 +1,110 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "include/fwl_targetimp.h" +#include "include/fwl_threadimp.h" +#include "include/fwl_noteimp.h" +#include "include/fwl_widgetmgrimp.h" +#include "include/fwl_appimp.h" +IFWL_App* IFWL_App::Create(IFWL_AdapterNative *pAdapter) +{ + return (IFWL_App*) FX_NEW CFWL_AppImp(pAdapter); +} +CFWL_AppImp::CFWL_AppImp(IFWL_AdapterNative *pAdapter) + : m_pWidgetMgr(NULL) + , m_pThemeProvider(NULL) +{ + if (!pAdapter) { + pAdapter = FWL_CreateFuelAdapterNative(); + m_bFuelAdapter = TRUE; + } else { + m_bFuelAdapter = FALSE; + } + m_pAdapterNative = pAdapter; +} +CFWL_AppImp::~CFWL_AppImp() +{ + delete CFWL_ToolTipContainer::getInstance(); + if (m_bFuelAdapter) { + FWL_ReleaseFuelAdapterNative(m_pAdapterNative); + m_pAdapterNative = NULL; + } + if (m_pWidgetMgr) { + delete m_pWidgetMgr; + m_pWidgetMgr = NULL; + } +} +FWL_ERR CFWL_AppImp::Initialize() +{ + if (!m_pWidgetMgr) { + m_pWidgetMgr = FX_NEW CFWL_WidgetMgr(m_pAdapterNative); + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_AppImp::Finalize() +{ + if (m_pWidgetMgr) { + delete m_pWidgetMgr; + m_pWidgetMgr = NULL; + } + return FWL_ERR_Succeeded; +} +IFWL_AdapterNative* CFWL_AppImp::GetAdapterNative() +{ + return m_pAdapterNative; +} +IFWL_AdapterWidgetMgr* FWL_GetAdapterWidgetMgr() +{ + return ((CFWL_WidgetMgr*)FWL_GetWidgetMgr())->GetAdapterWidgetMgr(); +} +IFWL_WidgetMgr* CFWL_AppImp::GetWidgetMgr() +{ + return (IFWL_WidgetMgr*)m_pWidgetMgr; +} +FWL_ERR CFWL_AppImp::SetThemeProvider(IFWL_ThemeProvider* pThemeProvider) +{ + m_pThemeProvider = pThemeProvider; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_AppImp::Exit(FX_INT32 iExitCode ) +{ + while (m_pNoteDriver->PopNoteLoop()); + return m_pWidgetMgr->GetAdapterWidgetMgr()->Exit(0); +} +IFWL_ThemeProvider* CFWL_AppImp::GetThemeProvider() +{ + return m_pThemeProvider; +} +IFWL_AdapterNative* FWL_GetAdapterNative() +{ + IFWL_App* pApp = FWL_GetApp(); + _FWL_RETURN_VALUE_IF_FAIL(pApp, NULL); + return pApp->GetAdapterNative(); +} +IFWL_ThemeProvider* FWL_GetThemeProvider() +{ + return NULL; +} +static IFWL_App *_theApp = NULL; +IFWL_App* FWL_GetApp() +{ + return _theApp; +} +void FWL_SetApp(IFWL_App *pApp) +{ + _theApp = pApp; +} +FWL_ERR FWL_SetFullScreen(IFWL_Widget *pWidget, FX_BOOL bFullScreen) +{ + _FWL_RETURN_VALUE_IF_FAIL(pWidget, FWL_ERR_Succeeded); + IFWL_NoteThread *pNoteTread = pWidget->GetOwnerThread(); + _FWL_RETURN_VALUE_IF_FAIL(pNoteTread, FWL_ERR_Succeeded); + CFWL_NoteDriver *pNoteDriver = (CFWL_NoteDriver*)pNoteTread->GetNoteDriver(); + _FWL_RETURN_VALUE_IF_FAIL(pNoteTread, FWL_ERR_Succeeded); + pNoteDriver->NotifyFullScreenMode(pWidget, bFullScreen); + return FWL_GetAdapterWidgetMgr()->SetFullScreen(pWidget, bFullScreen); +} diff --git a/xfa/src/fwl/src/core/fwl_contentimp.cpp b/xfa/src/fwl/src/core/fwl_contentimp.cpp new file mode 100644 index 0000000000..3093aebf74 --- /dev/null +++ b/xfa/src/fwl/src/core/fwl_contentimp.cpp @@ -0,0 +1,131 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "include/fwl_targetimp.h" +#include "include/fwl_threadimp.h" +#include "include/fwl_noteimp.h" +#include "include/fwl_widgetimp.h" +#include "include/fwl_contentimp.h" +#include "include/fwl_widgetmgrimp.h" +IFWL_Content* IFWL_Content::Create() +{ + return new IFWL_Content; +} +FWL_ERR IFWL_Content::Initialize() +{ + m_pData = FX_NEW CFWL_ContentImp; + ((CFWL_ContentImp*)m_pData)->SetInterface(this); + return ((CFWL_ContentImp*)m_pData)->Initialize(); +} +FWL_ERR IFWL_Content::InsertWidget(IFWL_Widget *pChild, FX_INT32 nIndex ) +{ + return ((CFWL_ContentImp*)m_pData)->InsertWidget(pChild, nIndex); +} +FWL_ERR IFWL_Content::RemoveWidget(IFWL_Widget *pWidget) +{ + return ((CFWL_ContentImp*)m_pData)->RemoveWidget(pWidget); +} +FWL_ERR IFWL_Content::RemoveAllWidgets() +{ + return ((CFWL_ContentImp*)m_pData)->RemoveAllWidgets(); +} +FWL_ERR IFWL_Content::GetMinSize(FX_FLOAT &fWidth, FX_FLOAT &fHeight) +{ + return ((CFWL_ContentImp*)m_pData)->GetMinSize(fWidth, fHeight); +} +FWL_ERR IFWL_Content::SetMinSize(FX_FLOAT fWidth, FX_FLOAT fHeight) +{ + return ((CFWL_ContentImp*)m_pData)->SetMinSize(fWidth, fHeight); +} +FWL_ERR IFWL_Content::GetMaxSize(FX_FLOAT &fWidth, FX_FLOAT &fHeight) +{ + return ((CFWL_ContentImp*)m_pData)->GetMaxSize(fWidth, fHeight); +} +FWL_ERR IFWL_Content::SetMaxSize(FX_FLOAT fWidth, FX_FLOAT fHeight) +{ + return ((CFWL_ContentImp*)m_pData)->SetMaxSize(fWidth, fHeight); +} +IFWL_Content::IFWL_Content() +{ + m_pData = NULL; +} +IFWL_Content::~IFWL_Content() +{ + if (m_pData) { + delete (CFWL_ContentImp*)m_pData; + m_pData = NULL; + } +} +CFWL_ContentImp::CFWL_ContentImp() +{ + m_fWidthMin = 0; + m_fWidthMax = 10000; + m_fHeightMin = 0; + m_fHeightMax = 10000; +} +CFWL_ContentImp::CFWL_ContentImp(const CFWL_WidgetImpProperties &properties) + : CFWL_WidgetImp(properties) +{ + m_fWidthMin = 0; + m_fWidthMax = 10000; + m_fHeightMin = 0; + m_fHeightMax = 10000; +} +CFWL_ContentImp::~CFWL_ContentImp() +{ +} +FWL_ERR CFWL_ContentImp::InsertWidget(IFWL_Widget *pChild, FX_INT32 nIndex ) +{ + _FWL_RETURN_VALUE_IF_FAIL(pChild, FWL_ERR_Indefinite); + pChild->SetParent(m_pInterface); + if (nIndex == -1) { + return FWL_ERR_Succeeded; + } + CFWL_WidgetMgr *pMgr = (CFWL_WidgetMgr*)FWL_GetWidgetMgr(); + _FWL_RETURN_VALUE_IF_FAIL(pMgr, FWL_ERR_Indefinite); + pMgr->SetWidgetIndex(pChild, nIndex); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ContentImp::RemoveWidget(IFWL_Widget *pWidget) +{ + _FWL_RETURN_VALUE_IF_FAIL(pWidget, FWL_ERR_Indefinite); + pWidget->SetParent(NULL); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ContentImp::RemoveAllWidgets() +{ + CFWL_WidgetMgr *pMgr = (CFWL_WidgetMgr*)FWL_GetWidgetMgr(); + _FWL_RETURN_VALUE_IF_FAIL(pMgr, FWL_ERR_Indefinite); + while (IFWL_Widget * widget = pMgr->GetWidget(m_pInterface, FWL_WGTRELATION_FirstChild)) { + pMgr->SetParent(NULL, widget); + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ContentImp::GetMinSize(FX_FLOAT &fWidth, FX_FLOAT &fHeight) +{ + fWidth = m_fWidthMin; + fHeight = m_fHeightMin; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ContentImp::SetMinSize(FX_FLOAT fWidth, FX_FLOAT fHeight) +{ + m_fWidthMin = fWidth; + m_fHeightMin = fHeight; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ContentImp::GetMaxSize(FX_FLOAT &fWidth, FX_FLOAT &fHeight) +{ + fWidth = m_fWidthMax; + fHeight = m_fHeightMax; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ContentImp::SetMaxSize(FX_FLOAT fWidth, FX_FLOAT fHeight) +{ + m_fWidthMax = fWidth; + m_fHeightMax = fHeight; + return FWL_ERR_Succeeded; +} diff --git a/xfa/src/fwl/src/core/fwl_formimp.cpp b/xfa/src/fwl/src/core/fwl_formimp.cpp new file mode 100644 index 0000000000..2491999484 --- /dev/null +++ b/xfa/src/fwl/src/core/fwl_formimp.cpp @@ -0,0 +1,1434 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "include/fwl_targetimp.h" +#include "include/fwl_threadimp.h" +#include "include/fwl_noteimp.h" +#include "include/fwl_widgetimp.h" +#include "include/fwl_panelimp.h" +#include "include/fwl_formimp.h" +#include "include/fwl_widgetmgrimp.h" +#include "include/fwl_appimp.h" +#define FWL_SYSBTNSIZE 21 +#define FWL_SYSBTNMARGIN 5 +#define FWL_SYSBTNSPAN 2 +#define FWL_CornerEnlarge 10 +IFWL_Form* IFWL_Form::Create() +{ + return new IFWL_Form; +} +FWL_ERR IFWL_Form::Initialize(IFWL_Widget *pOuter ) +{ + m_pData = FX_NEW CFWL_FormImp(pOuter); + ((CFWL_FormImp*)m_pData)->SetInterface(this); + return ((CFWL_FormImp*)m_pData)->Initialize(); +} +FWL_ERR IFWL_Form::Initialize(CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter ) +{ + m_pData = FX_NEW CFWL_FormImp(properties, pOuter); + ((CFWL_FormImp*)m_pData)->SetInterface(this); + return ((CFWL_FormImp*)m_pData)->Initialize(); +} +FWL_ERR IFWL_Form::Initialize(CFWL_WidgetImpProperties &properties, CFX_WideString *classname, IFWL_Widget *pOuter ) +{ + m_pData = FX_NEW CFWL_FormImp(properties, pOuter); + ((CFWL_FormImp*)m_pData)->SetInterface(this); + ((CFWL_FormImp*)m_pData)->SetPrivateData(this, classname, NULL); + return ((CFWL_FormImp*)m_pData)->Initialize(); +} +FWL_FORMSIZE IFWL_Form::GetFormSize() +{ + return ((CFWL_FormImp*)m_pData)->GetFormSize(); +} +FWL_ERR IFWL_Form::SetFormSize(FWL_FORMSIZE eFormSize) +{ + return ((CFWL_FormImp*)m_pData)->SetFormSize(eFormSize); +} +IFWL_Widget* IFWL_Form::DoModal() +{ + return ((CFWL_FormImp*)m_pData)->DoModal(); +} +IFWL_Widget* IFWL_Form::DoModal(FX_DWORD &dwCommandID) +{ + return ((CFWL_FormImp*)m_pData)->DoModal(dwCommandID); +} +FWL_ERR IFWL_Form::EndDoModal() +{ + return ((CFWL_FormImp*)m_pData)->EndDoModal(); +} +FWL_ERR IFWL_Form::SetBorderRegion(CFX_Path *pPath) +{ + return ((CFWL_FormImp*)m_pData)->SetBorderRegion(pPath); +} +IFWL_Form::IFWL_Form() +{ + m_pData = NULL; +} +IFWL_Form::~IFWL_Form() +{ + if (m_pData) { + delete (CFWL_FormImp*)m_pData; + m_pData = NULL; + } +} +CFWL_FormImp::CFWL_FormImp(IFWL_Widget *pOuter ) + : CFWL_PanelImp(pOuter) + , m_pCloseBox(NULL) + , m_pMinBox(NULL) + , m_pMaxBox(NULL) + , m_pCaptionBox(NULL) + , m_pNoteLoop(NULL) + , m_pSubFocus(NULL) + , m_fCXBorder(0) + , m_fCYBorder(0) + , m_iCaptureBtn(-1) + , m_iSysBox(0) + , m_eResizeType(FORM_RESIZETYPE_None) + , m_bLButtonDown(FALSE) + , m_bMaximized(FALSE) + , m_bSetMaximize(FALSE) + , m_bCustomizeLayout(FALSE) + , m_eFormSize(FWL_FORMSIZE_Manual) + , m_bDoModalFlag(FALSE) + , m_pBigIcon(NULL) + , m_pSmallIcon(NULL) + , m_bMouseIn(FALSE) +{ + m_rtRelative.Reset(); + m_rtCaption.Reset(); + m_rtRestore.Reset(); + m_rtCaptionText.Reset(); + m_rtIcon.Reset(); + m_InfoStart.m_ptStart.Reset(); + m_InfoStart.m_szStart.Reset(); +} +CFWL_FormImp::CFWL_FormImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter ) + : CFWL_PanelImp(properties, pOuter) + , m_pCloseBox(NULL) + , m_pMinBox(NULL) + , m_pMaxBox(NULL) + , m_pCaptionBox(NULL) + , m_pNoteLoop(NULL) + , m_pSubFocus(NULL) + , m_fCXBorder(0) + , m_fCYBorder(0) + , m_iCaptureBtn(-1) + , m_iSysBox(0) + , m_eResizeType(FORM_RESIZETYPE_None) + , m_bLButtonDown(FALSE) + , m_bMaximized(FALSE) + , m_bSetMaximize(FALSE) + , m_bCustomizeLayout(FALSE) + , m_eFormSize(FWL_FORMSIZE_Manual) + , m_bDoModalFlag(FALSE) + , m_pBigIcon(NULL) + , m_pSmallIcon(NULL) + , m_bMouseIn(FALSE) +{ + m_rtRelative.Reset(); + m_rtCaption.Reset(); + m_rtRestore.Reset(); + m_rtCaptionText.Reset(); + m_rtIcon.Reset(); + m_InfoStart.m_ptStart.Reset(); + m_InfoStart.m_szStart.Reset(); +} +CFWL_FormImp::~CFWL_FormImp() +{ + RemoveSysButtons(); + if (m_pNoteLoop) { + delete m_pNoteLoop; + m_pNoteLoop = NULL; + } +} +FWL_ERR CFWL_FormImp::GetClassName(CFX_WideString &wsClass) const +{ + wsClass = FWL_CLASS_Form; + return FWL_ERR_Succeeded; +} +FX_DWORD CFWL_FormImp::GetClassID() const +{ + return FWL_CLASSHASH_Form; +} +FX_BOOL CFWL_FormImp::IsInstance(FX_WSTR wsClass) const +{ + if (wsClass == CFX_WideStringC(FWL_CLASS_Form)) { + return TRUE; + } + return CFWL_PanelImp::IsInstance(wsClass); +} +FWL_ERR CFWL_FormImp::Initialize() +{ + _FWL_ERR_CHECK_RETURN_VALUE_IF_FAIL(CFWL_WidgetImp::Initialize(), FWL_ERR_Indefinite); + RegisterForm(); + RegisterEventTarget(); + m_pDelegate = (IFWL_WidgetDelegate*) FX_NEW CFWL_FormDelegate(this); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_FormImp::Finalize() +{ + if ( m_pDelegate) { + delete (CFWL_FormDelegate*)m_pDelegate; + m_pDelegate = NULL; + } + UnregisterEventTarget(); + UnRegisterForm(); + return CFWL_WidgetImp::Finalize(); +} +FWL_ERR CFWL_FormImp::GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize ) +{ + if (bAutoSize) { + rect.Reset(); + FX_FLOAT fCapHeight = GetCaptionHeight(); + FX_FLOAT fCXBorder = GetBorderSize(TRUE); + FX_FLOAT fCYBorder = GetBorderSize(FALSE); + FX_FLOAT fEdge = GetEdgeWidth(); + if (m_pContent) { + m_pContent->GetWidgetRect(rect, TRUE); + } + rect.height += fCapHeight + fCYBorder + fEdge + fEdge; + rect.width += fCXBorder + fCXBorder + fEdge + fEdge; + } else { + rect = m_pProperties->m_rtWidget; + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_FormImp::GetClientRect(CFX_RectF &rect) +{ + if ((m_pProperties->m_dwStyles & FWL_WGTSTYLE_Caption) == 0) { + rect = m_pProperties->m_rtWidget; + rect.Offset(-rect.left, -rect.top); + return FWL_ERR_Succeeded; + } +#ifdef FWL_UseMacSystemBorder + rect = m_rtRelative; + CFWL_WidgetMgr *pWidgetMgr = (CFWL_WidgetMgr*)FWL_GetWidgetMgr(); + _FWL_RETURN_VALUE_IF_FAIL(pWidgetMgr, FWL_ERR_Indefinite); + IFWL_AdapterWidgetMgr * adapterWidgetMgr = pWidgetMgr->GetAdapterWidgetMgr(); + FX_FLOAT l, t, r, b; + l = t = r = b = 0; + adapterWidgetMgr->GetSystemBorder(l, t, r, b); + rect.Deflate(l, t, r, b); + rect.left = rect.top = 0; + return FWL_ERR_Succeeded; +#else + FX_FLOAT x = 0; + FX_FLOAT y = 0; + FX_FLOAT t = 0; + IFWL_ThemeProvider *pTheme = m_pProperties->m_pThemeProvider; + if (pTheme) { + CFWL_ThemePart part; + part.m_pWidget = m_pInterface; + FX_FLOAT * value = NULL; + value = (FX_FLOAT *) pTheme->GetCapacity(&part, FWL_WGTCAPACITY_CXBorder); + x = *value; + value = (FX_FLOAT *) pTheme->GetCapacity(&part, FWL_WGTCAPACITY_CYBorder); + y = *value; + value = (FX_FLOAT*)pTheme->GetCapacity(&part, FWL_WGTCAPACITY_FRM_CYCaption); + t = *value; + } + rect = m_pProperties->m_rtWidget; + rect.Offset(-rect.left, -rect.top); + rect.Deflate(x, t, x, y); + return FWL_ERR_Succeeded; +#endif +} +FWL_ERR CFWL_FormImp::Update() +{ + if (m_iLock > 0) { + return FWL_ERR_Succeeded; + } + if (!m_pProperties->m_pThemeProvider) { + m_pProperties->m_pThemeProvider = GetAvailableTheme(); + } +#ifdef FWL_UseMacSystemBorder +#else + SetThemeData(); + if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Icon) { + UpdateIcon(); + } +#endif + UpdateCaption(); + Layout(); + return FWL_ERR_Succeeded; +} +FX_DWORD CFWL_FormImp::HitTest(FX_FLOAT fx, FX_FLOAT fy) +{ + IFWL_ThemeProvider *pTheme = GetAvailableTheme(); + if (m_pCloseBox && m_pCloseBox->m_rtBtn.Contains(fx, fy)) { + return FWL_WGTHITTEST_CloseBox; + } + if (m_pMaxBox && m_pMaxBox->m_rtBtn.Contains(fx, fy)) { + return FWL_WGTHITTEST_MaxBox; + } + if (m_pMinBox && m_pMinBox->m_rtBtn.Contains(fx, fy)) { + return FWL_WGTHITTEST_MinBox; + } + CFX_RectF rtCap; + rtCap.Set(m_rtCaption.left + m_fCYBorder, + m_rtCaption.top + m_fCXBorder, + m_rtCaption.width - FWL_SYSBTNSIZE * m_iSysBox - 2 * m_fCYBorder, + m_rtCaption.height - m_fCXBorder); + if (rtCap.Contains(fx, fy)) { + return FWL_WGTHITTEST_Titlebar; + } + if ((m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border) && (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_FRM_Resize)) { + FX_FLOAT fWidth = m_rtRelative.width - 2 * (m_fCYBorder + FWL_CornerEnlarge); + FX_FLOAT fHeight = m_rtRelative.height - 2 * (m_fCXBorder + FWL_CornerEnlarge); + CFX_RectF rt; + rt.Set(0, m_fCXBorder + FWL_CornerEnlarge, m_fCYBorder, fHeight); + if (rt.Contains(fx, fy)) { + return FWL_WGTHITTEST_Left; + } + rt.Set(m_rtRelative.width - m_fCYBorder, m_fCXBorder + FWL_CornerEnlarge, m_fCYBorder, fHeight); + if (rt.Contains(fx, fy)) { + return FWL_WGTHITTEST_Right; + } + rt.Set(m_fCYBorder + FWL_CornerEnlarge, 0, fWidth, m_fCXBorder); + if (rt.Contains(fx, fy)) { + return FWL_WGTHITTEST_Top; + } + rt.Set(m_fCYBorder + FWL_CornerEnlarge, m_rtRelative.height - m_fCXBorder, fWidth, m_fCXBorder); + if (rt.Contains(fx, fy)) { + return FWL_WGTHITTEST_Bottom; + } + rt.Set(0, 0, m_fCYBorder + FWL_CornerEnlarge, m_fCXBorder + FWL_CornerEnlarge); + if (rt.Contains(fx, fy)) { + return FWL_WGTHITTEST_LeftTop; + } + rt.Set(0, m_rtRelative.height - m_fCXBorder - FWL_CornerEnlarge, + m_fCYBorder + FWL_CornerEnlarge, m_fCXBorder + FWL_CornerEnlarge); + if (rt.Contains(fx, fy)) { + return FWL_WGTHITTEST_LeftBottom; + } + rt.Set(m_rtRelative.width - m_fCYBorder - FWL_CornerEnlarge, 0, + m_fCYBorder + FWL_CornerEnlarge, m_fCXBorder + FWL_CornerEnlarge); + if (rt.Contains(fx, fy)) { + return FWL_WGTHITTEST_RightTop; + } + rt.Set(m_rtRelative.width - m_fCYBorder - FWL_CornerEnlarge, + m_rtRelative.height - m_fCXBorder - FWL_CornerEnlarge, + m_fCYBorder + FWL_CornerEnlarge, + m_fCXBorder + FWL_CornerEnlarge); + if (rt.Contains(fx, fy)) { + return FWL_WGTHITTEST_RightBottom; + } + } + return FWL_WGTHITTEST_Client; +} +FWL_ERR CFWL_FormImp::DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + _FWL_RETURN_VALUE_IF_FAIL(pGraphics, FWL_ERR_Indefinite); + _FWL_RETURN_VALUE_IF_FAIL(m_pProperties->m_pThemeProvider, FWL_ERR_Indefinite); + IFWL_ThemeProvider *pTheme = m_pProperties->m_pThemeProvider; + FX_BOOL bInactive = !IsActive(); + FX_INT32 iState = bInactive ? FWL_PARTSTATE_FRM_Inactive : FWL_PARTSTATE_FRM_Normal; + if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_FRM_NoDrawClient) == 0) { + DrawBackground(pGraphics, pTheme); + } +#ifdef FWL_UseMacSystemBorder + return FWL_ERR_Succeeded; +#endif + CFWL_ThemeBackground param; + param.m_pWidget = m_pInterface; + param.m_dwStates = iState; + param.m_pGraphics = pGraphics; + param.m_rtPart = m_rtRelative; + if(pMatrix) { + param.m_matrix.Concat(*pMatrix); + } + if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border) { + param.m_iPart = FWL_PART_FRM_Border; + pTheme->DrawBackground(¶m); + } + if ((m_pProperties->m_dwStyleExes & FWL_WGTSTYLE_EdgeMask) != FWL_WGTSTYLE_EdgeNone) { + CFX_RectF rtEdge; + GetEdgeRect(rtEdge); + param.m_iPart = FWL_PART_FRM_Edge; + param.m_rtPart = rtEdge; + param.m_dwStates = iState; + pTheme->DrawBackground(¶m); + } + if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Caption) { + param.m_iPart = FWL_PART_FRM_Caption; + param.m_dwStates = iState; + param.m_rtPart = m_rtCaption; + pTheme->DrawBackground(¶m); + DrawCaptionText(pGraphics, pTheme, pMatrix); + } else if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_NarrowCaption) { + param.m_iPart = FWL_PART_FRM_NarrowCaption; + param.m_dwStates = iState; + param.m_rtPart = m_rtCaption; + pTheme->DrawBackground(¶m); + DrawCaptionText(pGraphics, pTheme, pMatrix); + } + if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Icon) { + param.m_iPart = FWL_PART_FRM_Icon; + if (HasIcon()) { + DrawIconImage(pGraphics, pTheme, pMatrix); + } + } +#if (_FX_OS_==_FX_MACOSX_) + { + if (m_pCloseBox) { + param.m_iPart = FWL_PART_FRM_CloseBox; + param.m_dwStates = m_pCloseBox->GetPartState(); + if (m_pProperties->m_dwStates & FWL_WGTSTATE_Deactivated) { + param.m_dwStates = FWL_PARTSTATE_FRM_Disabled; + } else if (FWL_PARTSTATE_FRM_Normal == param.m_dwStates && m_bMouseIn) { + param.m_dwStates = FWL_PARTSTATE_FRM_Hover; + } + param.m_rtPart = m_pCloseBox->m_rtBtn; + pTheme->DrawBackground(¶m); + } + if (m_pMaxBox) { + param.m_iPart = FWL_PART_FRM_MaximizeBox; + param.m_dwStates = m_pMaxBox->GetPartState(); + if (m_pProperties->m_dwStates & FWL_WGTSTATE_Deactivated) { + param.m_dwStates = FWL_PARTSTATE_FRM_Disabled; + } else if (FWL_PARTSTATE_FRM_Normal == param.m_dwStates && m_bMouseIn) { + param.m_dwStates = FWL_PARTSTATE_FRM_Hover; + } + param.m_rtPart = m_pMaxBox->m_rtBtn; + param.m_dwData = m_bMaximized; + pTheme->DrawBackground(¶m); + } + if (m_pMinBox) { + param.m_iPart = FWL_PART_FRM_MinimizeBox; + param.m_dwStates = m_pMinBox->GetPartState(); + if (m_pProperties->m_dwStates & FWL_WGTSTATE_Deactivated) { + param.m_dwStates = FWL_PARTSTATE_FRM_Disabled; + } else if (FWL_PARTSTATE_FRM_Normal == param.m_dwStates && m_bMouseIn) { + param.m_dwStates = FWL_PARTSTATE_FRM_Hover; + } + param.m_rtPart = m_pMinBox->m_rtBtn; + pTheme->DrawBackground(¶m); + } + m_bMouseIn = FALSE; + } +#else + { + if (m_pCloseBox) { + param.m_iPart = FWL_PART_FRM_CloseBox; + param.m_dwStates = m_pCloseBox->GetPartState(); + param.m_rtPart = m_pCloseBox->m_rtBtn; + pTheme->DrawBackground(¶m); + } + if (m_pMaxBox) { + param.m_iPart = FWL_PART_FRM_MaximizeBox; + param.m_dwStates = m_pMaxBox->GetPartState(); + param.m_rtPart = m_pMaxBox->m_rtBtn; + param.m_dwData = m_bMaximized; + pTheme->DrawBackground(¶m); + } + if (m_pMinBox) { + param.m_iPart = FWL_PART_FRM_MinimizeBox; + param.m_dwStates = m_pMinBox->GetPartState(); + param.m_rtPart = m_pMinBox->m_rtBtn; + pTheme->DrawBackground(¶m); + } + } +#endif + return FWL_ERR_Succeeded; +} +FWL_FORMSIZE CFWL_FormImp::GetFormSize() +{ + return m_eFormSize; +} +FWL_ERR CFWL_FormImp::SetFormSize(FWL_FORMSIZE eFormSize) +{ + m_eFormSize = eFormSize; + return FWL_ERR_Succeeded; +} +IFWL_Widget* CFWL_FormImp::DoModal() +{ + IFWL_NoteThread *pThread = GetOwnerThread(); + _FWL_RETURN_VALUE_IF_FAIL(pThread, NULL); + IFWL_NoteDriver *pDriver = pThread->GetNoteDriver(); + _FWL_RETURN_VALUE_IF_FAIL(pDriver, NULL); + m_pNoteLoop = FX_NEW CFWL_NoteLoop(this); + pDriver->PushNoteLoop((IFWL_NoteLoop*)m_pNoteLoop); + m_bDoModalFlag = TRUE; + SetStates(FWL_WGTSTATE_Invisible, FALSE); + pDriver->Run(); +#if (_FX_OS_==_FX_MACOSX_) +#else + pDriver->PopNoteLoop(); +#endif + delete m_pNoteLoop; + m_pNoteLoop = NULL; + return NULL; +} +IFWL_Widget* CFWL_FormImp::DoModal(FX_DWORD &dwCommandID) +{ + return DoModal(); +} +FWL_ERR CFWL_FormImp::EndDoModal() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pNoteLoop, FWL_ERR_Indefinite); + m_bDoModalFlag = FALSE; +#if (_FX_OS_==_FX_MACOSX_) + m_pNoteLoop->EndModalLoop(); + IFWL_NoteThread *pThread = GetOwnerThread(); + _FWL_RETURN_VALUE_IF_FAIL(pThread, NULL); + CFWL_NoteDriver *pDriver = (CFWL_NoteDriver*)pThread->GetNoteDriver(); + _FWL_RETURN_VALUE_IF_FAIL(pDriver, NULL); + pDriver->PopNoteLoop(); + SetStates(FWL_WGTSTATE_Invisible, TRUE); + return FWL_ERR_Succeeded; +#else + SetStates(FWL_WGTSTATE_Invisible, TRUE); + return m_pNoteLoop->EndModalLoop(); +#endif +} +FWL_ERR CFWL_FormImp::SetBorderRegion(CFX_Path *pPath) +{ + return FWL_ERR_Succeeded; +} +void CFWL_FormImp::DrawBackground(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme) +{ + CFWL_ThemeBackground param; + param.m_pWidget = m_pInterface; + param.m_iPart = FWL_PART_FRM_Background; + param.m_pGraphics = pGraphics; + param.m_rtPart = m_rtRelative; + param.m_rtPart.Deflate(m_fCYBorder, m_rtCaption.height, m_fCYBorder, m_fCXBorder); + pTheme->DrawBackground(¶m); +} +CFWL_WidgetImp* CFWL_FormImp::GetSubFocus() +{ + return m_pSubFocus; +} +void CFWL_FormImp::SetSubFocus(CFWL_WidgetImp *pWidget) +{ + m_pSubFocus = pWidget; +} +CFX_MapAccelerators& CFWL_FormImp::GetAccelerator() +{ + return m_mapAccelerators; +} +void CFWL_FormImp::SetAccelerator(CFX_MapAccelerators *pAccelerators) +{ + _FWL_RETURN_IF_FAIL(pAccelerators); + m_mapAccelerators.RemoveAll(); + FX_DWORD vrKey, rValue; + FX_POSITION pos = pAccelerators->GetStartPosition(); + while (pos) { + pAccelerators->GetNextAssoc(pos, vrKey, rValue); + m_mapAccelerators.SetAt(vrKey, rValue); + } +} +void CFWL_FormImp::ShowChildWidget(IFWL_Widget *pParent) +{ + IFWL_App *pApp = FWL_GetApp(); + _FWL_RETURN_IF_FAIL(pApp); + CFWL_WidgetMgr *pWidgetMgr = (CFWL_WidgetMgr*)pApp->GetWidgetMgr(); + _FWL_RETURN_IF_FAIL(pWidgetMgr); + IFWL_Widget *pChild = pWidgetMgr->GetWidget(pParent, FWL_WGTRELATION_FirstChild); + while (pChild) { + pWidgetMgr->ShowWidget_Native(pChild); + ShowChildWidget(pChild); + pChild = pWidgetMgr->GetWidget(pChild, FWL_WGTRELATION_NextSibling); + } +} +void CFWL_FormImp::RemoveSysButtons() +{ + m_rtCaption.Reset(); + if (m_pCloseBox) { + delete m_pCloseBox; + m_pCloseBox = NULL; + } + if (m_pMinBox) { + delete m_pMinBox; + m_pMinBox = NULL; + } + if (m_pMaxBox) { + delete m_pMaxBox; + m_pMaxBox = NULL; + } + if (m_pCaptionBox) { + delete m_pCaptionBox; + m_pCaptionBox = NULL; + } +} +void CFWL_FormImp::CalcContentRect(CFX_RectF &rtContent) +{ +#ifdef FWL_UseMacSystemBorder + rtContent = m_rtRelative; +#else + GetEdgeRect(rtContent); + if (HasEdge()) { + FX_FLOAT fEdge = GetEdgeWidth(); + rtContent.Deflate(fEdge, fEdge); + } +#endif +} +CFWL_SysBtn* CFWL_FormImp::GetSysBtnAtPoint(FX_FLOAT fx, FX_FLOAT fy) +{ + if (m_pCloseBox && m_pCloseBox->m_rtBtn.Contains(fx, fy)) { + return m_pCloseBox; + } + if (m_pMaxBox && m_pMaxBox->m_rtBtn.Contains(fx, fy)) { + return m_pMaxBox; + } + if (m_pMinBox && m_pMinBox->m_rtBtn.Contains(fx, fy)) { + return m_pMinBox; + } + if (m_pCaptionBox && m_pCaptionBox->m_rtBtn.Contains(fx, fy)) { + return m_pCaptionBox; + } + return NULL; +} +CFWL_SysBtn* CFWL_FormImp::GetSysBtnByState(FX_DWORD dwState) +{ + if (m_pCloseBox && (m_pCloseBox->m_dwState & dwState)) { + return m_pCloseBox; + } + if (m_pMaxBox && (m_pMaxBox->m_dwState & dwState)) { + return m_pMaxBox; + } + if (m_pMinBox && (m_pMinBox->m_dwState & dwState)) { + return m_pMinBox; + } + if (m_pCaptionBox && (m_pCaptionBox->m_dwState & dwState)) { + return m_pCaptionBox; + } + return NULL; +} +CFWL_SysBtn* CFWL_FormImp::GetSysBtnByIndex(FX_INT32 nIndex) +{ + if (nIndex < 0) { + return NULL; + } + CFX_PtrArray arrBtn; + if (m_pMinBox) { + arrBtn.Add(m_pMinBox); + } + if (m_pMaxBox) { + arrBtn.Add(m_pMaxBox); + } + if (m_pCloseBox) { + arrBtn.Add(m_pCloseBox); + } + return (CFWL_SysBtn*) arrBtn[nIndex]; +} +FX_INT32 CFWL_FormImp::GetSysBtnIndex(CFWL_SysBtn *pBtn) +{ + CFX_PtrArray arrBtn; + if (m_pMinBox) { + arrBtn.Add(m_pMinBox); + } + if (m_pMaxBox) { + arrBtn.Add(m_pMaxBox); + } + if (m_pCloseBox) { + arrBtn.Add(m_pCloseBox); + } + return arrBtn.Find(pBtn); +} +FX_FLOAT CFWL_FormImp::GetCaptionHeight() +{ + FX_DWORD dwCapacity = 0; + if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Caption) { + dwCapacity = FWL_WGTCAPACITY_FRM_CYCaption; + } else if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_NarrowCaption) { + dwCapacity = FWL_WGTCAPACITY_FRM_CYNarrowCaption; + } + if (dwCapacity > 0) { + FX_FLOAT *pfCapHeight = (FX_FLOAT*)GetThemeCapacity(dwCapacity); + _FWL_RETURN_VALUE_IF_FAIL(pfCapHeight, 0); + return *pfCapHeight; + } + return 0; +} +void CFWL_FormImp::DrawCaptionText(CFX_Graphics *pGs, IFWL_ThemeProvider *pTheme, const CFX_Matrix* pMatrix ) +{ + CFX_WideString wsText; + IFWL_DataProvider *pData = m_pProperties->m_pDataProvider; + pData->GetCaption(m_pInterface, wsText); + if (wsText.IsEmpty()) { + return; + } + CFWL_ThemeText textParam; + textParam.m_pWidget = m_pInterface; + textParam.m_iPart = FWL_PART_FRM_Caption; + textParam.m_dwStates = FWL_PARTSTATE_FRM_Normal; + textParam.m_pGraphics = pGs; + if (pMatrix) { + textParam.m_matrix.Concat(*pMatrix); + } + CFX_RectF rtText; + if (m_bCustomizeLayout) { + rtText = m_rtCaptionText; + rtText.top -= 5; + } else { + rtText = m_rtCaption; + FX_FLOAT fpos; + fpos = HasIcon() ? 29.0f : 13.0f; + rtText.left += fpos; + } + textParam.m_rtPart = rtText; + textParam.m_wsText = wsText; + textParam.m_dwTTOStyles = FDE_TTOSTYLE_SingleLine | FDE_TTOSTYLE_Ellipsis; + textParam.m_iTTOAlign = m_bCustomizeLayout ? FDE_TTOALIGNMENT_Center : FDE_TTOALIGNMENT_CenterLeft; + pTheme->DrawText(&textParam); +} +void CFWL_FormImp::DrawIconImage(CFX_Graphics *pGs, IFWL_ThemeProvider *pTheme, const CFX_Matrix* pMatrix ) +{ + IFWL_FormDP *pData = (IFWL_FormDP *)m_pProperties->m_pDataProvider; + CFWL_ThemeBackground param; + param.m_pWidget = m_pInterface; + param.m_iPart = FWL_PART_FRM_Icon; + param.m_pGraphics = pGs; + param.m_pImage = pData->GetIcon(m_pInterface, FALSE); + param.m_rtPart = m_rtIcon; + if(pMatrix) { + param.m_matrix.Concat(*pMatrix); + } + pTheme->DrawBackground(¶m); +} +void CFWL_FormImp::GetEdgeRect(CFX_RectF &rtEdge) +{ + rtEdge = m_rtRelative; + if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border) { + FX_FLOAT fCX = GetBorderSize(); + FX_FLOAT fCY = GetBorderSize(FALSE); + rtEdge.Deflate(fCX, m_rtCaption.Height(), fCX, fCY); + } +} +void CFWL_FormImp::SetWorkAreaRect() +{ + m_rtRestore = m_pProperties->m_rtWidget; + CFWL_WidgetMgr *pWidgetMgr = (CFWL_WidgetMgr*)FWL_GetWidgetMgr(); + _FWL_RETURN_IF_FAIL(pWidgetMgr); + m_bSetMaximize = TRUE; + pWidgetMgr->SetMaximize_Native(m_pInterface); + Repaint(&m_rtRelative); +} +void CFWL_FormImp::SetCursor(FX_FLOAT fx, FX_FLOAT fy) +{ + IFWL_AdapterNative *pNative = FWL_GetAdapterNative(); + IFWL_AdapterCursorMgr *pCursorMgr = pNative->GetCursorMgr(); + _FWL_RETURN_IF_FAIL(pCursorMgr); + FX_DWORD dwHitTest = HitTest(fx, fy); + switch (dwHitTest) { + case FWL_WGTHITTEST_Right: { + FWL_HCURSOR hCursor = pCursorMgr->GetSystemCursor(FWL_CURSORTYPE_SizeWE); + pCursorMgr->SetCursor(hCursor); + pCursorMgr->ShowCursor(TRUE); + m_eResizeType = FORM_RESIZETYPE_Right; + break; + } + case FWL_WGTHITTEST_Bottom: { + FWL_HCURSOR hCursor = pCursorMgr->GetSystemCursor(FWL_CURSORTYPE_SizeNS); + pCursorMgr->SetCursor(hCursor); + pCursorMgr->ShowCursor(TRUE); + m_eResizeType = FORM_RESIZETYPE_Bottom; + break; + } + case FWL_WGTHITTEST_Left: { + FWL_HCURSOR hCursor = pCursorMgr->GetSystemCursor(FWL_CURSORTYPE_SizeWE); + pCursorMgr->SetCursor(hCursor); + pCursorMgr->ShowCursor(TRUE); + m_eResizeType = FORM_RESIZETYPE_Left; + break; + } + case FWL_WGTHITTEST_Top: { + FWL_HCURSOR hCursor = pCursorMgr->GetSystemCursor(FWL_CURSORTYPE_SizeNS); + pCursorMgr->SetCursor(hCursor); + pCursorMgr->ShowCursor(TRUE); + m_eResizeType = FORM_RESIZETYPE_Top; + break; + } + case FWL_WGTHITTEST_LeftTop: { + FWL_HCURSOR hCursor = pCursorMgr->GetSystemCursor(FWL_CURSORTYPE_SizeNWSE); + pCursorMgr->SetCursor(hCursor); + pCursorMgr->ShowCursor(TRUE); + m_eResizeType = FORM_RESIZETYPE_LeftTop; + break; + } + case FWL_WGTHITTEST_LeftBottom: { + FWL_HCURSOR hCursor = pCursorMgr->GetSystemCursor(FWL_CURSORTYPE_SizeNESW); + pCursorMgr->SetCursor(hCursor); + pCursorMgr->ShowCursor(TRUE); + m_eResizeType = FORM_RESIZETYPE_LeftBottom; + break; + } + case FWL_WGTHITTEST_RightTop: { + FWL_HCURSOR hCursor = pCursorMgr->GetSystemCursor(FWL_CURSORTYPE_SizeNESW); + pCursorMgr->SetCursor(hCursor); + pCursorMgr->ShowCursor(TRUE); + m_eResizeType = FORM_RESIZETYPE_RightTop; + break; + } + case FWL_WGTHITTEST_RightBottom: { + FWL_HCURSOR hCursor = pCursorMgr->GetSystemCursor(FWL_CURSORTYPE_SizeNWSE); + pCursorMgr->SetCursor(hCursor); + pCursorMgr->ShowCursor(TRUE); + m_eResizeType = FORM_RESIZETYPE_RightBottom; + break; + } + default: { + FWL_HCURSOR hCursor = pCursorMgr->GetSystemCursor(FWL_CURSORTYPE_Arrow); + pCursorMgr->SetCursor(hCursor); + pCursorMgr->ShowCursor(TRUE); + } + } +} +void CFWL_FormImp::Layout() +{ + GetRelativeRect(m_rtRelative); +#ifndef FWL_UseMacSystemBorder + ReSetSysBtn(); +#endif + if (m_pContent) { + CFX_RectF rtClient; + GetClientRect(rtClient); + m_pContent->SetWidgetRect(rtClient); + m_pContent->Update(); + } +} +void CFWL_FormImp::ReSetSysBtn() +{ + m_fCXBorder = *(FX_FLOAT*)GetThemeCapacity(FWL_WGTCAPACITY_CXBorder); + m_fCYBorder = *(FX_FLOAT*)GetThemeCapacity(FWL_WGTCAPACITY_CYBorder); + RemoveSysButtons(); + IFWL_ThemeProvider *pTheme = m_pProperties->m_pThemeProvider; + m_bCustomizeLayout = pTheme->IsCustomizedLayout(m_pInterface); + FX_FLOAT fCapHeight = GetCaptionHeight(); + if (fCapHeight > 0) { + m_rtCaption = m_rtRelative; + m_rtCaption.height = fCapHeight; + } + m_iSysBox = 0; + if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_CloseBox) { + m_pCloseBox = FX_NEW CFWL_SysBtn; + if (m_bCustomizeLayout) { + CFWL_ThemeBackground param; + param.m_pWidget = m_pInterface; + param.m_iPart = FWL_PART_FRM_CloseBox; + pTheme->GetPartRect(¶m, m_pCloseBox->m_rtBtn); + } else { + m_pCloseBox->m_rtBtn.Set(m_rtRelative.right() - FWL_SYSBTNMARGIN - FWL_SYSBTNSIZE, + FWL_SYSBTNMARGIN, + FWL_SYSBTNSIZE, + FWL_SYSBTNSIZE); + } + m_iSysBox ++; + } + if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_MaximizeBox) { + m_pMaxBox = FX_NEW CFWL_SysBtn; + if (m_bCustomizeLayout) { + CFWL_ThemeBackground param; + param.m_pWidget = m_pInterface; + param.m_iPart = FWL_PART_FRM_MaximizeBox; + pTheme->GetPartRect(¶m, m_pMaxBox->m_rtBtn); + } else { + if (m_pCloseBox) { + m_pMaxBox->m_rtBtn.Set(m_pCloseBox->m_rtBtn.left - FWL_SYSBTNSPAN - FWL_SYSBTNSIZE, + m_pCloseBox->m_rtBtn.top, + FWL_SYSBTNSIZE, + FWL_SYSBTNSIZE); + } else { + m_pMaxBox->m_rtBtn.Set(m_rtRelative.right() - FWL_SYSBTNMARGIN - FWL_SYSBTNSIZE, + FWL_SYSBTNMARGIN, + FWL_SYSBTNSIZE, + FWL_SYSBTNSIZE); + } + } + m_iSysBox ++; + } + if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_MinimizeBox) { + m_pMinBox = FX_NEW CFWL_SysBtn; + if (m_bCustomizeLayout) { + CFWL_ThemeBackground param; + param.m_pWidget = m_pInterface; + param.m_iPart = FWL_PART_FRM_MinimizeBox; + pTheme->GetPartRect(¶m, m_pMinBox->m_rtBtn); + } else { + if (m_pMaxBox) { + m_pMinBox->m_rtBtn.Set(m_pMaxBox->m_rtBtn.left - FWL_SYSBTNSPAN - FWL_SYSBTNSIZE, + m_pMaxBox->m_rtBtn.top, + FWL_SYSBTNSIZE, + FWL_SYSBTNSIZE); + } else if (m_pCloseBox) { + m_pMinBox->m_rtBtn.Set(m_pCloseBox->m_rtBtn.left - FWL_SYSBTNSPAN - FWL_SYSBTNSIZE, + m_pCloseBox->m_rtBtn.top, + FWL_SYSBTNSIZE, + FWL_SYSBTNSIZE); + } else { + m_pMinBox->m_rtBtn.Set(m_rtRelative.right() - FWL_SYSBTNMARGIN - FWL_SYSBTNSIZE, + FWL_SYSBTNMARGIN, + FWL_SYSBTNSIZE, + FWL_SYSBTNSIZE); + } + } + m_iSysBox ++; + } + IFWL_FormDP *pData = (IFWL_FormDP *)m_pProperties->m_pDataProvider; + if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Icon && pData->GetIcon(m_pInterface, FALSE)) { + if (m_bCustomizeLayout) { + CFWL_ThemeBackground param; + param.m_pWidget = m_pInterface; + param.m_iPart = FWL_PART_FRM_Icon; + CFX_WideString wsText; + m_pProperties->m_pDataProvider->GetCaption(m_pInterface, wsText); + param.m_pData = &wsText; + pTheme->GetPartRect(¶m, m_rtIcon); + } else { + m_rtIcon.Set(5, (m_rtCaption.height - m_fSmallIconSz) / 2, m_fSmallIconSz, m_fSmallIconSz); + } + } + if (m_bCustomizeLayout) { + CFWL_ThemeText parma; + parma.m_pWidget = m_pInterface; + parma.m_iPart = FWL_PART_FRM_HeadText; + m_pProperties->m_pDataProvider->GetCaption(m_pInterface, parma.m_wsText); + pTheme->GetPartRect(&parma, m_rtCaptionText); + } +} +void CFWL_FormImp::RegisterForm() +{ + IFWL_NoteThread *pThread = GetOwnerThread(); + _FWL_RETURN_IF_FAIL(pThread); + CFWL_NoteDriver *pDriver = (CFWL_NoteDriver*)pThread->GetNoteDriver(); + _FWL_RETURN_IF_FAIL(pDriver); + pDriver->RegisterForm(this); +} +void CFWL_FormImp::UnRegisterForm() +{ + IFWL_NoteThread *pThread = GetOwnerThread(); + _FWL_RETURN_IF_FAIL(pThread); + CFWL_NoteDriver *pDriver = (CFWL_NoteDriver*)pThread->GetNoteDriver(); + _FWL_RETURN_IF_FAIL(pDriver); + pDriver->UnRegisterForm(this); +} +FX_BOOL CFWL_FormImp::IsDoModal() +{ + return m_bDoModalFlag; +} +void CFWL_FormImp::SetThemeData() +{ + m_fSmallIconSz = *(FX_FLOAT *)GetThemeCapacity(FWL_WGTCAPACITY_FRM_SmallIcon); + m_fBigIconSz = *(FX_FLOAT *)GetThemeCapacity(FWL_WGTCAPACITY_FRM_BigIcon); +} +FX_BOOL CFWL_FormImp::HasIcon() +{ + IFWL_FormDP *pData = (IFWL_FormDP *)m_pProperties->m_pDataProvider; + return pData->GetIcon(m_pInterface, FALSE) ? TRUE : FALSE; +} +void CFWL_FormImp::UpdateIcon() +{ + CFWL_WidgetMgr *pWidgetMgr = (CFWL_WidgetMgr*)FWL_GetWidgetMgr(); + _FWL_RETURN_IF_FAIL(pWidgetMgr); + IFWL_FormDP *pData = (IFWL_FormDP *)m_pProperties->m_pDataProvider; + CFX_DIBitmap *pBigIcon = pData->GetIcon(m_pInterface, TRUE); + CFX_DIBitmap *pSmallIcon = pData->GetIcon(m_pInterface, FALSE); + if (pBigIcon && pBigIcon != m_pBigIcon) { + m_pBigIcon = pBigIcon; + pWidgetMgr->SetWidgetIcon_Native(m_pInterface, m_pBigIcon, TRUE); + } + if (pSmallIcon && pSmallIcon != m_pSmallIcon) { + m_pSmallIcon = pSmallIcon; + pWidgetMgr->SetWidgetIcon_Native(m_pInterface, m_pBigIcon, FALSE); + } +} +void CFWL_FormImp::UpdateCaption() +{ + CFWL_WidgetMgr *pWidgetMgr = (CFWL_WidgetMgr*)FWL_GetWidgetMgr(); + _FWL_RETURN_IF_FAIL(pWidgetMgr); + IFWL_FormDP *pData = (IFWL_FormDP *)m_pProperties->m_pDataProvider; + _FWL_RETURN_IF_FAIL(pData); + CFX_WideString text; + pData->GetCaption(m_pInterface, text); + pWidgetMgr->SetWidgetCaption_Native(m_pInterface, text); +} +void CFWL_FormImp::DoWidthLimit(FX_FLOAT &fLeft, FX_FLOAT &fWidth, FX_FLOAT fCurX, FX_FLOAT fSpace, FX_FLOAT fLimitMin, FX_FLOAT fLimitMax, FX_BOOL bLeft) +{ + FX_FLOAT fx = fCurX; + FX_FLOAT fy = 0 ; + TransformTo(NULL, fx, fy); + FX_FLOAT fTemp = bLeft ? (fWidth - fx + fLeft + fSpace ) : (fx - fLeft + fSpace); + if (fTemp >= fLimitMin && fTemp <= fLimitMax) { + fWidth = fTemp; + fLeft += bLeft ? (fx - fLeft - fSpace ) : 0; + } else { + if (fTemp < fLimitMin && fWidth > fLimitMin) { + fLeft += bLeft ? (fWidth - fLimitMin) : 0; + fWidth = fLimitMin; + } else if (fTemp > fLimitMax && fWidth < fLimitMax) { + fLeft -= bLeft ? (fLimitMax - fWidth) : 0; + fWidth = fLimitMax; + } + } +} +void CFWL_FormImp::DoHeightLimit(FX_FLOAT &fTop, FX_FLOAT &fHeight, FX_FLOAT fCurY, FX_FLOAT fSpace, FX_FLOAT fLimitMin, FX_FLOAT fLimitMax, FX_BOOL bTop) +{ + FX_FLOAT fx = 0; + FX_FLOAT fy = fCurY ; + TransformTo(NULL, fx, fy); + FX_FLOAT fTemp = bTop ? (fHeight - fy + fTop + fSpace ) : (fy - fTop + fSpace); + if (fTemp >= fLimitMin && fTemp <= fLimitMax) { + fHeight = fTemp; + fTop += bTop ? (fy - fTop - fSpace ) : 0; + } else { + if (fTemp < fLimitMin && fHeight > fLimitMin) { + fTop += bTop ? (fHeight - fLimitMin) : 0; + fHeight = fLimitMin; + } else if (fTemp > fLimitMax && fHeight < fLimitMax) { + fTop -= bTop ? (fLimitMax - fHeight) : 0; + fHeight = fLimitMax; + } + } +} +CFWL_FormDelegate::CFWL_FormDelegate(CFWL_FormImp *pOwner) + : m_pOwner(pOwner) +{ +} +FX_INT32 CFWL_FormDelegate::OnProcessMessage(CFWL_Message *pMessage) +{ +#ifdef FWL_UseMacSystemBorder + _FWL_RETURN_VALUE_IF_FAIL(pMessage, 0); + FX_DWORD dwMsgCode = pMessage->GetClassID(); + FX_INT32 iRet = 1; + switch (dwMsgCode) { + case FWL_MSGHASH_Activate: { + m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Deactivated; + m_pOwner->Repaint(&m_pOwner->m_rtRelative); + break; + } + case FWL_MSGHASH_Deactivate: { + m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Deactivated; + m_pOwner->Repaint(&m_pOwner->m_rtRelative); + break; + } + } + return FWL_ERR_Succeeded; +#else + _FWL_RETURN_VALUE_IF_FAIL(pMessage, 0); + FX_DWORD dwMsgCode = pMessage->GetClassID(); + FX_INT32 iRet = 1; + switch (dwMsgCode) { + case FWL_MSGHASH_Activate: { + m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Deactivated; + IFWL_NoteThread *pThread = m_pOwner->GetOwnerThread(); + CFWL_NoteDriver *pDriver = (CFWL_NoteDriver*)pThread->GetNoteDriver(); + CFWL_WidgetImp *pSubFocusImp = m_pOwner->GetSubFocus(); + IFWL_Widget *pSubFocus = pSubFocusImp ? pSubFocusImp->GetInterface() : NULL; + if (pSubFocus && pSubFocus != pDriver->GetFocus()) { + pDriver->SetFocus(pSubFocus); + } + m_pOwner->Repaint(&m_pOwner->m_rtRelative); + break; + } + case FWL_MSGHASH_Deactivate: { + m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Deactivated; + IFWL_NoteThread *pThread = m_pOwner->GetOwnerThread(); + CFWL_NoteDriver *pDriver = (CFWL_NoteDriver*)pThread->GetNoteDriver(); + CFWL_WidgetImp *pSubFocusImp = m_pOwner->GetSubFocus(); + IFWL_Widget *pSubFocus = pSubFocusImp ? pSubFocusImp->GetInterface() : NULL; + if (pSubFocus) { + if (pSubFocus == pDriver->GetFocus()) { + pDriver->SetFocus(NULL); + } else if (pSubFocus->GetStates() & FWL_WGTSTATE_Focused) { + CFWL_MsgKillFocus ms; + IFWL_WidgetDelegate *pDelegate = pSubFocus->SetDelegate(NULL); + if (pDelegate) { + pDelegate->OnProcessMessage(&ms); + } + } + } + m_pOwner->Repaint(&m_pOwner->m_rtRelative); + break; + } + case FWL_MSGHASH_Mouse: { + CFWL_MsgMouse *pMsg = (CFWL_MsgMouse*)pMessage; + switch (pMsg->m_dwCmd) { + case FWL_MSGMOUSECMD_LButtonDown: { + OnLButtonDown(pMsg); + break; + } + case FWL_MSGMOUSECMD_LButtonUp: { + OnLButtonUp(pMsg); + break; + } + case FWL_MSGMOUSECMD_MouseMove: { + OnMouseMove(pMsg); + break; + } + case FWL_MSGMOUSECMD_MouseHover: { + OnMouseHover(pMsg); + break; + } + case FWL_MSGMOUSECMD_MouseLeave: { + OnMouseLeave(pMsg); + break; + } + case FWL_MSGMOUSECMD_LButtonDblClk: { + OnLButtonDblClk(pMsg); + break; + } + } + break; + } + case FWL_MSGHASH_Size: { + CFWL_WidgetMgr *pWidgetMgr = (CFWL_WidgetMgr*)FWL_GetWidgetMgr(); + _FWL_RETURN_VALUE_IF_FAIL(pWidgetMgr, 0); + pWidgetMgr->AddRedrawCounts(m_pOwner->m_pInterface); + if (!m_pOwner->m_bSetMaximize) { + break; + } + m_pOwner->m_bSetMaximize = FALSE; + CFWL_MsgSize *pMsg = (CFWL_MsgSize*)pMessage; + CFX_RectF rt; + pWidgetMgr->GetWidgetRect_Native(m_pOwner->m_pInterface, rt); + m_pOwner->m_pProperties->m_rtWidget.left = rt.left; + m_pOwner->m_pProperties->m_rtWidget.top = rt.top; + m_pOwner->m_pProperties->m_rtWidget.width = (FX_FLOAT)pMsg->m_iWidth; + m_pOwner->m_pProperties->m_rtWidget.height = (FX_FLOAT)pMsg->m_iHeight; + m_pOwner->Update(); + break; + } + case FWL_MSGHASH_WindowMove: { + OnWindowMove((CFWL_MsgWindowMove* )pMessage); + break; + } + case FWL_MSGHASH_Close: { + OnClose((CFWL_MsgClose* )pMessage); + break; + } + default: { + iRet = 0; + } + } + return iRet; +#endif +} +FWL_ERR CFWL_FormDelegate::OnProcessEvent(CFWL_Event *pEvent) +{ + _FWL_RETURN_VALUE_IF_FAIL(pEvent, FWL_ERR_Indefinite); + if (pEvent->GetClassID() == FWL_EVTHASH_Close && pEvent->m_pSrcTarget == m_pOwner->m_pInterface) { + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_FormDelegate::OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + return m_pOwner->DrawWidget(pGraphics, pMatrix); +} +void CFWL_FormDelegate::OnLButtonDown(CFWL_MsgMouse *pMsg) +{ + m_pOwner->SetGrab(TRUE); + m_pOwner->m_bLButtonDown = TRUE; + m_pOwner->m_eResizeType = FORM_RESIZETYPE_None; + CFWL_SysBtn *pPressBtn = m_pOwner->GetSysBtnAtPoint(pMsg->m_fx, pMsg->m_fy); + m_pOwner->m_iCaptureBtn = m_pOwner->GetSysBtnIndex(pPressBtn); + CFX_RectF rtCap; + rtCap.Set(m_pOwner->m_rtCaption.left + m_pOwner->m_fCYBorder, + m_pOwner->m_rtCaption.top + m_pOwner->m_fCXBorder, + m_pOwner->m_rtCaption.width - FWL_SYSBTNSIZE * m_pOwner->m_iSysBox - 2 * m_pOwner->m_fCYBorder, + m_pOwner->m_rtCaption.height - m_pOwner->m_fCXBorder); + if (pPressBtn) { + pPressBtn->SetPressed(); + m_pOwner->Repaint(&pPressBtn->m_rtBtn); + } else if (rtCap.Contains(pMsg->m_fx, pMsg->m_fy)) { + m_pOwner->m_eResizeType = FORM_RESIZETYPE_Cap; + } else if ((m_pOwner->m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border) && + (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_FRM_Resize) && + !m_pOwner->m_bMaximized) { + m_pOwner->SetCursor(pMsg->m_fx, pMsg->m_fy); + } + m_pOwner->m_InfoStart.m_ptStart.Set(pMsg->m_fx, pMsg->m_fy); + m_pOwner->m_InfoStart.m_szStart.Set(m_pOwner->m_pProperties->m_rtWidget.width, m_pOwner->m_pProperties->m_rtWidget.height); +} +void CFWL_FormDelegate::OnLButtonUp(CFWL_MsgMouse *pMsg) +{ + m_pOwner->SetGrab(FALSE); + m_pOwner->m_bLButtonDown = FALSE; + CFWL_SysBtn *pPointBtn = m_pOwner->GetSysBtnAtPoint(pMsg->m_fx, pMsg->m_fy); + CFWL_SysBtn *pPressedBtn = m_pOwner->GetSysBtnByIndex(m_pOwner->m_iCaptureBtn); + if (!pPressedBtn || pPointBtn != pPressedBtn) { + return; + } + if (pPressedBtn == m_pOwner->GetSysBtnByState(FWL_SYSBUTTONSTATE_Pressed)) { + pPressedBtn->SetNormal(); + } + if (pPressedBtn == m_pOwner->m_pMaxBox) { + if (m_pOwner->m_bMaximized) { + m_pOwner->SetWidgetRect(m_pOwner->m_rtRestore); + m_pOwner->Update(); + m_pOwner->Repaint(); + } else { + m_pOwner->SetWorkAreaRect(); + m_pOwner->Update(); + } + m_pOwner->m_bMaximized = !m_pOwner->m_bMaximized; + } else if (pPressedBtn == m_pOwner->m_pMinBox) { + CFWL_WidgetMgr *pWidgetMgr = (CFWL_WidgetMgr*)FWL_GetWidgetMgr(); + _FWL_RETURN_IF_FAIL(pWidgetMgr); + pWidgetMgr->SetMinimize_Native(m_pOwner->m_pInterface); + } else { + CFWL_EvtClose eClose; + eClose.m_pSrcTarget = m_pOwner->m_pInterface; + m_pOwner->DispatchEvent(&eClose); + } +} +void CFWL_FormDelegate::OnMouseMove(CFWL_MsgMouse *pMsg) +{ + CFWL_WidgetMgr *pWidgetMgr = (CFWL_WidgetMgr*)FWL_GetWidgetMgr(); + if (m_pOwner->m_bLButtonDown) { + IFWL_AdapterNative *pNative = FWL_GetAdapterNative(); + IFWL_AdapterCursorMgr *pCursorMgr = pNative->GetCursorMgr(); + _FWL_RETURN_IF_FAIL(pCursorMgr); + CFWL_SysBtn *pPressedBtn = m_pOwner->GetSysBtnByIndex(m_pOwner->m_iCaptureBtn); + FX_FLOAT fTop, fLeft, fWidth, fHeight; + fTop = m_pOwner->m_pProperties->m_rtWidget.top; + fLeft = m_pOwner->m_pProperties->m_rtWidget.left; + fWidth = m_pOwner->m_pProperties->m_rtWidget.width; + fHeight = m_pOwner->m_pProperties->m_rtWidget.height; + FX_FLOAT fWidthMax, fWidthMin, fHeightMax, fHeightMin; + if (m_pOwner->m_pContent) { + m_pOwner->GetContent()->GetMaxSize(fWidthMax, fHeightMax); + m_pOwner->GetContent()->GetMinSize(fWidthMin, fHeightMin); + } else { + fWidthMax = fHeightMax = 1024 * 4; + fWidthMin = fHeightMin = 0; + } + FX_BOOL bWidthlimit = (fWidthMin != 0 || fWidthMax != 0); + FX_BOOL bHeightlimit = (fHeightMin != 0 || fHeightMax != 0); + FX_BOOL bSizelimit = bWidthlimit || bHeightlimit; + if (fWidthMax != 0 || fHeightMax != 0 || fWidthMin != 0 || fHeightMin != 0) { + bSizelimit = TRUE; + } + if (pPressedBtn) { + if (!pPressedBtn->m_rtBtn.Contains(pMsg->m_fx, pMsg->m_fy)) { + pPressedBtn->SetNormal(); + } else { + pPressedBtn->SetPressed(); + } + m_pOwner->Repaint(&pPressedBtn->m_rtBtn); + return; + } else if (m_pOwner->m_bMaximized) { + return; + } else if (m_pOwner->m_eResizeType == FORM_RESIZETYPE_Cap) { + m_pOwner->m_pProperties->m_rtWidget.Offset(pMsg->m_fx - m_pOwner->m_InfoStart.m_ptStart.x, pMsg->m_fy - m_pOwner->m_InfoStart.m_ptStart.y); + pWidgetMgr->SetWidgetPosition_Native(m_pOwner->m_pInterface, + m_pOwner->m_pProperties->m_rtWidget.left, + m_pOwner->m_pProperties->m_rtWidget.top); + return; + } else if (m_pOwner->m_eResizeType == FORM_RESIZETYPE_Right) { + FWL_HCURSOR hCursor = pCursorMgr->GetSystemCursor(FWL_CURSORTYPE_SizeWE); + pCursorMgr->SetCursor(hCursor); + pCursorMgr->ShowCursor(TRUE); + if (!bWidthlimit) { + fWidth += pMsg->m_fx - m_pOwner->m_InfoStart.m_ptStart.x; + m_pOwner->m_InfoStart.m_ptStart.x = pMsg->m_fx; + } else { + m_pOwner->DoWidthLimit(fLeft, fWidth, pMsg->m_fx, m_pOwner->m_InfoStart.m_szStart.x - m_pOwner->m_InfoStart.m_ptStart.x, fWidthMin, fWidthMax, FALSE); + } + } else if (m_pOwner->m_eResizeType == FORM_RESIZETYPE_Left) { + FWL_HCURSOR hCursor = pCursorMgr->GetSystemCursor(FWL_CURSORTYPE_SizeWE); + pCursorMgr->SetCursor(hCursor); + pCursorMgr->ShowCursor(TRUE); + if (!bWidthlimit) { + fLeft -= m_pOwner->m_InfoStart.m_ptStart.x - pMsg->m_fx; + fWidth += m_pOwner->m_InfoStart.m_ptStart.x - pMsg->m_fx; + } else { + m_pOwner->DoWidthLimit(fLeft, fWidth, pMsg->m_fx, m_pOwner->m_InfoStart.m_ptStart.x, fWidthMin, fWidthMax, TRUE); + } + } else if (m_pOwner->m_eResizeType == FORM_RESIZETYPE_Bottom) { + FWL_HCURSOR hCursor = pCursorMgr->GetSystemCursor(FWL_CURSORTYPE_SizeNS); + pCursorMgr->SetCursor(hCursor); + pCursorMgr->ShowCursor(TRUE); + if (!bHeightlimit) { + fHeight += pMsg->m_fy - m_pOwner->m_InfoStart.m_ptStart.y; + m_pOwner->m_InfoStart.m_ptStart.y = pMsg->m_fy; + } else { + m_pOwner->DoHeightLimit(fTop, fHeight, pMsg->m_fy, m_pOwner->m_InfoStart.m_szStart.y - m_pOwner->m_InfoStart.m_ptStart.y, fHeightMin, fHeightMax, FALSE); + } + } else if (m_pOwner->m_eResizeType == FORM_RESIZETYPE_Top) { + FWL_HCURSOR hCursor = pCursorMgr->GetSystemCursor(FWL_CURSORTYPE_SizeNS); + pCursorMgr->SetCursor(hCursor); + pCursorMgr->ShowCursor(TRUE); + if (!bHeightlimit) { + fTop += pMsg->m_fy - m_pOwner->m_InfoStart.m_ptStart.y; + fHeight -= pMsg->m_fy - m_pOwner->m_InfoStart.m_ptStart.y; + } else { + m_pOwner->DoHeightLimit(fTop, fHeight, pMsg->m_fy, m_pOwner->m_InfoStart.m_ptStart.y, fHeightMin, fHeightMax, TRUE); + } + } else if (m_pOwner->m_eResizeType == FORM_RESIZETYPE_LeftTop) { + FWL_HCURSOR hCursor = pCursorMgr->GetSystemCursor(FWL_CURSORTYPE_SizeNWSE); + pCursorMgr->SetCursor(hCursor); + pCursorMgr->ShowCursor(TRUE); + if (!bSizelimit) { + fLeft -= m_pOwner->m_InfoStart.m_ptStart.x - pMsg->m_fx; + fTop += pMsg->m_fy - m_pOwner-> m_InfoStart.m_ptStart.y; + fWidth += m_pOwner->m_InfoStart.m_ptStart.x - pMsg->m_fx; + fHeight -= pMsg->m_fy - m_pOwner->m_InfoStart.m_ptStart.y; + m_pOwner->m_InfoStart.m_ptStart.x = pMsg->m_fx; + m_pOwner->m_InfoStart.m_ptStart.y = pMsg->m_fy; + } else { + m_pOwner->DoWidthLimit(fLeft, fWidth, pMsg->m_fx, m_pOwner->m_InfoStart.m_ptStart.x, fWidthMin, fWidthMax, TRUE); + m_pOwner->DoHeightLimit(fTop, fHeight, pMsg->m_fy, m_pOwner->m_InfoStart.m_ptStart.y, fHeightMin, fHeightMax, TRUE); + } + } else if (m_pOwner->m_eResizeType == FORM_RESIZETYPE_LeftBottom) { + FWL_HCURSOR hCursor = pCursorMgr->GetSystemCursor(FWL_CURSORTYPE_SizeNESW); + pCursorMgr->SetCursor(hCursor); + pCursorMgr->ShowCursor(TRUE); + if (!bSizelimit) { + fLeft -= m_pOwner->m_InfoStart.m_ptStart.x - pMsg->m_fx; + fWidth += m_pOwner->m_InfoStart.m_ptStart.x - pMsg->m_fx; + fHeight += pMsg->m_fy - m_pOwner->m_InfoStart.m_ptStart.y; + m_pOwner->m_InfoStart.m_ptStart.x = pMsg->m_fx; + m_pOwner->m_InfoStart.m_ptStart.y = pMsg->m_fy; + } else { + m_pOwner->DoWidthLimit(fLeft, fWidth, pMsg->m_fx, m_pOwner->m_InfoStart.m_ptStart.x, fWidthMin, fWidthMax, TRUE); + m_pOwner->DoHeightLimit(fTop, fHeight, pMsg->m_fy, m_pOwner->m_InfoStart.m_szStart.y - m_pOwner->m_InfoStart.m_ptStart.y, fHeightMin, fHeightMax, FALSE); + } + } else if (m_pOwner->m_eResizeType == FORM_RESIZETYPE_RightTop) { + FWL_HCURSOR hCursor = pCursorMgr->GetSystemCursor(FWL_CURSORTYPE_SizeNESW); + pCursorMgr->SetCursor(hCursor); + pCursorMgr->ShowCursor(TRUE); + if (!bSizelimit) { + fTop += pMsg->m_fy - m_pOwner->m_InfoStart.m_ptStart.y; + fWidth += pMsg->m_fx - m_pOwner->m_InfoStart.m_ptStart.x; + fHeight -= pMsg->m_fy - m_pOwner->m_InfoStart.m_ptStart.y; + m_pOwner->m_InfoStart.m_ptStart.x = pMsg->m_fx; + m_pOwner->m_InfoStart.m_ptStart.y = pMsg->m_fy; + } else { + m_pOwner->DoWidthLimit(fLeft, fWidth, pMsg->m_fx, m_pOwner->m_InfoStart.m_szStart.x - m_pOwner->m_InfoStart.m_ptStart.x, fWidthMin, fWidthMax, FALSE); + m_pOwner->DoHeightLimit(fTop, fHeight, pMsg->m_fy, m_pOwner->m_InfoStart.m_ptStart.y, fHeightMin, fHeightMax, TRUE); + } + } else if (m_pOwner->m_eResizeType == FORM_RESIZETYPE_RightBottom) { + FWL_HCURSOR hCursor = pCursorMgr->GetSystemCursor(FWL_CURSORTYPE_SizeNWSE); + pCursorMgr->SetCursor(hCursor); + pCursorMgr->ShowCursor(TRUE); + if (!bSizelimit) { + fWidth += pMsg->m_fx - m_pOwner->m_InfoStart.m_ptStart.x; + fHeight += pMsg->m_fy - m_pOwner->m_InfoStart.m_ptStart.y; + m_pOwner->m_InfoStart.m_ptStart.x = pMsg->m_fx; + m_pOwner->m_InfoStart.m_ptStart.y = pMsg->m_fy; + } else { + m_pOwner->DoWidthLimit(fLeft, fWidth, pMsg->m_fx, m_pOwner->m_InfoStart.m_szStart.x - m_pOwner->m_InfoStart.m_ptStart.x, fWidthMin, fWidthMax, FALSE); + m_pOwner->DoHeightLimit(fTop, fHeight, pMsg->m_fy, m_pOwner->m_InfoStart.m_szStart.y - m_pOwner->m_InfoStart.m_ptStart.y, fHeightMin, fHeightMax, FALSE); + } + } + if (m_pOwner->m_pContent) { + } + CFX_RectF rtForm; + rtForm.Set(fLeft, fTop, fWidth, fHeight); +#if (_FX_OS_==_FX_MACOSX_) + m_pOwner->m_pProperties->m_rtWidget = rtForm; + m_pOwner->Update(); + m_pOwner->SetWidgetRect(rtForm); +#else + m_pOwner->SetWidgetRect(rtForm); + m_pOwner->Update(); +#endif + return; + } + if ((m_pOwner->m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border) && + (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_FRM_Resize) && + !m_pOwner->m_bMaximized) { + m_pOwner->SetCursor(pMsg->m_fx, pMsg->m_fy); + } + CFX_RectF rtInvalidate; + rtInvalidate.Reset(); + CFWL_SysBtn *pPointBtn = m_pOwner->GetSysBtnAtPoint(pMsg->m_fx, pMsg->m_fy); + CFWL_SysBtn *pOldHover = m_pOwner->GetSysBtnByState(FWL_SYSBUTTONSTATE_Hover); +#if (_FX_OS_==_FX_MACOSX_) + { + if (pOldHover && pPointBtn != pOldHover) { + pOldHover->SetNormal(); + } + if (pPointBtn && pPointBtn != pOldHover) { + pPointBtn->SetHover(); + } + if (m_pOwner->m_pCloseBox) { + rtInvalidate = m_pOwner->m_pCloseBox->m_rtBtn; + } + if (m_pOwner->m_pMaxBox) { + if (rtInvalidate.IsEmpty()) { + rtInvalidate = m_pOwner->m_pMaxBox->m_rtBtn; + } else { + rtInvalidate.Union(m_pOwner->m_pMaxBox->m_rtBtn); + } + } + if (m_pOwner->m_pMinBox) { + if (rtInvalidate.IsEmpty()) { + rtInvalidate = m_pOwner->m_pMinBox->m_rtBtn; + } else { + rtInvalidate.Union(m_pOwner->m_pMinBox->m_rtBtn); + } + } + if (!rtInvalidate.IsEmpty() && rtInvalidate.Contains(pMsg->m_fx, pMsg->m_fy)) { + m_pOwner->m_bMouseIn = TRUE; + } + } +#else + { + if (pOldHover && pPointBtn != pOldHover) { + pOldHover->SetNormal(); + rtInvalidate = pOldHover->m_rtBtn; + } + if (pPointBtn && pPointBtn != pOldHover) { + pPointBtn->SetHover(); + if (rtInvalidate.IsEmpty()) { + rtInvalidate = pPointBtn->m_rtBtn; + } else { + rtInvalidate.Union(pPointBtn->m_rtBtn); + } + } + } +#endif + if (!rtInvalidate.IsEmpty()) { + m_pOwner->Repaint(&rtInvalidate); + } +} +void CFWL_FormDelegate::OnMouseHover(CFWL_MsgMouse *pMsg) +{ + m_pOwner->SetCursor(pMsg->m_fx, pMsg->m_fy); +} +void CFWL_FormDelegate::OnMouseLeave(CFWL_MsgMouse *pMsg) +{ + CFWL_SysBtn *pHover = m_pOwner->GetSysBtnByState(FWL_SYSBUTTONSTATE_Hover); + if (pHover) { + pHover->SetNormal(); + m_pOwner->Repaint(&pHover->m_rtBtn); + } + if (pMsg->m_dwCmd == FWL_MSGMOUSECMD_MouseLeave && !m_pOwner->m_bLButtonDown) { + m_pOwner->SetCursor(pMsg->m_fx, pMsg->m_fy); + } +} +void CFWL_FormDelegate::OnLButtonDblClk(CFWL_MsgMouse *pMsg) +{ + if ((m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_FRM_Resize) && m_pOwner->HitTest(pMsg->m_fx, pMsg->m_fy) == FWL_WGTHITTEST_Titlebar) { + if (m_pOwner->m_bMaximized) { + m_pOwner->SetWidgetRect(m_pOwner->m_rtRestore); + } else { + m_pOwner->SetWorkAreaRect(); + } + m_pOwner->Update(); + m_pOwner->m_bMaximized = !m_pOwner->m_bMaximized; + } +} +void CFWL_FormDelegate::OnWindowMove(CFWL_MsgWindowMove *pMsg) +{ + m_pOwner->m_pProperties->m_rtWidget.left = pMsg->m_fx; + m_pOwner->m_pProperties->m_rtWidget.top = pMsg->m_fy; +} +void CFWL_FormDelegate::OnClose(CFWL_MsgClose *pMsg) +{ + CFWL_EvtClose eClose; + eClose.m_pSrcTarget = m_pOwner->m_pInterface; + m_pOwner->DispatchEvent(&eClose); +} +FWL_ERR FWL_Accelerator_SetForm(IFWL_Form *pFrom, CFX_MapAccelerators *pMapAccel) +{ + CFWL_FormImp *pImp = (CFWL_FormImp*)((IFWL_TargetData*)pFrom)->GetData(); + _FWL_RETURN_VALUE_IF_FAIL(pImp, FWL_ERR_Indefinite); + return FWL_ERR_Succeeded; +} diff --git a/xfa/src/fwl/src/core/fwl_gridimp.cpp b/xfa/src/fwl/src/core/fwl_gridimp.cpp new file mode 100644 index 0000000000..18ade073a4 --- /dev/null +++ b/xfa/src/fwl/src/core/fwl_gridimp.cpp @@ -0,0 +1,1359 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "include/fwl_targetimp.h" +#include "include/fwl_threadimp.h" +#include "include/fwl_noteimp.h" +#include "include/fwl_widgetimp.h" +#include "include/fwl_contentimp.h" +#include "include/fwl_gridimp.h" +IFWL_Grid* IFWL_Grid::Create() +{ + return new IFWL_Grid; +} +FWL_ERR IFWL_Grid::Initialize() +{ + m_pData = FX_NEW CFWL_GridImp; + ((CFWL_GridImp*)m_pData)->SetInterface(this); + return ((CFWL_GridImp*)m_pData)->Initialize(); +} +FWL_ERR IFWL_Grid::Initialize(CFWL_WidgetImpProperties &properties) +{ + m_pData = FX_NEW CFWL_GridImp(properties); + ((CFWL_GridImp*)m_pData)->SetInterface(this); + return ((CFWL_GridImp*)m_pData)->Initialize(); +} +FWL_HGRIDCOLROW IFWL_Grid::InsertColRow(FX_BOOL bColumn, FX_INT32 nIndex ) +{ + return ((CFWL_GridImp*)m_pData)->InsertColRow(bColumn, nIndex); +} +FX_INT32 IFWL_Grid::CountColRows(FX_BOOL bColumn) +{ + return ((CFWL_GridImp*)m_pData)->CountColRows(bColumn); +} +FWL_HGRIDCOLROW IFWL_Grid::GetColRow(FX_BOOL bColumn, FX_INT32 nIndex) +{ + return ((CFWL_GridImp*)m_pData)->GetColRow(bColumn, nIndex); +} +FX_INT32 IFWL_Grid::GetIndex(FWL_HGRIDCOLROW hColRow) +{ + return ((CFWL_GridImp*)m_pData)->GetIndex(hColRow); +} +FX_FLOAT IFWL_Grid::GetSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT &eUnit) +{ + return ((CFWL_GridImp*)m_pData)->GetSize(hColRow, eUnit); +} +FWL_ERR IFWL_Grid::SetSize(FWL_HGRIDCOLROW hColRow, FX_FLOAT fSize, FWL_GRIDUNIT eUnit) +{ + return ((CFWL_GridImp*)m_pData)->SetSize(hColRow, fSize, eUnit); +} +FX_FLOAT IFWL_Grid::GetMinSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT &eUnit) +{ + return ((CFWL_GridImp*)m_pData)->GetMinSize(hColRow, eUnit); +} +FWL_ERR IFWL_Grid::SetMinSize(FWL_HGRIDCOLROW hColRow, FX_FLOAT fSize, FWL_GRIDUNIT eUnit) +{ + return ((CFWL_GridImp*)m_pData)->SetMinSize(hColRow, fSize, eUnit); +} +FX_FLOAT IFWL_Grid::GetMaxSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT &eUnit) +{ + return ((CFWL_GridImp*)m_pData)->GetMaxSize(hColRow, eUnit); +} +FWL_ERR IFWL_Grid::SetMaxSize(FWL_HGRIDCOLROW hColRow, FX_FLOAT fSize, FWL_GRIDUNIT eUnit) +{ + return ((CFWL_GridImp*)m_pData)->SetMaxSize(hColRow, fSize, eUnit); +} +FX_BOOL IFWL_Grid::DeleteColRow(FWL_HGRIDCOLROW hColRow) +{ + return ((CFWL_GridImp*)m_pData)->DeleteColRow(hColRow); +} +FX_BOOL IFWL_Grid::IsColumn(FWL_HGRIDCOLROW hColRow) +{ + return ((CFWL_GridImp*)m_pData)->IsColumn(hColRow); +} +FX_INT32 IFWL_Grid::GetWidgetPos(IFWL_Widget *pWidget, FX_BOOL bColumn) +{ + return ((CFWL_GridImp*)m_pData)->GetWidgetPos(pWidget, bColumn); +} +FWL_ERR IFWL_Grid::SetWidgetPos(IFWL_Widget *pWidget, FX_INT32 iPos, FX_BOOL bColumn) +{ + return ((CFWL_GridImp*)m_pData)->SetWidgetPos(pWidget, iPos, bColumn); +} +FX_INT32 IFWL_Grid::GetWidgetSpan(IFWL_Widget *pWidget, FX_BOOL bColumn) +{ + return ((CFWL_GridImp*)m_pData)->GetWidgetSpan(pWidget, bColumn); +} +FWL_ERR IFWL_Grid::SetWidgetSpan(IFWL_Widget *pWidget, FX_INT32 iSpan, FX_BOOL bColumn) +{ + return ((CFWL_GridImp*)m_pData)->SetWidgetSpan(pWidget, iSpan , bColumn); +} +FX_FLOAT IFWL_Grid::GetWidgetSize(IFWL_Widget *pWidget, FWL_GRIDSIZE eSize, FWL_GRIDUNIT &eUnit) +{ + return ((CFWL_GridImp*)m_pData)->GetWidgetSize(pWidget, eSize, eUnit); +} +FWL_ERR IFWL_Grid::SetWidgetSize(IFWL_Widget *pWidget, FWL_GRIDSIZE eSize, FX_FLOAT fSize, FWL_GRIDUNIT eUit) +{ + return ((CFWL_GridImp*)m_pData)->SetWidgetSize(pWidget, eSize, fSize, eUit); +} +FX_BOOL IFWL_Grid::GetWidgetMargin(IFWL_Widget *pWidget, FWL_GRIDMARGIN eMargin, FX_FLOAT &fMargin) +{ + return ((CFWL_GridImp*)m_pData)->GetWidgetMargin(pWidget, eMargin, fMargin); +} +FWL_ERR IFWL_Grid::SetWidgetMargin(IFWL_Widget *pWidget, FWL_GRIDMARGIN eMargin, FX_FLOAT fMargin) +{ + return ((CFWL_GridImp*)m_pData)->SetWidgetMargin(pWidget, eMargin, fMargin); +} +FWL_ERR IFWL_Grid::RemoveWidgetMargin(IFWL_Widget *pWidget, FWL_GRIDMARGIN eMargin) +{ + return ((CFWL_GridImp*)m_pData)->RemoveWidgetMargin(pWidget, eMargin); +} +FX_FLOAT IFWL_Grid::GetGridSize(FWL_GRIDSIZE eSize, FWL_GRIDUNIT &eUnit) +{ + return ((CFWL_GridImp*)m_pData)->GetGridSize(eSize, eUnit); +} +FWL_ERR IFWL_Grid::SetGridSize(FWL_GRIDSIZE eSize, FX_FLOAT fSize, FWL_GRIDUNIT eUit) +{ + return ((CFWL_GridImp*)m_pData)->SetGridSize(eSize, fSize, eUit); +} +IFWL_Grid::IFWL_Grid() +{ + m_pData = NULL; +} +IFWL_Grid::~IFWL_Grid() +{ + if (m_pData) { + delete (CFWL_GridImp*)m_pData; + m_pData = NULL; + } +} +CFWL_GridImp::CFWL_GridImp() +{ + m_Size[FWL_GRIDSIZE_Width].eUnit = FWL_GRIDUNIT_Auto; + m_Size[FWL_GRIDSIZE_Width].fLength = 0; + m_Size[FWL_GRIDSIZE_Height].eUnit = FWL_GRIDUNIT_Auto; + m_Size[FWL_GRIDSIZE_Height].fLength = 0; + m_Size[FWL_GRIDSIZE_MinWidth].eUnit = FWL_GRIDUNIT_Fixed; + m_Size[FWL_GRIDSIZE_MinWidth].fLength = 0; + m_Size[FWL_GRIDSIZE_MaxWidth].eUnit = FWL_GRIDUNIT_Infinity; + m_Size[FWL_GRIDSIZE_MaxWidth].fLength = 0; + m_Size[FWL_GRIDSIZE_MinHeight].eUnit = FWL_GRIDUNIT_Fixed; + m_Size[FWL_GRIDSIZE_MinHeight].fLength = 0; + m_Size[FWL_GRIDSIZE_MaxHeight].eUnit = FWL_GRIDUNIT_Infinity; + m_Size[FWL_GRIDSIZE_MaxHeight].fLength = 0; +} +CFWL_GridImp::CFWL_GridImp(const CFWL_WidgetImpProperties &properties) + : CFWL_ContentImp(properties) +{ + m_Size[FWL_GRIDSIZE_Width].eUnit = FWL_GRIDUNIT_Auto; + m_Size[FWL_GRIDSIZE_Width].fLength = 0; + m_Size[FWL_GRIDSIZE_Height].eUnit = FWL_GRIDUNIT_Auto; + m_Size[FWL_GRIDSIZE_Height].fLength = 0; + m_Size[FWL_GRIDSIZE_MinWidth].eUnit = FWL_GRIDUNIT_Fixed; + m_Size[FWL_GRIDSIZE_MinWidth].fLength = 0; + m_Size[FWL_GRIDSIZE_MaxWidth].eUnit = FWL_GRIDUNIT_Infinity; + m_Size[FWL_GRIDSIZE_MaxWidth].fLength = 0; + m_Size[FWL_GRIDSIZE_MinHeight].eUnit = FWL_GRIDUNIT_Fixed; + m_Size[FWL_GRIDSIZE_MinHeight].fLength = 0; + m_Size[FWL_GRIDSIZE_MaxHeight].eUnit = FWL_GRIDUNIT_Infinity; + m_Size[FWL_GRIDSIZE_MaxHeight].fLength = 0; +} +CFWL_GridImp::~CFWL_GridImp() +{ + FX_INT32 iCount = m_Columns.GetSize(); + for (FX_INT32 i = 0; i < iCount; i++) { + delete (CFWL_GridColRow *) m_Columns[i]; + } + m_Columns.RemoveAll(); + iCount = m_Rows.GetSize(); + for (FX_INT32 j = 0; j < iCount; j++) { + delete (CFWL_GridColRow*) m_Rows[j]; + } + m_Rows.RemoveAll(); + FX_POSITION ps = m_mapWidgetInfo.GetStartPosition(); + while (ps) { + IFWL_Widget *pWidget; + CFWL_GridWidgetInfo *pInfo; + m_mapWidgetInfo.GetNextAssoc(ps, (void*&)pWidget, (void*&)pInfo); + delete pInfo; + } + m_mapWidgetInfo.RemoveAll(); + if (m_pDelegate) { + delete (CFWL_GridDelegate*)m_pDelegate; + m_pDelegate = NULL; + } +} +FWL_ERR CFWL_GridImp::GetClassName(CFX_WideString &wsClass) const +{ + wsClass = FWL_CLASS_Grid; + return FWL_ERR_Succeeded; +} +FX_DWORD CFWL_GridImp::GetClassID() const +{ + return FWL_CLASSHASH_Grid; +} +FWL_ERR CFWL_GridImp::Initialize() +{ + _FWL_ERR_CHECK_RETURN_VALUE_IF_FAIL(CFWL_ContentImp::Initialize(), FWL_ERR_Indefinite); + m_pDelegate = (IFWL_WidgetDelegate*) FX_NEW CFWL_GridDelegate(this); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_GridImp::Finalize() +{ + _FWL_ERR_CHECK_RETURN_VALUE_IF_FAIL(CFWL_ContentImp::Finalize(), FWL_ERR_Indefinite); + if (m_pDelegate) { + delete (CFWL_GridDelegate*)m_pDelegate; + m_pDelegate = NULL; + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_GridImp::GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize ) +{ + if (bAutoSize) { + rect.left = 0; + rect.top = 0; + rect.width = ProcessUnCertainColumns(); + rect.height = ProcessUnCertainRows(); + } else { + rect = m_pProperties->m_rtWidget; + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_GridImp::SetWidgetRect(const CFX_RectF &rect) +{ + CFWL_WidgetImp::SetWidgetRect(rect); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_GridImp::Update() +{ + if (IsLocked()) { + return FWL_ERR_Indefinite; + } + ProcessColumns(m_pProperties->m_rtWidget.width); + ProcessRows(m_pProperties->m_rtWidget.height); + SetAllWidgetsRect(); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_GridImp::DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + _FWL_RETURN_VALUE_IF_FAIL(pGraphics, FWL_ERR_Indefinite); + if ((m_pProperties->m_dwStyleExes & FWL_GRIDSTYLEEXT_ShowGridLines) == 0) { + return FWL_ERR_Succeeded; + } + pGraphics->SaveGraphState(); + if (pMatrix) { + pGraphics->ConcatMatrix((CFX_Matrix*)pMatrix); + } + { + FX_BOOL bDrawLine = FALSE; + CFX_Path path; + path.Create(); + FX_INT32 iColumns = m_Columns.GetSize(); + for (FX_INT32 i = 1; i < iColumns; i++) { + CFWL_GridColRow *pColRow = (CFWL_GridColRow*)m_Columns[i]; + if (!pColRow) { + continue; + } + if (!bDrawLine) { + bDrawLine = TRUE; + } + path.AddLine(pColRow->m_fActualPos, + 0, + pColRow->m_fActualPos, + m_pProperties->m_rtWidget.height); + } + FX_INT32 iRows = m_Rows.GetSize(); + for (FX_INT32 j = 1; j < iRows; j++) { + CFWL_GridColRow *pColRow = (CFWL_GridColRow*)m_Rows[j]; + if (!pColRow) { + continue; + } + if (!bDrawLine) { + bDrawLine = TRUE; + } + path.AddLine(0, + pColRow->m_fActualPos, + m_pProperties->m_rtWidget.width, + pColRow->m_fActualPos); + } + if (bDrawLine) { + CFX_Color cr(0xFFFF0000); + pGraphics->SetStrokeColor(&cr); + pGraphics->StrokePath(&path); + } + } + pGraphics->RestoreGraphState(); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_GridImp::InsertWidget(IFWL_Widget *pChild, FX_INT32 nIndex ) +{ + _FWL_RETURN_VALUE_IF_FAIL(pChild, FWL_ERR_Indefinite); + CFWL_ContentImp::InsertWidget(pChild, nIndex); + if (!m_mapWidgetInfo.GetValueAt(pChild)) { + CFWL_GridWidgetInfo *pInfo = FX_NEW CFWL_GridWidgetInfo; + m_mapWidgetInfo.SetAt(pChild, pInfo); + m_Widgets.Add(pChild); + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_GridImp::RemoveWidget(IFWL_Widget* pWidget) +{ + _FWL_RETURN_VALUE_IF_FAIL(pWidget, FWL_ERR_Indefinite); + CFWL_ContentImp::RemoveWidget(pWidget); + if (CFWL_GridWidgetInfo *pInfo = (CFWL_GridWidgetInfo*)m_mapWidgetInfo.GetValueAt(pWidget)) { + m_mapWidgetInfo.RemoveKey(pWidget); + delete pInfo; + FX_INT32 nIndex = m_Widgets.Find(pWidget); + m_Widgets.RemoveAt(nIndex, 1); + } + return FWL_ERR_Succeeded; +} +FWL_HGRIDCOLROW CFWL_GridImp::InsertColRow(FX_BOOL bColumn, FX_INT32 nIndex ) +{ + if (bColumn) { + if (nIndex < 0 || nIndex > m_Columns.GetSize()) { + nIndex = m_Columns.GetSize(); + } + CFWL_GridColRow *pColumn = FX_NEW CFWL_GridColRow; + m_Columns.InsertAt(nIndex, pColumn, 1); + return (FWL_HGRIDCOLROW)pColumn; + } + if (nIndex < 0 || nIndex > m_Rows.GetSize()) { + nIndex = m_Rows.GetSize(); + } + CFWL_GridColRow *pRow = FX_NEW CFWL_GridColRow; + m_Rows.InsertAt(nIndex, pRow, 1); + return (FWL_HGRIDCOLROW)pRow; +} +FX_INT32 CFWL_GridImp::CountColRows(FX_BOOL bColumn) +{ + if (bColumn) { + return m_Columns.GetSize(); + } + return m_Rows.GetSize(); +} +FWL_HGRIDCOLROW CFWL_GridImp::GetColRow(FX_BOOL bColumn, FX_INT32 nIndex) +{ + if (bColumn) { + if (nIndex < 0 || nIndex >= m_Columns.GetSize()) { + return NULL; + } + return (FWL_HGRIDCOLROW)m_Columns[nIndex]; + } + if (nIndex < 0 || nIndex >= m_Rows.GetSize()) { + return NULL; + } + return (FWL_HGRIDCOLROW)m_Rows[nIndex]; +} +FX_INT32 CFWL_GridImp::GetIndex(FWL_HGRIDCOLROW hColRow) +{ + if (IsColumn(hColRow)) { + return m_Columns.Find(hColRow); + } + return m_Rows.Find(hColRow); +} +FX_FLOAT CFWL_GridImp::GetSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT &eUnit) +{ + _FWL_RETURN_VALUE_IF_FAIL(hColRow, -1); + CFWL_GridColRow *pColRow = (CFWL_GridColRow*)hColRow; + eUnit = pColRow->m_Size.eUnit; + return pColRow->m_Size.fLength; +} +FWL_ERR CFWL_GridImp::SetSize(FWL_HGRIDCOLROW hColRow, FX_FLOAT fSize, FWL_GRIDUNIT eUnit) +{ + _FWL_RETURN_VALUE_IF_FAIL(hColRow, FWL_ERR_Indefinite); + CFWL_GridColRow *pColRow = (CFWL_GridColRow*)hColRow; + pColRow->m_Size.eUnit = eUnit; + pColRow->m_Size.fLength = fSize; + return FWL_ERR_Succeeded; +} +FX_FLOAT CFWL_GridImp::GetMinSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT &eUnit) +{ + _FWL_RETURN_VALUE_IF_FAIL(hColRow, -1); + CFWL_GridColRow *pColRow = (CFWL_GridColRow*)hColRow; + eUnit = pColRow->m_MinSize.eUnit; + return pColRow->m_MinSize.fLength; +} +FWL_ERR CFWL_GridImp::SetMinSize(FWL_HGRIDCOLROW hColRow, FX_FLOAT fSize, FWL_GRIDUNIT eUnit) +{ + _FWL_RETURN_VALUE_IF_FAIL(hColRow, FWL_ERR_Indefinite); + CFWL_GridColRow *pColRow = (CFWL_GridColRow*)hColRow; + pColRow->m_MinSize.eUnit = eUnit; + pColRow->m_MinSize.fLength = fSize; + return FWL_ERR_Succeeded; +} +FX_FLOAT CFWL_GridImp::GetMaxSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT &eUnit) +{ + _FWL_RETURN_VALUE_IF_FAIL(hColRow, -1); + CFWL_GridColRow *pColRow = (CFWL_GridColRow*)hColRow; + eUnit = pColRow->m_MaxSize.eUnit; + return pColRow->m_MaxSize.fLength; +} +FWL_ERR CFWL_GridImp::SetMaxSize(FWL_HGRIDCOLROW hColRow, FX_FLOAT fSize, FWL_GRIDUNIT eUnit) +{ + _FWL_RETURN_VALUE_IF_FAIL(hColRow, FWL_ERR_Indefinite); + CFWL_GridColRow *pColRow = (CFWL_GridColRow*)hColRow; + pColRow->m_MaxSize.eUnit = eUnit; + pColRow->m_MaxSize.fLength = fSize; + return FWL_ERR_Succeeded; +} +FX_BOOL CFWL_GridImp::DeleteColRow(FWL_HGRIDCOLROW hColRow) +{ + FX_INT32 nIndex = m_Columns.Find(hColRow); + if (nIndex >= 0) { + m_Columns.RemoveAt(nIndex); + delete (CFWL_GridColRow*)hColRow; + return TRUE; + } + nIndex = m_Rows.Find(hColRow); + if (nIndex >= 0) { + delete (CFWL_GridColRow*)hColRow; + m_Rows.RemoveAt(nIndex); + return TRUE; + } + return FALSE; +} +FX_BOOL CFWL_GridImp::IsColumn(FWL_HGRIDCOLROW hColRow) +{ + return m_Columns.Find(hColRow) != -1; +} +FX_INT32 CFWL_GridImp::GetWidgetPos(IFWL_Widget *pWidget, FX_BOOL bColumn) +{ + CFWL_GridWidgetInfo *pInfo = (CFWL_GridWidgetInfo*)GetWidgetInfo(pWidget); + if (pInfo) { + return bColumn ? pInfo->m_iColumn : pInfo->m_iRow; + } + return -1; +} +FWL_ERR CFWL_GridImp::SetWidgetPos(IFWL_Widget *pWidget, FX_INT32 iPos, FX_BOOL bColumn) +{ + CFWL_GridWidgetInfo *pInfo = (CFWL_GridWidgetInfo*)GetWidgetInfo(pWidget); + if (pInfo) { + bColumn ? pInfo->m_iColumn = iPos : pInfo->m_iRow = iPos; + } + return FWL_ERR_Succeeded; +} +FX_INT32 CFWL_GridImp::GetWidgetSpan(IFWL_Widget *pWidget, FX_BOOL bColumn) +{ + CFWL_GridWidgetInfo *pInfo = (CFWL_GridWidgetInfo*)GetWidgetInfo(pWidget); + if (pInfo) { + return bColumn ? pInfo->m_iColumnSpan : pInfo->m_iRowSpan; + } + return 0; +} +FWL_ERR CFWL_GridImp::SetWidgetSpan(IFWL_Widget *pWidget, FX_INT32 iSpan, FX_BOOL bColumn) +{ + CFWL_GridWidgetInfo *pInfo = (CFWL_GridWidgetInfo*)GetWidgetInfo(pWidget); + if (pInfo) { + bColumn ? pInfo->m_iColumnSpan = iSpan : pInfo->m_iRowSpan = iSpan; + } + return FWL_ERR_Succeeded; +} +FX_FLOAT CFWL_GridImp::GetWidgetSize(IFWL_Widget *pWidget, FWL_GRIDSIZE eSize, FWL_GRIDUNIT &eUnit) +{ + CFWL_GridWidgetInfo *pInfo = (CFWL_GridWidgetInfo*)GetWidgetInfo(pWidget); + if (pInfo) { + eUnit = pInfo->m_Size[eSize].eUnit; + return pInfo->m_Size[eSize].fLength; + } + return 0; +} +FWL_ERR CFWL_GridImp::SetWidgetSize(IFWL_Widget *pWidget, FWL_GRIDSIZE eSize, FX_FLOAT fSize, FWL_GRIDUNIT eUit) +{ + CFWL_GridWidgetInfo *pInfo = (CFWL_GridWidgetInfo*)GetWidgetInfo(pWidget); + if (pInfo) { + pInfo->m_Size[eSize].fLength = fSize; + pInfo->m_Size[eSize].eUnit = eUit; + } + return FWL_ERR_Succeeded; +} +FX_BOOL CFWL_GridImp::GetWidgetMargin(IFWL_Widget *pWidget, FWL_GRIDMARGIN eMargin, FX_FLOAT &fMargin) +{ + CFWL_GridWidgetInfo *pInfo = (CFWL_GridWidgetInfo*)GetWidgetInfo(pWidget); + if (pInfo) { + fMargin = pInfo->m_Margin[eMargin]; + return (pInfo->m_dwMarginFlag & (1 << eMargin)) != 0; + } + return FALSE; +} +FWL_ERR CFWL_GridImp::SetWidgetMargin(IFWL_Widget *pWidget, FWL_GRIDMARGIN eMargin, FX_FLOAT fMargin) +{ + CFWL_GridWidgetInfo *pInfo = (CFWL_GridWidgetInfo*)GetWidgetInfo(pWidget); + if (pInfo) { + pInfo->m_Margin[eMargin] = fMargin; + pInfo->m_dwMarginFlag |= (1 << eMargin); + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_GridImp::RemoveWidgetMargin(IFWL_Widget *pWidget, FWL_GRIDMARGIN eMargin) +{ + CFWL_GridWidgetInfo *pInfo = (CFWL_GridWidgetInfo*)GetWidgetInfo(pWidget); + if (pInfo) { + pInfo->m_dwMarginFlag &= ~(1 << eMargin); + } + return FWL_ERR_Succeeded; +} +FX_FLOAT CFWL_GridImp::GetGridSize(FWL_GRIDSIZE eSize, FWL_GRIDUNIT &eUnit) +{ + eUnit = m_Size[eSize].eUnit; + return m_Size[eSize].fLength; +} +FWL_ERR CFWL_GridImp::SetGridSize(FWL_GRIDSIZE eSize, FX_FLOAT fSize, FWL_GRIDUNIT eUit) +{ + m_Size[eSize].fLength = fSize; + m_Size[eSize].eUnit = eUit; + return FWL_ERR_Succeeded; +} +CFWL_GridWidgetInfo* CFWL_GridImp::GetWidgetInfo(IFWL_Widget* pWidget) +{ + return (CFWL_GridWidgetInfo*)m_mapWidgetInfo.GetValueAt(pWidget); +} +void CFWL_GridImp::ProcFixedColRow(CFWL_GridColRow *pColRow, FX_INT32 nIndex, FX_FLOAT fColRowSize, FX_BOOL bColumn) +{ + pColRow->m_fActualSize = fColRowSize; + FX_POSITION ps = m_mapWidgetInfo.GetStartPosition(); + while (ps) { + IFWL_Widget *pWidget = NULL; + CFWL_GridWidgetInfo *pInfo = NULL; + m_mapWidgetInfo.GetNextAssoc(ps, (void*&)pWidget, (void*&)pInfo); + if (bColumn) { + if (pInfo->m_iColumn == nIndex && pInfo->m_iColumnSpan == 1) { + CalcWidgetWidth(pWidget, pInfo, pColRow->m_fActualSize); + } + } else { + if (pInfo->m_iRow == nIndex && pInfo->m_iRowSpan == 1) { + CalcWidgetHeigt(pWidget, pInfo, pColRow->m_fActualSize); + } + } + } +} +void CFWL_GridImp::ProcAutoColRow(CFWL_GridColRow *pColRow, FX_INT32 nIndex, FX_BOOL bColumn) +{ + _FWL_RETURN_IF_FAIL(pColRow); + FX_FLOAT fMaxSize = 0, fWidgetSize = 0; + FX_POSITION ps = m_mapWidgetInfo.GetStartPosition(); + while (ps) { + IFWL_Widget*pWidget = NULL; + CFWL_GridWidgetInfo *pInfo = NULL; + m_mapWidgetInfo.GetNextAssoc(ps, (void*&)pWidget, (void*&)pInfo); + if (!pWidget || !pInfo) { + continue; + } + if (bColumn) { + if (pInfo->m_iColumn != nIndex || pInfo->m_iColumnSpan != 1) { + continue; + } + fWidgetSize = CalcAutoColumnWidgetWidth(pWidget, pInfo); + if (fMaxSize < fWidgetSize) { + fMaxSize = fWidgetSize; + } + } else { + if (pInfo->m_iRow != nIndex || pInfo->m_iRowSpan != 1) { + continue; + } + fWidgetSize = CalcAutoColumnWidgetHeight(pWidget, pInfo); + if (fMaxSize < fWidgetSize) { + fMaxSize = fWidgetSize; + } + } + } + SetColRowActualSize(pColRow, fMaxSize); +} +void CFWL_GridImp::ProcScaledColRow(CFWL_GridColRow *pColRow, FX_INT32 nIndex, FX_FLOAT fColRowSize, FX_BOOL bColumn) +{ + if (fColRowSize > 0) { + ProcFixedColRow(pColRow, nIndex, fColRowSize, bColumn); + } +} +void CFWL_GridImp::CalcWidgetWidth(IFWL_Widget *pWidget, CFWL_GridWidgetInfo* pInfo, FX_FLOAT fColunmWidth) +{ + if (pInfo->m_Size[FWL_GRIDSIZE_Width].eUnit == FWL_GRIDUNIT_Fixed) { + SetWidgetActualWidth(pInfo, pInfo->m_Size[FWL_GRIDSIZE_Width].fLength); + } else { + FX_FLOAT fWidth = 0; + FX_FLOAT fLeftMargin = 0, fRightMargin = 0; + FX_BOOL bLeftMargin = GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Left, fLeftMargin); + FX_BOOL bRightMargin = GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Right, fRightMargin); + if (bLeftMargin && bRightMargin) { + fWidth = fColunmWidth - fLeftMargin - fRightMargin; + } else { + CFX_RectF rtAuto; + pWidget->GetWidgetRect(rtAuto, TRUE); + fWidth = rtAuto.Width(); + } + SetWidgetActualWidth(pInfo, fWidth); + } +} +void CFWL_GridImp::CalcWidgetHeigt(IFWL_Widget *pWidget, CFWL_GridWidgetInfo* pInfo, FX_FLOAT fRowHeigt) +{ + if (pInfo->m_Size[FWL_GRIDSIZE_Height].eUnit == FWL_GRIDUNIT_Fixed) { + SetWidgetActualHeight(pInfo, pInfo->m_Size[FWL_GRIDSIZE_Height].fLength); + } else { + FX_FLOAT fHeight = 0; + FX_FLOAT fTopMargin = 0, fBottomMargin = 0; + FX_BOOL bTopMargin = GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Top, fTopMargin); + FX_BOOL bBottomMargin = GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Bottom, fBottomMargin); + if (bTopMargin && bBottomMargin) { + fHeight = fRowHeigt - fTopMargin - fBottomMargin; + } else { + CFX_RectF rtAuto; + pWidget->GetWidgetRect(rtAuto, TRUE); + fHeight = rtAuto.Height(); + } + SetWidgetActualHeight(pInfo, fHeight); + } +} +FX_FLOAT CFWL_GridImp::CalcAutoColumnWidgetWidth(IFWL_Widget *pWidget, CFWL_GridWidgetInfo* pInfo) +{ + FX_FLOAT fLeftMargin = 0, fRightMargin = 0; + FX_BOOL bLeftMargin = GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Left, fLeftMargin); + FX_BOOL bRightMargin = GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Right, fRightMargin); + if (pInfo->m_Size[FWL_GRIDSIZE_Width].eUnit == FWL_GRIDUNIT_Fixed) { + SetWidgetActualWidth(pInfo, pInfo->m_Size[FWL_GRIDSIZE_Width].fLength); + } else { + CFX_RectF rtAuto; + pWidget->GetWidgetRect(rtAuto, TRUE); + FX_FLOAT fWidth = rtAuto.width; + SetWidgetActualWidth(pInfo, fWidth); + } + FX_FLOAT fTotal = pInfo->m_fActualWidth; + if (bLeftMargin) { + fTotal += fLeftMargin; + } + if (bRightMargin) { + fTotal += fRightMargin; + } + return fTotal; +} +FX_FLOAT CFWL_GridImp::CalcAutoColumnWidgetHeight(IFWL_Widget *pWidget, CFWL_GridWidgetInfo* pInfo) +{ + FX_FLOAT fTopMargin = 0, fBottomMargin = 0; + FX_BOOL bTopMargin = GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Top, fTopMargin); + FX_BOOL bBottomMargin = GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Bottom, fBottomMargin); + if (pInfo->m_Size[FWL_GRIDSIZE_Height].eUnit == FWL_GRIDUNIT_Fixed) { + SetWidgetActualHeight(pInfo, pInfo->m_Size[FWL_GRIDSIZE_Height].fLength); + } else { + CFX_RectF rtAuto; + pWidget->GetWidgetRect(rtAuto, TRUE); + FX_FLOAT fHeight = rtAuto.height; + SetWidgetActualHeight(pInfo, fHeight); + } + FX_FLOAT fTotal = pInfo->m_fActualHeight; + if (bTopMargin) { + fTotal += fTopMargin; + } + if (bBottomMargin) { + fTotal += fBottomMargin; + } + return fTotal; +} +FX_FLOAT CFWL_GridImp::ProcessColumns(FX_FLOAT fWidth) +{ + if (fWidth <= 0) { + return ProcessUnCertainColumns(); + } + FX_INT32 iColumns = m_Columns.GetSize(); + if (iColumns < 1) { + return fWidth; + } + FX_FLOAT fFixedWidth = 0; + FX_FLOAT fAutoWidth = 0; + CFX_PtrArray autoColumns; + CFX_PtrArray scaledColumns; + FX_FLOAT fScaledColumnNum = 0; + for (FX_INT32 i = 0; i < iColumns; i++) { + CFWL_GridColRow *pColRow = (CFWL_GridColRow*)m_Columns[i]; + if (!pColRow) { + continue; + } + switch(pColRow->m_Size.eUnit) { + case FWL_GRIDUNIT_Fixed: { + SetColRowActualSize(pColRow, pColRow->m_Size.fLength); + fFixedWidth += pColRow->m_fActualSize; + break; + } + case FWL_GRIDUNIT_Auto: { + ProcAutoColRow(pColRow, i, TRUE); + autoColumns.Add(pColRow); + break; + } + case FWL_GRIDUNIT_Scaled: + default: { + fScaledColumnNum += pColRow->m_Size.fLength; + scaledColumns.Add(pColRow); + SetColRowActualSize(pColRow, 0); + } + } + } + FX_POSITION ps = m_mapWidgetInfo.GetStartPosition(); + while (ps) { + IFWL_Widget *pWidget = NULL; + CFWL_GridWidgetInfo *pInfo = NULL; + m_mapWidgetInfo.GetNextAssoc(ps, (void*&)pWidget, (void*&)pInfo); + if (!pInfo || pInfo->m_iColumnSpan < 2) { + continue; + } + CFX_PtrArray spanAutoColumns; + FX_FLOAT fSpanSize = 0; + FX_INT32 iAutoColRows = 0; + FX_INT32 iScaledColRows = 0; + for (FX_INT32 i = 0; i < pInfo->m_iColumnSpan; i++) { + CFWL_GridColRow *pColumn = (CFWL_GridColRow*)GetColRow(TRUE, pInfo->m_iColumn + i); + if (!pColumn) { + break; + } + fSpanSize += pColumn->m_fActualSize; + if (pColumn->m_Size.eUnit == FWL_GRIDUNIT_Auto) { + iAutoColRows++; + spanAutoColumns.Add(pColumn); + } else if (pColumn->m_Size.eUnit == FWL_GRIDUNIT_Scaled) { + iScaledColRows++; + } + } + if (iAutoColRows < 1) { + continue; + } + FX_FLOAT fWidgetWidth = CalcAutoColumnWidgetWidth(pWidget, pInfo); + if (fWidgetWidth > fSpanSize) { + if (iScaledColRows > 0) { + } else { + SetSpanAutoColRowSize(spanAutoColumns, fWidgetWidth - fSpanSize); + } + } + } + FX_INT32 iAutoCols = autoColumns.GetSize(); + for (FX_INT32 k = 0; k < iAutoCols; k++) { + fAutoWidth += ((CFWL_GridColRow*)autoColumns[k])->m_fActualSize; + } + FX_FLOAT fScaledWidth = fWidth - fFixedWidth - fAutoWidth; + if (fScaledWidth > 0 && fScaledColumnNum > 0) { + SetScaledColRowsSize(scaledColumns, fScaledWidth, fScaledColumnNum); + } + return fWidth; +} +FX_FLOAT CFWL_GridImp::ProcessRows(FX_FLOAT fHeight) +{ + if (fHeight <= 0) { + return ProcessUnCertainRows(); + } + FX_INT32 iRows = m_Rows.GetSize(); + if (iRows < 1) { + return fHeight; + } + FX_FLOAT fFixedHeight = 0; + FX_FLOAT fAutoHeigt = 0; + CFX_PtrArray autoRows; + CFX_PtrArray scaledRows; + FX_FLOAT fScaledRowNum = 0; + for (FX_INT32 i = 0; i < iRows; i++) { + CFWL_GridColRow *pColRow = (CFWL_GridColRow*)m_Rows[i]; + if (!pColRow) { + continue; + } + switch(pColRow->m_Size.eUnit) { + case FWL_GRIDUNIT_Fixed: { + SetColRowActualSize(pColRow, pColRow->m_Size.fLength); + fFixedHeight += pColRow->m_fActualSize; + break; + } + case FWL_GRIDUNIT_Auto: { + ProcAutoColRow(pColRow, i, FALSE); + autoRows.Add(pColRow); + break; + } + case FWL_GRIDUNIT_Scaled: + default: { + fScaledRowNum += pColRow->m_Size.fLength; + scaledRows.Add(pColRow); + SetColRowActualSize(pColRow, 0); + break; + } + } + } + FX_POSITION ps = m_mapWidgetInfo.GetStartPosition(); + while (ps) { + IFWL_Widget *pWidget = NULL; + CFWL_GridWidgetInfo *pInfo = NULL; + m_mapWidgetInfo.GetNextAssoc(ps, (void*&)pWidget, (void*&)pInfo); + if (!pInfo || pInfo->m_iRowSpan < 2) { + continue; + } + CFX_PtrArray spanAutoRows; + FX_FLOAT fSpanSize = 0; + FX_INT32 iAutoColRows = 0; + FX_INT32 iScaledColRows = 0; + for (FX_INT32 i = 0; i < pInfo->m_iRowSpan; i++) { + CFWL_GridColRow *pRow = (CFWL_GridColRow*)GetColRow(FALSE, pInfo->m_iRow + i); + if (!pRow) { + break; + } + fSpanSize += pRow->m_fActualSize; + if (pRow->m_Size.eUnit == FWL_GRIDUNIT_Auto) { + iAutoColRows++; + spanAutoRows.Add(pRow); + } else if (pRow->m_Size.eUnit == FWL_GRIDUNIT_Scaled) { + iScaledColRows++; + } + } + if (iAutoColRows < 1) { + continue; + } + FX_FLOAT fWidgetHeight = CalcAutoColumnWidgetHeight(pWidget, pInfo); + if (fWidgetHeight > fSpanSize) { + if (iScaledColRows > 0) { + } else { + SetSpanAutoColRowSize(spanAutoRows, fWidgetHeight - fSpanSize); + } + } + } + FX_INT32 iAutoRows = autoRows.GetSize(); + for (FX_INT32 k = 0; k < iAutoRows; k++) { + fAutoHeigt += ((CFWL_GridColRow*)autoRows[k])->m_fActualSize; + } + FX_FLOAT fScaledHeight = fHeight - fFixedHeight - fAutoHeigt; + if (fScaledHeight > 0 && fScaledRowNum > 0) { + SetScaledColRowsSize(scaledRows, fScaledHeight, fScaledRowNum); + } + return fHeight; +} +FX_FLOAT CFWL_GridImp::ProcessUnCertainColumns() +{ + FX_INT32 iColumns = m_Columns.GetSize(); + if (iColumns < 1) { + CFWL_GridColRow *pColRow = new CFWL_GridColRow; + pColRow->m_Size.eUnit = FWL_GRIDUNIT_Auto; + ProcAutoColRow(pColRow, 0, TRUE); + FX_FLOAT fWidth = pColRow->m_fActualSize; + delete pColRow; + return fWidth; + } + FX_FLOAT fFixedWidth = 0; + CFX_PtrArray autoColumns; + CFX_PtrArray scaledColumns; + FX_FLOAT fScaledColumnNum = 0; + FX_FLOAT fScaledMaxPerWidth = 0; + for (FX_INT32 i = 0; i < iColumns; i++) { + CFWL_GridColRow *pColRow = (CFWL_GridColRow*)m_Columns[i]; + if (!pColRow) { + continue; + } + switch(pColRow->m_Size.eUnit) { + case FWL_GRIDUNIT_Fixed: { + SetColRowActualSize(pColRow, pColRow->m_Size.fLength); + fFixedWidth += pColRow->m_fActualSize; + break; + } + case FWL_GRIDUNIT_Auto: { + ProcAutoColRow(pColRow, i, TRUE); + autoColumns.Add(pColRow); + break; + } + case FWL_GRIDUNIT_Scaled: + default: { + ProcAutoColRow(pColRow, i, TRUE); + fScaledColumnNum += pColRow->m_Size.fLength; + scaledColumns.Add(pColRow); + if (pColRow->m_Size.fLength <= 0) { + break; + } + FX_FLOAT fPerWidth = pColRow->m_fActualSize / pColRow->m_Size.fLength; + if (fPerWidth > fScaledMaxPerWidth) { + fScaledMaxPerWidth = fPerWidth; + } + } + } + } + iColumns = scaledColumns.GetSize(); + for (FX_INT32 j = 0; j < iColumns; j++) { + CFWL_GridColRow *pColRow = (CFWL_GridColRow*)scaledColumns[j]; + if (!pColRow) { + continue; + } + SetColRowActualSize(pColRow, fScaledMaxPerWidth * pColRow->m_Size.fLength); + } + FX_POSITION ps = m_mapWidgetInfo.GetStartPosition(); + while (ps) { + IFWL_Widget *pWidget = NULL; + CFWL_GridWidgetInfo *pInfo = NULL; + m_mapWidgetInfo.GetNextAssoc(ps, (void*&)pWidget, (void*&)pInfo); + if (!pInfo || pInfo->m_iColumnSpan < 2) { + continue; + } + CFX_PtrArray spanAutoColumns; + CFX_PtrArray spanScaledColumns; + FX_FLOAT fSpanSize = 0; + FX_FLOAT fScaledSum = 0; + FX_INT32 iAutoColRows = 0; + FX_INT32 iScaledColRows = 0; + for (FX_INT32 i = 0; i < pInfo->m_iColumnSpan; i++) { + CFWL_GridColRow *pColumn = (CFWL_GridColRow*)GetColRow(TRUE, pInfo->m_iColumn + i); + if (!pColumn) { + break; + } + fSpanSize += pColumn->m_fActualSize; + if (pColumn->m_Size.eUnit == FWL_GRIDUNIT_Auto) { + iAutoColRows++; + spanAutoColumns.Add(pColumn); + } else if (pColumn->m_Size.eUnit == FWL_GRIDUNIT_Scaled) { + iScaledColRows++; + fScaledSum += pColumn->m_Size.fLength; + spanScaledColumns.Add(pColumn); + } + } + if (iAutoColRows < 1 && iScaledColRows < 1) { + continue; + } + FX_FLOAT fWidgetWidth = CalcAutoColumnWidgetWidth(pWidget, pInfo); + if (fWidgetWidth > fSpanSize) { + if (iScaledColRows > 0 ) { + if (fScaledSum <= 0) { + continue; + } + SetSpanScaledColRowSize(spanScaledColumns, fWidgetWidth - fSpanSize, fScaledSum); + } else { + SetSpanAutoColRowSize(spanAutoColumns, fWidgetWidth - fSpanSize); + } + } + } + FX_FLOAT fAutoWidth = 0; + FX_INT32 iAutoCols = autoColumns.GetSize(); + for (FX_INT32 m = 0; m < iAutoCols; m++) { + fAutoWidth += ((CFWL_GridColRow*)autoColumns[m])->m_fActualSize; + } + FX_FLOAT fScaledWidth = 0; + iColumns = scaledColumns.GetSize(); + for (FX_INT32 n = 0; n < iColumns; n++) { + fScaledWidth += ((CFWL_GridColRow*)scaledColumns[n])->m_fActualSize; + } + return fFixedWidth + fAutoWidth + fScaledWidth; +} +FX_FLOAT CFWL_GridImp::ProcessUnCertainRows() +{ + FX_INT32 iRows = m_Rows.GetSize(); + if (iRows < 1) { + CFWL_GridColRow *pColRow = new CFWL_GridColRow; + pColRow->m_Size.eUnit = FWL_GRIDUNIT_Auto; + ProcAutoColRow(pColRow, 0, FALSE); + FX_FLOAT fWidth = pColRow->m_fActualSize; + delete pColRow; + return fWidth; + } + FX_FLOAT fFixedHeight = 0; + CFX_PtrArray autoRows; + CFX_PtrArray scaledRows; + FX_FLOAT fScaledRowNum = 0; + FX_FLOAT fScaledMaxPerHeight = 0; + for (FX_INT32 i = 0; i < iRows; i++) { + CFWL_GridColRow *pColRow = (CFWL_GridColRow*)m_Rows[i]; + if (!pColRow) { + continue; + } + switch(pColRow->m_Size.eUnit) { + case FWL_GRIDUNIT_Fixed: { + SetColRowActualSize(pColRow, pColRow->m_Size.fLength); + fFixedHeight += pColRow->m_fActualSize; + break; + } + case FWL_GRIDUNIT_Auto: { + ProcAutoColRow(pColRow, i, FALSE); + autoRows.Add(pColRow); + break; + } + case FWL_GRIDUNIT_Scaled: + default: { + ProcAutoColRow(pColRow, i, FALSE); + fScaledRowNum += pColRow->m_Size.fLength; + scaledRows.Add(pColRow); + if (pColRow->m_Size.fLength > 0) { + FX_FLOAT fPerHeight = pColRow->m_fActualSize / pColRow->m_Size.fLength; + if (fPerHeight > fScaledMaxPerHeight) { + fScaledMaxPerHeight = fPerHeight; + } + } + break; + } + } + } + iRows = scaledRows.GetSize(); + for (FX_INT32 j = 0; j < iRows; j++) { + CFWL_GridColRow *pColRow = (CFWL_GridColRow*)scaledRows[j]; + if (!pColRow) { + continue; + } + SetColRowActualSize(pColRow, fScaledMaxPerHeight * pColRow->m_Size.fLength); + } + FX_POSITION ps = m_mapWidgetInfo.GetStartPosition(); + while (ps) { + IFWL_Widget *pWidget = NULL; + CFWL_GridWidgetInfo *pInfo = NULL; + m_mapWidgetInfo.GetNextAssoc(ps, (void*&)pWidget, (void*&)pInfo); + if (pInfo->m_iRowSpan < 2) { + continue; + } + CFX_PtrArray spanAutoRows; + CFX_PtrArray spanScaledRows; + FX_FLOAT fSpanSize = 0; + FX_FLOAT fScaledSum = 0; + FX_INT32 iAutoColRows = 0; + FX_INT32 iScaledColRows = 0; + for (FX_INT32 i = 0; i < pInfo->m_iRowSpan; i++) { + CFWL_GridColRow *pRow = (CFWL_GridColRow*)GetColRow(FALSE, pInfo->m_iRow + i); + if (!pRow) { + break; + } + fSpanSize += pRow->m_fActualSize; + if (pRow->m_Size.eUnit == FWL_GRIDUNIT_Auto) { + iAutoColRows++; + spanAutoRows.Add(pRow); + } else if (pRow->m_Size.eUnit == FWL_GRIDUNIT_Scaled) { + iScaledColRows++; + fScaledSum += pRow->m_Size.fLength; + spanScaledRows.Add(pRow); + } + } + if (iAutoColRows < 1 && iScaledColRows < 1) { + continue; + } + FX_FLOAT fWidgetHeight = CalcAutoColumnWidgetHeight(pWidget, pInfo); + if (fWidgetHeight > fSpanSize) { + if (iScaledColRows > 0) { + if (fScaledSum <= 0) { + continue; + } + SetSpanScaledColRowSize(spanScaledRows, fWidgetHeight - fSpanSize, fScaledSum); + } else { + SetSpanAutoColRowSize(spanAutoRows, fWidgetHeight - fSpanSize); + } + } + } + FX_FLOAT fAutoHeigt = 0; + FX_INT32 iAutoRows = autoRows.GetSize(); + for (FX_INT32 m = 0; m < iAutoRows; m++) { + fAutoHeigt += ((CFWL_GridColRow*)autoRows[m])->m_fActualSize; + } + FX_FLOAT fScaledHeight = 0; + iRows = scaledRows.GetSize(); + for (FX_INT32 n = 0; n < iRows; n++) { + fScaledHeight += ((CFWL_GridColRow*)scaledRows[n])->m_fActualSize; + } + return fFixedHeight + fAutoHeigt + fScaledHeight; +} +FX_BOOL CFWL_GridImp::SetColRowActualSize(CFWL_GridColRow* pColRow, FX_FLOAT fSize, FX_BOOL bSetBeyond ) +{ + if (pColRow->m_MinSize.eUnit == FWL_GRIDUNIT_Fixed && fSize < pColRow->m_MinSize.fLength) { + pColRow->m_fActualSize = pColRow->m_MinSize.fLength; + return FALSE; + } + if (pColRow->m_MaxSize.eUnit == FWL_GRIDUNIT_Fixed && fSize > pColRow->m_MaxSize.fLength) { + pColRow->m_fActualSize = pColRow->m_MaxSize.fLength; + return FALSE; + } + if (bSetBeyond) { + return TRUE; + } + pColRow->m_fActualSize = fSize; + return TRUE; +} +FX_FLOAT CFWL_GridImp::SetWidgetActualWidth(CFWL_GridWidgetInfo* pInfo, FX_FLOAT fWidth) +{ + if (pInfo->m_Size[FWL_GRIDSIZE_MinWidth].eUnit == FWL_GRIDUNIT_Fixed && + fWidth < pInfo->m_Size[FWL_GRIDSIZE_MinWidth].fLength) { + fWidth = pInfo->m_Size[FWL_GRIDSIZE_MinWidth].fLength; + } + if (pInfo->m_Size[FWL_GRIDSIZE_MaxWidth].eUnit == FWL_GRIDUNIT_Fixed && + fWidth > pInfo->m_Size[FWL_GRIDSIZE_MaxWidth].fLength) { + fWidth = pInfo->m_Size[FWL_GRIDSIZE_MaxWidth].fLength; + } + pInfo->m_fActualWidth = fWidth; + return fWidth; +} +FX_FLOAT CFWL_GridImp::SetWidgetActualHeight(CFWL_GridWidgetInfo* pInfo, FX_FLOAT fHeight) +{ + if (pInfo->m_Size[FWL_GRIDSIZE_MinHeight].eUnit == FWL_GRIDUNIT_Fixed && + fHeight < pInfo->m_Size[FWL_GRIDSIZE_MinHeight].fLength) { + fHeight = pInfo->m_Size[FWL_GRIDSIZE_MinHeight].fLength; + } + if (pInfo->m_Size[FWL_GRIDSIZE_MaxHeight].eUnit == FWL_GRIDUNIT_Fixed && + fHeight > pInfo->m_Size[FWL_GRIDSIZE_MaxHeight].fLength) { + fHeight = pInfo->m_Size[FWL_GRIDSIZE_MaxHeight].fLength; + } + pInfo->m_fActualHeight = fHeight; + return fHeight; +} +void CFWL_GridImp::SetAllWidgetsRect() +{ + FX_FLOAT fStartLeft = 0; + FX_INT32 iColumns = m_Columns.GetSize(); + for (FX_INT32 i = 0; i < iColumns; i++) { + CFWL_GridColRow *pColRow = (CFWL_GridColRow*)m_Columns[i]; + if (!pColRow) { + continue; + } + pColRow->m_fActualPos = fStartLeft; + fStartLeft += pColRow->m_fActualSize; + } + FX_FLOAT fStartTop = 0; + FX_INT32 iRows = m_Rows.GetSize(); + for (FX_INT32 j = 0; j < iRows; j++) { + CFWL_GridColRow *pColRow = (CFWL_GridColRow*)m_Rows[j]; + if (!pColRow) { + continue; + } + pColRow->m_fActualPos = fStartTop; + fStartTop += pColRow->m_fActualSize; + } + FX_POSITION ps = m_mapWidgetInfo.GetStartPosition(); + while (ps) { + IFWL_Widget *pWidget = NULL; + CFWL_GridWidgetInfo *pInfo = NULL; + m_mapWidgetInfo.GetNextAssoc(ps, (void*&)pWidget, (void*&)pInfo); + if (!pWidget || !pInfo) { + continue; + } + FX_FLOAT fColumnStart = 0; + CFWL_GridColRow *pColumn = (CFWL_GridColRow*)GetColRow(TRUE, pInfo->m_iColumn); + if (pColumn) { + fColumnStart = pColumn->m_fActualPos; + } + FX_FLOAT fRowStart = 0; + CFWL_GridColRow *pRow = (CFWL_GridColRow*)GetColRow(FALSE, pInfo->m_iRow); + if (pRow) { + fRowStart = pRow->m_fActualPos; + } + FX_FLOAT fColumnWidth = 0; + if (iColumns > 0) { + for (FX_INT32 j = 0; j < pInfo->m_iColumnSpan; j++) { + CFWL_GridColRow *pCol = (CFWL_GridColRow*)GetColRow(TRUE, pInfo->m_iColumn + j); + if (!pCol) { + break; + } + fColumnWidth += pCol->m_fActualSize; + } + } else { + fColumnWidth = m_pProperties->m_rtWidget.width; + } + FX_FLOAT fRowHeight = 0; + if (iRows > 0) { + for (FX_INT32 k = 0; k < pInfo->m_iRowSpan; k++) { + CFWL_GridColRow *pR = (CFWL_GridColRow*)GetColRow(FALSE, pInfo->m_iRow + k); + if (!pR) { + break; + } + fRowHeight += pR->m_fActualSize; + } + } else { + fRowHeight = m_pProperties->m_rtWidget.height; + } + FX_FLOAT fLeftMargin = 0, fRightMargin = 0; + FX_BOOL bLeftMargin = GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Left, fLeftMargin); + FX_BOOL bRightMargin = GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Right, fRightMargin); + FX_FLOAT fTopMargin = 0, fBottomMargin = 0; + FX_BOOL bTopMargin = GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Top, fTopMargin); + FX_BOOL bBottomMargin = GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Bottom, fBottomMargin); + FWL_LAYOUTDATA ltd; + ltd.fWidth = 0; + ltd.fHeight = 0; + if (pInfo->m_Size[FWL_GRIDSIZE_Width].eUnit == FWL_GRIDUNIT_Fixed) { + SetWidgetActualWidth(pInfo, pInfo->m_Size[FWL_GRIDSIZE_Width].fLength); + ltd.fWidth = pInfo->m_fActualWidth; + } else { + if (bLeftMargin && bRightMargin) { + SetWidgetActualWidth(pInfo, fColumnWidth - fLeftMargin - fRightMargin); + ltd.fWidth = pInfo->m_fActualWidth; + } else { + CFX_RectF rtAuto; + pWidget->GetWidgetRect(rtAuto, TRUE); + SetWidgetActualWidth(pInfo, rtAuto.width); + } + } + if (pInfo->m_Size[FWL_GRIDSIZE_Height].eUnit == FWL_GRIDUNIT_Fixed) { + SetWidgetActualHeight(pInfo, pInfo->m_Size[FWL_GRIDSIZE_Height].fLength); + ltd.fHeight = pInfo->m_fActualHeight; + } else { + if (bTopMargin && bBottomMargin) { + SetWidgetActualHeight(pInfo, fRowHeight - fTopMargin - fBottomMargin); + ltd.fHeight = pInfo->m_fActualHeight; + } else { + CFX_RectF rtAuto; + pWidget->GetWidgetRect(rtAuto, TRUE); + SetWidgetActualHeight(pInfo, rtAuto.height); + } + } + if (bLeftMargin && bRightMargin && pInfo->m_Size[FWL_GRIDSIZE_Width].eUnit == FWL_GRIDUNIT_Fixed) { + fLeftMargin = fColumnStart + fLeftMargin + (fColumnWidth - fLeftMargin - fRightMargin - pInfo->m_fActualWidth) / 2; + } else if (bLeftMargin) { + fLeftMargin = fColumnStart + fLeftMargin; + } else if (bRightMargin) { + fLeftMargin = fColumnStart + fColumnWidth - fRightMargin - pInfo->m_fActualWidth; + } else { + fLeftMargin = fColumnStart; + } + if (bTopMargin && bBottomMargin && pInfo->m_Size[FWL_GRIDSIZE_Height].eUnit == FWL_GRIDUNIT_Fixed) { + fTopMargin = fRowStart + fTopMargin + (fRowHeight - fTopMargin - fBottomMargin - pInfo->m_fActualHeight) / 2; + } else if (bTopMargin) { + fTopMargin = fRowStart + fTopMargin; + } else if (bBottomMargin) { + fTopMargin = fRowStart + fRowHeight - fBottomMargin - pInfo->m_fActualHeight; + } else { + fTopMargin = fRowStart; + } + CFX_RectF rtWidget, rtOld; + rtWidget.Set(fLeftMargin, fTopMargin, pInfo->m_fActualWidth, pInfo->m_fActualHeight); + pWidget->GetWidgetRect(rtOld); + if (rtWidget == rtOld) { + continue; + } + pWidget->SetWidgetRect(rtWidget); + if (rtWidget.width == rtOld.width && rtWidget.height == rtOld.height) { + continue; + } + pWidget->Update(); + } +} +FX_BOOL CFWL_GridImp::IsGrid(IFWL_Widget* pWidget) +{ + _FWL_RETURN_VALUE_IF_FAIL(pWidget, FALSE); + return pWidget->GetClassID() == FWL_CLASSHASH_Grid; +} +void CFWL_GridImp::SetSpanAutoColRowSize(const CFX_PtrArray &spanAutos, FX_FLOAT fTotalSize) +{ + FX_INT32 iAutoColRows = spanAutos.GetSize(); + if (iAutoColRows < 1) { + return; + } + CFX_PtrArray autoNoMinMaxs; + FX_FLOAT fAutoPer = fTotalSize / iAutoColRows; + for (FX_INT32 j = 0; j < iAutoColRows; j++) { + CFWL_GridColRow *pColumn = (CFWL_GridColRow*)spanAutos[j]; + FX_FLOAT fOrgSize = pColumn->m_fActualSize; + if (SetColRowActualSize(pColumn, pColumn->m_fActualSize + fAutoPer, TRUE)) { + autoNoMinMaxs.Add(pColumn); + } else { + fTotalSize -= pColumn->m_fActualSize - fOrgSize; + FX_INT32 iNoMinMax = iAutoColRows - (j + 1 - autoNoMinMaxs.GetSize()); + if (iNoMinMax > 0 && fTotalSize > 0) { + fAutoPer = fTotalSize / iNoMinMax; + } else { + break; + } + } + } + FX_INT32 iNormals = autoNoMinMaxs.GetSize(); + if (fTotalSize > 0) { + if (iNormals == iAutoColRows) { + fAutoPer = fTotalSize / iNormals; + for (FX_INT32 k = 0; k < iNormals; k++) { + CFWL_GridColRow *pColumn = (CFWL_GridColRow*)autoNoMinMaxs[k]; + pColumn->m_fActualSize += fAutoPer; + } + } else { + SetSpanAutoColRowSize(autoNoMinMaxs, fTotalSize); + } + } else { + } +} +void CFWL_GridImp::SetSpanScaledColRowSize(const CFX_PtrArray &spanScaleds, FX_FLOAT fTotalSize, FX_FLOAT fTotalScaledNum) +{ + FX_INT32 iScaledColRows = spanScaleds.GetSize(); + if (iScaledColRows < 1) { + return; + } + CFX_PtrArray autoNoMinMaxs; + FX_FLOAT fPerSize = fTotalSize / fTotalScaledNum; + for (FX_INT32 i = 0; i < iScaledColRows; i++) { + CFWL_GridColRow *pColRow = (CFWL_GridColRow*)spanScaleds[i]; + if (SetColRowActualSize(pColRow, pColRow->m_fActualSize + fPerSize * pColRow->m_Size.fLength, TRUE)) { + autoNoMinMaxs.Add(pColRow); + } else { + fTotalSize -= pColRow->m_fActualSize; + fTotalScaledNum -= pColRow->m_Size.fLength; + FX_INT32 iNoMinMax = iScaledColRows - (i + 1 - autoNoMinMaxs.GetSize()); + if (iNoMinMax > 0 && fTotalSize > 0) { + fPerSize = fTotalSize / fTotalScaledNum; + } else { + break; + } + } + } + FX_INT32 iNormals = autoNoMinMaxs.GetSize(); + if (fTotalSize > 0) { + if (iNormals == iScaledColRows) { + fPerSize = fTotalSize / fTotalScaledNum; + for (FX_INT32 j = 0; j < iNormals; j++) { + CFWL_GridColRow *pColumn = (CFWL_GridColRow*)autoNoMinMaxs[j]; + pColumn->m_fActualSize += fPerSize * pColumn->m_Size.fLength; + } + } else { + SetSpanScaledColRowSize(autoNoMinMaxs, fTotalSize, fTotalScaledNum); + } + } else { + } +} +void CFWL_GridImp::SetScaledColRowsSize(const CFX_PtrArray &spanScaleds, FX_FLOAT fTotalSize, FX_FLOAT fTotalScaledNum) +{ + FX_INT32 iScaledColRows = spanScaleds.GetSize(); + if (iScaledColRows < 1) { + return; + } + CFX_PtrArray autoNoMinMaxs; + FX_FLOAT fPerSize = fTotalSize / fTotalScaledNum; + for (FX_INT32 i = 0; i < iScaledColRows; i++) { + CFWL_GridColRow *pColRow = (CFWL_GridColRow*)spanScaleds[i]; + if (!pColRow) { + continue; + } + FX_FLOAT fSize = fPerSize * pColRow->m_Size.fLength; + FX_FLOAT fOrgSize = pColRow->m_fActualSize; + if (SetColRowActualSize(pColRow, fSize, TRUE)) { + autoNoMinMaxs.Add(pColRow); + } else { + fTotalSize -= pColRow->m_fActualSize - fOrgSize; + fTotalScaledNum -= pColRow->m_Size.fLength; + FX_INT32 iNoMinMax = iScaledColRows - (i + 1 - autoNoMinMaxs.GetSize()); + if (iNoMinMax > 0 && fTotalSize > 0) { + fPerSize = fTotalSize / fTotalScaledNum; + } else { + break; + } + } + } + FX_INT32 iNormals = autoNoMinMaxs.GetSize(); + if (fTotalSize > 0) { + if (iNormals == iScaledColRows) { + fPerSize = fTotalSize / fTotalScaledNum; + for (FX_INT32 i = 0; i < iNormals; i++) { + CFWL_GridColRow *pColRow = (CFWL_GridColRow*)autoNoMinMaxs[i]; + if (!pColRow) { + continue; + } + FX_FLOAT fSize = fPerSize * pColRow->m_Size.fLength; + pColRow->m_fActualSize = fSize; + } + } else { + SetScaledColRowsSize(autoNoMinMaxs, fTotalSize, fTotalScaledNum); + } + } else { + } +} +CFWL_GridDelegate::CFWL_GridDelegate(CFWL_GridImp *pOwner) + : m_pOwner(pOwner) +{ +} +FX_INT32 CFWL_GridDelegate::OnProcessMessage(CFWL_Message *pMessage) +{ + if (pMessage->GetClassID() != FWL_MSGHASH_Mouse) { + return 0; + } + CFWL_MsgMouse *pMsg = (CFWL_MsgMouse*)pMessage; + if (pMsg->m_dwCmd != FWL_MSGMOUSECMD_LButtonDown) { + return 0; + } + return 1; +} +FWL_ERR CFWL_GridDelegate::OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + return m_pOwner->DrawWidget(pGraphics, pMatrix); +} diff --git a/xfa/src/fwl/src/core/fwl_noteimp.cpp b/xfa/src/fwl/src/core/fwl_noteimp.cpp new file mode 100644 index 0000000000..40f0c1137d --- /dev/null +++ b/xfa/src/fwl/src/core/fwl_noteimp.cpp @@ -0,0 +1,1116 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "include/fwl_targetimp.h" +#include "include/fwl_widgetimp.h" +#include "include/fwl_widgetmgrimp.h" +#include "include/fwl_panelimp.h" +#include "include/fwl_formimp.h" +#include "include/fwl_noteimp.h" +#include "include/fwl_threadimp.h" +#include "include/fwl_appimp.h" +#include "../../src/basewidget/include/fwl_tooltipctrlimp.h" +CFWL_NoteLoop::CFWL_NoteLoop(CFWL_WidgetImp *pForm ) + : m_pForm(pForm) + , m_bContinueModal(TRUE) +{ +} +FX_BOOL CFWL_NoteLoop::PreProcessMessage(CFWL_Message *pMessage) +{ + if (!m_pForm) { + return FALSE; + } + return TranslateAccelerator(pMessage); +} +FWL_ERR CFWL_NoteLoop::Idle(FX_INT32 count) +{ +#if (_FX_OS_==_FX_WIN32_DESKTOP_) + if (count <= 0) +#endif + { + CFWL_EvtIdle ev; + IFWL_App *pApp = FWL_GetApp(); + _FWL_RETURN_VALUE_IF_FAIL(pApp, FWL_ERR_Indefinite); + IFWL_NoteDriver *pDriver = pApp->GetNoteDriver(); + _FWL_RETURN_VALUE_IF_FAIL(pDriver, FWL_ERR_Indefinite); + pDriver->SendNote(&ev); + } + return FWL_ERR_Indefinite; +} +CFWL_WidgetImp* CFWL_NoteLoop::GetForm() +{ + return m_pForm; +} +FX_BOOL CFWL_NoteLoop::ContinueModal() +{ + return m_bContinueModal; +} +FWL_ERR CFWL_NoteLoop::EndModalLoop() +{ + m_bContinueModal = FALSE; +#if (_FX_OS_==_FX_MACOSX_) + CFWL_WidgetMgr *pWidgetMgr = (CFWL_WidgetMgr*)FWL_GetWidgetMgr(); + IFWL_AdapterWidgetMgr * adapterWidgetMgr = pWidgetMgr->GetAdapterWidgetMgr(); + adapterWidgetMgr->EndLoop(); +#endif + return FWL_ERR_Succeeded; +} +FX_BOOL CFWL_NoteLoop::TranslateAccelerator(CFWL_Message *pMessage) +{ + if (pMessage->GetClassID() != FWL_MSGHASH_Key) { + return FALSE; + } + if (((CFWL_MsgKey*)pMessage)->m_dwCmd != FWL_MSGKEYCMD_KeyDown) { + return FALSE; + } + CFWL_MsgKey *pMsgKey = (CFWL_MsgKey*)pMessage; + CFX_MapAccelerators &accel = ((CFWL_FormImp*)m_pForm)->GetAccelerator(); + FX_POSITION pos = accel.GetStartPosition(); + if (!pos) { + return FALSE; + } + FX_DWORD vrKey, rValue; + while (pos) { + accel.GetNextAssoc(pos, vrKey, rValue); + FX_DWORD dwFlags = (vrKey & 0xFF00) >> 8; + FX_DWORD m_dwKeyCode = vrKey & 0x00FF; + if (pMsgKey->m_dwFlags == dwFlags && pMsgKey->m_dwKeyCode == m_dwKeyCode) { + GenerateCommondEvent(rValue); + return TRUE; + } + } + return FALSE; +} +FWL_ERR CFWL_NoteLoop::SetMainForm(CFWL_WidgetImp *pForm) +{ + m_pForm = pForm; + return FWL_ERR_Succeeded; +} +void CFWL_NoteLoop::GenerateCommondEvent(FX_DWORD dwCommand) +{ + CFWL_EvtMenuCommand ev; + ev.m_iCommand = dwCommand; + IFWL_NoteThread *pThread = m_pForm->GetOwnerThread(); + _FWL_RETURN_IF_FAIL(pThread); + IFWL_NoteDriver *pDriver = pThread->GetNoteDriver(); + _FWL_RETURN_IF_FAIL(pDriver); + pDriver->SendNote(&ev); +} +CFWL_NoteDriver::CFWL_NoteDriver() + : m_sendEventCalled(0) + , m_maxSize(500) + , m_bFullScreen(FALSE) + , m_pFocus(NULL) + , m_pHover(NULL) + , m_pGrab(NULL) + , m_hook(NULL) +{ + m_pNoteLoop = FX_NEW CFWL_NoteLoop; + PushNoteLoop((IFWL_NoteLoop*)m_pNoteLoop); +} +CFWL_NoteDriver::~CFWL_NoteDriver() +{ + if (m_pNoteLoop) { + delete m_pNoteLoop; + m_pNoteLoop = NULL; + } + ClearInvalidEventTargets(TRUE); +} +FX_BOOL CFWL_NoteDriver::SendNote(CFWL_Note *pNote) +{ + if (pNote->IsEvent()) { + FX_INT32 iCount = m_eventTargets.GetCount(); + if (iCount < 1) { + return TRUE; + } + if (FWL_EVTHASH_Mouse == ((CFWL_Event*)pNote)->GetClassID()) { + CFWL_EvtMouse * pMouse = (CFWL_EvtMouse*)pNote; + if (FWL_MSGMOUSECMD_MouseHover == pMouse->m_dwCmd) { + if (m_pNoteLoop->GetForm() && CFWL_ToolTipContainer::getInstance()->ProcessEnter(pMouse, m_pNoteLoop->GetForm()->GetInterface())) { + } + } else if (FWL_MSGMOUSECMD_MouseLeave == pMouse->m_dwCmd) { + if (CFWL_ToolTipContainer::getInstance()->ProcessLeave(pMouse)) { + } + } else if ((FWL_MSGMOUSECMD_LButtonDown <= pMouse->m_dwCmd) && (FWL_MSGMOUSECMD_MButtonDblClk >= pMouse->m_dwCmd)) { + if (CFWL_ToolTipContainer::getInstance()->ProcessLeave(pMouse)) { + } + } + } + m_sendEventCalled ++; + FX_POSITION pos = m_eventTargets.GetStartPosition(); + while (pos) { + FX_LPVOID key = NULL; + CFWL_EventTarget *pEventTarget; + m_eventTargets.GetNextAssoc(pos, key, (void*&)pEventTarget); + if (pEventTarget && !pEventTarget->IsInvalid()) { + pEventTarget->ProcessEvent((CFWL_Event*)pNote); + } + } + m_sendEventCalled --; + } else { + _FWL_RETURN_VALUE_IF_FAIL(pNote->m_pDstTarget, FALSE); + IFWL_WidgetDelegate *pDelegate = pNote->m_pDstTarget->SetDelegate(NULL); + if (pDelegate) { + pDelegate->OnProcessMessage((CFWL_Message*)pNote); + } + } + return TRUE; +} +extern void FWL_PostMessageToMainRoop(CFWL_Message *pMessage); +FX_BOOL CFWL_NoteDriver::PostMessage(CFWL_Message *pMessage) +{ + FWL_PostMessageToMainRoop(pMessage); + return TRUE; +} +#define FWL_NoteDriver_EventKey 1100 +FWL_ERR CFWL_NoteDriver::RegisterEventTarget(IFWL_Widget *pListener, IFWL_Widget *pEventSource , FX_DWORD dwFilter ) +{ + FX_DWORD dwkey = (FX_DWORD)(FX_UINTPTR)pListener->GetPrivateData((FX_LPVOID)(FX_UINTPTR)FWL_NoteDriver_EventKey); + if (dwkey == 0) { + FX_LPVOID random = FX_Random_MT_Start(0); + dwkey = rand(); + FX_Random_MT_Close(random); + pListener->SetPrivateData((FX_LPVOID)(FX_UINTPTR)FWL_NoteDriver_EventKey, (FX_LPVOID)(FX_UINTPTR)dwkey, NULL); + } + CFWL_EventTarget *value = NULL; + if (!m_eventTargets.Lookup((void*)(FX_UINTPTR)dwkey, (FX_LPVOID&)value)) { + value = FX_NEW CFWL_EventTarget(this, pListener); + m_eventTargets.SetAt((void*)(FX_UINTPTR)dwkey, value); + } + value->SetEventSource(pEventSource, dwFilter); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_NoteDriver::UnregisterEventTarget(IFWL_Widget *pListener) +{ + FX_DWORD dwkey = (FX_DWORD)(FX_UINTPTR)pListener->GetPrivateData((FX_LPVOID)(FX_UINTPTR)FWL_NoteDriver_EventKey); + if (dwkey == 0) { + return FWL_ERR_Indefinite; + } + CFWL_EventTarget *value = NULL; + if (m_eventTargets.Lookup((void*)(FX_UINTPTR)dwkey, (FX_LPVOID&)value)) { + value->FlagInvalid(); + } + return FWL_ERR_Succeeded; +} +void CFWL_NoteDriver::ClearEventTargets(FX_BOOL bRemoveAll) +{ + ClearInvalidEventTargets(bRemoveAll); +} +FX_INT32 CFWL_NoteDriver::GetQueueMaxSize() const +{ + return m_maxSize; +} +FWL_ERR CFWL_NoteDriver::SetQueueMaxSize(const FX_INT32 size) +{ + m_maxSize = size; + return FWL_ERR_Succeeded; +} +IFWL_NoteThread* CFWL_NoteDriver::GetOwnerThread() const +{ + return (IFWL_NoteThread *) FWL_GetApp(); +} +FWL_ERR CFWL_NoteDriver::PushNoteLoop(IFWL_NoteLoop *pNoteLoop) +{ + m_noteLoopQueue.Add(pNoteLoop); + return FWL_ERR_Succeeded; +} +IFWL_NoteLoop* CFWL_NoteDriver::PopNoteLoop() +{ + FX_INT32 pos = m_noteLoopQueue.GetSize(); + _FWL_RETURN_VALUE_IF_FAIL(pos > 0, NULL); + IFWL_NoteLoop * p = (IFWL_NoteLoop *) m_noteLoopQueue.GetAt(pos - 1); + m_noteLoopQueue.RemoveAt(pos - 1); + return p; +} +FX_BOOL CFWL_NoteDriver::SetFocus(IFWL_Widget *pFocus, FX_BOOL bNotify ) +{ + if (m_pFocus == pFocus) { + return TRUE; + } + IFWL_Widget* pPrev = m_pFocus; + m_pFocus = pFocus; + if (pPrev) { + IFWL_Widget *pWidget = FWL_GetWidgetMgr()->GetWidget(m_pFocus, FWL_WGTRELATION_SystemForm); + CFWL_FormImp *pForm = pWidget ? (CFWL_FormImp*)((IFWL_TargetData*)pWidget)->GetData() : NULL; + CFWL_MsgKillFocus ms; + ms.m_pDstTarget = pPrev; + ms.m_pSrcTarget = pPrev; + if (bNotify) { + ms.m_dwExtend = 1; + } + IFWL_WidgetDelegate *pDelegate = pPrev->SetDelegate(NULL); + if (pDelegate) { + pDelegate->OnProcessMessage(&ms); + } + } + if (pFocus) { + IFWL_Widget *pWidget = FWL_GetWidgetMgr()->GetWidget(pFocus, FWL_WGTRELATION_SystemForm); + CFWL_FormImp *pForm = pWidget ? (CFWL_FormImp*)((IFWL_TargetData*)pWidget)->GetData() : NULL; + if (pForm) { + CFWL_WidgetImp *pNewFocus = (CFWL_WidgetImp*)((IFWL_TargetData*)pFocus)->GetData(); + pForm->SetSubFocus(pNewFocus); + } + CFWL_MsgSetFocus ms; + ms.m_pDstTarget = pFocus; + if (bNotify) { + ms.m_dwExtend = 1; + } + IFWL_WidgetDelegate *pDelegate = pFocus->SetDelegate(NULL); + if (pDelegate) { + pDelegate->OnProcessMessage(&ms); + } + } + return TRUE; +} +FWL_ERR CFWL_NoteDriver::Run() +{ + CFWL_WidgetMgr *pWidgetMgr = (CFWL_WidgetMgr*)FWL_GetWidgetMgr(); + _FWL_RETURN_VALUE_IF_FAIL(pWidgetMgr, FWL_ERR_Indefinite); +#if (_FX_OS_==_FX_MACOSX_) + IFWL_AdapterWidgetMgr * adapterWidgetMgr = pWidgetMgr->GetAdapterWidgetMgr(); + CFWL_NoteLoop *pTopLoop = GetTopLoop(); + if (pTopLoop) { + CFWL_WidgetImp *formImp = pTopLoop->GetForm(); + if (formImp) { + IFWL_Widget *pForm = formImp->GetInterface(); + adapterWidgetMgr->RunLoop(pForm); + } + } +#elif (_FX_OS_==_FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_) + FX_BOOL bIdle = TRUE; + FX_INT32 iIdleCount = 0; + CFWL_NoteLoop *pTopLoop = NULL; + for (;;) { + pTopLoop = GetTopLoop(); + if (!pTopLoop || !pTopLoop->ContinueModal()) { + break; + } + if (UnqueueMessage(pTopLoop)) { + continue; + } + while (bIdle && !(pWidgetMgr->CheckMessage_Native())) { + if (FWL_ERR_Indefinite == pTopLoop->Idle(iIdleCount++)) { + bIdle = FALSE; + } + } + do { + if (FWL_ERR_Indefinite == pWidgetMgr->DispatchMessage_Native()) { + break; + } + if (pWidgetMgr->IsIdleMessage_Native()) { + bIdle = TRUE; + iIdleCount = 0; + } + } while (pWidgetMgr->CheckMessage_Native()); + } +#elif (_FX_OS_==_FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_LINUX_EMBEDDED_) + CFWL_NoteLoop *pTopLoop = NULL; + for (;;) { + pTopLoop = GetTopLoop(); + if (!pTopLoop || !pTopLoop->ContinueModal()) { + break; + } + if (UnqueueMessage(pTopLoop)) { + continue; + } + if(pWidgetMgr->CheckMessage_Native()) { + pWidgetMgr->DispatchMessage_Native(); + } + } +#endif + return FWL_ERR_Succeeded; +} +IFWL_Widget* CFWL_NoteDriver::GetFocus() +{ + return m_pFocus; +} +IFWL_Widget* CFWL_NoteDriver::GetHover() +{ + return m_pHover; +} +void CFWL_NoteDriver::SetHover(IFWL_Widget *pHover) +{ + m_pHover = pHover; +} +void CFWL_NoteDriver::SetGrab(IFWL_Widget *pGrab, FX_BOOL bSet) +{ + m_pGrab = bSet ? pGrab : NULL; +} +void CFWL_NoteDriver::NotifyTargetHide(IFWL_Widget *pNoteTarget) +{ + if (m_pFocus == pNoteTarget) { + m_pFocus = NULL; + } + if (m_pHover == pNoteTarget) { + m_pHover = NULL; + } + if (m_pGrab == pNoteTarget) { + m_pGrab = NULL; + } +} +void CFWL_NoteDriver::NotifyTargetDestroy(IFWL_Widget *pNoteTarget) +{ + if (m_pFocus == pNoteTarget) { + m_pFocus = NULL; + } + if (m_pHover == pNoteTarget) { + m_pHover = NULL; + } + if (m_pGrab == pNoteTarget) { + m_pGrab = NULL; + } + UnregisterEventTarget(pNoteTarget); + FX_INT32 count = m_forms.GetSize(); + for (FX_INT32 nIndex = 0; nIndex < count; nIndex ++) { + CFWL_FormImp *pForm = (CFWL_FormImp*)m_forms[nIndex]; + if (!pForm) { + continue; + } + CFWL_WidgetImp *pSubFocus = pForm->GetSubFocus(); + _FWL_RETURN_IF_FAIL(pSubFocus); + if (pSubFocus && pSubFocus->GetInterface() == pNoteTarget) { + pForm->SetSubFocus(NULL); + } + } +} +void CFWL_NoteDriver::NotifyFullScreenMode(IFWL_Widget *pNoteTarget, FX_BOOL bFullScreen) +{ + m_bFullScreen = bFullScreen; +} +FWL_ERR CFWL_NoteDriver::RegisterForm(CFWL_WidgetImp *pForm) +{ + _FWL_RETURN_VALUE_IF_FAIL(pForm, FWL_ERR_Indefinite); + if (m_forms.Find(pForm) >= 0) { + return FWL_ERR_Indefinite; + } + m_forms.Add(pForm); + if (m_forms.GetSize() == 1) { + CFWL_NoteLoop *pLoop = (CFWL_NoteLoop*)m_noteLoopQueue.GetAt(0); + _FWL_RETURN_VALUE_IF_FAIL(pLoop, FWL_ERR_Indefinite); + pLoop->SetMainForm(pForm); + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_NoteDriver::UnRegisterForm(CFWL_WidgetImp *pForm) +{ + _FWL_RETURN_VALUE_IF_FAIL(pForm, FWL_ERR_Indefinite); + FX_INT32 nIndex = m_forms.Find(pForm); + if (nIndex < 0) { + return FWL_ERR_Indefinite; + } + m_forms.RemoveAt(nIndex); + return FWL_ERR_Succeeded; +} +FX_BOOL CFWL_NoteDriver::QueueMessage(CFWL_Message *pMessage) +{ + pMessage->Retain(); + m_noteQueue.Add(pMessage); + return TRUE; +} +FX_BOOL CFWL_NoteDriver::UnqueueMessage(CFWL_NoteLoop *pNoteLoop) +{ + if (m_noteQueue.GetSize() < 1) { + return FALSE; + } + CFWL_Message *pMessage = (CFWL_Message*)m_noteQueue[0]; + m_noteQueue.RemoveAt(0); + if (!IsValidMessage(pMessage)) { + pMessage->Release(); + return TRUE; + } + FX_BOOL bHookMessage = FALSE; + if (m_hook) { + bHookMessage = (*m_hook)(pMessage, m_hookInfo); + } + if (!bHookMessage && !pNoteLoop->PreProcessMessage(pMessage)) { + ProcessMessage(pMessage); + } + pMessage->Release(); + return TRUE; +} +CFWL_NoteLoop* CFWL_NoteDriver::GetTopLoop() +{ + FX_INT32 size = m_noteLoopQueue.GetSize(); + _FWL_RETURN_VALUE_IF_FAIL(size > 0, NULL); + return (CFWL_NoteLoop*)m_noteLoopQueue[size - 1]; +} +FX_INT32 CFWL_NoteDriver::CountLoop() +{ + return m_noteLoopQueue.GetSize(); +} +void CFWL_NoteDriver::SetHook(FWLMessageHookCallback callback, FX_LPVOID info) +{ + m_hook = callback; + m_hookInfo = info; +} +FX_BOOL CFWL_NoteDriver::ProcessMessage(CFWL_Message *pMessage) +{ + CFWL_WidgetMgr *pWidgetMgr = (CFWL_WidgetMgr*)FWL_GetWidgetMgr(); + IFWL_Widget *pMessageForm = pWidgetMgr->IsFormDisabled() ? pMessage->m_pDstTarget : GetMessageForm(pMessage->m_pDstTarget); + _FWL_RETURN_VALUE_IF_FAIL(pMessageForm, FALSE); + if (DispatchMessage(pMessage, pMessageForm)) { + if (pMessage->GetClassID() == FWL_MSGHASH_Mouse) { + MouseSecondary((CFWL_MsgMouse*)pMessage); + } + return TRUE; + } + return FALSE; +} +FX_BOOL CFWL_NoteDriver::DispatchMessage(CFWL_Message *pMessage, IFWL_Widget *pMessageForm) +{ + FX_BOOL bRet = FALSE; + switch (pMessage->GetClassID()) { + case FWL_MSGHASH_Activate: { + bRet = DoActivate((CFWL_MsgActivate*)pMessage, pMessageForm); + break; + } + case FWL_MSGHASH_Deactivate: { + bRet = DoDeactivate((CFWL_MsgDeactivate*)pMessage, pMessageForm); + break; + } + case FWL_MSGHASH_SetFocus: { + bRet = DoSetFocus((CFWL_MsgSetFocus*)pMessage, pMessageForm); + break; + } + case FWL_MSGHASH_KillFocus: { + bRet = DoKillFocus((CFWL_MsgKillFocus*)pMessage, pMessageForm); + break; + } + case FWL_MSGHASH_Key: { + bRet = DoKey((CFWL_MsgKey*)pMessage, pMessageForm); + break; + } + case FWL_MSGHASH_Mouse: { + bRet = DoMouse((CFWL_MsgMouse*)pMessage, pMessageForm); + break; + } + case FWL_MSGHASH_MouseWheel: { + bRet = DoWheel((CFWL_MsgMouseWheel*)pMessage, pMessageForm); + break; + } + case FWL_MSGHASH_Size: { + bRet = DoSize((CFWL_MsgSize*)pMessage); + break; + } + case FWL_MSGHASH_Cursor: { + bRet = TRUE; + break; + } + case FWL_MSGHASH_WindowMove: { + bRet = DoWindowMove((CFWL_MsgWindowMove*)pMessage, pMessageForm); + break; + } + case FWL_MSGHASH_DropFiles: { + bRet = DoDragFiles((CFWL_MsgDropFiles*)pMessage, pMessageForm); + break; + } + case FWL_MSGHASH_TaskClicked: { + bRet = TRUE; + break; + } + case FWL_MSGHASH_Close: { + bRet = TRUE; + break; + } + default: { + bRet = TRUE; + break; + } + } + if (bRet) { + IFWL_WidgetDelegate *pDelegate = pMessage->m_pDstTarget->SetDelegate(NULL); + if (pDelegate) { + pDelegate->OnProcessMessage(pMessage); + } + } + return bRet; +} +FX_BOOL CFWL_NoteDriver::DoActivate(CFWL_MsgActivate *pMsg, IFWL_Widget *pMessageForm) +{ + if (m_bFullScreen) { + return FALSE; + } + pMsg->m_pDstTarget = pMessageForm; + return (pMsg->m_pDstTarget)->GetStates() & FWL_WGTSTATE_Deactivated; +} +FX_BOOL CFWL_NoteDriver::DoDeactivate(CFWL_MsgDeactivate *pMsg, IFWL_Widget *pMessageForm) +{ + if (m_bFullScreen) { + return FALSE; + } + FX_INT32 iTrackLoop = m_noteLoopQueue.GetSize(); + _FWL_RETURN_VALUE_IF_FAIL(iTrackLoop > 0, FALSE); + if (iTrackLoop == 1) { + if (pMessageForm->IsInstance(FX_WSTRC(L"FWL_FORMPROXY"))) { + return FALSE; + } + if (pMsg->m_pSrcTarget && pMsg->m_pSrcTarget->IsInstance(FX_WSTRC(L"FWL_FORMPROXY"))) { + return FALSE; + } + if (pMsg->m_pSrcTarget && pMsg->m_pSrcTarget->GetClassID() == 1111984755) { + return FALSE; + } + return TRUE; + } + IFWL_Widget *pDst = pMsg->m_pDstTarget; + _FWL_RETURN_VALUE_IF_FAIL(pDst, FALSE); +#if (_FX_OS_==_FX_MACOSX_) + if (pDst == pMessageForm && pDst->IsInstance(L"FWL_FORMPROXY")) { + return TRUE; + } +#endif + return pDst != pMessageForm && + !pDst->IsInstance(FX_WSTRC(L"FWL_FORMPROXY")) && + !pMessageForm->IsInstance(FX_WSTRC(L"FWL_FORMPROXY")); +} +FX_BOOL CFWL_NoteDriver::DoSetFocus(CFWL_MsgSetFocus *pMsg, IFWL_Widget *pMessageForm) +{ + CFWL_WidgetMgr *pWidgetMgr = (CFWL_WidgetMgr*)FWL_GetWidgetMgr(); + if (pWidgetMgr->IsFormDisabled()) { + m_pFocus = (IFWL_Widget*)pMsg->m_pDstTarget; + return TRUE; + } else { + IFWL_Widget* pWidget = pMsg->m_pDstTarget; + CFWL_FormImp *pForm = pWidget ? (CFWL_FormImp*)((IFWL_TargetData*)pWidget)->GetData() : NULL; + if(pForm) { + CFWL_WidgetImp *pSubFocus = pForm->GetSubFocus(); + if (pSubFocus && ((pSubFocus->GetStates() & FWL_WGTSTATE_Focused) == 0)) { + pMsg->m_pDstTarget = pSubFocus->GetInterface(); + if(m_pFocus != pMsg->m_pDstTarget) { + m_pFocus = pMsg->m_pDstTarget; + return TRUE; + } + } + } + } + return FALSE; +} +FX_BOOL CFWL_NoteDriver::DoKillFocus(CFWL_MsgKillFocus *pMsg, IFWL_Widget *pMessageForm) +{ + CFWL_WidgetMgr *pWidgetMgr = (CFWL_WidgetMgr*)FWL_GetWidgetMgr(); + if (pWidgetMgr->IsFormDisabled()) { + if (m_pFocus == pMsg->m_pDstTarget) { + m_pFocus = NULL; + } + return TRUE; + } else { + IFWL_Widget* pWidget = pMsg->m_pDstTarget; + CFWL_FormImp *pForm = pWidget ? (CFWL_FormImp*)((IFWL_TargetData*)pWidget)->GetData() : NULL; + if(pForm) { + CFWL_WidgetImp *pSubFocus = pForm->GetSubFocus(); + if (pSubFocus && (pSubFocus->GetStates() & FWL_WGTSTATE_Focused)) { + pMsg->m_pDstTarget = pSubFocus->GetInterface(); + if (m_pFocus == pMsg->m_pDstTarget) { + m_pFocus = NULL; + return TRUE; + } + } + } + } + return FALSE; +} +FX_BOOL CFWL_NoteDriver::DoKey(CFWL_MsgKey *pMsg, IFWL_Widget *pMessageForm) +{ +#if(_FX_OS_ != _FX_MACOSX_) + if (pMsg->m_dwCmd == FWL_MSGKEYCMD_KeyDown && pMsg->m_dwKeyCode == FWL_VKEY_Tab) { + CFWL_WidgetMgr *pWidgetMgr = (CFWL_WidgetMgr*)FWL_GetWidgetMgr(); + IFWL_Widget *pForm = GetMessageForm(pMsg->m_pDstTarget); + IFWL_Widget *pFocus = m_pFocus; + if (m_pFocus) { + if (pWidgetMgr->GetWidget(m_pFocus, FWL_WGTRELATION_SystemForm) != pForm) { + pFocus = NULL; + } + } + FX_BOOL bFind = FALSE; + IFWL_Widget *pNextTabStop = pWidgetMgr->nextTab(pForm, pFocus, bFind); + if (!pNextTabStop) { + bFind = FALSE; + pNextTabStop = pWidgetMgr->nextTab(pForm, NULL, bFind); + } + if (pNextTabStop == pFocus) { + return TRUE; + } + if (pNextTabStop) { + SetFocus(pNextTabStop); + } + return TRUE; + } +#endif + if (!m_pFocus) { + if (pMsg->m_dwCmd == FWL_MSGKEYCMD_KeyDown && pMsg->m_dwKeyCode == FWL_VKEY_Return) { + CFWL_WidgetMgr *pWidgetMgr = (CFWL_WidgetMgr*)FWL_GetWidgetMgr(); + IFWL_Widget *defButton = pWidgetMgr->GetDefaultButton(pMessageForm); + if (defButton) { + pMsg->m_pDstTarget = defButton; + return TRUE; + } + } + return FALSE; + } + pMsg->m_pDstTarget = m_pFocus; + return TRUE; +} +FX_BOOL CFWL_NoteDriver::DoMouse(CFWL_MsgMouse *pMsg, IFWL_Widget *pMessageForm) +{ + if (pMsg->m_dwCmd == FWL_MSGMOUSECMD_MouseLeave || + pMsg->m_dwCmd == FWL_MSGMOUSECMD_MouseHover || + pMsg->m_dwCmd == FWL_MSGMOUSECMD_MouseEnter) { + return pMsg->m_pDstTarget != NULL; + } + if (pMsg->m_pDstTarget != pMessageForm) { + pMsg->m_pDstTarget->TransformTo(pMessageForm, pMsg->m_fx, pMsg->m_fy); + } + if (!DoMouseEx(pMsg, pMessageForm)) { + pMsg->m_pDstTarget = pMessageForm; + } + return TRUE; +} +FX_BOOL CFWL_NoteDriver::DoWheel(CFWL_MsgMouseWheel *pMsg, IFWL_Widget *pMessageForm) +{ + CFWL_WidgetMgr *pWidgetMgr = (CFWL_WidgetMgr*)FWL_GetWidgetMgr(); + _FWL_RETURN_VALUE_IF_FAIL(pWidgetMgr, FALSE); + IFWL_Widget *pDst = pWidgetMgr->GetWidgetAtPoint(pMessageForm, pMsg->m_fx, pMsg->m_fy); + if (!pDst) { + return FALSE; + } + while (pDst && pDst->GetClassID() == FWL_CLASSHASH_Grid) { + pDst = pDst->GetParent(); + } + pMessageForm->TransformTo(pDst, pMsg->m_fx, pMsg->m_fy); + pMsg->m_pDstTarget = pDst; + return TRUE; +} +FX_BOOL CFWL_NoteDriver::DoSize(CFWL_MsgSize *pMsg) +{ + CFWL_WidgetMgr *pWidgetMgr = (CFWL_WidgetMgr*)FWL_GetWidgetMgr(); + _FWL_RETURN_VALUE_IF_FAIL(pWidgetMgr, FALSE); + pWidgetMgr->NotifySizeChanged(pMsg->m_pDstTarget, (FX_FLOAT)pMsg->m_iWidth, (FX_FLOAT)pMsg->m_iHeight); + return TRUE; +} +FX_BOOL CFWL_NoteDriver::DoWindowMove(CFWL_MsgWindowMove *pMsg, IFWL_Widget *pMessageForm) +{ + return pMsg->m_pDstTarget == pMessageForm; +} +FX_BOOL CFWL_NoteDriver::DoDragFiles(CFWL_MsgDropFiles *pMsg, IFWL_Widget *pMessageForm) +{ + return pMsg->m_pDstTarget == pMessageForm; +} +FX_BOOL CFWL_NoteDriver::DoMouseEx(CFWL_MsgMouse *pMsg, IFWL_Widget *pMessageForm) +{ + CFWL_WidgetMgr *pWidgetMgr = (CFWL_WidgetMgr*)FWL_GetWidgetMgr(); + _FWL_RETURN_VALUE_IF_FAIL(pWidgetMgr, FALSE); + IFWL_Widget *pTarget = NULL; + if (m_pGrab) { + { + pTarget = m_pGrab; + } + } + if (!pTarget) { + pTarget = pWidgetMgr->GetWidgetAtPoint(pMessageForm, pMsg->m_fx, pMsg->m_fy); + while (pTarget && pTarget->GetClassID() == FWL_CLASSHASH_Grid) { + pTarget = pTarget->GetParent(); + } + } + if (pTarget) { + if (pMessageForm != pTarget) { + pMessageForm->TransformTo(pTarget, pMsg->m_fx, pMsg->m_fy); + } + } + if (!pTarget) { + return FALSE; + } + pMsg->m_pDstTarget = pTarget; + return TRUE; +} +void CFWL_NoteDriver::MouseSecondary(CFWL_MsgMouse *pMsg) +{ + IFWL_Widget *pTarget = pMsg->m_pDstTarget; + if (pTarget == m_pHover) { + return; + } + if (m_pHover) { + CFWL_MsgMouse msLeave; + msLeave.m_pDstTarget = m_pHover; + msLeave.m_fx = pMsg->m_fx; + msLeave.m_fy = pMsg->m_fy; + pTarget->TransformTo(m_pHover, msLeave.m_fx, msLeave.m_fy); + msLeave.m_dwFlags = 0; + msLeave.m_dwCmd = FWL_MSGMOUSECMD_MouseLeave; + DispatchMessage(&msLeave, NULL); + } + if (pTarget->GetClassID() == FWL_CLASSHASH_Form) { + m_pHover = NULL; + return; + } + m_pHover = pTarget; + CFWL_MsgMouse msHover; + msHover.m_pDstTarget = pTarget; + msHover.m_fx = pMsg->m_fx; + msHover.m_fy = pMsg->m_fy; + msHover.m_dwFlags = 0; + msHover.m_dwCmd = FWL_MSGMOUSECMD_MouseHover; + DispatchMessage(&msHover, NULL); +} +FX_BOOL CFWL_NoteDriver::IsValidMessage(CFWL_Message *pMessage) +{ + if (pMessage->GetClassID() == FWL_MSGHASH_Post) { + return TRUE; + } + FX_INT32 iCount = m_noteLoopQueue.GetSize(); + for (FX_INT32 i = 0; i < iCount; i ++) { + CFWL_NoteLoop *pNoteLoop = (CFWL_NoteLoop*)m_noteLoopQueue[i]; + CFWL_WidgetImp *pForm = pNoteLoop->GetForm(); + if (pForm && (pForm->GetInterface() == pMessage->m_pDstTarget)) { + return TRUE; + } + } + iCount = m_forms.GetSize(); + for (FX_INT32 j = 0; j < iCount; j ++) { + CFWL_FormImp *pForm = (CFWL_FormImp*)m_forms[j]; + if (pForm->GetInterface() == pMessage->m_pDstTarget) { + return TRUE; + } + } + return FALSE; +} +IFWL_Widget* CFWL_NoteDriver::GetMessageForm(IFWL_Widget *pDstTarget) +{ + FX_INT32 iTrackLoop = m_noteLoopQueue.GetSize(); + _FWL_RETURN_VALUE_IF_FAIL(iTrackLoop > 0, NULL); + IFWL_Widget *pMessageForm = NULL; + if (iTrackLoop > 1) { + CFWL_NoteLoop *pNootLoop = (CFWL_NoteLoop*)m_noteLoopQueue[iTrackLoop - 1]; + pMessageForm = pNootLoop->GetForm()->GetInterface(); + } else { + pMessageForm = (m_forms.Find(pDstTarget) < 0) ? NULL : pDstTarget; + } + if (!pMessageForm && pDstTarget) { + CFWL_WidgetMgr *pWidgetMgr = (CFWL_WidgetMgr*)FWL_GetWidgetMgr(); + _FWL_RETURN_VALUE_IF_FAIL(pWidgetMgr, NULL); + pMessageForm = pWidgetMgr->GetWidget(pDstTarget, FWL_WGTRELATION_SystemForm); + } + return pMessageForm; +} +void CFWL_NoteDriver::ClearInvalidEventTargets(FX_BOOL bRemoveAll) +{ + FX_POSITION pos = m_eventTargets.GetStartPosition(); + while (pos) { + FX_LPVOID key = NULL; + CFWL_EventTarget *pEventTarget = NULL; + m_eventTargets.GetNextAssoc(pos, key, (void*&)pEventTarget); + if (pEventTarget && (bRemoveAll || pEventTarget->IsInvalid())) { + m_eventTargets.RemoveKey(key); + delete pEventTarget; + } + } +} +class CFWL_CoreToopTipDP : public IFWL_ToolTipDP, public CFX_Object +{ +public: + FWL_ERR GetCaption(IFWL_Widget *pWidget, CFX_WideString &wsCaption); + FX_INT32 GetInitialDelay(IFWL_Widget *pWidget); + FX_INT32 GetAutoPopDelay(IFWL_Widget *pWidget); + CFX_DIBitmap* GetToolTipIcon(IFWL_Widget *pWidget); + CFX_SizeF GetToolTipIconSize(IFWL_Widget *pWidget); + CFX_RectF GetAnchor(); + CFWL_CoreToopTipDP(); + + CFX_WideString m_wsCaption; + FX_INT32 m_nInitDelayTime; + FX_INT32 m_nAutoPopDelayTime; + CFX_RectF m_fAnchor; +}; +CFWL_CoreToopTipDP::CFWL_CoreToopTipDP() +{ + m_nInitDelayTime = 500; + m_nAutoPopDelayTime = 50000; + m_fAnchor.Set( 0.0, 0.0, 0.0, 0.0); +} +FWL_ERR CFWL_CoreToopTipDP::GetCaption(IFWL_Widget *pWidget, CFX_WideString &wsCaption) +{ + wsCaption = m_wsCaption; + return FWL_ERR_Succeeded; +} +FX_INT32 CFWL_CoreToopTipDP::GetInitialDelay(IFWL_Widget *pWidget) +{ + return m_nInitDelayTime; +} +FX_INT32 CFWL_CoreToopTipDP::GetAutoPopDelay(IFWL_Widget *pWidget) +{ + return m_nAutoPopDelayTime; +} +CFX_DIBitmap* CFWL_CoreToopTipDP::GetToolTipIcon(IFWL_Widget *pWidget) +{ + return NULL; +} +CFX_SizeF CFWL_CoreToopTipDP::GetToolTipIconSize(IFWL_Widget *pWidget) +{ + CFX_SizeF sz; + sz.Set(0, 0); + return sz; +} +CFX_RectF CFWL_CoreToopTipDP::GetAnchor() +{ + return m_fAnchor; +} +CFWL_EventTarget::~CFWL_EventTarget() +{ + m_eventSources.RemoveAll(); +} +FX_INT32 CFWL_EventTarget::SetEventSource(IFWL_Widget *pSource, FX_DWORD dwFilter) +{ + if (pSource) { + m_eventSources.SetAt(pSource, dwFilter); + return m_eventSources.GetCount(); + } + return 1; +} +FX_BOOL CFWL_EventTarget::ProcessEvent(CFWL_Event *pEvent) +{ + IFWL_WidgetDelegate *pDelegate = m_pListener->SetDelegate(NULL); + _FWL_RETURN_VALUE_IF_FAIL(pDelegate, FALSE); + if (m_eventSources.GetCount() == 0) { + pDelegate->OnProcessEvent(pEvent); + return TRUE; + } + FX_POSITION pos = m_eventSources.GetStartPosition(); + while (pos) { + IFWL_Widget *pSource = NULL; + FX_DWORD dwFilter = 0; + m_eventSources.GetNextAssoc(pos, (void*&)pSource, dwFilter); + if (pSource == pEvent->m_pSrcTarget || pEvent->GetClassID() == FWL_EVTHASH_Idle) { + if (IsFilterEvent(pEvent, dwFilter)) { + pDelegate->OnProcessEvent(pEvent); + return TRUE; + } + } + } + return FALSE; +} +FX_BOOL CFWL_EventTarget::IsFilterEvent(CFWL_Event *pEvent, FX_DWORD dwFilter) +{ + if (dwFilter == FWL_EVENT_ALL_MASK) { + return TRUE; + } + FX_BOOL bRet = FALSE; + switch (pEvent->GetClassID()) { + case FWL_EVTHASH_Mouse: { + bRet = dwFilter & FWL_EVENT_MOUSE_MASK; + break; + } + case FWL_EVTHASH_MouseWheel: { + bRet = dwFilter & FWL_EVENT_MOUSEWHEEL_MASK; + break; + } + case FWL_EVTHASH_Key: { + bRet = dwFilter & FWL_EVENT_KEY_MASK; + break; + } + case FWL_EVTHASH_SetFocus: + case FWL_EVTHASH_KillFocus: { + bRet = dwFilter & FWL_EVENT_FOCUSCHANGED_MASK; + break; + } + case FWL_EVTHASH_Draw: { + bRet = dwFilter & FWL_EVENT_DRAW_MASK; + break; + } + case FWL_EVTHASH_Close: { + bRet = dwFilter & FWL_EVENT_CLOSE_MASK; + break; + } + case FWL_EVTHASH_SizeChanged: { + bRet = dwFilter & FWL_EVENT_SIZECHANGED_MASK; + break; + } + case FWL_EVTHASH_Idle: { + bRet = dwFilter & FWL_EVENT_IDLE_MASK; + break; + } + default: { + bRet = dwFilter & FWL_EVENT_CONTROL_MASK; + break; + } + } + return bRet; +} +CFWL_ToolTipContainer::CFWL_ToolTipContainer() + : pCurTarget(NULL) + , m_pToolTipImp(NULL) +{ + m_ToolTipDp = FX_NEW CFWL_CoreToopTipDP; + m_ToolTipDp->m_nInitDelayTime = 0; + m_ToolTipDp->m_nAutoPopDelayTime = 2000; +} +CFWL_ToolTipContainer::~CFWL_ToolTipContainer() +{ + if (m_pToolTipImp) { + IFWL_ToolTip *pToolTip = (IFWL_ToolTip*)m_pToolTipImp->GetInterface(); + pToolTip->Finalize(); + pToolTip->Release(); + m_pToolTipImp = NULL; + } + if (m_ToolTipDp) { + delete m_ToolTipDp; + m_ToolTipDp = NULL; + } +} +CFWL_ToolTipContainer* CFWL_ToolTipContainer::getInstance() +{ + static CFWL_ToolTipContainer * _toolTipContainer = NULL; + if (!_toolTipContainer) { + _toolTipContainer = FX_NEW CFWL_ToolTipContainer; + } + return _toolTipContainer; +} +FX_ERR CFWL_ToolTipContainer::AddToolTipTarget(IFWL_ToolTipTarget *pTarget) +{ + if (m_arrWidget.Find((void *)pTarget) < 0) { + m_arrWidget.Add((void *)pTarget); + return FWL_ERR_Succeeded; + } + return FWL_ERR_Indefinite; +} +FX_ERR CFWL_ToolTipContainer::RemoveToolTipTarget(IFWL_ToolTipTarget *pTarget) +{ + int index = m_arrWidget.Find((void *)pTarget); + if (index >= 0) { + m_arrWidget.RemoveAt(index); + return FWL_ERR_Succeeded; + } + return FWL_ERR_Indefinite; +} +FX_BOOL CFWL_ToolTipContainer::HasToolTip(IFWL_Widget *pWedget) +{ + FX_INT32 iCount = m_arrWidget.GetSize(); + for (FX_INT32 i = 0; i < iCount; i++) { + IFWL_ToolTipTarget *p = (IFWL_ToolTipTarget *)m_arrWidget[i]; + if (p->GetWidget() == pWedget) { + pCurTarget = p; + return TRUE; + } + } + return FALSE; +} +FX_BOOL CFWL_ToolTipContainer::ProcessEnter(CFWL_EvtMouse *pEvt, IFWL_Widget *pOwner) +{ + if (HasToolTip(pEvt->m_pDstTarget)) { + if (NULL == m_pToolTipImp) { + CFWL_WidgetImpProperties prop; + prop.m_pDataProvider = m_ToolTipDp; + prop.m_pOwner = pOwner; + CFX_RectF rtTooltip; + rtTooltip.Set(150, 150, 100, 50); + prop.m_rtWidget = rtTooltip; + m_pToolTipImp = FX_NEW CFWL_ToolTipImp(prop); + IFWL_ToolTip *pToolTip = IFWL_ToolTip::Create(); + m_pToolTipImp->SetInterface(pToolTip); + ((IFWL_TargetData*)pToolTip)->SetData(m_pToolTipImp); + m_pToolTipImp->Initialize(); + m_pToolTipImp->ModifyStylesEx( FWL_STYLEEXT_TTP_Multiline, 0); + m_pToolTipImp->SetStates( FWL_WGTSTATE_Invisible, TRUE); + } + if (pCurTarget->IsShowed()) { + CFX_WideString wsCaption; + pCurTarget->GetCaption(wsCaption); + if (!wsCaption.IsEmpty()) { + m_ToolTipDp->m_wsCaption = wsCaption; + } + CFX_RectF rt; + rt.Reset(); + CFX_SizeF sz; + sz.Reset(); + pCurTarget->GetToolTipSize(sz); + if (sz.x > 0 && sz.y > 0) { + rt.width = sz.x; + rt.height = sz.y; + } else { + CFX_RectF r; + m_pToolTipImp->GetWidgetRect(r, TRUE); + rt.width = r.width; + rt.height = r.height; + } + CFX_PointF pt; + pt.Set(pEvt->m_fx, pEvt->m_fy); + if (pCurTarget->GetToolTipPos(pt) == FWL_ERR_Succeeded) { + rt.left = pt.x; + rt.top = pt.y; + m_pToolTipImp->ModifyStylesEx(FWL_STYLEEXT_TTP_NoAnchor, 0); + } else { + CFX_RectF rtAnchor; + pCurTarget->GetWidget()->GetClientRect(rtAnchor); + pCurTarget->GetWidget()->TransformTo(NULL, rtAnchor.left, rtAnchor.top); + m_pToolTipImp->SetAnchor(rtAnchor); + m_pToolTipImp->ModifyStylesEx(0, FWL_STYLEEXT_TTP_NoAnchor); + } + m_pToolTipImp->SetWidgetRect(rt); + m_pToolTipImp->Update(); + m_pToolTipImp->Show(); + } + return TRUE; + } + return FALSE; +} +FX_BOOL CFWL_ToolTipContainer::ProcessLeave(CFWL_EvtMouse *pEvt) +{ + if (HasToolTip(pEvt->m_pDstTarget) && NULL != m_pToolTipImp) { + m_pToolTipImp->Hide(); + pCurTarget = NULL; + return TRUE; + } + return FALSE; +} +IFWL_ToolTipTarget* CFWL_ToolTipContainer::GetCurrentToolTipTarget() +{ + return pCurTarget; +} +FX_ERR CFWL_ToolTipContainer::SetToolTipInitialDelay(FX_INT32 nDelayTime) +{ + m_ToolTipDp->m_nInitDelayTime = nDelayTime; + return FWL_ERR_Succeeded; +} +FX_ERR CFWL_ToolTipContainer::SetToolTipAutoPopDelay(FX_INT32 nDelayTime) +{ + m_ToolTipDp->m_nAutoPopDelayTime = nDelayTime; + return FWL_ERR_Succeeded; +} +FWL_ERR FWL_AddToolTipTarget(IFWL_ToolTipTarget *pTarget) +{ + return CFWL_ToolTipContainer::getInstance()->AddToolTipTarget(pTarget); +} +FWL_ERR FWL_RemoveToolTipTarget(IFWL_ToolTipTarget *pTarget) +{ + return CFWL_ToolTipContainer::getInstance()->RemoveToolTipTarget(pTarget); +} +FWL_ERR FWL_SetToolTipInitialDelay(FX_INT32 nDelayTime) +{ + return CFWL_ToolTipContainer::getInstance()->SetToolTipInitialDelay(nDelayTime); +} +FWL_ERR FWL_SetToolTipAutoPopDelay(FX_INT32 nDelayTime) +{ + return CFWL_ToolTipContainer::getInstance()->SetToolTipAutoPopDelay(nDelayTime); +} +IFWL_Widget* FWL_GetCurrentThreadModalWidget(IFWL_NoteThread *pNoteThread) +{ + _FWL_RETURN_VALUE_IF_FAIL(pNoteThread, NULL); + CFWL_NoteDriver *noteDriver = (CFWL_NoteDriver*)pNoteThread->GetNoteDriver(); + _FWL_RETURN_VALUE_IF_FAIL(noteDriver, NULL); + if (noteDriver->CountLoop() == 1) { + return NULL; + } + CFWL_NoteLoop *topLoop = noteDriver->GetTopLoop(); + _FWL_RETURN_VALUE_IF_FAIL(topLoop, NULL); + CFWL_WidgetImp *widget = topLoop->GetForm(); + _FWL_RETURN_VALUE_IF_FAIL(widget, NULL); + return widget->GetInterface(); +} +FWL_ERR FWL_SetHook(IFWL_NoteDriver *driver, FWLMessageHookCallback callback, FX_LPVOID info) +{ + CFWL_NoteDriver *noteDriver = (CFWL_NoteDriver*)driver; + noteDriver->SetHook(callback, info); + return FWL_ERR_Succeeded; +} diff --git a/xfa/src/fwl/src/core/fwl_panelimp.cpp b/xfa/src/fwl/src/core/fwl_panelimp.cpp new file mode 100644 index 0000000000..de66a33491 --- /dev/null +++ b/xfa/src/fwl/src/core/fwl_panelimp.cpp @@ -0,0 +1,208 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "include/fwl_targetimp.h" +#include "include/fwl_noteimp.h" +#include "include/fwl_widgetimp.h" +#include "include/fwl_panelimp.h" +IFWL_Panel* IFWL_Panel::Create() +{ + return new IFWL_Panel; +} +FWL_ERR IFWL_Panel::Initialize(IFWL_Widget *pOuter ) +{ + m_pData = FX_NEW CFWL_PanelImp(pOuter); + ((CFWL_PanelImp*)m_pData)->SetInterface(this); + return ((CFWL_PanelImp*)m_pData)->Initialize(); +} +FWL_ERR IFWL_Panel::Initialize(CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter ) +{ + m_pData = FX_NEW CFWL_PanelImp(properties, pOuter); + ((CFWL_PanelImp*)m_pData)->SetInterface(this); + return ((CFWL_PanelImp*)m_pData)->Initialize(); +} +IFWL_Content* IFWL_Panel::GetContent() +{ + return ((CFWL_PanelImp*)m_pData)->GetContent(); +} +FWL_ERR IFWL_Panel::SetContent(IFWL_Content *pContent) +{ + return ((CFWL_PanelImp*)m_pData)->SetContent(pContent); +} +IFWL_Panel::IFWL_Panel() +{ + m_pData = NULL; +} +IFWL_Panel::~IFWL_Panel() +{ + if (m_pData) { + delete (CFWL_PanelImp*)m_pData; + m_pData = NULL; + } +} +CFWL_PanelImp::CFWL_PanelImp(IFWL_Widget* pOuter ) + : CFWL_WidgetImp(pOuter) + , m_pContent(NULL) +{ +} +CFWL_PanelImp::CFWL_PanelImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter ) + : CFWL_WidgetImp(properties, pOuter) + , m_pContent(NULL) +{ +} +CFWL_PanelImp::~CFWL_PanelImp() +{ +} +FWL_ERR CFWL_PanelImp::GetClassName(CFX_WideString &wsClass) const +{ + wsClass = FWL_CLASS_Panel; + return FWL_ERR_Succeeded; +} +FX_DWORD CFWL_PanelImp::GetClassID() const +{ + return FWL_CLASSHASH_Panel; +} +FWL_ERR CFWL_PanelImp::GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize ) +{ + if (bAutoSize) { + if (m_pContent) { + m_pContent->GetWidgetRect(rect, TRUE); + } + } else { + rect = m_pProperties->m_rtWidget; + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_PanelImp::Update() +{ + if (m_pContent) { + CFX_RectF rtClient; + GetClientRect(rtClient); + FWL_GRIDUNIT eWidth = FWL_GRIDUNIT_Fixed, eHeight = FWL_GRIDUNIT_Fixed; + IFWL_WidgetMgr *pWidgetMgr = FWL_GetWidgetMgr(); + _FWL_RETURN_VALUE_IF_FAIL(pWidgetMgr, FWL_ERR_Indefinite); + IFWL_Widget *pParent = pWidgetMgr->GetWidget((IFWL_Widget*)this, FWL_WGTRELATION_Parent); + if (pParent && pParent->GetClassID() == FWL_CLASSHASH_Grid) { + IFWL_Grid* pGrid = (IFWL_Grid*)pParent; + pGrid->GetWidgetSize((IFWL_Widget*)this, FWL_GRIDSIZE_Width, eWidth); + pGrid->GetWidgetSize((IFWL_Widget*)this, FWL_GRIDSIZE_Height, eHeight); + } + if (eWidth != FWL_GRIDUNIT_Auto || eHeight != FWL_GRIDUNIT_Auto) { + } + m_pContent->SetWidgetRect(rtClient); + m_pContent->Update(); + } + return FWL_ERR_Succeeded; +} +IFWL_Content* CFWL_PanelImp::GetContent() +{ + return m_pContent; +} +FWL_ERR CFWL_PanelImp::SetContent(IFWL_Content *pContent) +{ + _FWL_RETURN_VALUE_IF_FAIL(pContent, FWL_ERR_Indefinite); + m_pContent = pContent; + return pContent->SetParent(m_pInterface); +} +class CFWL_CustomPanelImp : public CFWL_WidgetImp +{ +public: + CFWL_CustomPanelImp(IFWL_Widget *pOuter = NULL); + CFWL_CustomPanelImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter = NULL); + virtual ~CFWL_CustomPanelImp(); + virtual FWL_ERR GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize = FALSE); + virtual FWL_ERR Update(); + virtual IFWL_Content* GetContent(); + virtual FWL_ERR SetContent(IFWL_Content *pContent); + FWL_ERR SetProxy(IFWL_Proxy *pProxy); +protected: + IFWL_Content *m_pContent; + IFWL_Proxy *m_pProxy; +}; +CFWL_CustomPanelImp::CFWL_CustomPanelImp(IFWL_Widget* pOuter ) + : CFWL_WidgetImp(pOuter) + , m_pContent(NULL) + , m_pProxy(NULL) +{ +} +CFWL_CustomPanelImp::CFWL_CustomPanelImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter ) + : CFWL_WidgetImp(properties, pOuter) + , m_pContent(NULL) + , m_pProxy(NULL) +{ +} +CFWL_CustomPanelImp::~CFWL_CustomPanelImp() +{ +} +FWL_ERR CFWL_CustomPanelImp::GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize ) +{ + if (bAutoSize && m_pProxy && (m_pProxy->GetWidgetRect(rect, bAutoSize) == FWL_ERR_Succeeded)) { + return FWL_ERR_Succeeded; + } + return CFWL_WidgetImp::GetWidgetRect(rect, bAutoSize); +} +FWL_ERR CFWL_CustomPanelImp::Update() +{ + if (m_pProxy) { + return m_pProxy->Update(); + } + return CFWL_WidgetImp::Update(); +} +IFWL_Content* CFWL_CustomPanelImp::GetContent() +{ + return m_pContent; +} +FWL_ERR CFWL_CustomPanelImp::SetContent(IFWL_Content *pContent) +{ + _FWL_RETURN_VALUE_IF_FAIL(pContent, FWL_ERR_Indefinite); + m_pContent = pContent; + return pContent->SetParent(m_pInterface); +} +FWL_ERR CFWL_CustomPanelImp::SetProxy(IFWL_Proxy *pProxy) +{ + m_pProxy = pProxy; + return FWL_ERR_Succeeded; +} +IFWL_CustomPanel* IFWL_CustomPanel::Create() +{ + return new IFWL_CustomPanel; +} +FWL_ERR IFWL_CustomPanel::Initialize(IFWL_Widget *pOuter ) +{ + m_pData = FX_NEW CFWL_CustomPanelImp(pOuter); + ((CFWL_CustomPanelImp*)m_pData)->SetInterface(this); + return ((CFWL_CustomPanelImp*)m_pData)->Initialize(); +} +FWL_ERR IFWL_CustomPanel::Initialize(CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter ) +{ + m_pData = FX_NEW CFWL_CustomPanelImp(properties, pOuter); + ((CFWL_CustomPanelImp*)m_pData)->SetInterface(this); + return ((CFWL_CustomPanelImp*)m_pData)->Initialize(); +} +IFWL_Content* IFWL_CustomPanel::GetContent() +{ + return ((CFWL_CustomPanelImp*)m_pData)->GetContent(); +} +FWL_ERR IFWL_CustomPanel::SetContent(IFWL_Content *pContent) +{ + return ((CFWL_CustomPanelImp*)m_pData)->SetContent(pContent); +} +FWL_ERR IFWL_CustomPanel::SetProxy(IFWL_Proxy *pProxy) +{ + return ((CFWL_CustomPanelImp*)m_pData)->SetProxy(pProxy); +} +IFWL_CustomPanel::IFWL_CustomPanel() +{ + m_pData = NULL; +} +IFWL_CustomPanel::~IFWL_CustomPanel() +{ + if (m_pData) { + delete (CFWL_CustomPanelImp*)m_pData; + m_pData = NULL; + } +} diff --git a/xfa/src/fwl/src/core/fwl_sdadapterimp.cpp b/xfa/src/fwl/src/core/fwl_sdadapterimp.cpp new file mode 100644 index 0000000000..fae5a2a6db --- /dev/null +++ b/xfa/src/fwl/src/core/fwl_sdadapterimp.cpp @@ -0,0 +1,187 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "include/fwl_targetimp.h" +#include "include/fwl_threadimp.h" +#include "include/fwl_noteimp.h" +#include "include/fwl_widgetmgrimp.h" +CFWL_SDAdapterWidgetMgr::CFWL_SDAdapterWidgetMgr() +{ +} +CFWL_SDAdapterWidgetMgr::~CFWL_SDAdapterWidgetMgr() +{ +} +FWL_ERR CFWL_SDAdapterWidgetMgr::CreateWidget(IFWL_Widget *pWidget, IFWL_Widget *pParent ) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SDAdapterWidgetMgr::DestroyWidget(IFWL_Widget *pWidget) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SDAdapterWidgetMgr::SetWidgetRect(IFWL_Widget *pWidget, const CFX_RectF &rect) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SDAdapterWidgetMgr::SetWidgetPosition(IFWL_Widget *pWidget, FX_FLOAT fx, FX_FLOAT fy) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SDAdapterWidgetMgr::SetParentWidget(IFWL_Widget *pWidget, IFWL_Widget *pParent) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SDAdapterWidgetMgr::ShowWidget(IFWL_Widget *pWidget) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SDAdapterWidgetMgr::HideWidget(IFWL_Widget *pWidget) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SDAdapterWidgetMgr::SetNormal(IFWL_Widget *pWidget) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SDAdapterWidgetMgr::SetMaximize(IFWL_Widget *pWidget) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SDAdapterWidgetMgr::SetMinimize(IFWL_Widget *pWidget) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SDAdapterWidgetMgr::RunWidget(IFWL_Widget *pWidget) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SDAdapterWidgetMgr::RepaintWidget(IFWL_Widget *pWidget, const CFX_RectF *pRect) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SDAdapterWidgetMgr::Exit(FX_INT32 iExitCode) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SDAdapterWidgetMgr::CreateWidgetWithNativeId(IFWL_Widget *pWidget, void *vp) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SDAdapterWidgetMgr::GetWidgetRect(IFWL_Widget *pWidget, CFX_RectF &rect) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SDAdapterWidgetMgr::SetWidgetIcon(IFWL_Widget *pWidget, const CFX_DIBitmap *pIcon, FX_BOOL bBig) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SDAdapterWidgetMgr::SetWidgetCaption(IFWL_Widget *pWidget, FX_WSTR wsCaption) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SDAdapterWidgetMgr::SetBorderRegion(IFWL_Widget *pWidget, CFX_Path *pPath) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SDAdapterWidgetMgr::SetTransparent(IFWL_Widget *pWidget, FX_DWORD dwAlpha) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SDAdapterWidgetMgr::SetFullScreen(IFWL_Widget *pWidget, FX_BOOL bFullScreen) +{ + return FWL_ERR_Succeeded; +} +FX_BOOL CFWL_SDAdapterWidgetMgr::CheckMessage() +{ + return TRUE; +} +FX_BOOL CFWL_SDAdapterWidgetMgr::IsIdleMessage() +{ + return TRUE; +} +FWL_ERR CFWL_SDAdapterWidgetMgr::DispatchMessage() +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SDAdapterWidgetMgr::GetWidgetDC(IFWL_Widget *pWidget, FX_LPVOID &pDC) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SDAdapterWidgetMgr::ReleaseWidgetDC(IFWL_Widget *pWidget, FX_LPVOID pDC, CFX_RectF *pClip) +{ + return FWL_ERR_Succeeded; +} +FX_LPVOID CFWL_SDAdapterWidgetMgr::GetWindow(IFWL_Widget *pWidget) +{ + return NULL; +} +FX_DWORD CFWL_SDAdapterWidgetMgr::GetKeyState(FX_DWORD dwVirtKey) +{ + return 0; +} +FWL_ERR CFWL_SDAdapterWidgetMgr::RunLoop(IFWL_Widget *widget) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SDAdapterWidgetMgr::EndLoop() +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SDAdapterWidgetMgr::InitMenu(IFWL_Menu *pMenu, IFWL_MenuDP *pMenuData) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SDAdapterWidgetMgr::UpdateMenu(IFWL_Menu *pMenu, FX_LPCVOID hItem, FX_INT32 iType) +{ + return FWL_ERR_Succeeded; +} +FX_INT32 CFWL_SDAdapterWidgetMgr::TrackPopupMenu(IFWL_Menu *pMenu, IFWL_MenuDP *pMenuData) +{ + return 0; +} +FWL_ERR CFWL_SDAdapterWidgetMgr::SetMessageHook(IFWL_AdapterMessageHook *hook) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SDAdapterWidgetMgr::GetSystemBorder(FX_FLOAT &l, FX_FLOAT &t, FX_FLOAT &r, FX_FLOAT &b) +{ + return FWL_ERR_Succeeded; +} +FX_BOOL CFWL_SDAdapterWidgetMgr::GetPopupPos(IFWL_Widget* pWidget, FX_FLOAT fMinHeight, FX_FLOAT fMaxHeight, const CFX_RectF &rtAnchor, CFX_RectF &rtPopup) +{ + return FWL_ERR_Succeeded; +} +CFWL_SDAdapterThreadMgr::CFWL_SDAdapterThreadMgr() +{ +} +CFWL_SDAdapterThreadMgr::~CFWL_SDAdapterThreadMgr() +{ +} +FWL_ERR CFWL_SDAdapterThreadMgr::Start(IFWL_Thread *pThread, FWL_HTHREAD &hThread, FX_BOOL bSuspended) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SDAdapterThreadMgr::Resume(FWL_HTHREAD hThread) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SDAdapterThreadMgr::Suspend(FWL_HTHREAD hThread) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SDAdapterThreadMgr::Kill(FWL_HTHREAD hThread, FX_INT32 iExitCode) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_SDAdapterThreadMgr::Stop(FWL_HTHREAD hThread, FX_INT32 iExitCode) +{ + return FWL_ERR_Succeeded; +} +IFWL_Thread* CFWL_SDAdapterThreadMgr::GetCurrentThread() +{ + return FWL_GetApp(); +} diff --git a/xfa/src/fwl/src/core/fwl_targetimp.cpp b/xfa/src/fwl/src/core/fwl_targetimp.cpp new file mode 100644 index 0000000000..75e40db15a --- /dev/null +++ b/xfa/src/fwl/src/core/fwl_targetimp.cpp @@ -0,0 +1,101 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "include/fwl_targetimp.h" +FX_DWORD IFWL_Target::Release() +{ + FX_DWORD dwRef = ((CFWL_Target*)m_pData)->Release(); + if (!dwRef) { + m_pData = NULL; + delete this; + } + return dwRef; +} +IFWL_Target* IFWL_Target::Retain() +{ + return ((CFWL_Target*)m_pData)->Retain(); +} +FX_DWORD IFWL_Target::GetRefCount() const +{ + return ((CFWL_Target*)m_pData)->GetRefCount(); +} +FWL_ERR IFWL_Target::GetClassName(CFX_WideString &wsClass) const +{ + return ((CFWL_Target*)m_pData)->GetClassName(wsClass); +} +FX_DWORD IFWL_Target::GetClassID() const +{ + return ((CFWL_Target*)m_pData)->GetClassID(); +} +FX_BOOL IFWL_Target::IsInstance(FX_WSTR wsClass) const +{ + return ((CFWL_Target*)m_pData)->IsInstance(wsClass); +} +FWL_ERR IFWL_Target::Initialize() +{ + return ((CFWL_Target*)m_pData)->Initialize(); +} +FWL_ERR IFWL_Target::Finalize() +{ + return ((CFWL_Target*)m_pData)->Finalize(); +} +IFWL_Target::~IFWL_Target() +{ +} +CFWL_Target::CFWL_Target() + : m_dwRefCount(1) +{ +} +CFWL_Target::~CFWL_Target() +{ +} +FX_DWORD CFWL_Target::Release() +{ + m_dwRefCount--; + FX_DWORD dwRet = m_dwRefCount; + if (!m_dwRefCount) { + delete this; + } + return dwRet; +} +IFWL_Target* CFWL_Target::Retain() +{ + m_dwRefCount++; + return (IFWL_Target*)this; +} +FX_DWORD CFWL_Target::GetRefCount() const +{ + return m_dwRefCount; +} +FWL_ERR CFWL_Target::GetClassName(CFX_WideString &wsClass) const +{ + return FWL_ERR_Succeeded; +} +FX_DWORD CFWL_Target::GetClassID() const +{ + return 0; +} +FX_BOOL CFWL_Target::IsInstance(FX_WSTR wsClass) const +{ + return FALSE; +} +FWL_ERR CFWL_Target::Initialize() +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_Target::Finalize() +{ + return FWL_ERR_Succeeded; +} +FX_LPVOID IFWL_TargetData::GetData() +{ + return m_pData; +} +void IFWL_TargetData::SetData(FX_LPVOID pData) +{ + m_pData = pData; +} diff --git a/xfa/src/fwl/src/core/fwl_threadimp.cpp b/xfa/src/fwl/src/core/fwl_threadimp.cpp new file mode 100644 index 0000000000..66f4144c71 --- /dev/null +++ b/xfa/src/fwl/src/core/fwl_threadimp.cpp @@ -0,0 +1,158 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "include/fwl_targetimp.h" +#include "include/fwl_noteimp.h" +#include "include/fwl_threadimp.h" +#include "include/fwl_appimp.h" +CFWL_ControlThread::~CFWL_ControlThread() +{ +} +FWL_ERR CFWL_ControlThread::Run(FWL_HTHREAD hThread) +{ + static int count = 0; + while (TRUE) { + } + return FWL_ERR_Succeeded; +} +IFWL_Thread * IFWL_Thread::Create() +{ + return (IFWL_Thread *) FX_NEW CFWL_Thread; +} +CFWL_Thread::CFWL_Thread() +{ +} +CFWL_Thread::~CFWL_Thread() +{ +} +FWL_ERR CFWL_Thread::Run(FWL_HTHREAD hThread) +{ + return FWL_ERR_Succeeded; +} +CFWL_ControlThread * CFWL_NoteThread::_assistantThreadHandler = NULL; +FWL_HTHREAD CFWL_NoteThread::_assistantThread = NULL; +FX_INT32 CFWL_NoteThread::_refCount = 0; +IFWL_NoteThread* IFWL_NoteThread::Create() +{ + return (IFWL_NoteThread*) FX_NEW CFWL_NoteThread; +} +CFWL_NoteThread::CFWL_NoteThread() + : m_hThread(NULL) +{ + m_pNoteDriver = FX_NEW CFWL_NoteDriver; +} +CFWL_NoteThread::~CFWL_NoteThread() +{ + if (m_hThread) { + FWL_StopThread(m_hThread, 0); + } + if (m_pNoteDriver) { + delete m_pNoteDriver; + m_pNoteDriver = NULL; + } +} +FWL_ERR CFWL_NoteThread::Run(FWL_HTHREAD hThread) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pNoteDriver, FWL_ERR_Indefinite); + FWL_ERR result = m_pNoteDriver->Run(); + return result; +} +IFWL_NoteDriver* CFWL_NoteThread::GetNoteDriver() +{ + return (IFWL_NoteDriver*)m_pNoteDriver; +} +extern IFWL_AdapterNative* FWL_GetAdapterNative(); +FWL_HTHREAD FWL_StartThread(IFWL_Thread *pThread, FX_BOOL bSuspended ) +{ + IFWL_AdapterNative *pNative = FWL_GetAdapterNative(); + _FWL_RETURN_VALUE_IF_FAIL(pNative, NULL); + IFWL_AdapterThreadMgr *pThreadMgr = pNative->GetThreadMgr(); + _FWL_RETURN_VALUE_IF_FAIL(pThreadMgr, NULL); + FWL_HTHREAD hThread = NULL; + pThreadMgr->Start(pThread, hThread, bSuspended); + return hThread; +} +FWL_ERR FWL_ResumeThread(FWL_HTHREAD hThread) +{ + IFWL_AdapterNative * Native = FWL_GetAdapterNative(); + _FWL_RETURN_VALUE_IF_FAIL(Native, FWL_ERR_Indefinite); + IFWL_AdapterThreadMgr * ThreadMgr = Native->GetThreadMgr(); + _FWL_RETURN_VALUE_IF_FAIL(ThreadMgr, FWL_ERR_Indefinite); + return ThreadMgr->Resume(hThread); +} +FWL_ERR FWL_SuspendThread(FWL_HTHREAD hThread) +{ + IFWL_AdapterNative * Native = FWL_GetAdapterNative(); + _FWL_RETURN_VALUE_IF_FAIL(Native, FWL_ERR_Indefinite); + IFWL_AdapterThreadMgr * ThreadMgr = Native->GetThreadMgr(); + _FWL_RETURN_VALUE_IF_FAIL(ThreadMgr, FWL_ERR_Indefinite); + return ThreadMgr->Suspend(hThread); +} +FWL_ERR FWL_KillThread(FWL_HTHREAD hThread, FX_INT32 iExitCode) +{ + IFWL_AdapterNative * Native = FWL_GetAdapterNative(); + _FWL_RETURN_VALUE_IF_FAIL(Native, FWL_ERR_Indefinite); + IFWL_AdapterThreadMgr * ThreadMgr = Native->GetThreadMgr(); + _FWL_RETURN_VALUE_IF_FAIL(ThreadMgr, FWL_ERR_Indefinite); + return ThreadMgr->Kill(hThread, iExitCode); +} +FWL_ERR FWL_StopThread(FWL_HTHREAD hThread, FX_INT32 iExitCode) +{ + IFWL_AdapterNative * Native = FWL_GetAdapterNative(); + _FWL_RETURN_VALUE_IF_FAIL(Native, FWL_ERR_Indefinite); + IFWL_AdapterThreadMgr * ThreadMgr = Native->GetThreadMgr(); + _FWL_RETURN_VALUE_IF_FAIL(ThreadMgr, FWL_ERR_Indefinite); + return ThreadMgr->Stop(hThread, iExitCode); +} +FWL_HMUTEX FWL_CreateMutex() +{ + return NULL; +} +FWL_ERR FWL_DestroyMutex(FWL_HMUTEX hMutex) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR FWL_LockMutex(FWL_HMUTEX hMutex) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR FWL_TryLockMutex(FWL_HMUTEX hMutex) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR FWL_UnlockMutex(FWL_HMUTEX hMutex) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR FWL_IsLockedMutex(FWL_HMUTEX hMutex, FX_BOOL &bLocked) +{ + return FWL_ERR_Succeeded; +} +FWL_HSEMAPHORE FWL_CreateSemaphore() +{ + return (FWL_HSEMAPHORE) IFWL_AdapterSemaphore::Create(); +} +FWL_ERR FWL_DestroySemaphore(FWL_HSEMAPHORE hSemaphore) +{ + return ((IFWL_AdapterSemaphore*)hSemaphore)->Destroy(); +} +FWL_ERR FWL_WaitSemaphore(FWL_HSEMAPHORE hSemaphore) +{ + return ((IFWL_AdapterSemaphore*)hSemaphore)->Wait(); +} +FWL_ERR FWL_PostSemaphore(FWL_HSEMAPHORE hSemaphore, FX_INT32 down ) +{ + return ((IFWL_AdapterSemaphore*)hSemaphore)->Post(); +} +FWL_ERR FWL_GetSemaphoreValue(FWL_HSEMAPHORE hSemaphore, FX_INT32 &value) +{ + return ((IFWL_AdapterSemaphore*)hSemaphore)->Value((FX_DWORD &)value); +} +FWL_ERR FWL_ResetSemaphore(FWL_HSEMAPHORE hSemaphore, FX_INT32 init) +{ + return ((IFWL_AdapterSemaphore*)hSemaphore)->Reset(init); +} diff --git a/xfa/src/fwl/src/core/fwl_timerimp.cpp b/xfa/src/fwl/src/core/fwl_timerimp.cpp new file mode 100644 index 0000000000..e0300f4316 --- /dev/null +++ b/xfa/src/fwl/src/core/fwl_timerimp.cpp @@ -0,0 +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 "../../../foxitlib.h" +#include "include/fwl_targetimp.h" +#include "include/fwl_threadimp.h" +#include "include/fwl_appimp.h" +FWL_HTIMER FWL_StartTimer(IFWL_Timer *pTimer, FX_DWORD dwElapse, FX_BOOL bImmediately ) +{ + IFWL_AdapterNative *pAdapterNative = FWL_GetAdapterNative(); + _FWL_RETURN_VALUE_IF_FAIL(pAdapterNative, NULL); + IFWL_AdapterTimerMgr *pAdapterTimerMgr = pAdapterNative->GetTimerMgr(); + _FWL_RETURN_VALUE_IF_FAIL(pAdapterTimerMgr, NULL); + FWL_HTIMER hTimer = NULL; + pAdapterTimerMgr->Start(pTimer, dwElapse, hTimer, bImmediately); + return hTimer; +} +FX_INT32 FWL_StopTimer(FWL_HTIMER hTimer) +{ + IFWL_AdapterNative *pAdapterNative = FWL_GetAdapterNative(); + _FWL_RETURN_VALUE_IF_FAIL(pAdapterNative, FWL_ERR_Indefinite); + IFWL_AdapterTimerMgr *pAdapterTimerMgr = pAdapterNative->GetTimerMgr(); + _FWL_RETURN_VALUE_IF_FAIL(pAdapterTimerMgr, FWL_ERR_Indefinite); + return pAdapterTimerMgr->Stop(hTimer); +} diff --git a/xfa/src/fwl/src/core/fwl_widgetimp.cpp b/xfa/src/fwl/src/core/fwl_widgetimp.cpp new file mode 100644 index 0000000000..61186a7ede --- /dev/null +++ b/xfa/src/fwl/src/core/fwl_widgetimp.cpp @@ -0,0 +1,1217 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "include/fwl_targetimp.h" +#include "include/fwl_noteimp.h" +#include "include/fwl_threadimp.h" +#include "include/fwl_appimp.h" +#include "include/fwl_widgetmgrimp.h" +#include "include/fwl_widgetimp.h" +FWL_ERR IFWL_Widget::GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize ) +{ + return ((CFWL_WidgetImp*)m_pData)->GetWidgetRect(rect, bAutoSize); +} +FWL_ERR IFWL_Widget::GetGlobalRect(CFX_RectF &rect) +{ + return ((CFWL_WidgetImp*)m_pData)->GetGlobalRect(rect); +} +FWL_ERR IFWL_Widget::SetWidgetRect(const CFX_RectF &rect) +{ + return ((CFWL_WidgetImp*)m_pData)->SetWidgetRect(rect); +} +FWL_ERR IFWL_Widget::GetClientRect(CFX_RectF &rect) +{ + return ((CFWL_WidgetImp*)m_pData)->GetClientRect(rect); +} +IFWL_Widget* IFWL_Widget::GetParent() +{ + return ((CFWL_WidgetImp*)m_pData)->GetParent(); +} +FWL_ERR IFWL_Widget::SetParent(IFWL_Widget *pParent) +{ + return ((CFWL_WidgetImp*)m_pData)->SetParent(pParent); +} +IFWL_Widget* IFWL_Widget::GetOwner() +{ + return ((CFWL_WidgetImp*)m_pData)->GetOwner(); +} +FWL_ERR IFWL_Widget::SetOwner(IFWL_Widget *pOwner) +{ + return ((CFWL_WidgetImp*)m_pData)->SetOwner(pOwner); +} +IFWL_Widget* IFWL_Widget::GetOuter() +{ + return ((CFWL_WidgetImp*)m_pData)->GetOuter(); +} +FX_DWORD IFWL_Widget::GetStyles() +{ + return ((CFWL_WidgetImp*)m_pData)->GetStyles(); +} +FWL_ERR IFWL_Widget::ModifyStyles(FX_DWORD dwStylesAdded, FX_DWORD dwStylesRemoved) +{ + return ((CFWL_WidgetImp*)m_pData)->ModifyStyles(dwStylesAdded, dwStylesRemoved); +} +FX_DWORD IFWL_Widget::GetStylesEx() +{ + return ((CFWL_WidgetImp*)m_pData)->GetStylesEx(); +} +FWL_ERR IFWL_Widget::ModifyStylesEx(FX_DWORD dwStylesExAdded, FX_DWORD dwStylesExRemoved) +{ + return ((CFWL_WidgetImp*)m_pData)->ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved); +} +FX_DWORD IFWL_Widget::GetStates() +{ + return ((CFWL_WidgetImp*)m_pData)->GetStates(); +} +FWL_ERR IFWL_Widget::SetStates(FX_DWORD dwStates, FX_BOOL bSet ) +{ + return ((CFWL_WidgetImp*)m_pData)->SetStates(dwStates, bSet); +} +FWL_ERR IFWL_Widget::SetPrivateData(FX_LPVOID module_id, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback) +{ + return ((CFWL_WidgetImp*)m_pData)->SetPrivateData(module_id, pData, callback); +} +FX_LPVOID IFWL_Widget::GetPrivateData(FX_LPVOID module_id) +{ + return ((CFWL_WidgetImp*)m_pData)->GetPrivateData(module_id); +} +FWL_ERR IFWL_Widget::Update() +{ + return ((CFWL_WidgetImp*)m_pData)->Update(); +} +FWL_ERR IFWL_Widget::LockUpdate() +{ + return ((CFWL_WidgetImp*)m_pData)->LockUpdate(); +} +FWL_ERR IFWL_Widget::UnlockUpdate() +{ + return ((CFWL_WidgetImp*)m_pData)->UnlockUpdate(); +} +FX_DWORD IFWL_Widget::HitTest(FX_FLOAT fx, FX_FLOAT fy) +{ + return ((CFWL_WidgetImp*)m_pData)->HitTest(fx, fy); +} +FWL_ERR IFWL_Widget::TransformTo(IFWL_Widget *pWidget, FX_FLOAT &fx, FX_FLOAT &fy) +{ + return ((CFWL_WidgetImp*)m_pData)->TransformTo(pWidget, fx, fy); +} +FWL_ERR IFWL_Widget::TransformTo(IFWL_Widget *pWidget, CFX_RectF &rt) +{ + return ((CFWL_WidgetImp*)m_pData)->TransformTo(pWidget, rt); +} +FWL_ERR IFWL_Widget::GetMatrix(CFX_Matrix &matrix, FX_BOOL bGlobal ) +{ + return ((CFWL_WidgetImp*)m_pData)->GetMatrix(matrix, bGlobal); +} +FWL_ERR IFWL_Widget::SetMatrix(const CFX_Matrix &matrix) +{ + return ((CFWL_WidgetImp*)m_pData)->SetMatrix(matrix); +} +FWL_ERR IFWL_Widget::DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + return ((CFWL_WidgetImp*)m_pData)->DrawWidget(pGraphics, pMatrix); +} +IFWL_ThemeProvider* IFWL_Widget::GetThemeProvider() +{ + return ((CFWL_WidgetImp*)m_pData)->GetThemeProvider(); +} +FWL_ERR IFWL_Widget::SetThemeProvider(IFWL_ThemeProvider *pThemeProvider) +{ + return ((CFWL_WidgetImp*)m_pData)->SetThemeProvider(pThemeProvider); +} +FWL_ERR IFWL_Widget::SetDataProvider(IFWL_DataProvider *pDataProvider) +{ + return ((CFWL_WidgetImp*)m_pData)->SetDataProvider(pDataProvider); +} +IFWL_WidgetDelegate* IFWL_Widget::SetDelegate(IFWL_WidgetDelegate *pDelegate) +{ + return ((CFWL_WidgetImp*)m_pData)->SetDelegate(pDelegate); +} +IFWL_NoteThread* IFWL_Widget::GetOwnerThread() const +{ + return ((CFWL_WidgetImp*)m_pData)->GetOwnerThread(); +} +CFX_SizeF IFWL_Widget::GetOffsetFromParent(IFWL_Widget *pParent) +{ + return ((CFWL_WidgetImp*)m_pData)->GetOffsetFromParent(pParent); +} +FWL_ERR CFWL_WidgetImp::Initialize() +{ + IFWL_App *pApp = FWL_GetApp(); + _FWL_RETURN_VALUE_IF_FAIL(pApp, FWL_ERR_Indefinite); + IFWL_AdapterNative *pAdapter = pApp->GetAdapterNative(); + _FWL_RETURN_VALUE_IF_FAIL(pAdapter, FWL_ERR_Indefinite); + IFWL_AdapterThreadMgr *pAdapterThread = pAdapter->GetThreadMgr(); + _FWL_RETURN_VALUE_IF_FAIL(pAdapterThread, FWL_ERR_Indefinite); + SetOwnerThread((CFWL_NoteThread*)pAdapterThread->GetCurrentThread()); + IFWL_Widget *pParent = m_pProperties->m_pParent; + m_pWidgetMgr->InsertWidget(pParent, m_pInterface); + if (!IsChild()) { + { + IFWL_Widget *pOwner = m_pProperties->m_pOwner; + if (pOwner) { + m_pWidgetMgr->SetOwner(pOwner, m_pInterface); + } + } + m_pWidgetMgr->CreateWidget_Native(m_pInterface); + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_WidgetImp::Finalize() +{ + NotifyDriver(); + IFWL_Form *pForm = (IFWL_Form *)FWL_GetWidgetMgr()->GetWidget(m_pInterface, FWL_WGTRELATION_SystemForm); + if (pForm && pForm != m_pInterface) { + IFWL_Content *pContent = pForm->GetContent(); + if (pContent) { + pContent->RemoveWidget(m_pInterface); + } + } + if (!IsChild()) { + m_pWidgetMgr->DestroyWidget_Native(m_pInterface); + } + m_pWidgetMgr->RemoveWidget(m_pInterface); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_WidgetImp::GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize ) +{ + if (bAutoSize) { + if (HasEdge()) { + FX_FLOAT fEdge = GetEdgeWidth(); + rect.Inflate(fEdge, fEdge); + } + if (HasBorder()) { + FX_FLOAT fBorder = GetBorderSize(); + rect.Inflate(fBorder, fBorder); + } + } else { + rect = m_pProperties->m_rtWidget; + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_WidgetImp::GetGlobalRect(CFX_RectF &rect) +{ + IFWL_Widget *pForm = m_pWidgetMgr->GetWidget(m_pInterface, FWL_WGTRELATION_SystemForm); + _FWL_RETURN_VALUE_IF_FAIL(pForm, FWL_ERR_Indefinite); + rect.Set(0, 0, m_pProperties->m_rtWidget.width, m_pProperties->m_rtWidget.height); + if (pForm == m_pInterface) { + return FWL_ERR_Succeeded; + } + return TransformTo(pForm, rect); +} +FWL_ERR CFWL_WidgetImp::SetWidgetRect(const CFX_RectF &rect) +{ + CFX_RectF rtOld = m_pProperties->m_rtWidget; + m_pProperties->m_rtWidget = rect; + if (IsChild()) { + if (FXSYS_fabs(rtOld.width - rect.width) > 0.5f || FXSYS_fabs(rtOld.height - rect.height) > 0.5f) { + CFWL_EvtSizeChanged ev; + ev.m_pSrcTarget = m_pInterface; + ev.m_rtOld = rtOld; + ev.m_rtNew = rect; + IFWL_WidgetDelegate *pDelegate = SetDelegate(NULL); + if (pDelegate) { + pDelegate->OnProcessEvent(&ev); + } + } + return FWL_ERR_Succeeded; + } + m_pWidgetMgr->SetWidgetRect_Native(m_pInterface, rect); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_WidgetImp::GetClientRect(CFX_RectF &rect) +{ + GetEdgeRect(rect); + if (HasEdge()) { + FX_FLOAT fEdge = GetEdgeWidth(); + rect.Deflate(fEdge, fEdge); + } + return FWL_ERR_Succeeded; +} +IFWL_Widget* CFWL_WidgetImp::GetParent() +{ + return m_pWidgetMgr->GetWidget(m_pInterface, FWL_WGTRELATION_Parent); +} +FWL_ERR CFWL_WidgetImp::SetParent(IFWL_Widget* pParent) +{ + m_pProperties->m_pParent = pParent; + m_pWidgetMgr->SetParent(pParent, m_pInterface); + return FWL_ERR_Succeeded; +} +IFWL_Widget* CFWL_WidgetImp::GetOwner() +{ + return m_pWidgetMgr->GetWidget(m_pInterface, FWL_WGTRELATION_Owner); +} +FWL_ERR CFWL_WidgetImp::SetOwner(IFWL_Widget* pOwner) +{ + m_pProperties->m_pOwner = pOwner; + m_pWidgetMgr->SetOwner(pOwner, m_pInterface); + return FWL_ERR_Succeeded; +} +IFWL_Widget* CFWL_WidgetImp::GetOuter() +{ + return m_pOuter; +} +FX_DWORD CFWL_WidgetImp::GetStyles() +{ + return m_pProperties->m_dwStyles; +} +FWL_ERR CFWL_WidgetImp::ModifyStyles(FX_DWORD dwStylesAdded, FX_DWORD dwStylesRemoved) +{ + m_pProperties->m_dwStyles = (m_pProperties->m_dwStyles & ~dwStylesRemoved) | dwStylesAdded; + return FWL_ERR_Succeeded; +} +FX_DWORD CFWL_WidgetImp::GetStylesEx() +{ + return m_pProperties->m_dwStyleExes; +} +FWL_ERR CFWL_WidgetImp::ModifyStylesEx(FX_DWORD dwStylesExAdded, FX_DWORD dwStylesExRemoved) +{ + m_pProperties->m_dwStyleExes = (m_pProperties->m_dwStyleExes & ~dwStylesExRemoved) | dwStylesExAdded; + return FWL_ERR_Succeeded; +} +FX_DWORD CFWL_WidgetImp::GetStates() +{ + return m_pProperties->m_dwStates; +} +static void NotifyHideChildWidget(IFWL_WidgetMgr *widgetMgr, IFWL_Widget *widget, CFWL_NoteDriver *noteDriver) +{ + IFWL_Widget *child = widgetMgr->GetWidget(widget, FWL_WGTRELATION_FirstChild); + while (child) { + noteDriver->NotifyTargetHide(child); + NotifyHideChildWidget(widgetMgr, child, noteDriver); + child = widgetMgr->GetWidget(child, FWL_WGTRELATION_NextSibling); + } +} +FWL_ERR CFWL_WidgetImp::SetStates(FX_DWORD dwStates, FX_BOOL bSet ) +{ + bSet ? (m_pProperties->m_dwStates |= dwStates) : (m_pProperties->m_dwStates &= ~dwStates); + FWL_ERR ret = FWL_ERR_Succeeded; + if (dwStates & FWL_WGTSTATE_Invisible) { + if (bSet) { + ret = m_pWidgetMgr->HideWidget_Native(m_pInterface); + CFWL_NoteDriver *noteDriver = (CFWL_NoteDriver*)GetOwnerThread()->GetNoteDriver(); + IFWL_WidgetMgr *widgetMgr = FWL_GetWidgetMgr(); + noteDriver->NotifyTargetHide(m_pInterface); + IFWL_Widget *child = widgetMgr->GetWidget(m_pInterface, FWL_WGTRELATION_FirstChild); + while (child) { + noteDriver->NotifyTargetHide(child); + NotifyHideChildWidget(widgetMgr, child, noteDriver); + child = widgetMgr->GetWidget(child, FWL_WGTRELATION_NextSibling); + } + } else { + ret = m_pWidgetMgr->ShowWidget_Native(m_pInterface); + } + } + return ret; +} +FWL_ERR CFWL_WidgetImp::SetPrivateData(FX_LPVOID module_id, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback) +{ + if (!m_pPrivateData) { + m_pPrivateData = new CFX_PrivateData; + } + m_pPrivateData->SetPrivateData(module_id, pData, callback); + return FWL_ERR_Succeeded; +} +FX_LPVOID CFWL_WidgetImp::GetPrivateData(FX_LPVOID module_id) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pPrivateData, NULL); + return m_pPrivateData->GetPrivateData(module_id); +} +FWL_ERR CFWL_WidgetImp::Update() +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_WidgetImp::LockUpdate() +{ + m_iLock++; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_WidgetImp::UnlockUpdate() +{ + if (IsLocked()) { + m_iLock--; + } + return FWL_ERR_Succeeded; +} +FX_DWORD CFWL_WidgetImp::HitTest(FX_FLOAT fx, FX_FLOAT fy) +{ + CFX_RectF rtClient; + GetClientRect(rtClient); + if (rtClient.Contains(fx, fy)) { + return FWL_WGTHITTEST_Client; + } + if (HasEdge()) { + CFX_RectF rtEdge; + GetEdgeRect(rtEdge); + if (rtEdge.Contains(fx, fy)) { + return FWL_WGTHITTEST_Edge; + } + } + if (HasBorder()) { + CFX_RectF rtRelative; + GetRelativeRect(rtRelative); + if (rtRelative.Contains(fx, fy)) { + return FWL_WGTHITTEST_Border; + } + } + return FWL_WGTHITTEST_Unknown; +} +FWL_ERR CFWL_WidgetImp::TransformTo(IFWL_Widget *pWidget, FX_FLOAT &fx, FX_FLOAT &fy) +{ + if (m_pWidgetMgr->IsFormDisabled()) { + CFX_SizeF szOffset; + if (IsParent(pWidget)) { + szOffset = GetOffsetFromParent(pWidget); + } else { + szOffset = ((IFWL_Widget*)pWidget)->GetOffsetFromParent(m_pInterface); + szOffset.x = -szOffset.x; + szOffset.y = -szOffset.y; + } + fx += szOffset.x; + fy += szOffset.y; + return FWL_ERR_Succeeded; + } + CFX_RectF r; + CFX_Matrix m; + IFWL_Widget * parent = GetParent(); + if (parent) { + GetWidgetRect(r); + fx += r.left; + fy += r.top; + GetMatrix(m, TRUE); + m.TransformPoint(fx, fy); + } + IFWL_Widget * form1 = m_pWidgetMgr->GetWidget(m_pInterface, FWL_WGTRELATION_SystemForm); + _FWL_RETURN_VALUE_IF_FAIL(form1, FWL_ERR_Indefinite); + if (!pWidget) { + form1->GetWidgetRect(r); + fx += r.left; + fy += r.top; +#ifdef FWL_UseMacSystemBorder + if (form1->GetStyles() & FWL_WGTSTYLE_Caption) { + FX_FLOAT l, t, r, b; + l = t = r = b = 0; + FWL_GetAdapterWidgetMgr()->GetSystemBorder(l, t, r, b); + fy += t; + } +#endif + return FWL_ERR_Succeeded; + } + IFWL_Widget * form2 = m_pWidgetMgr->GetWidget(pWidget, FWL_WGTRELATION_SystemForm); + _FWL_RETURN_VALUE_IF_FAIL(form2, FWL_ERR_Indefinite); + if (form1 != form2) { + form1->GetWidgetRect(r); + fx += r.left; + fy += r.top; + form2->GetWidgetRect(r); + fx -= r.left; + fy -= r.top; +#ifdef FWL_UseMacSystemBorder + if ((form1->GetStyles() & FWL_WGTSTYLE_Caption) != (form2->GetStyles() & FWL_WGTSTYLE_Caption)) { + FX_FLOAT l, t, r, b; + l = t = r = b = 0; + FWL_GetAdapterWidgetMgr()->GetSystemBorder(l, t, r, b); + (form1->GetStyles() & FWL_WGTSTYLE_Caption) ? (fy += t) : (fy -= t); + } +#endif + } + parent = pWidget->GetParent(); + if (parent) { + pWidget->GetMatrix(m, TRUE); + CFX_Matrix m1; + m1.Reset(); + m1.SetReverse(m); + m1.TransformPoint(fx, fy); + pWidget->GetWidgetRect(r); + fx -= r.left; + fy -= r.top; + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_WidgetImp::TransformTo(IFWL_Widget *pWidget, CFX_RectF &rt) +{ + return TransformTo(pWidget, rt.left, rt.top); +} +FWL_ERR CFWL_WidgetImp::GetMatrix(CFX_Matrix &matrix, FX_BOOL bGlobal ) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pProperties, FWL_ERR_Indefinite); + if (bGlobal) { + IFWL_Widget * parent = GetParent(); + CFX_PtrArray parents; + while (parent) { + parents.Add(parent); + parent = parent->GetParent(); + } + matrix.Reset(); + CFX_Matrix ctmOnParent; + CFX_RectF rect; + FX_INT32 count = parents.GetSize(); + for (FX_INT32 i = count - 2; i >= 0; i--) { + parent = (IFWL_Widget *) parents.GetAt(i); + parent->GetMatrix(ctmOnParent, FALSE); + parent->GetWidgetRect(rect); + matrix.Concat(ctmOnParent, TRUE); + matrix.Translate(rect.left, rect.top, TRUE); + } + matrix.Concat(m_pProperties->m_ctmOnParent, TRUE); + parents.RemoveAll(); + } else { + matrix = m_pProperties->m_ctmOnParent; + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_WidgetImp::SetMatrix(const CFX_Matrix &matrix) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pProperties, FWL_ERR_Indefinite); + IFWL_Widget * parent = GetParent(); + if (!parent) { + return FWL_ERR_Indefinite; + } + m_pProperties->m_ctmOnParent = matrix; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_WidgetImp::DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + return FWL_ERR_Indefinite; +} +IFWL_ThemeProvider* CFWL_WidgetImp::GetThemeProvider() +{ + return m_pProperties->m_pThemeProvider; +} +FWL_ERR CFWL_WidgetImp::SetThemeProvider(IFWL_ThemeProvider *pThemeProvider) +{ + m_pProperties->m_pThemeProvider = pThemeProvider; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_WidgetImp::SetDataProvider(IFWL_DataProvider *pDataProvider) +{ + m_pProperties->m_pDataProvider = pDataProvider; + return FWL_ERR_Succeeded; +} +IFWL_WidgetDelegate* CFWL_WidgetImp::SetDelegate(IFWL_WidgetDelegate *pDelegate) +{ + if (!m_pCurDelegate) { + m_pCurDelegate = m_pDelegate; + } + if (!pDelegate) { + return m_pCurDelegate; + } + IFWL_WidgetDelegate *pOldDelegate = m_pCurDelegate; + m_pCurDelegate = pDelegate; + return pOldDelegate; +} +IFWL_NoteThread* CFWL_WidgetImp::GetOwnerThread() const +{ + return (IFWL_NoteThread*)m_pOwnerThread; +} +FWL_ERR CFWL_WidgetImp::SetOwnerThread(CFWL_NoteThread *pOwnerThread) +{ + m_pOwnerThread = pOwnerThread; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_WidgetImp::GetProperties(CFWL_WidgetImpProperties &properties) +{ + properties = *m_pProperties; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_WidgetImp::SetProperties(const CFWL_WidgetImpProperties &properties) +{ + *m_pProperties = properties; + return FWL_ERR_Succeeded; +} +IFWL_Widget* CFWL_WidgetImp::GetInterface() +{ + return m_pInterface; +} +void CFWL_WidgetImp::SetInterface(IFWL_Widget *pInterface) +{ + m_pInterface = pInterface; +} +CFWL_WidgetImp::CFWL_WidgetImp(IFWL_Widget *pOuter ) + : m_pProperties(NULL) + , m_pPrivateData(NULL) + , m_pDelegate(NULL) + , m_pCurDelegate(NULL) + , m_pOuter(pOuter) + , m_pInterface(NULL) + , m_iLock(0) +{ + m_pProperties = FX_NEW CFWL_WidgetImpProperties; + m_pWidgetMgr = (CFWL_WidgetMgr*)FWL_GetWidgetMgr(); + FXSYS_assert(m_pWidgetMgr != NULL); +} +CFWL_WidgetImp::CFWL_WidgetImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter ) + : m_pProperties(NULL) + , m_pPrivateData(NULL) + , m_pDelegate(NULL) + , m_pCurDelegate(NULL) + , m_pOuter(pOuter) + , m_pInterface(NULL) + , m_iLock(0) +{ + if (!m_pProperties) { + m_pProperties = FX_NEW CFWL_WidgetImpProperties; + } + *m_pProperties = properties; + m_pWidgetMgr = (CFWL_WidgetMgr*)FWL_GetWidgetMgr(); + FXSYS_assert(m_pWidgetMgr != NULL); +} +CFWL_WidgetImp::~CFWL_WidgetImp() +{ + if (m_pPrivateData) { + delete m_pPrivateData; + m_pPrivateData = NULL; + } + if (m_pProperties) { + delete m_pProperties; + m_pProperties = NULL; + } +} +FX_BOOL CFWL_WidgetImp::IsEnabled() +{ + return (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) == 0; +} +FX_BOOL CFWL_WidgetImp::IsVisible() +{ + return (m_pProperties->m_dwStates & FWL_WGTSTATE_Invisible) == 0; +} +FX_BOOL CFWL_WidgetImp::IsActive() +{ + return (m_pProperties->m_dwStates & FWL_WGTSTATE_Deactivated) == 0; +} +FX_BOOL CFWL_WidgetImp::IsOverLapper() +{ + return (m_pProperties->m_dwStyles & FWL_WGTSTYLE_WindowTypeMask) == FWL_WGTSTYLE_OverLapper; +} +FX_BOOL CFWL_WidgetImp::IsPopup() +{ + return m_pProperties->m_dwStyles & FWL_WGTSTYLE_Popup; +} +FX_BOOL CFWL_WidgetImp::IsChild() +{ + return m_pProperties->m_dwStyles & FWL_WGTSTYLE_Child; +} +FX_BOOL CFWL_WidgetImp::IsLocked() +{ + return m_iLock > 0; +} +FX_BOOL CFWL_WidgetImp::IsOffscreen() +{ + return m_pProperties->m_dwStyles & FWL_WGTSTYLE_Offscreen; +} +FX_BOOL CFWL_WidgetImp::HasBorder() +{ + return m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border; +} +FX_BOOL CFWL_WidgetImp::HasEdge() +{ + return m_pProperties->m_dwStyles & FWL_WGTSTYLE_EdgeMask; +} +void CFWL_WidgetImp::GetEdgeRect(CFX_RectF &rtEdge) +{ + rtEdge = m_pProperties->m_rtWidget; + rtEdge.left = rtEdge.top = 0; + if (HasBorder()) { + FX_FLOAT fCX = GetBorderSize(); + FX_FLOAT fCY = GetBorderSize(FALSE); + rtEdge.Deflate(fCX, fCY); + } +} +FX_FLOAT CFWL_WidgetImp::GetBorderSize(FX_BOOL bCX ) +{ + FX_FLOAT *pfBorder = (FX_FLOAT*)GetThemeCapacity(bCX ? FWL_WGTCAPACITY_CXBorder : FWL_WGTCAPACITY_CYBorder); + _FWL_RETURN_VALUE_IF_FAIL(pfBorder, 0); + return *pfBorder; +} +FX_FLOAT CFWL_WidgetImp::GetEdgeWidth() +{ + FX_DWORD dwCapacity = 0; + switch(m_pProperties->m_dwStyles & FWL_WGTSTYLE_EdgeMask) { + case FWL_WGTSTYLE_EdgeFlat: { + dwCapacity = FWL_WGTCAPACITY_EdgeFlat; + break; + } + case FWL_WGTSTYLE_EdgeRaised: { + dwCapacity = FWL_WGTCAPACITY_EdgeRaised; + break; + } + case FWL_WGTSTYLE_EdgeSunken: { + dwCapacity = FWL_WGTCAPACITY_EdgeSunken; + break; + } + } + if (dwCapacity > 0) { + FX_FLOAT *fRet = (FX_FLOAT*)GetThemeCapacity(dwCapacity); + _FWL_RETURN_VALUE_IF_FAIL(fRet, 0); + return *fRet; + } + return 0; +} +void CFWL_WidgetImp::GetRelativeRect(CFX_RectF &rect) +{ + rect = m_pProperties->m_rtWidget; + rect.left = rect.top = 0; +} +FX_LPVOID CFWL_WidgetImp::GetThemeCapacity(FX_DWORD dwCapacity) +{ + IFWL_ThemeProvider *pTheme = GetAvailableTheme(); + _FWL_RETURN_VALUE_IF_FAIL(pTheme, NULL); + CFWL_ThemePart part; + part.m_pWidget = m_pInterface; + return pTheme->GetCapacity(&part, dwCapacity); +} +IFWL_ThemeProvider* CFWL_WidgetImp::GetAvailableTheme() +{ + if (m_pProperties->m_pThemeProvider) { + return m_pProperties->m_pThemeProvider; + } + IFWL_Widget *pUp = m_pInterface; + do { + FWL_WGTRELATION relation = (pUp->GetStyles() & FWL_WGTSTYLE_Popup) + ? FWL_WGTRELATION_Owner : FWL_WGTRELATION_Parent; + pUp = m_pWidgetMgr->GetWidget(pUp, relation); + if (pUp) { + IFWL_ThemeProvider *pRet = pUp->GetThemeProvider(); + if (pRet && pRet->IsValidWidget(m_pInterface)) { + return pRet; + } + } + } while (pUp); + return ((CFWL_AppImp*)FWL_GetApp())->GetThemeProvider(); +} +CFWL_WidgetImp* CFWL_WidgetImp::GetRootOuter() +{ + IFWL_Widget *pRet = m_pOuter; + IFWL_Widget *pOuter = pRet; + while (pOuter) { + pRet = pOuter; + pOuter = pOuter->GetOuter(); + } + return (CFWL_WidgetImp*)pRet; +} +CFWL_WidgetImp* CFWL_WidgetImp::GetSameAncestor(CFWL_WidgetImp *pWidget) +{ + CFX_PtrArray arr1, arr2; + CFWL_WidgetImp *pAncestor = pWidget; + FWL_WGTRELATION relation; + do { + arr1.Add(pAncestor); + relation = pAncestor->IsPopup() ? FWL_WGTRELATION_Owner : FWL_WGTRELATION_Parent; + } while ((pAncestor = (CFWL_WidgetImp*)m_pWidgetMgr->GetWidget(pAncestor->m_pInterface, relation)) != NULL); + pAncestor = this; + do { + arr2.Add(pAncestor); + relation = pAncestor->IsPopup() ? FWL_WGTRELATION_Owner : FWL_WGTRELATION_Parent; + } while ((pAncestor = (CFWL_WidgetImp*)m_pWidgetMgr->GetWidget(pAncestor->m_pInterface, relation)) != NULL); + for (FX_INT32 i = 0; i < arr1.GetSize(); i ++) { + FX_LPVOID pVoid = arr1[i]; + if (arr2.Find(pVoid) < 0) { + continue; + } else { + return (CFWL_WidgetImp*)pVoid; + } + } + return NULL; +} +CFX_SizeF CFWL_WidgetImp::GetOffsetFromAncestor(CFWL_WidgetImp *pAncestor) +{ + CFX_SizeF szRet; + szRet.Set(0, 0); + if (pAncestor == this) { + return szRet; + } + CFWL_WidgetImp *pWidget = this; + do { + CFX_RectF rect; + pWidget->GetWidgetRect(rect); + szRet.x += rect.left; + szRet.y += rect.top; + FWL_WGTRELATION relation = pWidget->IsPopup() ? FWL_WGTRELATION_Owner : FWL_WGTRELATION_Parent; + pWidget = (CFWL_WidgetImp*)m_pWidgetMgr->GetWidget((IFWL_Widget*)pWidget, relation); + } while(pWidget && pWidget != pAncestor); + return szRet; +} +FX_BOOL CFWL_WidgetImp::TransformToOuter(FX_FLOAT &fx, FX_FLOAT &fy) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pOuter, FALSE); + fx += m_pProperties->m_rtWidget.left; + fx += m_pProperties->m_rtWidget.top; + return TRUE; +} +FX_BOOL CFWL_WidgetImp::TransformFromOuter(FX_FLOAT &fx, FX_FLOAT &fy) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pOuter, FALSE); + CFX_RectF rect; + m_pOuter->GetWidgetRect(rect); + fx -= rect.left; + fx -= rect.top; + return TRUE; +} +#define FWL_WGT_CalcHeight 2048 +#define FWL_WGT_CalcWidth 2048 +#define FWL_WGT_CalcMultiLineDefWidth 120.0f +CFX_SizeF CFWL_WidgetImp::CalcTextSize(const CFX_WideString &wsText, IFWL_ThemeProvider *pTheme, FX_BOOL bMultiLine , FX_INT32 iLineWidth ) +{ + CFX_SizeF sz; + sz.Set(0, 0); + _FWL_RETURN_VALUE_IF_FAIL(pTheme, sz); + CFWL_ThemeText calPart; + calPart.m_pWidget = m_pInterface; + calPart.m_wsText = wsText; + calPart.m_dwTTOStyles = bMultiLine ? FDE_TTOSTYLE_LineWrap : FDE_TTOSTYLE_SingleLine; + calPart.m_iTTOAlign = FDE_TTOALIGNMENT_TopLeft; + CFX_RectF rect; + FX_FLOAT fWidth = bMultiLine ? + (iLineWidth > 0 ? (FX_FLOAT)iLineWidth : FWL_WGT_CalcMultiLineDefWidth) : + FWL_WGT_CalcWidth; + rect.Set(0, 0, fWidth, FWL_WGT_CalcHeight); + pTheme->CalcTextRect(&calPart, rect); + sz.x = rect.width; + sz.y = rect.height; + return sz; +} +void CFWL_WidgetImp::CalcTextRect(const CFX_WideString &wsText, IFWL_ThemeProvider *pTheme, FX_DWORD dwTTOStyles, FX_INT32 iTTOAlign, CFX_RectF &rect) +{ + CFWL_ThemeText calPart; + calPart.m_pWidget = m_pInterface; + calPart.m_wsText = wsText; + calPart.m_dwTTOStyles = dwTTOStyles; + calPart.m_iTTOAlign = iTTOAlign; + pTheme->CalcTextRect(&calPart, rect); +} +void CFWL_WidgetImp::SetFocus(FX_BOOL bFocus) +{ + if (m_pWidgetMgr->IsFormDisabled()) { + return; + } + IFWL_NoteThread *pThread = GetOwnerThread(); + _FWL_RETURN_IF_FAIL(pThread); + IFWL_NoteDriver *pDriver = pThread->GetNoteDriver(); + _FWL_RETURN_IF_FAIL(pDriver); + IFWL_Widget *curFocus = ((CFWL_NoteDriver*)pDriver)->GetFocus(); + if (bFocus && curFocus != m_pInterface) { + pDriver->SetFocus(m_pInterface); + } else if (!bFocus && curFocus == m_pInterface) { + pDriver->SetFocus(NULL); + } +} +void CFWL_WidgetImp::SetGrab(FX_BOOL bSet) +{ + IFWL_NoteThread *pThread = GetOwnerThread(); + _FWL_RETURN_IF_FAIL(pThread); + CFWL_NoteDriver *pDriver = (CFWL_NoteDriver*)pThread->GetNoteDriver(); + pDriver->SetGrab(m_pInterface, bSet); +} +FX_BOOL CFWL_WidgetImp::GetPopupPos(FX_FLOAT fMinHeight, FX_FLOAT fMaxHeight, const CFX_RectF &rtAnchor, CFX_RectF &rtPopup) +{ + if (GetClassID() == FWL_CLASSHASH_Menu) { + return GetPopupPosMenu(fMinHeight, fMaxHeight, rtAnchor, rtPopup); + } else { + if (GetClassID() == FWL_CLASSHASH_ComboBox) { + if (m_pWidgetMgr->IsFormDisabled()) { + return m_pWidgetMgr->GetAdapterPopupPos(m_pInterface, fMinHeight, fMaxHeight, rtAnchor, rtPopup); + } else { + return GetPopupPosComboBox(fMinHeight, fMaxHeight, rtAnchor, rtPopup); + } + } else if (GetClassID() == FWL_CLASSHASH_DateTimePicker && m_pWidgetMgr->IsFormDisabled()) { + return m_pWidgetMgr->GetAdapterPopupPos(m_pInterface, fMinHeight, fMaxHeight, rtAnchor, rtPopup); + } else { + return GetPopupPosGeneral(fMinHeight, fMaxHeight, rtAnchor, rtPopup); + } + } + return FALSE; +} +FX_BOOL CFWL_WidgetImp::GetPopupPosMenu(FX_FLOAT fMinHeight, FX_FLOAT fMaxHeight, const CFX_RectF &rtAnchor, CFX_RectF &rtPopup) +{ + FX_FLOAT fx = 0; + FX_FLOAT fy = 0; + FX_FLOAT fScreenWidth = 0; + FX_FLOAT fScreenHeight = 0; + GetScreenSize(fScreenWidth, fScreenHeight); + if (GetStylesEx() & FWL_STYLEEXT_MNU_Vert) { + FX_BOOL bLeft = m_pProperties->m_rtWidget.left < 0; + FX_FLOAT fRight = rtAnchor.right() + rtPopup.width; + TransformTo(NULL, fx, fy); + if (fRight + fx > fScreenWidth || bLeft) { + rtPopup.Set(rtAnchor.left - rtPopup.width, rtAnchor.top, rtPopup.width, rtPopup.height); + } else { + rtPopup.Set(rtAnchor.right(), rtAnchor.top, rtPopup.width, rtPopup.height); + } + } else { + FX_FLOAT fBottom = rtAnchor.bottom() + rtPopup.height; + TransformTo(NULL, fx, fy); + if (fBottom + fy > fScreenHeight) { + rtPopup.Set(rtAnchor.left, rtAnchor.top - rtPopup.height, rtPopup.width, rtPopup.height); + } else { + rtPopup.Set(rtAnchor.left, rtAnchor.bottom(), rtPopup.width, rtPopup.height); + } + } + rtPopup.Offset(fx, fy); + return TRUE; +} +FX_BOOL CFWL_WidgetImp::GetPopupPosComboBox(FX_FLOAT fMinHeight, FX_FLOAT fMaxHeight, const CFX_RectF &rtAnchor, CFX_RectF &rtPopup) +{ + FX_FLOAT fx = 0; + FX_FLOAT fy = 0; + FX_FLOAT fScreenWidth = 0; + FX_FLOAT fScreenHeight = 0; + GetScreenSize(fScreenWidth, fScreenHeight); + FX_FLOAT fPopHeight = rtPopup.height; + if (rtPopup.height > fMaxHeight) { + fPopHeight = fMaxHeight; + } else if (rtPopup.height < fMinHeight) { + fPopHeight = fMinHeight; + } + FX_FLOAT fWidth = FX_MAX(rtAnchor.width, rtPopup.width); + FX_FLOAT fBottom = rtAnchor.bottom() + fPopHeight; + TransformTo(NULL, fx, fy); + if (fBottom + fy > fScreenHeight) { + rtPopup.Set(rtAnchor.left, rtAnchor.top - fPopHeight, fWidth, fPopHeight); + } else { + rtPopup.Set(rtAnchor.left, rtAnchor.bottom(), fWidth, fPopHeight); + } + rtPopup.Offset(fx, fy); + return TRUE; +} +FX_BOOL CFWL_WidgetImp::GetPopupPosGeneral(FX_FLOAT fMinHeight, FX_FLOAT fMaxHeight, const CFX_RectF &rtAnchor, CFX_RectF &rtPopup) +{ + FX_FLOAT fx = 0; + FX_FLOAT fy = 0; + FX_FLOAT fScreenWidth = 0; + FX_FLOAT fScreenHeight = 0; + GetScreenSize(fScreenWidth, fScreenHeight); + TransformTo(NULL, fx, fy); + if (rtAnchor.bottom() + fy > fScreenHeight) { + rtPopup.Set(rtAnchor.left, rtAnchor.top - rtPopup.height, rtPopup.width, rtPopup.height); + } else { + rtPopup.Set(rtAnchor.left, rtAnchor.bottom(), rtPopup.width, rtPopup.height); + } + rtPopup.Offset(fx, fy); + return TRUE; +} +FX_BOOL CFWL_WidgetImp::GetScreenSize(FX_FLOAT &fx, FX_FLOAT &fy) +{ + IFWL_AdapterNative *pNative = FWL_GetAdapterNative(); + IFWL_AdapterMonitorMgr *pMonitorMgr = pNative->GetMonitorMgr(); + _FWL_RETURN_VALUE_IF_FAIL(pMonitorMgr, FALSE); + FWL_HMONITOR hMonitor = pMonitorMgr->GetMonitorByPoint(fx, fy); + pMonitorMgr->GetMonitorSize(hMonitor, fx, fy); + return TRUE; +} +void CFWL_WidgetImp::RegisterEventTarget(IFWL_Widget *pEventSource , FX_DWORD dwFilter ) +{ + IFWL_NoteThread *pThread = GetOwnerThread(); + _FWL_RETURN_IF_FAIL(pThread); + IFWL_NoteDriver *pNoteDriver = pThread->GetNoteDriver(); + _FWL_RETURN_IF_FAIL(pNoteDriver); + pNoteDriver->RegisterEventTarget(m_pInterface, pEventSource, dwFilter); +} +void CFWL_WidgetImp::UnregisterEventTarget() +{ + IFWL_NoteThread *pThread = GetOwnerThread(); + _FWL_RETURN_IF_FAIL(pThread); + IFWL_NoteDriver *pNoteDriver = pThread->GetNoteDriver(); + _FWL_RETURN_IF_FAIL(pNoteDriver); + pNoteDriver->UnregisterEventTarget(m_pInterface); +} +void CFWL_WidgetImp::DispatchKeyEvent(CFWL_MsgKey *pNote) +{ + _FWL_RETURN_IF_FAIL(pNote); + CFWL_MsgKey *pEvent = (CFWL_MsgKey*)pNote->CloneToEvent(); + pEvent->m_pSrcTarget = m_pInterface; + pEvent->m_dwCmd = pNote->m_dwCmd; + pEvent->m_dwKeyCode = pNote->m_dwKeyCode; + pEvent->m_dwFlags = pNote->m_dwFlags; + DispatchEvent((CFWL_Event*)pEvent); + pEvent->Release(); +} +void CFWL_WidgetImp::DispatchEvent(CFWL_Event *pEvent) +{ + if (m_pOuter) { + IFWL_WidgetDelegate *pDelegate = m_pOuter->SetDelegate(NULL); + pDelegate->OnProcessEvent(pEvent); + return; + } + IFWL_NoteThread *pThread = GetOwnerThread(); + _FWL_RETURN_IF_FAIL(pThread); + IFWL_NoteDriver *pNoteDriver = pThread->GetNoteDriver(); + _FWL_RETURN_IF_FAIL(pNoteDriver); + pNoteDriver->SendNote(pEvent); +} +void CFWL_WidgetImp::Repaint(const CFX_RectF *pRect ) +{ + if (pRect) { + m_pWidgetMgr->RepaintWidget(m_pInterface, pRect); + return ; + } + CFX_RectF rect; + rect = m_pProperties->m_rtWidget; + rect.left = rect.top = 0; + m_pWidgetMgr->RepaintWidget(m_pInterface, &rect); +} +void CFWL_WidgetImp::DrawBackground(CFX_Graphics *pGraphics, + FX_INT32 iPartBk, + IFWL_ThemeProvider *pTheme, + const CFX_Matrix *pMatrix ) +{ + CFX_RectF rtRelative; + GetRelativeRect(rtRelative); + CFWL_ThemeBackground param; + param.m_pWidget = m_pInterface; + param.m_iPart = iPartBk; + param.m_pGraphics = pGraphics; + if (pMatrix) { + param.m_matrix.Concat(*pMatrix, TRUE); + } + param.m_rtPart = rtRelative; + pTheme->DrawBackground(¶m); +} +void CFWL_WidgetImp::DrawBorder(CFX_Graphics *pGraphics, + FX_INT32 iPartBorder, + IFWL_ThemeProvider *pTheme, + const CFX_Matrix *pMatrix ) +{ + CFX_RectF rtRelative; + GetRelativeRect(rtRelative); + CFWL_ThemeBackground param; + param.m_pWidget = m_pInterface; + param.m_iPart = iPartBorder; + param.m_pGraphics = pGraphics; + if (pMatrix) { + param.m_matrix.Concat(*pMatrix, TRUE); + } + param.m_rtPart = rtRelative; + pTheme->DrawBackground(¶m); +} +void CFWL_WidgetImp::DrawEdge(CFX_Graphics *pGraphics, + FX_INT32 iPartEdge, + IFWL_ThemeProvider *pTheme, + const CFX_Matrix *pMatrix ) +{ + CFX_RectF rtEdge; + GetEdgeRect(rtEdge); + CFWL_ThemeBackground param; + param.m_pWidget = m_pInterface; + param.m_iPart = iPartEdge; + param.m_pGraphics = pGraphics; + if (pMatrix) { + param.m_matrix.Concat(*pMatrix, TRUE); + } + param.m_rtPart = rtEdge; + pTheme->DrawBackground(¶m); +} +void CFWL_WidgetImp::NotifyDriver() +{ + IFWL_NoteThread *pThread = GetOwnerThread(); + _FWL_RETURN_IF_FAIL(pThread); + CFWL_NoteDriver *pDriver = (CFWL_NoteDriver*)pThread->GetNoteDriver(); + _FWL_RETURN_IF_FAIL(pDriver); + pDriver->NotifyTargetDestroy(m_pInterface); +} +CFX_SizeF CFWL_WidgetImp::GetOffsetFromParent(IFWL_Widget *pParent) +{ + CFX_SizeF szRet; + szRet.Set(0, 0); + if (pParent == (IFWL_Widget*)this) { + return szRet; + } + IFWL_WidgetMgr *pWidgetMgr = FWL_GetWidgetMgr(); + _FWL_RETURN_VALUE_IF_FAIL(pWidgetMgr, szRet); + szRet.x += m_pProperties->m_rtWidget.left; + szRet.y += m_pProperties->m_rtWidget.top; + IFWL_Widget *pDstWidget = GetParent(); + while (pDstWidget && pDstWidget != pParent) { + CFX_RectF rtDst; + pDstWidget->GetWidgetRect(rtDst); + szRet.x += rtDst.left; + szRet.y += rtDst.top; + pDstWidget = pWidgetMgr->GetWidget(pDstWidget, FWL_WGTRELATION_Parent); + } + return szRet; +} +FX_BOOL CFWL_WidgetImp::IsParent(IFWL_Widget *pParent) +{ + if (pParent == (IFWL_Widget*)this) { + return FALSE; + } + IFWL_Widget *pUpWidget = GetParent(); + while (pUpWidget) { + if (pUpWidget == pParent) { + return TRUE; + } + pUpWidget = pUpWidget->GetParent(); + } + return FALSE; +} +CFWL_WidgetImpDelegate::CFWL_WidgetImpDelegate() +{ +} +FX_INT32 CFWL_WidgetImpDelegate::OnProcessMessage(CFWL_Message *pMessage) +{ + _FWL_RETURN_VALUE_IF_FAIL(pMessage->m_pDstTarget, 0); + CFWL_WidgetImp *pWidget = (CFWL_WidgetImp*)((IFWL_TargetData*)pMessage->m_pDstTarget)->GetData(); + FX_DWORD dwMsgCode = pMessage->GetClassID(); + switch (dwMsgCode) { + case FWL_MSGHASH_Mouse: { + CFWL_EvtMouse evt; + evt.m_pSrcTarget = pWidget->m_pInterface; + evt.m_pDstTarget = pWidget->m_pInterface; + evt.m_dwCmd = ((CFWL_MsgMouse*)pMessage)->m_dwCmd; + evt.m_dwFlags = ((CFWL_MsgMouse*)pMessage)->m_dwFlags; + evt.m_fx = ((CFWL_MsgMouse*)pMessage)->m_fx; + evt.m_fy = ((CFWL_MsgMouse*)pMessage)->m_fy; + pWidget->DispatchEvent(&evt); + break; + } + case FWL_MSGHASH_MouseWheel: { + CFWL_EvtMouseWheel evt; + evt.m_pSrcTarget = pWidget->m_pInterface; + evt.m_pDstTarget = pWidget->m_pInterface; + evt.m_dwFlags = ((CFWL_MsgMouseWheel*)pMessage)->m_dwFlags; + evt.m_fDeltaX = ((CFWL_MsgMouseWheel*)pMessage)->m_fDeltaX; + evt.m_fDeltaY = ((CFWL_MsgMouseWheel*)pMessage)->m_fDeltaY; + evt.m_fx = ((CFWL_MsgMouseWheel*)pMessage)->m_fx; + evt.m_fy = ((CFWL_MsgMouseWheel*)pMessage)->m_fy; + pWidget->DispatchEvent(&evt); + break; + } + case FWL_MSGHASH_Key: { + CFWL_EvtKey evt; + evt.m_pSrcTarget = pWidget->m_pInterface;; + evt.m_pDstTarget = pWidget->m_pInterface;; + evt.m_dwKeyCode = ((CFWL_MsgKey*)pMessage)->m_dwKeyCode; + evt.m_dwFlags = ((CFWL_MsgKey*)pMessage)->m_dwFlags; + evt.m_dwCmd = ((CFWL_MsgKey*)pMessage)->m_dwCmd; + pWidget->DispatchEvent(&evt); + break; + } + case FWL_MSGHASH_SetFocus: { + CFWL_EvtSetFocus evt; + evt.m_pSrcTarget = ((CFWL_MsgSetFocus*)pMessage)->m_pDstTarget; + evt.m_pDstTarget = ((CFWL_MsgSetFocus*)pMessage)->m_pDstTarget; + evt.m_pSetFocus = pWidget->m_pInterface; + pWidget->DispatchEvent(&evt); + break; + } + case FWL_MSGHASH_KillFocus: { + CFWL_EvtKillFocus evt; + evt.m_pSrcTarget = ((CFWL_MsgKillFocus*)pMessage)->m_pDstTarget; + evt.m_pDstTarget = ((CFWL_MsgKillFocus*)pMessage)->m_pDstTarget; + evt.m_pKillFocus = pWidget->m_pInterface; + pWidget->DispatchEvent(&evt); + break; + } + default: { + } + } + return 1; +} +FWL_ERR CFWL_WidgetImpDelegate::OnProcessEvent(CFWL_Event *pEvent) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_WidgetImpDelegate::OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + CFWL_EvtDraw evt; + evt.m_pGraphics = pGraphics; + return FWL_ERR_Succeeded; +} +class CFWL_Custom : public CFWL_WidgetImp +{ +public: + CFWL_Custom(IFWL_Widget *pOuter = NULL); + CFWL_Custom(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter = NULL); + virtual FWL_ERR GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize = FALSE); + virtual FWL_ERR Update(); + virtual FWL_ERR SetProxy(IFWL_Proxy *pProxy); +protected: + IFWL_Proxy *m_pProxy; +}; +CFWL_Custom::CFWL_Custom(IFWL_Widget *pOuter ) + : CFWL_WidgetImp(pOuter) + , m_pProxy(NULL) +{ +} +CFWL_Custom::CFWL_Custom(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter ) + : CFWL_WidgetImp(properties, pOuter) + , m_pProxy(NULL) +{ +} +FWL_ERR CFWL_Custom::GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize ) +{ + if (m_pProxy && (m_pProxy->GetWidgetRect(rect, bAutoSize) == FWL_ERR_Succeeded)) { + return FWL_ERR_Succeeded; + } + return CFWL_WidgetImp::GetWidgetRect(rect, bAutoSize); +} +FWL_ERR CFWL_Custom::Update() +{ + if (m_pProxy) { + return m_pProxy->Update(); + } + return CFWL_WidgetImp::Update(); +} +FWL_ERR CFWL_Custom::SetProxy(IFWL_Proxy *pProxy) +{ + m_pProxy = pProxy; + return FWL_ERR_Succeeded; +} +IFWL_Custom* IFWL_Custom::Create() +{ + return new IFWL_Custom; +} +IFWL_Custom::IFWL_Custom() +{ + m_pData = NULL; +} +IFWL_Custom::~IFWL_Custom() +{ + if (m_pData) { + delete (CFWL_Custom*)m_pData; + m_pData = NULL; + } +} +FWL_ERR IFWL_Custom::Initialize(IFWL_Widget *pOuter ) +{ + m_pData = FX_NEW CFWL_Custom(pOuter); + ((CFWL_Custom*)m_pData)->SetInterface(this); + return ((CFWL_Custom*)m_pData)->Initialize(); +} +FWL_ERR IFWL_Custom::Initialize(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter ) +{ + m_pData = FX_NEW CFWL_Custom(properties, pOuter); + ((CFWL_Custom*)m_pData)->SetInterface(this); + return ((CFWL_Custom*)m_pData)->Initialize(); +} +FWL_ERR IFWL_Custom::SetProxy(IFWL_Proxy *pProxy) +{ + return ((CFWL_Custom*)m_pData)->SetProxy(pProxy); +} +void FWL_SetWidgetRect(IFWL_Widget *widget, const CFX_RectF &rect) +{ + ((CFWL_WidgetImp*)((IFWL_TargetData*)widget)->GetData())->m_pProperties->m_rtWidget = rect; +} +void FWL_SetWidgetStates(IFWL_Widget *widget, FX_DWORD dwStates) +{ + ((CFWL_WidgetImp*)((IFWL_TargetData*)widget)->GetData())->m_pProperties->m_dwStates = dwStates; +} +void FWL_SetWidgetStyles(IFWL_Widget *widget, FX_DWORD dwStyles) +{ + ((CFWL_WidgetImp*)((IFWL_TargetData*)widget)->GetData())->m_pProperties->m_dwStyles = dwStyles; +} +FWL_ERR FWL_EnabelWidget(IFWL_Widget *widget, FX_BOOL bEnable) +{ + widget->SetStates(FWL_WGTSTATE_Disabled, !bEnable); + IFWL_WidgetMgr *widgetMgr = FWL_GetWidgetMgr(); + IFWL_Widget *child = widgetMgr->GetWidget(widget, FWL_WGTRELATION_FirstChild); + while (child) { + FWL_EnabelWidget(child, bEnable); + child = widgetMgr->GetWidget(child, FWL_WGTRELATION_NextSibling); + } + return FWL_ERR_Succeeded; +} diff --git a/xfa/src/fwl/src/core/fwl_widgetmgrimp.cpp b/xfa/src/fwl/src/core/fwl_widgetmgrimp.cpp new file mode 100644 index 0000000000..b5e2547722 --- /dev/null +++ b/xfa/src/fwl/src/core/fwl_widgetmgrimp.cpp @@ -0,0 +1,1054 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "include/fwl_targetimp.h" +#include "include/fwl_noteimp.h" +#include "include/fwl_widgetmgrimp.h" +#include "include/fwl_threadimp.h" +#include "include/fwl_appimp.h" +#define FWL_NORMALMATRIX +FX_BOOL FWL_UseOffscreen(IFWL_Widget * pWidget) +{ +#if (_FX_OS_==_FX_MACOSX_) + return FALSE; +#else + return pWidget->GetStyles() & FWL_WGTSTYLE_Offscreen; +#endif +} +IFWL_WidgetMgr* FWL_GetWidgetMgr() +{ + IFWL_App *pApp = FWL_GetApp(); + _FWL_RETURN_VALUE_IF_FAIL(pApp, NULL); + return pApp->GetWidgetMgr(); +} +CFWL_WidgetMgr::CFWL_WidgetMgr(IFWL_AdapterNative *pAdapterNative) + : m_dwCapability(0) +{ + m_pDelegate = FX_NEW CFWL_WidgetMgrDelegate(this); + m_pAdapter = pAdapterNative->GetWidgetMgr((IFWL_WidgetMgrDelegate*)m_pDelegate); + FXSYS_assert(m_pAdapter); + CFWL_WidgetMgrItem *pRoot = FX_NEW CFWL_WidgetMgrItem; + m_mapWidgetItem.SetAt(NULL, pRoot); +#if (_FX_OS_==_FX_WIN32_DESKTOP_) || (_FX_OS_==_FX_WIN64_) + m_rtScreen.Reset(); + IFWL_AdapterMonitorMgr* pMonitorMgr = pAdapterNative->GetMonitorMgr(); + if (pMonitorMgr) { + FWL_HMONITOR monitor = pMonitorMgr->GetCurrentMonitor(); + if (monitor) { + pMonitorMgr->GetMonitorSize(monitor, m_rtScreen.width, m_rtScreen.height); + } + } +#endif +} +CFWL_WidgetMgr::~CFWL_WidgetMgr() +{ + FX_POSITION ps = m_mapWidgetItem.GetStartPosition(); + while (ps) { + FX_LPVOID pWidget; + CFWL_WidgetMgrItem *pItem; + m_mapWidgetItem.GetNextAssoc(ps, pWidget, (void*&)pItem); + delete pItem; + } + m_mapWidgetItem.RemoveAll(); + if (m_pDelegate) { + delete m_pDelegate; + m_pDelegate = NULL; + } +} +FX_INT32 CFWL_WidgetMgr::CountWidgets(IFWL_Widget *pParent ) +{ + CFWL_WidgetMgrItem *pParentItem = GetWidgetMgrItem(pParent); + return TravelWidgetMgr(pParentItem, NULL, NULL); +} +IFWL_Widget* CFWL_WidgetMgr::GetWidget(FX_INT32 nIndex, IFWL_Widget *pParent ) +{ + CFWL_WidgetMgrItem *pParentItem = GetWidgetMgrItem(pParent); + IFWL_Widget *pWidget = NULL; + TravelWidgetMgr(pParentItem, &nIndex, NULL, &pWidget); + return pWidget; +} +IFWL_Widget* CFWL_WidgetMgr::GetWidget(IFWL_Widget *pWidget, FWL_WGTRELATION eRelation) +{ + CFWL_WidgetMgrItem *pItem = GetWidgetMgrItem(pWidget); + if (!pItem) { + return NULL; + } + IFWL_Widget *pRet = NULL; + switch (eRelation) { + case FWL_WGTRELATION_Parent: { + pRet = pItem->pParent ? pItem->pParent->pWidget : NULL; + break; + } + case FWL_WGTRELATION_Owner: { + pRet = pItem->pOwner ? pItem->pOwner->pWidget : NULL; + break; + } + case FWL_WGTRELATION_FirstSibling: { + pItem = pItem->pPrevious; + while (pItem && pItem->pPrevious) { + pItem = pItem->pPrevious; + } + pRet = pItem ? pItem->pWidget : NULL; + break; + } + case FWL_WGTRELATION_PriorSibling: { + pRet = pItem->pPrevious ? pItem->pPrevious->pWidget : NULL; + break; + } + case FWL_WGTRELATION_NextSibling: { + pRet = pItem->pNext ? pItem->pNext->pWidget : NULL; + break; + } + case FWL_WGTRELATION_LastSibling: { + pItem = pItem->pNext; + while (pItem && pItem->pNext) { + pItem = pItem->pNext; + } + pRet = pItem ? pItem->pWidget : NULL; + break; + } + case FWL_WGTRELATION_FirstChild: { + pRet = pItem->pChild ? pItem->pChild->pWidget : NULL; + break; + } + case FWL_WGTRELATION_LastChild: { + pItem = pItem->pChild; + while (pItem && pItem->pNext) { + pItem = pItem->pNext; + } + pRet = pItem ? pItem->pWidget : NULL; + break; + } + case FWL_WGTRELATION_SystemForm: { + while (pItem) { + if (IsAbleNative(pItem->pWidget)) { + pRet = pItem->pWidget; + break; + } + pItem = pItem->pParent; + } + break; + } + default: { + } + } + return pRet; +} +FX_INT32 CFWL_WidgetMgr::GetWidgetIndex(IFWL_Widget *pWidget) +{ + CFWL_WidgetMgrItem *pItem = GetWidgetMgrItem(pWidget); + _FWL_RETURN_VALUE_IF_FAIL(pItem, -1); + return TravelWidgetMgr(pItem->pParent, NULL, pItem); +} +FX_BOOL CFWL_WidgetMgr::SetWidgetIndex(IFWL_Widget *pWidget, FX_INT32 nIndex) +{ + CFWL_WidgetMgrItem *pItem = GetWidgetMgrItem(pWidget); + _FWL_RETURN_VALUE_IF_FAIL(pItem, FALSE); + _FWL_RETURN_VALUE_IF_FAIL(pItem->pParent, FALSE); + CFWL_WidgetMgrItem *pChild = pItem->pParent->pChild; + FX_INT32 i = 0; + while (pChild) { + if (pChild == pItem) { + if (i == nIndex) { + return TRUE; + } + if (pChild->pPrevious) { + pChild->pPrevious->pNext = pChild->pNext; + } + if (pChild->pNext) { + pChild->pNext->pPrevious = pChild->pPrevious; + } + if (pItem->pParent->pChild == pItem) { + pItem->pParent->pChild = pItem->pNext; + } + pItem->pNext = NULL; + pItem->pPrevious = NULL; + break; + } + if(!pChild->pNext) { + break; + } + pChild = pChild->pNext; + ++i; + } + pChild = pItem->pParent->pChild; + if (pChild) { + if (nIndex < 0) { + while(pChild->pNext) { + pChild = pChild->pNext; + } + pChild->pNext = pItem; + pItem->pPrevious = pChild; + pItem->pNext = NULL; + return TRUE; + } + i = 0; + while(i < nIndex && pChild->pNext ) { + pChild = pChild->pNext; + ++i; + } + if (!pChild->pNext) { + pChild->pNext = pItem; + pItem->pPrevious = pChild; + pItem->pNext = NULL; + return TRUE; + } + if (pChild->pPrevious) { + pItem->pPrevious = pChild->pPrevious; + pChild->pPrevious->pNext = pItem; + } + pChild->pPrevious = pItem; + pItem->pNext = pChild; + if (pItem->pParent->pChild == pChild) { + pItem->pParent->pChild = pItem; + } + } else { + pItem->pParent->pChild = pItem; + pItem->pPrevious = NULL; + pItem->pNext = NULL; + } + return TRUE; +} +FX_BOOL CFWL_WidgetMgr::IsWidget(FX_LPVOID pObj) +{ + _FWL_RETURN_VALUE_IF_FAIL(pObj, FALSE); + return GetWidgetMgrItem((IFWL_Widget*)pObj) != NULL; +} +FWL_ERR CFWL_WidgetMgr::RepaintWidget(IFWL_Widget *pWidget, const CFX_RectF *pRect ) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pAdapter, FWL_ERR_Indefinite); + IFWL_Widget *pNative = pWidget; + CFX_RectF rect(*pRect); + if (IsFormDisabled()) { + IFWL_Widget *pOuter = pWidget->GetOuter(); + while (pOuter) { + CFX_RectF rtTemp; + pNative->GetWidgetRect(rtTemp); + rect.left += rtTemp.left; + rect.top += rtTemp.top; + pNative = pOuter; + pOuter = pOuter->GetOuter(); + } + } else if (!IsAbleNative(pWidget)) { + pNative = GetWidget(pWidget, FWL_WGTRELATION_SystemForm); + _FWL_RETURN_VALUE_IF_FAIL(pNative, FWL_ERR_Indefinite); + pWidget->TransformTo(pNative, rect.left, rect.top); + } + AddRedrawCounts(pNative); + return m_pAdapter->RepaintWidget(pNative, &rect); +} +void CFWL_WidgetMgr::AddWidget(IFWL_Widget *pWidget) +{ + CFWL_WidgetMgrItem *pParentItem = GetWidgetMgrItem(NULL); + CFWL_WidgetMgrItem *pItem = GetWidgetMgrItem(pWidget); + if (!pItem) { + pItem = FX_NEW CFWL_WidgetMgrItem; + pItem->pWidget = pWidget; + m_mapWidgetItem.SetAt(pWidget, pItem); + } + if (pItem->pParent && pItem->pParent != pParentItem) { + if (pItem->pPrevious) { + pItem->pPrevious->pNext = pItem->pNext; + } + if (pItem->pNext) { + pItem->pNext->pPrevious = pItem->pPrevious; + } + if (pItem->pParent->pChild == pItem) { + pItem->pParent->pChild = pItem->pNext; + } + } + pItem->pParent = pParentItem; + SetWidgetIndex(pWidget, -1); +} +void CFWL_WidgetMgr::InsertWidget(IFWL_Widget *pParent, IFWL_Widget *pChild, FX_INT32 nIndex ) +{ + CFWL_WidgetMgrItem *pParentItem = GetWidgetMgrItem(pParent); + if (!pParentItem) { + pParentItem = FX_NEW CFWL_WidgetMgrItem; + pParentItem->pWidget = pParent; + m_mapWidgetItem.SetAt(pParent, pParentItem); + CFWL_WidgetMgrItem *pRoot = GetWidgetMgrItem(NULL); + pParentItem->pParent = pRoot; + SetWidgetIndex(pParent, -1); + } + CFWL_WidgetMgrItem *pItem = GetWidgetMgrItem(pChild); + if (!pItem) { + pItem = FX_NEW CFWL_WidgetMgrItem; + pItem->pWidget = pChild; + m_mapWidgetItem.SetAt(pChild, pItem); + } + if (pItem->pParent && pItem->pParent != pParentItem) { + if (pItem->pPrevious) { + pItem->pPrevious->pNext = pItem->pNext; + } + if (pItem->pNext) { + pItem->pNext->pPrevious = pItem->pPrevious; + } + if (pItem->pParent->pChild == pItem) { + pItem->pParent->pChild = pItem->pNext; + } + } + pItem->pParent = pParentItem; + SetWidgetIndex(pChild, nIndex); +} +void CFWL_WidgetMgr::RemoveWidget(IFWL_Widget *pWidget) +{ + CFWL_WidgetMgrItem *pItem = GetWidgetMgrItem(pWidget); + if (!pItem) { + return; + } + if (pItem->pPrevious) { + pItem->pPrevious->pNext = pItem->pNext; + } + if (pItem->pNext) { + pItem->pNext->pPrevious = pItem->pPrevious; + } + if (pItem->pParent && pItem->pParent->pChild == pItem) { + pItem->pParent->pChild = pItem->pNext; + } + CFWL_WidgetMgrItem *pChild = pItem->pChild; + while (pChild) { + CFWL_WidgetMgrItem *pNext = pChild->pNext; + RemoveWidget(pChild->pWidget); + pChild = pNext; + } + m_mapWidgetItem.RemoveKey(pWidget); + delete pItem; +} +void CFWL_WidgetMgr::SetOwner(IFWL_Widget *pOwner, IFWL_Widget *pOwned) +{ + CFWL_WidgetMgrItem *pParentItem = GetWidgetMgrItem(pOwner); + if (!pParentItem) { + pParentItem = FX_NEW CFWL_WidgetMgrItem; + pParentItem->pWidget = pOwner; + m_mapWidgetItem.SetAt(pOwner, pParentItem); + CFWL_WidgetMgrItem *pRoot = GetWidgetMgrItem(NULL); + pParentItem->pParent = pRoot; + SetWidgetIndex(pOwner, -1); + } + CFWL_WidgetMgrItem *pItem = GetWidgetMgrItem(pOwned); + if (!pItem) { + pItem = FX_NEW CFWL_WidgetMgrItem; + pItem->pWidget = pOwned; + m_mapWidgetItem.SetAt(pOwned, pItem); + } + pItem->pOwner = pParentItem; +} +void CFWL_WidgetMgr::SetParent(IFWL_Widget *pParent, IFWL_Widget *pChild) +{ + CFWL_WidgetMgrItem *pParentItem = GetWidgetMgrItem(pParent); + CFWL_WidgetMgrItem *pItem = GetWidgetMgrItem(pChild); + _FWL_RETURN_IF_FAIL(pItem); + if (pItem->pParent && pItem->pParent != pParentItem) { + if (pItem->pPrevious) { + pItem->pPrevious->pNext = pItem->pNext; + } + if (pItem->pNext) { + pItem->pNext->pPrevious = pItem->pPrevious; + } + if (pItem->pParent->pChild == pItem) { + pItem->pParent->pChild = pItem->pNext; + } + pItem->pNext = NULL; + pItem->pPrevious = NULL; + } + pItem->pParent = pParentItem; + SetWidgetIndex(pChild, -1); + _FWL_RETURN_IF_FAIL(m_pAdapter); + m_pAdapter->SetParentWidget(pChild, pParent); +} +FX_BOOL CFWL_WidgetMgr::IsChild(IFWL_Widget *pChild, IFWL_Widget *pParent) +{ + IFWL_Widget *pTemp = pChild; + do { + if (pTemp == pParent) { + return TRUE; + } + pTemp = GetWidget(pTemp, FWL_WGTRELATION_Parent); + } while (pTemp); + return FALSE; +} +FWL_ERR CFWL_WidgetMgr::CreateWidget_Native(IFWL_Widget *pWidget) +{ + if (!IsAbleNative(pWidget)) { + return FWL_ERR_Succeeded; + } + return m_pAdapter->CreateWidget(pWidget, pWidget->GetOwner()); +} +FWL_ERR CFWL_WidgetMgr::DestroyWidget_Native(IFWL_Widget *pWidget) +{ + if (!IsAbleNative(pWidget)) { + return FWL_ERR_Succeeded; + } + return m_pAdapter->DestroyWidget(pWidget); +} +FWL_ERR CFWL_WidgetMgr::GetWidgetRect_Native(IFWL_Widget *pWidget, CFX_RectF &rect) +{ + if (!IsAbleNative(pWidget)) { + return FWL_ERR_Succeeded; + } + return m_pAdapter->GetWidgetRect(pWidget, rect); +} +FWL_ERR CFWL_WidgetMgr::SetWidgetRect_Native(IFWL_Widget *pWidget, const CFX_RectF &rect) +{ + if (FWL_UseOffscreen(pWidget)) { + CFWL_WidgetMgrItem *pItem = GetWidgetMgrItem(pWidget); + pItem->iRedrawCounter ++; + if (pItem->pOffscreen) { + CFX_RenderDevice *pDevice = pItem->pOffscreen->GetRenderDevice(); + if (pDevice && pDevice->GetBitmap()) { + CFX_DIBitmap *pBitmap = pDevice->GetBitmap(); + if (pBitmap->GetWidth() - rect.width > 1 || pBitmap->GetHeight() - rect.height > 1) { + delete pItem->pOffscreen; + pItem->pOffscreen = NULL; + } + } + } +#if (_FX_OS_==_FX_WIN32_DESKTOP_) || (_FX_OS_==_FX_WIN64_) + pItem->bOutsideChanged = !m_rtScreen.Contains(rect); +#endif + } + return m_pAdapter->SetWidgetRect(pWidget, rect); +} +FWL_ERR CFWL_WidgetMgr::SetWidgetPosition_Native(IFWL_Widget *pWidget, FX_FLOAT fx, FX_FLOAT fy) +{ + return m_pAdapter->SetWidgetPosition(pWidget, fx, fy); +} +FWL_ERR CFWL_WidgetMgr::SetWidgetIcon_Native(IFWL_Widget *pWidget, const CFX_DIBitmap *pIcon, FX_BOOL bBig) +{ + return m_pAdapter->SetWidgetIcon(pWidget, pIcon, bBig); +} +FWL_ERR CFWL_WidgetMgr::SetWidgetCaption_Native(IFWL_Widget *pWidget, FX_WSTR wsCaption) +{ + return m_pAdapter->SetWidgetCaption(pWidget, wsCaption); +} +FWL_ERR CFWL_WidgetMgr::SetBorderRegion_Native(IFWL_Widget *pWidget, CFX_Path *pPath) +{ + return m_pAdapter->SetBorderRegion(pWidget, pPath); +} +FWL_ERR CFWL_WidgetMgr::ShowWidget_Native(IFWL_Widget *pWidget) +{ + return m_pAdapter->ShowWidget(pWidget); +} +FWL_ERR CFWL_WidgetMgr::HideWidget_Native(IFWL_Widget *pWidget) +{ + return m_pAdapter->HideWidget(pWidget); +} +FWL_ERR CFWL_WidgetMgr::SetNormal_Native(IFWL_Widget *pWidget) +{ + return m_pAdapter->SetNormal(pWidget); +} +FWL_ERR CFWL_WidgetMgr::SetMaximize_Native(IFWL_Widget *pWidget) +{ + return m_pAdapter->SetMaximize(pWidget); +} +FWL_ERR CFWL_WidgetMgr::SetMinimize_Native(IFWL_Widget *pWidget) +{ + return m_pAdapter->SetMinimize(pWidget); +} +FX_BOOL CFWL_WidgetMgr::CheckMessage_Native() +{ + return m_pAdapter->CheckMessage(); +} +FWL_ERR CFWL_WidgetMgr::DispatchMessage_Native() +{ + return m_pAdapter->DispatchMessage(); +} +FX_BOOL CFWL_WidgetMgr::IsIdleMessage_Native() +{ + return m_pAdapter->IsIdleMessage(); +} +FWL_ERR CFWL_WidgetMgr::Exit_Native(FX_INT32 iExitCode) +{ + return m_pAdapter->Exit(iExitCode); +} +FWL_ERR CFWL_WidgetMgr::CreateWidgetWithNativeId_Native(IFWL_Widget *pWidget, void *vp) +{ + return m_pAdapter->CreateWidgetWithNativeId(pWidget, vp); +} +IFWL_Widget* CFWL_WidgetMgr::GetWidgetAtPoint(IFWL_Widget * parent, FX_FLOAT x, FX_FLOAT y) +{ + _FWL_RETURN_VALUE_IF_FAIL(parent, NULL); + FX_FLOAT x1; + FX_FLOAT y1; + IFWL_Widget * child = GetWidget(parent, FWL_WGTRELATION_LastChild); + while (child) { + if ((child->GetStates() & FWL_WGTSTATE_Invisible) == 0) { + x1 = x; + y1 = y; + CFX_Matrix matrixOnParent; + child->GetMatrix(matrixOnParent); + CFX_Matrix m; + m.Reset(); + m.SetReverse(matrixOnParent); + m.TransformPoint(x1, y1); + CFX_RectF bounds; + child->GetWidgetRect(bounds); + if (bounds.Contains(x1, y1)) { + x1 -= bounds.left; + y1 -= bounds.top; + return GetWidgetAtPoint(child, x1, y1); + } + } + child = GetWidget(child, FWL_WGTRELATION_PriorSibling); + } + return parent; +} +void CFWL_WidgetMgr::NotifySizeChanged(IFWL_Widget *pForm, FX_FLOAT fx, FX_FLOAT fy) +{ + if (!FWL_UseOffscreen(pForm)) { + return; + } + CFWL_WidgetMgrItem *pItem = GetWidgetMgrItem(pForm); + if (pItem->pOffscreen) { + delete pItem->pOffscreen; + pItem->pOffscreen = NULL; + } +} +IFWL_Widget* CFWL_WidgetMgr::nextTab(IFWL_Widget *parent, IFWL_Widget *focus, FX_BOOL &bFind) +{ + IFWL_Widget *child = FWL_GetWidgetMgr()->GetWidget(parent, FWL_WGTRELATION_FirstChild); + while (child) { + if (focus == child) { + bFind = TRUE; + } + if ((child->GetStyles() & FWL_WGTSTYLE_TabStop) && (!focus || (focus != child && bFind))) { + return child; + } + IFWL_Widget *bRet = nextTab(child, focus, bFind); + if (bRet) { + return bRet; + } + child = FWL_GetWidgetMgr()->GetWidget(child, FWL_WGTRELATION_NextSibling); + } + return NULL; +} +FX_INT32 CFWL_WidgetMgr::CountRadioButtonGroup(IFWL_Widget *pFirst) +{ + FX_INT32 iRet = 0; + IFWL_Widget *pChild = pFirst; + while (pChild) { + if ((pChild->GetStyles() & FWL_WGTSTYLE_Group) && pChild->GetClassID() == 3811304691) { + iRet ++; + } + pChild = GetWidget(pChild, FWL_WGTRELATION_NextSibling); + } + return iRet; +} +IFWL_Widget* CFWL_WidgetMgr::GetSiblingRadioButton(IFWL_Widget *pWidget, FX_BOOL bNext) +{ + while ((pWidget = GetWidget(pWidget, bNext ? FWL_WGTRELATION_NextSibling : FWL_WGTRELATION_PriorSibling)) != NULL) { + if (pWidget->GetClassID() == 3811304691) { + return pWidget; + } + } + return NULL; +} +IFWL_Widget* CFWL_WidgetMgr::GetRadioButtonGroupHeader(IFWL_Widget *pRadioButton) +{ + if (pRadioButton->GetStyles() & FWL_WGTSTYLE_Group) { + return pRadioButton; + } + IFWL_Widget *pNext = pRadioButton; + while ((pNext = GetSiblingRadioButton(pNext, FALSE)) != NULL) { + if (pNext->GetStyles() & FWL_WGTSTYLE_Group) { + return pNext; + } + } + pNext = GetWidget(pRadioButton, FWL_WGTRELATION_LastSibling); + if ((pNext->GetStyles() & FWL_WGTSTYLE_Group) && pNext->GetClassID() == 3811304691) { + return pNext; + } + while ((pNext = GetSiblingRadioButton(pNext, FALSE)) && pNext && pNext != pRadioButton) { + if (pNext->GetStyles() & FWL_WGTSTYLE_Group) { + return pNext; + } + } + pNext = GetWidget(pRadioButton, FWL_WGTRELATION_FirstSibling); + if (pNext && (pNext->GetStyles() == FWL_WGTSTYLE_Group) && pNext->GetClassID() == 3811304691) { + return pNext; + } + return GetSiblingRadioButton(pNext, TRUE); +} +void CFWL_WidgetMgr::GetSameGroupRadioButton(IFWL_Widget *pRadioButton, CFX_PtrArray &group) +{ + IFWL_Widget *pFirst = GetWidget(pRadioButton, FWL_WGTRELATION_FirstSibling); + if (!pFirst) { + pFirst = pRadioButton; + } + FX_INT32 iGroup = CountRadioButtonGroup(pFirst); + if (iGroup < 2) { + if (pFirst->GetClassID() == 3811304691) { + group.Add(pFirst); + } + IFWL_Widget *pNext = pFirst; + while ((pNext = GetSiblingRadioButton(pNext, TRUE)) != NULL) { + group.Add(pNext); + } + return; + } + IFWL_Widget *pNext = GetRadioButtonGroupHeader(pRadioButton); + do { + group.Add(pNext); + pNext = GetSiblingRadioButton(pNext, TRUE); + if (!pNext) { + if (pFirst->GetClassID() == 3811304691) { + pNext = pFirst; + } else { + pNext = GetSiblingRadioButton(pFirst, TRUE); + } + } + } while (pNext && ((pNext->GetStyles() & FWL_WGTSTYLE_Group) == 0)); +} +IFWL_Widget* CFWL_WidgetMgr::GetDefaultButton(IFWL_Widget *pParent) +{ + if ((pParent->GetClassID() == 3521614244) && (pParent->GetStates() & (1 << (FWL_WGTSTATE_MAX + 2)))) { + return pParent; + } + IFWL_Widget *child = FWL_GetWidgetMgr()->GetWidget(pParent, FWL_WGTRELATION_FirstChild); + while (child) { + if ((child->GetClassID() == 3521614244) && (child->GetStates() & (1 << (FWL_WGTSTATE_MAX + 2)))) { + return child; + } + IFWL_Widget *find = GetDefaultButton(child); + if (find) { + return find; + } + child = FWL_GetWidgetMgr()->GetWidget(child, FWL_WGTRELATION_NextSibling); + } + return NULL; +} +void CFWL_WidgetMgr::AddRedrawCounts(IFWL_Widget *pWidget) +{ + CFWL_WidgetMgrItem *pItem = GetWidgetMgrItem(pWidget); + (pItem->iRedrawCounter)++; +} +void CFWL_WidgetMgr::ResetRedrawCounts(IFWL_Widget *pWidget) +{ + CFWL_WidgetMgrItem *pItem = GetWidgetMgrItem(pWidget); + pItem->iRedrawCounter = 0; +} +CFWL_WidgetMgrItem* CFWL_WidgetMgr::GetWidgetMgrItem(IFWL_Widget *pWidget) +{ + return (CFWL_WidgetMgrItem*)m_mapWidgetItem.GetValueAt(pWidget); +} +FX_INT32 CFWL_WidgetMgr::TravelWidgetMgr(CFWL_WidgetMgrItem *pParent, FX_INT32 *pIndex, CFWL_WidgetMgrItem *pItem, IFWL_Widget **pWidget ) +{ + if (!pParent) { + return 0; + } + FX_INT32 iCount = 0; + CFWL_WidgetMgrItem *pChild = pParent->pChild; + while (pChild) { + iCount ++; + if (pIndex) { + if (*pIndex == 0) { + *pWidget = pChild->pWidget; + return iCount; + } + pIndex --; + } + if (pItem && pItem == pChild) { + return iCount - 1; + } + pChild = pChild->pNext; + } + if (pIndex) { + return 0; + } else if (pItem) { + return -1; + } + return iCount - 1; +} +FX_BOOL CFWL_WidgetMgr::IsAbleNative(IFWL_Widget *pWidget) +{ + _FWL_RETURN_VALUE_IF_FAIL(pWidget, FALSE); + if (!pWidget->IsInstance(FX_WSTRC(FWL_CLASS_Form))) { + return FALSE; + } + FX_DWORD dwStyles = pWidget->GetStyles(); + return ((dwStyles & FWL_WGTSTYLE_WindowTypeMask) == FWL_WGTSTYLE_OverLapper) || (dwStyles & FWL_WGTSTYLE_Popup); +} +FX_BOOL CFWL_WidgetMgr::IsThreadEnabled() +{ + return !(m_dwCapability & FWL_WGTMGR_DisableThread); +} +FX_BOOL CFWL_WidgetMgr::IsFormDisabled() +{ + return m_dwCapability & FWL_WGTMGR_DisableForm; +} +FX_BOOL CFWL_WidgetMgr::GetAdapterPopupPos(IFWL_Widget* pWidget, FX_FLOAT fMinHeight, FX_FLOAT fMaxHeight, const CFX_RectF &rtAnchor, CFX_RectF &rtPopup) +{ + IFWL_AdapterWidgetMgr* pSDApapter = GetAdapterWidgetMgr(); + return pSDApapter->GetPopupPos(pWidget, fMinHeight, fMaxHeight, rtAnchor, rtPopup); +} +CFWL_WidgetMgrDelegate::CFWL_WidgetMgrDelegate(CFWL_WidgetMgr *pWidgetMgr) + : m_pWidgetMgr(pWidgetMgr) +{ +} +FWL_ERR CFWL_WidgetMgrDelegate::OnSetCapability(FX_DWORD dwCapability ) +{ + m_pWidgetMgr->m_dwCapability = dwCapability; + return FWL_ERR_Succeeded; +} +FX_INT32 CFWL_WidgetMgrDelegate::OnProcessMessageToForm(CFWL_Message *pMessage) +{ + _FWL_RETURN_VALUE_IF_FAIL(pMessage, 0); + _FWL_RETURN_VALUE_IF_FAIL(pMessage->m_pDstTarget, 0); + IFWL_Widget *pDstWidget = (IFWL_Widget*)pMessage->m_pDstTarget; + IFWL_NoteThread *pNoteThread = pDstWidget->GetOwnerThread(); + _FWL_RETURN_VALUE_IF_FAIL(pNoteThread, 0); + CFWL_NoteDriver *pNoteDriver = (CFWL_NoteDriver*)pNoteThread->GetNoteDriver(); + _FWL_RETURN_VALUE_IF_FAIL(pNoteDriver, 0); + if (m_pWidgetMgr->IsThreadEnabled()) { + pMessage = (CFWL_Message*)pMessage->Clone(); + } + if (m_pWidgetMgr->IsFormDisabled()) { + pNoteDriver->ProcessMessage(pMessage); + } else { + pNoteDriver->QueueMessage(pMessage); + } +#if (_FX_OS_==_FX_MACOSX_) + CFWL_NoteLoop *pTopLoop = pNoteDriver->GetTopLoop(); + if (pTopLoop) { + pNoteDriver->UnqueueMessage(pTopLoop); + } +#endif + if (m_pWidgetMgr->IsThreadEnabled()) { + pMessage->Release(); + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_WidgetMgrDelegate::OnDrawWidget(IFWL_Widget * pWidget, + CFX_Graphics * pGraphics, + const CFX_Matrix * pMatrix ) +{ + _FWL_RETURN_VALUE_IF_FAIL(pWidget, FWL_ERR_Indefinite); + _FWL_RETURN_VALUE_IF_FAIL(pGraphics, FWL_ERR_Indefinite); + CFX_Graphics *pTemp = DrawWidgetBefore(pWidget, pGraphics, pMatrix); + CFX_RectF clipCopy; + pWidget->GetWidgetRect(clipCopy); + clipCopy.left = clipCopy.top = 0; + if (bUseOffscreenDirect(pWidget)) { + DrawWidgetAfter(pWidget, pGraphics, clipCopy, pMatrix); + return FWL_ERR_Succeeded; + } + CFX_RectF clipBounds; +#if (_FX_OS_==_FX_WIN32_DESKTOP_) || (_FX_OS_==_FX_WIN64_) || (_FX_OS_ == _FX_LINUX_DESKTOP_) || (_FX_OS_ == _FX_LINUX_EMBEDDED_) || (_FX_OS_ == _FX_ANDROID_) + IFWL_WidgetDelegate *pDelegate = pWidget->SetDelegate(NULL); + pDelegate->OnDrawWidget(pTemp, pMatrix); + pGraphics->GetClipRect(clipBounds); + clipCopy = clipBounds; +#elif (_FX_OS_==_FX_MACOSX_) + if (m_pWidgetMgr->IsFormDisabled()) { + IFWL_WidgetDelegate *pDelegate = pWidget->SetDelegate(NULL); + pDelegate->OnDrawWidget(pTemp, pMatrix); + pGraphics->GetClipRect(clipBounds); + clipCopy = clipBounds; + } else { + clipBounds.Set(pMatrix->a, pMatrix->b, pMatrix->c, pMatrix->d); + ((CFX_Matrix*)pMatrix)->Reset(); +#ifdef FWL_UseMacSystemBorder +#else +#endif + { + IFWL_WidgetDelegate *pDelegate = pWidget->SetDelegate(NULL); + pDelegate->OnDrawWidget(pTemp, pMatrix); + } + } +#endif + if (!m_pWidgetMgr->IsFormDisabled()) { + CFX_RectF rtClient; + pWidget->GetClientRect(rtClient); + clipBounds.Intersect(rtClient); + } + if (!clipBounds.IsEmpty()) { + DrawChild(pWidget, clipBounds, pTemp, pMatrix); + } + DrawWidgetAfter(pWidget, pGraphics, clipCopy, pMatrix); + m_pWidgetMgr->ResetRedrawCounts(pWidget); + return FWL_ERR_Succeeded; +} +void CFWL_WidgetMgrDelegate::DrawChild(IFWL_Widget* parent, + const CFX_RectF& rtClip, + CFX_Graphics* pGraphics, + const CFX_Matrix* pMatrix ) +{ + _FWL_RETURN_IF_FAIL(parent); + FX_BOOL bFormDisable = m_pWidgetMgr->IsFormDisabled(); + IFWL_Widget* pNextChild = m_pWidgetMgr->GetWidget(parent, FWL_WGTRELATION_FirstChild); + while (pNextChild) { + IFWL_Widget* child = pNextChild; + pNextChild = m_pWidgetMgr->GetWidget(child, FWL_WGTRELATION_NextSibling); + if (child->GetStates() & FWL_WGTSTATE_Invisible) { + continue; + } + CFX_RectF rtWidget; + child->GetWidgetRect(rtWidget); + if (rtWidget.IsEmpty()) { + continue; + } + CFX_Matrix widgetMatrix; + CFX_RectF clipBounds(rtWidget); + if(!bFormDisable) { + child->GetMatrix(widgetMatrix, TRUE); + } + if (pMatrix) { + widgetMatrix.Concat(*pMatrix); + } + if (!bFormDisable) { + widgetMatrix.TransformPoint(clipBounds.left, clipBounds.top); + clipBounds.Intersect(rtClip); + if (clipBounds.IsEmpty()) { + continue; + } + pGraphics->SaveGraphState(); + pGraphics->SetClipRect(clipBounds); + } + widgetMatrix.Translate(rtWidget.left, rtWidget.top, TRUE); + IFWL_WidgetDelegate *pDelegate = child->SetDelegate(NULL); + if (pDelegate) { + if (m_pWidgetMgr->IsFormDisabled() || IsNeedRepaint(child, &widgetMatrix, rtClip)) { + pDelegate->OnDrawWidget(pGraphics, &widgetMatrix); + } + } + if (!bFormDisable) { + pGraphics->RestoreGraphState(); + } + DrawChild(child, clipBounds, pGraphics, bFormDisable ? &widgetMatrix : pMatrix); + child = m_pWidgetMgr->GetWidget(child, FWL_WGTRELATION_NextSibling); + } +} +CFX_Graphics* CFWL_WidgetMgrDelegate::DrawWidgetBefore(IFWL_Widget *pWidget, CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix) +{ + if (!FWL_UseOffscreen(pWidget)) { + return pGraphics; + } + CFWL_WidgetMgrItem *pItem = m_pWidgetMgr->GetWidgetMgrItem(pWidget); + if (!pItem->pOffscreen) { + pItem->pOffscreen = FX_NEW CFX_Graphics; + CFX_RectF rect; + pWidget->GetWidgetRect(rect); + pItem->pOffscreen->Create((FX_INT32)rect.width, (FX_INT32)rect.height, FXDIB_Argb); + } + CFX_RectF rect; + pGraphics->GetClipRect(rect); + pItem->pOffscreen->SetClipRect(rect); + return pItem->pOffscreen; +} +void CFWL_WidgetMgrDelegate::DrawWidgetAfter(IFWL_Widget *pWidget, CFX_Graphics *pGraphics, CFX_RectF &rtClip, const CFX_Matrix *pMatrix) +{ + if (FWL_UseOffscreen(pWidget)) { + CFWL_WidgetMgrItem *pItem = m_pWidgetMgr->GetWidgetMgrItem(pWidget); + pGraphics->Transfer(pItem->pOffscreen, rtClip.left, rtClip.top, rtClip, (CFX_Matrix*)pMatrix); +#ifdef _WIN32 + pItem->pOffscreen->ClearClip(); +#endif + } + CFWL_WidgetMgrItem *pItem = m_pWidgetMgr->GetWidgetMgrItem(pWidget); + pItem->iRedrawCounter = 0; +} +#define FWL_NEEDREPAINTHIT_Point 12 +#define FWL_NEEDREPAINTHIT_Piece 3 +typedef struct _FWL_NeedRepaintHitData { + CFX_PointF hitPoint; + FX_BOOL bNotNeedRepaint; + FX_BOOL bNotContainByDirty; +} FWL_NeedRepaintHitData; +FX_BOOL CFWL_WidgetMgrDelegate::IsNeedRepaint(IFWL_Widget *pWidget, CFX_Matrix *pMatrix, const CFX_RectF &rtDirty) +{ + CFWL_WidgetMgrItem * pItem = m_pWidgetMgr->GetWidgetMgrItem(pWidget); + if (pItem && pItem->iRedrawCounter > 0) { + pItem->iRedrawCounter = 0; + return TRUE; + } + CFX_RectF rtWidget; + pWidget->GetWidgetRect(rtWidget); + rtWidget.left = rtWidget.top = 0; + pMatrix->TransformRect(rtWidget); + if (!rtWidget.IntersectWith(rtDirty)) { + return FALSE; + } + IFWL_Widget * pChild = FWL_GetWidgetMgr()->GetWidget(pWidget, FWL_WGTRELATION_FirstChild); + if (!pChild) { + return TRUE; + } + if (pChild->GetClassID() == 3150298670) { + CFX_RectF rtTemp; + pChild->GetWidgetRect(rtTemp); + if (rtTemp.width >= rtWidget.width && rtTemp.height >= rtWidget.height) { + pChild = FWL_GetWidgetMgr()->GetWidget(pChild, FWL_WGTRELATION_FirstChild); + if (!pChild) { + return TRUE; + } + } + } + CFX_RectF rtChilds; + rtChilds.Empty(); + FX_BOOL bChildIntersectWithDirty = FALSE; + FX_BOOL bOrginPtIntersectWidthChild = FALSE; + FX_BOOL bOrginPtIntersectWidthDirty = rtDirty.Contains(rtWidget.left, rtWidget.top); + static FWL_NeedRepaintHitData hitPoint[FWL_NEEDREPAINTHIT_Point]; + static FX_INT32 iSize = sizeof(FWL_NeedRepaintHitData); + FXSYS_memset(hitPoint, 0, iSize); + FX_FLOAT fxPiece = rtWidget.width / FWL_NEEDREPAINTHIT_Piece; + FX_FLOAT fyPiece = rtWidget.height / FWL_NEEDREPAINTHIT_Piece; + hitPoint[2].hitPoint.x = hitPoint[6].hitPoint.x = rtWidget.left; + hitPoint[0].hitPoint.x = hitPoint[3].hitPoint.x = hitPoint[7].hitPoint.x = hitPoint[10].hitPoint.x = fxPiece + rtWidget.left; + hitPoint[1].hitPoint.x = hitPoint[4].hitPoint.x = hitPoint[8].hitPoint.x = hitPoint[11].hitPoint.x = fxPiece * 2 + rtWidget.left; + hitPoint[5].hitPoint.x = hitPoint[9].hitPoint.x = rtWidget.width + rtWidget.left; + hitPoint[0].hitPoint.y = hitPoint[1].hitPoint.y = rtWidget.top; + hitPoint[2].hitPoint.y = hitPoint[3].hitPoint.y = hitPoint[4].hitPoint.y = hitPoint[5].hitPoint.y = fyPiece + rtWidget.top; + hitPoint[6].hitPoint.y = hitPoint[7].hitPoint.y = hitPoint[8].hitPoint.y = hitPoint[9].hitPoint.y = fyPiece * 2 + rtWidget.top; + hitPoint[10].hitPoint.y = hitPoint[11].hitPoint.y = rtWidget.height + rtWidget.top; + do { + CFX_RectF rect; + pChild->GetWidgetRect(rect); + CFX_RectF r = rect; + r.left += rtWidget.left; + r.top += rtWidget.top; + if (r.IsEmpty()) { + continue; + } + if (r.Contains(rtDirty)) { + return FALSE; + } + if (!bChildIntersectWithDirty && r.IntersectWith(rtDirty)) { + bChildIntersectWithDirty = TRUE; + } + if (bOrginPtIntersectWidthDirty && !bOrginPtIntersectWidthChild) { + bOrginPtIntersectWidthChild = rect.Contains(0, 0); + } + if (rtChilds.IsEmpty()) { + rtChilds = rect; + } else if (!(pChild->GetStates() & FWL_WGTSTATE_Invisible)) { + rtChilds.Union(rect); + } + for (FX_INT32 i = 0; i < FWL_NEEDREPAINTHIT_Point; i ++) { + if (hitPoint[i].bNotContainByDirty || hitPoint[i].bNotNeedRepaint) { + continue; + } + if (!rtDirty.Contains(hitPoint[i].hitPoint)) { + hitPoint[i].bNotContainByDirty = TRUE; + continue; + } + if (r.Contains(hitPoint[i].hitPoint)) { + hitPoint[i].bNotNeedRepaint = TRUE; + } + } + } while ((pChild = FWL_GetWidgetMgr()->GetWidget(pChild, FWL_WGTRELATION_NextSibling)) != NULL); + if (!bChildIntersectWithDirty) { + return TRUE; + } + if (bOrginPtIntersectWidthDirty && !bOrginPtIntersectWidthChild) { + return TRUE; + } + if (rtChilds.IsEmpty()) { + return TRUE; + } + FX_INT32 repaintPoint = FWL_NEEDREPAINTHIT_Point; + for (FX_INT32 i = 0; i < FWL_NEEDREPAINTHIT_Point; i ++) { + if (hitPoint[i].bNotNeedRepaint) { + repaintPoint --; + } + } + if (repaintPoint > 0) { + return TRUE; + } + pMatrix->TransformRect(rtChilds); + if (rtChilds.Contains(rtDirty) || rtChilds.Contains(rtWidget)) { + return FALSE; + } + return TRUE; +} +FX_BOOL CFWL_WidgetMgrDelegate::bUseOffscreenDirect(IFWL_Widget *pWidget) +{ + CFWL_WidgetMgrItem *pItem = m_pWidgetMgr->GetWidgetMgrItem(pWidget); + if (!FWL_UseOffscreen(pWidget) || !(pItem->pOffscreen)) { + return FALSE; + } +#if (_FX_OS_==_FX_WIN32_DESKTOP_) || (_FX_OS_==_FX_WIN64_) + if (pItem->bOutsideChanged) { + CFX_RectF r; + pWidget->GetWidgetRect(r); + CFX_RectF temp(m_pWidgetMgr->m_rtScreen); + temp.Deflate(50, 50); + if (!temp.Contains(r)) { + return FALSE; + } + pItem->bOutsideChanged = FALSE; + } +#endif + return pItem->iRedrawCounter == 0; +} +static void FWL_WriteBMP(CFX_DIBitmap* pBitmap, FX_LPCSTR filename) +{ + FILE* file = fopen(filename, "wb"); + if (file == NULL) { + return; + } + int size = 14 + 40 + pBitmap->GetPitch() * pBitmap->GetHeight(); + unsigned char buffer[40]; + buffer[0] = 'B'; + buffer[1] = 'M'; + buffer[2] = (unsigned char)size; + buffer[3] = (unsigned char)(size >> 8); + buffer[4] = (unsigned char)(size >> 16); + buffer[5] = (unsigned char)(size >> 24); + buffer[6] = buffer[7] = buffer[8] = buffer[9] = 0; + buffer[10] = 54; + buffer[11] = buffer[12] = buffer[13] = 0; + fwrite(buffer, 14, 1, file); + memset(buffer, 0, 40); + buffer[0] = 40; + buffer[4] = (unsigned char)pBitmap->GetWidth(); + buffer[5] = (unsigned char)(pBitmap->GetWidth() >> 8); + buffer[6] = (unsigned char)(pBitmap->GetWidth() >> 16); + buffer[7] = (unsigned char)(pBitmap->GetWidth() >> 24); + buffer[8] = (unsigned char)(-pBitmap->GetHeight()); + buffer[9] = (unsigned char)((-pBitmap->GetHeight()) >> 8); + buffer[10] = (unsigned char)((-pBitmap->GetHeight()) >> 16); + buffer[11] = (unsigned char)((-pBitmap->GetHeight()) >> 24); + buffer[12] = 1; + buffer[14] = pBitmap->GetBPP(); + fwrite(buffer, 40, 1, file); + for (int row = 0; row < pBitmap->GetHeight(); row ++) { + FX_LPBYTE scan_line = pBitmap->GetBuffer() + row * pBitmap->GetPitch(); + fwrite(scan_line, pBitmap->GetPitch(), 1, file); + } + fclose(file); +} +FWL_ERR FWL_WidgetMgrSnapshot(IFWL_Widget *pWidget, const CFX_WideString *saveFile, const CFX_Matrix *pMatrix) +{ + CFX_RectF r; + pWidget->GetWidgetRect(r); + CFX_Graphics gs; + gs.Create((FX_INT32)r.width, (FX_INT32)r.height, FXDIB_Argb); + CFWL_WidgetMgr *widgetMgr = (CFWL_WidgetMgr*)FWL_GetWidgetMgr(); + CFWL_WidgetMgrDelegate *delegate = widgetMgr->GetDelegate(); + delegate->OnDrawWidget(pWidget, &gs, pMatrix); + CFX_DIBitmap *dib = gs.GetRenderDevice()->GetBitmap(); + FWL_WriteBMP(dib, saveFile->UTF8Encode()); + return FWL_ERR_Succeeded; +} +FX_BOOL FWL_WidgetIsChild(IFWL_Widget *parent, IFWL_Widget *find) +{ + if (!find) { + return FALSE; + } + IFWL_Widget *child = FWL_GetWidgetMgr()->GetWidget(parent, FWL_WGTRELATION_FirstChild); + while (child) { + if (child == find) { + return TRUE; + } + if (FWL_WidgetIsChild(child, find)) { + return TRUE; + } + child = FWL_GetWidgetMgr()->GetWidget(child, FWL_WGTRELATION_NextSibling); + } + return FALSE; +} diff --git a/xfa/src/fwl/src/core/include/fwl_appimp.h b/xfa/src/fwl/src/core/include/fwl_appimp.h new file mode 100644 index 0000000000..edc2089252 --- /dev/null +++ b/xfa/src/fwl/src/core/include/fwl_appimp.h @@ -0,0 +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 _FWL_APP_IMP_H +#define _FWL_APP_IMP_H +class CFWL_NoteThread; +class CFWL_WidgetMgr; +class IFWL_AdapterNative; +class IFWL_WidgetMgr; +class IFWL_ThemeProvider; +class IFWL_App; +class CFWL_AppImp; +class CFWL_AppImp : public CFWL_NoteThread +{ +public: + CFWL_AppImp(IFWL_AdapterNative *pAdapter); + virtual ~CFWL_AppImp(); + virtual FWL_ERR Initialize(); + virtual FWL_ERR Finalize(); + virtual IFWL_AdapterNative* GetAdapterNative(); + virtual IFWL_WidgetMgr* GetWidgetMgr(); + virtual FWL_ERR SetThemeProvider(IFWL_ThemeProvider* pThemeProvider); + virtual FWL_ERR Exit(FX_INT32 iExitCode = 0); + IFWL_ThemeProvider* GetThemeProvider(); +protected: + CFWL_WidgetMgr *m_pWidgetMgr; + IFWL_AdapterNative *m_pAdapterNative; + IFWL_ThemeProvider *m_pThemeProvider; + FX_BOOL m_bFuelAdapter; +}; +#endif diff --git a/xfa/src/fwl/src/core/include/fwl_contentimp.h b/xfa/src/fwl/src/core/include/fwl_contentimp.h new file mode 100644 index 0000000000..0aaaf0e1b8 --- /dev/null +++ b/xfa/src/fwl/src/core/include/fwl_contentimp.h @@ -0,0 +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 + +#ifndef _FWL_CONTENT_IMP_H +#define _FWL_CONTENT_IMP_H +class CFWL_WidgetImp; +class IFWL_Widget; +class CFWL_ContentImp; +class CFWL_ContentImp : public CFWL_WidgetImp +{ +public: + CFWL_ContentImp(); + CFWL_ContentImp(const CFWL_WidgetImpProperties &properties); + virtual ~CFWL_ContentImp(); + virtual FWL_ERR InsertWidget(IFWL_Widget *pChild, FX_INT32 nIndex = -1); + virtual FWL_ERR RemoveWidget(IFWL_Widget *pWidget); + virtual FWL_ERR RemoveAllWidgets(); + virtual FWL_ERR GetMinSize(FX_FLOAT &fWidth, FX_FLOAT &fHeight); + virtual FWL_ERR SetMinSize(FX_FLOAT fWidth, FX_FLOAT fHeight); + virtual FWL_ERR GetMaxSize(FX_FLOAT &fWidth, FX_FLOAT &fHeight); + virtual FWL_ERR SetMaxSize(FX_FLOAT fWidth, FX_FLOAT fHeight); +protected: + FX_FLOAT m_fWidthMin; + FX_FLOAT m_fWidthMax; + FX_FLOAT m_fHeightMax; + FX_FLOAT m_fHeightMin; +}; +#endif diff --git a/xfa/src/fwl/src/core/include/fwl_formimp.h b/xfa/src/fwl/src/core/include/fwl_formimp.h new file mode 100644 index 0000000000..357f8e86de --- /dev/null +++ b/xfa/src/fwl/src/core/include/fwl_formimp.h @@ -0,0 +1,187 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FWL_FORM_IMP_H +#define _FWL_FORM_IMP_H +class CFWL_NoteLoop; +class CFWL_PanelImp; +class CFWL_WidgetImpProperties; +class CFWL_WidgetImpDelegate; +class CFWL_MsgMouse; +class IFWL_Widget; +class IFWL_ThemeProvider; +class CFWL_SysBtn; +class CFWL_FormImp; +class CFWL_FormDelegate; +#define FWL_SYSBUTTONSTATE_Hover 0x0001 +#define FWL_SYSBUTTONSTATE_Pressed 0x0002 +#define FWL_SYSBUTTONSTATE_Disabled 0x0010 +class CFWL_SysBtn : public CFX_Object +{ +public: + CFWL_SysBtn() + { + m_rtBtn.Set(0, 0, 0, 0); + m_dwState = 0; + } + + FX_BOOL IsHover() + { + return m_dwState & FWL_SYSBUTTONSTATE_Hover; + } + FX_BOOL IsPressed() + { + return m_dwState & FWL_SYSBUTTONSTATE_Pressed; + } + FX_BOOL IsDisabled() + { + return m_dwState & FWL_SYSBUTTONSTATE_Disabled; + } + void SetNormal() + { + m_dwState &= 0xFFF0; + } + void SetPressed() + { + SetNormal(); + m_dwState |= FWL_SYSBUTTONSTATE_Pressed; + } + void SetHover() + { + SetNormal(); + m_dwState |= FWL_SYSBUTTONSTATE_Hover; + } + void SetDisabled(FX_BOOL bDisabled) + { + bDisabled ? m_dwState |= FWL_SYSBUTTONSTATE_Disabled : m_dwState &= ~FWL_SYSBUTTONSTATE_Disabled; + } + FX_INT32 GetPartState() + { + return (IsDisabled() ? FWL_PARTSTATE_FRM_Disabled : (m_dwState + 1)); + } + + CFX_RectF m_rtBtn; + FX_DWORD m_dwState; +}; +enum FORM_RESIZETYPE { + FORM_RESIZETYPE_None = 0, + FORM_RESIZETYPE_Cap, + FORM_RESIZETYPE_Left, + FORM_RESIZETYPE_Top, + FORM_RESIZETYPE_Right, + FORM_RESIZETYPE_Bottom, + FORM_RESIZETYPE_LeftTop, + FORM_RESIZETYPE_LeftBottom, + FORM_RESIZETYPE_RightTop, + FORM_RESIZETYPE_RightBottom +}; +typedef struct RestoreResizeInfo { + CFX_PointF m_ptStart; + CFX_SizeF m_szStart; +} RestoreInfo; +class CFWL_FormImp : public CFWL_PanelImp +{ +public: + CFWL_FormImp(IFWL_Widget *pOuter = NULL); + CFWL_FormImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter = NULL); + virtual ~CFWL_FormImp(); + virtual FWL_ERR GetClassName(CFX_WideString &wsClass) const; + virtual FX_DWORD GetClassID() const; + virtual FX_BOOL IsInstance(FX_WSTR wsClass) const; + virtual FWL_ERR Initialize(); + virtual FWL_ERR Finalize(); + + virtual FWL_ERR GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize = FALSE); + virtual FWL_ERR GetClientRect(CFX_RectF &rect); + virtual FWL_ERR Update(); + virtual FX_DWORD HitTest(FX_FLOAT fx, FX_FLOAT fy); + virtual FWL_ERR DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); + virtual FWL_FORMSIZE GetFormSize(); + virtual FWL_ERR SetFormSize(FWL_FORMSIZE eFormSize); + virtual IFWL_Widget* DoModal(); + virtual IFWL_Widget* DoModal(FX_DWORD &dwCommandID); + virtual FWL_ERR EndDoModal(); + virtual FWL_ERR SetBorderRegion(CFX_Path *pPath); + virtual void DrawBackground(CFX_Graphics *pGraphics, IFWL_ThemeProvider *pTheme); + CFWL_WidgetImp* GetSubFocus(); + void SetSubFocus(CFWL_WidgetImp *pWidget); + CFX_MapAccelerators& GetAccelerator(); + void SetAccelerator(CFX_MapAccelerators *pAccelerators); +protected: + void ShowChildWidget(IFWL_Widget *pParent); + void RemoveSysButtons(); + void CalcContentRect(CFX_RectF &rtContent); + CFWL_SysBtn* GetSysBtnAtPoint(FX_FLOAT fx, FX_FLOAT fy); + CFWL_SysBtn* GetSysBtnByState(FX_DWORD dwState); + CFWL_SysBtn* GetSysBtnByIndex(FX_INT32 nIndex); + FX_INT32 GetSysBtnIndex(CFWL_SysBtn *pBtn); + FX_FLOAT GetCaptionHeight(); + void DrawCaptionText(CFX_Graphics *pGs, IFWL_ThemeProvider *pTheme, const CFX_Matrix* pMatrix = NULL); + void DrawIconImage(CFX_Graphics *pGs, IFWL_ThemeProvider *pTheme, const CFX_Matrix* pMatrix = NULL); + void GetEdgeRect(CFX_RectF &rtEdge); + void SetWorkAreaRect(); + void SetCursor(FX_FLOAT fx, FX_FLOAT fy); + void Layout(); + void ReSetSysBtn(); + void RegisterForm(); + void UnRegisterForm(); + FX_BOOL IsDoModal(); + void SetThemeData(); + FX_BOOL HasIcon(); + void UpdateIcon(); + void UpdateCaption(); + void DoWidthLimit(FX_FLOAT &fLeft, FX_FLOAT &fWidth, FX_FLOAT fCurX, FX_FLOAT fSpace, FX_FLOAT fLimitMin, FX_FLOAT fLimitMax, FX_BOOL bLeft); + void DoHeightLimit(FX_FLOAT &fTop, FX_FLOAT &fHeight, FX_FLOAT fCurY, FX_FLOAT fSpace, FX_FLOAT fLimitMin, FX_FLOAT fLimitMax, FX_BOOL bTop); + CFX_MapAccelerators m_mapAccelerators; + CFX_RectF m_rtRestore; + CFX_RectF m_rtCaptionText; + CFX_RectF m_rtRelative; + CFX_RectF m_rtCaption; + CFX_RectF m_rtIcon; + CFWL_SysBtn *m_pCloseBox; + CFWL_SysBtn *m_pMinBox; + CFWL_SysBtn *m_pMaxBox; + CFWL_SysBtn *m_pCaptionBox; + CFWL_NoteLoop *m_pNoteLoop; + CFWL_WidgetImp *m_pSubFocus; + RestoreInfo m_InfoStart; + FX_FLOAT m_fCXBorder; + FX_FLOAT m_fCYBorder; + FX_INT32 m_iCaptureBtn; + FX_INT32 m_iSysBox; + FX_INT32 m_eResizeType; + FX_BOOL m_bLButtonDown; + FX_BOOL m_bMaximized; + FX_BOOL m_bSetMaximize; + FX_BOOL m_bCustomizeLayout; + FWL_FORMSIZE m_eFormSize; + FX_BOOL m_bDoModalFlag; + FX_FLOAT m_fSmallIconSz; + FX_FLOAT m_fBigIconSz; + CFX_DIBitmap *m_pBigIcon; + CFX_DIBitmap *m_pSmallIcon; + FX_BOOL m_bMouseIn; + friend class CFWL_FormDelegate; +}; +class CFWL_FormDelegate : public CFWL_WidgetImpDelegate +{ +public: + CFWL_FormDelegate(CFWL_FormImp *pOwner); + virtual FX_INT32 OnProcessMessage(CFWL_Message *pMessage); + virtual FWL_ERR OnProcessEvent(CFWL_Event *pEvent); + virtual FWL_ERR OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); +protected: + void OnLButtonDown(CFWL_MsgMouse *pMsg); + void OnLButtonUp(CFWL_MsgMouse *pMsg); + void OnMouseMove(CFWL_MsgMouse *pMsg); + void OnMouseHover(CFWL_MsgMouse *pMsg); + void OnMouseLeave(CFWL_MsgMouse *pMsg); + void OnLButtonDblClk(CFWL_MsgMouse *pMsg); + void OnWindowMove(CFWL_MsgWindowMove *pMsg); + void OnClose(CFWL_MsgClose *pMsg); + CFWL_FormImp *m_pOwner; +}; +#endif diff --git a/xfa/src/fwl/src/core/include/fwl_gridimp.h b/xfa/src/fwl/src/core/include/fwl_gridimp.h new file mode 100644 index 0000000000..7538f1b048 --- /dev/null +++ b/xfa/src/fwl/src/core/include/fwl_gridimp.h @@ -0,0 +1,161 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FWL_GRID_IMP_H +#define _FWL_GRID_IMP_H +class CFWL_Content; +class IFWL_Widget; +class CFWL_GridLength; +class CFWL_GridColRow; +class CFWL_GridWidgetInfo; +class CFWL_GridImp; +class CFWL_GridLength : public CFX_Object +{ +public: + CFWL_GridLength() + : fLength(0) + , eUnit(FWL_GRIDUNIT_Fixed) + { + } + CFWL_GridLength(FX_FLOAT fValue, FWL_GRIDUNIT e) + : fLength(fValue) + , eUnit(e) + { + } + FX_FLOAT fLength; + FWL_GRIDUNIT eUnit; +}; +class CFWL_GridColRow : public CFX_Object +{ +public: + CFWL_GridColRow() + : m_Size (1, FWL_GRIDUNIT_Scaled) + , m_MinSize(0, FWL_GRIDUNIT_Fixed) + , m_MaxSize(0, FWL_GRIDUNIT_Infinity) + , m_fActualSize(0) + , m_fActualPos(0) + { + } + CFWL_GridLength m_Size; + CFWL_GridLength m_MinSize; + CFWL_GridLength m_MaxSize; + FX_FLOAT m_fActualSize; + FX_FLOAT m_fActualPos; +}; +class CFWL_GridWidgetInfo : public CFX_Object +{ +public: + CFWL_GridWidgetInfo() + : m_iColumn (0) + , m_iColumnSpan(1) + , m_iRow(0) + , m_iRowSpan(1) + , m_dwMarginFlag(0) + , m_fActualWidth(0) + , m_fActualHeight(0) + { + m_Size[FWL_GRIDSIZE_Width].eUnit = FWL_GRIDUNIT_Auto; + m_Size[FWL_GRIDSIZE_Width].fLength = 0; + m_Size[FWL_GRIDSIZE_Height].eUnit = FWL_GRIDUNIT_Auto; + m_Size[FWL_GRIDSIZE_Height].fLength = 0; + m_Size[FWL_GRIDSIZE_MinWidth].eUnit = FWL_GRIDUNIT_Fixed; + m_Size[FWL_GRIDSIZE_MinWidth].fLength = 0; + m_Size[FWL_GRIDSIZE_MaxWidth].eUnit = FWL_GRIDUNIT_Infinity; + m_Size[FWL_GRIDSIZE_MaxWidth].fLength = 0; + m_Size[FWL_GRIDSIZE_MinHeight].eUnit = FWL_GRIDUNIT_Fixed; + m_Size[FWL_GRIDSIZE_MinHeight].fLength = 0; + m_Size[FWL_GRIDSIZE_MaxHeight].eUnit = FWL_GRIDUNIT_Infinity; + m_Size[FWL_GRIDSIZE_MaxHeight].fLength = 0; + m_Margin[0] = m_Margin[1] = m_Margin[2] = m_Margin[3] = 0; + } + FX_INT32 m_iColumn; + FX_INT32 m_iColumnSpan; + FX_INT32 m_iRow; + FX_INT32 m_iRowSpan; + CFWL_GridLength m_Size[6]; + FX_DWORD m_dwMarginFlag; + FX_FLOAT m_Margin[4]; + FX_FLOAT m_fActualWidth; + FX_FLOAT m_fActualHeight; +}; +class CFWL_GridImp : public CFWL_ContentImp +{ +public: + CFWL_GridImp(); + CFWL_GridImp(const CFWL_WidgetImpProperties &properties); + virtual ~CFWL_GridImp(); + virtual FWL_ERR GetClassName(CFX_WideString &wsClass) const; + virtual FX_DWORD GetClassID() const; + virtual FWL_ERR Initialize(); + virtual FWL_ERR Finalize(); + virtual FWL_ERR GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize = FALSE); + virtual FWL_ERR SetWidgetRect(const CFX_RectF &rect); + virtual FWL_ERR Update(); + virtual FWL_ERR DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); + + virtual FWL_ERR InsertWidget(IFWL_Widget *pChild, FX_INT32 nIndex = -1); + virtual FWL_ERR RemoveWidget(IFWL_Widget *pWidget); + virtual FWL_HGRIDCOLROW InsertColRow(FX_BOOL bColumn, FX_INT32 nIndex = -1); + virtual FX_INT32 CountColRows(FX_BOOL bColumn); + virtual FWL_HGRIDCOLROW GetColRow(FX_BOOL bColumn, FX_INT32 nIndex); + virtual FX_INT32 GetIndex(FWL_HGRIDCOLROW hColRow); + virtual FX_FLOAT GetSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT &eUnit); + virtual FWL_ERR SetSize(FWL_HGRIDCOLROW hColRow, FX_FLOAT fSize, FWL_GRIDUNIT eUnit); + virtual FX_FLOAT GetMinSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT &eUnit); + virtual FWL_ERR SetMinSize(FWL_HGRIDCOLROW hColRow, FX_FLOAT fSize, FWL_GRIDUNIT eUnit); + virtual FX_FLOAT GetMaxSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT &eUnit); + virtual FWL_ERR SetMaxSize(FWL_HGRIDCOLROW hColRow, FX_FLOAT fSize, FWL_GRIDUNIT eUnit); + virtual FX_BOOL DeleteColRow(FWL_HGRIDCOLROW hColRow); + virtual FX_BOOL IsColumn(FWL_HGRIDCOLROW hColRow); + virtual FX_INT32 GetWidgetPos(IFWL_Widget *pWidget, FX_BOOL bColumn); + virtual FWL_ERR SetWidgetPos(IFWL_Widget *pWidget, FX_INT32 iPos, FX_BOOL bColumn); + virtual FX_INT32 GetWidgetSpan(IFWL_Widget *pWidget, FX_BOOL bColumn); + virtual FWL_ERR SetWidgetSpan(IFWL_Widget *pWidget, FX_INT32 iSpan, FX_BOOL bColumn); + virtual FX_FLOAT GetWidgetSize(IFWL_Widget *pWidget, FWL_GRIDSIZE eSize, FWL_GRIDUNIT &eUnit); + virtual FWL_ERR SetWidgetSize(IFWL_Widget *pWidget, FWL_GRIDSIZE eSize, FX_FLOAT fSize, FWL_GRIDUNIT eUit); + virtual FX_BOOL GetWidgetMargin(IFWL_Widget *pWidget, FWL_GRIDMARGIN eMargin, FX_FLOAT &fMargin); + virtual FWL_ERR SetWidgetMargin(IFWL_Widget *pWidget, FWL_GRIDMARGIN eMargin, FX_FLOAT fMargin); + virtual FWL_ERR RemoveWidgetMargin(IFWL_Widget *pWidget, FWL_GRIDMARGIN eMargin); + virtual FX_FLOAT GetGridSize(FWL_GRIDSIZE eSize, FWL_GRIDUNIT &eUnit); + virtual FWL_ERR SetGridSize(FWL_GRIDSIZE eSize, FX_FLOAT fSize, FWL_GRIDUNIT eUit); +protected: + CFWL_GridWidgetInfo* GetWidgetInfo(IFWL_Widget* pWidget); + void ProcFixedColRow(CFWL_GridColRow *pColRow, FX_INT32 nIndex, FX_FLOAT fColRowSize, FX_BOOL bColumn); + void ProcAutoColRow(CFWL_GridColRow *pColRow, FX_INT32 nIndex, FX_BOOL bColumn); + void ProcScaledColRow(CFWL_GridColRow *pColRow, FX_INT32 nIndex, FX_FLOAT fColRowSize, FX_BOOL bColumn); + void CalcWidgetWidth(IFWL_Widget *pWidget, CFWL_GridWidgetInfo *pInfo, FX_FLOAT fColunmWidth); + void CalcWidgetHeigt(IFWL_Widget *pWidget, CFWL_GridWidgetInfo *pInfo, FX_FLOAT fRowHeigt); + FX_FLOAT CalcAutoColumnWidgetWidth(IFWL_Widget *pWidget, CFWL_GridWidgetInfo* pInfo); + FX_FLOAT CalcAutoColumnWidgetHeight(IFWL_Widget *pWidget, CFWL_GridWidgetInfo* pInfo); + FX_FLOAT ProcessColumns(FX_FLOAT fWidth); + FX_FLOAT ProcessRows(FX_FLOAT fHeight); + FX_FLOAT ProcessUnCertainColumns(); + FX_FLOAT ProcessUnCertainRows(); + FX_BOOL SetColRowActualSize(CFWL_GridColRow *pColRow, FX_FLOAT fSize, FX_BOOL bSetBeyond = FALSE); + FX_FLOAT SetWidgetActualWidth(CFWL_GridWidgetInfo *pInfo, FX_FLOAT fWidth); + FX_FLOAT SetWidgetActualHeight(CFWL_GridWidgetInfo *pInfo, FX_FLOAT fHeight); + void SetAllWidgetsRect(); + FX_BOOL IsGrid(IFWL_Widget *pWidget); + void SetSpanAutoColRowSize(const CFX_PtrArray &spanAutos, FX_FLOAT fTotalSize); + void SetSpanScaledColRowSize(const CFX_PtrArray &spanScaleds, FX_FLOAT fTotalSize, FX_FLOAT fTotalScaledNum); + void SetScaledColRowsSize(const CFX_PtrArray &spanScaleds, FX_FLOAT fTotalSize, FX_FLOAT fTotalScaledNum); + CFX_PtrArray m_Rows; + CFX_PtrArray m_Columns; + CFX_PtrArray m_Widgets; + CFX_MapPtrToPtr m_mapWidgetInfo; + CFWL_GridLength m_Size[6]; + friend class CFWL_GridDelegate; +}; +class CFWL_GridDelegate : public CFWL_WidgetImpDelegate +{ +public: + CFWL_GridDelegate(CFWL_GridImp *pOwner); + virtual FX_INT32 OnProcessMessage(CFWL_Message *pMessage); + virtual FWL_ERR OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); +protected: + CFWL_GridImp *m_pOwner; +}; +#endif diff --git a/xfa/src/fwl/src/core/include/fwl_noteimp.h b/xfa/src/fwl/src/core/include/fwl_noteimp.h new file mode 100644 index 0000000000..1e7239289b --- /dev/null +++ b/xfa/src/fwl/src/core/include/fwl_noteimp.h @@ -0,0 +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 + +#ifndef _FWL_NOTE_IMP_H +#define _FWL_NOTE_IMP_H +class CFWL_Target; +class CFWL_WidgetImp; +class CFWL_NoteThread; +class CFWL_ToolTipImp; +class IFWL_ToolTipTarget; +class CFWL_CoreToopTipDP; +class CFWL_NoteLoop; +class CFWL_NoteDriver; +class CFWL_EventTarget; +class CFWL_ToolTipContainer; +class CFWL_NoteLoop : public CFX_Object +{ +public: + CFWL_NoteLoop(CFWL_WidgetImp *pForm = NULL); + virtual FX_BOOL PreProcessMessage(CFWL_Message *pMessage); + virtual FWL_ERR Idle(FX_INT32 count); + CFWL_WidgetImp* GetForm(); + FX_BOOL ContinueModal(); + FWL_ERR EndModalLoop(); + FX_BOOL TranslateAccelerator(CFWL_Message *pMessage); + FWL_ERR SetMainForm(CFWL_WidgetImp *pForm); +protected: + void GenerateCommondEvent(FX_DWORD dwCommand); + + CFWL_WidgetImp *m_pForm; + FX_BOOL m_bContinueModal; +}; +class CFWL_NoteDriver : public CFX_Object +{ +public: + CFWL_NoteDriver(); + ~CFWL_NoteDriver(); + virtual FX_BOOL SendNote(CFWL_Note *pNote); + virtual FX_BOOL PostMessage(CFWL_Message *pMessage); + virtual FWL_ERR RegisterEventTarget(IFWL_Widget *pListener, IFWL_Widget *pEventSource = NULL, FX_DWORD dwFilter = FWL_EVENT_ALL_MASK); + virtual FWL_ERR UnregisterEventTarget(IFWL_Widget *pListener); + virtual void ClearEventTargets(FX_BOOL bRemoveAll); + virtual FX_INT32 GetQueueMaxSize() const; + virtual FWL_ERR SetQueueMaxSize(const FX_INT32 size); + virtual IFWL_NoteThread* GetOwnerThread() const; + virtual FWL_ERR PushNoteLoop(IFWL_NoteLoop *pNoteLoop); + virtual IFWL_NoteLoop* PopNoteLoop(); + virtual FX_BOOL SetFocus(IFWL_Widget *pFocus, FX_BOOL bNotify = FALSE); + virtual FWL_ERR Run(); + IFWL_Widget* GetFocus(); + IFWL_Widget* GetHover(); + void SetHover(IFWL_Widget *pHover); + void SetGrab(IFWL_Widget *pGrab, FX_BOOL bSet); + void NotifyTargetHide(IFWL_Widget *pNoteTarget); + void NotifyTargetDestroy(IFWL_Widget *pNoteTarget); + void NotifyFullScreenMode(IFWL_Widget *pNoteTarget, FX_BOOL bFullScreen); + FWL_ERR RegisterForm(CFWL_WidgetImp *pForm); + FWL_ERR UnRegisterForm(CFWL_WidgetImp *pForm); + FX_BOOL QueueMessage(CFWL_Message *pMessage); + FX_BOOL UnqueueMessage(CFWL_NoteLoop *pNoteLoop); + CFWL_NoteLoop* GetTopLoop(); + FX_INT32 CountLoop(); + void SetHook(FWLMessageHookCallback callback, FX_LPVOID info); + FX_BOOL ProcessMessage(CFWL_Message *pMessage); +protected: + FX_BOOL DispatchMessage(CFWL_Message *pMessage, IFWL_Widget *pMessageForm); + FX_BOOL DoActivate(CFWL_MsgActivate *pMsg, IFWL_Widget *pMessageForm); + FX_BOOL DoDeactivate(CFWL_MsgDeactivate *pMsg, IFWL_Widget *pMessageForm); + FX_BOOL DoSetFocus(CFWL_MsgSetFocus *pMsg, IFWL_Widget *pMessageForm); + FX_BOOL DoKillFocus(CFWL_MsgKillFocus *pMsg, IFWL_Widget *pMessageForm); + FX_BOOL DoKey(CFWL_MsgKey *pMsg, IFWL_Widget *pMessageForm); + FX_BOOL DoMouse(CFWL_MsgMouse *pMsg, IFWL_Widget *pMessageForm); + FX_BOOL DoWheel(CFWL_MsgMouseWheel *pMsg, IFWL_Widget *pMessageForm); + FX_BOOL DoSize(CFWL_MsgSize *pMsg); + FX_BOOL DoWindowMove(CFWL_MsgWindowMove *pMsg, IFWL_Widget *pMessageForm); + FX_BOOL DoDragFiles(CFWL_MsgDropFiles *pMsg, IFWL_Widget *pMessageForm); + FX_BOOL DoMouseEx(CFWL_MsgMouse *pMsg, IFWL_Widget *pMessageForm); + void MouseSecondary(CFWL_MsgMouse *pMsg); + FX_BOOL IsValidMessage(CFWL_Message *pMessage); + IFWL_Widget* GetMessageForm(IFWL_Widget *pDstTarget); + void ClearInvalidEventTargets(FX_BOOL bRemoveAll); + CFX_PtrArray m_forms; + CFX_PtrArray m_noteQueue; + CFX_PtrArray m_noteLoopQueue; + CFX_MapPtrToPtr m_eventTargets; + FX_INT32 m_sendEventCalled; + FX_INT32 m_maxSize; + FX_BOOL m_bFullScreen; + IFWL_Widget *m_pHover; + IFWL_Widget *m_pFocus; + IFWL_Widget *m_pGrab; + CFWL_NoteLoop *m_pNoteLoop; + FWLMessageHookCallback m_hook; + FX_LPVOID m_hookInfo; +}; +typedef CFX_MapPtrTemplate CFWL_EventSource; +class CFWL_EventTarget : public CFX_Object +{ +public: + CFWL_EventTarget(CFWL_NoteDriver *pNoteDriver, IFWL_Widget *pListener) + : m_pNoteDriver(pNoteDriver) + , m_pListener(pListener) + , m_bInvalid(FALSE) + { + } + ~CFWL_EventTarget(); + FX_INT32 SetEventSource(IFWL_Widget *pSource, FX_DWORD dwFilter = FWL_EVENT_ALL_MASK); + FX_BOOL ProcessEvent(CFWL_Event *pEvent); + FX_BOOL IsFilterEvent(CFWL_Event *pEvent, FX_DWORD dwFilter); + FX_BOOL IsInvalid() + { + return m_bInvalid; + } + void FlagInvalid() + { + m_bInvalid = TRUE; + } +protected: + CFWL_EventSource m_eventSources; + IFWL_Widget *m_pListener; + CFWL_NoteDriver *m_pNoteDriver; + FX_BOOL m_bInvalid; +}; +class CFWL_ToolTipContainer: public CFX_Object +{ +public: + virtual ~CFWL_ToolTipContainer(); + static CFWL_ToolTipContainer* getInstance(); + + FX_ERR AddToolTipTarget(IFWL_ToolTipTarget *pTarget); + FX_ERR RemoveToolTipTarget(IFWL_ToolTipTarget *pTarget); + IFWL_ToolTipTarget* GetCurrentToolTipTarget(); + + FX_BOOL HasToolTip(IFWL_Widget *pWidget); + + FX_BOOL ProcessEnter(CFWL_EvtMouse *pEvt, IFWL_Widget *pOwner); + FX_BOOL ProcessLeave(CFWL_EvtMouse *pEvt); + + FX_ERR SetToolTipInitialDelay(FX_INT32 iDelayTime); + FX_ERR SetToolTipAutoPopDelay(FX_INT32 iDelayTime); +protected: + CFWL_ToolTipContainer(); + + IFWL_ToolTipTarget *pCurTarget; + CFWL_ToolTipImp *m_pToolTipImp; + CFWL_CoreToopTipDP *m_ToolTipDp; + CFX_PtrArray m_arrWidget; +}; +#endif diff --git a/xfa/src/fwl/src/core/include/fwl_panelimp.h b/xfa/src/fwl/src/core/include/fwl_panelimp.h new file mode 100644 index 0000000000..bdaf8bd2a8 --- /dev/null +++ b/xfa/src/fwl/src/core/include/fwl_panelimp.h @@ -0,0 +1,29 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FWL_PANEL_IMP_H +#define _FWL_PANEL_IMP_H +class CFWL_WidgetImp; +class CFWL_WidgetImpProperties; +class IFWL_Widget; +class IFWL_Content; +class CFWL_PanelImp; +class CFWL_PanelImp : public CFWL_WidgetImp +{ +public: + CFWL_PanelImp(IFWL_Widget *pOuter = NULL); + CFWL_PanelImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter = NULL); + virtual ~CFWL_PanelImp(); + virtual FWL_ERR GetClassName(CFX_WideString &wsClass) const; + virtual FX_DWORD GetClassID() const; + virtual FWL_ERR GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize = FALSE); + virtual FWL_ERR Update(); + virtual IFWL_Content* GetContent(); + virtual FWL_ERR SetContent(IFWL_Content *pContent); +protected: + IFWL_Content *m_pContent; +}; +#endif diff --git a/xfa/src/fwl/src/core/include/fwl_targetimp.h b/xfa/src/fwl/src/core/include/fwl_targetimp.h new file mode 100644 index 0000000000..14e54cdebc --- /dev/null +++ b/xfa/src/fwl/src/core/include/fwl_targetimp.h @@ -0,0 +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 _FWL_TARGET_IMP_H +#define _FWL_TARGET_IMP_H +class IFWL_Target; +class CFWL_Target; +class CFWL_Target : public CFX_Object +{ +public: + virtual FX_DWORD Release(); + virtual IFWL_Target* Retain(); + virtual FX_DWORD GetRefCount() const; + virtual FWL_ERR GetClassName(CFX_WideString &wsClass) const; + virtual FX_DWORD GetClassID() const; + virtual FX_BOOL IsInstance(FX_WSTR wsClass) const; + virtual FWL_ERR Initialize(); + virtual FWL_ERR Finalize(); +protected: + CFWL_Target(); + virtual ~CFWL_Target(); + FX_DWORD m_dwRefCount; +}; +class IFWL_TargetData : public IFWL_Target +{ +public: + FX_LPVOID GetData(); + void SetData(FX_LPVOID pData); +}; +#endif diff --git a/xfa/src/fwl/src/core/include/fwl_threadimp.h b/xfa/src/fwl/src/core/include/fwl_threadimp.h new file mode 100644 index 0000000000..d7ac365c61 --- /dev/null +++ b/xfa/src/fwl/src/core/include/fwl_threadimp.h @@ -0,0 +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 + +#ifndef _FWL_THREAD_IMP_H +#define _FWL_THREAD_IMP_H +class CFWL_Target; +class CFWL_NoteDriver; +class IFWL_NoteThread; +class IFWL_NoteDriver; +class CFWL_Thread; +class CFWL_NoteThread; +class CFWL_ControlThread; +class CFWL_Thread : public CFX_Object +{ +public: + CFWL_Thread(); + virtual ~CFWL_Thread(); + virtual void Release() + { + delete this; + } + virtual FWL_ERR Run(FWL_HTHREAD hThread); +}; +class CFWL_ControlThread : public CFWL_Thread +{ +public: + CFWL_ControlThread(IFWL_Thread * defHandler) + { + _defHandler = defHandler; + } + virtual ~CFWL_ControlThread(); + virtual FWL_ERR Run(FWL_HTHREAD hThread); +protected: + IFWL_Thread * _defHandler; +}; +class CFWL_NoteThread : public CFWL_Thread +{ +public: + CFWL_NoteThread(); + virtual ~CFWL_NoteThread(); + virtual FWL_ERR Run(FWL_HTHREAD hThread); + virtual IFWL_NoteDriver* GetNoteDriver(); +protected: + CFWL_NoteDriver *m_pNoteDriver; + FWL_HTHREAD m_hThread; + static CFWL_ControlThread * _assistantThreadHandler; + static FWL_HTHREAD _assistantThread; + static FX_INT32 _refCount; +}; +#endif diff --git a/xfa/src/fwl/src/core/include/fwl_widgetimp.h b/xfa/src/fwl/src/core/include/fwl_widgetimp.h new file mode 100644 index 0000000000..439bdac956 --- /dev/null +++ b/xfa/src/fwl/src/core/include/fwl_widgetimp.h @@ -0,0 +1,128 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FWL_WIDGET_IMP_H +#define _FWL_WIDGET_IMP_H +class CFWL_NoteTarget; +class CFWL_NoteThread; +class CFWL_WidgetImpProperties; +class CFWL_WidgetMgr; +class IFWL_Widget; +class IFWL_ThemeProvider; +class IFWL_DataProvider; +class IFWL_WidgetDelegate; +class CFWL_WidgetImp; +class CFWL_WidgetImp : public CFWL_Target +{ +public: + virtual FWL_ERR Initialize(); + virtual FWL_ERR Finalize(); + + virtual FWL_ERR GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize = FALSE); + virtual FWL_ERR GetGlobalRect(CFX_RectF &rect); + virtual FWL_ERR SetWidgetRect(const CFX_RectF &rect); + virtual FWL_ERR GetClientRect(CFX_RectF &rect); + virtual IFWL_Widget* GetParent(); + virtual FWL_ERR SetParent(IFWL_Widget *pParent); + virtual IFWL_Widget* GetOwner(); + virtual FWL_ERR SetOwner(IFWL_Widget *pOwner); + virtual IFWL_Widget* GetOuter(); + virtual FX_DWORD GetStyles(); + virtual FWL_ERR ModifyStyles(FX_DWORD dwStylesAdded, FX_DWORD dwStylesRemoved); + virtual FX_DWORD GetStylesEx(); + virtual FWL_ERR ModifyStylesEx(FX_DWORD dwStylesExAdded, FX_DWORD dwStylesExRemoved); + virtual FX_DWORD GetStates(); + virtual FWL_ERR SetStates(FX_DWORD dwStates, FX_BOOL bSet = TRUE); + virtual FWL_ERR SetPrivateData(FX_LPVOID module_id, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback); + virtual FX_LPVOID GetPrivateData(FX_LPVOID module_id); + virtual FWL_ERR Update(); + virtual FWL_ERR LockUpdate(); + virtual FWL_ERR UnlockUpdate(); + virtual FX_DWORD HitTest(FX_FLOAT fx, FX_FLOAT fy); + virtual FWL_ERR TransformTo(IFWL_Widget *pWidget, FX_FLOAT &fx, FX_FLOAT &fy); + virtual FWL_ERR TransformTo(IFWL_Widget *pWidget, CFX_RectF &rt); + virtual FWL_ERR GetMatrix(CFX_Matrix &matrix, FX_BOOL bGlobal = FALSE); + virtual FWL_ERR SetMatrix(const CFX_Matrix &matrix); + virtual FWL_ERR DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); + virtual IFWL_ThemeProvider* GetThemeProvider(); + virtual FWL_ERR SetThemeProvider(IFWL_ThemeProvider *pThemeProvider); + virtual FWL_ERR SetDataProvider(IFWL_DataProvider *pDataProvider); + virtual IFWL_WidgetDelegate*SetDelegate(IFWL_WidgetDelegate *pDelegate); + virtual IFWL_NoteThread* GetOwnerThread() const; + FWL_ERR SetOwnerThread(CFWL_NoteThread *pOwnerThread); + FWL_ERR GetProperties(CFWL_WidgetImpProperties &properties); + FWL_ERR SetProperties(const CFWL_WidgetImpProperties &properties); + IFWL_Widget* GetInterface(); + void SetInterface(IFWL_Widget *pInterface); + CFX_SizeF GetOffsetFromParent(IFWL_Widget *pParent); +protected: + CFWL_WidgetImp(IFWL_Widget *pOuter = NULL); + CFWL_WidgetImp(const CFWL_WidgetImpProperties &properties, IFWL_Widget *pOuter = NULL); + virtual ~CFWL_WidgetImp(); + FX_BOOL IsEnabled(); + FX_BOOL IsVisible(); + FX_BOOL IsActive(); + FX_BOOL IsOverLapper(); + FX_BOOL IsPopup(); + FX_BOOL IsChild(); + FX_BOOL IsLocked(); + FX_BOOL IsOffscreen(); + FX_BOOL HasBorder(); + FX_BOOL HasEdge(); + void GetEdgeRect(CFX_RectF &rtEdge); + FX_FLOAT GetBorderSize(FX_BOOL bCX = TRUE); + FX_FLOAT GetEdgeWidth(); + void GetRelativeRect(CFX_RectF &rect); + FX_LPVOID GetThemeCapacity(FX_DWORD dwCapacity); + IFWL_ThemeProvider* GetAvailableTheme(); + CFWL_WidgetImp* GetRootOuter(); + CFWL_WidgetImp* GetSameAncestor(CFWL_WidgetImp *pWidget); + CFX_SizeF GetOffsetFromAncestor(CFWL_WidgetImp *pAncestor); + FX_BOOL TransformToOuter(FX_FLOAT &fx, FX_FLOAT &fy); + FX_BOOL TransformFromOuter(FX_FLOAT &fx, FX_FLOAT &fy); + CFX_SizeF CalcTextSize(const CFX_WideString &wsText, IFWL_ThemeProvider *pTheme, FX_BOOL bMultiLine = FALSE, FX_INT32 iLineWidth = -1); + void CalcTextRect(const CFX_WideString &wsText, IFWL_ThemeProvider *pTheme, FX_DWORD dwTTOStyles, FX_INT32 iTTOAlign, CFX_RectF &rect); + void SetFocus(FX_BOOL bFocus); + void SetGrab(FX_BOOL bSet); + FX_BOOL GetPopupPos(FX_FLOAT fMinHeight, FX_FLOAT fMaxHeight, const CFX_RectF &rtAnchor, CFX_RectF &rtPopup); + FX_BOOL GetPopupPosMenu(FX_FLOAT fMinHeight, FX_FLOAT fMaxHeight, const CFX_RectF &rtAnchor, CFX_RectF &rtPopup); + FX_BOOL GetPopupPosComboBox(FX_FLOAT fMinHeight, FX_FLOAT fMaxHeight, const CFX_RectF &rtAnchor, CFX_RectF &rtPopup); + FX_BOOL GetPopupPosGeneral(FX_FLOAT fMinHeight, FX_FLOAT fMaxHeight, const CFX_RectF &rtAnchor, CFX_RectF &rtPopup); + FX_BOOL GetScreenSize(FX_FLOAT &fx, FX_FLOAT &fy); + void RegisterEventTarget(IFWL_Widget *pEventSource = NULL, FX_DWORD dwFilter = FWL_EVENT_ALL_MASK); + void UnregisterEventTarget(); + void DispatchKeyEvent(CFWL_MsgKey *pNote); + void DispatchEvent(CFWL_Event *pEvent); + void Repaint(const CFX_RectF *pRect = NULL); + void DrawBackground(CFX_Graphics *pGraphics, FX_INT32 iPartBk, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix = NULL); + void DrawBorder(CFX_Graphics *pGraphics, FX_INT32 iPartBorder, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix = NULL); + void DrawEdge(CFX_Graphics *pGraphics, FX_INT32 iPartEdge, IFWL_ThemeProvider *pTheme, const CFX_Matrix *pMatrix = NULL); + void NotifyDriver(); + + FX_BOOL IsParent(IFWL_Widget *pParent); + CFWL_WidgetMgr *m_pWidgetMgr; + CFWL_NoteThread *m_pOwnerThread; + CFWL_WidgetImpProperties *m_pProperties; + CFX_PrivateData *m_pPrivateData; + IFWL_WidgetDelegate *m_pDelegate; + IFWL_WidgetDelegate *m_pCurDelegate; + IFWL_Widget *m_pOuter; + IFWL_Widget *m_pInterface; + FX_INT32 m_iLock; + friend class CFWL_WidgetImpDelegate; + friend void FWL_SetWidgetRect(IFWL_Widget *widget, const CFX_RectF &rect); + friend void FWL_SetWidgetStates(IFWL_Widget *widget, FX_DWORD dwStates); + friend void FWL_SetWidgetStyles(IFWL_Widget *widget, FX_DWORD dwStyles); +}; +class CFWL_WidgetImpDelegate : public CFX_Object +{ +public: + CFWL_WidgetImpDelegate(); + virtual FX_INT32 OnProcessMessage(CFWL_Message *pMessage); + virtual FWL_ERR OnProcessEvent(CFWL_Event *pEvent); + virtual FWL_ERR OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); +}; +#endif diff --git a/xfa/src/fwl/src/core/include/fwl_widgetmgrimp.h b/xfa/src/fwl/src/core/include/fwl_widgetmgrimp.h new file mode 100644 index 0000000000..3defb63f08 --- /dev/null +++ b/xfa/src/fwl/src/core/include/fwl_widgetmgrimp.h @@ -0,0 +1,142 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FWL_WIDGETMGR_IMP_H +#define _FWL_WIDGETMGR_IMP_H +class CFWL_Target; +class IFWL_Widget; +class IFWL_AdapterWidgetMgr; +class CFWL_WidgetMgrItem; +class CFWL_WidgetMgr; +class CFWL_WidgetMgrDelegate; +class IFWL_AdapterNative; +class CFWL_WidgetMgrItem : public CFX_Object +{ +public: + CFWL_WidgetMgrItem() + : pParent(NULL) + , pOwner(NULL) + , pChild(NULL) + , pPrevious(NULL) + , pNext(NULL) + , pWidget(NULL) + , pOffscreen(NULL) + , iRedrawCounter(0) +#if (_FX_OS_==_FX_WIN32_DESKTOP_) || (_FX_OS_==_FX_WIN64_) + , bOutsideChanged(FALSE) +#endif + { + } + ~CFWL_WidgetMgrItem() + { + if (pOffscreen) { + delete pOffscreen; + pOffscreen = NULL; + } + } + CFWL_WidgetMgrItem *pParent; + CFWL_WidgetMgrItem *pOwner; + CFWL_WidgetMgrItem *pChild; + CFWL_WidgetMgrItem *pPrevious; + CFWL_WidgetMgrItem *pNext; + IFWL_Widget *pWidget; + CFX_Graphics *pOffscreen; + FX_INT32 iRedrawCounter; +#if (_FX_OS_==_FX_WIN32_DESKTOP_) || (_FX_OS_==_FX_WIN64_) + FX_BOOL bOutsideChanged; +#endif +}; +class CFWL_WidgetMgr : public CFX_Object +{ +public: + CFWL_WidgetMgr(IFWL_AdapterNative *pAdapterNative); + ~CFWL_WidgetMgr(); + virtual FX_INT32 CountWidgets(IFWL_Widget *pParent = NULL); + virtual IFWL_Widget* GetWidget(FX_INT32 nIndex, IFWL_Widget *pParent = NULL); + virtual IFWL_Widget* GetWidget(IFWL_Widget *pWidget, FWL_WGTRELATION eRelation); + virtual FX_INT32 GetWidgetIndex(IFWL_Widget *pWidget); + virtual FX_BOOL SetWidgetIndex(IFWL_Widget *pWidget, FX_INT32 nIndex); + virtual FX_BOOL IsWidget(FX_LPVOID pObj); + virtual FWL_ERR RepaintWidget(IFWL_Widget *pWidget, const CFX_RectF *pRect = NULL); + virtual FX_DWORD GetCapability() + { + return m_dwCapability; + } + void AddWidget(IFWL_Widget *pWidget); + void InsertWidget(IFWL_Widget *pParent, IFWL_Widget *pChild, FX_INT32 nIndex = -1); + void RemoveWidget(IFWL_Widget *pWidget); + void SetOwner(IFWL_Widget *pOwner, IFWL_Widget *pOwned); + void SetParent(IFWL_Widget *pParent, IFWL_Widget *pChild); + FX_BOOL IsChild(IFWL_Widget *pChild, IFWL_Widget *pParent); + FWL_ERR CreateWidget_Native(IFWL_Widget *pWidget); + FWL_ERR DestroyWidget_Native(IFWL_Widget *pWidget); + FWL_ERR GetWidgetRect_Native(IFWL_Widget *pWidget, CFX_RectF &rect); + FWL_ERR SetWidgetRect_Native(IFWL_Widget *pWidget, const CFX_RectF &rect); + FWL_ERR SetWidgetPosition_Native(IFWL_Widget *pWidget, FX_FLOAT fx, FX_FLOAT fy); + FWL_ERR SetWidgetIcon_Native(IFWL_Widget *pWidget, const CFX_DIBitmap *pIcon, FX_BOOL bBig); + FWL_ERR SetWidgetCaption_Native(IFWL_Widget *pWidget, FX_WSTR wsCaption); + FWL_ERR SetBorderRegion_Native(IFWL_Widget *pWidget, CFX_Path *pPath); + FWL_ERR ShowWidget_Native(IFWL_Widget *pWidget); + FWL_ERR HideWidget_Native(IFWL_Widget *pWidget); + FWL_ERR SetNormal_Native(IFWL_Widget *pWidget); + FWL_ERR SetMaximize_Native(IFWL_Widget *pWidget); + FWL_ERR SetMinimize_Native(IFWL_Widget *pWidget); + FX_BOOL CheckMessage_Native(); + FWL_ERR DispatchMessage_Native(); + FX_BOOL IsIdleMessage_Native(); + FWL_ERR Exit_Native(FX_INT32 iExitCode); + FWL_ERR CreateWidgetWithNativeId_Native(IFWL_Widget *pWidget, void *vp); + IFWL_Widget* GetWidgetAtPoint(IFWL_Widget *pParent, FX_FLOAT fx, FX_FLOAT fy); + void NotifySizeChanged(IFWL_Widget *pForm, FX_FLOAT fx, FX_FLOAT fy); + IFWL_Widget* nextTab(IFWL_Widget *parent, IFWL_Widget *focus, FX_BOOL &bFind); + FX_INT32 CountRadioButtonGroup(IFWL_Widget *pFirst); + IFWL_Widget* GetSiblingRadioButton(IFWL_Widget *pWidget, FX_BOOL bNext); + IFWL_Widget* GetRadioButtonGroupHeader(IFWL_Widget *pRadioButton); + void GetSameGroupRadioButton(IFWL_Widget *pRadioButton, CFX_PtrArray &group); + IFWL_Widget* GetDefaultButton(IFWL_Widget *pParent); + void AddRedrawCounts(IFWL_Widget *pWidget); + void ResetRedrawCounts(IFWL_Widget *pWidget); + IFWL_AdapterWidgetMgr* GetAdapterWidgetMgr() + { + return m_pAdapter; + } + CFWL_WidgetMgrDelegate* GetDelegate() + { + return m_pDelegate; + } + CFWL_WidgetMgrItem* GetWidgetMgrItem(IFWL_Widget *pWidget); + FX_BOOL IsThreadEnabled(); + FX_BOOL IsFormDisabled(); + FX_BOOL GetAdapterPopupPos(IFWL_Widget* pWidget, FX_FLOAT fMinHeight, FX_FLOAT fMaxHeight, const CFX_RectF &rtAnchor, CFX_RectF &rtPopup); +protected: + FX_INT32 TravelWidgetMgr(CFWL_WidgetMgrItem *pParent, FX_INT32 *pIndex, CFWL_WidgetMgrItem *pItem, IFWL_Widget **pWidget = NULL); + FX_BOOL IsAbleNative(IFWL_Widget *pWidget); + CFX_MapPtrToPtr m_mapWidgetItem; + IFWL_AdapterWidgetMgr *m_pAdapter; + CFWL_WidgetMgrDelegate *m_pDelegate; + friend class CFWL_WidgetMgrDelegate; + FX_DWORD m_dwCapability; +#if (_FX_OS_==_FX_WIN32_DESKTOP_) || (_FX_OS_==_FX_WIN64_) + CFX_RectF m_rtScreen; +#endif +}; +class CFWL_WidgetMgrDelegate : public CFX_Object +{ +public: + CFWL_WidgetMgrDelegate(CFWL_WidgetMgr *pWidgetMgr); + virtual FWL_ERR OnSetCapability(FX_DWORD dwCapability = FWL_WGTMGR_DisableThread); + virtual FX_INT32 OnProcessMessageToForm(CFWL_Message *pMessage); + virtual FWL_ERR OnDrawWidget(IFWL_Widget *pWidget, CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ); +protected: + void DrawChild(IFWL_Widget *pParent, const CFX_RectF &rtClip, CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ); + CFX_Graphics* DrawWidgetBefore(IFWL_Widget *pWidget, CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix); + void DrawWidgetAfter(IFWL_Widget *pWidget, CFX_Graphics *pGraphics, CFX_RectF &rtClip, const CFX_Matrix *pMatrix); + FX_BOOL IsNeedRepaint(IFWL_Widget *pWidget, CFX_Matrix *pMatrix, const CFX_RectF &rtDirty); + FX_BOOL bUseOffscreenDirect(IFWL_Widget *pWidget); + + CFWL_WidgetMgr *m_pWidgetMgr; +}; +#endif diff --git a/xfa/src/fwl/src/lightwidget/app.cpp b/xfa/src/fwl/src/lightwidget/app.cpp new file mode 100644 index 0000000000..e89b6c86de --- /dev/null +++ b/xfa/src/fwl/src/lightwidget/app.cpp @@ -0,0 +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 "../../../foxitlib.h" +CFWL_App::CFWL_App() + : m_pAppImp(NULL) + , m_pThemeProvider(NULL) +{ + m_pAppImp = IFWL_App::Create(NULL); +} +CFWL_App::~CFWL_App() +{ + if (m_pThemeProvider) { + m_pThemeProvider->Finalize(); + delete m_pThemeProvider; + m_pThemeProvider = NULL; + } + m_pAppImp->Release(); +} +FWL_ERR CFWL_App::Initialize() +{ + m_pThemeProvider = FX_NEW CFWL_Theme; + m_pThemeProvider->Initialize(); + m_pAppImp->SetThemeProvider((IFWL_ThemeProvider*)m_pThemeProvider); + return m_pAppImp->Initialize(); +} +CFWL_Theme* CFWL_App::GetTheme() +{ + return m_pThemeProvider; +} +FWL_ERR CFWL_App::Exit(FX_INT32 iExitCode ) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pAppImp, FWL_ERR_Indefinite); + return m_pAppImp->Exit(iExitCode); +} +IFWL_App* CFWL_App::GetApp() +{ + return m_pAppImp; +} diff --git a/xfa/src/fwl/src/lightwidget/barcode.cpp b/xfa/src/fwl/src/lightwidget/barcode.cpp new file mode 100644 index 0000000000..6c770c3b2c --- /dev/null +++ b/xfa/src/fwl/src/lightwidget/barcode.cpp @@ -0,0 +1,57 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +CFWL_Barcode* CFWL_Barcode::Create() +{ + return FX_NEW CFWL_Barcode; +} +FWL_ERR CFWL_Barcode::Initialize(const CFWL_WidgetProperties *pProperties ) +{ + _FWL_RETURN_VALUE_IF_FAIL(!m_pImp, FWL_ERR_Indefinite); + if (pProperties) { + *m_pProperties = *pProperties; + } + CFWL_WidgetImpProperties prop; + prop.m_ctmOnParent = m_pProperties->m_ctmOnParent; + prop.m_rtWidget = m_pProperties->m_rtWidget; + prop.m_dwStyles = m_pProperties->m_dwStyles; + prop.m_dwStyleExes = m_pProperties->m_dwStyleExes; + prop.m_dwStates = m_pProperties->m_dwStates; + prop.m_pDataProvider = &m_barcodeData; + if (m_pProperties->m_pParent) { + prop.m_pParent = m_pProperties->m_pParent->GetWidget(); + } + if (m_pProperties->m_pOwner) { + prop.m_pOwner = m_pProperties->m_pOwner->GetWidget(); + } + m_pImp = IFWL_Barcode::Create(); + FWL_ERR ret = ((IFWL_Barcode*)m_pImp)->Initialize(prop); + if (ret == FWL_ERR_Succeeded) { + CFWL_Widget::Initialize(); + } + return ret; +} +CFWL_Barcode::CFWL_Barcode() +{ +} +CFWL_Barcode::~CFWL_Barcode() +{ +} +void CFWL_Barcode::SetType(BC_TYPE type) +{ + _FWL_RETURN_IF_FAIL(m_pImp); + ((IFWL_Barcode*)m_pImp)->SetType(type); +} +FX_BOOL CFWL_Barcode::IsProtectedType() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, 0); + return ((IFWL_Barcode*)m_pImp)->IsProtectedType(); +} +FWL_ERR CFWL_Barcode::CFWL_BarcodeDP::GetCaption(IFWL_Widget *pWidget, CFX_WideString &wsCaption) +{ + return FWL_ERR_Succeeded; +} diff --git a/xfa/src/fwl/src/lightwidget/caret.cpp b/xfa/src/fwl/src/lightwidget/caret.cpp new file mode 100644 index 0000000000..a93e5d9dc5 --- /dev/null +++ b/xfa/src/fwl/src/lightwidget/caret.cpp @@ -0,0 +1,58 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +CFWL_Caret* CFWL_Caret::Create() +{ + return FX_NEW CFWL_Caret; +} +FWL_ERR CFWL_Caret::Initialize(const CFWL_WidgetProperties *pProperties ) +{ + _FWL_RETURN_VALUE_IF_FAIL(!m_pImp, FWL_ERR_Indefinite); + if (pProperties) { + *m_pProperties = *pProperties; + } + CFWL_WidgetImpProperties prop; + prop.m_ctmOnParent = m_pProperties->m_ctmOnParent; + prop.m_rtWidget = m_pProperties->m_rtWidget; + prop.m_dwStyles = m_pProperties->m_dwStyles; + prop.m_dwStyleExes = m_pProperties->m_dwStyleExes; + prop.m_dwStates = m_pProperties->m_dwStates; + if (m_pProperties->m_pParent) { + prop.m_pParent = m_pProperties->m_pParent->GetWidget(); + } + if (m_pProperties->m_pOwner) { + prop.m_pOwner = m_pProperties->m_pOwner->GetWidget(); + } + m_pImp = IFWL_Caret::Create(); + FWL_ERR ret = ((IFWL_Caret*)m_pImp)->Initialize(prop); + if (ret == FWL_ERR_Succeeded) { + CFWL_Widget::Initialize(); + } + return ret; +} +FWL_ERR CFWL_Caret::ShowCaret(FX_BOOL bFlag) +{ + return ((IFWL_Caret*)m_pImp)->ShowCaret(bFlag); +} +FWL_ERR CFWL_Caret::GetFrequency(FX_DWORD &elapse) +{ + return ((IFWL_Caret*)m_pImp)->GetFrequency(elapse); +} +FWL_ERR CFWL_Caret::SetFrequency(FX_DWORD elapse) +{ + return ((IFWL_Caret*)m_pImp)->SetFrequency(elapse); +} +FWL_ERR CFWL_Caret::SetColor(CFX_Color crFill) +{ + return ((IFWL_Caret*)m_pImp)->SetColor(crFill); +} +CFWL_Caret::CFWL_Caret() +{ +} +CFWL_Caret::~CFWL_Caret() +{ +} diff --git a/xfa/src/fwl/src/lightwidget/checkbox.cpp b/xfa/src/fwl/src/lightwidget/checkbox.cpp new file mode 100644 index 0000000000..cb659fffa7 --- /dev/null +++ b/xfa/src/fwl/src/lightwidget/checkbox.cpp @@ -0,0 +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 "../../../foxitlib.h" +CFWL_CheckBox* CFWL_CheckBox::Create() +{ + return FX_NEW CFWL_CheckBox; +} +FWL_ERR CFWL_CheckBox::Initialize(const CFWL_WidgetProperties *pProperties ) +{ + _FWL_RETURN_VALUE_IF_FAIL(!m_pImp, FWL_ERR_Indefinite); + if (pProperties) { + *m_pProperties = *pProperties; + } + CFWL_WidgetImpProperties prop; + prop.m_ctmOnParent = m_pProperties->m_ctmOnParent; + prop.m_rtWidget = m_pProperties->m_rtWidget; + prop.m_dwStyles = m_pProperties->m_dwStyles; + prop.m_dwStyleExes = m_pProperties->m_dwStyleExes; + prop.m_dwStates = m_pProperties->m_dwStates; + prop.m_pDataProvider = &m_checkboxData; + if (m_pProperties->m_pParent) { + prop.m_pParent = m_pProperties->m_pParent->GetWidget(); + } + if (m_pProperties->m_pOwner) { + prop.m_pOwner = m_pProperties->m_pOwner->GetWidget(); + } + m_pImp = IFWL_CheckBox::Create(); + FWL_ERR ret = ((IFWL_CheckBox*)m_pImp)->Initialize(prop); + if (ret == FWL_ERR_Succeeded) { + CFWL_Widget::Initialize(); + } + return ret; +} +FWL_ERR CFWL_CheckBox::SetCaption(FX_WSTR wsCaption) +{ + m_checkboxData.m_wsCaption = wsCaption; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_CheckBox::SetBoxSize(FX_FLOAT fHeight) +{ + m_checkboxData.m_fBoxHeight = fHeight; + return FWL_ERR_Succeeded; +} +FX_INT32 CFWL_CheckBox::GetCheckState() +{ + return ((IFWL_CheckBox*)m_pImp)->GetCheckState(); +} +FWL_ERR CFWL_CheckBox::SetCheckState(FX_INT32 iCheck) +{ + return ((IFWL_CheckBox*)m_pImp)->SetCheckState(iCheck); +} +CFWL_CheckBox::CFWL_CheckBox() +{ +} +CFWL_CheckBox::~CFWL_CheckBox() +{ +} +CFWL_CheckBox::CFWL_CheckBoxDP::CFWL_CheckBoxDP() + : m_fBoxHeight(16.0f) + , m_wsCaption(L"Check box") +{ +} +FWL_ERR CFWL_CheckBox::CFWL_CheckBoxDP::GetCaption(IFWL_Widget *pWidget, CFX_WideString &wsCaption) +{ + wsCaption = m_wsCaption; + return FWL_ERR_Succeeded; +} +FX_FLOAT CFWL_CheckBox::CFWL_CheckBoxDP::GetBoxSize(IFWL_Widget *pWidget) +{ + return m_fBoxHeight; +} diff --git a/xfa/src/fwl/src/lightwidget/combobox.cpp b/xfa/src/fwl/src/lightwidget/combobox.cpp new file mode 100644 index 0000000000..557dc2d2b5 --- /dev/null +++ b/xfa/src/fwl/src/lightwidget/combobox.cpp @@ -0,0 +1,361 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +CFWL_ComboBox* CFWL_ComboBox::Create() +{ + return FX_NEW CFWL_ComboBox; +} +FWL_ERR CFWL_ComboBox::Initialize(const CFWL_WidgetProperties *pProperties ) +{ + _FWL_RETURN_VALUE_IF_FAIL(!m_pImp, FWL_ERR_Indefinite); + if (pProperties) { + *m_pProperties = *pProperties; + } + CFWL_WidgetImpProperties prop; + prop.m_ctmOnParent = m_pProperties->m_ctmOnParent; + prop.m_rtWidget = m_pProperties->m_rtWidget; + prop.m_dwStyles = m_pProperties->m_dwStyles; + prop.m_dwStyleExes = m_pProperties->m_dwStyleExes; + prop.m_dwStates = m_pProperties->m_dwStates; + prop.m_pDataProvider = &m_comboBoxData; + if (m_pProperties->m_pParent) { + prop.m_pParent = m_pProperties->m_pParent->GetWidget(); + } + if (m_pProperties->m_pOwner) { + prop.m_pOwner = m_pProperties->m_pOwner->GetWidget(); + } + m_pImp = IFWL_ComboBox::Create(); + FWL_ERR ret = ((IFWL_ComboBox*)m_pImp)->Initialize(prop); + if (ret == FWL_ERR_Succeeded) { + CFWL_Widget::Initialize(); + } + return ret; +} +FX_INT32 CFWL_ComboBox::AddString(FX_WSTR wsText) +{ + CFWL_ComboBoxItem *pItem = FX_NEW CFWL_ComboBoxItem; + pItem->m_wsText = wsText; + pItem->m_dwStyles = 0; + return m_comboBoxData.m_arrItem.Add(pItem); +} +FX_INT32 CFWL_ComboBox::AddString(FX_WSTR wsText, CFX_DIBitmap *pIcon) +{ + CFWL_ComboBoxItem *pItem = FX_NEW CFWL_ComboBoxItem; + pItem->m_wsText = wsText; + pItem->m_dwStyles = 0; + pItem->m_pDIB = pIcon; + return m_comboBoxData.m_arrItem.Add(pItem); +} +FX_INT32 CFWL_ComboBox::RemoveAt(FX_INT32 iIndex) +{ + return m_comboBoxData.m_arrItem.RemoveAt(iIndex); +} +FX_INT32 CFWL_ComboBox::RemoveAll() +{ + m_comboBoxData.m_arrItem.RemoveAll(); + return 0; +} +FX_INT32 CFWL_ComboBox::CountItems() +{ + return m_comboBoxData.CountItems(GetWidget()); +} +FWL_ERR CFWL_ComboBox::GetTextByIndex(FX_INT32 iIndex, CFX_WideString &wsText) +{ + CFWL_ComboBoxItem *pItem = (CFWL_ComboBoxItem*)(m_comboBoxData.GetItem((IFWL_Widget *)this, iIndex)); + _FWL_RETURN_VALUE_IF_FAIL(pItem, FWL_ERR_Indefinite); + wsText = pItem->m_wsText; + return FWL_ERR_Succeeded; +} +FX_INT32 CFWL_ComboBox::GetCurSel() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, -1); + return ((IFWL_ComboBox*)m_pImp)->GetCurSel(); +} +FWL_ERR CFWL_ComboBox::SetCurSel(FX_INT32 iSel) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return ((IFWL_ComboBox*)m_pImp)->SetCurSel(iSel); +} +FWL_ERR CFWL_ComboBox::SetEditText(FX_WSTR wsText) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return ((IFWL_ComboBox*)m_pImp)->SetEditText(wsText); +} +FX_INT32 CFWL_ComboBox::GetEditTextLength() const +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, 0); + return ((IFWL_ComboBox*)m_pImp)->GetEditTextLength(); +} +FWL_ERR CFWL_ComboBox::GetEditText(CFX_WideString &wsText, FX_INT32 nStart, FX_INT32 nCount) const +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return ((IFWL_ComboBox*)m_pImp)->GetEditText(wsText, nStart, nCount); +} +FWL_ERR CFWL_ComboBox::SetEditSelRange(FX_INT32 nStart, FX_INT32 nCount) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return ((IFWL_ComboBox*)m_pImp)->SetEditSelRange(nStart, nCount); +} +FX_INT32 CFWL_ComboBox::GetEditSelRange(FX_INT32 nIndex, FX_INT32 &nStart) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, 0); + return ((IFWL_ComboBox*)m_pImp)->GetEditSelRange(nIndex, nStart); +} +FX_INT32 CFWL_ComboBox::GetEditLimit() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, 0); + return ((IFWL_ComboBox*)m_pImp)->GetEditLimit(); +} +FWL_ERR CFWL_ComboBox::SetEditLimit(FX_INT32 nLimit) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return ((IFWL_ComboBox*)m_pImp)->SetEditLimit(nLimit); +} +FWL_ERR CFWL_ComboBox::EditDoClipboard(FX_INT32 iCmd) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return ((IFWL_ComboBox*)m_pImp)->EditDoClipboard(iCmd); +} +FX_BOOL CFWL_ComboBox::EditRedo(FX_BSTR bsRecord) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FALSE); + return ((IFWL_ComboBox*)m_pImp)->EditRedo(bsRecord); +} +FX_BOOL CFWL_ComboBox::EditUndo(FX_BSTR bsRecord) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FALSE); + return ((IFWL_ComboBox*)m_pImp)->EditUndo(bsRecord); +} +FWL_ERR CFWL_ComboBox::SetMaxListHeight(FX_FLOAT fMaxHeight) +{ + m_comboBoxData.m_fMaxListHeight = fMaxHeight; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ComboBox::SetItemData(FX_INT32 iIndex, FX_LPVOID pData) +{ + CFWL_ComboBoxItem *pItem = (CFWL_ComboBoxItem*)(m_comboBoxData.GetItem((IFWL_Widget *)this, iIndex)); + _FWL_RETURN_VALUE_IF_FAIL(pItem, FWL_ERR_Indefinite); + pItem->m_pData = pData; + return FWL_ERR_Succeeded; +} +FX_LPVOID CFWL_ComboBox::GetItemData(FX_INT32 iIndex) +{ + CFWL_ComboBoxItem *pItem = (CFWL_ComboBoxItem*)(m_comboBoxData.GetItem((IFWL_Widget *)this, iIndex)); + _FWL_RETURN_VALUE_IF_FAIL(pItem, NULL); + return pItem->m_pData; +} +FWL_ERR CFWL_ComboBox::SetListTheme(IFWL_ThemeProvider *pTheme) +{ + return ((IFWL_ComboBox*)m_pImp)->GetListBoxt()->SetThemeProvider(pTheme); +} +FX_BOOL CFWL_ComboBox::AfterFocusShowDropList() +{ + return ((IFWL_ComboBox*)m_pImp)->AfterFocusShowDropList(); +} +FWL_ERR CFWL_ComboBox::OpenDropDownList(FX_BOOL bActivate) +{ + return ((IFWL_ComboBox*)m_pImp)->OpenDropDownList(bActivate); +} +FX_BOOL CFWL_ComboBox::EditCanUndo() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FALSE); + return ((IFWL_ComboBox*)m_pImp)->EditCanUndo(); +} +FX_BOOL CFWL_ComboBox::EditCanRedo() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FALSE); + return ((IFWL_ComboBox*)m_pImp)->EditCanRedo(); +} +FX_BOOL CFWL_ComboBox::EditUndo() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FALSE); + return ((IFWL_ComboBox*)m_pImp)->EditUndo(); +} +FX_BOOL CFWL_ComboBox::EditRedo() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FALSE); + return ((IFWL_ComboBox*)m_pImp)->EditRedo(); +} +FX_BOOL CFWL_ComboBox::EditCanCopy() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FALSE); + return ((IFWL_ComboBox*)m_pImp)->EditCanCopy(); +} +FX_BOOL CFWL_ComboBox::EditCanCut() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FALSE); + return ((IFWL_ComboBox*)m_pImp)->EditCanCut(); +} +FX_BOOL CFWL_ComboBox::EditCanSelectAll() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FALSE); + return ((IFWL_ComboBox*)m_pImp)->EditCanSelectAll(); +} +FX_BOOL CFWL_ComboBox::EditCopy(CFX_WideString &wsCopy) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FALSE); + return ((IFWL_ComboBox*)m_pImp)->EditCopy(wsCopy); +} +FX_BOOL CFWL_ComboBox::EditCut(CFX_WideString &wsCut) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FALSE); + return ((IFWL_ComboBox*)m_pImp)->EditCut(wsCut); +} +FX_BOOL CFWL_ComboBox::EditPaste(const CFX_WideString &wsPaste) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FALSE); + return ((IFWL_ComboBox*)m_pImp)->EditPaste(wsPaste); +} +FX_BOOL CFWL_ComboBox::EditSelectAll() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FALSE); + return ((IFWL_ComboBox*)m_pImp)->EditSelectAll(); +} +FX_BOOL CFWL_ComboBox::EditDelete() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FALSE); + return ((IFWL_ComboBox*)m_pImp)->EditDelete(); +} +FX_BOOL CFWL_ComboBox::EditDeSelect() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FALSE); + return ((IFWL_ComboBox*)m_pImp)->EditDeSelect(); +} +FWL_ERR CFWL_ComboBox::GetBBox(CFX_RectF &rect) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FALSE); + return ((IFWL_ComboBox*)m_pImp)->GetBBox(rect); +} +FWL_ERR CFWL_ComboBox::EditModifyStylesEx(FX_DWORD dwStylesExAdded, + FX_DWORD dwStylesExRemoved) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FALSE); + return ((IFWL_ComboBox*)m_pImp)->EditModifyStylesEx(dwStylesExAdded, dwStylesExRemoved); +} +CFWL_ComboBox::CFWL_ComboBox() +{ +} +CFWL_ComboBox::~CFWL_ComboBox() +{ +} +CFWL_ComboBox::CFWL_ComboBoxDP::CFWL_ComboBoxDP() +{ + m_fItemHeight = 0; + m_fMaxListHeight = 0; +} +CFWL_ComboBox::CFWL_ComboBoxDP::~CFWL_ComboBoxDP() +{ + FX_INT32 nCount = m_arrItem.GetSize(); + for (FX_INT32 i = 0; i < nCount; i ++) { + CFWL_ComboBoxItem *pItem = (CFWL_ComboBoxItem*)m_arrItem[i]; + if (pItem) { + delete pItem; + } + } + m_arrItem.RemoveAll(); +} +FX_INT32 CFWL_ComboBox::CFWL_ComboBoxDP::CountItems(IFWL_Widget *pWidget) +{ + return m_arrItem.GetSize(); +} +FWL_HLISTITEM CFWL_ComboBox::CFWL_ComboBoxDP::GetItem(IFWL_Widget *pWidget, FX_INT32 nIndex) +{ + FX_INT32 iCount = m_arrItem.GetSize(); + if (nIndex >= iCount || nIndex < 0) { + return NULL; + } + return (FWL_HLISTITEM)m_arrItem[nIndex]; +} +FX_INT32 CFWL_ComboBox::CFWL_ComboBoxDP::GetItemIndex(IFWL_Widget *pWidget, FWL_HLISTITEM hItem) +{ + return m_arrItem.Find(hItem); +} +FX_BOOL CFWL_ComboBox::CFWL_ComboBoxDP::SetItemIndex(IFWL_Widget *pWidget, FWL_HLISTITEM hItem, FX_INT32 nIndex) +{ + return m_arrItem.SetAt(nIndex, hItem); +} +FX_DWORD CFWL_ComboBox::CFWL_ComboBoxDP::GetItemStyles(IFWL_Widget *pWidget, FWL_HLISTITEM hItem) +{ + _FWL_RETURN_VALUE_IF_FAIL(hItem, 0); + return ((CFWL_ComboBoxItem*)hItem)->m_dwStyles; +} +FWL_ERR CFWL_ComboBox::CFWL_ComboBoxDP::GetItemText(IFWL_Widget *pWidget, FWL_HLISTITEM hItem, CFX_WideString &wsText) +{ + _FWL_RETURN_VALUE_IF_FAIL(hItem, FWL_ERR_Indefinite); + wsText = ((CFWL_ComboBoxItem*)hItem)->m_wsText; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ComboBox::CFWL_ComboBoxDP::GetItemRect(IFWL_Widget *pWidget, FWL_HLISTITEM hItem, CFX_RectF& rtItem) +{ + _FWL_RETURN_VALUE_IF_FAIL(hItem, FWL_ERR_Indefinite); + CFWL_ComboBoxItem *pItem = (CFWL_ComboBoxItem*)hItem; + rtItem.Set(pItem->m_rtItem.left, + pItem->m_rtItem.top, + pItem->m_rtItem.width, + pItem->m_rtItem.height); + return FWL_ERR_Succeeded; +} +FX_LPVOID CFWL_ComboBox::CFWL_ComboBoxDP::GetItemData(IFWL_Widget *pWidget, FWL_HLISTITEM hItem) +{ + _FWL_RETURN_VALUE_IF_FAIL(hItem, NULL); + CFWL_ComboBoxItem *pItem = (CFWL_ComboBoxItem*)hItem; + return pItem->m_pData; +} +FWL_ERR CFWL_ComboBox::CFWL_ComboBoxDP::SetItemStyles(IFWL_Widget *pWidget, FWL_HLISTITEM hItem, FX_DWORD dwStyle) +{ + _FWL_RETURN_VALUE_IF_FAIL(hItem, FWL_ERR_Indefinite); + ((CFWL_ComboBoxItem*)hItem)->m_dwStyles = dwStyle; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ComboBox::CFWL_ComboBoxDP::SetItemText(IFWL_Widget *pWidget, FWL_HLISTITEM hItem, FX_LPCWSTR pszText) +{ + _FWL_RETURN_VALUE_IF_FAIL(hItem, FWL_ERR_Indefinite); + ((CFWL_ComboBoxItem*)hItem)->m_wsText = pszText; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ComboBox::CFWL_ComboBoxDP::SetItemRect(IFWL_Widget *pWidget, FWL_HLISTITEM hItem, const CFX_RectF& rtItem) +{ + _FWL_RETURN_VALUE_IF_FAIL(hItem, FWL_ERR_Indefinite); + ((CFWL_ComboBoxItem*)hItem)->m_rtItem = rtItem; + return FWL_ERR_Succeeded; +} +FX_FLOAT CFWL_ComboBox::CFWL_ComboBoxDP::GetItemHeight(IFWL_Widget *pWidget) +{ + return m_fItemHeight; +} +CFX_DIBitmap* CFWL_ComboBox::CFWL_ComboBoxDP::GetItemIcon(IFWL_Widget *pWidget, FWL_HLISTITEM hItem) +{ + _FWL_RETURN_VALUE_IF_FAIL(hItem, NULL); + return ((CFWL_ComboBoxItem*)hItem)->m_pDIB; +} +FWL_ERR CFWL_ComboBox::CFWL_ComboBoxDP::GetItemCheckRect(IFWL_Widget *pWidget, FWL_HLISTITEM hItem, CFX_RectF& rtCheck) +{ + CFWL_ComboBoxItem *pItem = (CFWL_ComboBoxItem*)hItem; + rtCheck = pItem->m_rtCheckBox; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ComboBox::CFWL_ComboBoxDP::SetItemCheckRect(IFWL_Widget *pWidget, FWL_HLISTITEM hItem, const CFX_RectF& rtCheck) +{ + CFWL_ComboBoxItem *pItem = (CFWL_ComboBoxItem*)hItem; + pItem->m_rtCheckBox = rtCheck; + return FWL_ERR_Succeeded; +} +FX_DWORD CFWL_ComboBox::CFWL_ComboBoxDP::GetItemCheckState(IFWL_Widget *pWidget, FWL_HLISTITEM hItem) +{ + CFWL_ComboBoxItem *pItem = (CFWL_ComboBoxItem*)hItem; + return pItem->m_dwCheckState; +} +FWL_ERR CFWL_ComboBox::CFWL_ComboBoxDP::SetItemCheckState(IFWL_Widget *pWidget, FWL_HLISTITEM hItem, FX_DWORD dwCheckState) +{ + CFWL_ComboBoxItem *pItem = (CFWL_ComboBoxItem*)hItem; + pItem->m_dwCheckState = dwCheckState; + return FWL_ERR_Succeeded; +} +FX_FLOAT CFWL_ComboBox::CFWL_ComboBoxDP::GetListHeight(IFWL_Widget *pWidget) +{ + return m_fMaxListHeight; +} diff --git a/xfa/src/fwl/src/lightwidget/datetimepicker.cpp b/xfa/src/fwl/src/lightwidget/datetimepicker.cpp new file mode 100644 index 0000000000..4a314c5079 --- /dev/null +++ b/xfa/src/fwl/src/lightwidget/datetimepicker.cpp @@ -0,0 +1,156 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +CFWL_DateTimePicker* CFWL_DateTimePicker::Create() +{ + return FX_NEW CFWL_DateTimePicker; +} +FWL_ERR CFWL_DateTimePicker::Initialize(const CFWL_WidgetProperties *pProperties ) +{ + _FWL_RETURN_VALUE_IF_FAIL(!m_pImp, FWL_ERR_Indefinite); + if (pProperties) { + *m_pProperties = *pProperties; + } + CFWL_WidgetImpProperties prop; + prop.m_dwStyles = m_pProperties->m_dwStyles; + prop.m_dwStyleExes = m_pProperties->m_dwStyleExes; + prop.m_dwStates = m_pProperties->m_dwStates; + prop.m_ctmOnParent = m_pProperties->m_ctmOnParent; + prop.m_pDataProvider = &m_DateTimePickerDP; + if (m_pProperties->m_pParent) { + prop.m_pParent = m_pProperties->m_pParent->GetWidget(); + } + if (m_pProperties->m_pOwner) { + prop.m_pOwner = m_pProperties->m_pOwner->GetWidget(); + } + prop.m_rtWidget = m_pProperties->m_rtWidget; + m_pImp = IFWL_DateTimePicker::Create(); + FWL_ERR ret = ((IFWL_DateTimePicker*)m_pImp)->Initialize(prop); + if (ret == FWL_ERR_Succeeded) { + CFWL_Widget::Initialize(); + } + return ret; +} +FWL_ERR CFWL_DateTimePicker::SetToday(FX_INT32 iYear, FX_INT32 iMonth, FX_INT32 iDay) +{ + m_DateTimePickerDP.m_iYear = iYear; + m_DateTimePickerDP.m_iMonth = iMonth; + m_DateTimePickerDP.m_iDay = iDay; + return FWL_ERR_Succeeded; +} +FX_INT32 CFWL_DateTimePicker::CountSelRanges() +{ + return ((IFWL_DateTimePicker*)m_pImp)->CountSelRanges(); +} +FX_INT32 CFWL_DateTimePicker::GetSelRange(FX_INT32 nIndex, FX_INT32 &nStart) +{ + return ((IFWL_DateTimePicker*)m_pImp)->GetSelRange(nIndex, nStart); +} +FWL_ERR CFWL_DateTimePicker::GetEditText(CFX_WideString &wsText) +{ + return ((IFWL_DateTimePicker*)m_pImp)->GetEditText(wsText); +} +FWL_ERR CFWL_DateTimePicker::SetEditText(FX_WSTR wsText) +{ + return ((IFWL_DateTimePicker*)m_pImp)->SetEditText(wsText); +} +FWL_ERR CFWL_DateTimePicker::GetCurSel(FX_INT32 &iYear, FX_INT32 &iMonth, FX_INT32 &iDay) +{ + return ((IFWL_DateTimePicker*)m_pImp)->GetCurSel(iYear, iMonth, iDay); +} +FWL_ERR CFWL_DateTimePicker::SetCurSel(FX_INT32 iYear, FX_INT32 iMonth, FX_INT32 iDay) +{ + return ((IFWL_DateTimePicker*)m_pImp)->SetCurSel(iYear, iMonth, iDay); +} +CFWL_DateTimePicker::CFWL_DateTimePicker() +{ +} +CFWL_DateTimePicker::~CFWL_DateTimePicker() +{ +} +CFWL_DateTimePicker::CFWL_DateTimePickerDP::CFWL_DateTimePickerDP() +{ + m_iYear = 2011; + m_iMonth = 1; + m_iDay = 1; +} +FWL_ERR CFWL_DateTimePicker::CFWL_DateTimePickerDP::GetCaption(IFWL_Widget *pWidget, CFX_WideString &wsCaption) +{ + wsCaption = m_wsData; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_DateTimePicker::CFWL_DateTimePickerDP::GetToday(IFWL_Widget *pWidget, FX_INT32 &iYear, FX_INT32 &iMonth, FX_INT32 &iDay) +{ + iYear = m_iYear; + iMonth = m_iMonth; + iDay = m_iDay; + return FWL_ERR_Succeeded; +} +FX_BOOL CFWL_DateTimePicker::CanUndo() +{ + return ((IFWL_DateTimePicker*)m_pImp)->CanUndo(); +} +FX_BOOL CFWL_DateTimePicker::CanRedo() +{ + return ((IFWL_DateTimePicker*)m_pImp)->CanRedo(); +} +FX_BOOL CFWL_DateTimePicker::Undo() +{ + return ((IFWL_DateTimePicker*)m_pImp)->Undo(); +} +FX_BOOL CFWL_DateTimePicker::Redo() +{ + return ((IFWL_DateTimePicker*)m_pImp)->Redo(); +} +FX_BOOL CFWL_DateTimePicker::CanCopy() +{ + return ((IFWL_DateTimePicker*)m_pImp)->CanCopy(); +} +FX_BOOL CFWL_DateTimePicker::CanCut() +{ + return ((IFWL_DateTimePicker*)m_pImp)->CanCut(); +} +FX_BOOL CFWL_DateTimePicker::CanSelectAll() +{ + return ((IFWL_DateTimePicker*)m_pImp)->CanSelectAll(); +} +FX_BOOL CFWL_DateTimePicker::Copy(CFX_WideString &wsCopy) +{ + return ((IFWL_DateTimePicker*)m_pImp)->Copy(wsCopy); +} +FX_BOOL CFWL_DateTimePicker::Cut(CFX_WideString &wsCut) +{ + return ((IFWL_DateTimePicker*)m_pImp)->Copy(wsCut); +} +FX_BOOL CFWL_DateTimePicker::Paste(const CFX_WideString &wsPaste) +{ + return ((IFWL_DateTimePicker*)m_pImp)->Paste(wsPaste); +} +FX_BOOL CFWL_DateTimePicker::SelectAll() +{ + return ((IFWL_DateTimePicker*)m_pImp)->SelectAll(); +} +FX_BOOL CFWL_DateTimePicker::Delete() +{ + return ((IFWL_DateTimePicker*)m_pImp)->Delete(); +} +FX_BOOL CFWL_DateTimePicker::DeSelect() +{ + return ((IFWL_DateTimePicker*)m_pImp)->DeSelect(); +} +FWL_ERR CFWL_DateTimePicker::GetBBox(CFX_RectF &rect) +{ + return ((IFWL_DateTimePicker*)m_pImp)->GetBBox(rect); +} +FWL_ERR CFWL_DateTimePicker::SetEditLimit(FX_INT32 nLimit) +{ + return ((IFWL_DateTimePicker*)m_pImp)->SetEditLimit(nLimit); +} +FWL_ERR CFWL_DateTimePicker::ModifyEditStylesEx(FX_DWORD dwStylesExAdded, FX_DWORD dwStylesExRemoved) +{ + return ((IFWL_DateTimePicker*)m_pImp)->ModifyEditStylesEx(dwStylesExAdded, dwStylesExRemoved); +} diff --git a/xfa/src/fwl/src/lightwidget/edit.cpp b/xfa/src/fwl/src/lightwidget/edit.cpp new file mode 100644 index 0000000000..c87f83fac6 --- /dev/null +++ b/xfa/src/fwl/src/lightwidget/edit.cpp @@ -0,0 +1,226 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +CFWL_Edit* CFWL_Edit::Create() +{ + return FX_NEW CFWL_Edit; +} +FWL_ERR CFWL_Edit::Initialize(const CFWL_WidgetProperties *pProperties ) +{ + _FWL_RETURN_VALUE_IF_FAIL(!m_pImp, FWL_ERR_Indefinite); + if (pProperties) { + *m_pProperties = *pProperties; + } + CFWL_WidgetImpProperties prop; + prop.m_dwStyles = m_pProperties->m_dwStyles; + prop.m_dwStyleExes = m_pProperties->m_dwStyleExes; + prop.m_dwStates = m_pProperties->m_dwStates; + prop.m_ctmOnParent = m_pProperties->m_ctmOnParent; + if (m_pProperties->m_pParent) { + prop.m_pParent = m_pProperties->m_pParent->GetWidget(); + } + if (m_pProperties->m_pOwner) { + prop.m_pOwner = m_pProperties->m_pOwner->GetWidget(); + } + prop.m_rtWidget = m_pProperties->m_rtWidget; + m_pImp = IFWL_Edit::Create(); + FWL_ERR ret = ((IFWL_Edit*)m_pImp)->Initialize(prop); + if (ret == FWL_ERR_Succeeded) { + CFWL_Widget::Initialize(); + } + return ret; +} +FWL_ERR CFWL_Edit::SetText(const CFX_WideString &wsText) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return ((IFWL_Edit*)m_pImp)->SetText(wsText); +} +FX_INT32 CFWL_Edit::GetTextLength() const +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, 0); + return ((IFWL_Edit*)m_pImp)->GetTextLength(); +} +FWL_ERR CFWL_Edit::GetText(CFX_WideString &wsText, FX_INT32 nStart, FX_INT32 nCount) const +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return ((IFWL_Edit*)m_pImp)->GetText(wsText, nStart, nCount); +} +FWL_ERR CFWL_Edit::ClearText() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return ((IFWL_Edit*)m_pImp)->ClearText(); +} +FX_INT32 CFWL_Edit::GetCaretPos() const +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, -1); + return ((IFWL_Edit*)m_pImp)->GetCaretPos(); +} +FX_INT32 CFWL_Edit::SetCaretPos(FX_INT32 nIndex, FX_BOOL bBefore) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, -1); + return ((IFWL_Edit*)m_pImp)->SetCaretPos(nIndex, bBefore); +} +FWL_ERR CFWL_Edit::AddSelRange(FX_INT32 nStart, FX_INT32 nCount) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + ((IFWL_Edit*)m_pImp)->AddSelRange(nStart, nCount); + FX_INT32 pos = 0; + FX_INT32 sum = ((IFWL_Edit*)m_pImp)->GetTextLength(); + if (nCount == -1) { + pos = sum; + } else { + pos = nStart + nCount; + } + return ((IFWL_Edit*)m_pImp)->SetCaretPos(pos); +} +FX_INT32 CFWL_Edit::CountSelRanges() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, 0); + return ((IFWL_Edit*)m_pImp)->CountSelRanges(); +} +FX_INT32 CFWL_Edit::GetSelRange(FX_INT32 nIndex, FX_INT32 &nStart) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, 0); + return ((IFWL_Edit*)m_pImp)->GetSelRange(nIndex, nStart); +} +FWL_ERR CFWL_Edit::ClearSelections() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return ((IFWL_Edit*)m_pImp)->ClearSelections(); +} +FX_INT32 CFWL_Edit::GetLimit() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, -1); + return ((IFWL_Edit*)m_pImp)->GetLimit(); +} +FWL_ERR CFWL_Edit::SetLimit(FX_INT32 nLimit) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return ((IFWL_Edit*)m_pImp)->SetLimit(nLimit); +} +FWL_ERR CFWL_Edit::SetAliasChar(FX_WCHAR wAlias) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return ((IFWL_Edit*)m_pImp)->SetAliasChar(wAlias); +} +FWL_ERR CFWL_Edit::SetFormatString(const CFX_WideString &wsFormat) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return ((IFWL_Edit*)m_pImp)->SetFormatString(wsFormat); +} +FWL_ERR CFWL_Edit::Insert(FX_INT32 nStart, FX_LPCWSTR lpText, FX_INT32 nLen) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return ((IFWL_Edit*)m_pImp)->Insert(nStart, lpText, nLen); +} +FWL_ERR CFWL_Edit::DeleteSelections() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return ((IFWL_Edit*)m_pImp)->DeleteSelections(); +} +FWL_ERR CFWL_Edit::DeleteRange(FX_INT32 nStart, FX_INT32 nCount) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return ((IFWL_Edit*)m_pImp)->DeleteRange(nStart, nCount); +} +FWL_ERR CFWL_Edit::ReplaceSelections(const CFX_WideStringC &wsReplace) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return ((IFWL_Edit*)m_pImp)->ReplaceSelections(wsReplace); +} +FWL_ERR CFWL_Edit::Replace(FX_INT32 nStart, FX_INT32 nLen, const CFX_WideStringC &wsReplace) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return ((IFWL_Edit*)m_pImp)->Replace(nStart, nLen, wsReplace); +} +FWL_ERR CFWL_Edit::DoClipboard(FX_INT32 iCmd) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return ((IFWL_Edit*)m_pImp)->DoClipboard(iCmd); +} +FX_BOOL CFWL_Edit::Redo(FX_BSTR bsRecord) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FALSE); + return ((IFWL_Edit*)m_pImp)->Redo(bsRecord); +} +FX_BOOL CFWL_Edit::Undo(FX_BSTR bsRecord) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FALSE); + return ((IFWL_Edit*)m_pImp)->Undo(bsRecord); +} +FWL_ERR CFWL_Edit::SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return ((IFWL_Edit*)m_pImp)->SetTabWidth(fTabWidth, bEquidistant); +} +FWL_ERR CFWL_Edit::SetNumberRange(FX_INT32 iMin, FX_INT32 iMax) +{ + if (iMin > iMax) { + return FWL_ERR_Parameter_Invalid; + } + return ((IFWL_Edit*)m_pImp)->SetNumberRange(iMin, iMax); +} +FWL_ERR CFWL_Edit::SetBackColor(FX_DWORD dwColor) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return ((IFWL_Edit*)m_pImp)->SetBackColor(dwColor); +} +FWL_ERR CFWL_Edit::SetFont(const CFX_WideString &wsFont, FX_FLOAT fSize) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return ((IFWL_Edit*)m_pImp)->SetFont(wsFont, fSize); +} +FX_BOOL CFWL_Edit::CanUndo() +{ + return ((IFWL_Edit*)m_pImp)->CanUndo(); +} +FX_BOOL CFWL_Edit::CanRedo() +{ + return ((IFWL_Edit*)m_pImp)->CanRedo(); +} +FX_BOOL CFWL_Edit::Undo() +{ + return ((IFWL_Edit*)m_pImp)->Undo(); +} +FX_BOOL CFWL_Edit::Redo() +{ + return ((IFWL_Edit*)m_pImp)->Undo(); +} +FX_BOOL CFWL_Edit::Copy(CFX_WideString &wsCopy) +{ + return ((IFWL_Edit*)m_pImp)->Copy(wsCopy); +} +FX_BOOL CFWL_Edit::Cut(CFX_WideString &wsCut) +{ + return ((IFWL_Edit*)m_pImp)->Cut(wsCut); +} +FX_BOOL CFWL_Edit::Paste(const CFX_WideString &wsPaste) +{ + return ((IFWL_Edit*)m_pImp)->Paste(wsPaste); +} +FX_BOOL CFWL_Edit::Delete() +{ + return ((IFWL_Edit*)m_pImp)->Delete(); +} +void CFWL_Edit::SetScrollOffset(FX_FLOAT fScrollOffset) +{ + return ((IFWL_Edit*)m_pImp)->SetScrollOffset(fScrollOffset); +} +FX_BOOL CFWL_Edit::GetSuggestWords(CFX_PointF pointf, CFX_ByteStringArray &sSuggest) +{ + return ((IFWL_Edit*)m_pImp)->GetSuggestWords(pointf, sSuggest); +} +FX_BOOL CFWL_Edit::ReplaceSpellCheckWord(CFX_PointF pointf, FX_BSTR bsReplace) +{ + return ((IFWL_Edit*)m_pImp)->ReplaceSpellCheckWord(pointf, bsReplace); +} +CFWL_Edit::CFWL_Edit() +{ +} +CFWL_Edit::~CFWL_Edit() +{ +} diff --git a/xfa/src/fwl/src/lightwidget/listbox.cpp b/xfa/src/fwl/src/lightwidget/listbox.cpp new file mode 100644 index 0000000000..7cc3878d3f --- /dev/null +++ b/xfa/src/fwl/src/lightwidget/listbox.cpp @@ -0,0 +1,327 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +CFWL_ListBox* CFWL_ListBox::Create() +{ + return FX_NEW CFWL_ListBox; +} +FWL_ERR CFWL_ListBox::Initialize(const CFWL_WidgetProperties *pProperties ) +{ + _FWL_RETURN_VALUE_IF_FAIL(!m_pImp, FWL_ERR_Indefinite); + if (pProperties) { + *m_pProperties = *pProperties; + } + CFWL_WidgetImpProperties prop; + prop.m_dwStyles = m_pProperties->m_dwStyles; + prop.m_dwStyleExes = m_pProperties->m_dwStyleExes; + prop.m_dwStates = m_pProperties->m_dwStates; + prop.m_ctmOnParent = m_pProperties->m_ctmOnParent; + prop.m_pDataProvider = &m_ListBoxDP; + if (m_pProperties->m_pParent) { + prop.m_pParent = m_pProperties->m_pParent->GetWidget(); + } + if (m_pProperties->m_pOwner) { + prop.m_pOwner = m_pProperties->m_pOwner->GetWidget(); + } + prop.m_rtWidget = m_pProperties->m_rtWidget; + m_pImp = IFWL_ListBox::Create(); + FWL_ERR ret = ((IFWL_ListBox*)m_pImp)->Initialize(prop); + if (ret == FWL_ERR_Succeeded) { + CFWL_Widget::Initialize(); + } + return ret; +} +FWL_ERR CFWL_ListBox::AddDIBitmap(CFX_DIBitmap *pDIB, FWL_HLISTITEM hItem) +{ + ((CFWL_ListItem*)hItem)->m_pDIB = pDIB; + return FWL_ERR_Succeeded; +} +FWL_HLISTITEM CFWL_ListBox::AddString(FX_WSTR wsAdd, FX_BOOL bSelect) +{ + CFWL_ListItem * pItem = FX_NEW CFWL_ListItem; + pItem->m_dwStates = 0; + pItem->m_wsText = wsAdd; + pItem->m_dwStates = bSelect ? FWL_ITEMSTATE_LTB_Selected : 0; + m_ListBoxDP.m_arrItem.Add(pItem); + return (FWL_HLISTITEM)pItem; +} +FX_BOOL CFWL_ListBox::DeleteString(FWL_HLISTITEM hItem) +{ + FX_INT32 nIndex = m_ListBoxDP.GetItemIndex(GetWidget(), hItem); + if (nIndex < 0 || nIndex >= m_ListBoxDP.m_arrItem.GetSize()) { + return FALSE; + } + CFWL_ListItem *pDelItem = (CFWL_ListItem*)m_ListBoxDP.GetItem((IFWL_ListBox*)this, nIndex); + FX_INT32 iCount = m_ListBoxDP.CountItems((IFWL_ListBox*)this); + FX_INT32 iSel = nIndex + 1; + if (iSel >= iCount) { + iSel = nIndex - 1; + if (iSel < 0) { + iSel = -1; + } + } + if (iSel >= 0) { + CFWL_ListItem *pSel = (CFWL_ListItem*)m_ListBoxDP.GetItem((IFWL_ListBox*)this, iSel); + pSel->m_dwStates |= FWL_ITEMSTATE_LTB_Selected; + } + m_ListBoxDP.m_arrItem.RemoveAt(nIndex); + delete pDelItem; + return TRUE; +} +FX_BOOL CFWL_ListBox::DeleteAll() +{ + FX_INT32 iCount = m_ListBoxDP.CountItems((IFWL_ListBox*)this); + for (FX_INT32 i = 0; i < iCount; i ++) { + CFWL_ListItem *pItem = (CFWL_ListItem*)m_ListBoxDP.GetItem((IFWL_ListBox*)this, i); + delete pItem; + } + m_ListBoxDP.m_arrItem.RemoveAll(); + return TRUE; +} +FX_INT32 CFWL_ListBox::CountSelItems() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, 0); + return ((IFWL_ListBox*)m_pImp)->CountSelItems(); +} +FWL_HLISTITEM CFWL_ListBox::GetSelItem(FX_INT32 nIndexSel) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, NULL); + return ((IFWL_ListBox*)m_pImp)->GetSelItem(nIndexSel); +} +FX_INT32 CFWL_ListBox::GetSelIndex(FX_INT32 nIndex) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, 0); + return ((IFWL_ListBox*)m_pImp)->GetSelIndex(nIndex); +} +FWL_ERR CFWL_ListBox::SetSelItem(FWL_HLISTITEM hItem, FX_BOOL bSelect) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return ((IFWL_ListBox*)m_pImp)->SetSelItem(hItem, bSelect); +} +FWL_ERR CFWL_ListBox::GetItemText(FWL_HLISTITEM hItem, CFX_WideString &wsText) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return ((IFWL_ListBox*)m_pImp)->GetItemText(hItem, wsText); +} +FWL_ERR CFWL_ListBox::GetScrollPos(FX_FLOAT &fPos, FX_BOOL bVert) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return ((IFWL_ListBox*)m_pImp)->GetScrollPos(fPos, bVert); +} +FWL_ERR CFWL_ListBox::SetItemHeight(FX_FLOAT fItemHeight) +{ + m_ListBoxDP.m_fItemHeight = fItemHeight; + return FWL_ERR_Succeeded; +} +FWL_HLISTITEM CFWL_ListBox::GetFocusItem() +{ + for (FX_INT32 i = 0; i < m_ListBoxDP.m_arrItem.GetSize(); i++) { + CFWL_ListItem * hItem = (CFWL_ListItem *)(m_ListBoxDP.m_arrItem[i]); + if (hItem->m_dwStates & FWL_ITEMSTATE_LTB_Focused) { + return (FWL_HLISTITEM)hItem; + } + } + return NULL; +} +FWL_ERR CFWL_ListBox::SetFocusItem(FWL_HLISTITEM hItem) +{ + FX_INT32 nIndex = m_ListBoxDP.GetItemIndex(GetWidget(), hItem); + ((CFWL_ListItem *)(m_ListBoxDP.m_arrItem[nIndex]))->m_dwStates |= FWL_ITEMSTATE_LTB_Focused; + return FWL_ERR_Succeeded; +} +FWL_ERR* CFWL_ListBox::Sort(IFWL_ListBoxCompare *pCom) +{ + return ((IFWL_ListBox*)m_pImp)->Sort(pCom); +} +FX_INT32 CFWL_ListBox::CountItems() +{ + return m_ListBoxDP.m_arrItem.GetSize(); +} +FWL_HLISTITEM CFWL_ListBox::GetItem(FX_INT32 nIndex) +{ + FX_INT32 nCount = m_ListBoxDP.m_arrItem.GetSize(); + if (nIndex > nCount - 1 && nIndex < 0) { + return NULL; + } + return (FWL_HLISTITEM)m_ListBoxDP.m_arrItem[nIndex]; +} +FWL_ERR CFWL_ListBox::SetItemString(FWL_HLISTITEM hItem, FX_WSTR wsText) +{ + _FWL_RETURN_VALUE_IF_FAIL(hItem, FWL_ERR_Indefinite); + CFWL_ListItem *pItem = (CFWL_ListItem*)hItem; + pItem->m_wsText = wsText; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ListBox::GetItemString(FWL_HLISTITEM hItem, CFX_WideString &wsText) +{ + _FWL_RETURN_VALUE_IF_FAIL(hItem, FWL_ERR_Indefinite); + CFWL_ListItem *pItem = (CFWL_ListItem*)hItem; + wsText = pItem->m_wsText; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ListBox::SetItemData(FWL_HLISTITEM hItem, FX_LPVOID pData) +{ + _FWL_RETURN_VALUE_IF_FAIL(hItem, FWL_ERR_Indefinite); + CFWL_ListItem *pItem = (CFWL_ListItem*)hItem; + pItem->m_pData = pData; + return FWL_ERR_Succeeded; +} +FX_LPVOID CFWL_ListBox::GetItemData(FWL_HLISTITEM hItem) +{ + _FWL_RETURN_VALUE_IF_FAIL(hItem, NULL); + CFWL_ListItem *pItem = (CFWL_ListItem*)hItem; + return pItem->m_pData; +} +FWL_HLISTITEM CFWL_ListBox::GetItemAtPoint(FX_FLOAT fx, FX_FLOAT fy) +{ + CFX_RectF rtClient; + m_pImp->GetClientRect(rtClient); + fx -= rtClient.left; + fy -= rtClient.top; + FX_FLOAT fPosX = 0; + FX_FLOAT fPosY = 0; + ((IFWL_ListBox*)m_pImp)->GetScrollPos(fx); + ((IFWL_ListBox*)m_pImp)->GetScrollPos(fy, FALSE); + FX_INT32 nCount = m_ListBoxDP.CountItems(NULL); + for (FX_INT32 i = 0; i < nCount; i ++) { + FWL_HLISTITEM hItem = m_ListBoxDP.GetItem(NULL, i); + if (!hItem) { + continue; + } + CFX_RectF rtItem; + m_ListBoxDP.GetItemRect(NULL, hItem, rtItem); + rtItem.Offset(-fPosX, -fPosY); + if (rtItem.Contains(fx, fy)) { + return hItem; + } + } + return NULL; +} +FX_DWORD CFWL_ListBox::GetItemStates(FWL_HLISTITEM hItem) +{ + _FWL_RETURN_VALUE_IF_FAIL(hItem, 0); + CFWL_ListItem *pItem = (CFWL_ListItem*)hItem; + return pItem->m_dwStates | pItem->m_dwCheckState; +} +CFWL_ListBox::CFWL_ListBox() +{ +} +CFWL_ListBox::~CFWL_ListBox() +{ +} +CFWL_ListBox::CFWL_ListBoxDP::CFWL_ListBoxDP() +{ +} +CFWL_ListBox::CFWL_ListBoxDP::~CFWL_ListBoxDP() +{ + FX_INT32 nCount = m_arrItem.GetSize(); + for (FX_INT32 i = 0; i < nCount; i ++) { + CFWL_ListItem *pItem = (CFWL_ListItem*)m_arrItem[i]; + if (pItem != NULL) { + delete pItem; + } + } + m_arrItem.RemoveAll(); +} +FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::GetCaption(IFWL_Widget *pWidget, CFX_WideString &wsCaption) +{ + wsCaption = m_wsData; + return FWL_ERR_Succeeded; +} +FX_INT32 CFWL_ListBox::CFWL_ListBoxDP::CountItems(IFWL_Widget *pWidget) +{ + return m_arrItem.GetSize(); +} +FWL_HLISTITEM CFWL_ListBox::CFWL_ListBoxDP::GetItem(IFWL_Widget *pWidget, FX_INT32 nIndex) +{ + if (nIndex >= m_arrItem.GetSize() || nIndex < 0) { + return NULL; + } else { + return (FWL_HLISTITEM)m_arrItem[nIndex]; + } +} +FX_INT32 CFWL_ListBox::CFWL_ListBoxDP::GetItemIndex(IFWL_Widget *pWidget, FWL_HLISTITEM hItem) +{ + return m_arrItem.Find(hItem); +} +FX_BOOL CFWL_ListBox::CFWL_ListBoxDP::SetItemIndex(IFWL_Widget *pWidget, FWL_HLISTITEM hItem, FX_INT32 nIndex) +{ + return m_arrItem.SetAt(nIndex, hItem); +} +FX_DWORD CFWL_ListBox::CFWL_ListBoxDP::GetItemStyles(IFWL_Widget *pWidget, FWL_HLISTITEM hItem) +{ + _FWL_RETURN_VALUE_IF_FAIL(hItem, -1); + return ((CFWL_ListItem*)hItem)->m_dwStates; +} +FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::GetItemText(IFWL_Widget *pWidget, FWL_HLISTITEM hItem, CFX_WideString &wsText) +{ + _FWL_RETURN_VALUE_IF_FAIL(hItem, FWL_ERR_Indefinite); + wsText = ((CFWL_ListItem*)hItem)->m_wsText; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::GetItemRect(IFWL_Widget *pWidget, FWL_HLISTITEM hItem, CFX_RectF &rtItem) +{ + _FWL_RETURN_VALUE_IF_FAIL(hItem, FWL_ERR_Indefinite); + CFWL_ListItem *pItem = (CFWL_ListItem*)hItem; + rtItem = pItem->m_rtItem; + return FWL_ERR_Succeeded; +} +FX_LPVOID CFWL_ListBox::CFWL_ListBoxDP::GetItemData(IFWL_Widget *pWidget, FWL_HLISTITEM hItem) +{ + _FWL_RETURN_VALUE_IF_FAIL(hItem, NULL); + CFWL_ListItem *pItem = (CFWL_ListItem*)hItem; + return pItem->m_pData; +} +FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::SetItemStyles(IFWL_Widget *pWidget, FWL_HLISTITEM hItem, FX_DWORD dwStyle) +{ + _FWL_RETURN_VALUE_IF_FAIL(hItem, FWL_ERR_Indefinite); + ((CFWL_ListItem*)hItem)->m_dwStates = dwStyle; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::SetItemText(IFWL_Widget *pWidget, FWL_HLISTITEM hItem, FX_LPCWSTR pszText) +{ + _FWL_RETURN_VALUE_IF_FAIL(hItem, FWL_ERR_Indefinite); + ((CFWL_ListItem*)hItem)->m_wsText = pszText; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::SetItemRect(IFWL_Widget *pWidget, FWL_HLISTITEM hItem, const CFX_RectF &rtItem) +{ + _FWL_RETURN_VALUE_IF_FAIL(hItem, FWL_ERR_Indefinite); + ((CFWL_ListItem*)hItem)->m_rtItem = rtItem; + return FWL_ERR_Succeeded; +} +FX_FLOAT CFWL_ListBox::CFWL_ListBoxDP::GetItemHeight(IFWL_Widget *pWidget) +{ + return m_fItemHeight; +} +CFX_DIBitmap* CFWL_ListBox::CFWL_ListBoxDP::GetItemIcon(IFWL_Widget *pWidget, FWL_HLISTITEM hItem) +{ + return ((CFWL_ListItem*)hItem)->m_pDIB; +} +FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::GetItemCheckRect(IFWL_Widget *pWidget, FWL_HLISTITEM hItem, CFX_RectF& rtCheck) +{ + CFWL_ListItem *pItem = (CFWL_ListItem*)hItem; + rtCheck = pItem->m_rtCheckBox; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::SetItemCheckRect(IFWL_Widget *pWidget, FWL_HLISTITEM hItem, const CFX_RectF& rtCheck) +{ + CFWL_ListItem *pItem = (CFWL_ListItem*)hItem; + pItem->m_rtCheckBox = rtCheck; + return FWL_ERR_Succeeded; +} +FX_DWORD CFWL_ListBox::CFWL_ListBoxDP::GetItemCheckState(IFWL_Widget *pWidget, FWL_HLISTITEM hItem) +{ + CFWL_ListItem *pItem = (CFWL_ListItem*)hItem; + return pItem->m_dwCheckState; +} +FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::SetItemCheckState(IFWL_Widget *pWidget, FWL_HLISTITEM hItem, FX_DWORD dwCheckState) +{ + CFWL_ListItem *pItem = (CFWL_ListItem*)hItem; + pItem->m_dwCheckState = dwCheckState; + return FWL_ERR_Succeeded; +} diff --git a/xfa/src/fwl/src/lightwidget/picturebox.cpp b/xfa/src/fwl/src/lightwidget/picturebox.cpp new file mode 100644 index 0000000000..e7d21de90e --- /dev/null +++ b/xfa/src/fwl/src/lightwidget/picturebox.cpp @@ -0,0 +1,144 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +CFWL_PictureBox* CFWL_PictureBox::Create() +{ + return FX_NEW CFWL_PictureBox; +} +FWL_ERR CFWL_PictureBox::Initialize(const CFWL_WidgetProperties *pProperties ) +{ + _FWL_RETURN_VALUE_IF_FAIL(!m_pImp, FWL_ERR_Indefinite); + if (pProperties) { + *m_pProperties = *pProperties; + } + CFWL_WidgetImpProperties prop; + prop.m_dwStyles = m_pProperties->m_dwStyles; + prop.m_dwStyleExes = m_pProperties->m_dwStyleExes; + prop.m_dwStates = m_pProperties->m_dwStates; + prop.m_ctmOnParent = m_pProperties->m_ctmOnParent; + prop.m_pDataProvider = &m_PictureBoxDP; + if (m_pProperties->m_pParent) { + prop.m_pParent = m_pProperties->m_pParent->GetWidget(); + } + if (m_pProperties->m_pOwner) { + prop.m_pOwner = m_pProperties->m_pOwner->GetWidget(); + } + prop.m_rtWidget = m_pProperties->m_rtWidget; + m_pImp = IFWL_PictureBox::Create(); + FWL_ERR ret = ((IFWL_PictureBox*)m_pImp)->Initialize(prop); + if (ret == FWL_ERR_Succeeded) { + CFWL_Widget::Initialize(); + } + return ret; +} +CFX_DIBitmap* CFWL_PictureBox::GetPicture() +{ + return m_PictureBoxDP.m_pBitmap; +} +FWL_ERR CFWL_PictureBox::SetPicture(CFX_DIBitmap *pBitmap) +{ + m_PictureBoxDP.m_pBitmap = pBitmap; + return FWL_ERR_Succeeded; +} +FX_FLOAT CFWL_PictureBox::GetRotation() +{ + return m_PictureBoxDP.m_fRotation; +} +FWL_ERR CFWL_PictureBox::SetRotation(FX_FLOAT fRotation) +{ + m_PictureBoxDP.m_fRotation = fRotation; + return FWL_ERR_Succeeded; +} +FX_INT32 CFWL_PictureBox::GetFlipMode() +{ + return m_PictureBoxDP.GetFlipMode((IFWL_Widget*)this); +} +FWL_ERR CFWL_PictureBox::SetFlipMode(FX_INT32 iFlipMode) +{ + m_PictureBoxDP.m_iFlipMode = iFlipMode; + return FWL_ERR_Succeeded; +} +FX_INT32 CFWL_PictureBox::GetOpacity() +{ + return m_PictureBoxDP.GetOpacity((IFWL_Widget*)this); +} +FWL_ERR CFWL_PictureBox::SetOpacity(FX_INT32 iOpacity) +{ + m_PictureBoxDP.m_iOpacity = iOpacity; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_PictureBox::GetScale(FX_FLOAT &fScaleX, FX_FLOAT &fScaleY) +{ + CFX_Matrix matrix; + m_PictureBoxDP.GetMatrix((IFWL_Widget*)this, matrix); + matrix.Scale(fScaleX, fScaleY); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_PictureBox::SetScale(FX_FLOAT fScaleX, FX_FLOAT fScaleY) +{ + m_PictureBoxDP.m_fScaleX = fScaleX; + m_PictureBoxDP.m_fScaleY = fScaleY; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_PictureBox::GetOffset(FX_FLOAT &fx, FX_FLOAT &fy) +{ + CFX_Matrix matrix; + m_PictureBoxDP.GetMatrix((IFWL_Widget*)this, matrix); + fx = matrix.e; + fy = matrix.f; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_PictureBox::SetOffset(FX_FLOAT fx, FX_FLOAT fy) +{ + m_PictureBoxDP.m_fOffSetX = fx; + m_PictureBoxDP.m_fOffSetY = fy; + return FWL_ERR_Succeeded; +} +CFWL_PictureBox::CFWL_PictureBox() +{ +} +CFWL_PictureBox::~CFWL_PictureBox() +{ +} +FWL_ERR CFWL_PictureBox::CFWL_PictureBoxDP::GetCaption(IFWL_Widget *pWidget, CFX_WideString &wsCaption) +{ + return FWL_ERR_Succeeded; +} +CFX_DIBitmap* CFWL_PictureBox::CFWL_PictureBoxDP::GetPicture(IFWL_Widget *pWidget) +{ + return m_pBitmap; +} +CFX_DIBitmap* CFWL_PictureBox::CFWL_PictureBoxDP::GetErrorPicture(IFWL_Widget *pWidget) +{ + return m_pBitmap; +} +CFX_DIBitmap* CFWL_PictureBox::CFWL_PictureBoxDP::GetInitialPicture(IFWL_Widget *pWidget) +{ + return m_pBitmap; +} +FX_INT32 CFWL_PictureBox::CFWL_PictureBoxDP::GetOpacity(IFWL_Widget *pWidget) +{ + return m_iOpacity; +} +FWL_ERR CFWL_PictureBox::CFWL_PictureBoxDP::GetMatrix(IFWL_Widget *pWidget, CFX_Matrix &matrix) +{ + CFX_RectF rect; + pWidget->GetClientRect(rect); + FX_FLOAT fLen = rect.width / 2; + FX_FLOAT fWid = rect.height / 2; + matrix.Reset(); + matrix.Translate(-fLen, -fWid); + matrix.Rotate(m_fRotation); + matrix.Translate(fLen, fWid); + matrix.Scale(m_fScaleX, m_fScaleY); + matrix.Translate(m_fOffSetX, m_fOffSetY); + return FWL_ERR_Succeeded; +} +FX_INT32 CFWL_PictureBox::CFWL_PictureBoxDP::GetFlipMode(IFWL_Widget *pWidget) +{ + return m_iFlipMode; +} diff --git a/xfa/src/fwl/src/lightwidget/pushbutton.cpp b/xfa/src/fwl/src/lightwidget/pushbutton.cpp new file mode 100644 index 0000000000..7e4cae2d18 --- /dev/null +++ b/xfa/src/fwl/src/lightwidget/pushbutton.cpp @@ -0,0 +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 + +#include "../../../foxitlib.h" +CFWL_PushButton* CFWL_PushButton::Create() +{ + return FX_NEW CFWL_PushButton; +} +FWL_ERR CFWL_PushButton::Initialize(const CFWL_WidgetProperties *pProperties ) +{ + _FWL_RETURN_VALUE_IF_FAIL(!m_pImp, FWL_ERR_Indefinite); + if (pProperties) { + *m_pProperties = *pProperties; + } + CFWL_WidgetImpProperties prop; + prop.m_dwStyles = m_pProperties->m_dwStyles; + prop.m_dwStyleExes = m_pProperties->m_dwStyleExes; + prop.m_dwStates = m_pProperties->m_dwStates; + prop.m_ctmOnParent = m_pProperties->m_ctmOnParent; + prop.m_pDataProvider = &m_buttonData; + if (m_pProperties->m_pParent) { + prop.m_pParent = m_pProperties->m_pParent->GetWidget(); + } + if (m_pProperties->m_pOwner) { + prop.m_pOwner = m_pProperties->m_pOwner->GetWidget(); + } + prop.m_rtWidget = m_pProperties->m_rtWidget; + m_pImp = IFWL_PushButton::Create(); + FWL_ERR ret = ((IFWL_PushButton*)m_pImp)->Initialize(prop); + if (ret == FWL_ERR_Succeeded) { + CFWL_Widget::Initialize(); + } + return ret; +} +FWL_ERR CFWL_PushButton::GetCaption(CFX_WideString &wsCaption) +{ + wsCaption = m_buttonData.m_wsCaption; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_PushButton::SetCaption(FX_WSTR wsCaption) +{ + m_buttonData.m_wsCaption = wsCaption; + return FWL_ERR_Succeeded; +} +CFX_DIBitmap* CFWL_PushButton::GetPicture() +{ + return m_buttonData.m_pBitmap; +} +FWL_ERR CFWL_PushButton::SetPicture(CFX_DIBitmap *pBitmap) +{ + m_buttonData.m_pBitmap = pBitmap; + return FWL_ERR_Succeeded; +} +CFWL_PushButton::CFWL_PushButton() +{ +} +CFWL_PushButton::~CFWL_PushButton() +{ +} +FWL_ERR CFWL_PushButton::CFWL_PushButtonDP::GetCaption(IFWL_Widget *pWidget, CFX_WideString &wsCaption) +{ + wsCaption = m_wsCaption; + return FWL_ERR_Succeeded; +} +CFX_DIBitmap* CFWL_PushButton::CFWL_PushButtonDP::GetPicture(IFWL_Widget *pWidget) +{ + return m_pBitmap; +} diff --git a/xfa/src/fwl/src/lightwidget/scrollbar.cpp b/xfa/src/fwl/src/lightwidget/scrollbar.cpp new file mode 100644 index 0000000000..492b0f91f5 --- /dev/null +++ b/xfa/src/fwl/src/lightwidget/scrollbar.cpp @@ -0,0 +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 "../../../foxitlib.h" +CFWL_ScrollBar* CFWL_ScrollBar::Create() +{ + return FX_NEW CFWL_ScrollBar; +} +FWL_ERR CFWL_ScrollBar::Initialize(const CFWL_WidgetProperties *pProperties ) +{ + _FWL_RETURN_VALUE_IF_FAIL(!m_pImp, FWL_ERR_Indefinite); + if (pProperties) { + *m_pProperties = *pProperties; + } + CFWL_WidgetImpProperties prop; + prop.m_dwStyles = m_pProperties->m_dwStyles; + prop.m_dwStyleExes = m_pProperties->m_dwStyleExes; + prop.m_dwStates = m_pProperties->m_dwStates; + prop.m_ctmOnParent = m_pProperties->m_ctmOnParent; + if (m_pProperties->m_pParent) { + prop.m_pParent = m_pProperties->m_pParent->GetWidget(); + } + if (m_pProperties->m_pOwner) { + prop.m_pOwner = m_pProperties->m_pOwner->GetWidget(); + } + prop.m_rtWidget = m_pProperties->m_rtWidget; + m_pImp = IFWL_ScrollBar::Create(); + FWL_ERR ret = ((IFWL_ScrollBar*)m_pImp)->Initialize(prop); + if (ret == FWL_ERR_Succeeded) { + CFWL_Widget::Initialize(); + } + return ret; +} +FX_BOOL CFWL_ScrollBar::IsVertical() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FALSE); + return ((IFWL_ScrollBar*)m_pImp)->IsVertical(); +} +FWL_ERR CFWL_ScrollBar::GetRange(FX_FLOAT &fMin, FX_FLOAT &fMax) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return ((IFWL_ScrollBar*)m_pImp)->GetRange(fMin, fMax); +} +FWL_ERR CFWL_ScrollBar::SetRange(FX_FLOAT fMin, FX_FLOAT fMax) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return ((IFWL_ScrollBar*)m_pImp)->SetRange(fMin, fMax); +} +FX_FLOAT CFWL_ScrollBar::GetPageSize() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, 0); + return ((IFWL_ScrollBar*)m_pImp)->GetPageSize(); +} +FWL_ERR CFWL_ScrollBar::SetPageSize(FX_FLOAT fPageSize) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return ((IFWL_ScrollBar*)m_pImp)->SetPageSize(fPageSize); +} +FX_FLOAT CFWL_ScrollBar::GetStepSize() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, 0); + return ((IFWL_ScrollBar*)m_pImp)->GetStepSize(); +} +FWL_ERR CFWL_ScrollBar::SetStepSize(FX_FLOAT fStepSize) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return ((IFWL_ScrollBar*)m_pImp)->SetStepSize(fStepSize); +} +FX_FLOAT CFWL_ScrollBar::GetPos() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, -1); + return ((IFWL_ScrollBar*)m_pImp)->GetPos(); +} +FWL_ERR CFWL_ScrollBar::SetPos(FX_FLOAT fPos) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return ((IFWL_ScrollBar*)m_pImp)->SetPos(fPos); +} +FX_FLOAT CFWL_ScrollBar::GetTrackPos() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, -1); + return ((IFWL_ScrollBar*)m_pImp)->GetTrackPos(); +} +FWL_ERR CFWL_ScrollBar::SetTrackPos(FX_FLOAT fTrackPos) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return ((IFWL_ScrollBar*)m_pImp)->SetTrackPos(fTrackPos); +} +FX_BOOL CFWL_ScrollBar::DoScroll(FX_DWORD dwCode, FX_FLOAT fPos) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FALSE); + return ((IFWL_ScrollBar*)m_pImp)->DoScroll(dwCode, fPos); +} +CFWL_ScrollBar::CFWL_ScrollBar() +{ +} +CFWL_ScrollBar::~CFWL_ScrollBar() +{ +} diff --git a/xfa/src/fwl/src/lightwidget/theme.cpp b/xfa/src/fwl/src/lightwidget/theme.cpp new file mode 100644 index 0000000000..a631b37f88 --- /dev/null +++ b/xfa/src/fwl/src/lightwidget/theme.cpp @@ -0,0 +1,155 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +FX_BOOL CFWL_Theme::IsValidWidget(IFWL_Widget *pWidget) +{ + CFWL_WidgetTP *pTheme = GetTheme(pWidget); + return pTheme != NULL; +} +FX_DWORD CFWL_Theme::GetThemeID(IFWL_Widget *pWidget) +{ + CFWL_WidgetTP *pTheme = GetTheme(pWidget); + FXSYS_assert(pTheme); + return pTheme->GetThemeID(pWidget); +} +FX_DWORD CFWL_Theme::SetThemeID(IFWL_Widget *pWidget, FX_DWORD dwThemeID, FX_BOOL bChildren ) +{ + FX_INT32 iCount = m_arrThemes.GetSize(); + FX_DWORD dwID; + for (FX_INT32 i = 0; i < iCount; i ++) { + CFWL_WidgetTP *pTheme = (CFWL_WidgetTP*)m_arrThemes[i]; + dwID = pTheme->GetThemeID(pWidget); + pTheme->SetThemeID(pWidget, dwThemeID, FALSE); + } + return dwID; +} +FWL_ERR CFWL_Theme::GetThemeMatrix(IFWL_Widget *pWidget, CFX_Matrix &matrix) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_Theme::SetThemeMatrix(IFWL_Widget *pWidget, const CFX_Matrix &matrix) +{ + return FWL_ERR_Succeeded; +} +FX_BOOL CFWL_Theme::DrawBackground(CFWL_ThemeBackground *pParams) +{ + CFWL_WidgetTP *pTheme = GetTheme(pParams->m_pWidget); + FXSYS_assert(pTheme); + return pTheme->DrawBackground(pParams); +} +FX_BOOL CFWL_Theme::DrawText(CFWL_ThemeText *pParams) +{ + CFWL_WidgetTP *pTheme = GetTheme(pParams->m_pWidget); + FXSYS_assert(pTheme); + return pTheme->DrawText(pParams); +} +FX_LPVOID CFWL_Theme::GetCapacity(CFWL_ThemePart *pThemePart, FX_DWORD dwCapacity) +{ + CFWL_WidgetTP *pTheme = GetTheme(pThemePart->m_pWidget); + FXSYS_assert(pTheme); + return pTheme->GetCapacity(pThemePart, dwCapacity); +} +FX_BOOL CFWL_Theme::IsCustomizedLayout(IFWL_Widget *pWidget) +{ + CFWL_WidgetTP *pTheme = GetTheme(pWidget); + FXSYS_assert(pTheme); + return pTheme->IsCustomizedLayout(pWidget); +} +FWL_ERR CFWL_Theme::GetPartRect(CFWL_ThemePart* pThemePart, CFX_RectF &rtPart) +{ + CFWL_WidgetTP *pTheme = GetTheme(pThemePart->m_pWidget); + FXSYS_assert(pTheme); + return pTheme->GetPartRect(pThemePart, rtPart); +} +FX_BOOL CFWL_Theme::IsInPart(CFWL_ThemePart* pThemePart, FX_FLOAT fx, FX_FLOAT fy) +{ + CFWL_WidgetTP *pTheme = GetTheme(pThemePart->m_pWidget); + FXSYS_assert(pTheme); + return pTheme->IsInPart(pThemePart, fx, fy); +} +FX_BOOL CFWL_Theme::CalcTextRect(CFWL_ThemeText *pParams, CFX_RectF &rect) +{ + CFWL_WidgetTP *pTheme = GetTheme(pParams->m_pWidget); + FXSYS_assert(pTheme); + return pTheme->CalcTextRect(pParams, rect); +} +FWL_ERR CFWL_Theme::Initialize() +{ + FX_INT32 iCount = m_arrThemes.GetSize(); + for (FX_INT32 i = 0; i < iCount; i ++) { + CFWL_WidgetTP *pTheme = (CFWL_WidgetTP*)m_arrThemes[i]; + pTheme->Initialize(); + } + FWLTHEME_Init(); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_Theme::Finalize() +{ + FX_INT32 iCount = m_arrThemes.GetSize(); + for (FX_INT32 i = 0; i < iCount; i ++) { + CFWL_WidgetTP *pTheme = (CFWL_WidgetTP*)m_arrThemes[i]; + pTheme->Finalize(); + } + FWLTHEME_Release(); + return FWL_ERR_Succeeded; +} +CFWL_Theme::CFWL_Theme() +{ + CFWL_FormTP *pFormTP = FX_NEW CFWL_FormTP; + CFWL_PushButtonTP *pPushButtonTP = FX_NEW CFWL_PushButtonTP; + CFWL_CheckBoxTP *pCheckBoxTP = FX_NEW CFWL_CheckBoxTP; + CFWL_ListBoxTP *pListBoxTP = FX_NEW CFWL_ListBoxTP; + CFWL_PictureBoxTP *pPictureBoxTP = FX_NEW CFWL_PictureBoxTP; + CFWL_ScrollBarTP *pSrollBarTP = FX_NEW CFWL_ScrollBarTP; + CFWL_EditTP *pEditTP = FX_NEW CFWL_EditTP; + CFWL_ComboBoxTP *pComboBoxTP = FX_NEW CFWL_ComboBoxTP; + CFWL_BarcodeTP *pBarcodeTP = FX_NEW CFWL_BarcodeTP; + CFWL_DateTimePickerTP *pDateTimePickerTP = FX_NEW CFWL_DateTimePickerTP; + CFWL_MonthCalendarTP *pMonthCalendarTP = FX_NEW CFWL_MonthCalendarTP; + CFWL_CaretTP *pCaretTP = FX_NEW CFWL_CaretTP; + m_arrThemes.Add(pFormTP); + m_arrThemes.Add(pPushButtonTP); + m_arrThemes.Add(pCheckBoxTP); + m_arrThemes.Add(pListBoxTP); + m_arrThemes.Add(pPictureBoxTP); + m_arrThemes.Add(pSrollBarTP); + m_arrThemes.Add(pEditTP); + m_arrThemes.Add(pComboBoxTP); + m_arrThemes.Add(pBarcodeTP); + m_arrThemes.Add(pDateTimePickerTP); + m_arrThemes.Add(pMonthCalendarTP); + m_arrThemes.Add(pCaretTP); +} +CFWL_Theme::~CFWL_Theme() +{ + FX_INT32 iCount = m_arrThemes.GetSize(); + for (FX_INT32 i = 0; i < iCount; i ++) { + CFWL_WidgetTP *pTheme = (CFWL_WidgetTP*)m_arrThemes[i]; + delete pTheme; + } + m_arrThemes.RemoveAll(); +} +FWL_ERR CFWL_Theme::SetFont(IFWL_Widget *pWidget, FX_LPCWSTR strFont, FX_FLOAT fFontSize, FX_ARGB rgbFont) +{ + FX_INT32 iCount = m_arrThemes.GetSize(); + for (FX_INT32 i = 0; i < iCount; i ++) { + CFWL_WidgetTP *pTheme = (CFWL_WidgetTP*)m_arrThemes[i]; + pTheme->SetFont(pWidget, strFont, fFontSize, rgbFont); + } + return FWL_ERR_Succeeded; +} +CFWL_WidgetTP* CFWL_Theme::GetTheme(IFWL_Widget* pWidget) +{ + FX_INT32 iCount = m_arrThemes.GetSize(); + for (FX_INT32 i = 0; i < iCount; i ++) { + CFWL_WidgetTP *pTheme = (CFWL_WidgetTP*)m_arrThemes[i]; + if (pTheme->IsValidWidget(pWidget)) { + return pTheme; + } + } + return NULL; +} diff --git a/xfa/src/fwl/src/lightwidget/tooltipctrl.cpp b/xfa/src/fwl/src/lightwidget/tooltipctrl.cpp new file mode 100644 index 0000000000..9397013c07 --- /dev/null +++ b/xfa/src/fwl/src/lightwidget/tooltipctrl.cpp @@ -0,0 +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 "../../../foxitlib.h" +#include "../core/include/fwl_targetimp.h" +#include "../core/include/fwl_noteimp.h" +#include "../core/include/fwl_widgetimp.h" +#include "../core/include/fwl_panelimp.h" +#include "../core/include/fwl_formimp.h" +#include "../core/include/fwl_threadimp.h" +CFWL_ToolTip* CFWL_ToolTip::Create() +{ + return FX_NEW CFWL_ToolTip; +} +FWL_ERR CFWL_ToolTip::Initialize(const CFWL_WidgetProperties *pProperties ) +{ + _FWL_RETURN_VALUE_IF_FAIL(!m_pImp, FWL_ERR_Indefinite); + if (pProperties) { + *m_pProperties = *pProperties; + } + CFWL_WidgetImpProperties prop; + prop.m_dwStyles = m_pProperties->m_dwStyles; + prop.m_dwStyleExes = m_pProperties->m_dwStyleExes; + prop.m_dwStates = m_pProperties->m_dwStates; + prop.m_ctmOnParent = m_pProperties->m_ctmOnParent; + prop.m_pDataProvider = &m_tooltipData; + if (m_pProperties->m_pParent) { + prop.m_pParent = m_pProperties->m_pParent->GetWidget(); + } + if (m_pProperties->m_pOwner) { + prop.m_pOwner = m_pProperties->m_pOwner->GetWidget(); + } + prop.m_rtWidget = m_pProperties->m_rtWidget; + m_pImp = IFWL_ToolTip::Create(); + FWL_ERR ret = ((IFWL_ToolTip*)m_pImp)->Initialize(prop); + if (ret == FWL_ERR_Succeeded) { + CFWL_Widget::Initialize(); + } + return ret; +} +FWL_ERR CFWL_ToolTip::GetCaption(CFX_WideString &wsCaption) +{ + wsCaption = m_tooltipData.m_wsCaption; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ToolTip::SetCaption(FX_WSTR wsCaption) +{ + m_tooltipData.m_wsCaption = wsCaption; + return FWL_ERR_Succeeded; +} +FX_INT32 CFWL_ToolTip::GetInitialDelay() +{ + return m_tooltipData.m_nInitDelayTime; +} +FX_INT32 CFWL_ToolTip::SetInitialDelay(FX_INT32 nDelayTime) +{ + m_tooltipData.m_nInitDelayTime = nDelayTime; + return FWL_ERR_Succeeded; +} +FX_INT32 CFWL_ToolTip::GetAutoPopDelay() +{ + return m_tooltipData.m_nAutoPopDelayTime; +} +FX_INT32 CFWL_ToolTip::SetAutoPopDelay(FX_INT32 nDelayTime) +{ + m_tooltipData.m_nAutoPopDelayTime = nDelayTime; + return FWL_ERR_Succeeded; +} +CFX_DIBitmap* CFWL_ToolTip::GetToolTipIcon() +{ + return m_tooltipData.m_pBitmap; +} +FWL_ERR CFWL_ToolTip::SetToolTipIcon(CFX_DIBitmap *pBitmap) +{ + m_tooltipData.m_pBitmap = pBitmap; + return FWL_ERR_Succeeded; +} +CFX_SizeF CFWL_ToolTip::GetToolTipIconSize() +{ + return m_tooltipData.m_fIconSize; +} +FWL_ERR CFWL_ToolTip::SetToolTipIconSize(CFX_SizeF fSize) +{ + m_tooltipData.m_fIconSize = fSize; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_ToolTip::SetAnchor(const CFX_RectF &rtAnchor) +{ + return ((IFWL_ToolTip*)m_pImp)->SetAnchor(rtAnchor); +} +FWL_ERR CFWL_ToolTip::Show() +{ + return ((IFWL_ToolTip*)m_pImp)->Show(); +} +FWL_ERR CFWL_ToolTip::Hide() +{ + return ((IFWL_ToolTip*)m_pImp)->Hide(); +} +CFWL_ToolTip::CFWL_ToolTip() +{ +} +CFWL_ToolTip::~CFWL_ToolTip() +{ +} +CFWL_ToolTip::CFWL_ToolTipDP::CFWL_ToolTipDP() + : m_pBitmap(NULL) +{ + m_wsCaption = L""; + m_nInitDelayTime = 500; + m_nAutoPopDelayTime = 50000; + m_fIconSize.Set( 0.0, 0.0); + m_fAnchor.Set( 0.0, 0.0, 0.0, 0.0); +} +FWL_ERR CFWL_ToolTip::CFWL_ToolTipDP::GetCaption(IFWL_Widget *pWidget, CFX_WideString &wsCaption) +{ + wsCaption = m_wsCaption; + return FWL_ERR_Succeeded; +} +FX_INT32 CFWL_ToolTip::CFWL_ToolTipDP::GetInitialDelay(IFWL_Widget *pWidget) +{ + return m_nInitDelayTime; +} +FX_INT32 CFWL_ToolTip::CFWL_ToolTipDP::GetAutoPopDelay(IFWL_Widget *pWidget) +{ + return m_nAutoPopDelayTime; +} +CFX_DIBitmap* CFWL_ToolTip::CFWL_ToolTipDP::GetToolTipIcon(IFWL_Widget *pWidget) +{ + return m_pBitmap; +} +CFX_SizeF CFWL_ToolTip::CFWL_ToolTipDP::GetToolTipIconSize(IFWL_Widget *pWidget) +{ + return m_fIconSize; +} +CFX_RectF CFWL_ToolTip::CFWL_ToolTipDP::GetAnchor() +{ + return m_fAnchor; +} diff --git a/xfa/src/fwl/src/lightwidget/widget.cpp b/xfa/src/fwl/src/lightwidget/widget.cpp new file mode 100644 index 0000000000..f080d691bc --- /dev/null +++ b/xfa/src/fwl/src/lightwidget/widget.cpp @@ -0,0 +1,344 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../../src/core/include/fwl_noteimp.h" +#include "../core/include/fwl_targetimp.h" +#include "../core/include/fwl_noteimp.h" +#include "../core/include/fwl_widgetimp.h" +#include "../core/include/fwl_widgetmgrimp.h" +IFWL_Widget* CFWL_Widget::GetWidget() +{ + return m_pImp; +} +FX_DWORD CFWL_Widget::Release() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, 0); + FX_DWORD dwRef = m_pImp->GetRefCount(); + if (dwRef == 1) { + m_pImp->Finalize(); + } + m_pImp->Release(); + if (dwRef == 1) { + m_pImp = NULL; + delete this; + } + return dwRef - 1; +} +CFWL_Widget* CFWL_Widget::Retain() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, NULL); + m_pImp->Retain(); + return this; +} +FX_DWORD CFWL_Widget::GetRefCount() const +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, 1); + return m_pImp->GetRefCount(); +} +FWL_ERR CFWL_Widget::GetClassName(CFX_WideString &wsClass) const +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return m_pImp->GetClassName(wsClass); +} +FX_DWORD CFWL_Widget::GetClassID() const +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, 0); + return m_pImp->GetClassID(); +} +FX_BOOL CFWL_Widget::IsInstance(FX_WSTR wsClass) const +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FALSE); + return m_pImp->IsInstance(wsClass); +} +static FX_LPVOID gs_pFWLWidget = (FX_LPVOID)FXBSTR_ID('l', 'i', 'g', 't'); +FWL_ERR CFWL_Widget::Initialize(const CFWL_WidgetProperties *pProperties ) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return m_pImp->SetPrivateData(gs_pFWLWidget, this, NULL); +} +FWL_ERR CFWL_Widget::GetWidgetRect(CFX_RectF &rect, FX_BOOL bAutoSize ) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return m_pImp->GetWidgetRect(rect, bAutoSize); +} +FWL_ERR CFWL_Widget::GetGlobalRect(CFX_RectF &rect) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return m_pImp->GetGlobalRect(rect); +} +FWL_ERR CFWL_Widget::SetWidgetRect(const CFX_RectF &rect) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return m_pImp->SetWidgetRect(rect); +} +FWL_ERR CFWL_Widget::GetClientRect(CFX_RectF &rect) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return m_pImp->GetClientRect(rect); +} +CFWL_Widget* CFWL_Widget::GetParent() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, NULL); + IFWL_Widget *parent = m_pImp->GetParent(); + if (parent) { + return (CFWL_Widget*)parent->GetPrivateData(gs_pFWLWidget); + } + return NULL; +} +FWL_ERR CFWL_Widget::SetParent(CFWL_Widget *pParent) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return m_pImp->SetParent(pParent ? pParent->GetWidget() : NULL); +} +CFWL_Widget* CFWL_Widget::GetOwner() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, NULL); + return NULL; +} +FWL_ERR CFWL_Widget::SetOwner(CFWL_Widget *pOwner) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return FWL_ERR_Succeeded; +} +FX_DWORD CFWL_Widget::GetStyles() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, 0); + return m_pImp->GetStyles(); +} +FWL_ERR CFWL_Widget::ModifyStyles(FX_DWORD dwStylesAdded, FX_DWORD dwStylesRemoved) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return m_pImp->ModifyStyles(dwStylesAdded, dwStylesRemoved); +} +FX_DWORD CFWL_Widget::GetStylesEx() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, 0); + return m_pImp->GetStylesEx(); +} +FWL_ERR CFWL_Widget::ModifyStylesEx(FX_DWORD dwStylesExAdded, FX_DWORD dwStylesExRemoved) +{ + return m_pImp->ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved); +} +FX_DWORD CFWL_Widget::GetStates() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return m_pImp->GetStates(); +} +FWL_ERR CFWL_Widget::SetStates(FX_DWORD dwStates, FX_BOOL bSet ) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return m_pImp->SetStates(dwStates, bSet); +} +FWL_ERR CFWL_Widget::SetPrivateData(FX_LPVOID module_id, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return m_pImp->SetPrivateData(module_id, pData, callback); +} +FX_LPVOID CFWL_Widget::GetPrivateData(FX_LPVOID module_id) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, NULL); + return m_pImp->GetPrivateData(module_id); +} +FWL_ERR CFWL_Widget::Update() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return m_pImp->Update(); +} +FWL_ERR CFWL_Widget::LockUpdate() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return m_pImp->LockUpdate(); +} +FWL_ERR CFWL_Widget::UnlockUpdate() +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return m_pImp->UnlockUpdate(); +} +FX_DWORD CFWL_Widget::HitTest(FX_FLOAT fx, FX_FLOAT fy) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, 0); + return m_pImp->HitTest(fx, fy); +} +FWL_ERR CFWL_Widget::TransformTo(CFWL_Widget *pWidget, FX_FLOAT &fx, FX_FLOAT &fy) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return m_pImp->TransformTo(pWidget ? pWidget->GetWidget() : NULL, fx, fy); +} +FWL_ERR CFWL_Widget::TransformTo(CFWL_Widget *pWidget, CFX_RectF &rt) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return m_pImp->TransformTo(pWidget ? pWidget->GetWidget() : NULL, rt); +} +FWL_ERR CFWL_Widget::GetMatrix(CFX_Matrix &matrix, FX_BOOL bGlobal ) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return m_pImp->GetMatrix(matrix, bGlobal); +} +FWL_ERR CFWL_Widget::SetMatrix(const CFX_Matrix &matrix) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return m_pImp->SetMatrix(matrix); +} +FWL_ERR CFWL_Widget::DrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + return m_pImp->DrawWidget(pGraphics, pMatrix); +} +FWL_ERR CFWL_Widget::GetProperties(CFWL_WidgetProperties &properties) +{ + properties.m_ctmOnParent = m_pProperties->m_ctmOnParent; + properties.m_rtWidget = m_pProperties->m_rtWidget; + properties.m_dwStyles = m_pProperties->m_dwStyles; + properties.m_dwStyleExes = m_pProperties->m_dwStyleExes; + properties.m_dwStates = m_pProperties->m_dwStates; + properties.m_pParent = m_pProperties->m_pParent; + properties.m_pOwner = m_pProperties->m_pOwner; + properties.m_wsWindowclass = m_pProperties->m_wsWindowclass; + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_Widget::SetProperties(const CFWL_WidgetProperties &properties) +{ + m_pProperties->m_ctmOnParent = properties.m_ctmOnParent; + m_pProperties->m_rtWidget = properties.m_rtWidget; + m_pProperties->m_dwStyles = properties.m_dwStyles; + m_pProperties->m_dwStyleExes = properties.m_dwStyleExes; + m_pProperties->m_dwStates = properties.m_dwStates; + m_pProperties->m_pParent = properties.m_pParent; + m_pProperties->m_pOwner = properties.m_pOwner; + m_pProperties->m_wsWindowclass = properties.m_wsWindowclass; + return FWL_ERR_Succeeded; +} +IFWL_WidgetDelegate* CFWL_Widget::SetDelegate(IFWL_WidgetDelegate* pDelegate) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, NULL); + m_pDelegate = m_pImp->SetDelegate(pDelegate); + return m_pDelegate; +} +CFWL_Widget::CFWL_Widget() + : m_pImp(NULL) + , m_pDelegate(NULL) + , m_pProperties(NULL) +{ + m_pProperties = FX_NEW CFWL_WidgetProperties; + m_pWidgetMgr = (CFWL_WidgetMgr*)FWL_GetWidgetMgr(); + FXSYS_assert(m_pWidgetMgr != NULL); +} +CFWL_Widget::~CFWL_Widget() +{ + if (m_pProperties) { + delete m_pProperties; + m_pProperties = NULL; + } + if (m_pImp) { + m_pImp->Finalize(); + m_pImp->Release(); + m_pImp = NULL; + } +} +FWL_ERR CFWL_Widget::Repaint(const CFX_RectF *pRect) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + CFX_RectF rect; + if (pRect) { + rect = *pRect; + } else { + m_pImp->GetWidgetRect(rect); + rect.left = rect.top = 0; + } + return m_pWidgetMgr->RepaintWidget(m_pImp, &rect); +} +FWL_ERR CFWL_Widget::SetFocus(FX_BOOL bFocus) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + IFWL_NoteThread *pThread = m_pImp->GetOwnerThread(); + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + IFWL_NoteDriver *pDriver = pThread->GetNoteDriver(); + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + if (bFocus) { + pDriver->SetFocus(m_pImp); + } else { + if (((CFWL_NoteDriver*)pDriver)->GetFocus() == m_pImp) { + pDriver->SetFocus(NULL); + } + } + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_Widget::SetGrab(FX_BOOL bSet) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + IFWL_NoteThread *pThread = m_pImp->GetOwnerThread(); + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + CFWL_NoteDriver *pDriver = (CFWL_NoteDriver*)pThread->GetNoteDriver(); + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, FWL_ERR_Indefinite); + pDriver->SetGrab(m_pImp, bSet); + return FWL_ERR_Succeeded; +} +void CFWL_Widget::RegisterEventTarget(CFWL_Widget *pEventSource , FX_DWORD dwFilter ) +{ + _FWL_RETURN_IF_FAIL(m_pImp); + IFWL_NoteThread *pThread = m_pImp->GetOwnerThread(); + _FWL_RETURN_IF_FAIL(pThread); + IFWL_NoteDriver *pNoteDriver = pThread->GetNoteDriver(); + _FWL_RETURN_IF_FAIL(pNoteDriver); + IFWL_Widget *pEventSourceImp = !pEventSource ? NULL : pEventSource->GetWidget(); + pNoteDriver->RegisterEventTarget(GetWidget(), pEventSourceImp, dwFilter); +} +void CFWL_Widget::DispatchEvent(CFWL_Event *pEvent) +{ + _FWL_RETURN_IF_FAIL(m_pImp); + if (m_pImp->GetOuter()) { + return; + } + IFWL_NoteThread *pThread = m_pImp->GetOwnerThread(); + _FWL_RETURN_IF_FAIL(pThread); + IFWL_NoteDriver *pNoteDriver = pThread->GetNoteDriver(); + _FWL_RETURN_IF_FAIL(pNoteDriver); + pNoteDriver->SendNote(pEvent); +} +#define FWL_WGT_CalcHeight 2048 +#define FWL_WGT_CalcWidth 2048 +#define FWL_WGT_CalcMultiLineDefWidth 120.0f +CFX_SizeF CFWL_Widget::CalcTextSize(const CFX_WideString &wsText, FX_BOOL bMultiLine , FX_INT32 iLineWidth ) +{ + CFX_SizeF sz; + sz.Set(0, 0); + _FWL_RETURN_VALUE_IF_FAIL(m_pImp, sz); + IFWL_ThemeProvider *pTheme = m_pImp->GetThemeProvider(); + _FWL_RETURN_VALUE_IF_FAIL(pTheme, sz); + CFWL_ThemeText calPart; + calPart.m_pWidget = m_pImp; + calPart.m_wsText = wsText; + calPart.m_dwTTOStyles = bMultiLine ? FDE_TTOSTYLE_LineWrap : FDE_TTOSTYLE_SingleLine; + calPart.m_iTTOAlign = FDE_TTOALIGNMENT_TopLeft; + CFX_RectF rect; + FX_FLOAT fWidth = bMultiLine ? + (iLineWidth > 0 ? (FX_FLOAT)iLineWidth : FWL_WGT_CalcMultiLineDefWidth) : + FWL_WGT_CalcWidth; + rect.Set(0, 0, fWidth, FWL_WGT_CalcHeight); + pTheme->CalcTextRect(&calPart, rect); + sz.x = rect.width; + sz.y = rect.height; + return sz; +} +CFWL_WidgetDelegate::CFWL_WidgetDelegate() +{ +} +CFWL_WidgetDelegate::~CFWL_WidgetDelegate() +{ +} +FX_INT32 CFWL_WidgetDelegate::OnProcessMessage(CFWL_Message *pMessage) +{ + return 1; +} +FWL_ERR CFWL_WidgetDelegate::OnProcessEvent(CFWL_Event *pEvent) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_WidgetDelegate::OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + return FWL_ERR_Succeeded; +} diff --git a/xfa/src/fwl/src/theme/barcodetp.cpp b/xfa/src/fwl/src/theme/barcodetp.cpp new file mode 100644 index 0000000000..86bbf92c4a --- /dev/null +++ b/xfa/src/fwl/src/theme/barcodetp.cpp @@ -0,0 +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 + +#include "../../../foxitlib.h" +CFWL_BarcodeTP::CFWL_BarcodeTP() +{ +} +CFWL_BarcodeTP::~CFWL_BarcodeTP() +{ +} +FX_BOOL CFWL_BarcodeTP::IsValidWidget(IFWL_Widget *pWidget) +{ + _FWL_RETURN_VALUE_IF_FAIL(pWidget, FALSE); + return pWidget->GetClassID() == FWL_CLASSHASH_Barcode; +} +FX_BOOL CFWL_BarcodeTP::DrawBackground(CFWL_ThemeBackground *pParams) +{ + _FWL_RETURN_VALUE_IF_FAIL(pParams, FALSE); + switch(pParams->m_iPart) { + case FWL_PART_BCD_Border: { + DrawBorder(pParams->m_pGraphics, &pParams->m_rtPart, &pParams->m_matrix); + break; + } + case FWL_PART_BCD_Edge: { + DrawEdge(pParams->m_pGraphics, pParams->m_pWidget->GetStyles(), &pParams->m_rtPart, &pParams->m_matrix); + break; + } + case FWL_PART_BCD_Background: { + FillBackground(pParams->m_pGraphics, &pParams->m_rtPart, &pParams->m_matrix); + break; + } + default: { + } + } + return TRUE; +} diff --git a/xfa/src/fwl/src/theme/carettp.cpp b/xfa/src/fwl/src/theme/carettp.cpp new file mode 100644 index 0000000000..b33a97da25 --- /dev/null +++ b/xfa/src/fwl/src/theme/carettp.cpp @@ -0,0 +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 + +#include "../../../foxitlib.h" +CFWL_CaretTP::CFWL_CaretTP() +{ +} +CFWL_CaretTP::~CFWL_CaretTP() +{ +} +FX_BOOL CFWL_CaretTP::IsValidWidget(IFWL_Widget *pWidget) +{ + _FWL_RETURN_VALUE_IF_FAIL(pWidget, FALSE); + return pWidget->GetClassID() == FWL_CLASSHASH_Caret; +} +FX_BOOL CFWL_CaretTP::DrawBackground(CFWL_ThemeBackground *pParams) +{ + _FWL_RETURN_VALUE_IF_FAIL(pParams, FALSE); + switch(pParams->m_iPart) { + case FWL_PART_CAT_Background: { + if (!(pParams->m_dwStates & FWL_PARTSTATE_CAT_HightLight)) { + return TRUE; + } + DrawCaretBK(pParams->m_pGraphics, pParams->m_dwStates, &(pParams->m_rtPart), (CFX_Color *)pParams->m_pData, &(pParams->m_matrix)); + break; + } + } + return TRUE; +} +void CFWL_CaretTP::DrawCaretBK(CFX_Graphics *pGraphics, FX_DWORD dwStates, const CFX_RectF *pRect, CFX_Color *crFill, CFX_Matrix *pMatrix) +{ + CFX_Path path; + path.Create(); + CFX_Color crFilltemp; + crFill ? crFilltemp = *crFill : crFilltemp = ArgbEncode(255, 0, 0, 0); + CFX_RectF rect = *pRect; + path.AddRectangle(rect.left, rect.top, rect.width, rect.height); + pGraphics->SetFillColor(&crFilltemp); + pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); +} diff --git a/xfa/src/fwl/src/theme/checkboxtp.cpp b/xfa/src/fwl/src/theme/checkboxtp.cpp new file mode 100644 index 0000000000..32e74e4a44 --- /dev/null +++ b/xfa/src/fwl/src/theme/checkboxtp.cpp @@ -0,0 +1,500 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#define CHECKBOX_SIZE_SIGNMARGIN 3 +#define CHECKBOX_SIZE_SIGNBORDER 2 +#define CHECKBOX_SIZE_SIGNPATH 100 +#define CHECKBOX_COLOR_BOXLT1 (ArgbEncode(255, 172, 168, 153)) +#define CHECKBOX_COLOR_BOXLT2 (ArgbEncode(255, 113, 111, 100)) +#define CHECKBOX_COLOR_BOXRB1 (ArgbEncode(255, 241, 239, 226)) +#define CHECKBOX_COLOR_BOXRB2 (ArgbEncode(255, 255, 255, 255)) +#define CHECKBOX_FXGE_CoordinatesAdjust +CFWL_CheckBoxTP::CFWL_CheckBoxTP() + : m_pCheckPath(NULL) +{ + m_pThemeData = FX_NEW CKBThemeData; + SetThemeData(0); +} +CFWL_CheckBoxTP::~CFWL_CheckBoxTP() +{ + if (m_pThemeData) { + delete m_pThemeData; + m_pThemeData = NULL; + } + if (m_pCheckPath) { + m_pCheckPath->Clear(); + delete m_pCheckPath; + m_pCheckPath = NULL; + } +} +FX_BOOL CFWL_CheckBoxTP::IsValidWidget(IFWL_Widget *pWidget) +{ + _FWL_RETURN_VALUE_IF_FAIL(pWidget, FALSE); + FX_DWORD dwHash = pWidget->GetClassID(); + return dwHash == FWL_CLASSHASH_CheckBox || dwHash == FWL_CLASSHASH_RadioButton; +} +FX_DWORD CFWL_CheckBoxTP::SetThemeID(IFWL_Widget *pWidget, FX_DWORD dwThemeID, FX_BOOL bChildren ) +{ + if (m_pThemeData) { + SetThemeData(FWL_GetThemeColor(dwThemeID)); + } + return CFWL_WidgetTP::SetThemeID(pWidget, dwThemeID, bChildren); +} +FX_BOOL CFWL_CheckBoxTP::DrawText(CFWL_ThemeText *pParams) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pTextOut, FALSE); + FX_BOOL bDisable = (pParams->m_dwStates & FWL_PARTSTATE_CKB_Mask1) == FWL_PARTSTATE_CKB_Disabled; + FX_ARGB argText = bDisable ? FWLTHEME_CAPACITY_TextDisColor : FWLTHEME_CAPACITY_TextColor; + m_pTextOut->SetTextColor(argText); + return CFWL_WidgetTP::DrawText(pParams); +} +FX_BOOL CFWL_CheckBoxTP::DrawBackground(CFWL_ThemeBackground *pParams) +{ + _FWL_RETURN_VALUE_IF_FAIL(pParams, FALSE); + switch(pParams->m_iPart) { + case FWL_PART_CKB_Border: { + DrawBorder(pParams->m_pGraphics, &pParams->m_rtPart, &pParams->m_matrix); + break; + } + case FWL_PART_CKB_Edge: { + DrawEdge(pParams->m_pGraphics, pParams->m_pWidget->GetStyles(), &pParams->m_rtPart, &pParams->m_matrix); + break; + } + case FWL_PART_CKB_Background: { + FillBackground(pParams->m_pGraphics, &pParams->m_rtPart, &pParams->m_matrix); + if (pParams->m_dwStates & FWL_PARTSTATE_CKB_Focused) { + pParams->m_rtPart = *(CFX_RectF*)pParams->m_pData; + DrawFocus(pParams->m_pGraphics, &pParams->m_rtPart, &pParams->m_matrix); + } + break; + } + case FWL_PART_CKB_CheckBox: { + DrawBoxBk(pParams->m_pWidget, pParams->m_pGraphics, &pParams->m_rtPart, pParams->m_dwStates, &pParams->m_matrix); + if (((pParams->m_dwStates & FWL_PARTSTATE_CKB_Mask2) == FWL_PARTSTATE_CKB_Checked) | + ((pParams->m_dwStates & FWL_PARTSTATE_CKB_Mask2) == FWL_PARTSTATE_CKB_Neutral)) { + DrawSign(pParams->m_pWidget, pParams->m_pGraphics, &pParams->m_rtPart, pParams->m_dwStates, &pParams->m_matrix); + } + FX_BOOL bDisable = (pParams->m_dwStates & FWL_PARTSTATE_CKB_Mask1) == FWL_PARTSTATE_CKB_Disabled; + DrawSignBorder(pParams->m_pWidget, pParams->m_pGraphics, &pParams->m_rtPart, bDisable, &pParams->m_matrix); + break; + } + default: { + return FALSE; + } + } + return TRUE; +} +FWL_ERR CFWL_CheckBoxTP::Initialize() +{ + InitTTO(); + return CFWL_WidgetTP::Initialize(); +} +FWL_ERR CFWL_CheckBoxTP::Finalize() +{ + FinalizeTTO(); + return CFWL_WidgetTP::Finalize(); +} +void CFWL_CheckBoxTP::DrawBoxBk(IFWL_Widget *pWidget, CFX_Graphics *pGraphics, const CFX_RectF *pRect, FX_DWORD dwStates, CFX_Matrix *pMatrix ) +{ + dwStates &= 0x03; + FX_INT32 fillMode = FXFILL_WINDING; + FX_DWORD dwStyleEx = pWidget->GetStylesEx(); + dwStyleEx &= FWL_STYLEEXT_CKB_ShapeMask; + CFX_Path path; + path.Create(); + FX_FLOAT fRight = pRect->right(); + FX_FLOAT fBottom = pRect->bottom(); + FX_BOOL bClipSign = (dwStates & FWL_PARTSTATE_CKB_Mask1) == FWL_PARTSTATE_CKB_Hovered; + if ((dwStyleEx == FWL_STYLEEXT_CKB_ShapeSolidSquare) || (dwStyleEx == FWL_STYLEEXT_CKB_ShapeSunkenSquare)) { + path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height); + if (bClipSign) { + fillMode = FXFILL_ALTERNATE; + path.AddRectangle(pRect->left + CHECKBOX_SIZE_SIGNMARGIN, + pRect->top + CHECKBOX_SIZE_SIGNMARGIN, + pRect->width - CHECKBOX_SIZE_SIGNMARGIN * 2, + pRect->height - CHECKBOX_SIZE_SIGNMARGIN * 2); + } + } else { +#ifdef CHECKBOX_FXGE_CoordinatesAdjust + CFX_RectF rect(*pRect); + rect.Deflate(0, 0, 1, 1); + path.AddEllipse(rect); +#else + path.AddEllipse(*pRect); +#endif + if (bClipSign) { + fillMode = FXFILL_ALTERNATE; +#ifdef CHECKBOX_FXGE_CoordinatesAdjust + CFX_RectF rtClip(rect); +#else + CFX_RectF rtClip(*pRect); +#endif + rtClip.Deflate(CHECKBOX_SIZE_SIGNMARGIN - 1, CHECKBOX_SIZE_SIGNMARGIN - 1); + path.AddEllipse(rtClip); + } + } + FX_INT32 iTheme = 1; + if ((dwStates & FWL_PARTSTATE_CKB_Mask1) == FWL_PARTSTATE_CKB_Hovered) { + iTheme = 2; + } else if ((dwStates & FWL_PARTSTATE_CKB_Mask1) == FWL_PARTSTATE_CKB_Pressed) { + iTheme = 3; + } else if ((dwStates & FWL_PARTSTATE_CKB_Mask1) == FWL_PARTSTATE_CKB_Disabled) { + iTheme = 4; + } + if ((dwStates & FWL_PARTSTATE_CKB_Mask2) == FWL_PARTSTATE_CKB_Checked) { + iTheme += 4; + } else if ((dwStates & FWL_PARTSTATE_CKB_Mask2) == FWL_PARTSTATE_CKB_Neutral) { + iTheme += 8; + } + DrawAxialShading(pGraphics, pRect->left - 1, pRect->top - 1, fRight, + fBottom, m_pThemeData->clrBoxBk[iTheme][0], + m_pThemeData->clrBoxBk[iTheme][1], &path, fillMode, pMatrix); +} +void CFWL_CheckBoxTP::DrawSign(IFWL_Widget *pWidget, CFX_Graphics *pGraphics, const CFX_RectF *pRtBox, FX_DWORD dwStates, CFX_Matrix *pMatrix ) +{ + CFX_RectF rtSign(*pRtBox); + rtSign.Deflate(CHECKBOX_SIZE_SIGNMARGIN, CHECKBOX_SIZE_SIGNMARGIN); + FX_DWORD dwColor = m_pThemeData->clrSignCheck; + FX_BOOL bCheck = TRUE; + if (((dwStates & FWL_PARTSTATE_CKB_Mask1) == FWL_PARTSTATE_CKB_Disabled) && + ((dwStates & FWL_PARTSTATE_CKB_Mask2) == FWL_PARTSTATE_CKB_Checked)) { + dwColor = m_pThemeData->clrSignBorderDisable; + } else if ((dwStates & FWL_PARTSTATE_CKB_Mask2) == FWL_PARTSTATE_CKB_Neutral) { + switch (dwStates & FWL_PARTSTATE_CKB_Mask1) { + case FWL_PARTSTATE_CKB_Normal: { + bCheck = FALSE; + dwColor = m_pThemeData->clrSignNeutralNormal; + break; + } + case FWL_PARTSTATE_CKB_Hovered: { + bCheck = FALSE; + dwColor = m_pThemeData->clrSignNeutralHover; + break; + } + case FWL_PARTSTATE_CKB_Pressed: { + bCheck = FALSE, dwColor = m_pThemeData->clrSignNeutralPressed; + break; + } + case FWL_PARTSTATE_CKB_Disabled: { + bCheck = FALSE, dwColor = m_pThemeData->clrSignBorderDisable; + break; + } + } + } + if (bCheck) { + FX_DWORD dwStyle = pWidget->GetStylesEx(); + switch(dwStyle & FWL_STYLEEXT_CKB_SignShapeMask) { + case FWL_STYLEEXT_CKB_SignShapeCheck: { + DrawSignCheck(pGraphics, &rtSign, dwColor, pMatrix); + break; + } + case FWL_STYLEEXT_CKB_SignShapeCircle: { + rtSign.Deflate(1, 1); + DrawSignCircle(pGraphics, &rtSign, dwColor, pMatrix); + break; + } + case FWL_STYLEEXT_CKB_SignShapeCross: { + DrawSignCross(pGraphics, &rtSign, dwColor, pMatrix); + break; + } + case FWL_STYLEEXT_CKB_SignShapeDiamond: { + DrawSignDiamond(pGraphics, &rtSign, dwColor, pMatrix); + break; + } + case FWL_STYLEEXT_CKB_SignShapeSquare: { + DrawSignSquare(pGraphics, &rtSign, dwColor, pMatrix); + break; + } + case FWL_STYLEEXT_CKB_SignShapeStar: { + DrawSignStar(pGraphics, &rtSign, dwColor, pMatrix); + break; + } + } + } else { + FillSoildRect(pGraphics, ArgbEncode(255, 33, 161, 33), &rtSign, pMatrix); + } +} +void CFWL_CheckBoxTP::DrawSignNeutral(CFX_Graphics *pGraphics, const CFX_RectF *pRtSign, CFX_Matrix *pMatrix ) +{ + ((CFX_RectF*)pRtSign)->Inflate(-3, -3); + FillSoildRect(pGraphics, m_pThemeData->clrSignNeutral, pRtSign, pMatrix); +} +void CFWL_CheckBoxTP::DrawSignCheck(CFX_Graphics *pGraphics, const CFX_RectF *pRtSign, FX_ARGB argbFill, CFX_Matrix *pMatrix ) +{ + if (!m_pCheckPath) { + initCheckPath(pRtSign->width); + } + CFX_Matrix mt; + mt.Reset(); + mt.Translate(pRtSign->left, pRtSign->top); + mt.Concat(*pMatrix); + CFX_Color crFill(argbFill); + pGraphics->SaveGraphState(); + pGraphics->SetFillColor(&crFill); + pGraphics->FillPath(m_pCheckPath, FXFILL_WINDING, &mt); + pGraphics->RestoreGraphState(); +} +void CFWL_CheckBoxTP::DrawSignCircle(CFX_Graphics *pGraphics, const CFX_RectF *pRtSign, FX_ARGB argbFill, CFX_Matrix *pMatrix ) +{ + CFX_Path path; + path.Create(); + path.AddEllipse(*pRtSign); + CFX_Color crFill(argbFill); + pGraphics->SaveGraphState(); + pGraphics->SetFillColor(&crFill); + pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); + pGraphics->RestoreGraphState(); +} +void CFWL_CheckBoxTP::DrawSignCross(CFX_Graphics *pGraphics, const CFX_RectF *pRtSign, FX_ARGB argbFill, CFX_Matrix *pMatrix ) +{ + CFX_Path path; + path.Create(); + FX_FLOAT fRight = pRtSign->right(); + FX_FLOAT fBottom = pRtSign->bottom(); + path.AddLine(pRtSign->left, pRtSign->top, fRight, fBottom); + path.AddLine(pRtSign->left, fBottom, fRight, pRtSign->top); + CFX_Color crFill(argbFill); + pGraphics->SaveGraphState(); + pGraphics->SetStrokeColor(&crFill); + pGraphics->SetLineWidth(1.0f); + pGraphics->StrokePath(&path, pMatrix); + pGraphics->RestoreGraphState(); +} +void CFWL_CheckBoxTP::DrawSignDiamond(CFX_Graphics *pGraphics, const CFX_RectF *pRtSign, FX_ARGB argbFill, CFX_Matrix *pMatrix ) +{ + CFX_Path path; + path.Create(); + FX_FLOAT fWidth = pRtSign->width; + FX_FLOAT fHeight = pRtSign->height; + FX_FLOAT fBottom = pRtSign->bottom(); + path.MoveTo(pRtSign->left + fWidth / 2, pRtSign->top); + path.LineTo(pRtSign->left, pRtSign->top + fHeight / 2); + path.LineTo(pRtSign->left + fWidth / 2, fBottom); + path.LineTo(pRtSign->right(), pRtSign->top + fHeight / 2); + path.LineTo(pRtSign->left + fWidth / 2, pRtSign->top); + CFX_Color crFill(argbFill); + pGraphics->SaveGraphState(); + pGraphics->SetFillColor(&crFill); + pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); + pGraphics->RestoreGraphState(); +} +void CFWL_CheckBoxTP::DrawSignSquare(CFX_Graphics *pGraphics, const CFX_RectF *pRtSign, FX_ARGB argbFill, CFX_Matrix *pMatrix ) +{ + CFX_Path path; + path.Create(); + path.AddRectangle(pRtSign->left, pRtSign->top, pRtSign->width, pRtSign->height); + CFX_Color crFill(argbFill); + pGraphics->SaveGraphState(); + pGraphics->SetFillColor(&crFill); + pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); + pGraphics->RestoreGraphState(); +} +void CFWL_CheckBoxTP::DrawSignStar(CFX_Graphics *pGraphics, const CFX_RectF *pRtSign, FX_ARGB argbFill, CFX_Matrix *pMatrix ) +{ + CFX_Path path; + path.Create(); + FX_FLOAT fBottom = pRtSign->bottom(); + FX_FLOAT fRadius = (pRtSign->top - fBottom) / ( 1 + (FX_FLOAT)cos(FX_PI / 5.0f)); + CFX_PointF ptCenter; + ptCenter.Set((pRtSign->left + pRtSign->right()) / 2.0f, (pRtSign->top + fBottom) / 2.0f); + FX_FLOAT px[5], py[5]; + FX_FLOAT fAngel = FX_PI / 10.0f; + for (FX_INT32 i = 0; i < 5; i++) { + px[i] = ptCenter.x + fRadius * (FX_FLOAT)cos(fAngel); + py[i] = ptCenter.y + fRadius * (FX_FLOAT)sin(fAngel); + fAngel += FX_PI * 2 / 5.0f; + } + path.MoveTo(px[0], py[0]); + FX_INT32 nNext = 0; + for (FX_INT32 j = 0; j < 5; j++) { + nNext += 2; + if (nNext >= 5) { + nNext -= 5; + } + path.LineTo(px[nNext], py[nNext]); + } + CFX_Color crFill(argbFill); + pGraphics->SaveGraphState(); + pGraphics->SetFillColor(&crFill); + pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); + pGraphics->RestoreGraphState(); +} +void CFWL_CheckBoxTP::DrawSignBorder(IFWL_Widget *pWidget, CFX_Graphics *pGraphics, const CFX_RectF *pRtBox, FX_BOOL bDisable , CFX_Matrix *pMatrix ) +{ + switch(pWidget->GetStylesEx() & FWL_STYLEEXT_CKB_ShapeMask) { + case FWL_STYLEEXT_CKB_ShapeSolidSquare: { + DrawAnnulusRect(pGraphics, + bDisable ? m_pThemeData->clrSignBorderDisable : m_pThemeData->clrSignBorderNormal, + pRtBox, + 1, + pMatrix); + break; + } + case FWL_STYLEEXT_CKB_ShapeSunkenSquare: { + Draw3DRect(pGraphics, + FWLTHEME_EDGE_Sunken, + CHECKBOX_SIZE_SIGNBORDER, + pRtBox, + CHECKBOX_COLOR_BOXLT1, + CHECKBOX_COLOR_BOXLT2, + CHECKBOX_COLOR_BOXRB1, + CHECKBOX_COLOR_BOXRB2, + pMatrix); + break; + } + case FWL_STYLEEXT_CKB_ShapeSolidCircle: { + DrawAnnulusCircle(pGraphics, + bDisable ? m_pThemeData->clrSignBorderDisable : m_pThemeData->clrSignBorderNormal, + pRtBox, + 1, + pMatrix); + break; + } + case FWL_STYLEEXT_CKB_ShapeSunkenCircle: { + Draw3DCircle(pGraphics, + FWLTHEME_EDGE_Sunken, + CHECKBOX_SIZE_SIGNBORDER, + pRtBox, + CHECKBOX_COLOR_BOXLT1, + CHECKBOX_COLOR_BOXLT2, + CHECKBOX_COLOR_BOXRB1, + CHECKBOX_COLOR_BOXRB2, + pMatrix); + break; + } + } +} +void CFWL_CheckBoxTP::SetThemeData(FX_DWORD dwID) +{ + FX_DWORD *pData = (FX_DWORD*)&m_pThemeData->clrBoxBk; + if (dwID) { + *pData++ = 0, *pData++ = 0, \ + *pData++ = ArgbEncode(255, 220, 220, 215), *pData++ = ArgbEncode(255, 255, 255, 255), \ + *pData++ = ArgbEncode(255, 255, 240, 207), *pData++ = ArgbEncode(255, 248, 179, 48), \ + *pData++ = ArgbEncode(255, 176, 176, 167), *pData++ = ArgbEncode(255, 241, 239, 239), \ + *pData++ = ArgbEncode(255, 255, 255, 255), *pData++ = ArgbEncode(255, 255, 255, 255), \ + *pData++ = ArgbEncode(255, 220, 220, 215), *pData++ = ArgbEncode(255, 255, 255, 255), \ + *pData++ = ArgbEncode(255, 255, 240, 207), *pData++ = ArgbEncode(255, 248, 179, 48), \ + *pData++ = ArgbEncode(255, 176, 176, 167), *pData++ = ArgbEncode(255, 241, 239, 239), \ + *pData++ = ArgbEncode(255, 255, 255, 255), *pData++ = ArgbEncode(255, 255, 255, 255), \ + *pData++ = ArgbEncode(255, 220, 220, 215), *pData++ = ArgbEncode(255, 255, 255, 255), \ + *pData++ = ArgbEncode(255, 255, 240, 207), *pData++ = ArgbEncode(255, 248, 179, 48), \ + *pData++ = ArgbEncode(255, 176, 176, 167), *pData++ = ArgbEncode(255, 241, 239, 239), \ + *pData++ = ArgbEncode(255, 255, 255, 255), *pData++ = ArgbEncode(255, 255, 255, 255); + m_pThemeData->clrSignBorderNormal = ArgbEncode(255, 154, 167, 114); + m_pThemeData->clrSignBorderDisable = ArgbEncode(255, 202, 200, 187); + m_pThemeData->clrSignCheck = ArgbEncode(255, 164, 180, 138); + m_pThemeData->clrSignNeutral = ArgbEncode(2255, 28, 134, 26); + m_pThemeData->clrSignNeutralNormal = ArgbEncode(255, 114, 192, 113); + m_pThemeData->clrSignNeutralHover = ArgbEncode(255, 33, 161, 33); + m_pThemeData->clrSignNeutralPressed = ArgbEncode(255, 28, 134, 26); + } else { + *pData++ = 0, *pData++ = 0, \ + *pData++ = ArgbEncode(255, 220, 220, 215), *pData++ = ArgbEncode(255, 255, 255, 255), \ + *pData++ = ArgbEncode(255, 255, 240, 207), *pData++ = ArgbEncode(255, 248, 179, 48), \ + *pData++ = ArgbEncode(255, 176, 176, 167), *pData++ = ArgbEncode(255, 241, 239, 239), \ + *pData++ = ArgbEncode(255, 255, 255, 255), *pData++ = ArgbEncode(255, 255, 255, 255), \ + *pData++ = ArgbEncode(255, 220, 220, 215), *pData++ = ArgbEncode(255, 255, 255, 255), \ + *pData++ = ArgbEncode(255, 255, 240, 207), *pData++ = ArgbEncode(255, 248, 179, 48), \ + *pData++ = ArgbEncode(255, 176, 176, 167), *pData++ = ArgbEncode(255, 241, 239, 239), \ + *pData++ = ArgbEncode(255, 255, 255, 255), *pData++ = ArgbEncode(255, 255, 255, 255), \ + *pData++ = ArgbEncode(255, 220, 220, 215), *pData++ = ArgbEncode(255, 255, 255, 255), \ + *pData++ = ArgbEncode(255, 255, 240, 207), *pData++ = ArgbEncode(255, 248, 179, 48), \ + *pData++ = ArgbEncode(255, 176, 176, 167), *pData++ = ArgbEncode(255, 241, 239, 239), \ + *pData++ = ArgbEncode(255, 255, 255, 255), *pData++ = ArgbEncode(255, 255, 255, 255); + m_pThemeData->clrSignBorderNormal = ArgbEncode(255, 28, 81, 128); + m_pThemeData->clrSignBorderDisable = ArgbEncode(255, 202, 200, 187); + m_pThemeData->clrSignCheck = ArgbEncode(255, 28, 81, 128); + m_pThemeData->clrSignNeutral = ArgbEncode(255, 28, 134, 26); + m_pThemeData->clrSignNeutralNormal = ArgbEncode(255, 114, 192, 113); + m_pThemeData->clrSignNeutralHover = ArgbEncode(255, 33, 161, 33); + m_pThemeData->clrSignNeutralPressed = ArgbEncode(255, 28, 134, 26); + } +} +void CFWL_CheckBoxTP::initCheckPath(FX_FLOAT fCheckLen) +{ + if (!m_pCheckPath) { + m_pCheckPath = FX_NEW CFX_Path; + m_pCheckPath->Create(); + FX_FLOAT fWidth = CHECKBOX_SIZE_SIGNPATH; + FX_FLOAT fHeight = -CHECKBOX_SIZE_SIGNPATH; + FX_FLOAT fBottom = CHECKBOX_SIZE_SIGNPATH; + FX_FLOAT px1, py1, px2, py2; + CFX_PointF pt1; + pt1.Set(fWidth / 15.0f, fBottom + fHeight * 2 / 5.0f); + CFX_PointF pt2; + pt2.Set(fWidth / 4.5f, fBottom + fHeight / 16.0f); + CFX_PointF pt3; + pt3.Set(fWidth / 3.0f, fBottom); + CFX_PointF pt4; + pt4.Set(fWidth * 14 / 15.0f, fBottom + fHeight * 15 / 16.0f); + CFX_PointF pt5; + pt5.Set(fWidth / 3.6f, fBottom + fHeight / 3.5f); + CFX_PointF pt12; + pt12.Set(fWidth / 7.0f, fBottom + fHeight * 2 / 7.0f); + CFX_PointF pt21; + pt21.Set(fWidth / 5.0f, fBottom + fHeight / 5.0f); + CFX_PointF pt23; + pt23.Set(fWidth / 4.4f, fBottom + fHeight * 0 / 16.0f); + CFX_PointF pt32; + pt32.Set(fWidth / 4.0f, fBottom); + CFX_PointF pt34; + pt34.Set(fWidth * (1 / 7.0f + 7 / 15.0f), fBottom + fHeight * 4 / 5.0f); + CFX_PointF pt43; + pt43.Set(fWidth * (1 / 7.0f + 7 / 15.0f), fBottom + fHeight * 4 / 5.0f); + CFX_PointF pt45; + pt45.Set(fWidth * 7 / 15.0f, fBottom + fHeight * 8 / 7.0f); + CFX_PointF pt54; + pt54.Set(fWidth / 3.4f, fBottom + fHeight / 3.5f); + CFX_PointF pt51; + pt51.Set(fWidth / 3.6f, fBottom + fHeight / 4.0f); + CFX_PointF pt15; + pt15.Set(fWidth / 3.5f, fBottom + fHeight * 3.5f / 5.0f); + m_pCheckPath->MoveTo(pt1.x, pt1.y); + px1 = pt12.x - pt1.x; + py1 = pt12.y - pt1.y; + px2 = pt21.x - pt2.x; + py2 = pt21.y - pt2.y; + m_pCheckPath->BezierTo(pt1.x + px1 * FWLTHEME_BEZIER, pt1.y + py1 * FWLTHEME_BEZIER, + pt2.x + px2 * FWLTHEME_BEZIER, pt2.y + py2 * FWLTHEME_BEZIER, + pt2.x, pt2.y); + px1 = pt23.x - pt2.x; + py1 = pt23.y - pt2.y; + px2 = pt32.x - pt3.x; + py2 = pt32.y - pt3.y; + m_pCheckPath->BezierTo(pt2.x + px1 * FWLTHEME_BEZIER, pt2.y + py1 * FWLTHEME_BEZIER, + pt3.x + px2 * FWLTHEME_BEZIER, pt3.y + py2 * FWLTHEME_BEZIER, + pt3.x, pt3.y); + px1 = pt34.x - pt3.x; + py1 = pt34.y - pt3.y; + px2 = pt43.x - pt4.x; + py2 = pt43.y - pt4.y; + m_pCheckPath->BezierTo(pt3.x + px1 * FWLTHEME_BEZIER, pt3.y + py1 * FWLTHEME_BEZIER, + pt4.x + px2 * FWLTHEME_BEZIER, pt4.y + py2 * FWLTHEME_BEZIER, + pt4.x, pt4.y); + px1 = pt45.x - pt4.x; + py1 = pt45.y - pt4.y; + px2 = pt54.x - pt5.x; + py2 = pt54.y - pt5.y; + m_pCheckPath->BezierTo(pt4.x + px1 * FWLTHEME_BEZIER, pt4.y + py1 * FWLTHEME_BEZIER, + pt5.x + px2 * FWLTHEME_BEZIER, pt5.y + py2 * FWLTHEME_BEZIER, + pt5.x, pt5.y); + px1 = pt51.x - pt5.x; + py1 = pt51.y - pt5.y; + px2 = pt15.x - pt1.x; + py2 = pt15.y - pt1.y; + m_pCheckPath->BezierTo(pt5.x + px1 * FWLTHEME_BEZIER, pt5.y + py1 * FWLTHEME_BEZIER, + pt1.x + px2 * FWLTHEME_BEZIER, pt1.y + py2 * FWLTHEME_BEZIER, + pt1.x, pt1.y); + FX_FLOAT fScale = fCheckLen / CHECKBOX_SIZE_SIGNPATH; + CFX_AffineMatrix mt; + mt.Set(1, 0, 0, 1, 0, 0); + mt.Scale(fScale, fScale); + CFX_PathData *pData = m_pCheckPath->GetPathData(); + pData->Transform(&mt); + } +} diff --git a/xfa/src/fwl/src/theme/comboboxtp.cpp b/xfa/src/fwl/src/theme/comboboxtp.cpp new file mode 100644 index 0000000000..c7218955c9 --- /dev/null +++ b/xfa/src/fwl/src/theme/comboboxtp.cpp @@ -0,0 +1,147 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#define FWLTHEME_CAPACITY_ComboFormHandler 8.0f +CFWL_ComboBoxTP::CFWL_ComboBoxTP() +{ + m_dwThemeID = 0; +} +CFWL_ComboBoxTP::~CFWL_ComboBoxTP() +{ +} +FX_BOOL CFWL_ComboBoxTP::IsValidWidget(IFWL_Widget *pWidget) +{ + _FWL_RETURN_VALUE_IF_FAIL(pWidget, FALSE); + return pWidget->GetClassID() == FWL_CLASSHASH_ComboBox; +} +FX_BOOL CFWL_ComboBoxTP::DrawBackground(CFWL_ThemeBackground *pParams) +{ + _FWL_RETURN_VALUE_IF_FAIL(pParams, FALSE); + switch(pParams->m_iPart) { + case FWL_PART_CMB_Border: { + DrawBorder(pParams->m_pGraphics, &pParams->m_rtPart, &pParams->m_matrix); + break; + } + case FWL_PART_CMB_Edge: { + DrawEdge(pParams->m_pGraphics, pParams->m_pWidget->GetStyles(), &pParams->m_rtPart, &pParams->m_matrix); + break; + } + case FWL_PART_CMB_Background: { + CFX_Path path; + path.Create(); + CFX_RectF & rect = pParams->m_rtPart; + path.AddRectangle(rect.left, rect.top, rect.width, rect.height); + CFX_Color cr; + switch(pParams->m_dwStates) { + case FWL_PARTSTATE_CMB_Selected: + cr = FWLTHEME_COLOR_BKSelected; + break; + case FWL_PARTSTATE_CMB_Disabled: + cr = FWLTHEME_COLOR_EDGERB1; + break; + default: + cr = 0xFFFFFFFF; + } + pParams->m_pGraphics->SaveGraphState(); + pParams->m_pGraphics->SetFillColor(&cr); + pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, &pParams->m_matrix); + pParams->m_pGraphics->RestoreGraphState(); + break; + } + case FWL_PART_CMB_DropDownButton: { + DrawDropDownButton(pParams, pParams->m_dwStates, &pParams->m_matrix); + break; + } + case FWL_PART_CMB_StretcgHandler: { + DrawStrethHandler(pParams, 0, &pParams->m_matrix); + break; + } + default: { + return FALSE; + } + } + return TRUE; +} +void CFWL_ComboBoxTP::DrawStrethHandler(CFWL_ThemeBackground *pParams, FX_DWORD dwStates, CFX_Matrix *pMatrix) +{ + CFX_Path path; + path.Create(); + path.AddRectangle(pParams->m_rtPart.left, + pParams->m_rtPart.top, + pParams->m_rtPart.width - 1, + pParams->m_rtPart.height); + CFX_Color cr(ArgbEncode(0xff, 0xff, 0, 0)); + pParams->m_pGraphics->SetFillColor(&cr); + pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, &pParams->m_matrix); +} +FX_LPVOID CFWL_ComboBoxTP::GetCapacity(CFWL_ThemePart *pThemePart, FX_DWORD dwCapacity) +{ + if (dwCapacity == FWL_WGTCAPACITY_CMB_ComboFormHandler) { + m_fValue = FWLTHEME_CAPACITY_ComboFormHandler; + return &m_fValue; + } + return CFWL_WidgetTP::GetCapacity(pThemePart, dwCapacity); +} +#ifdef THEME_XPSimilar +void CFWL_ComboBoxTP::DrawDropDownButton(CFWL_ThemeBackground *pParams, FX_DWORD dwStates, CFX_Matrix *pMatrix) +{ + FWLTHEME_STATE eState = FWLTHEME_STATE_Normal; + switch ( dwStates) { + case FWL_PARTSTATE_CMB_Normal: { + eState = FWLTHEME_STATE_Normal; + break; + } + case FWL_PARTSTATE_CMB_Hovered: { + eState = FWLTHEME_STATE_Hover; + break; + } + case FWL_PARTSTATE_CMB_Pressed: { + eState = FWLTHEME_STATE_Pressed; + break; + } + case FWL_PARTSTATE_CMB_Disabled: { + eState = FWLTHEME_STATE_Disabale; + break; + } + default: { + } + } + DrawArrowBtn(pParams->m_pGraphics, &pParams->m_rtPart, FWLTHEME_DIRECTION_Down, eState, &pParams->m_matrix); +} +#else +void CFWL_ComboBoxTP::DrawDropDownButton(CFWL_ThemeBackground *pParams, FX_DWORD dwStates, CFX_Matrix *pMatrix) +{ + FX_BOOL bPressed = ((pParams->m_dwStates & FWL_CMBPARTSTATE_Pressed) == FWL_CMBPARTSTATE_Pressed); + FX_FLOAT fWidth = bPressed ? 1.0f : 2.0f; + FWLTHEME_EDGE eType = bPressed ? FWLTHEME_EDGE_Flat : FWLTHEME_EDGE_Raised; + Draw3DRect(pParams->m_pGraphics, eType, fWidth, &pParams->m_rtPart, FWLTHEME_COLOR_EDGELT1, FWLTHEME_COLOR_EDGELT2, FWLTHEME_COLOR_EDGERB1, FWLTHEME_COLOR_EDGERB2, pMatrix); + CFX_Path path; + path.Create(); + path.AddRectangle(pParams->m_rtPart.left + fWidth, pParams->m_rtPart.top + fWidth, pParams->m_rtPart.width - 2 * fWidth, pParams->m_rtPart.height - 2 * fWidth); + pParams->m_pGraphics->SaveGraphState(); + CFX_Color crFill(FWLTHEME_COLOR_Background); + pParams->m_pGraphics->SetFillColor(&crFill); + pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, &pParams->m_matrix); + pParams->m_pGraphics->RestoreGraphState(); + FX_ARGB argbFill = ArgbEncode(255, 77, 97, 133); + switch(pParams->m_dwStates & 0x03) { + case FWL_CMBPARTSTATE_Normal: { + } + case FWL_CMBPARTSTATE_Hovered: { + } + case FWL_CMBPARTSTATE_Pressed: { + argbFill = 0xFF000000; + break; + } + case FWL_CMBPARTSTATE_Disabled: { + argbFill = 0xFFF0F0F0; + break; + } + } + DrawArrow(pParams->m_pGraphics, &pParams->m_rtPart, FWLTHEME_DIRECTION_Down, argbFill, bPressed, &pParams->m_matrix); +} +#endif diff --git a/xfa/src/fwl/src/theme/datetimepickertp.cpp b/xfa/src/fwl/src/theme/datetimepickertp.cpp new file mode 100644 index 0000000000..bc94ee9db1 --- /dev/null +++ b/xfa/src/fwl/src/theme/datetimepickertp.cpp @@ -0,0 +1,120 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +CFWL_DateTimePickerTP::CFWL_DateTimePickerTP() +{ + m_pThemeData = FX_NEW DTPThemeData; + initThemeData(); +} +CFWL_DateTimePickerTP::~CFWL_DateTimePickerTP() +{ + delete m_pThemeData; +} +FX_BOOL CFWL_DateTimePickerTP::IsValidWidget(IFWL_Widget *pWidget) +{ + _FWL_RETURN_VALUE_IF_FAIL(pWidget, FALSE); + return pWidget->GetClassID() == FWL_CLASSHASH_DateTimePicker; +} +FX_BOOL CFWL_DateTimePickerTP::DrawBackground(CFWL_ThemeBackground *pParams) +{ + _FWL_RETURN_VALUE_IF_FAIL(pParams, FALSE); + switch(pParams->m_iPart) { + case FWL_PART_DTP_Border: { + DrawBorder(pParams->m_pGraphics, &pParams->m_rtPart, &pParams->m_matrix); + break; + } + case FWL_PART_DTP_Edge: { + DrawEdge(pParams->m_pGraphics, pParams->m_pWidget->GetStyles(), &pParams->m_rtPart, &pParams->m_matrix); + break; + } + case FWL_PART_DTP_DropDownButton: { + DrawDropDownButton(pParams, &pParams->m_matrix); + break; + } + default: { + } + } + return TRUE; +} +#ifdef THEME_XPSimilar +void CFWL_DateTimePickerTP::DrawDropDownButton(CFWL_ThemeBackground *pParams, CFX_Matrix *pMatrix) +{ + FX_DWORD dwStates = pParams->m_dwStates; + dwStates &= 0x03; + FWLTHEME_STATE eState = FWLTHEME_STATE_Normal; + switch (eState & dwStates) { + case FWL_PARTSTATE_DTP_Normal: { + eState = FWLTHEME_STATE_Normal; + break; + } + case FWL_PARTSTATE_DTP_Hovered: { + eState = FWLTHEME_STATE_Hover; + break; + } + case FWL_PARTSTATE_DTP_Pressed: { + eState = FWLTHEME_STATE_Pressed; + break; + } + case FWL_PARTSTATE_DTP_Disabled: { + eState = FWLTHEME_STATE_Disabale; + break; + } + default: { + } + } + DrawArrowBtn(pParams->m_pGraphics, &pParams->m_rtPart, FWLTHEME_DIRECTION_Down, eState, pMatrix); +} +#else +void CFWL_DateTimePickerTP::DrawDropDownButton(CFWL_ThemeBackground *pParams, CFX_Matrix *pMatrix) +{ + FX_BOOL bPressed = ((pParams->m_dwStates & FWL_PARTSTATE_DTP_Pressed) == FWL_PARTSTATE_DTP_Pressed); + FX_FLOAT fWidth = bPressed ? 1.0f : 2.0f; + FWLTHEME_EDGE eType = bPressed ? FWLTHEME_EDGE_Flat : FWLTHEME_EDGE_Raised; + Draw3DRect(pParams->m_pGraphics, eType, fWidth, &pParams->m_rtPart, FWLTHEME_COLOR_EDGELT1, FWLTHEME_COLOR_EDGELT2, FWLTHEME_COLOR_EDGERB1, FWLTHEME_COLOR_EDGERB2, pMatrix); + CFX_Path path; + path.Create(); + path.AddRectangle(pParams->m_rtPart.left + fWidth, pParams->m_rtPart.top + fWidth, pParams->m_rtPart.width - 2 * fWidth, pParams->m_rtPart.height - 2 * fWidth); + pParams->m_pGraphics->SaveGraphState(); + CFX_Color crFill(FWLTHEME_COLOR_Background); + pParams->m_pGraphics->SetFillColor(&crFill); + pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); + pParams->m_pGraphics->RestoreGraphState(); + FX_ARGB argbFill = ArgbEncode(255, 77, 97, 133); + switch(pParams->m_dwStates & 0x03) { + case FWL_PARTSTATE_DTP_Normal: { + } + case FWL_PARTSTATE_DTP_Hovered: { + } + case FWL_PARTSTATE_DTP_Pressed: { + argbFill = 0xFF000000; + break; + } + case FWL_PARTSTATE_DTP_Disabled: { + argbFill = 0xFFF0F0F0; + break; + } + } + DrawArrow(pParams->m_pGraphics, &pParams->m_rtPart, FWLTHEME_DIRECTION_Down, argbFill, bPressed, pMatrix); +} +#endif +void CFWL_DateTimePickerTP::initThemeData() +{ + FX_DWORD *pData = (FX_DWORD*)&m_pThemeData->BoxBkColor; + *pData++ = 0, *pData++ = 0, \ + *pData++ = ArgbEncode(255, 220, 220, 215), *pData++ = ArgbEncode(255, 255, 255, 255), \ + *pData++ = ArgbEncode(255, 255, 240, 207), *pData++ = ArgbEncode(255, 248, 179, 48), \ + *pData++ = ArgbEncode(255, 176, 176, 167), *pData++ = ArgbEncode(255, 241, 239, 239), \ + *pData++ = ArgbEncode(255, 255, 255, 255), *pData++ = ArgbEncode(255, 255, 255, 255), \ + *pData++ = ArgbEncode(255, 220, 220, 215), *pData++ = ArgbEncode(255, 255, 255, 255), \ + *pData++ = ArgbEncode(255, 255, 240, 207), *pData++ = ArgbEncode(255, 248, 179, 48), \ + *pData++ = ArgbEncode(255, 176, 176, 167), *pData++ = ArgbEncode(255, 241, 239, 239), \ + *pData++ = ArgbEncode(255, 255, 255, 255), *pData++ = ArgbEncode(255, 255, 255, 255), \ + *pData++ = ArgbEncode(255, 220, 220, 215), *pData++ = ArgbEncode(255, 255, 255, 255), \ + *pData++ = ArgbEncode(255, 255, 240, 207), *pData++ = ArgbEncode(255, 248, 179, 48), \ + *pData++ = ArgbEncode(255, 176, 176, 167), *pData++ = ArgbEncode(255, 241, 239, 239), \ + *pData++ = ArgbEncode(255, 255, 255, 255), *pData++ = ArgbEncode(255, 255, 255, 255); +} diff --git a/xfa/src/fwl/src/theme/edittp.cpp b/xfa/src/fwl/src/theme/edittp.cpp new file mode 100644 index 0000000000..57a96bcb50 --- /dev/null +++ b/xfa/src/fwl/src/theme/edittp.cpp @@ -0,0 +1,84 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +CFWL_EditTP::CFWL_EditTP() +{ +} +CFWL_EditTP::~CFWL_EditTP() +{ +} +FX_BOOL CFWL_EditTP::IsValidWidget(IFWL_Widget *pWidget) +{ + _FWL_RETURN_VALUE_IF_FAIL(pWidget, FALSE); + return pWidget->GetClassID() == FWL_CLASSHASH_Edit; +} +FX_BOOL CFWL_EditTP::DrawBackground(CFWL_ThemeBackground *pParams) +{ + switch(pParams->m_iPart) { + case FWL_PART_EDT_Border: { + DrawBorder(pParams->m_pGraphics, & pParams->m_rtPart, &pParams->m_matrix); + break; + } + case FWL_PART_EDT_Edge: { + DrawEdge(pParams->m_pGraphics, pParams->m_pWidget->GetStyles(), &pParams->m_rtPart, &pParams->m_matrix); + break; + } + case FWL_PART_EDT_Background: { + if (pParams->m_pPath) { + CFX_Graphics *pGraphics = pParams->m_pGraphics; + pGraphics->SaveGraphState(); + CFX_Color crSelected(FWL_GetThemeColor(m_dwThemeID) == 0 ? FWLTHEME_COLOR_BKSelected : FWLTHEME_COLOR_Green_BKSelected); + pGraphics->SetFillColor(&crSelected); + pGraphics->FillPath(pParams->m_pPath, FXFILL_WINDING, &pParams->m_matrix); + pGraphics->RestoreGraphState(); + } else { + FX_BOOL bStatic = pParams->m_dwData == FWL_PARTDATA_EDT_StaticBackground; + CFX_Path path; + path.Create(); + path.AddRectangle(pParams->m_rtPart.left, pParams->m_rtPart.top, pParams->m_rtPart.width, pParams->m_rtPart.height); + CFX_Color cr(FWLTHEME_COLOR_Background); + if (!bStatic) { + if ((pParams->m_dwStates & FWL_PARTSTATE_EDT_Disable) == FWL_PARTSTATE_EDT_Disable) { + cr.Set(FWLTHEME_COLOR_EDGERB1); + } else if((pParams->m_dwStates & FWL_PARTSTATE_EDT_ReadOnly) == FWL_PARTSTATE_EDT_ReadOnly) { + cr.Set(ArgbEncode(255, 236, 233, 216)); + } else { + cr.Set(0xFFFFFFFF); + } + } + pParams->m_pGraphics->SaveGraphState(); + pParams->m_pGraphics->SetFillColor(&cr); + pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, &pParams->m_matrix); + pParams->m_pGraphics->RestoreGraphState(); + } + break; + } + case FWL_PART_EDT_CombTextLine: { + FX_ARGB cr = 0xFF000000; + FX_FLOAT fWidth = 1.0f; + CFX_Color crLine(cr); + pParams->m_pGraphics->SetStrokeColor(&crLine); + pParams->m_pGraphics->SetLineWidth(fWidth); + pParams->m_pGraphics->StrokePath(pParams->m_pPath, &pParams->m_matrix); + break; + } + default: { + break; + } + } + return TRUE; +} +FWL_ERR CFWL_EditTP::Initialize() +{ + InitTTO(); + return CFWL_WidgetTP::Initialize(); +} +FWL_ERR CFWL_EditTP::Finalize() +{ + FinalizeTTO(); + return CFWL_WidgetTP::Finalize(); +} diff --git a/xfa/src/fwl/src/theme/formtp.cpp b/xfa/src/fwl/src/theme/formtp.cpp new file mode 100644 index 0000000000..5a6633d3ea --- /dev/null +++ b/xfa/src/fwl/src/theme/formtp.cpp @@ -0,0 +1,796 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#define FWLTHEME_CAPACITY_CXFormBorder 3 +#define FWLTHEME_CAPACITY_CYFormBorder 3 +#define FWLTHEME_CAPACITY_CYNarrowCaption 18 +#define FWLTHEME_CAPACITY_CYCaption 29 +#define FWLTHEME_CAPACITY_BigIconSize 32 +#define FWLTHEME_CAPACITY_SmallIconSize 16 +#define FWLTHEME_CAPACITY_FormTextColor 0xFFFFFFFF +#define FWLTHEME_FORMBTN_Margin 5 +#define FWLTHEME_FORMBTN_Span 2 +#define FWLTHEME_FORMBTN_Size 21 +CFWL_FormTP::CFWL_FormTP() + : m_pActiveBitmap(NULL) + , m_pDeactivebitmap(NULL) +{ + m_pThemeData = FX_NEW SBThemeData; + SetThemeData(0); + m_rtDisLBorder.Reset(); + m_rtDisRBorder.Reset(); + m_rtDisBBorder.Reset(); + m_rtDisCaption.Reset(); +} +CFWL_FormTP::~CFWL_FormTP() +{ + if (m_pThemeData) { + delete m_pThemeData; + m_pThemeData = NULL; + } +} +FWL_ERR CFWL_FormTP::Initialize() +{ + InitTTO(); + InitCaption(TRUE); + InitCaption(FALSE); + return CFWL_WidgetTP::Initialize(); +} +FWL_ERR CFWL_FormTP::Finalize() +{ + FinalizeTTO(); + if (m_pActiveBitmap) { + delete m_pActiveBitmap; + m_pActiveBitmap = NULL; + } + if (m_pDeactivebitmap) { + delete m_pDeactivebitmap; + m_pDeactivebitmap = NULL; + } + return CFWL_WidgetTP::Finalize(); +} +FX_BOOL CFWL_FormTP::IsValidWidget(IFWL_Widget *pWidget) +{ + _FWL_RETURN_VALUE_IF_FAIL(pWidget, FALSE); + FX_DWORD dwHash = pWidget->GetClassID(); + return dwHash == FWL_CLASSHASH_Form; +} +FX_DWORD CFWL_FormTP::SetThemeID(IFWL_Widget *pWidget, FX_DWORD dwThemeID, FX_BOOL bChildren ) +{ + if (m_pThemeData) { + SetThemeData(FWL_GetThemeColor(dwThemeID)); + } + InitCaption(TRUE); + InitCaption(FALSE); + return CFWL_WidgetTP::SetThemeID(pWidget, dwThemeID, bChildren); +} +FX_BOOL CFWL_FormTP::DrawBackground(CFWL_ThemeBackground *pParams) +{ + _FWL_RETURN_VALUE_IF_FAIL(pParams, FALSE); + FX_INT32 iActive = 0; + if (pParams->m_dwStates & FWL_PARTSTATE_FRM_Inactive) { + iActive = 1; + } + FWLTHEME_STATE eState = FWLTHEME_STATE_Normal; + switch (pParams->m_dwStates & 0x03) { + case FWL_PARTSTATE_FRM_Hover: { + eState = FWLTHEME_STATE_Hover; + break; + } + case FWL_PARTSTATE_FRM_Pressed: { + eState = FWLTHEME_STATE_Pressed; + break; + } + case FWL_PARTSTATE_FRM_Disabled: { + eState = FWLTHEME_STATE_Disabale; + break; + } + default: { + } + } + switch(pParams->m_iPart) { + case FWL_PART_FRM_Border: { + DrawFormBorder(pParams->m_pGraphics, &pParams->m_rtPart, eState, &pParams->m_matrix, iActive); + break; + } + case FWL_PART_FRM_Edge: { + DrawEdge(pParams->m_pGraphics, pParams->m_pWidget->GetStyles(), &pParams->m_rtPart, &pParams->m_matrix); + break; + } + case FWL_PART_FRM_Background: { + FillBackground(pParams->m_pGraphics, &pParams->m_rtPart, &pParams->m_matrix); + break; + } + case FWL_PART_FRM_Caption: { + DrawCaption(pParams->m_pGraphics, &pParams->m_rtPart, eState, &pParams->m_matrix, iActive); + break; + } + case FWL_PART_FRM_NarrowCaption: { + DrawNarrowCaption(pParams->m_pGraphics, &pParams->m_rtPart, eState, &pParams->m_matrix, iActive); + break; + } + case FWL_PART_FRM_CloseBox: { + DrawCloseBox(pParams->m_pGraphics, &pParams->m_rtPart, eState, &pParams->m_matrix, iActive); + break; + } + case FWL_PART_FRM_MinimizeBox: { + DrawMinimizeBox(pParams->m_pGraphics, &pParams->m_rtPart, eState, &pParams->m_matrix, iActive); + break; + } + case FWL_PART_FRM_MaximizeBox: { + DrawMaximizeBox(pParams->m_pGraphics, &pParams->m_rtPart, eState, pParams->m_dwData, &pParams->m_matrix, iActive); + break; + } + case FWL_PART_FRM_Icon: { + DrawIconImage(pParams->m_pGraphics, pParams->m_pImage, &pParams->m_rtPart, eState, &pParams->m_matrix, iActive); + break; + } + default: { + } + } + return TRUE; +} +FX_BOOL CFWL_FormTP::DrawText(CFWL_ThemeText *pParams) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pTextOut, FALSE); + if (pParams->m_iPart == FWL_PART_FRM_Caption) { + m_pTextOut->SetTextColor(0xFFFFFFFF); + } else { + m_pTextOut->SetTextColor(0xFF000000); + } + return CFWL_WidgetTP::DrawText(pParams); +} +FX_LPVOID CFWL_FormTP::GetCapacity(CFWL_ThemePart *pThemePart, FX_DWORD dwCapacity) +{ + FX_BOOL bDefPro = FALSE; + FX_BOOL bDwordVal = FALSE; + switch(dwCapacity) { + case FWL_WGTCAPACITY_CXBorder: { + m_fValue = FWLTHEME_CAPACITY_CXFormBorder; + break; + } + case FWL_WGTCAPACITY_CYBorder: { + m_fValue = FWLTHEME_CAPACITY_CYFormBorder; + break; + } + case FWL_WGTCAPACITY_FRM_CYCaption: { + m_fValue = FWLTHEME_CAPACITY_CYCaption; + break; + } + case FWL_WGTCAPACITY_FRM_CYNarrowCaption: { + m_fValue = FWLTHEME_CAPACITY_CYCaption; + break; + } + case FWL_WGTCAPACITY_TextColor: { + bDwordVal = TRUE; + m_dwValue = FWLTHEME_CAPACITY_FormTextColor; + break; + } + case FWL_WGTCAPACITY_FRM_BigIcon: { + m_fValue = FWLTHEME_CAPACITY_BigIconSize; + break; + } + case FWL_WGTCAPACITY_FRM_SmallIcon: { + m_fValue = FWLTHEME_CAPACITY_SmallIconSize; + break; + } + default: { + bDefPro = TRUE; + } + } + if (!bDefPro) { + if (bDwordVal) { + return &m_dwValue; + } + return &m_fValue; + } + return CFWL_WidgetTP::GetCapacity(pThemePart, dwCapacity); +} +FWL_ERR CFWL_FormTP::GetPartRect(CFWL_ThemePart *pThemePart, CFX_RectF& rtPart) +{ + switch(pThemePart->m_iPart) { + case FWL_PART_FRM_CloseBox: { + CalCloseBox(pThemePart->m_pWidget, rtPart); + break; + } + case FWL_PART_FRM_MaximizeBox: { + CalMaxBox(pThemePart->m_pWidget, rtPart); + break; + } + case FWL_PART_FRM_MinimizeBox: { + CalMinBox(pThemePart->m_pWidget, rtPart); + break; + } + case FWL_PART_FRM_HeadText: { + CalCaption(pThemePart->m_pWidget, rtPart); + break; + } + case FWL_PART_FRM_Icon: { + CalIcon(pThemePart->m_pWidget, rtPart); + break; + } + default: { + } + } + return FWL_ERR_Succeeded; +} +void CFWL_FormTP::CalCloseBox(IFWL_Widget *pWidget, CFX_RectF &rect) +{ + FX_DWORD dwStyles = pWidget->GetStyles(); + CFX_RectF rtWidget; + pWidget->GetWidgetRect(rtWidget); + rtWidget.Offset(-rtWidget.left, -rtWidget.top); + if (dwStyles & FWL_WGTSTYLE_CloseBox) { + rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin + FWLTHEME_FORMBTN_Span, + rtWidget.top + FWLTHEME_FORMBTN_Margin, + FWLTHEME_FORMBTN_Size, + FWLTHEME_FORMBTN_Size); + } else { + rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin + FWLTHEME_FORMBTN_Span, + rtWidget.top + FWLTHEME_FORMBTN_Margin, + 0, + 0); + } +} +void CFWL_FormTP::CalMaxBox(IFWL_Widget *pWidget, CFX_RectF &rect) +{ + FX_DWORD dwStyles = pWidget->GetStyles(); + CFX_RectF rtWidget; + pWidget->GetWidgetRect(rtWidget); + rtWidget.Offset(-rtWidget.left, -rtWidget.top); + if (dwStyles & FWL_WGTSTYLE_MaximizeBox) { + rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin + FWLTHEME_FORMBTN_Size + FWLTHEME_FORMBTN_Span * 2, + rtWidget.top + FWLTHEME_FORMBTN_Margin, + FWLTHEME_FORMBTN_Size, + FWLTHEME_FORMBTN_Size); + } else { + rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin + FWLTHEME_FORMBTN_Size + FWLTHEME_FORMBTN_Span * 2, + rtWidget.top + FWLTHEME_FORMBTN_Margin, + 0, + 0); + } +} +void CFWL_FormTP::CalMinBox(IFWL_Widget *pWidget, CFX_RectF &rect) +{ + FX_DWORD dwStyles = pWidget->GetStyles(); + CFX_RectF rtWidget; + pWidget->GetWidgetRect(rtWidget); + rtWidget.Offset(-rtWidget.left, -rtWidget.top); + if (dwStyles & FWL_WGTSTYLE_MinimizeBox) { + rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin + FWLTHEME_FORMBTN_Size * 2 + FWLTHEME_FORMBTN_Span * 3, + rtWidget.top + FWLTHEME_FORMBTN_Margin, + FWLTHEME_FORMBTN_Size, + FWLTHEME_FORMBTN_Size); + } else { + rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin + FWLTHEME_FORMBTN_Size * 2 + FWLTHEME_FORMBTN_Span * 3, + rtWidget.top + FWLTHEME_FORMBTN_Margin, + 0, + 0); + } +} +void CFWL_FormTP::CalCaption(IFWL_Widget *pWidget, CFX_RectF &rect) +{ + CFX_RectF rtWidget; + pWidget->GetWidgetRect(rtWidget); + rtWidget.Offset(-rtWidget.left, -rtWidget.top); + rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin, + rtWidget.top + FWLTHEME_FORMBTN_Margin - 2, + rtWidget.width - FWLTHEME_FORMBTN_Margin * 2, + FWLTHEME_FORMBTN_Size + 2 * FWLTHEME_FORMBTN_Margin + 4); +} +void CFWL_FormTP::CalIcon(IFWL_Widget *pWidget, CFX_RectF &rect) +{ +} +void CFWL_FormTP::DrawFormBorder(CFX_Graphics *pGraphics, const CFX_RectF *pRect, FWLTHEME_STATE eState, CFX_Matrix *pMatrix, FX_INT32 iActive) +{ + CFX_RectF rt; + rt.Set(pRect->left, pRect->top, 1, pRect->height); + FX_FLOAT fBottom, fRight; + fBottom = pRect->bottom(); + fRight = pRect->right(); + CFX_Path path; + path.Create(); + CFX_Color clrLine; + path.Clear(); + path.MoveTo(pRect->left, pRect->top); + path.LineTo(pRect->left, fBottom - 1); + path.LineTo(fRight - 1, fBottom - 1); + path.LineTo(fRight - 1, pRect->top); + clrLine = m_pThemeData->clrFormBorder[iActive][2]; + pGraphics->SetStrokeColor(&clrLine); + pGraphics->StrokePath(&path, pMatrix); + path.Clear(); + path.MoveTo(pRect->left + 1, pRect->top); + path.LineTo(pRect->left + 1, fBottom - 2); + path.LineTo(fRight - 2, fBottom - 2); + path.LineTo(fRight - 2, pRect->top); + clrLine = m_pThemeData->clrFormBorder[iActive][1]; + pGraphics->SetStrokeColor(&clrLine); + pGraphics->StrokePath(&path, pMatrix); + path.Clear(); + path.MoveTo(pRect->left + 2, pRect->top); + path.LineTo(pRect->left + 2, fBottom - 3); + path.LineTo(fRight - 3, fBottom - 3); + path.LineTo(fRight - 3, pRect->top); + clrLine = m_pThemeData->clrFormBorder[iActive][0]; + pGraphics->SetStrokeColor(&clrLine); + pGraphics->StrokePath(&path, pMatrix); + path.Clear(); + path.MoveTo(pRect->left + 3, pRect->top); + path.LineTo(pRect->left + 3, fBottom - 4); + path.LineTo(fRight - 4, fBottom - 4); + path.LineTo(fRight - 4, pRect->top); + clrLine = m_pThemeData->clrFormBorder[iActive][4]; + pGraphics->SetStrokeColor(&clrLine); + pGraphics->StrokePath(&path, pMatrix); + m_rtDisLBorder.Set(pRect->left, pRect->top + 29, 4, pRect->height - 29); + m_rtDisRBorder.Set(pRect->right() - 4, pRect->top + 29, 4, pRect->height - 29); + m_rtDisBBorder.Set(pRect->left, pRect->bottom() - 4, pRect->width, 4); + m_rtDisCaption.Set(pRect->left, pRect->top, pRect->width, 29); +} +void CFWL_FormTP::DrawCaption(CFX_Graphics *pGraphics, const CFX_RectF *pRect, FWLTHEME_STATE eState, CFX_Matrix *pMatrix, FX_INT32 iActive) +{ + CFX_RectF rt; + FX_FLOAT fBottom, fRight; + fBottom = pRect->bottom(); + fRight = pRect->right(); + rt.Set(pRect->left, pRect->top, pRect->width, 1); + FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeTop[iActive][0], &rt, pMatrix); + rt.Offset(0, 1); + FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeTop[iActive][1], &rt, pMatrix); + rt.Offset(0, 1); + FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeTop[iActive][2], &rt, pMatrix); + rt.Set(pRect->left, pRect->bottom() - 1, pRect->width, 1); + FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeBottom[iActive][2], &rt, pMatrix); + rt.Offset(0, -1); + FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeBottom[iActive][1], &rt, pMatrix); + rt.Set(pRect->left, pRect->top, 1, pRect->height); + FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeLeft[iActive][2], &rt, pMatrix); + rt.Set(pRect->left + 1, pRect->top + 1, 1, fBottom - 1); + FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeLeft[iActive][1], &rt, pMatrix); + rt.Set(pRect->left + 2, pRect->top + 2, 1, fBottom - 2); + FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeLeft[iActive][0], &rt, pMatrix); + rt.Set(fRight - 1, pRect->top, pRect->width, pRect->height); + FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeRight[iActive][2], &rt, pMatrix); + rt.Set(fRight - 2, pRect->top + 1, 1, fBottom - 1); + FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeRight[iActive][1], &rt, pMatrix); + rt.Set(fRight - 3, pRect->top + 2, 1, fBottom - 2); + FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeRight[iActive][0], &rt, pMatrix); + CFX_RectF rect(*pRect); + rect.Set(rect.left + 3, rect.top + 3, rect.width - 6, rect.height - 5); + if (iActive == 0) { + pGraphics->StretchImage(m_pActiveBitmap, rect, pMatrix); + } else { + pGraphics->StretchImage(m_pDeactivebitmap, rect, pMatrix); + } +} +void CFWL_FormTP::DrawNarrowCaption(CFX_Graphics *pGraphics, const CFX_RectF *pRect, FWLTHEME_STATE eState, CFX_Matrix *pMatrix, FX_INT32 iActive) +{ +} +void CFWL_FormTP::DrawCloseBox(CFX_Graphics *pGraphics, const CFX_RectF *pRect, FWLTHEME_STATE eState, CFX_Matrix *pMatrix, FX_INT32 iActive) +{ + FX_FLOAT fRight = pRect->right(); + FX_FLOAT fBottom = pRect->bottom(); + FX_FLOAT fWidth = pRect->width; + FX_FLOAT fHeight = pRect->height; + pGraphics->SaveGraphState(); + CFX_RectF rt(*pRect); + pGraphics->SetLineWidth(1.0f); + CFX_Path path; + path.Create(); + path.AddRectangle(rt.left + 1, rt.top, fWidth - 2, 1); + path.AddRectangle(rt.left, rt.top + 1, 1, fHeight - 2); + path.AddRectangle(fRight - 1, rt.top + 1, 1, fHeight - 2); + path.AddRectangle(rt.left + 1, fBottom - 1, fWidth - 2, 1); + CFX_Color crFill; + crFill = m_pThemeData->clrBtnEdgeOut[iActive]; + pGraphics->SetFillColor(&crFill); + pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); + path.Clear(); + path.AddRectangle(rt.left + 1, rt.top + 1, 1, 1); + path.AddRectangle(fRight - 2, rt.top + 1, 1, 1); + path.AddRectangle(rt.left + 1, fBottom - 2, 1, 1); + path.AddRectangle(fRight - 2, fBottom - 2, 1, 1); + crFill = m_pThemeData->clrBtnCornerLight[iActive][eState - 1]; + pGraphics->SetFillColor(&crFill); + pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); + path.Clear(); + path.AddRectangle(rt.left + 2, rt.top + 1, fWidth - 4, 1); + path.AddRectangle(rt.left + 1, rt.top + 2, 1, fHeight - 4); + crFill = m_pThemeData->clrCloseBtEdgeLight[iActive][eState - 1]; + pGraphics->SetFillColor(&crFill); + pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); + path.Clear(); + path.AddRectangle(fRight - 2, rt.top + 2, 1, fHeight - 4); + path.AddRectangle(rt.left + 2, fBottom - 2, fWidth - 4, 1); + crFill = m_pThemeData->clrCloseBtEdgeDark[iActive][eState - 1]; + pGraphics->SetFillColor(&crFill); + pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); + path.Clear(); + path.AddRectangle(pRect->left + 2, pRect->top + 2, fWidth - 4, fHeight - 4); + DrawAxialShading(pGraphics, + pRect->left + 2, + pRect->top + 2, + fRight - 2, + fBottom - 2, + m_pThemeData->clrCloseBtBKStart[iActive][eState - 1], + m_pThemeData->clrCloseBtBKEnd[iActive][eState - 1], + &path, FXFILL_WINDING, pMatrix); + CFX_RectF rtX(*pRect); + rtX.Inflate(-5, -5); + FX_FLOAT fR = rtX.right(); + path.Clear(); + FX_FLOAT frtXRight = rtX.right(); + FX_FLOAT frtXBottom = rtX.bottom(); + path.AddLine(rtX.left, rtX.top + 1, frtXRight - 1, frtXBottom); + path.AddLine(rtX.left, rtX.top, frtXRight, frtXBottom); + path.AddLine(rtX.left + 1, rtX.top, frtXRight, frtXBottom - 1); + path.AddLine(rtX.left, frtXBottom - 1, frtXRight - 1, rtX.top); + path.AddLine(rtX.left, frtXBottom, frtXRight, rtX.top); + path.AddLine(rtX.left + 1, frtXBottom, frtXRight, rtX.top + 1); + CFX_Color clrLine(0xffffffff); + pGraphics->SetLineWidth(1.0f); + pGraphics->SetStrokeColor(&clrLine); + pGraphics->StrokePath(&path, pMatrix); + pGraphics->RestoreGraphState(); +} +void CFWL_FormTP::DrawMinMaxBoxCommon(CFX_Graphics *pGraphics, const CFX_RectF *pRect, FWLTHEME_STATE eState, CFX_Matrix *pMatrix, FX_INT32 iActive) +{ + pGraphics->SaveGraphState(); + FX_FLOAT fRight = pRect->right(); + FX_FLOAT fBottom = pRect->bottom(); + FX_FLOAT fWidth = pRect->width; + FX_FLOAT fHeight = pRect->height; + CFX_RectF rt(*pRect); + pGraphics->SetLineWidth(1.0f); + CFX_Path path; + path.Create(); + path.AddRectangle(rt.left + 1, rt.top, fWidth - 2, 1); + path.AddRectangle(rt.left, rt.top + 1, 1, fHeight - 2); + path.AddRectangle(fRight - 1, rt.top + 1, 1, fHeight - 2); + path.AddRectangle(rt.left + 1, fBottom - 1, fWidth - 2, 1); + CFX_Color crFill; + crFill = m_pThemeData->clrBtnEdgeOut[iActive]; + pGraphics->SetFillColor(&crFill); + pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); + path.Clear(); + path.AddRectangle(rt.left + 1, rt.top + 1, 1, 1); + path.AddRectangle(fRight - 2, rt.top + 1, 1, 1); + path.AddRectangle(rt.left + 1, fBottom - 2, 1, 1); + path.AddRectangle(fRight - 2, fBottom - 2, 1, 1); + crFill = m_pThemeData->clrBtnCornerLight[iActive][eState - 1]; + pGraphics->SetFillColor(&crFill); + pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); + path.Clear(); + path.AddRectangle(rt.left + 2, rt.top + 1, fWidth - 4, 1); + path.AddRectangle(rt.left + 1, rt.top + 2, 1, fHeight - 4); + crFill = m_pThemeData->clrNormalBtEdgeLight[iActive][eState - 1]; + pGraphics->SetFillColor(&crFill); + pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); + path.Clear(); + path.AddRectangle(fRight - 2, rt.top + 2, 1, fHeight - 4); + path.AddRectangle(rt.left + 2, fBottom - 2, fWidth - 4, 1); + crFill = m_pThemeData->clrNormalBtEdgeDark[iActive][eState - 1]; + pGraphics->SetFillColor(&crFill); + pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); + pGraphics->RestoreGraphState(); + path.Clear(); + path.AddRectangle(pRect->left + 2, pRect->top + 2, fWidth - 4, fHeight - 4); + DrawAxialShading(pGraphics, + pRect->left + 2, + pRect->top + 2, + fRight - 2, + fBottom - 2, + m_pThemeData->clrNormalBtBKStart[iActive][eState - 1], + m_pThemeData->clrNormalBtBKEnd[iActive][eState - 1], + &path, FXFILL_WINDING, pMatrix); +} +void CFWL_FormTP::DrawMinimizeBox(CFX_Graphics *pGraphics, const CFX_RectF *pRect, FWLTHEME_STATE eState, CFX_Matrix *pMatrix, FX_INT32 iActive) +{ + DrawMinMaxBoxCommon(pGraphics, pRect, eState, pMatrix); + CFX_RectF rtMin; + rtMin.Set(pRect->left + 5, pRect->top + 13, pRect->width - 14, pRect->height - 18); + FillSoildRect(pGraphics, 0xFFFFFFFF, &rtMin, pMatrix); +} +void CFWL_FormTP::DrawMaximizeBox(CFX_Graphics *pGraphics, const CFX_RectF *pRect, FWLTHEME_STATE eState, FX_BOOL bMax, CFX_Matrix *pMatrix, FX_INT32 iActive) +{ + DrawMinMaxBoxCommon(pGraphics, pRect, eState, pMatrix); + FX_FLOAT fWidth = pRect->width; + FX_FLOAT fHeight = pRect->height; + if (bMax) { + CFX_Path path; + path.Create(); + path.AddLine(pRect->left + 7, pRect->top + 6, pRect->left + 14, pRect->top + 6); + path.AddLine(pRect->left + 4, pRect->top + 9, pRect->left + 11, pRect->top + 9); + pGraphics->SaveGraphState(); + pGraphics->SetLineWidth(2); + CFX_Color crStroke(0xFFFFFFFF); + pGraphics->SetStrokeColor(&crStroke); + pGraphics->StrokePath(&path, pMatrix); + pGraphics->SetLineWidth(1); + path.Clear(); + path.AddLine(pRect->left + 4, pRect->top + 10, pRect->left + 4, pRect->top + 14); + path.AddLine(pRect->left + 10, pRect->top + 10, pRect->left + 10, pRect->top + 14); + path.AddLine(pRect->left + 13, pRect->top + 7, pRect->left + 13, pRect->top + 11); + path.AddLine(pRect->left + 4, pRect->top + 14, pRect->left + 10, pRect->top + 14); + path.AddLine(pRect->left + 12, pRect->top + 11, pRect->left + 12, pRect->top + 11); + pGraphics->StrokePath(&path, pMatrix); + pGraphics->RestoreGraphState(); + } else { + CFX_RectF rtMax(*pRect); + rtMax.Inflate(-5, -5); + CFX_Path path; + path.Create(); + path.AddRectangle(pRect->left + 5, pRect->top + 5, fWidth - 10, fHeight - 10); + path.AddRectangle(pRect->left + 6, pRect->top + 8, fWidth - 12, fHeight - 14); + pGraphics->SaveGraphState(); + CFX_Color crFill(0xFFFFFFFF); + pGraphics->SetFillColor(&crFill); + pGraphics->FillPath(&path, FXFILL_ALTERNATE, pMatrix); + pGraphics->RestoreGraphState(); + } +} +void CFWL_FormTP::DrawIconImage(CFX_Graphics *pGraphics, CFX_DIBitmap *pDIBitmap, const CFX_RectF *pRect, FWLTHEME_STATE eState, CFX_Matrix *pMatrix, FX_INT32 iActive) +{ + pGraphics->StretchImage(pDIBitmap, *pRect, pMatrix); +} +void CFWL_FormTP::SetThemeData(FX_DWORD dwID) +{ + m_pThemeData->clrTransWhite = ArgbEncode(0x65, 255, 255, 255); + m_pThemeData->clrCloseBtBKStart[0][0] = ArgbEncode(0xff, 240, 166, 148); + m_pThemeData->clrCloseBtBKEnd[0][0] = ArgbEncode(0xff, 228, 61, 5); + m_pThemeData->clrCloseBtBKStart[0][1] = ArgbEncode(0xff, 255, 184, 176); + m_pThemeData->clrCloseBtBKEnd[0][1] = ArgbEncode(0xff, 252, 107, 71); + m_pThemeData->clrCloseBtBKStart[0][2] = ArgbEncode(0xff, 141, 44, 20); + m_pThemeData->clrCloseBtBKEnd[0][2] = ArgbEncode(0xff, 202, 72, 33); + m_pThemeData->clrCloseBtEdgeLight[0][0] = ArgbEncode(0xff, 255, 122, 107); + m_pThemeData->clrCloseBtEdgeDark[0][0] = ArgbEncode(0xff, 218, 77, 54); + m_pThemeData->clrCloseBtEdgeLight[0][1] = ArgbEncode(0xff, 255, 93, 74); + m_pThemeData->clrCloseBtEdgeDark[0][1] = ArgbEncode(0xff, 218, 74, 51); + m_pThemeData->clrCloseBtEdgeLight[0][2] = ArgbEncode(0xff, 191, 61, 28); + m_pThemeData->clrCloseBtEdgeDark[0][2] = ArgbEncode(0xff, 93, 30, 13); + if (dwID) { + m_pThemeData->clrHeadBK[0][0] = ArgbEncode(0xff, 194, 205, 149); + m_pThemeData->clrHeadBK[0][1] = ArgbEncode(0xff, 170, 184, 131); + m_pThemeData->clrHeadBK[0][2] = ArgbEncode(0xff, 168, 182, 128); + m_pThemeData->clrHeadBK[0][3] = ArgbEncode(0xff, 194, 205, 149); + m_pThemeData->clrHeadEdgeLeft[0][0] = ArgbEncode(0xff, 117, 141, 94); + m_pThemeData->clrHeadEdgeLeft[0][1] = ArgbEncode(0xff, 139, 161, 105); + m_pThemeData->clrHeadEdgeLeft[0][2] = ArgbEncode(0xff, 171, 189, 133); + m_pThemeData->clrHeadEdgeRight[0][0] = ArgbEncode(0xff, 155, 175, 125); + m_pThemeData->clrHeadEdgeRight[0][1] = ArgbEncode(0xff, 128, 146, 103); + m_pThemeData->clrHeadEdgeRight[0][2] = ArgbEncode(0xff, 94, 118, 79); + m_pThemeData->clrHeadEdgeTop[0][0] = ArgbEncode(0xff, 139, 161, 105); + m_pThemeData->clrHeadEdgeTop[0][1] = ArgbEncode(0xff, 234, 245, 201); + m_pThemeData->clrHeadEdgeTop[0][2] = ArgbEncode(0xff, 194, 205, 149); + m_pThemeData->clrHeadEdgeBottom[0][0] = ArgbEncode(0xff, 175, 189, 133 ); + m_pThemeData->clrHeadEdgeBottom[0][1] = ArgbEncode(0xff, 153, 168, 121); + m_pThemeData->clrHeadEdgeBottom[0][2] = ArgbEncode(0xff, 150, 168, 103); + m_pThemeData->clrNormalBtBKStart[0][0] = ArgbEncode(0xff, 182, 195, 162); + m_pThemeData->clrNormalBtBKEnd[0][0] = ArgbEncode(0xff, 128, 144, 84); + m_pThemeData->clrNormalBtBKStart[0][1] = ArgbEncode(0xff, 234, 241, 208); + m_pThemeData->clrNormalBtBKEnd[0][1] = ArgbEncode(0xff, 169, 186, 112); + m_pThemeData->clrNormalBtBKStart[0][2] = ArgbEncode(0xff, 199, 199, 190); + m_pThemeData->clrNormalBtBKEnd[0][2] = ArgbEncode(0xff, 133, 148, 88); + m_pThemeData->clrNormalBtEdgeLight[0][0] = ArgbEncode(0xff, 163, 176, 137); + m_pThemeData->clrNormalBtEdgeDark[0][0] = ArgbEncode(0xff, 118, 135, 83); + m_pThemeData->clrNormalBtEdgeLight[0][1] = ArgbEncode(0xff, 154, 174, 105); + m_pThemeData->clrNormalBtEdgeDark[0][1] = ArgbEncode(0xff, 154, 174, 105); + m_pThemeData->clrNormalBtEdgeLight[0][2] = ArgbEncode(0xff, 172, 193, 123); + m_pThemeData->clrNormalBtEdgeDark[0][2] = ArgbEncode(0xff, 154, 174, 105); + m_pThemeData->clrBtnCornerLight[0][0] = ArgbEncode(0xff, 220, 220, 220); + m_pThemeData->clrBtnCornerLight[0][1] = ArgbEncode(0xff, 255, 255, 255); + m_pThemeData->clrBtnCornerLight[0][2] = ArgbEncode(0xff, 225, 225, 225); + m_pThemeData->clrBtnEdgeOut[0] = ArgbEncode(0xff, 255, 255, 255); + m_pThemeData->clrFormBorder[0][0] = ArgbEncode(0xff, 117, 141, 94); + m_pThemeData->clrFormBorder[0][1] = ArgbEncode(0xff, 139, 161, 105); + m_pThemeData->clrFormBorder[0][2] = ArgbEncode(0xff, 171, 189, 133); + m_pThemeData->clrFormBorder[0][3] = ArgbEncode(0xff, 164, 178, 127); + m_pThemeData->clrFormBorder[0][4] = ArgbEncode(0xff, 255, 255, 255); + m_pThemeData->clrFormBorderLight[0] = ArgbEncode(0xff, 171, 189, 133); + } else { + m_pThemeData->clrHeadBK[0][0] = ArgbEncode(0xff, 3, 114, 255); + m_pThemeData->clrHeadBK[0][1] = ArgbEncode(0xff, 0, 85, 226); + m_pThemeData->clrHeadBK[0][2] = ArgbEncode(0xff, 0, 85, 226); + m_pThemeData->clrHeadBK[0][3] = ArgbEncode(0xff, 3, 114, 255); + m_pThemeData->clrHeadEdgeLeft[0][2] = ArgbEncode(0xff, 0, 32, 200); + m_pThemeData->clrHeadEdgeLeft[0][1] = ArgbEncode(0xff, 0, 61, 220); + m_pThemeData->clrHeadEdgeLeft[0][0] = ArgbEncode(0xff, 0, 54, 210); + m_pThemeData->clrHeadEdgeRight[0][0] = ArgbEncode(0xff, 0, 56, 234); + m_pThemeData->clrHeadEdgeRight[0][1] = ArgbEncode(0xff, 0, 50, 193); + m_pThemeData->clrHeadEdgeRight[0][2] = ArgbEncode(0xff, 0, 19, 139); + m_pThemeData->clrHeadEdgeTop[0][0] = ArgbEncode(0xff, 0, 88, 238); + m_pThemeData->clrHeadEdgeTop[0][1] = ArgbEncode(0xff, 63, 151, 255); + m_pThemeData->clrHeadEdgeTop[0][2] = ArgbEncode(0xff, 3, 114, 255); + m_pThemeData->clrHeadEdgeBottom[0][0] = ArgbEncode(0xff, 0, 96, 252); + m_pThemeData->clrHeadEdgeBottom[0][1] = ArgbEncode(0xff, 63, 151, 255); + m_pThemeData->clrHeadEdgeBottom[0][2] = ArgbEncode(0xff, 0, 67, 207); + m_pThemeData->clrNormalBtBKStart[0][2] = ArgbEncode(0xff, 0, 49, 112); + m_pThemeData->clrNormalBtBKEnd[0][2] = ArgbEncode(0xff, 0, 87, 188); + m_pThemeData->clrNormalBtBKStart[0][0] = ArgbEncode(0xff, 154, 183, 250 ); + m_pThemeData->clrNormalBtBKEnd[0][0] = ArgbEncode(0xff, 17, 110, 248); + m_pThemeData->clrNormalBtBKStart[0][1] = ArgbEncode(0xff, 164, 194, 255); + m_pThemeData->clrNormalBtBKEnd[0][1] = ArgbEncode(0xff, 29, 158, 255); + m_pThemeData->clrNormalBtEdgeLight[0][0] = ArgbEncode(0xff, 68, 120, 245); + m_pThemeData->clrNormalBtEdgeDark[0][0] = ArgbEncode(0xff, 24, 72, 187); + m_pThemeData->clrNormalBtEdgeLight[0][1] = ArgbEncode(0xff, 72, 122, 245); + m_pThemeData->clrNormalBtEdgeDark[0][1] = ArgbEncode(0xff, 35, 87, 195); + m_pThemeData->clrNormalBtEdgeLight[0][2] = ArgbEncode(0xff, 60, 114, 244); + m_pThemeData->clrNormalBtEdgeDark[0][2] = ArgbEncode(0xff, 21, 70, 185); + m_pThemeData->clrBtnCornerLight[0][0] = ArgbEncode(0xff, 220, 220, 220); + m_pThemeData->clrBtnCornerLight[0][1] = ArgbEncode(0xff, 255, 255, 255); + m_pThemeData->clrBtnCornerLight[0][2] = ArgbEncode(0xff, 225, 225, 225); + m_pThemeData->clrBtnEdgeOut[0] = ArgbEncode(0xff, 255, 255, 255); + m_pThemeData->clrFormBorder[0][0] = ArgbEncode(0xff, 0, 72, 241); + m_pThemeData->clrFormBorder[0][1] = ArgbEncode(0xff, 0, 61, 220); + m_pThemeData->clrFormBorder[0][2] = ArgbEncode(0xff, 0, 30, 160); + m_pThemeData->clrFormBorder[0][3] = ArgbEncode(0xff, 0, 19, 140); + m_pThemeData->clrFormBorder[0][4] = ArgbEncode(0xff, 255, 255, 255); + m_pThemeData->clrFormBorderLight[0] = ArgbEncode(0xff, 22, 106, 239); + } + m_pThemeData->clrCloseBtBKStart[1][0] = m_pThemeData->clrCloseBtBKStart[0][0]; + m_pThemeData->clrCloseBtBKEnd[1][0] = m_pThemeData->clrCloseBtBKEnd[0][0]; + m_pThemeData->clrCloseBtBKStart[1][1] = m_pThemeData->clrCloseBtBKStart[0][1]; + m_pThemeData->clrCloseBtBKEnd[1][1] = m_pThemeData->clrCloseBtBKEnd[0][1]; + m_pThemeData->clrCloseBtBKStart[1][2] = m_pThemeData->clrCloseBtBKStart[0][2]; + m_pThemeData->clrCloseBtBKEnd[1][2] = m_pThemeData->clrCloseBtBKEnd[0][2]; + m_pThemeData->clrCloseBtEdgeLight[1][0] = m_pThemeData->clrCloseBtEdgeLight[0][0]; + m_pThemeData->clrCloseBtEdgeDark[1][0] = m_pThemeData->clrCloseBtEdgeDark[0][0]; + m_pThemeData->clrCloseBtEdgeLight[1][1] = m_pThemeData->clrCloseBtEdgeLight[0][1]; + m_pThemeData->clrCloseBtEdgeDark[1][1] = m_pThemeData->clrCloseBtEdgeDark[0][1]; + m_pThemeData->clrCloseBtEdgeLight[1][2] = m_pThemeData->clrCloseBtEdgeLight[0][2]; + m_pThemeData->clrCloseBtEdgeDark[1][2] = m_pThemeData->clrCloseBtEdgeDark[0][2]; + m_pThemeData->clrHeadBK[1][0] = m_pThemeData->clrHeadBK[0][0]; + m_pThemeData->clrHeadBK[1][1] = m_pThemeData->clrHeadBK[0][1]; + m_pThemeData->clrHeadBK[1][2] = m_pThemeData->clrHeadBK[0][2]; + m_pThemeData->clrHeadBK[1][3] = m_pThemeData->clrHeadBK[0][3]; + m_pThemeData->clrHeadEdgeLeft[1][2] = m_pThemeData->clrHeadEdgeLeft[0][2]; + m_pThemeData->clrHeadEdgeLeft[1][1] = m_pThemeData->clrHeadEdgeLeft[0][1]; + m_pThemeData->clrHeadEdgeLeft[1][0] = m_pThemeData->clrHeadEdgeLeft[0][0]; + m_pThemeData->clrHeadEdgeRight[1][0] = m_pThemeData->clrHeadEdgeRight[0][0]; + m_pThemeData->clrHeadEdgeRight[1][1] = m_pThemeData->clrHeadEdgeRight[0][1]; + m_pThemeData->clrHeadEdgeRight[1][2] = m_pThemeData->clrHeadEdgeRight[0][2]; + m_pThemeData->clrHeadEdgeTop[1][0] = m_pThemeData->clrHeadEdgeTop[0][0]; + m_pThemeData->clrHeadEdgeTop[1][1] = m_pThemeData->clrHeadEdgeTop[0][1]; + m_pThemeData->clrHeadEdgeTop[1][2] = m_pThemeData->clrHeadEdgeTop[0][2]; + m_pThemeData->clrHeadEdgeBottom[1][0] = m_pThemeData->clrHeadEdgeBottom[0][0]; + m_pThemeData->clrHeadEdgeBottom[1][1] = m_pThemeData->clrHeadEdgeBottom[0][1]; + m_pThemeData->clrHeadEdgeBottom[1][2] = m_pThemeData->clrHeadEdgeBottom[0][2]; + m_pThemeData->clrNormalBtBKStart[1][2] = m_pThemeData->clrNormalBtBKStart[0][2]; + m_pThemeData->clrNormalBtBKEnd[1][2] = m_pThemeData->clrNormalBtBKEnd[0][2]; + m_pThemeData->clrNormalBtBKStart[1][0] = m_pThemeData->clrNormalBtBKStart[0][0]; + m_pThemeData->clrNormalBtBKEnd[1][0] = m_pThemeData->clrNormalBtBKEnd[1][0]; + m_pThemeData->clrNormalBtBKStart[1][1] = m_pThemeData->clrNormalBtBKStart[0][1]; + m_pThemeData->clrNormalBtBKEnd[1][1] = m_pThemeData->clrNormalBtBKEnd[0][1]; + m_pThemeData->clrNormalBtEdgeLight[1][0] = m_pThemeData->clrNormalBtEdgeLight[0][0]; + m_pThemeData->clrNormalBtEdgeDark[1][0] = m_pThemeData->clrNormalBtEdgeDark[0][0]; + m_pThemeData->clrNormalBtEdgeLight[1][1] = m_pThemeData->clrNormalBtEdgeLight[0][1]; + m_pThemeData->clrNormalBtEdgeDark[1][1] = m_pThemeData->clrNormalBtEdgeDark[0][1]; + m_pThemeData->clrNormalBtEdgeLight[1][2] = m_pThemeData->clrNormalBtEdgeLight[0][2]; + m_pThemeData->clrNormalBtEdgeDark[1][2] = m_pThemeData->clrNormalBtEdgeDark[0][2]; + m_pThemeData->clrBtnCornerLight[1][0] = m_pThemeData->clrBtnCornerLight[0][0]; + m_pThemeData->clrBtnCornerLight[1][1] = m_pThemeData->clrBtnCornerLight[0][1]; + m_pThemeData->clrBtnCornerLight[1][2] = m_pThemeData->clrBtnCornerLight[0][2]; + m_pThemeData->clrBtnEdgeOut[1] = m_pThemeData->clrBtnEdgeOut[0]; + m_pThemeData->clrFormBorder[1][0] = m_pThemeData->clrFormBorder[0][0]; + m_pThemeData->clrFormBorder[1][1] = m_pThemeData->clrFormBorder[0][1]; + m_pThemeData->clrFormBorder[1][2] = m_pThemeData->clrFormBorder[0][2]; + m_pThemeData->clrFormBorder[1][3] = m_pThemeData->clrFormBorder[0][3]; + m_pThemeData->clrFormBorder[1][4] = m_pThemeData->clrFormBorder[0][4]; + m_pThemeData->clrFormBorderLight[1] = m_pThemeData->clrFormBorderLight[0]; + DeactiveForm(); +} +void CFWL_FormTP::DeactiveForm() +{ + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadBK[1][0]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadBK[1][1]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadBK[1][2]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadBK[1][3]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadEdgeLeft[1][0]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadEdgeLeft[1][1]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadEdgeLeft[1][2]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadEdgeRight[1][0]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadEdgeRight[1][1]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadEdgeRight[1][2]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadEdgeTop[1][0]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadEdgeTop[1][1]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadEdgeTop[1][2]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadEdgeBottom[1][0]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadEdgeBottom[1][1]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadEdgeBottom[1][2]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrNormalBtBKStart[1][0]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrNormalBtBKStart[1][1]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrNormalBtBKStart[1][2]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrNormalBtBKEnd[1][0]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrNormalBtBKEnd[1][1]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrNormalBtBKEnd[1][2]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrNormalBtEdgeLight[1][0]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrNormalBtEdgeLight[1][1]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrNormalBtEdgeLight[1][2]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrNormalBtEdgeDark[1][0]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrNormalBtEdgeDark[1][1]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrNormalBtEdgeDark[1][2]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrBtnCornerLight[1][0]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrBtnCornerLight[1][1]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrBtnCornerLight[1][2]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrBtnEdgeOut[1]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrFormBorder[1][0]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrFormBorder[1][1]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrFormBorder[1][2]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrFormBorder[1][3]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrFormBorder[1][4]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrFormBorderLight[1]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrCloseBtBKStart[1][0]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrCloseBtBKStart[1][1]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrCloseBtBKStart[1][2]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrCloseBtBKEnd[1][0]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrCloseBtBKEnd[1][1]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrCloseBtBKEnd[1][2]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrCloseBtEdgeLight[1][0]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrCloseBtEdgeLight[1][1]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrCloseBtEdgeLight[1][2]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrCloseBtEdgeDark[1][0]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrCloseBtEdgeDark[1][1]); + TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrCloseBtEdgeDark[1][2]); +} +void CFWL_FormTP::TransModeColor(FX_ARGB clrFore, FX_ARGB &clrBack) +{ + FX_INT32 iAlfaF, iRF, iGF, iBF; + FX_INT32 iAlfaB, iRB, iGB, iBB; + ArgbDecode(clrFore, iAlfaF, iRF, iGF, iBF); + ArgbDecode(clrBack, iAlfaB, iRB, iGB, iBB); + clrBack = ArgbEncode(0xff, + iRB + (iRF - iRB) * iAlfaF / 255, + iGB + (iGF - iGB) * iAlfaF / 255, + iBB + (iBF - iBB) * iAlfaF / 255); +} +void CFWL_FormTP::InitCaption(FX_BOOL bActive) +{ + if (bActive) { + CFX_FxgeDevice dev; + CFX_Graphics gs; + CFX_Path path; + path.Create(); + if (m_pActiveBitmap) { + delete m_pActiveBitmap; + m_pActiveBitmap = NULL; + } + m_pActiveBitmap = FX_NEW CFX_DIBitmap; + m_pActiveBitmap->Create(1, FWLTHEME_CAPACITY_CYCaption, FXDIB_Argb); + dev.Attach(m_pActiveBitmap); + gs.Create(&dev); + path.AddRectangle(0, 0, 1, 5); + DrawAxialShading(&gs, 0, 0, 0, 5, m_pThemeData->clrHeadBK[0][0], m_pThemeData->clrHeadBK[0][1], &path); + path.Clear(); + path.AddRectangle(0, 5, 1, 15); + DrawAxialShading(&gs, 0, 5, 0, 20, m_pThemeData->clrHeadBK[0][1], m_pThemeData->clrHeadBK[0][2], &path); + path.Clear(); + path.AddRectangle(0, 20, 1, FWLTHEME_CAPACITY_CYCaption - 19); + DrawAxialShading(&gs, 0, 20, 0, FWLTHEME_CAPACITY_CYCaption, m_pThemeData->clrHeadBK[0][2], m_pThemeData->clrHeadBK[0][3], &path); + } else { + CFX_FxgeDevice dev; + CFX_Graphics gs; + CFX_Path path; + path.Create(); + if (m_pDeactivebitmap) { + delete m_pDeactivebitmap; + m_pDeactivebitmap = NULL; + } + m_pDeactivebitmap = FX_NEW CFX_DIBitmap; + m_pDeactivebitmap->Create(1, FWLTHEME_CAPACITY_CYCaption, FXDIB_Argb); + dev.Attach(m_pDeactivebitmap); + gs.Create(&dev); + path.AddRectangle(0, 0, 1, 5); + DrawAxialShading(&gs, 0, 0, 0, 5, m_pThemeData->clrHeadBK[1][0], m_pThemeData->clrHeadBK[1][1], &path); + path.Clear(); + path.AddRectangle(0, 5, 1, 15); + DrawAxialShading(&gs, 0, 5, 0, 20, m_pThemeData->clrHeadBK[1][1], m_pThemeData->clrHeadBK[1][2], &path); + path.Clear(); + path.AddRectangle(0, 20, 1, FWLTHEME_CAPACITY_CYCaption - 19); + DrawAxialShading(&gs, 0, 20, 0, FWLTHEME_CAPACITY_CYCaption, m_pThemeData->clrHeadBK[1][2], m_pThemeData->clrHeadBK[1][3], &path); + } +} diff --git a/xfa/src/fwl/src/theme/listboxtp.cpp b/xfa/src/fwl/src/theme/listboxtp.cpp new file mode 100644 index 0000000000..a623509973 --- /dev/null +++ b/xfa/src/fwl/src/theme/listboxtp.cpp @@ -0,0 +1,92 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +CFWL_ListBoxTP::CFWL_ListBoxTP() +{ +} +CFWL_ListBoxTP::~CFWL_ListBoxTP() +{ +} +FX_BOOL CFWL_ListBoxTP::IsValidWidget(IFWL_Widget *pWidget) +{ + _FWL_RETURN_VALUE_IF_FAIL(pWidget, FALSE); + return pWidget->GetClassID() == FWL_CLASSHASH_ListBox; +} +FX_BOOL CFWL_ListBoxTP::DrawBackground(CFWL_ThemeBackground *pParams) +{ + _FWL_RETURN_VALUE_IF_FAIL(pParams, FALSE); + switch(pParams->m_iPart) { + case FWL_PART_LTB_Border: { + DrawBorder(pParams->m_pGraphics, &pParams->m_rtPart, &pParams->m_matrix); + break; + } + case FWL_PART_LTB_Edge: { + DrawEdge(pParams->m_pGraphics, pParams->m_pWidget->GetStyles(), &pParams->m_rtPart, &pParams->m_matrix); + break; + } + case FWL_PART_LTB_Background: { + FillSoildRect(pParams->m_pGraphics, ArgbEncode(255, 255, 255, 255), &pParams->m_rtPart, &pParams->m_matrix); + if (pParams->m_pData) { + FillSoildRect(pParams->m_pGraphics, FWLTHEME_COLOR_Background, (CFX_RectF*)pParams->m_pData, &pParams->m_matrix); + } + break; + } + case FWL_PART_LTB_ListItem: { + DrawListBoxItem(pParams->m_pGraphics, pParams->m_dwStates, &pParams->m_rtPart, pParams->m_pData, &pParams->m_matrix); + break; + } + case FWL_PART_LTB_Icon: { + pParams->m_pGraphics->StretchImage(pParams->m_pImage, pParams->m_rtPart, &pParams->m_matrix); + break; + } + case FWL_PART_LTB_Check: { + FX_DWORD color = 0xFF000000; + if (pParams->m_dwStates == FWL_PARTSTATE_LTB_Checked) { + color = 0xFFFF0000; + } else if (pParams->m_dwStates == FWL_PARTSTATE_LTB_UnChecked) { + color = 0xFF0000FF; + } + FillSoildRect(pParams->m_pGraphics, color, &pParams->m_rtPart, &pParams->m_matrix); + } + default: { + } + } + return TRUE; +} +FWL_ERR CFWL_ListBoxTP::Initialize() +{ + InitTTO(); + return CFWL_WidgetTP::Initialize(); +} +FWL_ERR CFWL_ListBoxTP::Finalize() +{ + FinalizeTTO(); + return CFWL_WidgetTP::Finalize(); +} +void CFWL_ListBoxTP::DrawListBoxItem(CFX_Graphics *pGraphics, FX_DWORD dwStates, const CFX_RectF *prtItem, FX_LPVOID pData , CFX_Matrix *pMatrix ) +{ + if (dwStates & FWL_PARTSTATE_LTB_Selected) { + pGraphics->SaveGraphState(); + CFX_Color crFill(FWL_GetThemeColor(m_dwThemeID) == 0 ? FWLTHEME_COLOR_BKSelected : FWLTHEME_COLOR_Green_BKSelected); + pGraphics->SetFillColor(&crFill); + CFX_RectF rt(*prtItem); + CFX_Path path; + path.Create(); +#if (_FX_OS_==_FX_MACOSX_) + path.AddRectangle(rt.left, rt.top, rt.width - 1, rt.height - 1); +#else + path.AddRectangle(rt.left, rt.top, rt.width, rt.height); +#endif + pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); + pGraphics->RestoreGraphState(); + } + if (dwStates & FWL_PARTSTATE_LTB_Focused) { + if (pData) { + DrawFocus(pGraphics, (CFX_RectF*)pData, pMatrix); + } + } +} diff --git a/xfa/src/fwl/src/theme/monthcalendartp.cpp b/xfa/src/fwl/src/theme/monthcalendartp.cpp new file mode 100644 index 0000000000..2104d873f3 --- /dev/null +++ b/xfa/src/fwl/src/theme/monthcalendartp.cpp @@ -0,0 +1,554 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#define FWL_THEMECAPACITY_MC_HEADER_WIDTH 200 +#define FWL_THEMECAPACITY_MC_HEADER_HEIGHT 30 +#define FWL_THEMECAPACITY_MC_HEADER_BTN_WIDTH 18 +#define FWL_THEMECAPACITY_MC_HEADER_BTN_HEIGHT 16 +#define FWL_THEMECAPACITY_MC_HEADER_BTN_HMARGIN 5 +#define FWL_THEMECAPACITY_MC_HEADER_BTN_VMARGIN (FWL_THEMECAPACITY_MC_HEADER_HEIGHT - FWL_THEMECAPACITY_MC_HEADER_BTN_HEIGHT)/2 +#define FWL_THEMECAPACITY_MC_HEADER_TEXTWIDHT 100 +#define FWL_THEMECAPACITY_MC_HEADER_TEXTHEIGHT 20 +#define FWL_THEMECAPACITY_MC_HEADER_TEXT_HMARGIN (FWL_THEMECAPACITY_MC_HEADER_WIDTH - FWL_THEMECAPACITY_MC_HEADER_TEXTWIDHT)/2 +#define FWL_THEMECAPACITY_MC_HEADER_TEXT_VMARGIN (FWL_THEMECAPACITY_MC_HEADER_HEIGHT - FWL_THEMECAPACITY_MC_HEADER_TEXTHEIGHT)/2 +#define FWL_THEMECAPACITY_MC_HSEP_WIDTH (FWL_THEMECAPACITY_MC_WEEK_WIDTH - 10) +#define FWL_THEMECAPACITY_MC_HSEP_HEIGHT 1 +#define FWL_THEMECAPACITY_MC_VSEP_WIDTH 1 +#define FWL_THEMECAPACITY_MC_VSEP_HEIGHT FWL_THEMECAPACITY_MC_WEEKNUM_HEIGHT +#define FWL_THEMECAPACITY_MC_WEEKNUM_WIDTH 26 +#define FWL_THEMECAPACITY_MC_SEP_DOFFSET -4 +#define FWL_THEMECAPACITY_MC_SEP_X 3 +#define FWL_THEMECAPACITY_MC_SEP_Y (FWL_THEMECAPACITY_MC_HEADER_HEIGHT + FWL_THEMECAPACITY_MC_WEEK_HEIGHT + FWL_THEMECAPACITY_MC_SEP_DOFFSET) +#define FWL_THEMECAPACITY_MC_WEEKNUM_HEIGHT (6*FWL_THEMECAPACITY_MC_DATES_CELL_HEIGHT) +#define FWL_THEMECAPACITY_MC_WEEK_WIDTH (FWL_THEMECAPACITY_MC_DATES_CELL_WIDTH*7) +#define FWL_THEMECAPACITY_MC_WEEK_HEIGHT FWL_THEMECAPACITY_MC_DATES_CELL_HEIGHT +#define FWL_THEMECAPACITY_MC_DATES_CELL_WIDTH (FWL_THEMECAPACITY_MC_HEADER_WIDTH/7) +#define FWL_THEMECAPACITY_MC_DATES_CELL_HEIGHT 16 +#define FWL_THEMECAPACITY_MC_TODAY_WIDHT FWL_THEMECAPACITY_MC_HEADER_WIDTH +#define FWL_THEMECAPACITY_MC_TODAY_HEIGHT FWL_THEMECAPACITY_MC_DATES_CELL_HEIGHT +#define FWL_THEMECAPACITY_MC_TODAY_FLAG_WIDHT FWL_THEMECAPACITY_MC_DATES_CELL_WIDTH +#define FWL_MC_WIDTH 200 +#define FWL_MC_HEIGHT 160 +CFWL_MonthCalendarTP::CFWL_MonthCalendarTP() +{ + m_pThemeData = FX_NEW MCThemeData; + SetThemeData(0); +} +CFWL_MonthCalendarTP::~CFWL_MonthCalendarTP() +{ + delete m_pThemeData; +} +FX_BOOL CFWL_MonthCalendarTP::IsValidWidget(IFWL_Widget *pWidget) +{ + _FWL_RETURN_VALUE_IF_FAIL(pWidget, FALSE); + return pWidget->GetClassID() == FWL_CLASSHASH_MonthCalendar; +} +FX_DWORD CFWL_MonthCalendarTP::SetThemeID(IFWL_Widget *pWidget, FX_DWORD dwThemeID, FX_BOOL bChildren ) +{ + if (m_pThemeData) { + SetThemeData(FWL_GetThemeColor(dwThemeID)); + } + return CFWL_WidgetTP::SetThemeID(pWidget, dwThemeID, bChildren); +} +FX_BOOL CFWL_MonthCalendarTP::DrawBackground(CFWL_ThemeBackground *pParams) +{ + _FWL_RETURN_VALUE_IF_FAIL(pParams, FALSE); + switch(pParams->m_iPart) { + case FWL_PART_MCD_Border: { + DrawBorder(pParams->m_pGraphics, &pParams->m_rtPart, &pParams->m_matrix); + break; + } + case FWL_PART_MCD_Edge: { + DrawEdge(pParams->m_pGraphics, pParams->m_pWidget->GetStyles(), &pParams->m_rtPart, &pParams->m_matrix); + break; + } + case FWL_PART_MCD_Background: { + DrawTotalBK(pParams, &pParams->m_matrix); + break; + } + case FWL_PART_MCD_Header: { + DrawHeadBk(pParams, &pParams->m_matrix); + break; + } + case FWL_PART_MCD_LBtn: { +#ifdef THEME_XPSimilar + FWLTHEME_STATE eState = GetState(pParams->m_dwStates); + DrawArrowBtn(pParams->m_pGraphics, &pParams->m_rtPart, FWLTHEME_DIRECTION_Left, eState, &pParams->m_matrix); +#else + DrawLButton(pParams, &pParams->m_matrix); +#endif + break; + } + case FWL_PART_MCD_RBtn: { +#ifdef THEME_XPSimilar + FWLTHEME_STATE eState = GetState(pParams->m_dwStates); + DrawArrowBtn(pParams->m_pGraphics, &pParams->m_rtPart, FWLTHEME_DIRECTION_Right, eState, &pParams->m_matrix); +#else + DrawRButton(pParams, &pParams->m_matrix); +#endif + break; + } + case FWL_PART_MCD_HSeparator: { + DrawHSeperator(pParams, &pParams->m_matrix); + break; + } + case FWL_PART_MCD_DatesIn: { + DrawDatesInBK(pParams, &pParams->m_matrix); + break; + } + case FWL_PART_MCD_TodayCircle: { + DrawTodayCircle(pParams, &pParams->m_matrix); + break; + } + case FWL_PART_MCD_DateInCircle: { + DrawDatesInCircle(pParams, &pParams->m_matrix); + break; + } + case FWL_PART_MCD_WeekNumSep: { + DrawWeekNumSep(pParams, &pParams->m_matrix); + break; + } + default: { + } + } + return TRUE; +} +FX_BOOL CFWL_MonthCalendarTP::DrawText(CFWL_ThemeText *pParams) +{ + _FWL_RETURN_VALUE_IF_FAIL(m_pTextOut, FALSE); + if ((pParams->m_iPart == FWL_PART_MCD_DatesIn) && !(pParams->m_dwStates & FWL_ITEMSTATE_MCD_Flag) && + (pParams->m_dwStates & (FWL_PARTSTATE_MCD_Hovered | FWL_PARTSTATE_MCD_Selected))) { + m_pTextOut->SetTextColor(0xFFFFFFFF); + } else if (pParams->m_iPart == FWL_PART_MCD_Caption) { + m_pTextOut->SetTextColor(m_pThemeData->clrCaption); + } else { + m_pTextOut->SetTextColor(0xFF000000); + } + return CFWL_WidgetTP::DrawText(pParams); +} +FX_LPVOID CFWL_MonthCalendarTP::GetCapacity(CFWL_ThemePart *pThemePart, FX_DWORD dwCapacity) +{ + FX_BOOL bDefPro = FALSE; + FX_BOOL bDwordVal = FALSE; + switch(dwCapacity) { + case FWL_WGTCAPACITY_MC_HEADER_WIDTH: { + m_fValue = FWL_THEMECAPACITY_MC_HEADER_WIDTH; + break; + } + case FWL_WGTCAPACITY_MC_HEADER_Height: { + m_fValue = FWL_THEMECAPACITY_MC_HEADER_HEIGHT; + break; + } + case FWL_WGTCAPACITY_MC_HEADER_BTN_WIDTH: { + m_fValue = FWL_THEMECAPACITY_MC_HEADER_BTN_WIDTH; + break; + } + case FWL_WGTCAPACITY_MC_HEADER_BTN_HEIGHT: { + m_fValue = FWL_THEMECAPACITY_MC_HEADER_BTN_HEIGHT; + break; + } + case FWL_WGTCAPACITY_MC_HEADER_BTN_HMARGIN: { + bDwordVal = TRUE; + m_dwValue = FWL_THEMECAPACITY_MC_HEADER_BTN_HMARGIN; + break; + } + case FWL_WGTCAPACITY_MC_HEADER_BTN_VMARGIN: { + m_fValue = FWL_THEMECAPACITY_MC_HEADER_BTN_VMARGIN; + break; + } + case FWL_WGTCAPACITY_MC_HEADER_TEXTWIDHT: { + m_fValue = FWL_THEMECAPACITY_MC_HEADER_TEXTWIDHT; + break; + } + case FWL_WGTCAPACITY_MC_HEADER_TEXTHEIGHT: { + m_fValue = FWL_THEMECAPACITY_MC_HEADER_TEXTHEIGHT; + break; + } + case FWL_WGTCAPACITY_MC_HEADER_TEXT_HMARGIN: { + m_fValue = FWL_THEMECAPACITY_MC_HEADER_TEXT_HMARGIN; + break; + } + case FWL_WGTCAPACITY_MC_HEADER_TEXT_VMARGIN: { + m_fValue = FWL_THEMECAPACITY_MC_HEADER_TEXT_VMARGIN; + break; + } + case FWL_WGTCAPACITY_MC_HSEP_WIDTH: { + m_fValue = FWL_THEMECAPACITY_MC_HSEP_WIDTH; + break; + } + case FWL_WGTCAPACITY_MC_HSEP_HEIGHT: { + m_fValue = FWL_THEMECAPACITY_MC_HSEP_HEIGHT; + break; + } + case FWL_WGTCAPACITY_MC_VSEP_WIDTH: { + m_fValue = FWL_THEMECAPACITY_MC_VSEP_WIDTH; + break; + } + case FWL_WGTCAPACITY_MC_VSEP_HEIGHT: { + m_fValue = FWL_THEMECAPACITY_MC_VSEP_HEIGHT; + break; + } + case FWL_WGTCAPACITY_MC_WEEKNUM_WIDTH: { + m_fValue = FWL_THEMECAPACITY_MC_WEEKNUM_WIDTH; + break; + } + case FWL_WGTCAPACITY_MC_WEEKNUM_HEIGHT: { + m_fValue = FWL_THEMECAPACITY_MC_WEEKNUM_HEIGHT; + break; + } + case FWL_WGTCAPACITY_MC_WEEK_WIDTH: { + m_fValue = FWL_THEMECAPACITY_MC_WEEK_WIDTH; + break; + } + case FWL_WGTCAPACITY_MC_WEEK_HEIGHT: { + m_fValue = FWL_THEMECAPACITY_MC_WEEK_HEIGHT; + break; + } + case FWL_WGTCAPACITY_MC_SEP_DOFFSET: { + m_fValue = FWL_THEMECAPACITY_MC_SEP_DOFFSET; + break; + } + case FWL_WGTCAPACITY_MC_SEP_X: { + m_fValue = FWL_THEMECAPACITY_MC_SEP_X; + break; + } + case FWL_WGTCAPACITY_MC_SEP_Y: { + m_fValue = FWL_THEMECAPACITY_MC_SEP_Y; + break; + } + case FWL_WGTCAPACITY_MC_DATES_CELL_WIDTH: { + m_fValue = FWL_THEMECAPACITY_MC_DATES_CELL_WIDTH; + break; + } + case FWL_WGTCAPACITY_MC_DATES_CELL_HEIGHT: { + m_fValue = FWL_THEMECAPACITY_MC_DATES_CELL_HEIGHT; + break; + } + case FWL_WGTCAPACITY_MC_TODAY_WIDHT: { + m_fValue = FWL_THEMECAPACITY_MC_TODAY_WIDHT; + break; + } + case FWL_WGTCAPACITY_MC_TODAY_HEIGHT: { + m_fValue = FWL_THEMECAPACITY_MC_TODAY_HEIGHT; + break; + } + case FWL_WGTCAPACITY_MC_TODAY_FLAG_WIDHT: { + m_fValue = FWL_THEMECAPACITY_MC_TODAY_FLAG_WIDHT; + break; + } + case FWL_WGTCAPACITY_MC_WIDTH: { + m_fValue = FWL_MC_WIDTH; + break; + } + case FWL_WGTCAPACITY_MC_HEIGHT: { + m_fValue = FWL_MC_HEIGHT; + break; + } + case FWL_MCCAPACITY_Sun: { + wsResource = L"Sun"; + return &wsResource; + } + case FWL_MCCAPACITY_Mon: { + wsResource = L"Mon"; + return &wsResource; + } + case FWL_MCCAPACITY_Tue: { + wsResource = L"Tue"; + return &wsResource; + } + case FWL_MCCAPACITY_Wed: { + wsResource = L"Wed"; + return &wsResource; + } + case FWL_MCCAPACITY_Thu: { + wsResource = L"Thu"; + return &wsResource; + } + case FWL_MCCAPACITY_Fri: { + wsResource = L"Fri"; + return &wsResource; + } + case FWL_MCCAPACITY_Sat: { + wsResource = L"Sat"; + return &wsResource; + } + case FWL_MCCAPACITY_January: { + wsResource = L"January"; + return &wsResource; + } + case FWL_MCCAPACITY_February: { + wsResource = L"February"; + return &wsResource; + } + case FWL_MCCAPACITY_March: { + wsResource = L"March"; + return &wsResource; + } + case FWL_MCCAPACITY_April: { + wsResource = L"April"; + return &wsResource; + } + case FWL_MCCAPACITY_May: { + wsResource = L"May"; + return &wsResource; + } + case FWL_MCCAPACITY_June: { + wsResource = L"June"; + return &wsResource; + } + case FWL_MCCAPACITY_July: { + wsResource = L"July"; + return &wsResource; + } + case FWL_MCCAPACITY_August: { + wsResource = L"August"; + return &wsResource; + } + case FWL_MCCAPACITY_September: { + wsResource = L"September"; + return &wsResource; + } + case FWL_MCCAPACITY_October: { + wsResource = L"October"; + return &wsResource; + } + case FWL_MCCAPACITY_November: { + wsResource = L"November"; + return &wsResource; + } + case FWL_MCCAPACITY_December: { + wsResource = L"December"; + return &wsResource; + } + case FWL_MCCAPACITY_Today: { + wsResource = L"Today"; + return &wsResource; + } + default: { + bDefPro = TRUE; + } + } + if (!bDefPro) { + if (bDwordVal) { + return &m_dwValue; + } + return &m_fValue; + } + return CFWL_WidgetTP::GetCapacity(pThemePart, dwCapacity); +} +FWL_ERR CFWL_MonthCalendarTP::Initialize() +{ + InitTTO(); + return CFWL_WidgetTP::Initialize(); +} +FWL_ERR CFWL_MonthCalendarTP::Finalize() +{ + FinalizeTTO(); + return CFWL_WidgetTP::Finalize(); +} +FX_BOOL CFWL_MonthCalendarTP::DrawTotalBK(CFWL_ThemeBackground *pParams, CFX_Matrix *pMatrix) +{ + CFX_Path path; + path.Create(); + CFX_RectF rtTotal(pParams->m_rtPart); + path.AddRectangle(rtTotal.left, rtTotal.top, rtTotal.width, rtTotal.height); + pParams->m_pGraphics->SaveGraphState(); + CFX_Color clrBK(m_pThemeData->clrBK); + pParams->m_pGraphics->SetFillColor(&clrBK); + pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); + pParams->m_pGraphics->RestoreGraphState(); + return TRUE; +} +FX_BOOL CFWL_MonthCalendarTP::DrawHeadBk(CFWL_ThemeBackground *pParams, CFX_Matrix *pMatrix) +{ + CFX_Path path; + path.Create(); + CFX_RectF rtHead = pParams->m_rtPart; + path.AddRectangle(rtHead.left, rtHead.top, rtHead.width, rtHead.height); + pParams->m_pGraphics->SaveGraphState(); + CFX_Color clrHeadBK(m_pThemeData->clrBK); + pParams->m_pGraphics->SetFillColor(&clrHeadBK); + pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); + pParams->m_pGraphics->RestoreGraphState(); + return TRUE; +} +FX_BOOL CFWL_MonthCalendarTP::DrawLButton(CFWL_ThemeBackground *pParams, CFX_Matrix *pMatrix) +{ + CFX_Path path; + path.Create(); + CFX_RectF rtLBtn; + rtLBtn = pParams->m_rtPart; + path.AddRectangle(rtLBtn.left, rtLBtn.top, rtLBtn.width, rtLBtn.height); + pParams->m_pGraphics->SaveGraphState(); + CFX_Color clrLBtnEdge(ArgbEncode(0xff, 205, 219, 243)); + pParams->m_pGraphics->SetStrokeColor(&clrLBtnEdge); + pParams->m_pGraphics->StrokePath(&path, pMatrix); + if ((pParams->m_dwStates & FWL_PARTSTATE_MCD_Pressed) == FWL_PARTSTATE_MCD_Pressed) { + CFX_Color clrLBtnFill(ArgbEncode(0xff, 174, 198, 242)); + pParams->m_pGraphics->SetFillColor(&clrLBtnFill); + pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); + } else { + CFX_Color clrLBtnFill(ArgbEncode(0xff, 227, 235, 249)); + pParams->m_pGraphics->SetFillColor(&clrLBtnFill); + pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); + } + path.Clear(); + path.MoveTo(rtLBtn.left + rtLBtn.Width() / 3 * 2, rtLBtn.top + rtLBtn.height / 4); + path.LineTo(rtLBtn.left + rtLBtn.Width() / 3, rtLBtn.top + rtLBtn.height / 2); + path.LineTo(rtLBtn.left + rtLBtn.Width() / 3 * 2, rtLBtn.bottom() - rtLBtn.height / 4); + CFX_Color clrFlag(ArgbEncode(0xff, 50, 104, 205)); + pParams->m_pGraphics->SetStrokeColor(&clrFlag); + pParams->m_pGraphics->StrokePath(&path, pMatrix); + pParams->m_pGraphics->RestoreGraphState(); + return TRUE; +} +FX_BOOL CFWL_MonthCalendarTP::DrawRButton(CFWL_ThemeBackground *pParams, CFX_Matrix *pMatrix) +{ + CFX_Path path; + path.Create(); + CFX_RectF rtRBtn; + rtRBtn = pParams->m_rtPart; + path.AddRectangle(rtRBtn.left, rtRBtn.top, rtRBtn.width, rtRBtn.height); + pParams->m_pGraphics->SaveGraphState(); + CFX_Color clrRBtnEdge(ArgbEncode(0xff, 205, 219, 243)); + pParams->m_pGraphics->SetStrokeColor(&clrRBtnEdge); + pParams->m_pGraphics->StrokePath(&path, pMatrix); + if ((pParams->m_dwStates & FWL_PARTSTATE_MCD_Pressed) == FWL_PARTSTATE_MCD_Pressed) { + CFX_Color clrRBtnFill(ArgbEncode(0xff, 174, 198, 242)); + pParams->m_pGraphics->SetFillColor(&clrRBtnFill); + pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); + } else { + CFX_Color clrRBtnFill(ArgbEncode(0xff, 227, 235, 249)); + pParams->m_pGraphics->SetFillColor(&clrRBtnFill); + pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); + } + path.Clear(); + path.MoveTo(rtRBtn.left + rtRBtn.Width() / 3, rtRBtn.top + rtRBtn.height / 4); + path.LineTo(rtRBtn.left + rtRBtn.Width() / 3 * 2, rtRBtn.top + rtRBtn.height / 2); + path.LineTo(rtRBtn.left + rtRBtn.Width() / 3, rtRBtn.bottom() - rtRBtn.height / 4); + CFX_Color clrFlag(ArgbEncode(0xff, 50, 104, 205)); + pParams->m_pGraphics->SetStrokeColor(&clrFlag); + pParams->m_pGraphics->StrokePath(&path, pMatrix); + pParams->m_pGraphics->RestoreGraphState(); + return TRUE; +} +FX_BOOL CFWL_MonthCalendarTP::DrawHSeperator(CFWL_ThemeBackground *pParams, CFX_Matrix *pMatrix) +{ + CFX_Path path; + path.Create(); + CFX_RectF rtHSep; + rtHSep = pParams->m_rtPart; + path.MoveTo(rtHSep.left, rtHSep.top + rtHSep.height / 2); + path.LineTo(rtHSep.right(), rtHSep.top + rtHSep.height / 2); + pParams->m_pGraphics->SaveGraphState(); + CFX_Color clrHSep(m_pThemeData->clrSeperator); + pParams->m_pGraphics->SetStrokeColor(&clrHSep); + pParams->m_pGraphics->StrokePath(&path, pMatrix); + pParams->m_pGraphics->RestoreGraphState(); + return TRUE; +} +FX_BOOL CFWL_MonthCalendarTP::DrawWeekNumSep(CFWL_ThemeBackground *pParams, CFX_Matrix *pMatrix) +{ + CFX_Path path; + path.Create(); + CFX_RectF rtWeekSep; + rtWeekSep = pParams->m_rtPart; + path.MoveTo(rtWeekSep.left, rtWeekSep.top); + path.LineTo(rtWeekSep.left, rtWeekSep.bottom()); + pParams->m_pGraphics->SaveGraphState(); + CFX_Color clrHSep(m_pThemeData->clrSeperator); + pParams->m_pGraphics->SetStrokeColor(&clrHSep); + pParams->m_pGraphics->StrokePath(&path, pMatrix); + pParams->m_pGraphics->RestoreGraphState(); + return TRUE; +} +FX_BOOL CFWL_MonthCalendarTP::DrawDatesInBK(CFWL_ThemeBackground *pParams, CFX_Matrix *pMatrix) +{ + pParams->m_pGraphics->SaveGraphState(); + if (pParams->m_dwStates & FWL_PARTSTATE_MCD_Selected) { + CFX_Path path; + path.Create(); + CFX_RectF rtSelDay; + rtSelDay = pParams->m_rtPart; + path.AddRectangle(rtSelDay.left, rtSelDay.top, rtSelDay.width, rtSelDay.height); + CFX_Color clrSelDayBK; + clrSelDayBK = m_pThemeData->clrDatesSelectedBK; + pParams->m_pGraphics->SetFillColor(&clrSelDayBK); + pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); + } else if (pParams->m_dwStates & FWL_PARTSTATE_MCD_Hovered) { + CFX_Path path; + path.Create(); + CFX_RectF rtSelDay; + rtSelDay = pParams->m_rtPart; + path.AddRectangle(rtSelDay.left, rtSelDay.top, rtSelDay.width, rtSelDay.height); + CFX_Color clrSelDayBK; + clrSelDayBK = m_pThemeData->clrDatesHoverBK; + pParams->m_pGraphics->SetFillColor(&clrSelDayBK); + pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); + } + pParams->m_pGraphics->RestoreGraphState(); + return FALSE; +} +FX_BOOL CFWL_MonthCalendarTP::DrawDatesInCircle(CFWL_ThemeBackground *pParams, CFX_Matrix *pMatrix) +{ + CFX_Path path; + path.Create(); + CFX_RectF rtSelDay; + rtSelDay = pParams->m_rtPart; + path.AddRectangle(rtSelDay.left, rtSelDay.top, rtSelDay.width, rtSelDay.height); + pParams->m_pGraphics->SaveGraphState(); + CFX_Color clrSelDayBK; + clrSelDayBK = m_pThemeData->clrDatesCircle; + pParams->m_pGraphics->SetStrokeColor(&clrSelDayBK); + pParams->m_pGraphics->StrokePath(&path, pMatrix); + pParams->m_pGraphics->RestoreGraphState(); + return TRUE; +} +FX_BOOL CFWL_MonthCalendarTP::DrawTodayCircle(CFWL_ThemeBackground *pParams, CFX_Matrix *pMatrix) +{ + CFX_Path path; + path.Create(); + CFX_RectF rtTodayCircle; + rtTodayCircle = pParams->m_rtPart; + path.AddRectangle(rtTodayCircle.left, rtTodayCircle.top, rtTodayCircle.width, rtTodayCircle.height); + pParams->m_pGraphics->SaveGraphState(); + CFX_Color clrTodayCircle; + clrTodayCircle = m_pThemeData->clrDatesCircle; + pParams->m_pGraphics->SetStrokeColor(&clrTodayCircle); + pParams->m_pGraphics->StrokePath(&path, pMatrix); + pParams->m_pGraphics->RestoreGraphState(); + return TRUE; +} +FWLTHEME_STATE CFWL_MonthCalendarTP::GetState(FX_DWORD dwFWLStates) +{ + if (dwFWLStates & FWL_PARTSTATE_MCD_Hovered) { + return FWLTHEME_STATE_Hover; + } else if (dwFWLStates & FWL_PARTSTATE_MCD_Pressed) { + return FWLTHEME_STATE_Pressed; + } + return FWLTHEME_STATE_Normal; +} +void CFWL_MonthCalendarTP::SetThemeData(FX_DWORD dwThemeID) +{ + if (dwThemeID == 0) { + m_pThemeData->clrCaption = ArgbEncode(0xff, 0, 153, 255); + m_pThemeData->clrSeperator = ArgbEncode(0xff, 141, 161, 239); + m_pThemeData->clrDatesHoverBK = ArgbEncode(0xff, 193, 211, 251); + m_pThemeData->clrDatesSelectedBK = ArgbEncode(0xff, 173, 188, 239); + m_pThemeData->clrDatesCircle = ArgbEncode(0xff, 103, 144, 209); + m_pThemeData->clrToday = ArgbEncode(0xff, 0, 0, 0); + m_pThemeData->clrBK = ArgbEncode(0xff, 255, 255, 255); + } else { + m_pThemeData->clrCaption = ArgbEncode(0xff, 128, 128, 0); + m_pThemeData->clrSeperator = ArgbEncode(0xff, 128, 128, 64); + m_pThemeData->clrDatesHoverBK = ArgbEncode(0xff, 217, 220, 191); + m_pThemeData->clrDatesSelectedBK = ArgbEncode(0xff, 204, 208, 183); + m_pThemeData->clrDatesCircle = ArgbEncode(0xff, 128, 128, 0); + m_pThemeData->clrToday = ArgbEncode(0xff, 0, 0, 0); + m_pThemeData->clrBK = ArgbEncode(0xff, 255, 255, 255); + } +} diff --git a/xfa/src/fwl/src/theme/pictureboxtp.cpp b/xfa/src/fwl/src/theme/pictureboxtp.cpp new file mode 100644 index 0000000000..919e786e29 --- /dev/null +++ b/xfa/src/fwl/src/theme/pictureboxtp.cpp @@ -0,0 +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 + +#include "../../../foxitlib.h" +CFWL_PictureBoxTP::CFWL_PictureBoxTP() +{ +} +CFWL_PictureBoxTP::~CFWL_PictureBoxTP() +{ +} +FX_BOOL CFWL_PictureBoxTP::IsValidWidget(IFWL_Widget *pWidget) +{ + _FWL_RETURN_VALUE_IF_FAIL(pWidget, FALSE); + return pWidget->GetClassID() == FWL_CLASSHASH_PictureBox; +} +FX_BOOL CFWL_PictureBoxTP::DrawBackground(CFWL_ThemeBackground *pParams) +{ + _FWL_RETURN_VALUE_IF_FAIL(pParams, FALSE); + switch (pParams->m_iPart) { + case FWL_PART_PTB_Border: { + DrawBorder(pParams->m_pGraphics, &pParams->m_rtPart, &pParams->m_matrix); + break; + } + case FWL_PART_PTB_Edge: { + DrawEdge(pParams->m_pGraphics, pParams->m_pWidget->GetStyles(), &pParams->m_rtPart, &pParams->m_matrix); + break; + } + default: { + } + } + return TRUE; +} diff --git a/xfa/src/fwl/src/theme/pushbuttontp.cpp b/xfa/src/fwl/src/theme/pushbuttontp.cpp new file mode 100644 index 0000000000..13c5eef567 --- /dev/null +++ b/xfa/src/fwl/src/theme/pushbuttontp.cpp @@ -0,0 +1,165 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#define PUSHBUTTON_SIZE_Corner 2 +CFWL_PushButtonTP::CFWL_PushButtonTP() +{ + m_pThemeData = FX_NEW PBThemeData; + SetThemeData(0); +} +CFWL_PushButtonTP::~CFWL_PushButtonTP() +{ + if (m_pThemeData) { + delete m_pThemeData; + } +} +FX_BOOL CFWL_PushButtonTP::IsValidWidget(IFWL_Widget *pWidget) +{ + return pWidget->GetClassID() == FWL_CLASSHASH_PushButton; +} +FX_DWORD CFWL_PushButtonTP::SetThemeID(IFWL_Widget *pWidget, FX_DWORD dwThemeID, FX_BOOL bChildren ) +{ + SetThemeData(FWL_GetThemeColor(dwThemeID)); + return CFWL_WidgetTP::SetThemeID(pWidget, dwThemeID, bChildren); +} +FX_BOOL CFWL_PushButtonTP::DrawBackground(CFWL_ThemeBackground *pParams) +{ + switch(pParams->m_iPart) { + case FWL_PART_PSB_Border: { + DrawBorder(pParams->m_pGraphics, &pParams->m_rtPart, &pParams->m_matrix); + break; + } + case FWL_PART_PSB_Edge: { + DrawEdge(pParams->m_pGraphics, pParams->m_pWidget->GetStyles(), &pParams->m_rtPart, &pParams->m_matrix); + break; + } + case FWL_PART_PSB_Background: { + CFX_RectF &rect = pParams->m_rtPart; + FX_FLOAT fRight = rect.right(); + FX_FLOAT fBottom = rect.bottom(); + CFX_Path strokePath; + strokePath.Create(); + strokePath.MoveTo(rect.left + PUSHBUTTON_SIZE_Corner, rect.top); + strokePath.LineTo(fRight - PUSHBUTTON_SIZE_Corner, rect.top); + strokePath.LineTo(fRight, rect.top + PUSHBUTTON_SIZE_Corner); + strokePath.LineTo(fRight, fBottom - PUSHBUTTON_SIZE_Corner); + strokePath.LineTo(fRight - PUSHBUTTON_SIZE_Corner, fBottom); + strokePath.LineTo(rect.left + PUSHBUTTON_SIZE_Corner, fBottom); + strokePath.LineTo(rect.left, fBottom - PUSHBUTTON_SIZE_Corner); + strokePath.LineTo(rect.left, rect.top + PUSHBUTTON_SIZE_Corner); + strokePath.LineTo(rect.left + PUSHBUTTON_SIZE_Corner, rect.top); + CFX_Path fillPath; + fillPath.Create(); + fillPath.AddSubpath(&strokePath); + CFX_Graphics *pGraphics = pParams->m_pGraphics; + pGraphics->SaveGraphState(); + CFX_RectF rtInner(rect); + rtInner.Deflate(PUSHBUTTON_SIZE_Corner + 1, + PUSHBUTTON_SIZE_Corner + 1, + PUSHBUTTON_SIZE_Corner, + PUSHBUTTON_SIZE_Corner); + fillPath.AddRectangle(rtInner.left, rtInner.top, rtInner.width, rtInner.height); + FX_INT32 iColor = GetColorID(pParams->m_dwStates); + DrawAxialShading(pGraphics, + rect.left + PUSHBUTTON_SIZE_Corner, + rect.top, + rect.left + PUSHBUTTON_SIZE_Corner, + rect.bottom(), + m_pThemeData->clrStart[iColor], + m_pThemeData->clrEnd[iColor], + &fillPath, + FXFILL_ALTERNATE, + &pParams->m_matrix); + CFX_Color crStroke(m_pThemeData->clrBorder[iColor]); + pGraphics->SetStrokeColor(&crStroke); + pGraphics->StrokePath(&strokePath, &pParams->m_matrix); + fillPath.Clear(); + fillPath.AddRectangle(rtInner.left, rtInner.top, rtInner.width, rtInner.height); + CFX_Color crFill(m_pThemeData->clrFill[iColor]); + pGraphics->SetFillColor(&crFill); + pGraphics->FillPath(&fillPath, FXFILL_WINDING, &pParams->m_matrix); + if (pParams->m_dwStates & FWL_PARTSTATE_PSB_Focused) { + rtInner.Inflate(1, 1, 0, 0); + DrawFocus(pGraphics, &rtInner, &pParams->m_matrix); + } + pGraphics->RestoreGraphState(); + break; + } + default: { + } + } + return TRUE; +} +FX_LPVOID CFWL_PushButtonTP::GetCapacity(CFWL_ThemePart *pThemePart, FX_DWORD dwCapacity) +{ + if (dwCapacity == FWL_WGTCAPACITY_PSB_Margin) { + m_fValue = 0; + return &m_fValue; + } + return CFWL_WidgetTP::GetCapacity(pThemePart, dwCapacity); +} +FWL_ERR CFWL_PushButtonTP::Initialize() +{ + InitTTO(); + return CFWL_WidgetTP::Initialize(); +} +FWL_ERR CFWL_PushButtonTP::Finalize() +{ + FinalizeTTO(); + return CFWL_WidgetTP::Finalize(); +} +void CFWL_PushButtonTP::SetThemeData(FX_DWORD dwID) +{ + FX_ARGB *pData = (FX_ARGB*)&*m_pThemeData; + if (dwID) { + m_pThemeData->clrBorder[0] = ArgbEncode(255, 55, 98, 6); + m_pThemeData->clrBorder[1] = ArgbEncode(255, 55, 98, 6); + m_pThemeData->clrBorder[2] = ArgbEncode(255, 55, 98, 6); + m_pThemeData->clrBorder[3] = ArgbEncode(255, 55, 98, 6); + m_pThemeData->clrBorder[4] = ArgbEncode(255, 172, 168, 153); + m_pThemeData->clrStart[0] = ArgbEncode(255, 255, 255, 246); + m_pThemeData->clrStart[1] = ArgbEncode(255, 223, 205, 180); + m_pThemeData->clrStart[2] = ArgbEncode(255, 252, 197, 149); + m_pThemeData->clrStart[3] = ArgbEncode(255, 194, 209, 143); + m_pThemeData->clrStart[4] = ArgbEncode(255, 216, 216, 216); + m_pThemeData->clrEnd[0] = ArgbEncode(255, 227, 209, 184); + m_pThemeData->clrEnd[1] = ArgbEncode(255, 248, 244, 228); + m_pThemeData->clrEnd[2] = ArgbEncode(255, 207, 114, 37); + m_pThemeData->clrEnd[3] = ArgbEncode(255, 144, 193, 84); + m_pThemeData->clrEnd[4] = ArgbEncode(255, 172, 168, 153); + m_pThemeData->clrFill[0] = ArgbEncode(255, 255, 255, 255); + m_pThemeData->clrFill[1] = ArgbEncode(255, 226, 225, 218); + m_pThemeData->clrFill[2] = ArgbEncode(255, 255, 255, 255); + m_pThemeData->clrFill[3] = ArgbEncode(255, 255, 255, 255); + m_pThemeData->clrFill[4] = ArgbEncode(255, 245, 244, 234); + } else { + m_pThemeData->clrBorder[0] = ArgbEncode(255, 0, 60, 116); + m_pThemeData->clrBorder[1] = ArgbEncode(255, 0, 60, 116); + m_pThemeData->clrBorder[2] = ArgbEncode(255, 0, 60, 116); + m_pThemeData->clrBorder[3] = ArgbEncode(255, 0, 60, 116); + m_pThemeData->clrBorder[4] = ArgbEncode(255, 201, 199, 186); + m_pThemeData->clrStart[0] = ArgbEncode(255, 255, 255, 255); + m_pThemeData->clrStart[1] = ArgbEncode(255, 209, 204, 193); + m_pThemeData->clrStart[2] = ArgbEncode(255, 255, 240, 207); + m_pThemeData->clrStart[3] = ArgbEncode(255, 206, 231, 255); + m_pThemeData->clrStart[4] = ArgbEncode(255, 245, 244, 234); + m_pThemeData->clrEnd[0] = ArgbEncode(255, 214, 208, 197); + m_pThemeData->clrEnd[1] = ArgbEncode(255, 242, 241, 238); + m_pThemeData->clrEnd[2] = ArgbEncode(255, 229, 151, 0); + m_pThemeData->clrEnd[3] = ArgbEncode(255, 105, 130, 238); + m_pThemeData->clrEnd[4] = ArgbEncode(255, 245, 244, 234); + m_pThemeData->clrFill[0] = ArgbEncode(255, 255, 255, 255); + m_pThemeData->clrFill[1] = ArgbEncode(255, 226, 225, 218); + m_pThemeData->clrFill[2] = ArgbEncode(255, 255, 255, 255); + m_pThemeData->clrFill[3] = ArgbEncode(255, 255, 255, 255); + m_pThemeData->clrFill[4] = ArgbEncode(255, 245, 244, 234); + } +} +FX_INT32 CFWL_PushButtonTP::GetColorID(FX_DWORD dwStates) +{ + return dwStates &= FWL_PARTSTATE_PSB_Mask; +} diff --git a/xfa/src/fwl/src/theme/scrollbartp.cpp b/xfa/src/fwl/src/theme/scrollbartp.cpp new file mode 100644 index 0000000000..a90dafa17e --- /dev/null +++ b/xfa/src/fwl/src/theme/scrollbartp.cpp @@ -0,0 +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 "../../../foxitlib.h" +#define FWL_SCROLL_PawLen 12.5f +CFWL_ScrollBarTP::CFWL_ScrollBarTP() +{ + m_pThemeData = FX_NEW SBThemeData; + SetThemeData(0); +} +CFWL_ScrollBarTP::~CFWL_ScrollBarTP() +{ + if (m_pThemeData) { + delete m_pThemeData; + m_pThemeData = NULL; + } +} +FX_BOOL CFWL_ScrollBarTP::IsValidWidget(IFWL_Widget *pWidget) +{ + _FWL_RETURN_VALUE_IF_FAIL(pWidget, FALSE); + return pWidget->GetClassID() == FWL_CLASSHASH_ScrollBar; +} +FX_LPVOID CFWL_ScrollBarTP::GetCapacity(CFWL_ThemePart *pThemePart, FX_DWORD dwCapacity) +{ + if (dwCapacity == FWL_CAPACITY_SCB_Size) { + m_fValue = 5; + return &m_fValue; + } + return CFWL_WidgetTP::GetCapacity(pThemePart, dwCapacity); +} +FX_DWORD CFWL_ScrollBarTP::SetThemeID(IFWL_Widget *pWidget, FX_DWORD dwThemeID, FX_BOOL bChildren ) +{ + if (m_pThemeData) { + SetThemeData(FWL_GetThemeColor(dwThemeID)); + } + return CFWL_WidgetTP::SetThemeID(pWidget, dwThemeID, bChildren); +} +FX_BOOL CFWL_ScrollBarTP::DrawBackground(CFWL_ThemeBackground *pParams) +{ + _FWL_RETURN_VALUE_IF_FAIL(pParams, FALSE); + IFWL_Widget *pWidget = pParams->m_pWidget; + FX_DWORD dwStyleEx = pWidget->GetStylesEx(); + FWLTHEME_STATE eState = FWLTHEME_STATE_Normal; + switch (pParams->m_dwStates & 0x03) { + case FWL_PARTSTATE_SCB_Hovered: { + eState = FWLTHEME_STATE_Hover; + break; + } + case FWL_PARTSTATE_SCB_Pressed: { + eState = FWLTHEME_STATE_Pressed; + break; + } + case FWL_PARTSTATE_SCB_Disabled: { + eState = FWLTHEME_STATE_Disabale; + break; + } + } + CFX_Graphics *pGraphics = pParams->m_pGraphics; + CFX_RectF *pRect = &pParams->m_rtPart; + FX_BOOL bVert = pWidget->GetStylesEx(); + switch (pParams->m_iPart) { + case FWL_PART_SCB_ForeArrow: { + DrawMaxMinBtn(pGraphics, pRect, bVert ? FWLTHEME_DIRECTION_Up : FWLTHEME_DIRECTION_Left, eState, &pParams->m_matrix); + break; + } + case FWL_PART_SCB_BackArrow: { + DrawMaxMinBtn(pGraphics, pRect, bVert ? FWLTHEME_DIRECTION_Down : FWLTHEME_DIRECTION_Right, eState, &pParams->m_matrix); + break; + } + case FWL_PART_SCB_Thumb: { + DrawThumbBtn(pGraphics, pRect, bVert, eState, TRUE, &pParams->m_matrix); + break; + } + case FWL_PART_SCB_LowerTrack: { + DrawTrack(pGraphics, pRect, bVert, eState, TRUE, &pParams->m_matrix); + break; + } + case FWL_PART_SCB_UpperTrack: { + DrawTrack(pGraphics, pRect, bVert, eState, FALSE, &pParams->m_matrix); + break; + } + default: { + } + } + return TRUE; +} +#ifdef THEME_XPSimilar +void CFWL_ScrollBarTP::DrawThumbBtn(CFX_Graphics *pGraphics, const CFX_RectF *pRect, FX_BOOL bVert, FWLTHEME_STATE eState, FX_BOOL bPawButton, CFX_Matrix *pMatrix ) +{ + if (eState < FWLTHEME_STATE_Normal || eState > FWLTHEME_STATE_Disabale) { + return; + } + CFX_Path path; + path.Create(); + CFX_RectF rect(*pRect); + if (bVert) { + rect.Deflate(1, 0); + if (rect.IsEmpty(0.1f)) { + return; + } + path.AddRectangle(rect.left, rect.top, rect.width, rect.height); + DrawAxialShading(pGraphics, + rect.left, + rect.top, + rect.right(), + rect.top, + m_pThemeData->clrBtnBK[eState - 1][0], + m_pThemeData->clrBtnBK[eState - 1][1], + &path, + FXFILL_WINDING, + pMatrix); + CFX_Color rcStroke; + rcStroke.Set(m_pThemeData->clrBtnBorder[eState - 1]); + pGraphics->SaveGraphState(); + pGraphics->SetStrokeColor(&rcStroke); + pGraphics->StrokePath(&path, pMatrix); + pGraphics->RestoreGraphState(); + } else { + rect.Deflate(0, 1); + if (rect.IsEmpty(0.1f)) { + return; + } + path.AddRectangle(rect.left, rect.top, rect.width, rect.height); + DrawAxialShading(pGraphics, + rect.left, + rect.top, + rect.left, + rect.bottom(), + m_pThemeData->clrBtnBK[eState - 1][0], + m_pThemeData->clrBtnBK[eState - 1][1], + &path, + FXFILL_WINDING, + pMatrix); + CFX_Color rcStroke; + rcStroke.Set(m_pThemeData->clrBtnBorder[eState - 1]); + pGraphics->SaveGraphState(); + pGraphics->SetStrokeColor(&rcStroke); + pGraphics->StrokePath(&path, pMatrix); + pGraphics->RestoreGraphState(); + } +} +void CFWL_ScrollBarTP::DrawPaw(CFX_Graphics *pGraphics, const CFX_RectF *pRect, FX_BOOL bVert, FWLTHEME_STATE eState, CFX_Matrix *pMatrix ) +{ + CFX_Path path; + path.Create(); + if (bVert) { + FX_FLOAT fPawLen = FWL_SCROLL_PawLen; + if (pRect->width / 2 <= fPawLen) { + fPawLen = (pRect->width - 6) / 2 ; + } + FX_FLOAT fX = pRect->left + pRect->width / 4; + FX_FLOAT fY = pRect->top + pRect->height / 2; + path.MoveTo(fX, fY - 4); + path.LineTo(fX + fPawLen, fY - 4); + path.MoveTo(fX, fY - 2); + path.LineTo(fX + fPawLen, fY - 2); + path.MoveTo(fX , fY); + path.LineTo(fX + fPawLen, fY); + path.MoveTo(fX, fY + 2); + path.LineTo(fX + fPawLen, fY + 2); + CFX_Color clrLight(m_pThemeData->clrPawColorLight[eState - 1]); + pGraphics->SetLineWidth(1); + pGraphics->SetStrokeColor(&clrLight); + pGraphics->StrokePath(&path); + fX++; + path.Clear(); + path.MoveTo(fX, fY - 3); + path.LineTo(fX + fPawLen, fY - 3); + path.MoveTo(fX, fY - 1); + path.LineTo(fX + fPawLen, fY - 1); + path.MoveTo(fX, fY + 1); + path.LineTo(fX + fPawLen, fY + 1); + path.MoveTo(fX, fY + 3); + path.LineTo(fX + fPawLen, fY + 3); + CFX_Color clrDark(m_pThemeData->clrPawColorDark[eState - 1]); + pGraphics->SetLineWidth(1); + pGraphics->SetStrokeColor(&clrDark); + pGraphics->StrokePath(&path, pMatrix); + } else { + FX_FLOAT fPawLen = FWL_SCROLL_PawLen; + if (pRect->height / 2 <= fPawLen) { + fPawLen = (pRect->height - 6) / 2; + } + FX_FLOAT fX = pRect->left + pRect->width / 2; + FX_FLOAT fY = pRect->top + pRect->height / 4; + path.MoveTo(fX - 4, fY); + path.LineTo(fX - 4, fY + fPawLen); + path.MoveTo(fX - 2, fY); + path.LineTo(fX - 2, fY + fPawLen); + path.MoveTo(fX, fY); + path.LineTo(fX, fY + fPawLen); + path.MoveTo(fX + 2, fY); + path.LineTo(fX + 2, fY + fPawLen); + CFX_Color clrLight(m_pThemeData->clrPawColorLight[eState - 1]); + pGraphics->SetLineWidth(1); + pGraphics->SetStrokeColor(&clrLight); + pGraphics->StrokePath(&path, pMatrix); + fY ++; + path.Clear(); + path.MoveTo(fX - 3, fY); + path.LineTo(fX - 3, fY + fPawLen); + path.MoveTo(fX - 1, fY); + path.LineTo(fX - 1, fY + fPawLen); + path.MoveTo(fX + 1, fY); + path.LineTo(fX + 1, fY + fPawLen); + path.MoveTo(fX + 3, fY); + path.LineTo(fX + 3, fY + fPawLen); + CFX_Color clrDark(m_pThemeData->clrPawColorDark[eState - 1]); + pGraphics->SetLineWidth(1); + pGraphics->SetStrokeColor(&clrDark); + pGraphics->StrokePath(&path, pMatrix); + } +} +void CFWL_ScrollBarTP::DrawTrack(CFX_Graphics *pGraphics, const CFX_RectF *pRect, FX_BOOL bVert, FWLTHEME_STATE eState, FX_BOOL bLowerTrack, CFX_Matrix *pMatrix ) +{ + if (eState < FWLTHEME_STATE_Normal || eState > FWLTHEME_STATE_Disabale) { + return; + } + pGraphics->SaveGraphState(); + CFX_Color colorLine(ArgbEncode(255, 238, 237, 229)); + CFX_Path path; + path.Create(); + FX_FLOAT fRight = pRect->right(); + FX_FLOAT fBottom = pRect->bottom(); + if (bVert) { + path.AddRectangle(pRect->left, pRect->top, 1, pRect->height); + path.AddRectangle(fRight - 1, pRect->top, 1, pRect->height); + } else { + path.AddRectangle(pRect->left, pRect->top, pRect->width, 1); + path.AddRectangle(pRect->left, fBottom - 1, pRect->width, 1); + } + pGraphics->SetFillColor(&colorLine); + pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); + path.Clear(); + path.AddRectangle(pRect->left + 1, pRect->top, pRect->width - 2, pRect->height); + FX_FLOAT x1 = bVert ? pRect->left + 1 : pRect->left; + FX_FLOAT y1 = bVert ? pRect->top : pRect->top + 1; + FX_FLOAT x2 = bVert ? fRight - 1 : pRect->left; + FX_FLOAT y2 = bVert ? pRect->top : fBottom - 1; + pGraphics->RestoreGraphState(); + DrawAxialShading(pGraphics, + x1, y1, x2, y2, + m_pThemeData->clrTrackBKStart, + m_pThemeData->clrTrackBKEnd, + &path, + FXFILL_WINDING, + pMatrix); +} +void CFWL_ScrollBarTP::DrawMaxMinBtn(CFX_Graphics *pGraphics, const CFX_RectF *pRect, FWLTHEME_DIRECTION eDict, FWLTHEME_STATE eState, CFX_Matrix *pMatrix ) +{ + DrawTrack(pGraphics, + pRect, + eDict == FWLTHEME_DIRECTION_Up || eDict == FWLTHEME_DIRECTION_Down, + eState, + TRUE, + pMatrix); + CFX_RectF rtArrowBtn(*pRect); + rtArrowBtn.Deflate(1, 1, 1, 1); + DrawArrowBtn(pGraphics, &rtArrowBtn, eDict, eState, pMatrix); +} +#else +void CFWL_ScrollBarTP::DrawThumbBtn(CFX_Graphics *pGraphics, const CFX_RectF *pRect, FX_BOOL bVert, FWLTHEME_STATE eState, FX_BOOL bPawButton, CFX_Matrix *pMatrix ) +{ + if (pRect->IsEmpty()) { + return; + } + CFX_RectF rtThumb(*pRect); + FX_FLOAT fWidth = 2; + Draw3DRect(pGraphics, FWLTHEME_EDGE_Raised, fWidth, pRect, FWLTHEME_COLOR_EDGELT1, FWLTHEME_COLOR_EDGELT2, FWLTHEME_COLOR_EDGERB1, FWLTHEME_COLOR_EDGERB2, pMatrix); + CFX_Path path; + path.Create(); + path.AddRectangle(pRect->left + fWidth, pRect->top + fWidth, pRect->width - 2 * fWidth, pRect->height - 2 * fWidth); + pGraphics->SaveGraphState(); + CFX_Color crFill(FWLTHEME_COLOR_Background); + pGraphics->SetFillColor(&crFill); + pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); + pGraphics->RestoreGraphState(); +} +void CFWL_ScrollBarTP::DrawTrack(CFX_Graphics *pGraphics, const CFX_RectF *pRect, FX_BOOL bVert, FWLTHEME_STATE eState, FX_BOOL bLowerTrack, CFX_Matrix *pMatrix ) +{ + if (pRect->IsEmpty()) { + return; + } + CFX_Path path; + path.Create(); + path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height); + pGraphics->SaveGraphState(); + CFX_Color clrFill(0xFFF0F0F0); + pGraphics->SetFillColor(&clrFill); + pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); + pGraphics->RestoreGraphState(); +} +void CFWL_ScrollBarTP::DrawMaxMinBtn(CFX_Graphics *pGraphics, const CFX_RectF *pRect, FWLTHEME_DIRECTION eDict, FWLTHEME_STATE eState, CFX_Matrix *pMatrix ) +{ + CFX_RectF rtThumb(*pRect); + FX_FLOAT fWidth = eState == FWLTHEME_STATE_Pressed ? 1.0f : 2.0f; + FWLTHEME_EDGE eType = eState == FWLTHEME_STATE_Pressed ? FWLTHEME_EDGE_Flat : FWLTHEME_EDGE_Raised; + Draw3DRect(pGraphics, eType, fWidth, pRect, FWLTHEME_COLOR_EDGELT1, FWLTHEME_COLOR_EDGELT2, FWLTHEME_COLOR_EDGERB1, FWLTHEME_COLOR_EDGERB2, pMatrix); + CFX_Path path; + path.Create(); + path.AddRectangle(pRect->left + fWidth, pRect->top + fWidth, pRect->width - 2 * fWidth, pRect->height - 2 * fWidth); + pGraphics->SaveGraphState(); + CFX_Color crFill(FWLTHEME_COLOR_Background); + pGraphics->SetFillColor(&crFill); + pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); + pGraphics->RestoreGraphState(); + DrawArrow(pGraphics, + pRect, + eDict, + eState == FWLTHEME_STATE_Disabale ? 0xFFA0A0A0 : 0xFF000000, + eState == FWLTHEME_STATE_Pressed, + pMatrix); +} +#endif +void CFWL_ScrollBarTP::SetThemeData(FX_DWORD dwID) +{ + m_pThemeData->clrPawColorLight[3] = ArgbEncode(0xff, 208, 223, 172); + m_pThemeData->clrPawColorDark[3] = ArgbEncode(0xff, 140, 157, 115); + m_pThemeData->clrBtnBK[3][0] = ArgbEncode(0xff, 164, 180, 139); + m_pThemeData->clrBtnBK[3][1] = ArgbEncode(0xff, 141, 157, 115); + m_pThemeData->clrBtnBorder[3] = ArgbEncode(0xff, 236, 233, 216); + if (dwID) { + m_pThemeData->clrPawColorLight[0] = ArgbEncode(0xff, 208, 223, 172); + m_pThemeData->clrPawColorDark[0] = ArgbEncode(0xff, 140, 157, 115); + m_pThemeData->clrBtnBK[0][0] = ArgbEncode(0xff, 162, 179, 141); + m_pThemeData->clrBtnBK[0][1] = ArgbEncode(0xff, 149, 167, 117); + m_pThemeData->clrBtnBorder[0] = ArgbEncode(0xff, 142, 153, 125); + m_pThemeData->clrPawColorLight[1] = ArgbEncode(0xff, 235, 245, 212); + m_pThemeData->clrPawColorDark[1] = ArgbEncode(0xff, 182, 198, 142); + m_pThemeData->clrBtnBK[1][0] = ArgbEncode(0xff, 200, 213, 170); + m_pThemeData->clrBtnBK[1][1] = ArgbEncode(0xff, 195, 208, 150); + m_pThemeData->clrBtnBorder[1] = ArgbEncode(0xff, 189, 203, 150); + m_pThemeData->clrPawColorLight[2] = ArgbEncode(0xff, 208, 223, 172); + m_pThemeData->clrPawColorDark[2] = ArgbEncode(0xff, 140, 157, 115); + m_pThemeData->clrBtnBK[2][0] = ArgbEncode(0xff, 164, 180, 139); + m_pThemeData->clrBtnBK[2][1] = ArgbEncode(0xff, 141, 157, 115); + m_pThemeData->clrBtnBorder[2] = ArgbEncode(0xff, 128, 146, 102); + m_pThemeData->clrTrackBKStart = ArgbEncode(0xff, 243, 241, 236); + m_pThemeData->clrTrackBKEnd = ArgbEncode(0xff, 254, 254, 251); + } else { + m_pThemeData->clrPawColorLight[0] = ArgbEncode(0xff, 238, 244, 254); + m_pThemeData->clrPawColorDark[0] = ArgbEncode(0xff, 140, 176, 248); + m_pThemeData->clrBtnBK[0][0] = ArgbEncode(0xff, 197, 213, 252); + m_pThemeData->clrBtnBK[0][1] = ArgbEncode(0xff, 182, 205, 251); + m_pThemeData->clrBtnBorder[0] = ArgbEncode(0xff, 148, 176, 221); + m_pThemeData->clrPawColorLight[1] = ArgbEncode(0xff, 252, 253, 255); + m_pThemeData->clrPawColorDark[1] = ArgbEncode(0xff, 156, 197, 255); + m_pThemeData->clrBtnBK[1][0] = ArgbEncode(0xff, 216, 232, 255); + m_pThemeData->clrBtnBK[1][1] = ArgbEncode(0xff, 204, 225, 255); + m_pThemeData->clrBtnBorder[1] = ArgbEncode(0xff, 218, 230, 254); + m_pThemeData->clrPawColorLight[2] = ArgbEncode(0xff, 207, 221, 253); + m_pThemeData->clrPawColorDark[2] = ArgbEncode(0xff, 131, 158, 216); + m_pThemeData->clrBtnBK[2][0] = ArgbEncode(0xff, 167, 190, 245); + m_pThemeData->clrBtnBK[2][1] = ArgbEncode(0xff, 146, 179, 249); + m_pThemeData->clrBtnBorder[2] = ArgbEncode(0xff, 124, 159, 211); + m_pThemeData->clrTrackBKStart = ArgbEncode(0xff, 243, 241, 236); + m_pThemeData->clrTrackBKEnd = ArgbEncode(0xff, 254, 254, 251); + } +} diff --git a/xfa/src/fwl/src/theme/widgettp.cpp b/xfa/src/fwl/src/theme/widgettp.cpp new file mode 100644 index 0000000000..5e186b74ab --- /dev/null +++ b/xfa/src/fwl/src/theme/widgettp.cpp @@ -0,0 +1,827 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +static void FWL_SetChildThemeID(IFWL_Widget *pParent, FX_DWORD dwThemeID) +{ + IFWL_WidgetMgr *pWidgetMgr = FWL_GetWidgetMgr(); + IFWL_Widget *pChild = pWidgetMgr->GetWidget(pParent, FWL_WGTRELATION_FirstChild); + while (pChild) { + IFWL_ThemeProvider *pTheme = pChild->GetThemeProvider(); + if (pTheme) { + pTheme->SetThemeID(pChild, dwThemeID, FALSE); + } + FWL_SetChildThemeID(pChild, dwThemeID); + pChild = pWidgetMgr->GetWidget(pChild, FWL_WGTRELATION_NextSibling); + } +} +FX_BOOL CFWL_WidgetTP::IsValidWidget(IFWL_Widget *pWidget) +{ + return FALSE; +} +FX_DWORD CFWL_WidgetTP::GetThemeID(IFWL_Widget *pWidget) +{ + return m_dwThemeID; +} +FX_DWORD CFWL_WidgetTP::SetThemeID(IFWL_Widget *pWidget, FX_DWORD dwThemeID, FX_BOOL bChildren ) +{ + FX_DWORD dwOld = m_dwThemeID; + m_dwThemeID = dwThemeID; + if (CFWL_ArrowData::IsInstance()) { + CFWL_ArrowData::GetInstance()->SetColorData(FWL_GetThemeColor(dwThemeID)); + } + if (bChildren) { + FWL_SetChildThemeID(pWidget, dwThemeID); + } + return dwOld; +} +FWL_ERR CFWL_WidgetTP::GetThemeMatrix(IFWL_Widget *pWidget, CFX_Matrix &matrix) +{ + matrix.Set(_ctm.a, _ctm.b, _ctm.c, _ctm.d, _ctm.e, _ctm.f); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_WidgetTP::SetThemeMatrix(IFWL_Widget *pWidget, const CFX_Matrix &matrix) +{ + _ctm.Set(matrix.a, matrix.b, matrix.c, matrix.d, matrix.e, matrix.f); + return FWL_ERR_Succeeded; +} +FX_BOOL CFWL_WidgetTP::DrawBackground(CFWL_ThemeBackground *pParams) +{ + return TRUE; +} +FX_BOOL CFWL_WidgetTP::DrawText(CFWL_ThemeText *pParams) +{ + if (!m_pTextOut) { + InitTTO(); + } + FX_INT32 iLen = pParams->m_wsText.GetLength(); + _FWL_RETURN_VALUE_IF_FAIL(iLen > 0, FALSE) + CFX_Graphics *pGraphics = pParams->m_pGraphics; + m_pTextOut->SetRenderDevice(pGraphics->GetRenderDevice()); + m_pTextOut->SetStyles(pParams->m_dwTTOStyles); + m_pTextOut->SetAlignment(pParams->m_iTTOAlign); + CFX_Matrix *pMatrix = &pParams->m_matrix; + pMatrix->Concat(*pGraphics->GetMatrix()); + m_pTextOut->SetMatrix(*pMatrix); + m_pTextOut->DrawLogicText(pParams->m_wsText, iLen, pParams->m_rtPart); + return TRUE; +} +FX_LPVOID CFWL_WidgetTP::GetCapacity(CFWL_ThemePart *pThemePart, FX_DWORD dwCapacity) +{ + switch(dwCapacity) { + case FWL_WGTCAPACITY_CXBorder: { + m_fValue = FWLTHEME_CAPACITY_CXBorder; + break; + } + case FWL_WGTCAPACITY_CYBorder: { + m_fValue = FWLTHEME_CAPACITY_CYBorder; + break; + } + case FWL_WGTCAPACITY_EdgeFlat: { + m_fValue = FWLTHEME_CAPACITY_EdgeFlat; + break; + } + case FWL_WGTCAPACITY_EdgeRaised: { + m_fValue = FWLTHEME_CAPACITY_EdgeRaised; + break; + } + case FWL_WGTCAPACITY_EdgeSunken: { + m_fValue = FWLTHEME_CAPACITY_EdgeSunken; + break; + } + case FWL_WGTCAPACITY_FontSize: { + m_fValue = FWLTHEME_CAPACITY_FontSize; + break; + } + case FWL_WGTCAPACITY_TextColor: { + m_dwValue = FWLTHEME_CAPACITY_TextColor; + return &m_dwValue; + } + case FWL_WGTCAPACITY_ScrollBarWidth: { + m_fValue = FWLTHEME_CAPACITY_ScrollBarWidth; + break; + } + case FWL_WGTCAPACITY_Font: { + return m_pFDEFont; + } + case FWL_WGTCAPACITY_TextSelColor: { + m_dwValue = (m_dwThemeID == 0) ? FWLTHEME_CAPACITY_TextSelColor : FWLTHEME_COLOR_Green_BKSelected; + return &m_dwValue; + } + case FWL_WGTCAPACITY_LineHeight: { + m_fValue = FWLTHEME_CAPACITY_LineHeight; + break; + } + case FWL_WGTCAPACITY_UIMargin: { + m_rtMargin.Set(0, 0, 0, 0); + return &m_rtMargin; + } + default: { + return NULL; + } + } + return &m_fValue; +} +FX_BOOL CFWL_WidgetTP::IsCustomizedLayout(IFWL_Widget *pWidget) +{ + return FWL_GetThemeLayout(m_dwThemeID); +} +FWL_ERR CFWL_WidgetTP::GetPartRect(CFWL_ThemePart *pThemePart, CFX_RectF &rect) +{ + return FWL_ERR_Succeeded; +} +FX_BOOL CFWL_WidgetTP::IsInPart(CFWL_ThemePart *pThemePart, FX_FLOAT fx, FX_FLOAT fy) +{ + return TRUE; +} +FX_BOOL CFWL_WidgetTP::CalcTextRect(CFWL_ThemeText *pParams, CFX_RectF &rect) +{ + _FWL_RETURN_VALUE_IF_FAIL(pParams, FALSE); + _FWL_RETURN_VALUE_IF_FAIL(m_pTextOut, FALSE); + m_pTextOut->SetAlignment(pParams->m_iTTOAlign); + m_pTextOut->SetStyles(pParams->m_dwTTOStyles | FDE_TTOSTYLE_ArabicContext); + m_pTextOut->CalcLogicSize(pParams->m_wsText, pParams->m_wsText.GetLength(), rect); + return TRUE; +} +FWL_ERR CFWL_WidgetTP::Initialize() +{ + m_dwThemeID = 0; + _ctm.Reset(); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_WidgetTP::Finalize() +{ + if(!m_pTextOut) { + FinalizeTTO(); + } + return FWL_ERR_Succeeded; +} +CFWL_WidgetTP::~CFWL_WidgetTP() +{ +} +FWL_ERR CFWL_WidgetTP::SetFont(IFWL_Widget *pWidget, FX_LPCWSTR strFont, FX_FLOAT fFontSize, FX_ARGB rgbFont) +{ + if (!m_pTextOut) { + return FWL_ERR_Succeeded; + } + m_pFDEFont = FWL_GetFontManager()->FindFont(strFont, 0, 0); + m_pTextOut->SetFont(m_pFDEFont); + m_pTextOut->SetFontSize(fFontSize); + m_pTextOut->SetTextColor(rgbFont); + return FWL_ERR_Succeeded; +} +FWL_ERR CFWL_WidgetTP::SetFont(IFWL_Widget *pWidget, IFX_Font *pFont, FX_FLOAT fFontSize, FX_ARGB rgbFont) +{ + if (!m_pTextOut) { + return FWL_ERR_Succeeded; + } + m_pTextOut->SetFont(pFont); + m_pTextOut->SetFontSize(fFontSize); + m_pTextOut->SetTextColor(rgbFont); + return FWL_ERR_Succeeded; +} +IFX_Font* CFWL_WidgetTP::GetFont(IFWL_Widget *pWidget) +{ + return m_pFDEFont; +} +CFWL_WidgetTP::CFWL_WidgetTP() + : m_dwRefCount(1) + , m_pTextOut(NULL) + , m_pFDEFont(NULL) + , m_dwThemeID(0) +{ +} +FX_ERR CFWL_WidgetTP::InitTTO() +{ + if (m_pTextOut) { + return FWL_ERR_Succeeded; + } + m_pFDEFont = FWL_GetFontManager()->FindFont(FX_WSTRC(L"Helvetica"), 0, 0); + m_pTextOut = IFDE_TextOut::Create(); + m_pTextOut->SetFont(m_pFDEFont); + m_pTextOut->SetFontSize(FWLTHEME_CAPACITY_FontSize); + m_pTextOut->SetTextColor(FWLTHEME_CAPACITY_TextColor); + m_pTextOut->SetEllipsisString(L"..."); + return FWL_ERR_Succeeded; +} +FX_ERR CFWL_WidgetTP::FinalizeTTO() +{ + if (m_pTextOut) { + m_pTextOut->Release(); + m_pTextOut = NULL; + } + return FWL_ERR_Succeeded; +} +#ifdef THEME_XPSimilar +void CFWL_WidgetTP::DrawEdge(CFX_Graphics *pGraphics, FX_DWORD dwStyles, const CFX_RectF *pRect, CFX_Matrix *pMatrix) +{ + _FWL_RETURN_IF_FAIL(pGraphics); + _FWL_RETURN_IF_FAIL(pRect); + pGraphics->SaveGraphState(); + CFX_Color crStroke(FWL_GetThemeColor(m_dwThemeID) == 0 ? ArgbEncode(255, 127, 157, 185) : FWLTHEME_COLOR_Green_BKSelected); + pGraphics->SetStrokeColor(&crStroke); + CFX_Path path; + path.Create(); + path.AddRectangle(pRect->left, pRect->top, pRect->width - 1, pRect->height - 1); + pGraphics->StrokePath(&path, pMatrix); + path.Clear(); + crStroke = ArgbEncode(255, 255, 255, 255); + pGraphics->SetStrokeColor(&crStroke); + path.AddRectangle(pRect->left + 1, pRect->top + 1, pRect->width - 3, pRect->height - 3); + pGraphics->StrokePath(&path, pMatrix); + pGraphics->RestoreGraphState(); +} +#else +void CFWL_WidgetTP::DrawEdge(CFX_Graphics *pGraphics, FX_DWORD dwStyles, const CFX_RectF *pRect, CFX_Matrix *pMatrix ) +{ + _FWL_RETURN_IF_FAIL(pGraphics); + _FWL_RETURN_IF_FAIL(pRect); + FWLTHEME_EDGE eType; + FX_FLOAT fWidth; + switch(dwStyles & FWL_WGTSTYLE_EdgeMask) { + case FWL_WGTSTYLE_EdgeRaised: { + eType = FWLTHEME_EDGE_Raised, fWidth = FWLTHEME_CAPACITY_EdgeRaised; + break; + } + case FWL_WGTSTYLE_EdgeSunken: { + eType = FWLTHEME_EDGE_Sunken, fWidth = FWLTHEME_CAPACITY_EdgeSunken; + break; + } + case FWL_WGTSTYLE_EdgeFlat: + default: { + return; + } + } + Draw3DRect(pGraphics, + eType, + fWidth, + pRect, + FWLTHEME_COLOR_EDGELT1, + FWLTHEME_COLOR_EDGELT2, + FWLTHEME_COLOR_EDGERB1, + FWLTHEME_COLOR_EDGERB2, + pMatrix); +} +#endif +void CFWL_WidgetTP::Draw3DRect(CFX_Graphics *pGraphics, FWLTHEME_EDGE eType, FX_FLOAT fWidth, const CFX_RectF *pRect, FX_ARGB cr1, FX_ARGB cr2, FX_ARGB cr3, FX_ARGB cr4, CFX_Matrix *pMatrix ) +{ + _FWL_RETURN_IF_FAIL(pGraphics); + _FWL_RETURN_IF_FAIL(pRect); + pGraphics->SaveGraphState(); + if (eType == FWLTHEME_EDGE_Flat) { + CFX_Path path; + path.Create(); + path.AddRectangle(pRect->left, + pRect->top, + pRect->width, + pRect->height); + path.AddRectangle(pRect->left + 1, + pRect->top + 1, + pRect->width - 2, + pRect->height - 2); + CFX_Color cr(ArgbEncode(255, 100, 100, 100)); + pGraphics->SetFillColor(&cr); + pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); + path.Clear(); + path.AddRectangle(pRect->left + 1, + pRect->top + 1, + pRect->width - 2, + pRect->height - 2); + path.AddRectangle(pRect->left + 2, + pRect->top + 2, + pRect->width - 4, + pRect->height - 4); + cr.Set(0xFFFFFFFF); + pGraphics->SetFillColor(&cr); + pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); + } else { + FX_FLOAT fLeft = pRect->left; + FX_FLOAT fRight = pRect->right(); + FX_FLOAT fTop = pRect->top; + FX_FLOAT fBottom = pRect->bottom(); + FX_FLOAT fHalfWidth = fWidth / 2.0f; + CFX_Color crLT(eType == FWLTHEME_EDGE_Raised ? cr4 : cr1); + pGraphics->SetFillColor(&crLT); + CFX_Path pathLT; + pathLT.Create(); + pathLT.MoveTo(fLeft, fBottom - fHalfWidth); + pathLT.LineTo(fLeft, fTop); + pathLT.LineTo(fRight - fHalfWidth, fTop); + pathLT.LineTo(fRight - fHalfWidth, fTop + fHalfWidth); + pathLT.LineTo(fLeft + fHalfWidth, fTop + fHalfWidth); + pathLT.LineTo(fLeft + fHalfWidth, fBottom - fHalfWidth); + pathLT.LineTo(fLeft, fBottom - fHalfWidth); + pGraphics->FillPath(&pathLT, FXFILL_WINDING, pMatrix); + crLT = CFX_Color(eType == FWLTHEME_EDGE_Raised ? cr3 : cr2); + pGraphics->SetFillColor(&crLT); + pathLT.Clear(); + pathLT.MoveTo(fLeft + fHalfWidth, fBottom - fWidth); + pathLT.LineTo(fLeft + fHalfWidth, fTop + fHalfWidth); + pathLT.LineTo(fRight - fWidth, fTop + fHalfWidth); + pathLT.LineTo(fRight - fWidth, fTop + fWidth); + pathLT.LineTo(fLeft + fWidth, fTop + fWidth); + pathLT.LineTo(fLeft + fWidth, fBottom - fWidth); + pathLT.LineTo(fLeft + fHalfWidth, fBottom - fWidth); + pGraphics->FillPath(&pathLT, FXFILL_WINDING, pMatrix); + CFX_Color crRB(eType == FWLTHEME_EDGE_Raised ? cr1 : cr3); + pGraphics->SetFillColor(&crRB); + CFX_Path pathRB; + pathRB.Create(); + pathRB.MoveTo(fRight - fHalfWidth, fTop + fHalfWidth); + pathRB.LineTo(fRight - fHalfWidth, fBottom - fHalfWidth); + pathRB.LineTo(fLeft + fHalfWidth, fBottom - fHalfWidth); + pathRB.LineTo(fLeft + fHalfWidth, fBottom - fWidth); + pathRB.LineTo(fRight - fWidth, fBottom - fWidth); + pathRB.LineTo(fRight - fWidth, fTop + fHalfWidth); + pathRB.LineTo(fRight - fHalfWidth, fTop + fHalfWidth); + pGraphics->FillPath(&pathRB, FXFILL_WINDING, pMatrix); + crRB = CFX_Color(eType == FWLTHEME_EDGE_Raised + ? cr2 : cr4); + pGraphics->SetFillColor(&crRB); + pathRB.Clear(); + pathRB.MoveTo(fRight, fTop); + pathRB.LineTo(fRight, fBottom); + pathRB.LineTo(fLeft, fBottom); + pathRB.LineTo(fLeft, fBottom - fHalfWidth); + pathRB.LineTo(fRight - fHalfWidth, fBottom - fHalfWidth); + pathRB.LineTo(fRight - fHalfWidth, fTop); + pathRB.LineTo(fRight, fTop); + pGraphics->FillPath(&pathRB, FXFILL_WINDING, pMatrix); + } + pGraphics->RestoreGraphState(); +} +void CFWL_WidgetTP::Draw3DCircle(CFX_Graphics *pGraphics, FWLTHEME_EDGE eType, FX_FLOAT fWidth, const CFX_RectF *pRect, FX_ARGB cr1, FX_ARGB cr2, FX_ARGB cr3, FX_ARGB cr4, CFX_Matrix *pMatrix ) +{ + _FWL_RETURN_IF_FAIL(pGraphics); + _FWL_RETURN_IF_FAIL(pRect); + pGraphics->SaveGraphState(); + FX_FLOAT fRadius = pRect->width / 2; + CFX_Path path; + path.Create(); + path.AddArc(pRect->left, + pRect->top, + pRect->width, + pRect->height, + FWLTHEME_PI * 3 / 4, + FWLTHEME_PI); + CFX_Color crFill1(eType == FWLTHEME_EDGE_Raised ? cr4 : cr1); + pGraphics->SetStrokeColor(&crFill1); + pGraphics->StrokePath(&path, pMatrix); + CFX_RectF rtInner(*pRect); + rtInner.Deflate(pRect->width / 4, pRect->height / 4); + path.Clear(); + path.AddArc(rtInner.left, + rtInner.top, + rtInner.width, + rtInner.height, + FWLTHEME_PI * 3 / 4, + FWLTHEME_PI); + CFX_Color crFill2(eType == FWLTHEME_EDGE_Raised ? cr3 : cr2); + pGraphics->SetStrokeColor(&crFill2); + pGraphics->StrokePath(&path, pMatrix); + path.Clear(); + path.AddArc(pRect->left, + pRect->top, + pRect->width, + pRect->height, + FWLTHEME_PI * 7 / 4, + FWLTHEME_PI); + CFX_Color crFill3(eType == FWLTHEME_EDGE_Raised ? cr1 : cr3); + pGraphics->SetStrokeColor(&crFill3); + pGraphics->StrokePath(&path, pMatrix); + path.AddArc(rtInner.left, + rtInner.top, + rtInner.width, + rtInner.height, + FWLTHEME_PI * 7 / 4, + FWLTHEME_PI); + CFX_Color crFill4(eType == FWLTHEME_EDGE_Raised ? cr2 : cr4); + pGraphics->SetStrokeColor(&crFill4); + pGraphics->StrokePath(&path, pMatrix); + pGraphics->RestoreGraphState(); +} +void CFWL_WidgetTP::DrawBorder(CFX_Graphics *pGraphics, const CFX_RectF *pRect, CFX_Matrix *pMatrix ) +{ + _FWL_RETURN_IF_FAIL(pGraphics); + _FWL_RETURN_IF_FAIL(pRect); + CFX_Path path; + path.Create(); + path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height); + path.AddRectangle(pRect->left + 1, pRect->top + 1, pRect->width - 2, pRect->height - 2); + pGraphics->SaveGraphState(); + CFX_Color crFill(ArgbEncode(255, 0, 0, 0)); + pGraphics->SetFillColor(&crFill); + pGraphics->FillPath(&path, FXFILL_ALTERNATE, pMatrix); + pGraphics->RestoreGraphState(); +} +void CFWL_WidgetTP::FillBackground(CFX_Graphics *pGraphics, const CFX_RectF *pRect, CFX_Matrix *pMatrix ) +{ + FillSoildRect(pGraphics, FWLTHEME_COLOR_Background, pRect, pMatrix); +} +void CFWL_WidgetTP::FillSoildRect(CFX_Graphics *pGraphics, FX_ARGB fillColor, const CFX_RectF *pRect, CFX_Matrix *pMatrix ) +{ + _FWL_RETURN_IF_FAIL(pGraphics); + _FWL_RETURN_IF_FAIL(pRect); + pGraphics->SaveGraphState(); + CFX_Color crFill(fillColor); + pGraphics->SetFillColor(&crFill); + CFX_Path path; + path.Create(); + path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height); + pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); + pGraphics->RestoreGraphState(); +} +void CFWL_WidgetTP::DrawAxialShading(CFX_Graphics *pGraphics, FX_FLOAT fx1, FX_FLOAT fy1, FX_FLOAT fx2, FX_FLOAT fy2, FX_ARGB beginColor, FX_ARGB endColor, CFX_Path *path, FX_INT32 fillMode, CFX_Matrix *pMatrix ) +{ + _FWL_RETURN_IF_FAIL(pGraphics); + _FWL_RETURN_IF_FAIL(path); + CFX_PointF begPoint, endPoint; + begPoint.Set(fx1, fy1); + endPoint.Set(fx2, fy2); + CFX_Shading shading; + shading.CreateAxial(begPoint, endPoint, FALSE, FALSE, beginColor, endColor); + pGraphics->SaveGraphState(); + CFX_Color color1(&shading); + pGraphics->SetFillColor(&color1); + pGraphics->FillPath(path, fillMode, pMatrix); + pGraphics->RestoreGraphState(); +} +void CFWL_WidgetTP::DrawAnnulusRect(CFX_Graphics *pGraphics, FX_ARGB fillColor, const CFX_RectF *pRect, FX_FLOAT fRingWidth , CFX_Matrix *pMatrix ) +{ + _FWL_RETURN_IF_FAIL(pGraphics); + _FWL_RETURN_IF_FAIL(pRect); + pGraphics->SaveGraphState(); + CFX_Color cr(fillColor); + pGraphics->SetFillColor(&cr); + CFX_Path path; + path.Create(); + FX_FLOAT fRight = pRect->right(); + FX_FLOAT fBottom = pRect->bottom(); + CFX_RectF rtInner(*pRect); + rtInner.Deflate(fRingWidth, fRingWidth); + path.AddRectangle(rtInner.left, rtInner.top, rtInner.width, rtInner.height); + path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height); + pGraphics->FillPath(&path, FXFILL_ALTERNATE, pMatrix); + pGraphics->RestoreGraphState(); +} +void CFWL_WidgetTP::DrawAnnulusCircle(CFX_Graphics *pGraphics, FX_ARGB fillColor, const CFX_RectF *pRect, FX_FLOAT fWidth , CFX_Matrix *pMatrix ) +{ + _FWL_RETURN_IF_FAIL(pGraphics); + _FWL_RETURN_IF_FAIL(pRect); + if (fWidth > pRect->width / 2) { + return; + } + pGraphics->SaveGraphState(); + CFX_Color cr(fillColor); + pGraphics->SetFillColor(&cr); + CFX_Path path; + path.Create(); + path.AddEllipse(*pRect); + CFX_RectF rtIn(*pRect); + rtIn.Inflate(-fWidth, -fWidth); + path.AddEllipse(rtIn); + pGraphics->FillPath(&path, FXFILL_ALTERNATE, pMatrix); + pGraphics->RestoreGraphState(); +} +void CFWL_WidgetTP::DrawFocus(CFX_Graphics *pGraphics, const CFX_RectF *pRect, CFX_Matrix *pMatrix ) +{ + _FWL_RETURN_IF_FAIL(pGraphics); + _FWL_RETURN_IF_FAIL(pRect); + pGraphics->SaveGraphState(); + CFX_Color cr(0xFF000000); + pGraphics->SetStrokeColor(&cr); + FX_FLOAT DashPattern[2] = {1, 1}; + pGraphics->SetLineDash(0.0f, DashPattern, 2); + CFX_Path path; + path.Create(); + path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height); + pGraphics->StrokePath(&path, pMatrix); + pGraphics->RestoreGraphState(); +} +#define FWLTHEME_ARROW_Denominator 3 +void CFWL_WidgetTP::DrawArrow(CFX_Graphics *pGraphics, const CFX_RectF *pRect, FWLTHEME_DIRECTION eDict, FX_ARGB argbFill, FX_BOOL bPressed, CFX_Matrix *pMatrix ) +{ + CFX_RectF rtArrow(*pRect); + CFX_Path path; + path.Create(); + FX_FLOAT fBtn = FX_MIN(pRect->width, pRect->height) / FWLTHEME_ARROW_Denominator; + rtArrow.left = pRect->left + (pRect->width - fBtn) / 2; + rtArrow.top = pRect->top + (pRect->height - fBtn) / 2; + rtArrow.width = fBtn; + rtArrow.height = fBtn; + if (bPressed) { + rtArrow.Offset(1, 1); + } + switch (eDict) { + case FWLTHEME_DIRECTION_Up: { + path.MoveTo(rtArrow.left, rtArrow.bottom()); + path.LineTo(rtArrow.right(), rtArrow.bottom()); + path.LineTo(rtArrow.left + fBtn / 2, rtArrow.top); + path.LineTo(rtArrow.left, rtArrow.bottom()); + break; + } + case FWLTHEME_DIRECTION_Left: { + path.MoveTo(rtArrow.right(), rtArrow.top); + path.LineTo(rtArrow.right(), rtArrow.bottom()); + path.LineTo(rtArrow.left, rtArrow.top + fBtn / 2); + path.LineTo(rtArrow.right(), rtArrow.top); + break ; + } + case FWLTHEME_DIRECTION_Right: { + path.MoveTo(rtArrow.left, rtArrow.top); + path.LineTo(rtArrow.left, rtArrow.bottom()); + path.LineTo(rtArrow.right(), rtArrow.top + fBtn / 2); + path.LineTo(rtArrow.left, rtArrow.top); + break; + } + case FWLTHEME_DIRECTION_Down: + default: { + path.MoveTo(rtArrow.left, rtArrow.top); + path.LineTo(rtArrow.right(), rtArrow.top); + path.LineTo(rtArrow.left + fBtn / 2, rtArrow.bottom()); + path.LineTo(rtArrow.left, rtArrow.top); + } + } + pGraphics->SaveGraphState(); + CFX_Color cr(argbFill); + pGraphics->SetFillColor(&cr); + pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); + pGraphics->RestoreGraphState(); +} +void CFWL_WidgetTP::DrawArrow(CFX_Graphics *pGraphics, const CFX_RectF *pRect, FWLTHEME_DIRECTION eDict, FX_ARGB argSign, CFX_Matrix *pMatrix ) +{ + CFX_RectF rtArrow(*pRect); + FX_BOOL bVert = (eDict == FWLTHEME_DIRECTION_Up || eDict == FWLTHEME_DIRECTION_Down); + FX_FLOAT fLeft = (FX_FLOAT)(((pRect->width - (bVert ? 9 : 6)) / 2 + pRect->left) + 0.5); + FX_FLOAT fTop = (FX_FLOAT)(((pRect->height - (bVert ? 6 : 9)) / 2 + pRect->top) + 0.5); + CFX_Path path; + path.Create(); + switch (eDict) { + case FWLTHEME_DIRECTION_Down: { + path.MoveTo(fLeft, fTop + 1); + path.LineTo(fLeft + 4, fTop + 5); + path.LineTo(fLeft + 8, fTop + 1); + path.LineTo(fLeft + 7, fTop); + path.LineTo(fLeft + 4, fTop + 3); + path.LineTo(fLeft + 1, fTop); + break; + } + case FWLTHEME_DIRECTION_Up: { + path.MoveTo(fLeft, fTop + 4); + path.LineTo(fLeft + 4, fTop); + path.LineTo(fLeft + 8, fTop + 4); + path.LineTo(fLeft + 7, fTop + 5); + path.LineTo(fLeft + 4, fTop + 2); + path.LineTo(fLeft + 1, fTop + 5); + break; + } + case FWLTHEME_DIRECTION_Right: { + path.MoveTo(fLeft + 1, fTop); + path.LineTo(fLeft + 5, fTop + 4); + path.LineTo(fLeft + 1, fTop + 8); + path.LineTo(fLeft, fTop + 7); + path.LineTo(fLeft + 3, fTop + 4); + path.LineTo(fLeft, fTop + 1); + break; + } + case FWLTHEME_DIRECTION_Left: { + path.MoveTo(fLeft, fTop + 4); + path.LineTo(fLeft + 4, fTop); + path.LineTo(fLeft + 5, fTop + 1); + path.LineTo(fLeft + 2, fTop + 4); + path.LineTo(fLeft + 5, fTop + 7); + path.LineTo(fLeft + 4, fTop + 8); + break; + } + } + CFX_Color cr(argSign); + pGraphics->SetFillColor(&cr); + pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); +} +void CFWL_WidgetTP::DrawBtn(CFX_Graphics *pGraphics, const CFX_RectF *pRect, FWLTHEME_STATE eState, CFX_Matrix *pMatrix ) +{ + CFX_Path path; + path.Create(); + if (!CFWL_ArrowData::IsInstance()) { + CFWL_ArrowData::GetInstance()->SetColorData(FWL_GetThemeColor(m_dwThemeID)); + } + CFWL_ArrowData::CColorData *pColorData = CFWL_ArrowData::GetInstance()->m_pColorData; + FX_FLOAT fRight = pRect->right(); + FX_FLOAT fBottom = pRect->bottom(); + path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height); + DrawAxialShading(pGraphics, + pRect->left, + pRect->top, + fRight, + fBottom, + pColorData->clrStart[eState - 1], + pColorData->clrEnd[eState - 1], + &path, + FXFILL_WINDING, + pMatrix); + CFX_Color rcStroke; + rcStroke.Set(pColorData->clrBorder[eState - 1]); + pGraphics->SetStrokeColor(&rcStroke); + pGraphics->StrokePath(&path, pMatrix); +} +void CFWL_WidgetTP::DrawArrowBtn(CFX_Graphics *pGraphics, const CFX_RectF *pRect, FWLTHEME_DIRECTION eDict, FWLTHEME_STATE eState, CFX_Matrix *pMatrix ) +{ + DrawBtn(pGraphics, pRect, eState, pMatrix); + if (!CFWL_ArrowData::IsInstance()) { + CFWL_ArrowData::GetInstance()->SetColorData(FWL_GetThemeColor(m_dwThemeID)); + } + CFWL_ArrowData::CColorData *pColorData = CFWL_ArrowData::GetInstance()->m_pColorData; + DrawArrow(pGraphics, pRect, eDict, pColorData->clrSign[eState - 1], pMatrix); +} +FWLCOLOR CFWL_WidgetTP::BlendColor(FWLCOLOR srcColor, FWLCOLOR renderColor, FX_BYTE scale) +{ + FWLCOLOR dstColor; + FX_BYTE n = 255 - scale; + dstColor.a = (FX_BYTE)(((FX_WORD)srcColor.a * n + (FX_WORD)renderColor.a * scale) >> 8); + dstColor.r = (FX_BYTE)(((FX_WORD)srcColor.r * n + (FX_WORD)renderColor.r * scale) >> 8); + dstColor.g = (FX_BYTE)(((FX_WORD)srcColor.g * n + (FX_WORD)renderColor.g * scale) >> 8); + dstColor.b = (FX_BYTE)(((FX_WORD)srcColor.b * n + (FX_WORD)renderColor.b * scale) >> 8); + return dstColor; +} +CFWL_ArrowData::CFWL_ArrowData() + : m_pColorData(NULL) +{ + SetColorData(0); +} +CFWL_FontManager *FWL_GetFontManager() +{ + static CFWL_FontManager * _fontManager = NULL; + if (_fontManager == NULL) { + _fontManager = FX_NEW CFWL_FontManager; + } + return _fontManager; +} +void FWL_ReleaseFontManager() +{ + CFWL_FontManager * fontManager = FWL_GetFontManager(); + delete fontManager; +} +CFWL_FontData::CFWL_FontData() + : m_dwStyles(0) + , m_dwCodePage(0) + , m_pFont(0) + , m_pFontMgr(NULL) +#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ + , m_pFontSource(NULL) +#endif +{ +} +CFWL_FontData::~CFWL_FontData() +{ + if (m_pFont) { + m_pFont->Release(); + } + if (m_pFontMgr) { + m_pFontMgr->Release(); + } +#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ + if(m_pFontSource != NULL) { + m_pFontSource->Release(); + } +#endif +} +FX_BOOL CFWL_FontData::Equal(FX_WSTR wsFontFamily, FX_DWORD dwFontStyles, FX_WORD wCodePage) +{ + return m_wsFamily == wsFontFamily && m_dwStyles == dwFontStyles && m_dwCodePage == wCodePage; +} +FX_BOOL CFWL_FontData::LoadFont(FX_WSTR wsFontFamily, FX_DWORD dwFontStyles, FX_WORD dwCodePage) +{ + m_wsFamily = wsFontFamily; + m_dwStyles = dwFontStyles; + m_dwCodePage = dwCodePage; + if (!m_pFontMgr) { +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + m_pFontMgr = IFX_FontMgr::Create(FX_GetDefFontEnumerator()); +#else + m_pFontSource = FX_CreateDefaultFontSourceEnum(); + m_pFontMgr = IFX_FontMgr::Create(m_pFontSource); +#endif + } + m_pFont = IFX_Font::LoadFont(wsFontFamily.GetPtr(), dwFontStyles, dwCodePage, m_pFontMgr); + return m_pFont != NULL; +} +CFWL_FontManager::CFWL_FontManager() +{ +} +CFWL_FontManager::~CFWL_FontManager() +{ + FX_INT32 count = m_arrFonts.GetSize(); + for (FX_INT32 i = 0; i < count; i ++) { + CFWL_FontData *data = (CFWL_FontData*)m_arrFonts[i]; + delete data; + } + m_arrFonts.RemoveAll(); +} +IFX_Font* CFWL_FontManager::FindFont(FX_WSTR wsFontFamily, FX_DWORD dwFontStyles, FX_WORD wCodePage) +{ + FX_INT32 count = m_arrFonts.GetSize(); + for (FX_INT32 i = 0; i < count; i ++) { + CFWL_FontData *data = (CFWL_FontData*)m_arrFonts[i]; + if (data->Equal(wsFontFamily, dwFontStyles, wCodePage)) { + return data->GetFont(); + } + } + CFWL_FontData *fontData = FX_NEW CFWL_FontData; + if (!fontData->LoadFont(wsFontFamily, dwFontStyles, wCodePage)) { + delete fontData; + return NULL; + } + m_arrFonts.Add(fontData); + return fontData->GetFont(); +} +FX_BOOL FWLTHEME_Init() +{ + return TRUE; +} +void FWLTHEME_Release() +{ + CFWL_ArrowData::DestroyInstance(); + FWL_ReleaseFontManager(); +} +FX_DWORD FWL_GetThemeLayout(FX_DWORD dwThemeID) +{ + return 0xffff0000 & dwThemeID; +} +FX_DWORD FWL_GetThemeColor(FX_DWORD dwThemeID) +{ + return 0x0000ffff & dwThemeID; +} +FX_DWORD FWL_MakeThemeID(FX_DWORD dwLayout, FX_DWORD dwColor) +{ + return (dwLayout << 16) | (0x0000FFFF & dwColor); +} +CFWL_ArrowData *CFWL_ArrowData::m_pInstance = NULL; +CFWL_ArrowData* CFWL_ArrowData::GetInstance() +{ + if (!m_pInstance) { + m_pInstance = FX_NEW CFWL_ArrowData; + } + return m_pInstance; +} +FX_BOOL CFWL_ArrowData::IsInstance() +{ + return (m_pInstance != NULL); +} +void CFWL_ArrowData::DestroyInstance() +{ + if (m_pInstance) { + delete m_pInstance; + m_pInstance = NULL; + } +} +CFWL_ArrowData::~CFWL_ArrowData() +{ + if (m_pColorData) { + delete m_pColorData; + m_pColorData = NULL; + } +} +void CFWL_ArrowData::SetColorData(FX_DWORD dwID) +{ + if (!m_pColorData) { + m_pColorData = FX_NEW CColorData; + } + if (dwID) { + m_pColorData->clrBorder[0] = ArgbEncode(255, 142, 153, 125); + m_pColorData->clrBorder[1] = ArgbEncode(255, 157, 171, 119); + m_pColorData->clrBorder[2] = ArgbEncode(255, 118, 131, 97); + m_pColorData->clrBorder[3] = ArgbEncode(255, 172, 168, 153); + m_pColorData->clrStart[0] = ArgbEncode(255, 203, 215, 186); + m_pColorData->clrStart[1] = ArgbEncode(255, 218, 232, 185); + m_pColorData->clrStart[2] = ArgbEncode(255, 203, 215, 186); + m_pColorData->clrStart[3] = ArgbEncode(255, 254, 254, 251); + m_pColorData->clrEnd[0] = ArgbEncode(255, 149, 167, 117); + m_pColorData->clrEnd[1] = ArgbEncode(255, 198, 211, 155); + m_pColorData->clrEnd[2] = ArgbEncode(255, 149, 167, 117); + m_pColorData->clrEnd[3] = ArgbEncode(255, 243, 241, 236); + m_pColorData->clrSign[0] = ArgbEncode(255, 255, 255, 255); + m_pColorData->clrSign[1] = ArgbEncode(255, 255, 255, 255); + m_pColorData->clrSign[2] = ArgbEncode(255, 255, 255, 255); + m_pColorData->clrSign[3] = ArgbEncode(255, 128, 128, 128); + } else { + m_pColorData->clrBorder[0] = ArgbEncode(255, 202, 216, 249); + m_pColorData->clrBorder[1] = ArgbEncode(255, 171, 190, 233); + m_pColorData->clrBorder[2] = ArgbEncode(255, 135, 147, 219); + m_pColorData->clrBorder[3] = ArgbEncode(255, 172, 168, 153); + m_pColorData->clrStart[0] = ArgbEncode(255, 225, 234, 254); + m_pColorData->clrStart[1] = ArgbEncode(255, 253, 255, 255); + m_pColorData->clrStart[2] = ArgbEncode(255, 110, 142, 241); + m_pColorData->clrStart[3] = ArgbEncode(255, 254, 254, 251); + m_pColorData->clrEnd[0] = ArgbEncode(255, 175, 204, 251); + m_pColorData->clrEnd[1] = ArgbEncode(255, 185, 218, 251); + m_pColorData->clrEnd[2] = ArgbEncode(255, 210, 222, 235); + m_pColorData->clrEnd[3] = ArgbEncode(255, 243, 241, 236); + m_pColorData->clrSign[0] = ArgbEncode(255, 77, 97, 133); + m_pColorData->clrSign[1] = ArgbEncode(255, 77, 97, 133); + m_pColorData->clrSign[2] = ArgbEncode(255, 77, 97, 133); + m_pColorData->clrSign[3] = ArgbEncode(255, 128, 128, 128); + } +} diff --git a/xfa/src/fxbarcode/src/BC_ASCIIEncoder.cpp b/xfa/src/fxbarcode/src/BC_ASCIIEncoder.cpp new file mode 100644 index 0000000000..52fec37b36 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_ASCIIEncoder.cpp @@ -0,0 +1,83 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_Encoder.h" +#include "include/BC_Dimension.h" +#include "include/BC_SymbolShapeHint.h" +#include "include/BC_SymbolInfo.h" +#include "include/BC_EncoderContext.h" +#include "include/BC_HighLevelEncoder.h" +#include "include/BC_ASCIIEncoder.h" +CBC_ASCIIEncoder::CBC_ASCIIEncoder() +{ +} +CBC_ASCIIEncoder::~CBC_ASCIIEncoder() +{ +} +FX_INT32 CBC_ASCIIEncoder::getEncodingMode() +{ + return ASCII_ENCODATION; +} +void CBC_ASCIIEncoder::Encode(CBC_EncoderContext &context, FX_INT32 &e) +{ + FX_INT32 n = CBC_HighLevelEncoder::determineConsecutiveDigitCount(context.m_msg, context.m_pos); + if (n >= 2) { + FX_WCHAR code = encodeASCIIDigits(context.m_msg.GetAt(context.m_pos), context.m_msg.GetAt(context.m_pos + 1), e); + if (e != BCExceptionNO) { + return; + } + context.writeCodeword(code); + context.m_pos += 2; + } else { + FX_WCHAR c = context.getCurrentChar(); + FX_INT32 newMode = CBC_HighLevelEncoder::lookAheadTest(context.m_msg, context.m_pos, getEncodingMode()); + if (newMode != getEncodingMode()) { + switch (newMode) { + case BASE256_ENCODATION: + context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_BASE256); + context.signalEncoderChange(BASE256_ENCODATION); + return; + case C40_ENCODATION: + context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_C40); + context.signalEncoderChange(C40_ENCODATION); + return; + case X12_ENCODATION: + context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_ANSIX12); + context.signalEncoderChange(X12_ENCODATION); + break; + case TEXT_ENCODATION: + context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_TEXT); + context.signalEncoderChange(TEXT_ENCODATION); + break; + case EDIFACT_ENCODATION: + context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_EDIFACT); + context.signalEncoderChange(EDIFACT_ENCODATION); + break; + default: + e = BCExceptionIllegalStateIllegalMode; + return; + } + } else if (CBC_HighLevelEncoder::isExtendedASCII(c)) { + context.writeCodeword(CBC_HighLevelEncoder::UPPER_SHIFT); + context.writeCodeword((FX_WCHAR) (c - 128 + 1)); + context.m_pos++; + } else { + context.writeCodeword((FX_WCHAR) (c + 1)); + context.m_pos++; + } + } +} +FX_WCHAR CBC_ASCIIEncoder::encodeASCIIDigits(FX_WCHAR digit1, FX_WCHAR digit2, FX_INT32 &e) +{ + if (CBC_HighLevelEncoder::isDigit(digit1) && CBC_HighLevelEncoder::isDigit(digit2)) { + FX_INT32 num = (digit1 - 48) * 10 + (digit2 - 48); + FX_WCHAR a = (FX_WCHAR) (num + 130); + return (FX_WCHAR) (num + 130); + } + e = BCExceptionIllegalArgumentNotGigits; + return 0; +} diff --git a/xfa/src/fxbarcode/src/BC_BarCode.cpp b/xfa/src/fxbarcode/src/BC_BarCode.cpp new file mode 100644 index 0000000000..f22c10c6aa --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_BarCode.cpp @@ -0,0 +1,856 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_Reader.h" +#include "include/BC_OneDReader.h" +#include "include/BC_OneDimReader.h" +#include "include/BC_Writer.h" +#include "include/BC_OneDimWriter.h" +#include "include/BC_OnedCode39Reader.h" +#include "include/BC_OnedCode39Writer.h" +#include "include/BC_OnedCodaBarReader.h" +#include "include/BC_OnedCodaBarWriter.h" +#include "include/BC_OnedCode128Reader.h" +#include "include/BC_OnedCode128Writer.h" +#include "include/BC_OnedEAN8Reader.h" +#include "include/BC_OnedEAN8Writer.h" +#include "include/BC_OnedEAN13Reader.h" +#include "include/BC_OnedEAN13Writer.h" +#include "include/BC_OnedUPCAReader.h" +#include "include/BC_OnedUPCAWriter.h" +#include "include/BC_QRCodeReader.h" +#include "include/BC_QRCodeWriter.h" +#include "include/BC_PDF417Compaction.h" +#include "include/BC_PDF417.h" +#include "include/BC_PDF417Writer.h" +#include "include/BC_DataMatrixReader.h" +#include "include/BC_DataMatrixWriter.h" +#include "include/BC_LuminanceSource.h" +#include "include/BC_BufferedImageLuminanceSource.h" +#include "include/BC_Binarizer.h" +#include "include/BC_GlobalHistogramBinarizer.h" +#include "include/BC_BinaryBitmap.h" +#include "include/BC_UtilCodingConvert.h" +#include "include/BC_PDF417HighLevelEncoder.h" +#include "include/BC_ResultPoint.h" +#include "include/BC_PDF417DetectorResult.h" +#include "include/BC_BinaryBitmap.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_CommonBitArray.h" +#include "include/BC_PDF417Detector.h" +#include "include/BC_PDF417DetectorResult.h" +#include "include/BC_DecoderResult.h" +#include "include/BC_PDF417Codeword.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_PDF417Common.h" +#include "include/BC_PDF417BarcodeValue.h" +#include "include/BC_PDF417BarcodeMetadata.h" +#include "include/BC_PDF417BoundingBox.h" +#include "include/BC_PDF417DetectionResultColumn.h" +#include "include/BC_PDF417DetectionResultRowIndicatorColumn.h" +#include "include/BC_PDF417DetectionResult.h" +#include "include/BC_PDF417DecodedBitStreamParser.h" +#include "include/BC_PDF417CodewordDecoder.h" +#include "include/BC_PDF417DecodedBitStreamParser.h" +#include "include/BC_PDF417ECModulusPoly.h" +#include "include/BC_PDF417ECModulusGF.h" +#include "include/BC_PDF417ECErrorCorrection.h" +#include "include/BC_PDF417DecodedBitStreamParser.h" +#include "include/BC_CommonDecoderResult.h" +#include "include/BC_PDF417ScanningDecoder.h" +#include "include/BC_PDF417Reader.h" +CBC_CodeBase :: CBC_CodeBase() +{ +} +CBC_CodeBase :: ~CBC_CodeBase() +{ +} +FX_BOOL CBC_CodeBase::SetCharEncoding(FX_INT32 encoding) +{ + if (m_pBCWriter) { + return m_pBCWriter->SetCharEncoding(encoding); + } + return FALSE; +} +FX_BOOL CBC_CodeBase::SetModuleHeight(FX_INT32 moduleHeight) +{ + if (m_pBCWriter) { + return m_pBCWriter->SetModuleHeight(moduleHeight); + } + return FALSE; +} +FX_BOOL CBC_CodeBase::SetModuleWidth(FX_INT32 moduleWidth) +{ + if (m_pBCWriter) { + return m_pBCWriter->SetModuleWidth(moduleWidth); + } + return FALSE; +} +FX_BOOL CBC_CodeBase::SetHeight(FX_INT32 height) +{ + if (m_pBCWriter) { + return m_pBCWriter->SetHeight(height); + } + return FALSE; +} +FX_BOOL CBC_CodeBase::SetWidth(FX_INT32 width) +{ + if (m_pBCWriter) { + return m_pBCWriter->SetWidth(width); + } + return FALSE; +} +void CBC_CodeBase::SetBackgroundColor(FX_ARGB backgroundColor) +{ + if (m_pBCWriter) { + m_pBCWriter->SetBackgroundColor(backgroundColor); + } +} +void CBC_CodeBase::SetBarcodeColor(FX_ARGB foregroundColor) +{ + if (m_pBCWriter) { + m_pBCWriter->SetBarcodeColor(foregroundColor); + } +} +CBC_OneCode::CBC_OneCode() +{ +}; +CBC_OneCode::~CBC_OneCode() +{ +} +FX_BOOL CBC_OneCode::CheckContentValidity(FX_WSTR contents) +{ + if (m_pBCWriter) { + return ((CBC_OneDimWriter*)m_pBCWriter)->CheckContentValidity(contents); + } + return FALSE; +} +CFX_WideString CBC_OneCode::FilterContents(FX_WSTR contents) +{ + CFX_WideString tmp; + if (m_pBCWriter == NULL) { + return tmp; + } + return ((CBC_OneDimWriter*)m_pBCWriter)->FilterContents(contents); +} +void CBC_OneCode::SetPrintChecksum(FX_BOOL checksum) +{ + if (m_pBCWriter) { + ((CBC_OneDimWriter*)m_pBCWriter)->SetPrintChecksum(checksum); + } +} +void CBC_OneCode::SetDataLength(FX_INT32 length) +{ + if (m_pBCWriter) { + ((CBC_OneDimWriter*)m_pBCWriter)->SetDataLength(length); + } +} +void CBC_OneCode::SetCalChecksum(FX_BOOL calc) +{ + if (m_pBCWriter) { + ((CBC_OneDimWriter*)m_pBCWriter)->SetCalcChecksum(calc); + } +} +FX_BOOL CBC_OneCode::SetFont(CFX_Font* cFont) +{ + if (m_pBCWriter) { + return ((CBC_OneDimWriter*)m_pBCWriter)->SetFont(cFont); + } + return FALSE; +} +void CBC_OneCode::SetFontSize(FX_FLOAT size) +{ + if (m_pBCWriter) { + ((CBC_OneDimWriter*)m_pBCWriter)->SetFontSize(size); + } +} +void CBC_OneCode::SetFontStyle(FX_INT32 style) +{ + if (m_pBCWriter) { + ((CBC_OneDimWriter*)m_pBCWriter)->SetFontStyle(style); + } +} +void CBC_OneCode::SetFontColor(FX_ARGB color) +{ + if (m_pBCWriter) { + ((CBC_OneDimWriter*)m_pBCWriter)->SetFontColor(color); + } +} +CBC_Code39::CBC_Code39() +{ + m_pBCReader = (CBC_Reader*) FX_NEW (CBC_OnedCode39Reader); + m_pBCWriter = (CBC_Writer*) FX_NEW (CBC_OnedCode39Writer); +} +CBC_Code39::CBC_Code39(FX_BOOL usingCheckDigit) +{ + m_pBCReader = (CBC_Reader*) FX_NEW CBC_OnedCode39Reader(usingCheckDigit); + m_pBCWriter = (CBC_Writer*) FX_NEW CBC_OnedCode39Writer; +} +CBC_Code39::CBC_Code39(FX_BOOL usingCheckDigit, FX_BOOL extendedMode) +{ + m_pBCReader = (CBC_Reader*) FX_NEW CBC_OnedCode39Reader(usingCheckDigit, extendedMode); + m_pBCWriter = (CBC_Writer*) FX_NEW CBC_OnedCode39Writer(extendedMode); +} +CBC_Code39::~CBC_Code39() +{ + if(m_pBCReader) { + delete(m_pBCReader); + m_pBCReader = NULL; + } + if(m_pBCWriter) { + delete(m_pBCWriter); + m_pBCWriter = NULL; + } +} +FX_BOOL CBC_Code39::Encode(FX_WSTR contents, FX_BOOL isDevice, FX_INT32 &e) +{ + if(contents.IsEmpty()) { + e = BCExceptionNoContents; + return FALSE; + } + BCFORMAT format = BCFORMAT_CODE_39; + FX_INT32 outWidth = 0; + FX_INT32 outHeight = 0; + CFX_WideString filtercontents = ((CBC_OnedCode39Writer*)m_pBCWriter)->FilterContents(contents); + CFX_WideString renderContents = ((CBC_OnedCode39Writer*)m_pBCWriter)->RenderTextContents(contents); + m_renderContents = renderContents; + CFX_ByteString byteString = filtercontents.UTF8Encode(); + FX_BYTE *data = m_pBCWriter->Encode(byteString, format, outWidth, outHeight, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + ((CBC_OneDimWriter*)m_pBCWriter)->RenderResult(renderContents, data, outWidth, isDevice, e); + FX_Free(data); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +FX_BOOL CBC_Code39::RenderDevice(CFX_RenderDevice* device, const CFX_Matrix* matirx, FX_INT32 &e) +{ + CFX_WideString renderCon = ((CBC_OnedCode39Writer*)m_pBCWriter)->encodedContents(m_renderContents, e); + ((CBC_OneDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx, renderCon, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +FX_BOOL CBC_Code39::RenderBitmap(CFX_DIBitmap *&pOutBitmap, FX_INT32 &e) +{ + CFX_WideString renderCon = ((CBC_OnedCode39Writer*)m_pBCWriter)->encodedContents(m_renderContents, e); + ((CBC_OneDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, renderCon, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +CFX_WideString CBC_Code39::Decode(FX_BYTE* buf, FX_INT32 width, FX_INT32 hight, FX_INT32 &e) +{ + CFX_WideString str; + return str; +} +CFX_WideString CBC_Code39::Decode(CFX_DIBitmap *pBitmap, FX_INT32 &e) +{ + CBC_BufferedImageLuminanceSource source(pBitmap); + CBC_GlobalHistogramBinarizer binarizer(&source); + CBC_BinaryBitmap bitmap(&binarizer); + CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L"")); + return CFX_WideString::FromUTF8(str, str.GetLength()); +} +FX_BOOL CBC_Code39::SetTextLocation(BC_TEXT_LOC location) +{ + if (m_pBCWriter) { + return ((CBC_OnedCode39Writer*)m_pBCWriter)->SetTextLocation(location); + } + return FALSE; +} +FX_BOOL CBC_Code39::SetWideNarrowRatio(FX_INT32 ratio) +{ + if (m_pBCWriter) { + return ((CBC_OnedCode39Writer*)m_pBCWriter)->SetWideNarrowRatio(ratio); + } + return FALSE; +} +CBC_Codabar::CBC_Codabar() +{ + m_pBCReader = (CBC_Reader*) FX_NEW (CBC_OnedCodaBarReader); + m_pBCWriter = (CBC_Writer*) FX_NEW (CBC_OnedCodaBarWriter); +} +CBC_Codabar::~CBC_Codabar() +{ + if(m_pBCReader) { + delete(m_pBCReader); + m_pBCReader = NULL; + } + if(m_pBCWriter) { + delete(m_pBCWriter); + m_pBCWriter = NULL; + } +} +FX_BOOL CBC_Codabar::SetStartChar(FX_CHAR start) +{ + if (m_pBCWriter) { + return ((CBC_OnedCodaBarWriter*)m_pBCWriter)->SetStartChar(start); + } + return FALSE; +} +FX_BOOL CBC_Codabar::SetEndChar(FX_CHAR end) +{ + if (m_pBCWriter) { + return ((CBC_OnedCodaBarWriter*)m_pBCWriter)->SetEndChar(end); + } + return FALSE; +} +FX_BOOL CBC_Codabar::SetTextLocation(BC_TEXT_LOC location) +{ + return ((CBC_OnedCodaBarWriter*) m_pBCWriter)->SetTextLocation(location); +} +FX_BOOL CBC_Codabar::SetWideNarrowRatio(FX_INT32 ratio) +{ + if (m_pBCWriter) { + return ((CBC_OnedCodaBarWriter*) m_pBCWriter)->SetWideNarrowRatio(ratio); + } + return FALSE; +} +FX_BOOL CBC_Codabar::Encode(FX_WSTR contents, FX_BOOL isDevice, FX_INT32 &e) +{ + if(contents.IsEmpty()) { + e = BCExceptionNoContents; + return FALSE; + } + BCFORMAT format = BCFORMAT_CODABAR; + FX_INT32 outWidth = 0; + FX_INT32 outHeight = 0; + CFX_WideString filtercontents = ((CBC_OneDimWriter*)m_pBCWriter)->FilterContents(contents); + CFX_ByteString byteString = filtercontents.UTF8Encode(); + m_renderContents = filtercontents; + FX_BYTE *data = m_pBCWriter->Encode(byteString, format, outWidth, outHeight, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + ((CBC_OneDimWriter*)m_pBCWriter)->RenderResult(filtercontents, data, outWidth, isDevice, e); + FX_Free(data); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +FX_BOOL CBC_Codabar::RenderDevice(CFX_RenderDevice* device, const CFX_Matrix* matirx, FX_INT32 &e) +{ + CFX_WideString renderCon = ((CBC_OnedCodaBarWriter*)m_pBCWriter)->encodedContents(m_renderContents); + ((CBC_OneDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx, renderCon, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +FX_BOOL CBC_Codabar::RenderBitmap(CFX_DIBitmap *&pOutBitmap, FX_INT32 &e) +{ + CFX_WideString renderCon = ((CBC_OnedCodaBarWriter*)m_pBCWriter)->encodedContents(m_renderContents); + ((CBC_OneDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, renderCon, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +CFX_WideString CBC_Codabar::Decode(FX_BYTE* buf, FX_INT32 width, FX_INT32 hight, FX_INT32 &e) +{ + CFX_WideString str; + return str; +} +CFX_WideString CBC_Codabar::Decode(CFX_DIBitmap *pBitmap, FX_INT32 &e) +{ + CBC_BufferedImageLuminanceSource source(pBitmap); + CBC_GlobalHistogramBinarizer binarizer(&source); + CBC_BinaryBitmap bitmap(&binarizer); + CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L"")); + return CFX_WideString::FromUTF8(str, str.GetLength()); +} +CBC_Code128::CBC_Code128(BC_TYPE type) +{ + m_pBCReader = (CBC_Reader *) FX_NEW (CBC_OnedCode128Reader); + m_pBCWriter = (CBC_Writer *) FX_NEW CBC_OnedCode128Writer(type); +} +CBC_Code128::~CBC_Code128() +{ + if(m_pBCReader) { + delete(m_pBCReader); + m_pBCReader = NULL; + } + if(m_pBCWriter) { + delete(m_pBCWriter); + m_pBCWriter = NULL; + } +} +FX_BOOL CBC_Code128::SetTextLocation(BC_TEXT_LOC location) +{ + if (m_pBCWriter) { + return (( CBC_OnedCode128Writer*)m_pBCWriter)->SetTextLocation(location); + } + return FALSE; +} +FX_BOOL CBC_Code128::Encode(FX_WSTR contents, FX_BOOL isDevice, FX_INT32 &e) +{ + if(contents.IsEmpty()) { + e = BCExceptionNoContents; + return FALSE; + } + BCFORMAT format = BCFORMAT_CODE_128; + FX_INT32 outWidth = 0; + FX_INT32 outHeight = 0; + CFX_WideString content = contents; + if (contents.GetLength() % 2 && ((CBC_OnedCode128Writer *)m_pBCWriter)->GetType() == BC_CODE128_C) { + content += '0'; + } + CFX_WideString encodeContents = ((CBC_OnedCode128Writer*)m_pBCWriter)->FilterContents(content); + m_renderContents = encodeContents; + CFX_ByteString byteString = encodeContents.UTF8Encode(); + FX_BYTE *data = m_pBCWriter->Encode(byteString, format, outWidth, outHeight, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + ((CBC_OneDimWriter*)m_pBCWriter)->RenderResult(encodeContents, data, outWidth, isDevice, e); + FX_Free(data); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +FX_BOOL CBC_Code128::RenderDevice(CFX_RenderDevice* device, const CFX_Matrix* matirx, FX_INT32 &e) +{ + ((CBC_OneDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx, m_renderContents, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +FX_BOOL CBC_Code128::RenderBitmap(CFX_DIBitmap *&pOutBitmap, FX_INT32 &e) +{ + ((CBC_OneDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, m_renderContents, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +CFX_WideString CBC_Code128::Decode(FX_BYTE* buf, FX_INT32 width, FX_INT32 hight, FX_INT32 &e) +{ + CFX_WideString str; + return str; +} +CFX_WideString CBC_Code128::Decode(CFX_DIBitmap *pBitmap, FX_INT32 &e) +{ + CBC_BufferedImageLuminanceSource source(pBitmap); + CBC_GlobalHistogramBinarizer binarizer(&source); + CBC_BinaryBitmap bitmap(&binarizer); + CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L"")); + return CFX_WideString::FromUTF8(str, str.GetLength()); +} +CBC_EAN8::CBC_EAN8() +{ + m_pBCReader = (CBC_Reader*) FX_NEW (CBC_OnedEAN8Reader); + m_pBCWriter = (CBC_Writer*) FX_NEW (CBC_OnedEAN8Writer); +} +CBC_EAN8::~CBC_EAN8() +{ + if(m_pBCReader) { + delete(m_pBCReader); + m_pBCReader = NULL; + } + if(m_pBCWriter) { + delete(m_pBCWriter); + m_pBCWriter = NULL; + } +} +CFX_WideString CBC_EAN8::Preprocess(FX_WSTR contents) +{ + CFX_WideString encodeContents = ((CBC_OnedEAN8Writer*)m_pBCWriter)->FilterContents(contents); + FX_INT32 length = encodeContents.GetLength(); + if (length <= 7) { + for (FX_INT32 i = 0; i < 7 - length; i++) { + encodeContents = FX_WCHAR('0') + encodeContents; + } + CFX_ByteString byteString = encodeContents.UTF8Encode(); + FX_INT32 checksum = ((CBC_OnedEAN8Writer *)m_pBCWriter)->CalcChecksum(byteString); + encodeContents += FX_WCHAR(checksum - 0 + '0'); + } + if (length > 8) { + encodeContents = encodeContents.Mid(0, 8); + } + return encodeContents; +} +FX_BOOL CBC_EAN8::Encode(FX_WSTR contents, FX_BOOL isDevice, FX_INT32 &e) +{ + if(contents.IsEmpty()) { + e = BCExceptionNoContents; + return FALSE; + } + BCFORMAT format = BCFORMAT_EAN_8; + FX_INT32 outWidth = 0; + FX_INT32 outHeight = 0; + CFX_WideString encodeContents = Preprocess(contents); + CFX_ByteString byteString = encodeContents.UTF8Encode(); + m_renderContents = encodeContents; + FX_BYTE *data = m_pBCWriter->Encode(byteString, format, outWidth, outHeight, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + ((CBC_OneDimWriter*)m_pBCWriter)->RenderResult(encodeContents, data, outWidth, isDevice, e); + FX_Free(data); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +FX_BOOL CBC_EAN8::RenderDevice(CFX_RenderDevice* device, const CFX_Matrix* matirx, FX_INT32 &e) +{ + ((CBC_OneDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx, m_renderContents, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +FX_BOOL CBC_EAN8::RenderBitmap(CFX_DIBitmap *&pOutBitmap, FX_INT32 &e) +{ + ((CBC_OneDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, m_renderContents, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +CFX_WideString CBC_EAN8::Decode(FX_BYTE* buf, FX_INT32 width, FX_INT32 hight, FX_INT32 &e) +{ + CFX_WideString str; + return str; +} +CFX_WideString CBC_EAN8::Decode(CFX_DIBitmap *pBitmap, FX_INT32 &e) +{ + CBC_BufferedImageLuminanceSource source(pBitmap); + CBC_GlobalHistogramBinarizer binarizer(&source); + CBC_BinaryBitmap bitmap(&binarizer); + CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L"")); + return CFX_WideString::FromUTF8(str, str.GetLength()); +} +CBC_EAN13::CBC_EAN13() +{ + m_pBCReader = (CBC_Reader*) FX_NEW (CBC_OnedEAN13Reader); + m_pBCWriter = (CBC_Writer*) FX_NEW (CBC_OnedEAN13Writer); +} +CBC_EAN13::~CBC_EAN13() +{ + if(m_pBCReader) { + delete(m_pBCReader); + m_pBCReader = NULL; + } + if(m_pBCWriter) { + delete(m_pBCWriter); + m_pBCWriter = NULL; + } +} +CFX_WideString CBC_EAN13::Preprocess(FX_WSTR contents) +{ + CFX_WideString encodeContents = ((CBC_OnedEAN8Writer*)m_pBCWriter)->FilterContents(contents); + FX_INT32 length = encodeContents.GetLength(); + if (length <= 12) { + for (FX_INT32 i = 0; i < 12 - length; i++) { + encodeContents = FX_WCHAR('0') + encodeContents; + } + CFX_ByteString byteString = encodeContents.UTF8Encode(); + FX_INT32 checksum = ((CBC_OnedEAN13Writer *)m_pBCWriter)->CalcChecksum(byteString); + byteString += checksum - 0 + '0'; + encodeContents = byteString.UTF8Decode(); + } + if (length > 13) { + encodeContents = encodeContents.Mid(0, 13); + } + return encodeContents; +} +FX_BOOL CBC_EAN13::Encode(FX_WSTR contents, FX_BOOL isDevice, FX_INT32 &e) +{ + if(contents.IsEmpty()) { + e = BCExceptionNoContents; + return FALSE; + } + BCFORMAT format = BCFORMAT_EAN_13; + FX_INT32 outWidth = 0; + FX_INT32 outHeight = 0; + CFX_WideString encodeContents = Preprocess(contents); + CFX_ByteString byteString = encodeContents.UTF8Encode(); + m_renderContents = encodeContents; + FX_BYTE *data = m_pBCWriter->Encode(byteString, format, outWidth, outHeight, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + ((CBC_OneDimWriter*)m_pBCWriter)->RenderResult(encodeContents, data, outWidth, isDevice, e); + FX_Free(data); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +FX_BOOL CBC_EAN13::RenderDevice(CFX_RenderDevice* device, const CFX_Matrix* matirx, FX_INT32 &e) +{ + ((CBC_OneDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx, m_renderContents, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +FX_BOOL CBC_EAN13::RenderBitmap(CFX_DIBitmap *&pOutBitmap, FX_INT32 &e) +{ + ((CBC_OneDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, m_renderContents, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +CFX_WideString CBC_EAN13::Decode(FX_BYTE* buf, FX_INT32 width, FX_INT32 hight, FX_INT32 &e) +{ + CFX_WideString str; + return str; +} +CFX_WideString CBC_EAN13::Decode(CFX_DIBitmap *pBitmap, FX_INT32 &e) +{ + CBC_BufferedImageLuminanceSource source(pBitmap); + CBC_GlobalHistogramBinarizer binarizer(&source); + CBC_BinaryBitmap bitmap(&binarizer); + CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L"")); + return CFX_WideString::FromUTF8(str, str.GetLength()); +} +CBC_UPCA::CBC_UPCA() +{ + m_pBCReader = (CBC_Reader*) FX_NEW (CBC_OnedUPCAReader); + ((CBC_OnedUPCAReader *)m_pBCReader)->Init(); + m_pBCWriter = (CBC_Writer*) FX_NEW (CBC_OnedUPCAWriter); +} +CBC_UPCA::~CBC_UPCA() +{ + if(m_pBCReader) { + delete(m_pBCReader); + m_pBCReader = NULL; + } + if(m_pBCWriter) { + delete(m_pBCWriter); + m_pBCWriter = NULL; + } +} +CFX_WideString CBC_UPCA::Preprocess(FX_WSTR contents) +{ + CFX_WideString encodeContents = ((CBC_OnedEAN8Writer*)m_pBCWriter)->FilterContents(contents); + FX_INT32 length = encodeContents.GetLength(); + if (length <= 11) { + for (FX_INT32 i = 0; i < 11 - length; i++) { + encodeContents = FX_WCHAR('0') + encodeContents; + } + CFX_ByteString byteString = encodeContents.UTF8Encode(); + FX_INT32 checksum = ((CBC_OnedUPCAWriter *)m_pBCWriter)->CalcChecksum(byteString); + byteString += checksum - 0 + '0'; + encodeContents = byteString.UTF8Decode(); + } + if (length > 12) { + encodeContents = encodeContents.Mid(0, 12); + } + return encodeContents; +} +FX_BOOL CBC_UPCA::Encode(FX_WSTR contents, FX_BOOL isDevice, FX_INT32 &e) +{ + if(contents.IsEmpty()) { + e = BCExceptionNoContents; + return FALSE; + } + BCFORMAT format = BCFORMAT_UPC_A; + FX_INT32 outWidth = 0; + FX_INT32 outHeight = 0; + CFX_WideString encodeContents = Preprocess(contents); + CFX_ByteString byteString = encodeContents.UTF8Encode(); + m_renderContents = encodeContents; + ((CBC_OnedUPCAWriter*)m_pBCWriter)->Init(); + FX_BYTE *data = m_pBCWriter->Encode(byteString, format, outWidth, outHeight, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + ((CBC_OneDimWriter*)m_pBCWriter)->RenderResult(encodeContents, data, outWidth, isDevice, e); + FX_Free(data); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +FX_BOOL CBC_UPCA::RenderDevice(CFX_RenderDevice* device, const CFX_Matrix* matirx, FX_INT32 &e) +{ + ((CBC_OneDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx, m_renderContents, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +FX_BOOL CBC_UPCA::RenderBitmap(CFX_DIBitmap *&pOutBitmap, FX_INT32 &e) +{ + ((CBC_OneDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, m_renderContents, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +CFX_WideString CBC_UPCA::Decode(FX_BYTE* buf, FX_INT32 width, FX_INT32 hight, FX_INT32 &e) +{ + CFX_WideString str; + return str; +} +CFX_WideString CBC_UPCA::Decode(CFX_DIBitmap *pBitmap, FX_INT32 &e) +{ + CBC_BufferedImageLuminanceSource source(pBitmap); + CBC_GlobalHistogramBinarizer binarizer(&source); + CBC_BinaryBitmap bitmap(&binarizer); + CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L"")); + return CFX_WideString::FromUTF8(str, str.GetLength()); +} +CBC_QRCode::CBC_QRCode() +{ + m_pBCReader = (CBC_Reader *) FX_NEW (CBC_QRCodeReader); + ((CBC_QRCodeReader*)m_pBCReader)->Init(); + m_pBCWriter = (CBC_Writer *) FX_NEW (CBC_QRCodeWriter); +} +CBC_QRCode ::~CBC_QRCode() +{ + if(m_pBCReader) { + delete(m_pBCReader); + m_pBCReader = NULL; + } + if(m_pBCWriter) { + delete(m_pBCWriter); + m_pBCWriter = NULL; + } +} +FX_BOOL CBC_QRCode::SetVersion(FX_INT32 version) +{ + if (version < 0 || version > 40) { + return FALSE; + } + if (m_pBCWriter == NULL) { + return FALSE; + } + return((CBC_QRCodeWriter*)m_pBCWriter)->SetVersion(version); +} +FX_BOOL CBC_QRCode::SetErrorCorrectionLevel (FX_INT32 level) +{ + if (level < 0 || level > 3) { + return FALSE; + } + if (m_pBCWriter == NULL) { + return FALSE; + } + return ((CBC_TwoDimWriter*)m_pBCWriter)->SetErrorCorrectionLevel(level); +} +FX_BOOL CBC_QRCode::Encode(FX_WSTR contents, FX_BOOL isDevice, FX_INT32 &e) +{ + FX_INT32 outWidth = 0; + FX_INT32 outHeight = 0; + FX_BYTE *data = ((CBC_QRCodeWriter*)m_pBCWriter)->Encode(contents, ((CBC_QRCodeWriter*)m_pBCWriter)->GetErrorCorrectionLevel(), outWidth, outHeight, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + ((CBC_TwoDimWriter*)m_pBCWriter)->RenderResult(data, outWidth, outHeight, e); + FX_Free(data); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +FX_BOOL CBC_QRCode::RenderDevice(CFX_RenderDevice* device, const CFX_Matrix* matirx, FX_INT32 &e) +{ + ((CBC_TwoDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx); + return TRUE; +} +FX_BOOL CBC_QRCode::RenderBitmap(CFX_DIBitmap *&pOutBitmap, FX_INT32 &e) +{ + ((CBC_TwoDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +CFX_WideString CBC_QRCode::Decode(FX_BYTE* buf, FX_INT32 width, FX_INT32 hight, FX_INT32 &e) +{ + CFX_WideString str; + return str; +} +CFX_WideString CBC_QRCode::Decode(CFX_DIBitmap *pBitmap, FX_INT32 &e) +{ + CBC_BufferedImageLuminanceSource source(pBitmap); + CBC_GlobalHistogramBinarizer binarizer(&source); + CBC_BinaryBitmap bitmap(&binarizer); + CFX_ByteString retStr = m_pBCReader->Decode(&bitmap, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L"")); + return CFX_WideString::FromUTF8(retStr, retStr.GetLength()); +} +CBC_PDF417I::CBC_PDF417I() +{ + m_pBCReader = (CBC_Reader*) FX_NEW (CBC_PDF417Reader); + m_pBCWriter = (CBC_Writer*) FX_NEW (CBC_PDF417Writer); +} +CBC_PDF417I::~CBC_PDF417I() +{ + if(m_pBCReader) { + delete(m_pBCReader); + m_pBCReader = NULL; + } + if(m_pBCWriter) { + delete(m_pBCWriter); + m_pBCWriter = NULL; + } +} +FX_BOOL CBC_PDF417I::SetErrorCorrectionLevel (FX_INT32 level) +{ + ((CBC_PDF417Writer*)m_pBCWriter)->SetErrorCorrectionLevel(level); + return TRUE; +} +void CBC_PDF417I::SetTruncated(FX_BOOL truncated) +{ + ((CBC_PDF417Writer*)m_pBCWriter)->SetTruncated(truncated); +} +FX_BOOL CBC_PDF417I::Encode(FX_WSTR contents, FX_BOOL isDevice, FX_INT32 &e) +{ + BCFORMAT format = BCFORMAT_PDF_417; + FX_INT32 outWidth = 0; + FX_INT32 outHeight = 0; + FX_BYTE *data = ((CBC_PDF417Writer*)m_pBCWriter)->Encode(contents, outWidth, outHeight, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + ((CBC_TwoDimWriter*)m_pBCWriter)->RenderResult(data, outWidth, outHeight, e); + FX_Free(data); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +FX_BOOL CBC_PDF417I::RenderDevice(CFX_RenderDevice* device, const CFX_Matrix* matirx, FX_INT32 &e) +{ + ((CBC_TwoDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx); + return TRUE; +} +FX_BOOL CBC_PDF417I::RenderBitmap(CFX_DIBitmap *&pOutBitmap, FX_INT32 &e) +{ + ((CBC_TwoDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +CFX_WideString CBC_PDF417I::Decode(FX_BYTE* buf, FX_INT32 width, FX_INT32 hight, FX_INT32 &e) +{ + CFX_WideString str; + return str; +} +CFX_WideString CBC_PDF417I::Decode(CFX_DIBitmap *pBitmap, FX_INT32 &e) +{ + CBC_BufferedImageLuminanceSource source(pBitmap); + CBC_GlobalHistogramBinarizer binarizer(&source); + CBC_BinaryBitmap bitmap(&binarizer); + CFX_ByteString bytestring = m_pBCReader->Decode(&bitmap, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L"")); + return CFX_WideString::FromUTF8(bytestring, bytestring.GetLength()); +} +CBC_DataMatrix::CBC_DataMatrix() +{ + m_pBCReader = (CBC_Reader*) FX_NEW (CBC_DataMatrixReader); + ((CBC_DataMatrixReader*)m_pBCReader)->Init(); + m_pBCWriter = (CBC_Writer*) FX_NEW (CBC_DataMatrixWriter); +} +CBC_DataMatrix::~CBC_DataMatrix() +{ + if(m_pBCReader) { + delete(m_pBCReader); + m_pBCReader = NULL; + } + if(m_pBCWriter) { + delete(m_pBCWriter); + m_pBCWriter = NULL; + } +} +FX_BOOL CBC_DataMatrix::Encode(FX_WSTR contents, FX_BOOL isDevice, FX_INT32 &e) +{ + FX_INT32 outWidth = 0; + FX_INT32 outHeight = 0; + FX_BYTE *data = ((CBC_DataMatrixWriter *)m_pBCWriter)->Encode(contents, outWidth, outHeight, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + ((CBC_TwoDimWriter*)m_pBCWriter)->RenderResult(data, outWidth, outHeight, e); + FX_Free(data); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +FX_BOOL CBC_DataMatrix::RenderDevice(CFX_RenderDevice* device, const CFX_Matrix* matirx, FX_INT32 &e) +{ + ((CBC_TwoDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx); + return TRUE; +} +FX_BOOL CBC_DataMatrix::RenderBitmap(CFX_DIBitmap *&pOutBitmap, FX_INT32 &e) +{ + ((CBC_TwoDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +CFX_WideString CBC_DataMatrix::Decode(FX_BYTE* buf, FX_INT32 width, FX_INT32 hight, FX_INT32 &e) +{ + CFX_WideString str; + return str; +} +CFX_WideString CBC_DataMatrix::Decode(CFX_DIBitmap *pBitmap, FX_INT32 &e) +{ + CBC_BufferedImageLuminanceSource source(pBitmap); + CBC_GlobalHistogramBinarizer binarizer(&source); + CBC_BinaryBitmap bitmap(&binarizer); + CFX_ByteString retStr = m_pBCReader->Decode(&bitmap, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L"")); + return CFX_WideString::FromUTF8(retStr, retStr.GetLength()); +} diff --git a/xfa/src/fxbarcode/src/BC_Base256Encoder.cpp b/xfa/src/fxbarcode/src/BC_Base256Encoder.cpp new file mode 100644 index 0000000000..c0e1f46fd4 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_Base256Encoder.cpp @@ -0,0 +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 "barcode.h" +#include "include/BC_Encoder.h" +#include "include/BC_Dimension.h" +#include "include/BC_SymbolShapeHint.h" +#include "include/BC_SymbolInfo.h" +#include "include/BC_EncoderContext.h" +#include "include/BC_HighLevelEncoder.h" +#include "include/BC_Base256Encoder.h" +CBC_Base256Encoder::CBC_Base256Encoder() +{ +} +CBC_Base256Encoder::~CBC_Base256Encoder() +{ +} +FX_INT32 CBC_Base256Encoder::getEncodingMode() +{ + return BASE256_ENCODATION; +} +void CBC_Base256Encoder::Encode(CBC_EncoderContext &context, FX_INT32 &e) +{ + CFX_WideString buffer; + buffer += (FX_WCHAR)'\0'; + while (context.hasMoreCharacters()) { + FX_WCHAR c = context.getCurrentChar(); + buffer += c; + context.m_pos++; + FX_INT32 newMode = CBC_HighLevelEncoder::lookAheadTest(context.m_msg, context.m_pos, getEncodingMode()); + if (newMode != getEncodingMode()) { + context.signalEncoderChange(newMode); + break; + } + } + FX_INT32 dataCount = buffer.GetLength() - 1; + FX_CHAR buf[128]; +#if defined(_FX_WINAPI_PARTITION_APP_) + memset(buf, 0, sizeof(FX_CHAR) * 128); + _itoa_s(dataCount, buf, 128, 10); +#else + FXSYS_itoa(dataCount, buf, 10); +#endif + buffer.SetAt(0, FX_WCHAR(*buf) - '0'); + FX_INT32 lengthFieldSize = 1; + FX_INT32 currentSize = context.getCodewordCount() + dataCount + lengthFieldSize; + context.updateSymbolInfo(currentSize, e); + if (e != BCExceptionNO) { + return; + } + FX_BOOL mustPad = (context.m_symbolInfo->m_dataCapacity - currentSize) > 0; + if (context.hasMoreCharacters() || mustPad) { + if (dataCount <= 249) { + buffer.SetAt(0, (FX_WCHAR) dataCount); + } else if (dataCount > 249 && dataCount <= 1555) { + buffer.SetAt(0, (FX_WCHAR) ((dataCount / 250) + 249)); + buffer.Insert(1, (FX_WCHAR) (dataCount % 250)); + } else { + e = BCExceptionIllegalStateMessageLengthInvalid; + return; + } + } + for (FX_INT32 i = 0, c = buffer.GetLength(); i < c; i++) { + context.writeCodeword(randomize255State(buffer.GetAt(i), context.getCodewordCount() + 1)); + } +} +FX_WCHAR CBC_Base256Encoder::randomize255State(FX_WCHAR ch, FX_INT32 codewordPosition) +{ + FX_INT32 pseudoRandom = ((149 * codewordPosition) % 255) + 1; + FX_INT32 tempVariable = ch + pseudoRandom; + if (tempVariable <= 255) { + return (FX_WCHAR) tempVariable; + } else { + return (FX_WCHAR) (tempVariable - 256); + } +} diff --git a/xfa/src/fxbarcode/src/BC_Binarizer.cpp b/xfa/src/fxbarcode/src/BC_Binarizer.cpp new file mode 100644 index 0000000000..e18efe2e31 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_Binarizer.cpp @@ -0,0 +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 + +#include "barcode.h" +#include "include/BC_LuminanceSource.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_CommonBitArray.h" +#include "include/BC_Binarizer.h" +CBC_Binarizer::CBC_Binarizer(CBC_LuminanceSource *source) +{ + m_source = source; +} +CBC_Binarizer::~CBC_Binarizer() +{ +} +CBC_LuminanceSource *CBC_Binarizer::GetLuminanceSource() +{ + return m_source; +} diff --git a/xfa/src/fxbarcode/src/BC_BinaryBitmap.cpp b/xfa/src/fxbarcode/src/BC_BinaryBitmap.cpp new file mode 100644 index 0000000000..64f64bfe06 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_BinaryBitmap.cpp @@ -0,0 +1,60 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_Binarizer.h" +#include "include/BC_LuminanceSource.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_CommonBitArray.h" +#include "include/BC_BinaryBitmap.h" +CBC_BinaryBitmap::CBC_BinaryBitmap(CBC_Binarizer *binarizer): m_binarizer(binarizer), m_matrix(NULL) +{ +} +CBC_BinaryBitmap::~CBC_BinaryBitmap() +{ + if (m_matrix != NULL) { + delete m_matrix; + } + m_matrix = NULL; +} +FX_INT32 CBC_BinaryBitmap::GetHeight() +{ + return m_binarizer->GetLuminanceSource()->GetHeight(); +} +FX_INT32 CBC_BinaryBitmap::GetWidth() +{ + return m_binarizer->GetLuminanceSource()->GetWidth(); +} +CBC_CommonBitMatrix *CBC_BinaryBitmap::GetMatrix(FX_INT32 &e) +{ + if (m_matrix == NULL) { + m_matrix = m_binarizer->GetBlackMatrix(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + return m_matrix; +} +FX_BOOL CBC_BinaryBitmap::IsCropSupported() +{ + return m_binarizer->GetLuminanceSource()->IsCropSupported(); +} +FX_BOOL CBC_BinaryBitmap::IsRotateSupported() +{ + return m_binarizer->GetLuminanceSource()->IsRotateSupported(); +} +CBC_CommonBitArray *CBC_BinaryBitmap::GetBlackRow(FX_INT32 y, CBC_CommonBitArray *row, FX_INT32 &e) +{ + CBC_CommonBitArray *temp = m_binarizer->GetBlackRow(y, row, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return temp; +} +CBC_CommonBitMatrix *CBC_BinaryBitmap::GetBlackMatrix(FX_INT32 &e) +{ + if (m_matrix == NULL) { + m_matrix = m_binarizer->GetBlackMatrix(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + return m_matrix; +} diff --git a/xfa/src/fxbarcode/src/BC_BufferedImageLuminanceSource.cpp b/xfa/src/fxbarcode/src/BC_BufferedImageLuminanceSource.cpp new file mode 100644 index 0000000000..b0f5267d4d --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_BufferedImageLuminanceSource.cpp @@ -0,0 +1,188 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_LuminanceSource.h" +#include "include/BC_BufferedImageLuminanceSource.h" +class CBC_Pause : public IFX_Pause +{ +public: + virtual FX_BOOL NeedToPauseNow() + { + return TRUE; + } +}; +static CFX_DIBitmap* CreateDIBSource(IFX_FileRead* fileread) +{ + CFX_DIBitmap* bitmap = NULL; + CCodec_ModuleMgr* pCodecMgr = NULL; + ICodec_ProgressiveDecoder* pImageCodec = NULL; + pCodecMgr = CCodec_ModuleMgr::Create(); + pImageCodec = pCodecMgr->CreateProgressiveDecoder(); + FXCODEC_STATUS status = FXCODEC_STATUS_DECODE_FINISH; + status = pImageCodec->LoadImageInfo(fileread, FXCODEC_IMAGE_UNKNOWN); + if (status != FXCODEC_STATUS_FRAME_READY) { + return NULL; + } + bitmap = FX_NEW CFX_DIBitmap; + bitmap->Create(pImageCodec->GetWidth(), pImageCodec->GetHeight(), FXDIB_Argb); + bitmap->Clear(FXARGB_MAKE(0xFF, 0xFF, 0xFF, 0xFF)); + CBC_Pause pause; + FX_INT32 frames; + status = pImageCodec->GetFrames(frames, &pause); + while (status == FXCODEC_STATUS_FRAME_TOBECONTINUE) { + status = pImageCodec->GetFrames(frames, &pause); + } + if (status != FXCODEC_STATUS_DECODE_READY) { + goto except; + } + status = pImageCodec->StartDecode(bitmap, + 0, + 0, + bitmap->GetWidth(), + bitmap->GetHeight(), + 0, + FALSE); + if (status == FXCODEC_STATUS_ERR_PARAMS) { + goto except; + } + if (status != FXCODEC_STATUS_DECODE_TOBECONTINUE) { + goto except; + } + while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { + status = pImageCodec->ContinueDecode(&pause); + } + if (status != FXCODEC_STATUS_DECODE_FINISH) { + goto except; + } + if (pImageCodec) { + delete pImageCodec; + pImageCodec = NULL; + } + if (pCodecMgr) { + pCodecMgr->Destroy(); + pCodecMgr = NULL; + } + return bitmap; +except: + if (pImageCodec) { + delete pImageCodec; + pImageCodec = NULL; + } + if (pCodecMgr) { + pCodecMgr->Destroy(); + pCodecMgr = NULL; + } + if (bitmap) { + delete bitmap; + } + return NULL; +} +CBC_BufferedImageLuminanceSource::CBC_BufferedImageLuminanceSource(const CFX_WideString &filename): CBC_LuminanceSource(0, 0), m_filename(filename) +{ + m_height = 0; + m_width = 0; + m_bytesPerLine = 0; + m_top = 0; + m_left = 0; +} +void CBC_BufferedImageLuminanceSource::Init(FX_INT32 &e) +{ + IFX_FileRead* fileread = FX_CreateFileRead(m_filename); + m_pBitmap = CreateDIBSource(fileread); + if (m_pBitmap == NULL) { + e = BCExceptionLoadFile; + return; + } + m_pBitmap->ConvertFormat(FXDIB_Argb); + m_height = m_pBitmap->GetHeight(); + m_width = m_pBitmap->GetWidth(); + m_rgbData.SetSize(m_height * m_width); + m_bytesPerLine = m_width * 4; + m_top = 0; + m_left = 0; +} +CBC_BufferedImageLuminanceSource::CBC_BufferedImageLuminanceSource(CFX_DIBitmap *pBitmap): CBC_LuminanceSource(0, 0) +{ + m_pBitmap = pBitmap->Clone(); + m_pBitmap->ConvertFormat(FXDIB_Argb); + m_height = m_pBitmap->GetHeight(); + m_width = m_pBitmap->GetWidth(); + m_rgbData.SetSize(m_height * m_width); + m_bytesPerLine = m_width * 4; + m_top = 0; + m_left = 0; +} +CBC_BufferedImageLuminanceSource::~CBC_BufferedImageLuminanceSource() +{ + delete m_pBitmap; + m_pBitmap = NULL; +} +CFX_ByteArray *CBC_BufferedImageLuminanceSource::GetRow(FX_INT32 y, CFX_ByteArray &row, FX_INT32 &e) +{ + if (y < 0 || y >= m_height) { + e = BCExceptionRequestedRowIsOutSizeTheImage; + return NULL; + } + FX_INT32 width = m_width; + if(row.GetSize() == 0 || row.GetSize() < width) { + row.SetSize(width); + } + if(m_rgbData.GetSize() == 0 || m_rgbData.GetSize() < width) { + m_rgbData.SetSize(width); + } + FX_INT32* rowLine = (FX_INT32*)m_pBitmap->GetScanline(y); + FX_INT32 x; + for (x = 0; x < width; x++) { + FX_INT32 pixel = rowLine[x]; + FX_INT32 luminance = (306 * ((pixel >> 16) & 0xFF) + + 601 * ((pixel >> 8) & 0xFF) + + 117 * (pixel & 0xFF)) >> 10; + row[x] = (FX_BYTE) luminance; + } + return &row; +} +CFX_ByteArray *CBC_BufferedImageLuminanceSource::GetMatrix() +{ + CFX_ByteArray *matirx = FX_NEW CFX_ByteArray(); + matirx->SetSize(m_bytesPerLine * m_height); + FX_INT32 *rgb = (FX_INT32*)m_pBitmap->GetBuffer(); + FX_INT32 y; + for(y = 0; y < m_height; y++) { + FX_INT32 offset = y * m_width; + FX_INT32 x; + for(x = 0; x < m_width; x++) { + FX_INT32 pixel = rgb[offset + x]; + FX_INT32 luminance = (306 * ((pixel >> 16) & 0xFF) + + 601 * ((pixel >> 8) & 0xFF) + + 117 * (pixel & 0xFF)) >> 10; + (*matirx)[offset + x] = (FX_BYTE) luminance; + } + } + return matirx; +} +FX_BOOL CBC_BufferedImageLuminanceSource::IsCropSupported() +{ + return TRUE; +} +FX_BOOL CBC_BufferedImageLuminanceSource::IsRotateSupported() +{ + return TRUE; +} +CBC_LuminanceSource *CBC_BufferedImageLuminanceSource::Crop(FX_INT32 left, FX_INT32 top, FX_INT32 width, FX_INT32 height) +{ + return NULL; +} +CBC_LuminanceSource *CBC_BufferedImageLuminanceSource::RotateCounterClockwise(FX_INT32 &e) +{ + if (!IsRotateSupported()) { + e = BCExceptionRotateNotSupported; + return NULL; + } + FX_INT32 sourceWidth = m_width; + FX_INT32 sourceHeight = m_height; + return NULL; +} diff --git a/xfa/src/fxbarcode/src/BC_C40Encoder.cpp b/xfa/src/fxbarcode/src/BC_C40Encoder.cpp new file mode 100644 index 0000000000..da3a8efaae --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_C40Encoder.cpp @@ -0,0 +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 + +#include "barcode.h" +#include "include/BC_Encoder.h" +#include "include/BC_Dimension.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_SymbolShapeHint.h" +#include "include/BC_SymbolInfo.h" +#include "include/BC_EncoderContext.h" +#include "include/BC_HighLevelEncoder.h" +#include "include/BC_C40Encoder.h" +CBC_C40Encoder::CBC_C40Encoder() +{ +} +CBC_C40Encoder::~CBC_C40Encoder() +{ +} +FX_INT32 CBC_C40Encoder::getEncodingMode() +{ + return C40_ENCODATION; +} +void CBC_C40Encoder::Encode(CBC_EncoderContext &context, FX_INT32 &e) +{ + CFX_WideString buffer; + while (context.hasMoreCharacters()) { + FX_WCHAR c = context.getCurrentChar(); + context.m_pos++; + FX_INT32 lastCharSize = encodeChar(c, buffer, e); + if (e != BCExceptionNO) { + return; + } + FX_INT32 unwritten = (buffer.GetLength() / 3) * 2; + FX_INT32 curCodewordCount = context.getCodewordCount() + unwritten; + context.updateSymbolInfo(curCodewordCount, e); + if (e != BCExceptionNO) { + return; + } + FX_INT32 available = context.m_symbolInfo->m_dataCapacity - curCodewordCount; + if (!context.hasMoreCharacters()) { + CFX_WideString removed; + if ((buffer.GetLength() % 3) == 2) { + if (available < 2 || available > 2) { + lastCharSize = backtrackOneCharacter(context, buffer, removed, lastCharSize, e); + if (e != BCExceptionNO) { + return; + } + } + } + while ((buffer.GetLength() % 3) == 1 + && ((lastCharSize <= 3 && available != 1) || lastCharSize > 3)) { + lastCharSize = backtrackOneCharacter(context, buffer, removed, lastCharSize, e); + if (e != BCExceptionNO) { + return; + } + } + break; + } + FX_INT32 count = buffer.GetLength(); + if ((count % 3) == 0) { + FX_INT32 newMode = CBC_HighLevelEncoder::lookAheadTest(context.m_msg, context.m_pos, getEncodingMode()); + if (newMode != getEncodingMode()) { + context.signalEncoderChange(newMode); + break; + } + } + } + handleEOD(context, buffer, e); +} +void CBC_C40Encoder::writeNextTriplet(CBC_EncoderContext &context, CFX_WideString &buffer) +{ + context.writeCodewords(encodeToCodewords(buffer, 0)); + buffer.Delete(0, 3); +} +void CBC_C40Encoder::handleEOD(CBC_EncoderContext &context, CFX_WideString &buffer, FX_INT32 &e) +{ + FX_INT32 unwritten = (buffer.GetLength() / 3) * 2; + FX_INT32 rest = buffer.GetLength() % 3; + FX_INT32 curCodewordCount = context.getCodewordCount() + unwritten; + context.updateSymbolInfo(curCodewordCount, e); + if (e != BCExceptionNO) { + return; + } + FX_INT32 available = context.m_symbolInfo->m_dataCapacity - curCodewordCount; + if (rest == 2) { + buffer += (FX_WCHAR)'\0'; + while (buffer.GetLength() >= 3) { + writeNextTriplet(context, buffer); + } + if (context.hasMoreCharacters()) { + context.writeCodeword(CBC_HighLevelEncoder::C40_UNLATCH); + } + } else if (available == 1 && rest == 1) { + while (buffer.GetLength() >= 3) { + writeNextTriplet(context, buffer); + } + if (context.hasMoreCharacters()) { + context.writeCodeword(CBC_HighLevelEncoder::C40_UNLATCH); + } + context.m_pos--; + } else if (rest == 0) { + while (buffer.GetLength() >= 3) { + writeNextTriplet(context, buffer); + } + if (available > 0 || context.hasMoreCharacters()) { + context.writeCodeword(CBC_HighLevelEncoder::C40_UNLATCH); + } + } else { + e = BCExceptionIllegalStateUnexpectedCase; + return; + } + context.signalEncoderChange(ASCII_ENCODATION); +} +FX_INT32 CBC_C40Encoder::encodeChar(FX_WCHAR c, CFX_WideString &sb, FX_INT32 &e) +{ + if (c == ' ') { + sb += (FX_WCHAR)'\3'; + return 1; + } else if ((c >= '0') && (c <= '9')) { + sb += (FX_WCHAR)(c - 48 + 4); + return 1; + } else if ((c >= 'A') && (c <= 'Z')) { + sb += (FX_WCHAR)(c - 65 + 14); + return 1; + } else if ((c >= '\0') && (c <= 0x1f)) { + sb += (FX_WCHAR)'\0'; + sb += c; + return 2; + } else if ((c >= '!') && (c <= '/')) { + sb += (FX_WCHAR)'\1'; + sb += (FX_WCHAR)(c - 33); + return 2; + } else if ((c >= ':') && (c <= '@')) { + sb += (FX_WCHAR)'\1'; + sb += (FX_WCHAR)(c - 58 + 15); + return 2; + } else if ((c >= '[') && (c <= '_')) { + sb += (FX_WCHAR)'\1'; + sb += (FX_WCHAR)(c - 91 + 22); + return 2; + } else if ((c >= 60) && (c <= 0x7f)) { + sb += (FX_WCHAR)'\2'; + sb += (FX_WCHAR)(c - 96); + return 2; + } else if (c >= 80) { + sb += (FX_WCHAR)'\1'; + sb += (FX_WCHAR)0x001e; + FX_INT32 len = 2; + len += encodeChar((c - 128), sb, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + return len; + } else { + e = BCExceptionIllegalArgument; + return 0; + } +} +FX_INT32 CBC_C40Encoder::backtrackOneCharacter(CBC_EncoderContext &context, CFX_WideString &buffer, CFX_WideString &removed, FX_INT32 lastCharSize, FX_INT32 &e) +{ + FX_INT32 count = buffer.GetLength(); + buffer.Delete(count - lastCharSize, count); + context.m_pos--; + FX_WCHAR c = context.getCurrentChar(); + lastCharSize = encodeChar(c, removed, e); + BC_EXCEPTION_CHECK_ReturnValue(e, -1); + context.resetSymbolInfo(); + return lastCharSize; +} +CFX_WideString CBC_C40Encoder::encodeToCodewords(CFX_WideString sb, FX_INT32 startPos) +{ + FX_WCHAR c1 = sb.GetAt(startPos); + FX_WCHAR c2 = sb.GetAt(startPos + 1); + FX_WCHAR c3 = sb.GetAt(startPos + 2); + FX_INT32 v = (1600 * c1) + (40 * c2) + c3 + 1; + FX_WCHAR cw1 = (FX_WCHAR) (v / 256); + FX_WCHAR cw2 = (FX_WCHAR) (v % 256); + CFX_WideString b1(cw1); + CFX_WideString b2(cw2); + return b1 + b2; +} diff --git a/xfa/src/fxbarcode/src/BC_CommonBitArray.cpp b/xfa/src/fxbarcode/src/BC_CommonBitArray.cpp new file mode 100644 index 0000000000..a42f444399 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_CommonBitArray.cpp @@ -0,0 +1,108 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_CommonBitArray.h" +CBC_CommonBitArray::CBC_CommonBitArray(CBC_CommonBitArray* array) +{ + m_size = array->GetSize(); + m_bits.Copy(array->GetBits()); +} +CBC_CommonBitArray::CBC_CommonBitArray() +{ + m_bits.SetSize(1); + m_size = 0; +} +CBC_CommonBitArray::CBC_CommonBitArray(FX_INT32 size) +{ + m_bits.SetSize((size + 31) >> 5); + m_size = size; +} +CBC_CommonBitArray::~CBC_CommonBitArray() +{ + m_size = 0; +} +FX_INT32 CBC_CommonBitArray::GetSize() +{ + return m_size; +} +CFX_Int32Array& CBC_CommonBitArray::GetBits() +{ + return m_bits; +} +FX_INT32 CBC_CommonBitArray::GetSizeInBytes() +{ + return (m_size + 7) >> 3; +} +FX_BOOL CBC_CommonBitArray::Get(FX_INT32 i) +{ + return (m_bits[i >> 5] & (1 << (i & 0x1f))) != 0; +} +void CBC_CommonBitArray::Set(FX_INT32 i) +{ + m_bits[i >> 5] |= 1 << (i & 0x1F); +} +void CBC_CommonBitArray::Flip(FX_INT32 i) +{ + m_bits[i >> 5] ^= 1 << (i & 0x1F); +} +void CBC_CommonBitArray::SetBulk(FX_INT32 i, FX_INT32 newBits) +{ + m_bits[i >> 5] = newBits; +} +void CBC_CommonBitArray::Clear() +{ + FXSYS_memset32(&m_bits[0], 0x00, m_bits.GetSize() * sizeof(FX_INT32)); +} +FX_BOOL CBC_CommonBitArray::IsRange(FX_INT32 start, FX_INT32 end, FX_BOOL value, FX_INT32 &e) +{ + if (end < start) { + e = BCExceptionEndLessThanStart; + return FALSE; + } + if (end == start) { + return TRUE; + } + end--; + FX_INT32 firstInt = start >> 5; + FX_INT32 lastInt = end >> 5; + FX_INT32 i; + for (i = firstInt; i <= lastInt; i++) { + FX_INT32 firstBit = i > firstInt ? 0 : start & 0x1F; + FX_INT32 lastBit = i < lastInt ? 31 : end & 0x1F; + FX_INT32 mask; + if (firstBit == 0 && lastBit == 31) { + mask = -1; + } else { + mask = 0; + for (FX_INT32 j = firstBit; j <= lastBit; j++) { + mask |= 1 << j; + } + } + if ((m_bits[i] & mask) != (value ? mask : 0)) { + return FALSE; + } + } + return TRUE; +} +FX_INT32* CBC_CommonBitArray::GetBitArray() +{ + return &m_bits[0]; +} +void CBC_CommonBitArray::Reverse() +{ + FX_INT32* newBits = FX_Alloc(FX_INT32, m_bits.GetSize()); + FXSYS_memset32(newBits, 0x00, m_bits.GetSize() * sizeof(FX_INT32)); + FX_INT32 size = m_size; + FX_INT32 i; + for (i = 0; i < size; i++) { + if (Get(size - i - 1)) { + newBits[i >> 5] |= 1 << (i & 0x1F); + } + } + FXSYS_memcpy32(&m_bits[0], newBits, m_bits.GetSize() * sizeof(FX_INT32)); + FX_Free(newBits); +} diff --git a/xfa/src/fxbarcode/src/BC_CommonBitMatrix.cpp b/xfa/src/fxbarcode/src/BC_CommonBitMatrix.cpp new file mode 100644 index 0000000000..3437571fee --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_CommonBitMatrix.cpp @@ -0,0 +1,145 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_CommonBitArray.h" +#include "include/BC_CommonBitMatrix.h" +CBC_CommonBitMatrix::CBC_CommonBitMatrix() +{ + m_width = 0; + m_height = 0; + m_rowSize = 0; + m_bits = NULL; +} +void CBC_CommonBitMatrix::Init(FX_INT32 dimension) +{ + m_width = dimension; + m_height = dimension; + FX_INT32 rowSize = (m_height + 31) >> 5; + m_rowSize = rowSize; + m_bits = FX_Alloc(FX_INT32, m_rowSize * m_height); + FXSYS_memset32(m_bits, 0, m_rowSize * m_height * sizeof(FX_INT32)); +} +void CBC_CommonBitMatrix::Init(FX_INT32 width, FX_INT32 height) +{ + m_width = width; + m_height = height; + FX_INT32 rowSize = (width + 31) >> 5; + m_rowSize = rowSize; + m_bits = FX_Alloc(FX_INT32, m_rowSize * m_height); + FXSYS_memset32(m_bits, 0, m_rowSize * m_height * sizeof(FX_INT32)); +} +CBC_CommonBitMatrix::~CBC_CommonBitMatrix() +{ + if (m_bits != NULL) { + FX_Free(m_bits); + } + m_bits = NULL; + m_height = m_width = m_rowSize = 0; +} +FX_BOOL CBC_CommonBitMatrix::Get(FX_INT32 x, FX_INT32 y) +{ + FX_INT32 offset = y * m_rowSize + (x >> 5); + if (offset >= m_rowSize * m_height || offset < 0) { + return false; + } + return ((((FX_DWORD)m_bits[offset]) >> (x & 0x1f)) & 1) != 0; +} +FX_INT32* CBC_CommonBitMatrix::GetBits() +{ + return m_bits; +} +void CBC_CommonBitMatrix::Set(FX_INT32 x, FX_INT32 y) +{ + FX_INT32 offset = y * m_rowSize + (x >> 5); + if (offset >= m_rowSize * m_height || offset < 0) { + return; + } + m_bits[offset] |= 1 << (x & 0x1f); +} +void CBC_CommonBitMatrix::Flip(FX_INT32 x, FX_INT32 y) +{ + FX_INT32 offset = y * m_rowSize + (x >> 5); + m_bits[offset] ^= 1 << (x & 0x1f); +} +void CBC_CommonBitMatrix::Clear() +{ + FXSYS_memset32(m_bits, 0, m_rowSize * m_height * sizeof(FX_INT32)); +} +void CBC_CommonBitMatrix::SetRegion(FX_INT32 left, FX_INT32 top, FX_INT32 width, FX_INT32 height, FX_INT32 &e) +{ + if (top < 0 || left < 0) { + e = BCExceptionLeftAndTopMustBeNonnegative; + return; + } + if (height < 1 || width < 1) { + e = BCExceptionHeightAndWidthMustBeAtLeast1; + return; + } + FX_INT32 right = left + width; + FX_INT32 bottom = top + height; + if (m_height < bottom || m_width < right) { + e = BCExceptionRegionMustFitInsideMatrix; + return; + } + FX_INT32 y; + for (y = top; y < bottom; y++) { + FX_INT32 offset = y * m_rowSize; + FX_INT32 x; + for (x = left; x < right; x++) { + m_bits[offset + (x >> 5)] |= 1 << (x & 0x1f); + } + } +} +CBC_CommonBitArray* CBC_CommonBitMatrix::GetRow(FX_INT32 y, CBC_CommonBitArray* row) +{ + CBC_CommonBitArray* rowArray = NULL; + if (row == NULL || row->GetSize() < m_width) { + rowArray = FX_NEW CBC_CommonBitArray(m_width); + } else { + rowArray = FX_NEW CBC_CommonBitArray(row); + } + FX_INT32 offset = y * m_rowSize; + FX_INT32 x; + for (x = 0; x < m_rowSize; x++) { + rowArray->SetBulk(x << 5, m_bits[offset + x]); + } + return rowArray; +} +void CBC_CommonBitMatrix::SetRow(FX_INT32 y, CBC_CommonBitArray* row) +{ + FX_INT32 l = y * m_rowSize; + for (FX_INT32 i = 0; i < m_rowSize; i++) { + m_bits[l] = row->GetBitArray()[i]; + l++; + } +} +void CBC_CommonBitMatrix::SetCol(FX_INT32 y, CBC_CommonBitArray* col) +{ + for (FX_INT32 i = 0; i < col->GetBits().GetSize(); i++) { + m_bits[i * m_rowSize + y] = col->GetBitArray()[i]; + } +} +FX_INT32 CBC_CommonBitMatrix::GetWidth() +{ + return m_width; +} +FX_INT32 CBC_CommonBitMatrix::GetHeight() +{ + return m_height; +} +FX_INT32 CBC_CommonBitMatrix::GetRowSize() +{ + return m_rowSize; +} +FX_INT32 CBC_CommonBitMatrix::GetDimension(FX_INT32 &e) +{ + if (m_width != m_height) { + e = BCExceptionCanNotCallGetDimensionOnNonSquareMatrix; + return 0; + } + return m_width; +} diff --git a/xfa/src/fxbarcode/src/BC_CommonBitSource.cpp b/xfa/src/fxbarcode/src/BC_CommonBitSource.cpp new file mode 100644 index 0000000000..de29002753 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_CommonBitSource.cpp @@ -0,0 +1,60 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_CommonBitSource.h" +CBC_CommonBitSource::CBC_CommonBitSource(CFX_ByteArray* bytes) +{ + m_bytes.Copy((*bytes)); + m_bitOffset = 0; + m_byteOffset = 0; +} +CBC_CommonBitSource::~CBC_CommonBitSource() +{ +} +FX_INT32 CBC_CommonBitSource::ReadBits(FX_INT32 numBits, FX_INT32 &e) +{ + if (numBits < 1 || numBits > 32) { + e = BCExceptionIllegalArgument; + return 0; + } + FX_INT32 result = 0; + if (m_bitOffset > 0) { + FX_INT32 bitsLeft = 8 - m_bitOffset; + FX_INT32 toRead = numBits < bitsLeft ? numBits : bitsLeft; + FX_INT32 bitsToNotRead = bitsLeft - toRead; + FX_INT32 mask = (0xff >> (8 - toRead)) << bitsToNotRead; + result = (m_bytes[m_byteOffset] & mask) >> bitsToNotRead; + numBits -= toRead; + m_bitOffset += toRead; + if (m_bitOffset == 8) { + m_bitOffset = 0; + m_byteOffset++; + } + } + if (numBits > 0) { + while(numBits >= 8) { + result = (result << 8) | (m_bytes[m_byteOffset] & 0xff); + m_byteOffset++; + numBits -= 8; + } + if (numBits > 0) { + FX_INT32 bitsToNotRead = 8 - numBits; + FX_INT32 mask = (0xff >> bitsToNotRead) << bitsToNotRead; + result = (result << numBits) | ((m_bytes[m_byteOffset] & mask) >> bitsToNotRead); + m_bitOffset += numBits; + } + } + return result; +} +FX_INT32 CBC_CommonBitSource::Available() +{ + return 8 * (m_bytes.GetSize() - m_byteOffset) - m_bitOffset; +} +FX_INT32 CBC_CommonBitSource::getByteOffset() +{ + return m_byteOffset; +} diff --git a/xfa/src/fxbarcode/src/BC_CommonByteArray.cpp b/xfa/src/fxbarcode/src/BC_CommonByteArray.cpp new file mode 100644 index 0000000000..bdf9dd2405 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_CommonByteArray.cpp @@ -0,0 +1,98 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_CommonByteArray.h" +CBC_CommonByteArray::CBC_CommonByteArray() +{ + m_bytes = NULL; + m_size = 0; + m_index = 0; +} +CBC_CommonByteArray::CBC_CommonByteArray(FX_INT32 size) +{ + m_size = size; + m_bytes = FX_Alloc(FX_BYTE, size); + FXSYS_memset32(m_bytes, 0, size); + m_index = 0; +} +CBC_CommonByteArray::CBC_CommonByteArray(FX_BYTE* byteArray, FX_INT32 size) +{ + m_size = size; + m_bytes = FX_Alloc(FX_BYTE, size); + FXSYS_memcpy32(m_bytes, byteArray, size); + m_index = size; +} +CBC_CommonByteArray::~CBC_CommonByteArray() +{ + if ( m_bytes != NULL) { + FX_Free( m_bytes ); + m_bytes = NULL; + } + m_index = 0; + m_size = 0; +} +FX_INT32 CBC_CommonByteArray::At(FX_INT32 index) +{ + return m_bytes[index] & 0xff; +} +void CBC_CommonByteArray::Set(FX_INT32 index, FX_INT32 value) +{ + m_bytes[index] = (FX_BYTE) value; +} +FX_INT32 CBC_CommonByteArray::Size() +{ + return m_size; +} +FX_BOOL CBC_CommonByteArray::IsEmpty() +{ + return m_size == 0; +} +void CBC_CommonByteArray::AppendByte(FX_INT32 value) +{ + if (m_size == 0 || m_index >= m_size) { + FX_INT32 newSize = FX_MAX(32, m_size << 1); + Reserve(newSize); + } + m_bytes[m_index] = (FX_BYTE)value; + m_index++; +} +void CBC_CommonByteArray::Reserve(FX_INT32 capacity) +{ + if (m_bytes == NULL || m_size < capacity) { + FX_BYTE *newArray = FX_Alloc(FX_BYTE, capacity); + FXSYS_memset32(newArray, 0, capacity); + if (m_bytes != NULL) { + FXSYS_memcpy32(newArray, m_bytes, m_size); + FX_Free( m_bytes ); + } + m_bytes = newArray; + m_size = capacity; + } +} +void CBC_CommonByteArray::Set(FX_BYTE* source, FX_INT32 offset, FX_INT32 count) +{ + if (m_bytes != NULL) { + FX_Free( m_bytes ); + } + m_bytes = FX_Alloc(FX_BYTE, count); + m_size = count; + FXSYS_memcpy32(m_bytes, source + offset, count); + m_index = count; +} +void CBC_CommonByteArray::Set(CFX_ByteArray* source, FX_INT32 offset, FX_INT32 count) +{ + if (m_bytes != NULL) { + FX_Free( m_bytes ); + } + m_bytes = FX_Alloc(FX_BYTE, count); + m_size = count; + FX_INT32 i; + for(i = 0; i < count; i++) { + m_bytes[i] = source->operator [](i + offset); + } + m_index = m_size; +} diff --git a/xfa/src/fxbarcode/src/BC_CommonByteMatrix.cpp b/xfa/src/fxbarcode/src/BC_CommonByteMatrix.cpp new file mode 100644 index 0000000000..50e89e783b --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_CommonByteMatrix.cpp @@ -0,0 +1,60 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_CommonByteMatrix.h" +CBC_CommonByteMatrix::CBC_CommonByteMatrix(FX_INT32 width, FX_INT32 height) +{ + m_height = height; + m_width = width; + m_bytes = NULL; +} +void CBC_CommonByteMatrix::Init() +{ + m_bytes = FX_Alloc(FX_BYTE, m_height * m_width); + FXSYS_memset8(m_bytes, 0xff, m_height * m_width); +} +CBC_CommonByteMatrix::~CBC_CommonByteMatrix() +{ + if(m_bytes != NULL) { + FX_Free(m_bytes); + m_bytes = NULL; + } +} +FX_INT32 CBC_CommonByteMatrix::GetHeight() +{ + return m_height; +} +FX_INT32 CBC_CommonByteMatrix::GetWidth() +{ + return m_width; +} +FX_BYTE CBC_CommonByteMatrix::Get(FX_INT32 x, FX_INT32 y) +{ + return m_bytes[y * m_width + x]; +} +void CBC_CommonByteMatrix::Set(FX_INT32 x, FX_INT32 y, FX_INT32 value) +{ + m_bytes[y * m_width + x] = (FX_BYTE)value; +} +void CBC_CommonByteMatrix::Set(FX_INT32 x, FX_INT32 y, FX_BYTE value) +{ + m_bytes[y * m_width + x] = value; +} +void CBC_CommonByteMatrix::clear(FX_BYTE value) +{ + FX_INT32 y; + for(y = 0; y < m_height; y++) { + FX_INT32 x; + for(x = 0; x < m_width; x++) { + m_bytes[y * m_width + x] = value; + } + } +} +FX_BYTE* CBC_CommonByteMatrix::GetArray() +{ + return m_bytes; +} diff --git a/xfa/src/fxbarcode/src/BC_CommonCharacterSetECI.cpp b/xfa/src/fxbarcode/src/BC_CommonCharacterSetECI.cpp new file mode 100644 index 0000000000..8e10a7c700 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_CommonCharacterSetECI.cpp @@ -0,0 +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 "barcode.h" +#include "include/BC_CommonECI.h" +#include "include/BC_CommonCharacterSetECI.h" +void CBC_CommonCharacterSetECI::initialize() +{ +} +CBC_CommonCharacterSetECI::CBC_CommonCharacterSetECI(FX_INT32 value, CFX_ByteString encodingName): + CBC_CommonECI(value), m_encodingName(encodingName) +{ +} +CBC_CommonCharacterSetECI::~CBC_CommonCharacterSetECI() +{ +} +CFX_ByteString CBC_CommonCharacterSetECI::GetEncodingName() +{ + return m_encodingName; +} +void CBC_CommonCharacterSetECI::AddCharacterSet(FX_INT32 value, CFX_ByteString encodingName) +{ +} +CBC_CommonCharacterSetECI* CBC_CommonCharacterSetECI::GetCharacterSetECIByValue(FX_INT32 value) +{ + return NULL; +} +CBC_CommonCharacterSetECI* CBC_CommonCharacterSetECI::GetCharacterSetECIByName(const CFX_ByteString& name) +{ + return NULL; +} diff --git a/xfa/src/fxbarcode/src/BC_CommonDecoderResult.cpp b/xfa/src/fxbarcode/src/BC_CommonDecoderResult.cpp new file mode 100644 index 0000000000..b61b23efd4 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_CommonDecoderResult.cpp @@ -0,0 +1,63 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_QRCoderErrorCorrectionLevel.h" +#include "include/BC_PDF417ResultMetadata.h" +#include "include/BC_CommonDecoderResult.h" +CBC_CommonDecoderResult::CBC_CommonDecoderResult() +{ +} +void CBC_CommonDecoderResult::Init(const CFX_ByteArray &rawBytes, const CFX_ByteString &text, const CFX_Int32Array &byteSegments, CBC_QRCoderErrorCorrectionLevel* ecLevel, FX_INT32 &e) +{ + if(text.IsEmpty()) { + e = BCExceptionIllegalArgument; + return; + } + m_rawBytes.Copy(rawBytes); + m_text = text; + m_byteSegments.Copy(byteSegments); + m_ecLevel = ecLevel; + m_other = NULL; +} +void CBC_CommonDecoderResult::Init(const CFX_ByteArray &rawBytes, const CFX_ByteString &text, const CFX_PtrArray &byteSegments, const CFX_ByteString &ecLevel, FX_INT32 &e) +{ + if(text.IsEmpty()) { + e = BCExceptionIllegalArgument; + return; + } + m_rawBytes.Copy(rawBytes); + m_text = text; + m_pdf417byteSegments.Copy(byteSegments); + m_pdf417ecLevel = ecLevel; + m_other = NULL; +} +void CBC_CommonDecoderResult::setOther(CBC_PDF417ResultMetadata* other) +{ + m_other = other; +} +CBC_CommonDecoderResult::~CBC_CommonDecoderResult() +{ + if (m_other != NULL) { + delete m_other; + } +} +const CFX_ByteArray& CBC_CommonDecoderResult::GetRawBytes() +{ + return m_rawBytes; +} +const CFX_Int32Array& CBC_CommonDecoderResult::GetByteSegments() +{ + return m_byteSegments; +} +const CFX_ByteString& CBC_CommonDecoderResult::GetText() +{ + return m_text; +} +CBC_QRCoderErrorCorrectionLevel* CBC_CommonDecoderResult::GetECLevel() +{ + return m_ecLevel; +} diff --git a/xfa/src/fxbarcode/src/BC_CommonECI.cpp b/xfa/src/fxbarcode/src/BC_CommonECI.cpp new file mode 100644 index 0000000000..182a7fa4b4 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_CommonECI.cpp @@ -0,0 +1,30 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_CommonECI.h" +#include "include/BC_CommonCharacterSetECI.h" +CBC_CommonECI::CBC_CommonECI(FX_INT32 value) +{ + m_value = value; +} +CBC_CommonECI::~CBC_CommonECI() +{ +} +FX_INT32 CBC_CommonECI::GetValue() +{ + return m_value; +} +CBC_CommonECI* CBC_CommonECI::GetEICByValue(FX_INT32 value, FX_INT32 &e) +{ + if(value < 0 || value > 999999) { + e = BCExceptionBadECI; + return NULL; + } + if(value < 900) { + } + return NULL; +} diff --git a/xfa/src/fxbarcode/src/BC_CommonPerspectiveTransform.cpp b/xfa/src/fxbarcode/src/BC_CommonPerspectiveTransform.cpp new file mode 100644 index 0000000000..98234729e5 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_CommonPerspectiveTransform.cpp @@ -0,0 +1,109 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_CommonPerspectiveTransform.h" +CBC_CommonPerspectiveTransform::CBC_CommonPerspectiveTransform(FX_FLOAT a11, FX_FLOAT a21, FX_FLOAT a31, + FX_FLOAT a12, FX_FLOAT a22, FX_FLOAT a32, + FX_FLOAT a13, FX_FLOAT a23, FX_FLOAT a33) : + m_a11(a11), m_a21(a21), m_a31(a31), + m_a12(a12), m_a22(a22), m_a32(a32), + m_a13(a13), m_a23(a23), m_a33(a33) +{ +} +CBC_CommonPerspectiveTransform::~CBC_CommonPerspectiveTransform() +{ +} +CBC_CommonPerspectiveTransform *CBC_CommonPerspectiveTransform::QuadrilateralToQuadrilateral(FX_FLOAT x0, FX_FLOAT y0, + FX_FLOAT x1, FX_FLOAT y1, + FX_FLOAT x2, FX_FLOAT y2, + FX_FLOAT x3, FX_FLOAT y3, + FX_FLOAT x0p, FX_FLOAT y0p, + FX_FLOAT x1p, FX_FLOAT y1p, + FX_FLOAT x2p, FX_FLOAT y2p, + FX_FLOAT x3p, FX_FLOAT y3p) +{ + CBC_AutoPtr qToS(QuadrilateralToSquare(x0, y0, x1, y1, x2, y2, x3, y3)); + CBC_AutoPtr sToQ(SquareToQuadrilateral(x0p, y0p, x1p, y1p, x2p, y2p, x3p, y3p)); + return sToQ->Times(*(qToS.get())); +} +void CBC_CommonPerspectiveTransform::TransformPoints(CFX_FloatArray *points) +{ + FX_INT32 max = points->GetSize(); + FX_FLOAT a11 = m_a11; + FX_FLOAT a12 = m_a12; + FX_FLOAT a13 = m_a13; + FX_FLOAT a21 = m_a21; + FX_FLOAT a22 = m_a22; + FX_FLOAT a23 = m_a23; + FX_FLOAT a31 = m_a31; + FX_FLOAT a32 = m_a32; + FX_FLOAT a33 = m_a33; + FX_INT32 i; + for (i = 0; i < max; i += 2) { + FX_FLOAT x = (*points)[i]; + FX_FLOAT y = (*points)[i + 1]; + FX_FLOAT denominator = a13 * x + a23 * y + a33; + (*points)[i] = (a11 * x + a21 * y + a31) / denominator; + (*points)[i + 1] = (a12 * x + a22 * y + a32) / denominator; + } +} +CBC_CommonPerspectiveTransform *CBC_CommonPerspectiveTransform::SquareToQuadrilateral(FX_FLOAT x0, FX_FLOAT y0, + FX_FLOAT x1, FX_FLOAT y1, + FX_FLOAT x2, FX_FLOAT y2, + FX_FLOAT x3, FX_FLOAT y3) +{ + FX_FLOAT dy2 = y3 - y2; + FX_FLOAT dy3 = y0 - y1 + y2 - y3; + if ((dy2 == 0.0f) && (dy3 == 0.0f)) { + return FX_NEW CBC_CommonPerspectiveTransform(x1 - x0, x2 - x1, x0, + y1 - y0, y2 - y1, y0, + 0.0f, 0.0f, 1.0f); + } else { + FX_FLOAT dx1 = x1 - x2; + FX_FLOAT dx2 = x3 - x2; + FX_FLOAT dx3 = x0 - x1 + x2 - x3; + FX_FLOAT dy1 = y1 - y2; + FX_FLOAT denominator = dx1 * dy2 - dx2 * dy1; + FX_FLOAT a13 = (dx3 * dy2 - dx2 * dy3) / denominator; + FX_FLOAT a23 = (dx1 * dy3 - dx3 * dy1) / denominator; + return FX_NEW CBC_CommonPerspectiveTransform(x1 - x0 + a13 * x1, x3 - x0 + a23 * x3, x0, + y1 - y0 + a13 * y1, y3 - y0 + a23 * y3, y0, + a13, a23, 1.0f); + } +} +CBC_CommonPerspectiveTransform *CBC_CommonPerspectiveTransform::QuadrilateralToSquare(FX_FLOAT x0, FX_FLOAT y0, + FX_FLOAT x1, FX_FLOAT y1, + FX_FLOAT x2, FX_FLOAT y2, + FX_FLOAT x3, FX_FLOAT y3) +{ + CBC_AutoPtr temp1(SquareToQuadrilateral(x0, y0, x1, y1, x2, y2, x3, y3)); + return temp1->BuildAdjoint(); +} +CBC_CommonPerspectiveTransform *CBC_CommonPerspectiveTransform::BuildAdjoint() +{ + return FX_NEW CBC_CommonPerspectiveTransform(m_a22 * m_a33 - m_a23 * m_a32, + m_a23 * m_a31 - m_a21 * m_a33, + m_a21 * m_a32 - m_a22 * m_a31, + m_a13 * m_a32 - m_a12 * m_a33, + m_a11 * m_a33 - m_a13 * m_a31, + m_a12 * m_a31 - m_a11 * m_a32, + m_a12 * m_a23 - m_a13 * m_a22, + m_a13 * m_a21 - m_a11 * m_a23, + m_a11 * m_a22 - m_a12 * m_a21); +} +CBC_CommonPerspectiveTransform *CBC_CommonPerspectiveTransform::Times(CBC_CommonPerspectiveTransform &other) +{ + return FX_NEW CBC_CommonPerspectiveTransform(m_a11 * other.m_a11 + m_a21 * other.m_a12 + m_a31 * other.m_a13, + m_a11 * other.m_a21 + m_a21 * other.m_a22 + m_a31 * other.m_a23, + m_a11 * other.m_a31 + m_a21 * other.m_a32 + m_a31 * other.m_a33, + m_a12 * other.m_a11 + m_a22 * other.m_a12 + m_a32 * other.m_a13, + m_a12 * other.m_a21 + m_a22 * other.m_a22 + m_a32 * other.m_a23, + m_a12 * other.m_a31 + m_a22 * other.m_a32 + m_a32 * other.m_a33, + m_a13 * other.m_a11 + m_a23 * other.m_a12 + m_a33 * other.m_a13, + m_a13 * other.m_a21 + m_a23 * other.m_a22 + m_a33 * other.m_a23, + m_a13 * other.m_a31 + m_a23 * other.m_a32 + m_a33 * other.m_a33); +} diff --git a/xfa/src/fxbarcode/src/BC_DataMatrixBitMatrixParser.cpp b/xfa/src/fxbarcode/src/BC_DataMatrixBitMatrixParser.cpp new file mode 100644 index 0000000000..9fa79aad7d --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_DataMatrixBitMatrixParser.cpp @@ -0,0 +1,350 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_DataMatrixVersion.h" +#include "include/BC_DataMatrixBitMatrixParser.h" +CBC_DataMatrixBitMatrixParser::CBC_DataMatrixBitMatrixParser() +{ + m_mappingBitMatrix = NULL; + m_version = NULL; + m_readMappingMatrix = NULL; +} +void CBC_DataMatrixBitMatrixParser::Init(CBC_CommonBitMatrix *bitMatrix, FX_INT32 &e) +{ + FX_INT32 dimension = bitMatrix->GetHeight(); + if (dimension < 8 || dimension > 144 || (dimension & 0x01) != 0) { + e = BCExceptionFormatException; + return; + } + m_version = ReadVersion(bitMatrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + m_mappingBitMatrix = ExtractDataRegion(bitMatrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + m_readMappingMatrix = FX_NEW CBC_CommonBitMatrix(); + m_readMappingMatrix->Init(m_mappingBitMatrix->GetWidth(), m_mappingBitMatrix->GetHeight()); +} +CBC_DataMatrixBitMatrixParser::~CBC_DataMatrixBitMatrixParser() +{ + if(m_mappingBitMatrix != NULL) { + delete m_mappingBitMatrix; + } + m_mappingBitMatrix = NULL; + if(m_readMappingMatrix != NULL) { + delete m_readMappingMatrix; + } + m_readMappingMatrix = NULL; +} +CBC_DataMatrixVersion *CBC_DataMatrixBitMatrixParser::GetVersion() +{ + return m_version; +} +CBC_DataMatrixVersion *CBC_DataMatrixBitMatrixParser::ReadVersion(CBC_CommonBitMatrix *bitMatrix, FX_INT32 &e) +{ + FX_INT32 rows = bitMatrix->GetHeight(); + FX_INT32 columns = bitMatrix->GetWidth(); + CBC_DataMatrixVersion *temp = CBC_DataMatrixVersion::GetVersionForDimensions(rows, columns, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return temp; +} +CFX_ByteArray *CBC_DataMatrixBitMatrixParser::ReadCodewords(FX_INT32 &e) +{ + CBC_AutoPtr result(FX_NEW CFX_ByteArray()); + result->SetSize(m_version->GetTotalCodewords()); + FX_INT32 resultOffset = 0; + FX_INT32 row = 4; + FX_INT32 column = 0; + FX_INT32 numRows = m_mappingBitMatrix->GetHeight(); + FX_INT32 numColumns = m_mappingBitMatrix->GetWidth(); + FX_BOOL corner1Read = FALSE; + FX_BOOL corner2Read = FALSE; + FX_BOOL corner3Read = FALSE; + FX_BOOL corner4Read = FALSE; + do { + if ((row == numRows) && (column == 0) && !corner1Read) { + (*result)[resultOffset++] = (FX_BYTE) ReadCorner1(numRows, numColumns); + row -= 2; + column += 2; + corner1Read = TRUE; + } else if ((row == numRows - 2) && (column == 0) && ((numColumns & 0x03) != 0) && !corner2Read) { + (*result)[resultOffset++] = (FX_BYTE) ReadCorner2(numRows, numColumns); + row -= 2; + column += 2; + corner2Read = TRUE; + } else if ((row == numRows + 4) && (column == 2) && ((numColumns & 0x07) == 0) && !corner3Read) { + (*result)[resultOffset++] = (FX_BYTE) ReadCorner3(numRows, numColumns); + row -= 2; + column += 2; + corner3Read = TRUE; + } else if ((row == numRows - 2) && (column == 0) && ((numColumns & 0x07) == 4) && !corner4Read) { + (*result)[resultOffset++] = (FX_BYTE) ReadCorner4(numRows, numColumns); + row -= 2; + column += 2; + corner4Read = TRUE; + } else { + do { + if ((row < numRows) && (column >= 0) && !m_readMappingMatrix->Get(column, row)) { + if (resultOffset < (*result).GetSize() ) { + (*result)[resultOffset++] = (FX_BYTE) ReadUtah(row, column, numRows, numColumns); + } + } + row -= 2; + column += 2; + } while ((row >= 0) && (column < numColumns)); + row += 1; + column += 3; + do { + if ((row >= 0) && (column < numColumns) && !m_readMappingMatrix->Get(column, row)) { + if (resultOffset < (*result).GetSize() ) { + (*result)[resultOffset++] = (FX_BYTE) ReadUtah(row, column, numRows, numColumns); + } + } + row += 2; + column -= 2; + } while ((row < numRows) && (column >= 0)); + row += 3; + column += 1; + } + } while ((row < numRows) || (column < numColumns)); + if (resultOffset != m_version->GetTotalCodewords()) { + e = BCExceptionFormatException; + return NULL; + } + return result.release(); +} +FX_BOOL CBC_DataMatrixBitMatrixParser::ReadModule(FX_INT32 row, FX_INT32 column, FX_INT32 numRows, FX_INT32 numColumns) +{ + if (row < 0) { + row += numRows; + column += 4 - ((numRows + 4) & 0x07); + } + if (column < 0) { + column += numColumns; + row += 4 - ((numColumns + 4) & 0x07); + } + m_readMappingMatrix->Set(column, row); + return m_mappingBitMatrix->Get(column, row); +} +FX_INT32 CBC_DataMatrixBitMatrixParser::ReadUtah(FX_INT32 row, FX_INT32 column, FX_INT32 numRows, FX_INT32 numColumns) +{ + FX_INT32 currentByte = 0; + if (ReadModule(row - 2, column - 2, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(row - 2, column - 1, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(row - 1, column - 2, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(row - 1, column - 1, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(row - 1, column, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(row, column - 2, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(row, column - 1, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(row, column, numRows, numColumns)) { + currentByte |= 1; + } + return currentByte; +} +FX_INT32 CBC_DataMatrixBitMatrixParser::ReadCorner1(FX_INT32 numRows, FX_INT32 numColumns) +{ + FX_INT32 currentByte = 0; + if (ReadModule(numRows - 1, 0, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(numRows - 1, 1, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(numRows - 1, 2, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(0, numColumns - 2, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(0, numColumns - 1, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(1, numColumns - 1, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(2, numColumns - 1, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(3, numColumns - 1, numRows, numColumns)) { + currentByte |= 1; + } + return currentByte; +} +FX_INT32 CBC_DataMatrixBitMatrixParser::ReadCorner2(FX_INT32 numRows, FX_INT32 numColumns) +{ + FX_INT32 currentByte = 0; + if (ReadModule(numRows - 3, 0, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(numRows - 2, 0, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(numRows - 1, 0, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(0, numColumns - 4, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(0, numColumns - 3, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(0, numColumns - 2, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(0, numColumns - 1, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(1, numColumns - 1, numRows, numColumns)) { + currentByte |= 1; + } + return currentByte; +} +FX_INT32 CBC_DataMatrixBitMatrixParser::ReadCorner3(FX_INT32 numRows, FX_INT32 numColumns) +{ + FX_INT32 currentByte = 0; + if (ReadModule(numRows - 1, 0, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(numRows - 1, numColumns - 1, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(0, numColumns - 3, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(0, numColumns - 2, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(0, numColumns - 1, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(1, numColumns - 3, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(1, numColumns - 2, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(1, numColumns - 1, numRows, numColumns)) { + currentByte |= 1; + } + return currentByte; +} +FX_INT32 CBC_DataMatrixBitMatrixParser::ReadCorner4(FX_INT32 numRows, FX_INT32 numColumns) +{ + FX_INT32 currentByte = 0; + if (ReadModule(numRows - 3, 0, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(numRows - 2, 0, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(numRows - 1, 0, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(0, numColumns - 2, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(0, numColumns - 1, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(1, numColumns - 1, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(2, numColumns - 1, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(3, numColumns - 1, numRows, numColumns)) { + currentByte |= 1; + } + return currentByte; +} +CBC_CommonBitMatrix *CBC_DataMatrixBitMatrixParser::ExtractDataRegion(CBC_CommonBitMatrix *bitMatrix , FX_INT32 &e) +{ + FX_INT32 symbolSizeRows = m_version->GetSymbolSizeRows(); + FX_INT32 symbolSizeColumns = m_version->GetSymbolSizeColumns(); + if (bitMatrix->GetHeight() != symbolSizeRows) { + e = BCExceptionCanNotCallGetDimensionOnNonSquareMatrix; + return NULL; + } + FX_INT32 dataRegionSizeRows = m_version->GetDataRegionSizeRows(); + FX_INT32 dataRegionSizeColumns = m_version->GetDataRegionSizeColumns(); + FX_INT32 numDataRegionsRow = symbolSizeRows / dataRegionSizeRows; + FX_INT32 numDataRegionsColumn = symbolSizeColumns / dataRegionSizeColumns; + FX_INT32 sizeDataRegionRow = numDataRegionsRow * dataRegionSizeRows; + FX_INT32 sizeDataRegionColumn = numDataRegionsColumn * dataRegionSizeColumns; + CBC_CommonBitMatrix *bitMatrixWithoutAlignment = FX_NEW CBC_CommonBitMatrix(); + bitMatrixWithoutAlignment->Init(sizeDataRegionColumn, sizeDataRegionRow); + FX_INT32 dataRegionRow; + for (dataRegionRow = 0; dataRegionRow < numDataRegionsRow; ++dataRegionRow) { + FX_INT32 dataRegionRowOffset = dataRegionRow * dataRegionSizeRows; + FX_INT32 dataRegionColumn; + for (dataRegionColumn = 0; dataRegionColumn < numDataRegionsColumn; ++dataRegionColumn) { + FX_INT32 dataRegionColumnOffset = dataRegionColumn * dataRegionSizeColumns; + FX_INT32 i; + for (i = 0; i < dataRegionSizeRows; ++i) { + FX_INT32 readRowOffset = dataRegionRow * (dataRegionSizeRows + 2) + 1 + i; + FX_INT32 writeRowOffset = dataRegionRowOffset + i; + FX_INT32 j; + for (j = 0; j < dataRegionSizeColumns; ++j) { + FX_INT32 readColumnOffset = dataRegionColumn * (dataRegionSizeColumns + 2) + 1 + j; + if (bitMatrix->Get(readColumnOffset, readRowOffset)) { + FX_INT32 writeColumnOffset = dataRegionColumnOffset + j; + bitMatrixWithoutAlignment->Set(writeColumnOffset, writeRowOffset); + } + } + } + } + } + return bitMatrixWithoutAlignment; +} diff --git a/xfa/src/fxbarcode/src/BC_DataMatrixDataBlock.cpp b/xfa/src/fxbarcode/src/BC_DataMatrixDataBlock.cpp new file mode 100644 index 0000000000..55c61dedc9 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_DataMatrixDataBlock.cpp @@ -0,0 +1,83 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_DataMatrixVersion.h" +#include "include/BC_DataMatrixDataBlock.h" +CBC_DataMatrixDataBlock::~CBC_DataMatrixDataBlock() +{ +} +CBC_DataMatrixDataBlock::CBC_DataMatrixDataBlock(FX_INT32 numDataCodewords, CFX_ByteArray *codewords) +{ + m_codewords.Copy(*codewords); + m_numDataCodewords = numDataCodewords; +} +CFX_PtrArray *CBC_DataMatrixDataBlock::GetDataBlocks(CFX_ByteArray* rawCodewords, CBC_DataMatrixVersion *version, FX_INT32 &e) +{ + ECBlocks *ecBlocks = version->GetECBlocks(); + FX_INT32 totalBlocks = 0; + const CFX_PtrArray &ecBlockArray = ecBlocks->GetECBlocks(); + FX_INT32 i; + for (i = 0; i < ecBlockArray.GetSize(); i++) { + totalBlocks += ((ECB*)ecBlockArray[i])->GetCount(); + } + CBC_AutoPtrresult(FX_NEW CFX_PtrArray()); + result->SetSize(totalBlocks); + FX_INT32 numResultBlocks = 0; + FX_INT32 j; + for (j = 0; j < ecBlockArray.GetSize(); j++) { + for (i = 0; i < ((ECB*)ecBlockArray[j])->GetCount(); i++) { + FX_INT32 numDataCodewords = ((ECB*)ecBlockArray[j])->GetDataCodewords(); + FX_INT32 numBlockCodewords = ecBlocks->GetECCodewords() + numDataCodewords; + CFX_ByteArray codewords; + codewords.SetSize(numBlockCodewords); + (*result)[numResultBlocks++] = FX_NEW CBC_DataMatrixDataBlock(numDataCodewords, &codewords); + codewords.SetSize(0); + } + } + FX_INT32 longerBlocksTotalCodewords = ((CBC_DataMatrixDataBlock*)(*result)[0])->GetCodewords()->GetSize(); + FX_INT32 longerBlocksNumDataCodewords = longerBlocksTotalCodewords - ecBlocks->GetECCodewords(); + FX_INT32 shorterBlocksNumDataCodewords = longerBlocksNumDataCodewords - 1; + FX_INT32 rawCodewordsOffset = 0; + for (i = 0; i < shorterBlocksNumDataCodewords; i++) { + FX_INT32 j; + for (j = 0; j < numResultBlocks; j++) { + if (rawCodewordsOffset < rawCodewords->GetSize()) { + ((CBC_DataMatrixDataBlock*)(*result)[j])->GetCodewords()->operator [](i) = (*rawCodewords)[rawCodewordsOffset++]; + } + } + } + FX_BOOL specialVersion = version->GetVersionNumber() == 24; + FX_INT32 numLongerBlocks = specialVersion ? 8 : numResultBlocks; + for (j = 0; j < numLongerBlocks; j++) { + if (rawCodewordsOffset < rawCodewords->GetSize()) { + ((CBC_DataMatrixDataBlock*)(*result)[j])->GetCodewords()->operator [](longerBlocksNumDataCodewords - 1) = (*rawCodewords)[rawCodewordsOffset++]; + } + } + FX_INT32 max = ((CBC_DataMatrixDataBlock*)(*result)[0])->GetCodewords()->GetSize(); + for (i = longerBlocksNumDataCodewords; i < max; i++) { + FX_INT32 j; + for (j = 0; j < numResultBlocks; j++) { + FX_INT32 iOffset = specialVersion && j > 7 ? i - 1 : i; + if (rawCodewordsOffset < rawCodewords->GetSize()) { + ((CBC_DataMatrixDataBlock*)(*result)[j])->GetCodewords()->operator [](iOffset) = (*rawCodewords)[rawCodewordsOffset++]; + } + } + } + if (rawCodewordsOffset != rawCodewords->GetSize()) { + e = BCExceptionIllegalArgument; + return NULL; + } + return result.release(); +} +FX_INT32 CBC_DataMatrixDataBlock::GetNumDataCodewords() +{ + return m_numDataCodewords; +} +CFX_ByteArray *CBC_DataMatrixDataBlock::GetCodewords() +{ + return &m_codewords; +} diff --git a/xfa/src/fxbarcode/src/BC_DataMatrixDecodedBitStreamParser.cpp b/xfa/src/fxbarcode/src/BC_DataMatrixDecodedBitStreamParser.cpp new file mode 100644 index 0000000000..6880f2487a --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_DataMatrixDecodedBitStreamParser.cpp @@ -0,0 +1,456 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_DataMatrixDecodedBitStreamParser.h" +#include "include/BC_CommonDecoderResult.h" +#include "include/BC_CommonBitSource.h" +const FX_CHAR CBC_DataMatrixDecodedBitStreamParser::C40_BASIC_SET_CHARS[] = { + '*', '*', '*', ' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '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' +}; +const FX_CHAR CBC_DataMatrixDecodedBitStreamParser::C40_SHIFT2_SET_CHARS[] = { + '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', + '/', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_' +}; +const FX_CHAR CBC_DataMatrixDecodedBitStreamParser::TEXT_BASIC_SET_CHARS[] = { + '*', '*', '*', ' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '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' +}; +const FX_CHAR CBC_DataMatrixDecodedBitStreamParser::TEXT_SHIFT3_SET_CHARS[] = { + '\'', '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', '{', '|', '}', '~', (FX_CHAR) 127 +}; +const FX_INT32 CBC_DataMatrixDecodedBitStreamParser::PAD_ENCODE = 0; +const FX_INT32 CBC_DataMatrixDecodedBitStreamParser::ASCII_ENCODE = 1; +const FX_INT32 CBC_DataMatrixDecodedBitStreamParser::C40_ENCODE = 2; +const FX_INT32 CBC_DataMatrixDecodedBitStreamParser::TEXT_ENCODE = 3; +const FX_INT32 CBC_DataMatrixDecodedBitStreamParser::ANSIX12_ENCODE = 4; +const FX_INT32 CBC_DataMatrixDecodedBitStreamParser::EDIFACT_ENCODE = 5; +const FX_INT32 CBC_DataMatrixDecodedBitStreamParser::BASE256_ENCODE = 6; +CBC_DataMatrixDecodedBitStreamParser::CBC_DataMatrixDecodedBitStreamParser() +{ +} +CBC_DataMatrixDecodedBitStreamParser::~CBC_DataMatrixDecodedBitStreamParser() +{ +} +CBC_CommonDecoderResult *CBC_DataMatrixDecodedBitStreamParser::Decode(CFX_ByteArray &bytes, FX_INT32 &e) +{ + CBC_CommonBitSource bits(&bytes); + CFX_ByteString result; + CFX_ByteString resultTrailer; + CFX_Int32Array byteSegments; + FX_INT32 mode = ASCII_ENCODE; + do { + if (mode == 1) { + mode = DecodeAsciiSegment(&bits, result, resultTrailer, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } else { + switch (mode) { + case 2: + DecodeC40Segment(&bits, result, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + break; + case 3: + DecodeTextSegment(&bits, result, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + break; + case 4: + DecodeAnsiX12Segment(&bits, result, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + break; + case 5: + DecodeEdifactSegment(&bits, result, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + break; + case 6: + DecodeBase256Segment(&bits, result, byteSegments, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + break; + default: + NULL; + e = BCExceptionFormatException; + return NULL; + } + mode = ASCII_ENCODE; + } + } while (mode != PAD_ENCODE && bits.Available() > 0); + if (resultTrailer.GetLength() > 0) { + result += resultTrailer; + } + CBC_CommonDecoderResult *tempCp = FX_NEW CBC_CommonDecoderResult(); + tempCp->Init(bytes, result, (byteSegments.GetSize() <= 0) ? CFX_Int32Array() : byteSegments, NULL, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return tempCp; +} +FX_INT32 CBC_DataMatrixDecodedBitStreamParser::DecodeAsciiSegment(CBC_CommonBitSource *bits, CFX_ByteString &result, CFX_ByteString &resultTrailer, FX_INT32 &e) +{ + FX_CHAR buffer[128]; + FX_BOOL upperShift = FALSE; + do { + FX_INT32 oneByte = bits->ReadBits(8, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + if (oneByte == 0) { + e = BCExceptionFormatException; + return 0; + } else if (oneByte <= 128) { + oneByte = upperShift ? oneByte + 128 : oneByte; + upperShift = FALSE; + result += ((FX_CHAR) (oneByte - 1)); + return ASCII_ENCODE; + } else if (oneByte == 129) { + return PAD_ENCODE; + } else if (oneByte <= 229) { + FX_INT32 value = oneByte - 130; +#if defined(_FX_WINAPI_PARTITION_APP_) + memset(buffer, 0, sizeof(FX_CHAR) * 128); + _itoa_s(value, buffer, 128, 10); +#else + FXSYS_itoa(value, buffer, 10); +#endif + if (value < 10) { + result += '0'; + buffer[1] = '\0'; + } else { + buffer[2] = '\0'; + } + result += buffer; + } else if (oneByte == 230) { + return C40_ENCODE; + } else if (oneByte == 231) { + return BASE256_ENCODE; + } else if (oneByte == 232 || oneByte == 233 || oneByte == 234) { + } else if (oneByte == 235) { + upperShift = TRUE; + } else if (oneByte == 236) { + result += "[)>"; + result += 0x1E; + result += "05"; + result += 0x1D; + resultTrailer.Insert(0, 0x1E); + resultTrailer.Insert(0 + 1, 0x04); + } else if (oneByte == 237) { + result += "[)>"; + result += 0x1E; + result += "06"; + result += 0x1D; + resultTrailer.Insert(0, 0x1E); + resultTrailer.Insert(0 + 1, 0x04); + } else if (oneByte == 238) { + return ANSIX12_ENCODE; + } else if (oneByte == 239) { + return TEXT_ENCODE; + } else if (oneByte == 240) { + return EDIFACT_ENCODE; + } else if (oneByte == 241) { + } else if (oneByte >= 242) { + if (oneByte == 254 && bits->Available() == 0) { + } else { + e = BCExceptionFormatException; + return 0; + } + } + } while (bits->Available() > 0); + return ASCII_ENCODE; +} +void CBC_DataMatrixDecodedBitStreamParser::DecodeC40Segment(CBC_CommonBitSource *bits, CFX_ByteString &result, FX_INT32 &e) +{ + FX_BOOL upperShift = FALSE; + CFX_Int32Array cValues; + cValues.SetSize(3); + do { + if (bits->Available() == 8) { + return; + } + FX_INT32 firstByte = bits->ReadBits(8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + if (firstByte == 254) { + return; + } + FX_INT32 tempp = bits->ReadBits(8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + ParseTwoBytes(firstByte, tempp, cValues); + FX_INT32 shift = 0; + FX_INT32 i; + for (i = 0; i < 3; i++) { + FX_INT32 cValue = cValues[i]; + switch (shift) { + case 0: + if (cValue < 3) { + shift = cValue + 1; + } else if (cValue < 27) { + FX_CHAR c40char = C40_BASIC_SET_CHARS[cValue]; + if (upperShift) { + result += (FX_CHAR) (c40char + 128); + upperShift = FALSE; + } else { + result += c40char; + } + } else { + e = BCExceptionFormatException; + return ; + } + break; + case 1: + if (upperShift) { + result += (FX_CHAR) (cValue + 128); + upperShift = FALSE; + } else { + result += cValue; + } + shift = 0; + break; + case 2: + if (cValue < 27) { + FX_CHAR c40char = C40_SHIFT2_SET_CHARS[cValue]; + if (upperShift) { + result += (FX_CHAR) (c40char + 128); + upperShift = FALSE; + } else { + result += c40char; + } + } else if (cValue == 27) { + e = BCExceptionFormatException; + return; + } else if (cValue == 30) { + upperShift = TRUE; + } else { + e = BCExceptionFormatException; + return; + } + shift = 0; + break; + case 3: + if (upperShift) { + result += (FX_CHAR) (cValue + 224); + upperShift = FALSE; + } else { + result += (FX_CHAR) (cValue + 96); + } + shift = 0; + break; + default: + break; + e = BCExceptionFormatException; + return; + } + } + } while (bits->Available() > 0); +} +void CBC_DataMatrixDecodedBitStreamParser::DecodeTextSegment(CBC_CommonBitSource *bits, CFX_ByteString &result, FX_INT32 &e) +{ + FX_BOOL upperShift = FALSE; + CFX_Int32Array cValues; + cValues.SetSize(3); + FX_INT32 shift = 0; + do { + if (bits->Available() == 8) { + return; + } + FX_INT32 firstByte = bits->ReadBits(8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + if (firstByte == 254) { + return; + } + FX_INT32 inTp = bits->ReadBits(8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + ParseTwoBytes(firstByte, inTp, cValues); + for (FX_INT32 i = 0; i < 3; i++) { + FX_INT32 cValue = cValues[i]; + switch (shift) { + case 0: + if (cValue < 3) { + shift = cValue + 1; + } else if (cValue < 40) { + FX_CHAR textChar = TEXT_BASIC_SET_CHARS[cValue]; + if (upperShift) { + result += (FX_CHAR) (textChar + 128); + upperShift = FALSE; + } else { + result += textChar; + } + } else { + e = BCExceptionFormatException; + return; + } + break; + case 1: + if (upperShift) { + result += (FX_CHAR) (cValue + 128); + upperShift = FALSE; + } else { + result += cValue; + } + shift = 0; + break; + case 2: + if (cValue < 27) { + FX_CHAR c40char = C40_SHIFT2_SET_CHARS[cValue]; + if (upperShift) { + result += (FX_CHAR) (c40char + 128); + upperShift = FALSE; + } else { + result += c40char; + } + } else if (cValue == 27) { + e = BCExceptionFormatException; + return; + } else if (cValue == 30) { + upperShift = TRUE; + } else { + e = BCExceptionFormatException; + return; + } + shift = 0; + break; + case 3: + if (cValue < 19) { + FX_CHAR textChar = TEXT_SHIFT3_SET_CHARS[cValue]; + if (upperShift) { + result += (FX_CHAR) (textChar + 128); + upperShift = FALSE; + } else { + result += textChar; + } + shift = 0; + } else { + e = BCExceptionFormatException; + return; + } + break; + default: + break; + e = BCExceptionFormatException; + return; + } + } + } while (bits->Available() > 0); +} +void CBC_DataMatrixDecodedBitStreamParser::DecodeAnsiX12Segment(CBC_CommonBitSource *bits, CFX_ByteString &result, FX_INT32 &e) +{ + CFX_Int32Array cValues; + cValues.SetSize(3); + do { + if (bits->Available() == 8) { + return; + } + FX_INT32 firstByte = bits->ReadBits(8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + if (firstByte == 254) { + return; + } + FX_INT32 iTemp1 = bits->ReadBits(8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + ParseTwoBytes(firstByte, iTemp1, cValues); + FX_INT32 i; + for (i = 0; i < 3; i++) { + FX_INT32 cValue = cValues[i]; + if (cValue == 0) { + BC_FX_ByteString_Append(result, 1, '\r'); + } else if (cValue == 1) { + BC_FX_ByteString_Append(result, 1, '*'); + } else if (cValue == 2) { + BC_FX_ByteString_Append(result, 1, '>'); + } else if (cValue == 3) { + BC_FX_ByteString_Append(result, 1, ' '); + } else if (cValue < 14) { + BC_FX_ByteString_Append(result, 1, (FX_CHAR) (cValue + 44)); + } else if (cValue < 40) { + BC_FX_ByteString_Append(result, 1, (FX_CHAR) (cValue + 51)); + } else { + e = BCExceptionFormatException; + return; + } + } + } while (bits->Available() > 0); +} +void CBC_DataMatrixDecodedBitStreamParser::ParseTwoBytes(FX_INT32 firstByte, FX_INT32 secondByte, CFX_Int32Array &result) +{ + FX_INT32 fullBitValue = (firstByte << 8) + secondByte - 1; + FX_INT32 temp = fullBitValue / 1600; + result[0] = temp; + fullBitValue -= temp * 1600; + temp = fullBitValue / 40; + result[1] = temp; + result[2] = fullBitValue - temp * 40; +} +void CBC_DataMatrixDecodedBitStreamParser::DecodeEdifactSegment(CBC_CommonBitSource *bits, CFX_ByteString &result, FX_INT32 &e) +{ + FX_CHAR buffer[128]; + FX_BOOL unlatch = FALSE; + do { + if (bits->Available() <= 16) { + return; + } + FX_INT32 i; + for (i = 0; i < 4; i++) { + FX_INT32 edifactValue = bits->ReadBits(6, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + if (edifactValue == 0x1F) { + unlatch = TRUE; + } + if (!unlatch) { + if ((edifactValue & 32) == 0) { + edifactValue |= 64; + } +#if defined(_FX_WINAPI_PARTITION_APP_) + memset(buffer, 0, sizeof(FX_CHAR) * 128); + _itoa_s(edifactValue, buffer, 128, 10); + result += buffer; +#else + result += FXSYS_itoa(edifactValue, buffer, 10); +#endif + } + } + } while (!unlatch && bits->Available() > 0); +} +void CBC_DataMatrixDecodedBitStreamParser::DecodeBase256Segment(CBC_CommonBitSource *bits, CFX_ByteString &result, CFX_Int32Array &byteSegments, FX_INT32 &e) +{ + FX_INT32 codewordPosition = 1 + bits->getByteOffset(); + FX_INT32 iTmp = bits->ReadBits(8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + FX_INT32 d1 = Unrandomize255State(iTmp, codewordPosition++); + FX_INT32 count; + if (d1 == 0) { + count = bits->Available() / 8; + } else if (d1 < 250) { + count = d1; + } else { + FX_INT32 iTmp3 = bits->ReadBits(8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + count = 250 * (d1 - 249) + Unrandomize255State(iTmp3, codewordPosition++); + } + if (count < 0) { + e = BCExceptionFormatException; + return; + } + CFX_ByteArray *bytes = FX_NEW CFX_ByteArray(); + bytes->SetSize(count); + FX_INT32 i; + for (i = 0; i < count; i++) { + if (bits->Available() < 8) { + e = BCExceptionFormatException; + delete bytes; + return; + } + FX_INT32 iTemp5 = bits->ReadBits(8, e); + if (e != BCExceptionNO) { + delete bytes; + return; + } + bytes->SetAt(i, Unrandomize255State(iTemp5, codewordPosition++)); + } + BC_FX_ByteString_Append(result, *bytes); + delete bytes; +} +FX_BYTE CBC_DataMatrixDecodedBitStreamParser::Unrandomize255State(FX_INT32 randomizedBase256Codeword, FX_INT32 base256CodewordPosition) +{ + FX_INT32 pseudoRandomNumber = ((149 * base256CodewordPosition) % 255) + 1; + FX_INT32 tempVariable = randomizedBase256Codeword - pseudoRandomNumber; + return (FX_BYTE) (tempVariable >= 0 ? tempVariable : tempVariable + 256); +} diff --git a/xfa/src/fxbarcode/src/BC_DataMatrixDecoder.cpp b/xfa/src/fxbarcode/src/BC_DataMatrixDecoder.cpp new file mode 100644 index 0000000000..26c43201ae --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_DataMatrixDecoder.cpp @@ -0,0 +1,94 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_DataMatrixDecoder.h" +#include "include/BC_ReedSolomonDecoder.h" +#include "include/BC_ReedSolomonGF256.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_DataMatrixBitMatrixParser.h" +#include "include/BC_DataMatrixVersion.h" +#include "include/BC_DataMatrixDataBlock.h" +#include "include/BC_DataMatrixDecodedBitStreamParser.h" +CBC_DataMatrixDecoder::CBC_DataMatrixDecoder() +{ + m_rsDecoder = NULL; +} +void CBC_DataMatrixDecoder::Init() +{ + m_rsDecoder = FX_NEW CBC_ReedSolomonDecoder(CBC_ReedSolomonGF256::DataMatrixField); +} +CBC_DataMatrixDecoder::~CBC_DataMatrixDecoder() +{ + if(m_rsDecoder != NULL) { + delete m_rsDecoder; + } + m_rsDecoder = NULL; +} +CBC_CommonDecoderResult *CBC_DataMatrixDecoder::Decode(CBC_CommonBitMatrix *bits, FX_INT32 &e) +{ + CBC_DataMatrixBitMatrixParser parser; + parser.Init(bits, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_DataMatrixVersion *version = parser.GetVersion(); + CFX_ByteArray* byteTemp = parser.ReadCodewords(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr codewords(byteTemp); + CFX_PtrArray *dataBlocks = CBC_DataMatrixDataBlock::GetDataBlocks(codewords.get(), version, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + FX_INT32 dataBlocksCount = dataBlocks->GetSize(); + FX_INT32 totalBytes = 0; + FX_INT32 i, j; + for (i = 0; i < dataBlocksCount; i++) { + totalBytes += ((CBC_DataMatrixDataBlock*)(*dataBlocks)[i])->GetNumDataCodewords(); + } + CFX_ByteArray resultBytes; + resultBytes.SetSize(totalBytes); + for (j = 0; j < dataBlocksCount; j++) { + CFX_ByteArray *codewordBytes = ((CBC_DataMatrixDataBlock*)(*dataBlocks)[j])->GetCodewords(); + FX_INT32 numDataCodewords = ((CBC_DataMatrixDataBlock*)(*dataBlocks)[j])->GetNumDataCodewords(); + CorrectErrors(*codewordBytes, numDataCodewords, e); + if (e != BCExceptionNO) { + for(FX_INT32 i = 0; i < dataBlocks->GetSize(); i++) { + delete (CBC_DataMatrixDataBlock*)(*dataBlocks)[i]; + } + delete dataBlocks; + dataBlocks = NULL; + return NULL; + } + FX_INT32 i; + for (i = 0; i < numDataCodewords; i++) { + resultBytes[i * dataBlocksCount + j] = (*codewordBytes)[i]; + } + } + for(i = 0; i < (dataBlocks->GetSize()); i++) { + delete (CBC_DataMatrixDataBlock*)(*dataBlocks)[i]; + } + delete dataBlocks; + dataBlocks = NULL; + CBC_CommonDecoderResult *resultR = CBC_DataMatrixDecodedBitStreamParser::Decode(resultBytes, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return resultR; +} +void CBC_DataMatrixDecoder::CorrectErrors(CFX_ByteArray &codewordBytes, FX_INT32 numDataCodewords, FX_INT32 &e) +{ + FX_INT32 numCodewords = codewordBytes.GetSize(); + CFX_Int32Array codewordsInts; + codewordsInts.SetSize(numCodewords); + FX_INT32 i; + for (i = 0; i < numCodewords; i++) { + codewordsInts[i] = codewordBytes[i] & 0xFF; + } + FX_INT32 numECCodewords = codewordBytes.GetSize() - numDataCodewords; + m_rsDecoder->Decode(&codewordsInts, numECCodewords, e); + if (e != BCExceptionNO) { + e = BCExceptionChecksumException; + return ; + } + for (i = 0; i < numDataCodewords; i++) { + codewordBytes[i] = (FX_BYTE) codewordsInts[i]; + } +} diff --git a/xfa/src/fxbarcode/src/BC_DataMatrixDetector.cpp b/xfa/src/fxbarcode/src/BC_DataMatrixDetector.cpp new file mode 100644 index 0000000000..086b7a3a50 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_DataMatrixDetector.cpp @@ -0,0 +1,352 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_DataMatrixDetector.h" +#include "include/BC_WhiteRectangleDetector.h" +#include "include/BC_ResultPoint.h" +#include "include/BC_QRFinderPatternFinder.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_QRDetectorResult.h" +#include "include/BC_QRGridSampler.h" +const FX_INT32 CBC_DataMatrixDetector::INTEGERS[5] = {0, 1, 2, 3, 4}; +CBC_DataMatrixDetector::CBC_DataMatrixDetector(CBC_CommonBitMatrix *image): + m_image(image), m_rectangleDetector(NULL) +{ +} +void CBC_DataMatrixDetector::Init(FX_INT32 &e) +{ + m_rectangleDetector = FX_NEW CBC_WhiteRectangleDetector(m_image); + m_rectangleDetector->Init(e); + BC_EXCEPTION_CHECK_ReturnVoid(e); +} +CBC_DataMatrixDetector::~CBC_DataMatrixDetector() +{ + if(m_rectangleDetector != NULL) { + delete m_rectangleDetector; + } + m_rectangleDetector = NULL; +} +inline FX_BOOL ResultPointsAndTransitionsComparator(FX_LPVOID a, FX_LPVOID b) +{ + return ((CBC_ResultPointsAndTransitions *)b)->GetTransitions() > ((CBC_ResultPointsAndTransitions *)a)->GetTransitions(); +} +CBC_QRDetectorResult *CBC_DataMatrixDetector::Detect(FX_INT32 &e) +{ + CFX_PtrArray* cornerPoints = m_rectangleDetector->Detect(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_ResultPoint *pointA = (CBC_ResultPoint*)(*cornerPoints)[0]; + CBC_ResultPoint *pointB = (CBC_ResultPoint*)(*cornerPoints)[1]; + CBC_ResultPoint *pointC = (CBC_ResultPoint*)(*cornerPoints)[2]; + CBC_ResultPoint *pointD = (CBC_ResultPoint*)(*cornerPoints)[3]; + delete cornerPoints; + cornerPoints = NULL; + CFX_PtrArray transitions; + transitions.Add(TransitionsBetween(pointA, pointB)); + transitions.Add(TransitionsBetween(pointA, pointC)); + transitions.Add(TransitionsBetween(pointB, pointD)); + transitions.Add(TransitionsBetween(pointC, pointD)); + BC_FX_PtrArray_Sort(transitions, &ResultPointsAndTransitionsComparator); + delete ( (CBC_ResultPointsAndTransitions *)transitions[2] ); + delete ( (CBC_ResultPointsAndTransitions *)transitions[3] ); + CBC_ResultPointsAndTransitions *lSideOne = (CBC_ResultPointsAndTransitions*)transitions[0]; + CBC_ResultPointsAndTransitions *lSideTwo = (CBC_ResultPointsAndTransitions*)transitions[1]; + CFX_MapPtrTemplate pointCount; + Increment(pointCount, lSideOne->GetFrom()); + Increment(pointCount, lSideOne->GetTo()); + Increment(pointCount, lSideTwo->GetFrom()); + Increment(pointCount, lSideTwo->GetTo()); + delete ( (CBC_ResultPointsAndTransitions *)transitions[1] ); + delete ( (CBC_ResultPointsAndTransitions *)transitions[0] ); + transitions.RemoveAll(); + CBC_ResultPoint *maybeTopLeft = NULL; + CBC_ResultPoint *bottomLeft = NULL; + CBC_ResultPoint *maybeBottomRight = NULL; + FX_POSITION itBegin = pointCount.GetStartPosition(); + while(itBegin != NULL) { + CBC_ResultPoint *key = 0; + FX_INT32 value = 0; + pointCount.GetNextAssoc(itBegin, key, value); + if(value == 2) { + bottomLeft = key; + } else { + if (maybeBottomRight == NULL) { + maybeBottomRight = key; + } else { + maybeTopLeft = key; + } + } + } + if (maybeTopLeft == NULL || bottomLeft == NULL || maybeBottomRight == NULL) { + delete pointA; + delete pointB; + delete pointC; + delete pointD; + e = BCExceptionNotFound; + return NULL; + } + CFX_PtrArray corners; + corners.SetSize(3); + corners[0] = maybeTopLeft; + corners[1] = bottomLeft; + corners[2] = maybeBottomRight; + OrderBestPatterns(&corners); + CBC_ResultPoint *bottomRight = (CBC_ResultPoint*)corners[0]; + bottomLeft = (CBC_ResultPoint*)corners[1]; + CBC_ResultPoint *topLeft = (CBC_ResultPoint*)corners[2]; + CBC_ResultPoint *topRight = NULL; + FX_INT32 value; + if (!pointCount.Lookup(pointA, value)) { + topRight = pointA; + } else if (!pointCount.Lookup(pointB, value)) { + topRight = pointB; + } else if (!pointCount.Lookup(pointC, value)) { + topRight = pointC; + } else { + topRight = pointD; + } + FX_INT32 dimensionTop = CBC_AutoPtr(TransitionsBetween(topLeft, topRight))->GetTransitions(); + FX_INT32 dimensionRight = CBC_AutoPtr(TransitionsBetween(bottomRight, topRight))->GetTransitions(); + if ((dimensionTop & 0x01) == 1) { + dimensionTop++; + } + dimensionTop += 2; + if ((dimensionRight & 0x01) == 1) { + dimensionRight++; + } + dimensionRight += 2; + CBC_AutoPtr bits(NULL); + CBC_AutoPtr correctedTopRight(NULL); + if (4 * dimensionTop >= 7 * dimensionRight || 4 * dimensionRight >= 7 * dimensionTop) { + correctedTopRight = + CBC_AutoPtr(CorrectTopRightRectangular(bottomLeft, bottomRight, topLeft, topRight, + dimensionTop, dimensionRight)); + if (correctedTopRight.get() == NULL) { + correctedTopRight = CBC_AutoPtr(topRight); + } else { + delete topRight; + topRight = NULL; + } + dimensionTop = CBC_AutoPtr(TransitionsBetween(topLeft, correctedTopRight.get()))->GetTransitions(); + dimensionRight = CBC_AutoPtr(TransitionsBetween(bottomRight, correctedTopRight.get()))->GetTransitions(); + if ((dimensionTop & 0x01) == 1) { + dimensionTop++; + } + if ((dimensionRight & 0x01) == 1) { + dimensionRight++; + } + bits = CBC_AutoPtr(SampleGrid(m_image, topLeft, bottomLeft, bottomRight, + correctedTopRight.get(), dimensionTop, dimensionRight, e)); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } else { + FX_INT32 dimension = FX_MIN(dimensionRight, dimensionTop); + correctedTopRight = CBC_AutoPtr(CorrectTopRight(bottomLeft, bottomRight, + topLeft, topRight, dimension)); + if (correctedTopRight.get() == NULL) { + correctedTopRight = CBC_AutoPtr(topRight); + } else { + delete topRight; + topRight = NULL; + } + FX_INT32 dimensionCorrected = FX_MAX(CBC_AutoPtr(TransitionsBetween(topLeft, correctedTopRight.get()))->GetTransitions(), + CBC_AutoPtr(TransitionsBetween(bottomRight, correctedTopRight.get()))->GetTransitions()); + dimensionCorrected++; + if ((dimensionCorrected & 0x01) == 1) { + dimensionCorrected++; + } + bits = CBC_AutoPtr(SampleGrid(m_image, + topLeft, + bottomLeft, + bottomRight, + correctedTopRight.get(), + dimensionCorrected, + dimensionCorrected, e)); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + CFX_PtrArray *result = FX_NEW CFX_PtrArray; + result->SetSize(4); + result->Add(topLeft); + result->Add(bottomLeft); + result->Add(bottomRight); + result->Add(correctedTopRight.release()); + return FX_NEW CBC_QRDetectorResult(bits.release(), result); +} +CBC_ResultPoint *CBC_DataMatrixDetector::CorrectTopRightRectangular(CBC_ResultPoint *bottomLeft, CBC_ResultPoint *bottomRight, CBC_ResultPoint *topLeft, CBC_ResultPoint *topRight, FX_INT32 dimensionTop, FX_INT32 dimensionRight) +{ + FX_FLOAT corr = Distance(bottomLeft, bottomRight) / (FX_FLOAT)dimensionTop; + FX_INT32 norm = Distance(topLeft, topRight); + FX_FLOAT cos = (topRight->GetX() - topLeft->GetX()) / norm; + FX_FLOAT sin = (topRight->GetY() - topLeft->GetY()) / norm; + CBC_AutoPtr c1(FX_NEW CBC_ResultPoint(topRight->GetX() + corr * cos, topRight->GetY() + corr * sin)); + corr = Distance(bottomLeft, topLeft) / (FX_FLOAT)dimensionRight; + norm = Distance(bottomRight, topRight); + cos = (topRight->GetX() - bottomRight->GetX()) / norm; + sin = (topRight->GetY() - bottomRight->GetY()) / norm; + CBC_AutoPtr c2(FX_NEW CBC_ResultPoint(topRight->GetX() + corr * cos, topRight->GetY() + corr * sin)); + if (!IsValid(c1.get())) { + if (IsValid(c2.get())) { + return c2.release(); + } + return NULL; + } else if (!IsValid(c2.get())) { + return c1.release(); + } + FX_INT32 l1 = FXSYS_abs(dimensionTop - CBC_AutoPtr(TransitionsBetween(topLeft, c1.get()))->GetTransitions()) + + FXSYS_abs(dimensionRight - CBC_AutoPtr(TransitionsBetween(bottomRight, c1.get()))->GetTransitions()); + FX_INT32 l2 = FXSYS_abs(dimensionTop - CBC_AutoPtr(TransitionsBetween(topLeft, c2.get()))->GetTransitions()) + + FXSYS_abs(dimensionRight - CBC_AutoPtr(TransitionsBetween(bottomRight, c2.get()))->GetTransitions()); + if (l1 <= l2) { + return c1.release(); + } + return c2.release(); +} +CBC_ResultPoint *CBC_DataMatrixDetector::CorrectTopRight(CBC_ResultPoint *bottomLeft, CBC_ResultPoint *bottomRight, CBC_ResultPoint *topLeft, CBC_ResultPoint *topRight, FX_INT32 dimension) +{ + FX_FLOAT corr = Distance(bottomLeft, bottomRight) / (FX_FLOAT) dimension; + FX_INT32 norm = Distance(topLeft, topRight); + FX_FLOAT cos = (topRight->GetX() - topLeft->GetX()) / norm; + FX_FLOAT sin = (topRight->GetY() - topLeft->GetY()) / norm; + CBC_AutoPtr c1(FX_NEW CBC_ResultPoint(topRight->GetX() + corr * cos, topRight->GetY() + corr * sin)); + corr = Distance(bottomLeft, bottomRight) / (FX_FLOAT) dimension; + norm = Distance(bottomRight, topRight); + cos = (topRight->GetX() - bottomRight->GetX()) / norm; + sin = (topRight->GetY() - bottomRight->GetY()) / norm; + CBC_AutoPtr c2(FX_NEW CBC_ResultPoint(topRight->GetX() + corr * cos, topRight->GetY() + corr * sin)); + if (!IsValid(c1.get())) { + if (IsValid(c2.get())) { + return c2.release(); + } + return NULL; + } else if (!IsValid(c2.get())) { + return c1.release(); + } + FX_INT32 l1 = FXSYS_abs(CBC_AutoPtr(TransitionsBetween(topLeft, c1.get()))->GetTransitions() - + CBC_AutoPtr(TransitionsBetween(bottomRight, c1.get()))->GetTransitions()); + FX_INT32 l2 = FXSYS_abs(CBC_AutoPtr(TransitionsBetween(topLeft, c2.get()))->GetTransitions() - + CBC_AutoPtr(TransitionsBetween(bottomRight, c2.get()))->GetTransitions()); + return l1 <= l2 ? c1.release() : c2.release(); +} +FX_BOOL CBC_DataMatrixDetector::IsValid(CBC_ResultPoint *p) +{ + return p->GetX() >= 0 && p->GetX() < m_image->GetWidth() && p->GetY() > 0 && p->GetY() < m_image->GetHeight(); +} +FX_INT32 CBC_DataMatrixDetector::Round(FX_FLOAT d) +{ + return (FX_INT32) (d + 0.5f); +} +FX_INT32 CBC_DataMatrixDetector::Distance(CBC_ResultPoint *a, CBC_ResultPoint *b) +{ + return Round((FX_FLOAT) sqrt((a->GetX() - b->GetX()) + * (a->GetX() - b->GetX()) + (a->GetY() - b->GetY()) + * (a->GetY() - b->GetY()))); +} +void CBC_DataMatrixDetector::Increment(CFX_MapPtrTemplate &table, CBC_ResultPoint *key) +{ + FX_INT32 value; + if(table.Lookup(key, value)) { + table.SetAt(key, INTEGERS[value + 1]); + } else { + table.SetAt(key, INTEGERS[1]); + } +} +CBC_CommonBitMatrix *CBC_DataMatrixDetector::SampleGrid(CBC_CommonBitMatrix *image, + CBC_ResultPoint *topLeft, + CBC_ResultPoint *bottomLeft, + CBC_ResultPoint *bottomRight, + CBC_ResultPoint *topRight, + FX_INT32 dimensionX, FX_INT32 dimensionY, FX_INT32 &e) +{ + CBC_QRGridSampler &sampler = CBC_QRGridSampler::GetInstance(); + CBC_CommonBitMatrix* cbm = sampler.SampleGrid(image, + dimensionX, + dimensionY, + 0.5f, + 0.5f, + dimensionX - 0.5f, + 0.5f, + dimensionX - 0.5f, + dimensionY - 0.5f, + 0.5f, + dimensionY - 0.5f, + topLeft->GetX(), + topLeft->GetY(), + topRight->GetX(), + topRight->GetY(), + bottomRight->GetX(), + bottomRight->GetY(), + bottomLeft->GetX(), + bottomLeft->GetY(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return cbm; +} +CBC_ResultPointsAndTransitions *CBC_DataMatrixDetector::TransitionsBetween(CBC_ResultPoint *from, CBC_ResultPoint *to) +{ + FX_INT32 fromX = (FX_INT32) from->GetX(); + FX_INT32 fromY = (FX_INT32) from->GetY(); + FX_INT32 toX = (FX_INT32) to->GetX(); + FX_INT32 toY = (FX_INT32) to->GetY(); + FX_BOOL steep = FXSYS_abs(toY - fromY) > FXSYS_abs(toX - fromX); + if (steep) { + FX_INT32 temp = fromX; + fromX = fromY; + fromY = temp; + temp = toX; + toX = toY; + toY = temp; + } + FX_INT32 dx = FXSYS_abs(toX - fromX); + FX_INT32 dy = FXSYS_abs(toY - fromY); + FX_INT32 error = -dx >> 1; + FX_INT32 ystep = fromY < toY ? 1 : -1; + FX_INT32 xstep = fromX < toX ? 1 : -1; + FX_INT32 transitions = 0; + FX_BOOL inBlack = m_image->Get(steep ? fromY : fromX, steep ? fromX : fromY); + for (FX_INT32 x = fromX, y = fromY; x != toX; x += xstep) { + FX_BOOL isBlack = m_image->Get(steep ? y : x, steep ? x : y); + if (isBlack != inBlack) { + transitions++; + inBlack = isBlack; + } + error += dy; + if (error > 0) { + if (y == toY) { + break; + } + y += ystep; + error -= dx; + } + } + return FX_NEW CBC_ResultPointsAndTransitions(from, to, transitions); +} +void CBC_DataMatrixDetector::OrderBestPatterns(CFX_PtrArray *patterns) +{ + FX_FLOAT abDistance = (FX_FLOAT)Distance((CBC_ResultPoint*)(*patterns)[0], (CBC_ResultPoint*)(*patterns)[1]); + FX_FLOAT bcDistance = (FX_FLOAT)Distance((CBC_ResultPoint*)(*patterns)[1], (CBC_ResultPoint*)(*patterns)[2]); + FX_FLOAT acDistance = (FX_FLOAT)Distance((CBC_ResultPoint*)(*patterns)[0], (CBC_ResultPoint*)(*patterns)[2]); + CBC_ResultPoint *topLeft, *topRight, *bottomLeft; + if (bcDistance >= abDistance && bcDistance >= acDistance) { + topLeft = (CBC_ResultPoint*)(*patterns)[0]; + topRight = (CBC_ResultPoint*)(*patterns)[1]; + bottomLeft = (CBC_ResultPoint*)(*patterns)[2]; + } else if (acDistance >= bcDistance && acDistance >= abDistance) { + topLeft = (CBC_ResultPoint*)(*patterns)[1]; + topRight = (CBC_ResultPoint*)(*patterns)[0]; + bottomLeft = (CBC_ResultPoint*)(*patterns)[2]; + } else { + topLeft = (CBC_ResultPoint*)(*patterns)[2]; + topRight = (CBC_ResultPoint*)(*patterns)[0]; + bottomLeft = (CBC_ResultPoint*)(*patterns)[1]; + } + if ((bottomLeft->GetY() - topLeft->GetY()) * (topRight->GetX() - topLeft->GetX()) < (bottomLeft->GetX() + - topLeft->GetX()) * (topRight->GetY() - topLeft->GetY())) { + CBC_ResultPoint *temp = topRight; + topRight = bottomLeft; + bottomLeft = temp; + } + (*patterns)[0] = bottomLeft; + (*patterns)[1] = topLeft; + (*patterns)[2] = topRight; +} diff --git a/xfa/src/fxbarcode/src/BC_DataMatrixReader.cpp b/xfa/src/fxbarcode/src/BC_DataMatrixReader.cpp new file mode 100644 index 0000000000..ba03af0f1a --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_DataMatrixReader.cpp @@ -0,0 +1,51 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_DataMatrixDecoder.h" +#include "include/BC_BinaryBitmap.h" +#include "include/BC_DataMatrixDetector.h" +#include "include/BC_QRDetectorResult.h" +#include "include/BC_CommonDecoderResult.h" +#include "include/BC_Reader.h" +#include "include/BC_DataMatrixReader.h" +CBC_DataMatrixReader::CBC_DataMatrixReader() +{ + m_decoder = NULL; +} +void CBC_DataMatrixReader::Init() +{ + m_decoder = FX_NEW CBC_DataMatrixDecoder; + m_decoder->Init(); +} +CBC_DataMatrixReader::~CBC_DataMatrixReader() +{ + if(m_decoder != NULL) { + delete m_decoder; + } + m_decoder = NULL; +} +CFX_ByteString CBC_DataMatrixReader::Decode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e) +{ + CBC_CommonBitMatrix *cdr = image->GetBlackMatrix(e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + CBC_DataMatrixDetector detector(cdr); + detector.Init(e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + CBC_QRDetectorResult* ddr = detector.Detect(e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + CBC_AutoPtr detectorResult(ddr); + CBC_CommonDecoderResult* ResultTemp = m_decoder->Decode(detectorResult->GetBits(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + CBC_AutoPtr decodeResult(ResultTemp); + return decodeResult->GetText(); +} +CFX_ByteString CBC_DataMatrixReader::Decode(CBC_BinaryBitmap *image, FX_INT32 &e) +{ + CFX_ByteString bs = Decode(image, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + return bs; +} diff --git a/xfa/src/fxbarcode/src/BC_DataMatrixSymbolInfo144.cpp b/xfa/src/fxbarcode/src/BC_DataMatrixSymbolInfo144.cpp new file mode 100644 index 0000000000..09a22942f4 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_DataMatrixSymbolInfo144.cpp @@ -0,0 +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 + +#include "barcode.h" +#include "include/BC_Encoder.h" +#include "include/BC_SymbolShapeHint.h" +#include "include/BC_SymbolInfo.h" +#include "include/BC_DataMatrixSymbolInfo144.h" +CBC_DataMatrixSymbolInfo144::CBC_DataMatrixSymbolInfo144() : CBC_SymbolInfo(FALSE, 1558, 620, 22, 22, 36) +{ + m_rsBlockData = -1; + m_rsBlockError = 62; +} +CBC_DataMatrixSymbolInfo144::~CBC_DataMatrixSymbolInfo144() +{ +} +FX_INT32 CBC_DataMatrixSymbolInfo144::getInterleavedBlockCount() +{ + return 10; +} +FX_INT32 CBC_DataMatrixSymbolInfo144getDataLengthForInterleavedBlock(FX_INT32 index) +{ + return (index <= 8) ? 156 : 155; +} diff --git a/xfa/src/fxbarcode/src/BC_DataMatrixVersion.cpp b/xfa/src/fxbarcode/src/BC_DataMatrixVersion.cpp new file mode 100644 index 0000000000..269861b5cd --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_DataMatrixVersion.cpp @@ -0,0 +1,131 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_DataMatrixVersion.h" +CFX_PtrArray* CBC_DataMatrixVersion::VERSIONS = NULL; +void CBC_DataMatrixVersion::Initialize() +{ + VERSIONS = FX_NEW CFX_PtrArray(); +} +void CBC_DataMatrixVersion::Finalize() +{ + for (FX_INT32 i = 0; i < VERSIONS->GetSize(); i++) { + delete ( (CBC_DataMatrixVersion*)(VERSIONS->GetAt(i)) ); + } + VERSIONS->RemoveAll(); + delete VERSIONS; +} +CBC_DataMatrixVersion::CBC_DataMatrixVersion(FX_INT32 versionNumber, + FX_INT32 symbolSizeRows, + FX_INT32 symbolSizeColumns, + FX_INT32 dataRegionSizeRows, + FX_INT32 dataRegionSizeColumns, + ECBlocks *ecBlocks) +{ + m_versionNumber = versionNumber; + m_symbolSizeRows = symbolSizeRows; + m_symbolSizeColumns = symbolSizeColumns; + m_dataRegionSizeRows = dataRegionSizeRows; + m_dataRegionSizeColumns = dataRegionSizeColumns; + m_ecBlocks = ecBlocks; + FX_INT32 total = 0; + FX_INT32 ecCodewords = ecBlocks->GetECCodewords(); + const CFX_PtrArray &ecbArray = ecBlocks->GetECBlocks(); + for (FX_INT32 i = 0; i < ecbArray.GetSize(); i++) { + total += ((ECB*)ecbArray[i])->GetCount() * (((ECB*)ecbArray[i])->GetDataCodewords() + ecCodewords); + } + m_totalCodewords = total; +} +CBC_DataMatrixVersion::~CBC_DataMatrixVersion() +{ + if(m_ecBlocks != NULL) { + delete m_ecBlocks; + } + m_ecBlocks = NULL; +} +FX_INT32 CBC_DataMatrixVersion::GetVersionNumber() +{ + return m_versionNumber; +} +FX_INT32 CBC_DataMatrixVersion::GetSymbolSizeRows() +{ + return m_symbolSizeRows; +} +FX_INT32 CBC_DataMatrixVersion::GetSymbolSizeColumns() +{ + return m_symbolSizeColumns; +} +FX_INT32 CBC_DataMatrixVersion::GetDataRegionSizeRows() +{ + return m_dataRegionSizeRows; +} +FX_INT32 CBC_DataMatrixVersion::GetDataRegionSizeColumns() +{ + return m_dataRegionSizeColumns; +} +FX_INT32 CBC_DataMatrixVersion::GetTotalCodewords() +{ + return m_totalCodewords; +} +ECBlocks *CBC_DataMatrixVersion::GetECBlocks() +{ + return m_ecBlocks; +} +void CBC_DataMatrixVersion::ReleaseAll() +{ + for (FX_INT32 i = 0; i < VERSIONS->GetSize(); i++) { + delete (CBC_DataMatrixVersion*)VERSIONS->GetAt(i); + } + VERSIONS->RemoveAll(); +} +CBC_DataMatrixVersion *CBC_DataMatrixVersion::GetVersionForDimensions(FX_INT32 numRows, FX_INT32 numColumns, FX_INT32 &e) +{ + if ((numRows & 0x01) != 0 || (numColumns & 0x01) != 0) { + e = BCExceptionNotFound; + return NULL; + } + if(VERSIONS->GetSize() == 0) { + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(1, 10, 10, 8, 8, FX_NEW ECBlocks(5, FX_NEW ECB(1, 3)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(2, 12, 12, 10, 10, FX_NEW ECBlocks(7, FX_NEW ECB(1, 5)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(3, 14, 14, 12, 12, FX_NEW ECBlocks(10, FX_NEW ECB(1, 8)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(4, 16, 16, 14, 14, FX_NEW ECBlocks(12, FX_NEW ECB(1, 12)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(5, 18, 18, 16, 16, FX_NEW ECBlocks(14, FX_NEW ECB(1, 18)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(6, 20, 20, 18, 18, FX_NEW ECBlocks(18, FX_NEW ECB(1, 22)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(7, 22, 22, 20, 20, FX_NEW ECBlocks(20, FX_NEW ECB(1, 30)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(8, 24, 24, 22, 22, FX_NEW ECBlocks(24, FX_NEW ECB(1, 36)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(9, 26, 26, 24, 24, FX_NEW ECBlocks(28, FX_NEW ECB(1, 44)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(10, 32, 32, 14, 14, FX_NEW ECBlocks(36, FX_NEW ECB(1, 62)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(11, 36, 36, 16, 16, FX_NEW ECBlocks(42, FX_NEW ECB(1, 86)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(12, 40, 40, 18, 18, FX_NEW ECBlocks(48, FX_NEW ECB(1, 114)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(13, 44, 44, 20, 20, FX_NEW ECBlocks(56, FX_NEW ECB(1, 144)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(14, 48, 48, 22, 22, FX_NEW ECBlocks(68, FX_NEW ECB(1, 174)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(15, 52, 52, 24, 24, FX_NEW ECBlocks(42, FX_NEW ECB(2, 102)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(16, 64, 64, 14, 14, FX_NEW ECBlocks(56, FX_NEW ECB(2, 140)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(17, 72, 72, 16, 16, FX_NEW ECBlocks(36, FX_NEW ECB(4, 92)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(18, 80, 80, 18, 18, FX_NEW ECBlocks(48, FX_NEW ECB(4, 114)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(19, 88, 88, 20, 20, FX_NEW ECBlocks(56, FX_NEW ECB(4, 144)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(20, 96, 96, 22, 22, FX_NEW ECBlocks(68, FX_NEW ECB(4, 174)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(21, 104, 104, 24, 24, FX_NEW ECBlocks(56, FX_NEW ECB(6, 136)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(22, 120, 120, 18, 18, FX_NEW ECBlocks(68, FX_NEW ECB(6, 175)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(23, 132, 132, 20, 20, FX_NEW ECBlocks(62, FX_NEW ECB(8, 163)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(24, 144, 144, 22, 22, FX_NEW ECBlocks(62, FX_NEW ECB(8, 156), FX_NEW ECB(2, 155)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(25, 8, 18, 6, 16, FX_NEW ECBlocks(7, FX_NEW ECB(1, 5)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(26, 8, 32, 6, 14, FX_NEW ECBlocks(11, FX_NEW ECB(1, 10)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(27, 12, 26, 10, 24, FX_NEW ECBlocks(14, FX_NEW ECB(1, 16)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(28, 12, 36, 10, 16, FX_NEW ECBlocks(18, FX_NEW ECB(1, 22)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(29, 16, 36, 14, 16, FX_NEW ECBlocks(24, FX_NEW ECB(1, 32)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(30, 16, 48, 14, 22, FX_NEW ECBlocks(28, FX_NEW ECB(1, 49)))); + } + FX_INT32 numVersions = VERSIONS->GetSize(); + for (FX_INT32 i = 0; i < numVersions; ++i) { + if (((CBC_DataMatrixVersion*)((*VERSIONS)[i]))->m_symbolSizeRows == numRows && ((CBC_DataMatrixVersion*)((*VERSIONS)[i]))->m_symbolSizeColumns == numColumns) { + return (CBC_DataMatrixVersion*)(*VERSIONS)[i]; + } + } + e = BCExceptionNotFound; + return NULL; +} diff --git a/xfa/src/fxbarcode/src/BC_DataMatrixWriter.cpp b/xfa/src/fxbarcode/src/BC_DataMatrixWriter.cpp new file mode 100644 index 0000000000..de122035fe --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_DataMatrixWriter.cpp @@ -0,0 +1,122 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_Writer.h" +#include "include/BC_TwoDimWriter.h" +#include "include/BC_Encoder.h" +#include "include/BC_DefaultPlacement.h" +#include "include/BC_BinaryBitmap.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_SymbolShapeHint.h" +#include "include/BC_SymbolInfo.h" +#include "include/BC_DataMatrixSymbolInfo144.h" +#include "include/BC_ErrorCorrection.h" +#include "include/BC_Dimension.h" +#include "include/BC_EncoderContext.h" +#include "include/BC_C40Encoder.h" +#include "include/BC_TextEncoder.h" +#include "include/BC_X12Encoder.h" +#include "include/BC_EdifactEncoder.h" +#include "include/BC_Base256Encoder.h" +#include "include/BC_ASCIIEncoder.h" +#include "include/BC_HighLevelEncoder.h" +#include "include/BC_CommonByteMatrix.h" +#include "include/BC_DataMatrixWriter.h" +#include "include/BC_UtilCodingConvert.h" +CBC_DataMatrixWriter::CBC_DataMatrixWriter() +{ +} +CBC_DataMatrixWriter::~CBC_DataMatrixWriter() +{ +} +FX_BOOL CBC_DataMatrixWriter::SetErrorCorrectionLevel (FX_INT32 level) +{ + m_iCorrectLevel = level; + return TRUE; +} +FX_BYTE* CBC_DataMatrixWriter::Encode(const CFX_WideString &contents, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) +{ + if (outWidth < 0 || outHeight < 0) { + e = BCExceptionHeightAndWidthMustBeAtLeast1; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + CBC_SymbolShapeHint::SymbolShapeHint shape = CBC_SymbolShapeHint::FORCE_SQUARE; + CBC_Dimension* minSize = NULL; + CBC_Dimension* maxSize = NULL; + CFX_WideString ecLevel; + CFX_WideString encoded = CBC_HighLevelEncoder::encodeHighLevel(contents, ecLevel, shape, minSize, maxSize, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_SymbolInfo* symbolInfo = CBC_SymbolInfo::lookup(encoded.GetLength(), shape, minSize, maxSize, TRUE, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CFX_WideString codewords = CBC_ErrorCorrection::encodeECC200(encoded, symbolInfo, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_DefaultPlacement* placement = FX_NEW CBC_DefaultPlacement(codewords, symbolInfo->getSymbolDataWidth(e), symbolInfo->getSymbolDataHeight(e)); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + placement->place(); + CBC_CommonByteMatrix* bytematrix = encodeLowLevel(placement, symbolInfo, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + outWidth = bytematrix->GetWidth(); + outHeight = bytematrix->GetHeight(); + FX_BYTE* result = FX_Alloc(FX_BYTE, outWidth * outHeight); + FXSYS_memcpy32(result, bytematrix->GetArray(), outWidth * outHeight); + delete bytematrix; + delete placement; + return result; +} +FX_BYTE *CBC_DataMatrixWriter::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) +{ + return NULL; +} +FX_BYTE *CBC_DataMatrixWriter::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) +{ + return NULL; +} +CBC_CommonByteMatrix* CBC_DataMatrixWriter::encodeLowLevel(CBC_DefaultPlacement* placement, CBC_SymbolInfo* symbolInfo, FX_INT32 &e) +{ + FX_INT32 symbolWidth = symbolInfo->getSymbolDataWidth(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + FX_INT32 symbolHeight = symbolInfo->getSymbolDataHeight(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_CommonByteMatrix* matrix = FX_NEW CBC_CommonByteMatrix(symbolInfo->getSymbolWidth(e), symbolInfo->getSymbolHeight(e)); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + matrix->Init(); + FX_INT32 matrixY = 0; + for (FX_INT32 y = 0; y < symbolHeight; y++) { + FX_INT32 matrixX; + if ((y % symbolInfo->m_matrixHeight) == 0) { + matrixX = 0; + for (FX_INT32 x = 0; x < symbolInfo->getSymbolWidth(e); x++) { + matrix->Set(matrixX, matrixY, (x % 2) == 0); + matrixX++; + } + matrixY++; + } + matrixX = 0; + for (FX_INT32 x = 0; x < symbolWidth; x++) { + if ((x % symbolInfo->m_matrixWidth) == 0) { + matrix->Set(matrixX, matrixY, TRUE); + matrixX++; + } + matrix->Set(matrixX, matrixY, placement->getBit(x, y)); + matrixX++; + if ((x % symbolInfo->m_matrixWidth) == symbolInfo->m_matrixWidth - 1) { + matrix->Set(matrixX, matrixY, (y % 2) == 0); + matrixX++; + } + } + matrixY++; + if ((y % symbolInfo->m_matrixHeight) == symbolInfo->m_matrixHeight - 1) { + matrixX = 0; + for (FX_INT32 x = 0; x < symbolInfo->getSymbolWidth(e); x++) { + matrix->Set(matrixX, matrixY, TRUE); + matrixX++; + } + matrixY++; + } + } + return matrix; +} diff --git a/xfa/src/fxbarcode/src/BC_DefaultPlacement.cpp b/xfa/src/fxbarcode/src/BC_DefaultPlacement.cpp new file mode 100644 index 0000000000..b543f08307 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_DefaultPlacement.cpp @@ -0,0 +1,158 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_Encoder.h" +#include "include/BC_DefaultPlacement.h" +CBC_DefaultPlacement::CBC_DefaultPlacement(CFX_WideString codewords, FX_INT32 numcols, FX_INT32 numrows) +{ + m_codewords = codewords; + m_numcols = numcols; + m_numrows = numrows; + m_bits.SetSize(numcols * numrows); + for (FX_INT32 i = 0; i < numcols * numrows; i++) { + m_bits[i] = (FX_BYTE) 2; + } +} +CBC_DefaultPlacement::~CBC_DefaultPlacement() +{ + m_bits.RemoveAll(); +} +FX_INT32 CBC_DefaultPlacement::getNumrows() +{ + return m_numrows; +} +FX_INT32 CBC_DefaultPlacement::getNumcols() +{ + return m_numcols; +} +CFX_ByteArray& CBC_DefaultPlacement::getBits() +{ + return m_bits; +} +FX_BOOL CBC_DefaultPlacement::getBit(FX_INT32 col, FX_INT32 row) +{ + return m_bits[row * m_numcols + col] == 1; +} +void CBC_DefaultPlacement::setBit(FX_INT32 col, FX_INT32 row, FX_BOOL bit) +{ + m_bits[row * m_numcols + col] = bit ? (FX_BYTE) 1 : (FX_BYTE) 0; +} +FX_BOOL CBC_DefaultPlacement::hasBit(FX_INT32 col, FX_INT32 row) +{ + return m_bits[row * m_numcols + col] != 2; +} +void CBC_DefaultPlacement::place() +{ + FX_INT32 pos = 0; + FX_INT32 row = 4; + FX_INT32 col = 0; + do { + if ((row == m_numrows) && (col == 0)) { + corner1(pos++); + } + if ((row == m_numrows - 2) && (col == 0) && ((m_numcols % 4) != 0)) { + corner2(pos++); + } + if ((row == m_numrows - 2) && (col == 0) && (m_numcols % 8 == 4)) { + corner3(pos++); + } + if ((row == m_numrows + 4) && (col == 2) && ((m_numcols % 8) == 0)) { + corner4(pos++); + } + do { + if ((row < m_numrows) && (col >= 0) && !hasBit(col, row)) { + utah(row, col, pos++); + } + row -= 2; + col += 2; + } while (row >= 0 && (col < m_numcols)); + row++; + col += 3; + do { + if ((row >= 0) && (col < m_numcols) && !hasBit(col, row)) { + utah(row, col, pos++); + } + row += 2; + col -= 2; + } while ((row < m_numrows) && (col >= 0)); + row += 3; + col++; + } while ((row < m_numrows) || (col < m_numcols)); + if (!hasBit(m_numcols - 1, m_numrows - 1)) { + setBit(m_numcols - 1, m_numrows - 1, TRUE); + setBit(m_numcols - 2, m_numrows - 2, TRUE); + } +} +void CBC_DefaultPlacement::module(FX_INT32 row, FX_INT32 col, FX_INT32 pos, FX_INT32 bit) +{ + if (row < 0) { + row += m_numrows; + col += 4 - ((m_numrows + 4) % 8); + } + if (col < 0) { + col += m_numcols; + row += 4 - ((m_numcols + 4) % 8); + } + FX_INT32 v = m_codewords.GetAt(pos); + v &= 1 << (8 - bit); + setBit(col, row, v != 0); +} +void CBC_DefaultPlacement::utah(FX_INT32 row, FX_INT32 col, FX_INT32 pos) +{ + module(row - 2, col - 2, pos, 1); + module(row - 2, col - 1, pos, 2); + module(row - 1, col - 2, pos, 3); + module(row - 1, col - 1, pos, 4); + module(row - 1, col, pos, 5); + module(row, col - 2, pos, 6); + module(row, col - 1, pos, 7); + module(row, col, pos, 8); +} +void CBC_DefaultPlacement::corner1(FX_INT32 pos) +{ + module(m_numrows - 1, 0, pos, 1); + module(m_numrows - 1, 1, pos, 2); + module(m_numrows - 1, 2, pos, 3); + module(0, m_numcols - 2, pos, 4); + module(0, m_numcols - 1, pos, 5); + module(1, m_numcols - 1, pos, 6); + module(2, m_numcols - 1, pos, 7); + module(3, m_numcols - 1, pos, 8); +} +void CBC_DefaultPlacement::corner2(FX_INT32 pos) +{ + module(m_numrows - 3, 0, pos, 1); + module(m_numrows - 2, 0, pos, 2); + module(m_numrows - 1, 0, pos, 3); + module(0, m_numcols - 4, pos, 4); + module(0, m_numcols - 3, pos, 5); + module(0, m_numcols - 2, pos, 6); + module(0, m_numcols - 1, pos, 7); + module(1, m_numcols - 1, pos, 8); +} +void CBC_DefaultPlacement::corner3(FX_INT32 pos) +{ + module(m_numrows - 3, 0, pos, 1); + module(m_numrows - 2, 0, pos, 2); + module(m_numrows - 1, 0, pos, 3); + module(0, m_numcols - 2, pos, 4); + module(0, m_numcols - 1, pos, 5); + module(1, m_numcols - 1, pos, 6); + module(2, m_numcols - 1, pos, 7); + module(3, m_numcols - 1, pos, 8); +} +void CBC_DefaultPlacement::corner4(FX_INT32 pos) +{ + module(m_numrows - 1, 0, pos, 1); + module(m_numrows - 1, m_numcols - 1, pos, 2); + module(0, m_numcols - 3, pos, 3); + module(0, m_numcols - 2, pos, 4); + module(0, m_numcols - 1, pos, 5); + module(1, m_numcols - 3, pos, 6); + module(1, m_numcols - 2, pos, 7); + module(1, m_numcols - 1, pos, 8); +} diff --git a/xfa/src/fxbarcode/src/BC_Dimension.cpp b/xfa/src/fxbarcode/src/BC_Dimension.cpp new file mode 100644 index 0000000000..588b3aa961 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_Dimension.cpp @@ -0,0 +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 + +#include "barcode.h" +#include "include/BC_Encoder.h" +#include "include/BC_Dimension.h" +CBC_Dimension::CBC_Dimension() +{ +} +CBC_Dimension::CBC_Dimension(FX_INT32 width, FX_INT32 height, FX_INT32 &e) +{ + if (width < 0 || height < 0) { + e = BCExceptionHeightAndWidthMustBeAtLeast1; + } + m_width = width; + m_height = height; +} +CBC_Dimension::~CBC_Dimension() +{ +} +FX_INT32 CBC_Dimension::getWidth() +{ + return m_width; +} +FX_INT32 CBC_Dimension::getHeight() +{ + return m_height; +} +FX_INT32 CBC_Dimension::hashCode() +{ + return m_width * 32713 + m_height; +} +CFX_WideString CBC_Dimension::toString() +{ + return (FX_WCHAR)(m_width + (FX_WCHAR)'x' + m_height); +} diff --git a/xfa/src/fxbarcode/src/BC_EdifactEncoder.cpp b/xfa/src/fxbarcode/src/BC_EdifactEncoder.cpp new file mode 100644 index 0000000000..134e484e25 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_EdifactEncoder.cpp @@ -0,0 +1,137 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_Encoder.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_Dimension.h" +#include "include/BC_SymbolShapeHint.h" +#include "include/BC_SymbolInfo.h" +#include "include/BC_EncoderContext.h" +#include "include/BC_HighLevelEncoder.h" +#include "include/BC_EdifactEncoder.h" +CBC_EdifactEncoder::CBC_EdifactEncoder() +{ +} +CBC_EdifactEncoder::~CBC_EdifactEncoder() +{ +} +FX_INT32 CBC_EdifactEncoder::getEncodingMode() +{ + return EDIFACT_ENCODATION; +} +void CBC_EdifactEncoder::Encode(CBC_EncoderContext &context, FX_INT32 &e) +{ + CFX_WideString buffer; + while (context.hasMoreCharacters()) { + FX_WCHAR c = context.getCurrentChar(); + encodeChar(c, buffer, e); + if (e != BCExceptionNO) { + return; + } + context.m_pos++; + FX_INT32 count = buffer.GetLength(); + if (count >= 4) { + context.writeCodewords(encodeToCodewords(buffer, 0, e)); + if (e != BCExceptionNO) { + return; + } + buffer.Delete(0, 4); + FX_INT32 newMode = CBC_HighLevelEncoder::lookAheadTest(context.m_msg, context.m_pos, getEncodingMode()); + if (newMode != getEncodingMode()) { + context.signalEncoderChange(ASCII_ENCODATION); + break; + } + } + } + buffer += (FX_WCHAR)31; + handleEOD(context, buffer, e); +} +void CBC_EdifactEncoder::handleEOD(CBC_EncoderContext &context, CFX_WideString buffer, FX_INT32 &e) +{ + FX_INT32 count = buffer.GetLength(); + if (count == 0) { + return; + } + if (count == 1) { + context.updateSymbolInfo(e); + if (e != BCExceptionNO) { + return; + } + FX_INT32 available = context.m_symbolInfo->m_dataCapacity - context.getCodewordCount(); + FX_INT32 remaining = context.getRemainingCharacters(); + if (remaining == 0 && available <= 2) { + return; + } + } + if (count > 4) { + e = BCExceptionIllegalStateCountMustNotExceed4; + return; + } + FX_INT32 restChars = count - 1; + CFX_WideString encoded = encodeToCodewords(buffer, 0, e); + if (e != BCExceptionNO) { + return; + } + FX_BOOL endOfSymbolReached = !context.hasMoreCharacters(); + FX_BOOL restInAscii = endOfSymbolReached && restChars <= 2; + if (restChars <= 2) { + context.updateSymbolInfo(context.getCodewordCount() + restChars, e); + if (e != BCExceptionNO) { + return; + } + FX_INT32 available = context.m_symbolInfo->m_dataCapacity - context.getCodewordCount(); + if (available >= 3) { + restInAscii = FALSE; + context.updateSymbolInfo(context.getCodewordCount() + encoded.GetLength(), e); + if (e != BCExceptionNO) { + return; + } + } + } + if (restInAscii) { + context.resetSymbolInfo(); + context.m_pos -= restChars; + } else { + context.writeCodewords(encoded); + } + context.signalEncoderChange(ASCII_ENCODATION); +} +void CBC_EdifactEncoder::encodeChar(FX_WCHAR c, CFX_WideString &sb, FX_INT32 &e) +{ + if (c >= ' ' && c <= '?') { + sb += c; + } else if (c >= '@' && c <= '^') { + sb += (FX_WCHAR)(c - 64); + } else { + CBC_HighLevelEncoder::illegalCharacter(c, e); + } +} +CFX_WideString CBC_EdifactEncoder::encodeToCodewords(CFX_WideString sb, FX_INT32 startPos, FX_INT32 &e) +{ + FX_INT32 len = sb.GetLength() - startPos; + if (len == 0) { + e = BCExceptionNoContents; + return (FX_LPWSTR)""; + } + FX_WCHAR c1 = sb.GetAt(startPos); + FX_WCHAR c2 = len >= 2 ? sb.GetAt(startPos + 1) : 0; + FX_WCHAR c3 = len >= 3 ? sb.GetAt(startPos + 2) : 0; + FX_WCHAR c4 = len >= 4 ? sb.GetAt(startPos + 3) : 0; + FX_INT32 v = (c1 << 18) + (c2 << 12) + (c3 << 6) + c4; + FX_WCHAR cw1 = (FX_WCHAR) ((v >> 16) & 255); + FX_WCHAR cw2 = (FX_WCHAR) ((v >> 8) & 255); + FX_WCHAR cw3 = (FX_WCHAR) (v & 255); + CFX_WideString res; + res += cw1; + if (len >= 2) { + res += cw2; + } + if (len >= 3) { + res += cw3; + } + return res; +} diff --git a/xfa/src/fxbarcode/src/BC_Encoder.cpp b/xfa/src/fxbarcode/src/BC_Encoder.cpp new file mode 100644 index 0000000000..f9b224e68e --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_Encoder.cpp @@ -0,0 +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 + +#include "barcode.h" +#include "include/BC_Encoder.h" +CBC_Encoder::CBC_Encoder() +{ +} +CBC_Encoder::~CBC_Encoder() +{ +} diff --git a/xfa/src/fxbarcode/src/BC_EncoderContext.cpp b/xfa/src/fxbarcode/src/BC_EncoderContext.cpp new file mode 100644 index 0000000000..0ac7ebb53d --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_EncoderContext.cpp @@ -0,0 +1,111 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_Encoder.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_Dimension.h" +#include "include/BC_SymbolShapeHint.h" +#include "include/BC_SymbolInfo.h" +#include "include/BC_EncoderContext.h" +#include "include/BC_UtilCodingConvert.h" +CBC_EncoderContext::CBC_EncoderContext(const CFX_WideString msg, CFX_WideString ecLevel, FX_INT32 &e) +{ + CFX_ByteString dststr; + CBC_UtilCodingConvert::UnicodeToUTF8(msg, dststr); + CFX_WideString sb; + FX_INT32 c = dststr.GetLength(); + for (FX_INT32 i = 0; i < c; i++) { + FX_WCHAR ch = (FX_WCHAR)(dststr.GetAt(i) & 0xff); + if (ch == '?' && dststr.GetAt(i) != '?') { + e = BCExceptionCharactersOutsideISO88591Encoding; + } + sb += ch; + } + m_msg = sb; + m_shape = FORCE_NONE; + m_newEncoding = -1; + m_pos = 0; + m_symbolInfo = NULL; + m_skipAtEnd = 0; + m_maxSize = NULL; + m_minSize = NULL; +} +CBC_EncoderContext::~CBC_EncoderContext() +{ +} +void CBC_EncoderContext::setSymbolShape(SymbolShapeHint shape) +{ + m_shape = shape; +} +void CBC_EncoderContext::setSizeConstraints(CBC_Dimension* minSize, CBC_Dimension* maxSize) +{ + m_maxSize = maxSize; + m_minSize = minSize; +} +CFX_WideString CBC_EncoderContext::getMessage() +{ + return m_msg; +} +void CBC_EncoderContext::setSkipAtEnd(FX_INT32 count) +{ + m_skipAtEnd = count; +} +FX_WCHAR CBC_EncoderContext::getCurrentChar() +{ + return m_msg.GetAt(m_pos); +} +FX_WCHAR CBC_EncoderContext::getCurrent() +{ + return m_msg.GetAt(m_pos); +} +void CBC_EncoderContext::writeCodewords(CFX_WideString codewords) +{ + m_codewords += codewords; +} +void CBC_EncoderContext::writeCodeword(FX_WCHAR codeword) +{ + m_codewords += codeword; +} +FX_INT32 CBC_EncoderContext::getCodewordCount() +{ + return m_codewords.GetLength(); +} +void CBC_EncoderContext::signalEncoderChange(FX_INT32 encoding) +{ + m_newEncoding = encoding; +} +void CBC_EncoderContext::resetEncoderSignal() +{ + m_newEncoding = -1; +} +FX_BOOL CBC_EncoderContext::hasMoreCharacters() +{ + return m_pos < getTotalMessageCharCount(); +} +FX_INT32 CBC_EncoderContext::getRemainingCharacters() +{ + return getTotalMessageCharCount() - m_pos; +} +void CBC_EncoderContext::updateSymbolInfo(FX_INT32 &e) +{ + updateSymbolInfo(getCodewordCount(), e); +} +void CBC_EncoderContext::updateSymbolInfo(FX_INT32 len, FX_INT32 &e) +{ + if (m_symbolInfo == NULL || len > m_symbolInfo->m_dataCapacity) { + m_symbolInfo = CBC_SymbolInfo::lookup(len, m_shape, m_minSize, m_maxSize, true, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +void CBC_EncoderContext::resetSymbolInfo() +{ + m_shape = FORCE_NONE; +} +FX_INT32 CBC_EncoderContext::getTotalMessageCharCount() +{ + return m_msg.GetLength() - m_skipAtEnd; +} diff --git a/xfa/src/fxbarcode/src/BC_ErrorCorrection.cpp b/xfa/src/fxbarcode/src/BC_ErrorCorrection.cpp new file mode 100644 index 0000000000..1e5738ff01 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_ErrorCorrection.cpp @@ -0,0 +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 "barcode.h" +#include "include/BC_Encoder.h" +#include "include/BC_SymbolShapeHint.h" +#include "include/BC_SymbolInfo.h" +#include "include/BC_ErrorCorrection.h" +FX_INT32 CBC_ErrorCorrection::FACTOR_SETS[] = {5, 7, 10, 11, 12, 14, 18, 20, 24, 28, 36, 42, 48, 56, 62, 68}; +FX_INT32 CBC_ErrorCorrection::FACTORS[][100] = { + {228, 48, 15, 111, 62}, + {23, 68, 144, 134, 240, 92, 254}, + {28, 24, 185, 166, 223, 248, 116, 255, 110, 61}, + {175, 138, 205, 12, 194, 168, 39, 245, 60, 97, 120}, + {41, 153, 158, 91, 61, 42, 142, 213, 97, 178, 100, 242}, + {156, 97, 192, 252, 95, 9, 157, 119, 138, 45, 18, 186, 83, 185}, + {83, 195, 100, 39, 188, 75, 66, 61, 241, 213, 109, 129, 94, 254, 225, 48, 90, 188}, + {15, 195, 244, 9, 233, 71, 168, 2, 188, 160, 153, 145, 253, 79, 108, 82, 27, 174, 186, 172}, + { + 52, 190, 88, 205, 109, 39, 176, 21, 155, 197, 251, 223, 155, 21, 5, 172, + 254, 124, 12, 181, 184, 96, 50, 193 + }, + { + 211, 231, 43, 97, 71, 96, 103, 174, 37, 151, 170, 53, 75, 34, 249, 121, + 17, 138, 110, 213, 141, 136, 120, 151, 233, 168, 93, 255 + }, + { + 245, 127, 242, 218, 130, 250, 162, 181, 102, 120, 84, 179, 220, 251, 80, 182, + 229, 18, 2, 4, 68, 33, 101, 137, 95, 119, 115, 44, 175, 184, 59, 25, + 225, 98, 81, 112 + }, + { + 77, 193, 137, 31, 19, 38, 22, 153, 247, 105, 122, 2, 245, 133, 242, 8, + 175, 95, 100, 9, 167, 105, 214, 111, 57, 121, 21, 1, 253, 57, 54, 101, + 248, 202, 69, 50, 150, 177, 226, 5, 9, 5 + }, + { + 245, 132, 172, 223, 96, 32, 117, 22, 238, 133, 238, 231, 205, 188, 237, 87, + 191, 106, 16, 147, 118, 23, 37, 90, 170, 205, 131, 88, 120, 100, 66, 138, + 186, 240, 82, 44, 176, 87, 187, 147, 160, 175, 69, 213, 92, 253, 225, 19 + }, + { + 175, 9, 223, 238, 12, 17, 220, 208, 100, 29, 175, 170, 230, 192, 215, 235, + 150, 159, 36, 223, 38, 200, 132, 54, 228, 146, 218, 234, 117, 203, 29, 232, + 144, 238, 22, 150, 201, 117, 62, 207, 164, 13, 137, 245, 127, 67, 247, 28, + 155, 43, 203, 107, 233, 53, 143, 46 + }, + { + 242, 93, 169, 50, 144, 210, 39, 118, 202, 188, 201, 189, 143, 108, 196, 37, + 185, 112, 134, 230, 245, 63, 197, 190, 250, 106, 185, 221, 175, 64, 114, 71, + 161, 44, 147, 6, 27, 218, 51, 63, 87, 10, 40, 130, 188, 17, 163, 31, + 176, 170, 4, 107, 232, 7, 94, 166, 224, 124, 86, 47, 11, 204 + }, + { + 220, 228, 173, 89, 251, 149, 159, 56, 89, 33, 147, 244, 154, 36, 73, 127, + 213, 136, 248, 180, 234, 197, 158, 177, 68, 122, 93, 213, 15, 160, 227, 236, + 66, 139, 153, 185, 202, 167, 179, 25, 220, 232, 96, 210, 231, 136, 223, 239, + 181, 241, 59, 52, 172, 25, 49, 232, 211, 189, 64, 54, 108, 153, 132, 63, + 96, 103, 82, 186 + } +}; +FX_INT32 CBC_ErrorCorrection::MODULO_VALUE = 0x12D; +FX_INT32 CBC_ErrorCorrection::LOG[256] = {0}; +FX_INT32 CBC_ErrorCorrection::ALOG[256] = {0}; +void CBC_ErrorCorrection::Initialize() +{ + FX_INT32 p = 1; + for (FX_INT32 i = 0; i < 255; i++) { + ALOG[i] = p; + LOG[p] = i; + p <<= 1; + if (p >= 256) { + p ^= MODULO_VALUE; + } + } +} +void CBC_ErrorCorrection::Finalize() +{ +} +CBC_ErrorCorrection::CBC_ErrorCorrection() +{ +} +CBC_ErrorCorrection::~CBC_ErrorCorrection() +{ +} +CFX_WideString CBC_ErrorCorrection::encodeECC200(CFX_WideString codewords, CBC_SymbolInfo* symbolInfo, FX_INT32 &e) +{ + if (codewords.GetLength() != symbolInfo->m_dataCapacity) { + e = BCExceptionIllegalArgument; + return (FX_LPWSTR)""; + } + CFX_WideString sb; + sb += codewords; + FX_INT32 blockCount = symbolInfo->getInterleavedBlockCount(); + if (blockCount == 1) { + CFX_WideString ecc = createECCBlock(codewords, symbolInfo->m_errorCodewords, e); + BC_EXCEPTION_CHECK_ReturnValue(e, (FX_LPWSTR)""); + sb += ecc; + } else { + CFX_Int32Array dataSizes; + dataSizes.SetSize(blockCount); + CFX_Int32Array errorSizes; + errorSizes.SetSize(blockCount); + CFX_Int32Array startPos; + startPos.SetSize(blockCount); + for (FX_INT32 i = 0; i < blockCount; i++) { + dataSizes[i] = symbolInfo->getDataLengthForInterleavedBlock(i + 1); + errorSizes[i] = symbolInfo->getErrorLengthForInterleavedBlock(i + 1); + startPos[i] = 0; + if (i > 0) { + startPos[i] = startPos[i - 1] + dataSizes[i]; + } + } + for (FX_INT32 block = 0; block < blockCount; block++) { + CFX_WideString temp; + for (FX_INT32 d = block; d < symbolInfo->m_dataCapacity; d += blockCount) { + temp += (FX_WCHAR)codewords.GetAt(d); + } + CFX_WideString ecc = createECCBlock(temp, errorSizes[block], e); + BC_EXCEPTION_CHECK_ReturnValue(e, (FX_LPWSTR)""); + FX_INT32 pos = 0; + for (FX_INT32 l = block; l < errorSizes[block] * blockCount; l += blockCount) { + sb.SetAt(symbolInfo->m_dataCapacity + l, ecc.GetAt(pos++)); + } + } + } + return sb; +} +CFX_WideString CBC_ErrorCorrection::createECCBlock(CFX_WideString codewords, FX_INT32 numECWords, FX_INT32 &e) +{ + return createECCBlock(codewords, 0, codewords.GetLength(), numECWords, e); +} +CFX_WideString CBC_ErrorCorrection::createECCBlock(CFX_WideString codewords, FX_INT32 start, FX_INT32 len, FX_INT32 numECWords, FX_INT32 &e) +{ + FX_INT32 table = -1; + for (FX_INT32 i = 0; i < sizeof(FACTOR_SETS) / sizeof(FX_INT32); i++) { + if (FACTOR_SETS[i] == numECWords) { + table = i; + break; + } + } + if (table < 0) { + e = BCExceptionIllegalArgument; + return (FX_LPWSTR)""; + } + FX_WORD* ecc = FX_Alloc(FX_WORD, numECWords); + FXSYS_memset32(ecc, 0, numECWords * sizeof(FX_WORD)); + for (FX_INT32 l = start; l < start + len; l++) { + FX_BYTE A = (FX_BYTE)codewords.GetAt(l); + FX_WORD B = ecc[numECWords - 1]; + FX_WORD m = ecc[numECWords - 1] ^ codewords.GetAt(l); + for (FX_INT32 k = numECWords - 1; k > 0; k--) { + if (m != 0 && FACTORS[table][k] != 0) { + FX_INT32 a = LOG[FACTORS[table][k]]; + FX_INT32 b = ALOG[(LOG[m] + LOG[FACTORS[table][k]]) % 255]; + FX_WORD c = ecc[k - 1]; + FX_WORD D = (ecc[k - 1] ^ ALOG[(LOG[m] + LOG[FACTORS[table][k]]) % 255]); + ecc[k] = (FX_WORD ) (ecc[k - 1] ^ ALOG[(LOG[m] + LOG[FACTORS[table][k]]) % 255]); + } else { + ecc[k] = ecc[k - 1]; + } + } + if (m != 0 && FACTORS[table][0] != 0) { + ecc[0] = (FX_WORD) ALOG[(LOG[m] + LOG[FACTORS[table][0]]) % 255]; + } else { + ecc[0] = 0; + } + } + CFX_WideString strecc; + for (FX_INT32 j = 0; j < numECWords; j++) { + strecc += (FX_WCHAR)ecc[numECWords - j - 1]; + } + FX_Free(ecc); + return strecc; +} diff --git a/xfa/src/fxbarcode/src/BC_FinderPatternInfo.cpp b/xfa/src/fxbarcode/src/BC_FinderPatternInfo.cpp new file mode 100644 index 0000000000..186ed063a8 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_FinderPatternInfo.cpp @@ -0,0 +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 "barcode.h" +#include "include/BC_ResultPoint.h" +#include "include/BC_QRFinderPattern.h" +#include "include/BC_FinderPatternInfo.h" +CBC_QRFinderPatternInfo::CBC_QRFinderPatternInfo(CFX_PtrArray *patternCenters) +{ + m_bottomLeft = (CBC_QRFinderPattern*)(*patternCenters)[0]; + m_topLeft = (CBC_QRFinderPattern*)(*patternCenters)[1]; + m_topRight = (CBC_QRFinderPattern*)(*patternCenters)[2]; +} +CBC_QRFinderPatternInfo::~CBC_QRFinderPatternInfo() +{ +} +CBC_QRFinderPattern* CBC_QRFinderPatternInfo::GetBottomLeft() +{ + return m_bottomLeft; +} +CBC_QRFinderPattern* CBC_QRFinderPatternInfo::GetTopLeft() +{ + return m_topLeft; +} +CBC_QRFinderPattern* CBC_QRFinderPatternInfo::GetTopRight() +{ + return m_topRight; +} diff --git a/xfa/src/fxbarcode/src/BC_GlobalHistogramBinarizer.cpp b/xfa/src/fxbarcode/src/BC_GlobalHistogramBinarizer.cpp new file mode 100644 index 0000000000..e20ad68e70 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_GlobalHistogramBinarizer.cpp @@ -0,0 +1,153 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_Binarizer.h" +#include "include/BC_LuminanceSource.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_CommonBitArray.h" +#include "include/BC_GlobalHistogramBinarizer.h" +const FX_INT32 LUMINANCE_BITS = 5; +const FX_INT32 LUMINANCE_SHIFT = 8 - LUMINANCE_BITS; +const FX_INT32 LUMINANCE_BUCKETS = 1 << LUMINANCE_BITS; +CBC_GlobalHistogramBinarizer::CBC_GlobalHistogramBinarizer(CBC_LuminanceSource *source): CBC_Binarizer(source) +{ +} +CBC_GlobalHistogramBinarizer::~CBC_GlobalHistogramBinarizer() +{ +} +CBC_CommonBitArray *CBC_GlobalHistogramBinarizer::GetBlackRow(FX_INT32 y, CBC_CommonBitArray *row, FX_INT32 &e) +{ + CBC_LuminanceSource *source = GetLuminanceSource(); + FX_INT32 width = source->GetWidth(); + CBC_AutoPtr result(FX_NEW CBC_CommonBitArray(width)); + InitArrays(width); + CFX_ByteArray *localLuminances = source->GetRow(y, m_luminance, e); + if (e != BCExceptionNO) { + return result.release(); + } + CFX_Int32Array localBuckets; + localBuckets.Copy(m_buckets); + FX_INT32 x; + for (x = 0; x < width; x++) { + FX_INT32 pixel = (*localLuminances)[x] & 0xff; + localBuckets[pixel >> LUMINANCE_SHIFT]++; + } + FX_INT32 blackPoint = EstimateBlackPoint(localBuckets, e); + if (e != BCExceptionNO) { + return result.release(); + } + FX_INT32 left = (*localLuminances)[0] & 0xff; + FX_INT32 center = (*localLuminances)[1] & 0xff; + for (x = 1; x < width - 1; x++) { + FX_INT32 right = (*localLuminances)[x + 1] & 0xff; + FX_INT32 luminance = ((center << 2) - left - right) >> 1; + if (luminance < blackPoint) { + result->Set(x); + } + left = center; + center = right; + } + return result.release(); +} +CBC_CommonBitMatrix *CBC_GlobalHistogramBinarizer::GetBlackMatrix(FX_INT32 &e) +{ + CBC_LuminanceSource *source = GetLuminanceSource(); + FX_INT32 width = source->GetWidth(); + FX_INT32 height = source->GetHeight(); + CBC_CommonBitMatrix *BitMatrixTemp = FX_NEW CBC_CommonBitMatrix(); + BitMatrixTemp->Init(width, height); + CBC_AutoPtr matrix(BitMatrixTemp); + InitArrays(width); + CFX_Int32Array localBuckets; + localBuckets.Copy(m_buckets); + FX_INT32 y; + for (y = 1; y < 5; y++) { + FX_INT32 row = height * y / 5; + CFX_ByteArray *localLuminances = source->GetRow(row, m_luminance, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + FX_INT32 right = (width << 2) / 5; + FX_INT32 x; + for (x = width / 5; x < right; x++) { + FX_INT32 pixel = (*localLuminances)[x] & 0xff; + localBuckets[pixel >> LUMINANCE_SHIFT]++; + } + } + FX_INT32 blackPoint = EstimateBlackPoint(localBuckets, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr localLuminances(source->GetMatrix()); + for (y = 0; y < height; y++) { + FX_INT32 offset = y * width; + for (FX_INT32 x = 0; x < width; x++) { + FX_INT32 pixel = (*localLuminances)[offset + x] & 0xff; + if (pixel < blackPoint) { + matrix->Set(x, y); + } + } + } + return matrix.release(); +} +void CBC_GlobalHistogramBinarizer::InitArrays(FX_INT32 luminanceSize) +{ + if(m_luminance.GetSize() < luminanceSize) { + m_luminance.SetSize(luminanceSize); + } + if(m_buckets.GetSize() <= 0) { + m_buckets.SetSize(LUMINANCE_BUCKETS); + } else { + FX_INT32 x; + for(x = 0; x < LUMINANCE_BUCKETS; x++) { + m_buckets[x] = 0; + } + } +} +FX_INT32 CBC_GlobalHistogramBinarizer::EstimateBlackPoint(CFX_Int32Array &buckets, FX_INT32 &e) +{ + FX_INT32 numBuckets = buckets.GetSize(); + FX_INT32 maxBucketCount = 0; + FX_INT32 firstPeak = 0; + FX_INT32 firstPeakSize = 0; + FX_INT32 x; + for (x = 0; x < numBuckets; x++) { + if (buckets[x] > firstPeakSize) { + firstPeak = x; + firstPeakSize = buckets[x]; + } + if (buckets[x] > maxBucketCount) { + maxBucketCount = buckets[x]; + } + } + FX_INT32 secondPeak = 0; + FX_INT32 secondPeakScore = 0; + for (x = 0; x < numBuckets; x++) { + FX_INT32 distanceToBiggest = x - firstPeak; + FX_INT32 score = buckets[x] * distanceToBiggest * distanceToBiggest; + if (score > secondPeakScore) { + secondPeak = x; + secondPeakScore = score; + } + } + if (firstPeak > secondPeak) { + FX_INT32 temp = firstPeak; + firstPeak = secondPeak; + secondPeak = temp; + } + if (secondPeak - firstPeak <= numBuckets >> 4) { + e = BCExceptionRead; + return 0; + } + FX_INT32 bestValley = secondPeak - 1; + FX_INT32 bestValleyScore = -1; + for (x = secondPeak - 1; x > firstPeak; x--) { + FX_INT32 fromFirst = x - firstPeak; + FX_INT32 score = fromFirst * fromFirst * (secondPeak - x) * (maxBucketCount - buckets[x]); + if (score > bestValleyScore) { + bestValley = x; + bestValleyScore = score; + } + } + return bestValley << LUMINANCE_SHIFT; +} diff --git a/xfa/src/fxbarcode/src/BC_HighLevelEncoder.cpp b/xfa/src/fxbarcode/src/BC_HighLevelEncoder.cpp new file mode 100644 index 0000000000..d1bedb6478 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_HighLevelEncoder.cpp @@ -0,0 +1,352 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_Encoder.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_Dimension.h" +#include "include/BC_SymbolShapeHint.h" +#include "include/BC_SymbolInfo.h" +#include "include/BC_EncoderContext.h" +#include "include/BC_C40Encoder.h" +#include "include/BC_TextEncoder.h" +#include "include/BC_X12Encoder.h" +#include "include/BC_EdifactEncoder.h" +#include "include/BC_Base256Encoder.h" +#include "include/BC_ASCIIEncoder.h" +#include "include/BC_HighLevelEncoder.h" +#include "include/BC_UtilCodingConvert.h" +#define Integer_MAX_VALUE 2147483647 +FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_C40 = 230; +FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_BASE256 = 231; +FX_WCHAR CBC_HighLevelEncoder::UPPER_SHIFT = 235; +FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_ANSIX12 = 238; +FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_TEXT = 239; +FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_EDIFACT = 240; +FX_WCHAR CBC_HighLevelEncoder::C40_UNLATCH = 254; +FX_WCHAR CBC_HighLevelEncoder::X12_UNLATCH = 254; +FX_WCHAR CBC_HighLevelEncoder::PAD = 129; +FX_WCHAR CBC_HighLevelEncoder::MACRO_05 = 236; +FX_WCHAR CBC_HighLevelEncoder::MACRO_06 = 237; +const wchar_t* CBC_HighLevelEncoder::MACRO_05_HEADER = L"[)>05"; +const wchar_t* CBC_HighLevelEncoder::MACRO_06_HEADER = L"[)>06"; +const wchar_t CBC_HighLevelEncoder::MACRO_TRAILER = 0x0004; +CBC_HighLevelEncoder::CBC_HighLevelEncoder() +{ +} +CBC_HighLevelEncoder::~CBC_HighLevelEncoder() +{ +} +CFX_ByteArray& CBC_HighLevelEncoder::getBytesForMessage(CFX_WideString msg) +{ + CFX_ByteString bytestr; + CBC_UtilCodingConvert::UnicodeToUTF8(msg, bytestr); + for (FX_INT32 i = 0; i < bytestr.GetLength(); i++) { + m_bytearray.Add(bytestr.GetAt(i)); + } + return m_bytearray; +} +CFX_WideString CBC_HighLevelEncoder::encodeHighLevel(CFX_WideString msg, CFX_WideString ecLevel, FX_INT32 &e) +{ + return encodeHighLevel(msg, ecLevel, FORCE_NONE, NULL, NULL, e); +} +CFX_WideString CBC_HighLevelEncoder::encodeHighLevel(CFX_WideString msg, CFX_WideString ecLevel, SymbolShapeHint shape, CBC_Dimension* minSize, CBC_Dimension* maxSize, FX_INT32 &e) +{ + CBC_EncoderContext context(msg, ecLevel, e); + BC_EXCEPTION_CHECK_ReturnValue(e, (FX_LPWSTR)""); + context.setSymbolShape(shape); + context.setSizeConstraints(minSize, maxSize); + if ((msg.Mid(0, 6) == MACRO_05_HEADER) && (msg.Mid(msg.GetLength() - 1, 1) == MACRO_TRAILER)) { + context.writeCodeword(MACRO_05); + context.setSkipAtEnd(2); + context.m_pos += 6; + } else if ((msg.Mid(0, 6) == MACRO_06_HEADER) && (msg.Mid(msg.GetLength() - 1, 1) == MACRO_TRAILER)) { + context.writeCodeword(MACRO_06); + context.setSkipAtEnd(2); + context.m_pos += 6; + } + CFX_PtrArray encoders; + encoders.Add(FX_NEW CBC_ASCIIEncoder()); + encoders.Add(FX_NEW CBC_C40Encoder()); + encoders.Add(FX_NEW CBC_TextEncoder()); + encoders.Add(FX_NEW CBC_X12Encoder()); + encoders.Add(FX_NEW CBC_EdifactEncoder()); + encoders.Add(FX_NEW CBC_Base256Encoder()); + FX_INT32 encodingMode = ASCII_ENCODATION; + while (context.hasMoreCharacters()) { + ((CBC_Encoder*)encoders.GetAt(encodingMode))->Encode(context, e); + if (e != BCExceptionNO) { + for (FX_INT32 i = 0; i < encoders.GetSize(); i++) { + delete (CBC_Encoder*)encoders.GetAt(i); + } + encoders.RemoveAll(); + return (FX_LPWSTR)""; + } + if (context.m_newEncoding >= 0) { + encodingMode = context.m_newEncoding; + context.resetEncoderSignal(); + } + } + FX_INT32 len = context.m_codewords.GetLength(); + context.updateSymbolInfo(e); + if (e != BCExceptionNO) { + for (FX_INT32 i = 0; i < encoders.GetSize(); i++) { + delete (CBC_Encoder*)encoders.GetAt(i); + } + encoders.RemoveAll(); + return (FX_LPWSTR)""; + } + FX_INT32 capacity = context.m_symbolInfo->m_dataCapacity; + if (len < capacity) { + if (encodingMode != ASCII_ENCODATION && encodingMode != BASE256_ENCODATION) { + context.writeCodeword(0x00fe); + } + } + CFX_WideString codewords = context.m_codewords; + if (codewords.GetLength() < capacity) { + codewords += PAD; + } + while (codewords.GetLength() < capacity) { + codewords += (randomize253State(PAD, codewords.GetLength() + 1)); + } + for (FX_INT32 i = 0; i < encoders.GetSize(); i++) { + delete (CBC_Encoder*)encoders.GetAt(i); + } + encoders.RemoveAll(); + return codewords; +} +FX_INT32 CBC_HighLevelEncoder::lookAheadTest(CFX_WideString msg, FX_INT32 startpos, FX_INT32 currentMode) +{ + if (startpos >= msg.GetLength()) { + return currentMode; + } + CFX_FloatArray charCounts; + if (currentMode == ASCII_ENCODATION) { + charCounts.Add(0); + charCounts.Add(1); + charCounts.Add(1); + charCounts.Add(1); + charCounts.Add(1); + charCounts.Add(1.25f); + } else { + charCounts.Add(1); + charCounts.Add(2); + charCounts.Add(2); + charCounts.Add(2); + charCounts.Add(2); + charCounts.Add(2.25f); + charCounts[currentMode] = 0; + } + FX_INT32 charsProcessed = 0; + while (TRUE) { + if ((startpos + charsProcessed) == msg.GetLength()) { + FX_DWORD min = Integer_MAX_VALUE; + CFX_ByteArray mins; + mins.SetSize(6); + CFX_Int32Array intCharCounts; + intCharCounts.SetSize(6); + min = findMinimums(charCounts, intCharCounts, min, mins); + FX_INT32 minCount = getMinimumCount(mins); + if (intCharCounts[ASCII_ENCODATION] == min) { + return ASCII_ENCODATION; + } + if (minCount == 1 && mins[BASE256_ENCODATION] > 0) { + return BASE256_ENCODATION; + } + if (minCount == 1 && mins[EDIFACT_ENCODATION] > 0) { + return EDIFACT_ENCODATION; + } + if (minCount == 1 && mins[TEXT_ENCODATION] > 0) { + return TEXT_ENCODATION; + } + if (minCount == 1 && mins[X12_ENCODATION] > 0) { + return X12_ENCODATION; + } + return C40_ENCODATION; + } + FX_WCHAR c = msg.GetAt(startpos + charsProcessed); + charsProcessed++; + if (isDigit(c)) { + charCounts[ASCII_ENCODATION] += 0.5; + } else if (isExtendedASCII(c)) { + charCounts[ASCII_ENCODATION] = (FX_FLOAT) ceil(charCounts[ASCII_ENCODATION]); + charCounts[ASCII_ENCODATION] += 2; + } else { + charCounts[ASCII_ENCODATION] = (FX_FLOAT) ceil(charCounts[ASCII_ENCODATION]); + charCounts[ASCII_ENCODATION]++; + } + if (isNativeC40(c)) { + charCounts[C40_ENCODATION] += 2.0f / 3.0f; + } else if (isExtendedASCII(c)) { + charCounts[C40_ENCODATION] += 8.0f / 3.0f; + } else { + charCounts[C40_ENCODATION] += 4.0f / 3.0f; + } + if (isNativeText(c)) { + charCounts[TEXT_ENCODATION] += 2.0f / 3.0f; + } else if (isExtendedASCII(c)) { + charCounts[TEXT_ENCODATION] += 8.0f / 3.0f; + } else { + charCounts[TEXT_ENCODATION] += 4.0f / 3.0f; + } + if (isNativeX12(c)) { + charCounts[X12_ENCODATION] += 2.0f / 3.0f; + } else if (isExtendedASCII(c)) { + charCounts[X12_ENCODATION] += 13.0f / 3.0f; + } else { + charCounts[X12_ENCODATION] += 10.0f / 3.0f; + } + if (isNativeEDIFACT(c)) { + charCounts[EDIFACT_ENCODATION] += 3.0f / 4.0f; + } else if (isExtendedASCII(c)) { + charCounts[EDIFACT_ENCODATION] += 17.0f / 4.0f; + } else { + charCounts[EDIFACT_ENCODATION] += 13.0f / 4.0f; + } + if (isSpecialB256(c)) { + charCounts[BASE256_ENCODATION] += 4; + } else { + charCounts[BASE256_ENCODATION]++; + } + if (charsProcessed >= 4) { + CFX_Int32Array intCharCounts; + intCharCounts.SetSize(6); + CFX_ByteArray mins; + mins.SetSize(6); + findMinimums(charCounts, intCharCounts, Integer_MAX_VALUE, mins); + FX_INT32 minCount = getMinimumCount(mins); + if (intCharCounts[ASCII_ENCODATION] < intCharCounts[BASE256_ENCODATION] + && intCharCounts[ASCII_ENCODATION] < intCharCounts[C40_ENCODATION] + && intCharCounts[ASCII_ENCODATION] < intCharCounts[TEXT_ENCODATION] + && intCharCounts[ASCII_ENCODATION] < intCharCounts[X12_ENCODATION] + && intCharCounts[ASCII_ENCODATION] < intCharCounts[EDIFACT_ENCODATION]) { + return ASCII_ENCODATION; + } + if (intCharCounts[BASE256_ENCODATION] < intCharCounts[ASCII_ENCODATION] + || (mins[C40_ENCODATION] + mins[TEXT_ENCODATION] + mins[X12_ENCODATION] + mins[EDIFACT_ENCODATION]) == 0) { + return BASE256_ENCODATION; + } + if (minCount == 1 && mins[EDIFACT_ENCODATION] > 0) { + return EDIFACT_ENCODATION; + } + if (minCount == 1 && mins[TEXT_ENCODATION] > 0) { + return TEXT_ENCODATION; + } + if (minCount == 1 && mins[X12_ENCODATION] > 0) { + return X12_ENCODATION; + } + if (intCharCounts[C40_ENCODATION] + 1 < intCharCounts[ASCII_ENCODATION] + && intCharCounts[C40_ENCODATION] + 1 < intCharCounts[BASE256_ENCODATION] + && intCharCounts[C40_ENCODATION] + 1 < intCharCounts[EDIFACT_ENCODATION] + && intCharCounts[C40_ENCODATION] + 1 < intCharCounts[TEXT_ENCODATION]) { + if (intCharCounts[C40_ENCODATION] < intCharCounts[X12_ENCODATION]) { + return C40_ENCODATION; + } + if (intCharCounts[C40_ENCODATION] == intCharCounts[X12_ENCODATION]) { + FX_INT32 p = startpos + charsProcessed + 1; + while (p < msg.GetLength()) { + FX_WCHAR tc = msg.GetAt(p); + if (isX12TermSep(tc)) { + return X12_ENCODATION; + } + if (!isNativeX12(tc)) { + break; + } + p++; + } + return C40_ENCODATION; + } + } + } + } +} +FX_BOOL CBC_HighLevelEncoder::isDigit(FX_WCHAR ch) +{ + return ch >= '0' && ch <= '9'; +} +FX_BOOL CBC_HighLevelEncoder::isExtendedASCII(FX_WCHAR ch) +{ + return ch >= 128 && ch <= 255; +} +FX_INT32 CBC_HighLevelEncoder::determineConsecutiveDigitCount(CFX_WideString msg, FX_INT32 startpos) +{ + FX_INT32 count = 0; + FX_INT32 len = msg.GetLength(); + FX_INT32 idx = startpos; + if (idx < len) { + FX_WCHAR ch = msg.GetAt(idx); + while (isDigit(ch) && idx < len) { + count++; + idx++; + if (idx < len) { + ch = msg.GetAt(idx); + } + } + } + return count; +} +void CBC_HighLevelEncoder::illegalCharacter(FX_WCHAR c, FX_INT32 &e) +{ + e = BCExceptionIllegalArgument; +} +FX_WCHAR CBC_HighLevelEncoder::randomize253State(FX_WCHAR ch, FX_INT32 codewordPosition) +{ + FX_INT32 pseudoRandom = ((149 * codewordPosition) % 253) + 1; + FX_INT32 tempVariable = ch + pseudoRandom; + return tempVariable <= 254 ? (FX_WCHAR) tempVariable : (FX_WCHAR) (tempVariable - 254); +} +FX_INT32 CBC_HighLevelEncoder::findMinimums(CFX_FloatArray &charCounts, CFX_Int32Array &intCharCounts, FX_INT32 min, CFX_ByteArray &mins) +{ + for (FX_INT32 l = 0; l < mins.GetSize(); l++) { + mins[l] = (FX_BYTE)0; + } + for (FX_INT32 i = 0; i < 6; i++) { + intCharCounts[i] = (FX_INT32)ceil(charCounts[i]); + FX_INT32 current = intCharCounts[i]; + if (min > current) { + min = current; + for (FX_INT32 j = 0; j < mins.GetSize(); j++) { + mins[j] = (FX_BYTE)0; + } + } + if (min == current) { + mins[i]++; + } + } + return min; +} +FX_INT32 CBC_HighLevelEncoder::getMinimumCount(CFX_ByteArray &mins) +{ + FX_INT32 minCount = 0; + for (FX_INT32 i = 0; i < 6; i++) { + minCount += mins[i]; + } + return minCount; +} +FX_BOOL CBC_HighLevelEncoder::isNativeC40(FX_WCHAR ch) +{ + return (ch == ' ') || (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z'); +} +FX_BOOL CBC_HighLevelEncoder::isNativeText(FX_WCHAR ch) +{ + return (ch == ' ') || (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z'); +} +FX_BOOL CBC_HighLevelEncoder::isNativeX12(FX_WCHAR ch) +{ + return isX12TermSep(ch) || (ch == ' ') || (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z'); +} +FX_BOOL CBC_HighLevelEncoder::isX12TermSep(FX_WCHAR ch) +{ + return (ch == '\r') || (ch == '*') || (ch == '>'); +} +FX_BOOL CBC_HighLevelEncoder::isNativeEDIFACT(FX_WCHAR ch) +{ + return ch >= ' ' && ch <= '^'; +} +FX_BOOL CBC_HighLevelEncoder::isSpecialB256(FX_WCHAR ch) +{ + return FALSE; +} diff --git a/xfa/src/fxbarcode/src/BC_Library.cpp b/xfa/src/fxbarcode/src/BC_Library.cpp new file mode 100644 index 0000000000..5b12609517 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_Library.cpp @@ -0,0 +1,122 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_Reader.h" +#include "include/BC_OneDReader.h" +#include "include/BC_UtilCodingConvert.h" +#include "include/BC_DataMatrixVersion.h" +#include "include/BC_BinaryBitmap.h" +#include "include/BC_LuminanceSource.h" +#include "include/BC_BufferedImageLuminanceSource.h" +#include "include/BC_Binarizer.h" +#include "include/BC_GlobalHistogramBinarizer.h" +#include "include/BC_OnedCode128Reader.h" +#include "include/BC_OnedCode39Reader.h" +#include "include/BC_OneDimReader.h" +#include "include/BC_OnedEAN13Reader.h" +#include "include/BC_OnedEAN8Reader.h" +#include "include/BC_OnedUPCAReader.h" +#include "include/BC_OnedCodaBarReader.h" +#include "include/BC_DataMatrixReader.h" +#include "include/BC_QRCodeReader.h" +#include "include/BC_Writer.h" +#include "include/BC_OneDimWriter.h" +#include "include/BC_OnedCode128Writer.h" +#include "include/BC_OnedCode39Writer.h" +#include "include/BC_OnedEAN13Writer.h" +#include "include/BC_OnedEAN8Writer.h" +#include "include/BC_OnedUPCAWriter.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_QRCodeWriter.h" +#include "include/BC_QRCoderErrorCorrectionLevel.h" +#include "include/BC_QRCoderMode.h" +#include "include/BC_QRCoderVersion.h" +#include "include/BC_QRDataMask.h" +#include "include/BC_QRDecodedBitStreamParser.h" +#include "include/BC_ReedSolomonGF256.h" +#include "include/BC_Encoder.h" +#include "include/BC_DefaultPlacement.h" +#include "include/BC_SymbolShapeHint.h" +#include "include/BC_SymbolInfo.h" +#include "include/BC_DataMatrixSymbolInfo144.h" +#include "include/BC_ErrorCorrection.h" +#include "include/BC_Dimension.h" +#include "include/BC_EncoderContext.h" +#include "include/BC_C40Encoder.h" +#include "include/BC_TextEncoder.h" +#include "include/BC_X12Encoder.h" +#include "include/BC_EdifactEncoder.h" +#include "include/BC_Base256Encoder.h" +#include "include/BC_ASCIIEncoder.h" +#include "include/BC_HighLevelEncoder.h" +#include "include/BC_CommonByteMatrix.h" +#include "include/BC_DataMatrixWriter.h" +#include "include/BC_PDF417Compaction.h" +#include "include/BC_UtilCodingConvert.h" +#include "include/BC_PDF417HighLevelEncoder.h" +#include "include/BC_ResultPoint.h" +#include "include/BC_PDF417DetectorResult.h" +#include "include/BC_BinaryBitmap.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_CommonBitArray.h" +#include "include/BC_PDF417Detector.h" +#include "include/BC_PDF417DetectorResult.h" +#include "include/BC_DecoderResult.h" +#include "include/BC_PDF417Codeword.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_PDF417Common.h" +#include "include/BC_PDF417BarcodeValue.h" +#include "include/BC_PDF417BarcodeMetadata.h" +#include "include/BC_PDF417BoundingBox.h" +#include "include/BC_PDF417DetectionResultColumn.h" +#include "include/BC_PDF417DetectionResultRowIndicatorColumn.h" +#include "include/BC_PDF417DetectionResult.h" +#include "include/BC_PDF417DecodedBitStreamParser.h" +#include "include/BC_PDF417CodewordDecoder.h" +#include "include/BC_PDF417DecodedBitStreamParser.h" +#include "include/BC_PDF417ECModulusPoly.h" +#include "include/BC_PDF417ECModulusGF.h" +#include "include/BC_PDF417ECErrorCorrection.h" +#include "include/BC_PDF417DecodedBitStreamParser.h" +#include "include/BC_CommonDecoderResult.h" +#include "include/BC_PDF417ScanningDecoder.h" +#include "include/BC_PDF417Reader.h" +void BC_Library_Init() +{ + CBC_QRCoderErrorCorrectionLevel::Initialize(); + CBC_QRCoderMode::Initialize(); + CBC_QRCoderVersion::Initialize(); + CBC_QRDataMask::Initialize(); + CBC_ReedSolomonGF256::Initialize(); + CBC_DataMatrixVersion::Initialize(); + CBC_SymbolInfo::Initialize(); + CBC_ErrorCorrection::Initialize(); + CBC_PDF417HighLevelEncoder::Initialize(); + FX_INT32 e = 0; + CBC_PDF417ECModulusGF::Initialize(e); + CBC_DecodedBitStreamPaser::Initialize(); + CBC_PDF417CodewordDecoder::Initialize(); + CBC_PDF417ECErrorCorrection::Initialize(e); + CBC_PDF417ScanningDecoder::Initialize(); +} +void BC_Library_Destory() +{ + CBC_QRCoderErrorCorrectionLevel::Finalize(); + CBC_QRCoderMode::Finalize(); + CBC_QRCoderVersion::Finalize(); + CBC_QRDataMask::Finalize(); + CBC_ReedSolomonGF256::Finalize(); + CBC_DataMatrixVersion::Finalize(); + CBC_SymbolInfo::Finalize(); + CBC_ErrorCorrection::Finalize(); + CBC_PDF417HighLevelEncoder::Finalize(); + CBC_DecodedBitStreamPaser::Finalize(); + CBC_PDF417CodewordDecoder::Finalize(); + CBC_PDF417ECErrorCorrection::Finalize(); + CBC_PDF417ECModulusGF::Finalize(); + CBC_PDF417ScanningDecoder::Finalize(); +} diff --git a/xfa/src/fxbarcode/src/BC_LuminanceSource.cpp b/xfa/src/fxbarcode/src/BC_LuminanceSource.cpp new file mode 100644 index 0000000000..ba61c93cfb --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_LuminanceSource.cpp @@ -0,0 +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 + +#include "barcode.h" +#include "include/BC_LuminanceSource.h" +CBC_LuminanceSource::CBC_LuminanceSource(FX_INT32 width, FX_INT32 height): m_width(width), m_height(height) +{ +} +CBC_LuminanceSource::~CBC_LuminanceSource() +{ +} +FX_INT32 CBC_LuminanceSource::GetWidth() +{ + return m_width; +} +FX_INT32 CBC_LuminanceSource::GetHeight() +{ + return m_height; +} diff --git a/xfa/src/fxbarcode/src/BC_OneDReader.cpp b/xfa/src/fxbarcode/src/BC_OneDReader.cpp new file mode 100644 index 0000000000..b49d0fd0bc --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_OneDReader.cpp @@ -0,0 +1,163 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_Reader.h" +#include "include/BC_OneDReader.h" +#include "include/BC_BinaryBitmap.h" +#include "include/BC_CommonBitArray.h" +const FX_INT32 CBC_OneDReader::INTEGER_MATH_SHIFT = 8; +const FX_INT32 CBC_OneDReader::PATTERN_MATCH_RESULT_SCALE_FACTOR = 1 << 8; +CBC_OneDReader::CBC_OneDReader() +{ +} +CBC_OneDReader::~CBC_OneDReader() +{ +} +CFX_ByteString CBC_OneDReader::Decode(CBC_BinaryBitmap *image, FX_INT32 &e) +{ + CFX_ByteString strtemp = Decode(image, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + return strtemp; +} +CFX_ByteString CBC_OneDReader::Decode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e) +{ + CFX_ByteString strtemp = DeDecode(image, hints, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + return strtemp; +} +CFX_ByteString CBC_OneDReader::DeDecode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e) +{ + FX_INT32 width = image->GetWidth(); + FX_INT32 height = image->GetHeight(); + CBC_CommonBitArray *row = NULL; + FX_INT32 middle = height >> 1; + FX_BOOL tryHarder = FALSE; + FX_INT32 rowStep = FX_MAX(1, height >> (tryHarder ? 8 : 5)); + FX_INT32 maxLines; + if (tryHarder) { + maxLines = height; + } else { + maxLines = 15; + } + for (FX_INT32 x = 0; x < maxLines; x++) { + FX_INT32 rowStepsAboveOrBelow = (x + 1) >> 1; + FX_BOOL isAbove = (x & 0x01) == 0; + FX_INT32 rowNumber = middle + rowStep * (isAbove ? rowStepsAboveOrBelow : -rowStepsAboveOrBelow); + if (rowNumber < 0 || rowNumber >= height) { + break; + } + row = image->GetBlackRow(rowNumber, NULL, e); + if (e != BCExceptionNO) { + e = BCExceptionNO; + if(row != NULL) { + delete row; + row = NULL; + } + continue; + } + for (FX_INT32 attempt = 0; attempt < 2; attempt++) { + if (attempt == 1) { + row->Reverse(); + } + CFX_ByteString result = DecodeRow(rowNumber, row, hints, e); + if (e != BCExceptionNO) { + e = BCExceptionNO; + continue; + } + if(row != NULL) { + delete row; + row = NULL; + } + return result; + } + if(row != NULL) { + delete row; + row = NULL; + } + } + e = BCExceptionNotFound; + return ""; +} +void CBC_OneDReader::RecordPattern(CBC_CommonBitArray *row, FX_INT32 start, CFX_Int32Array *counters, FX_INT32 &e) +{ + FX_INT32 numCounters = counters->GetSize(); + for (FX_INT32 i = 0; i < numCounters; i++) { + (*counters)[i] = 0; + } + FX_INT32 end = row->GetSize(); + if (start >= end) { + e = BCExceptionNotFound; + return; + } + FX_BOOL isWhite = !row->Get(start); + FX_INT32 counterPosition = 0; + FX_INT32 j = start; + while (j < end) { + FX_BOOL pixel = row->Get(j); + if (pixel ^ isWhite) { + (*counters)[counterPosition]++; + } else { + counterPosition++; + if (counterPosition == numCounters) { + break; + } else { + (*counters)[counterPosition] = 1; + isWhite = !isWhite; + } + } + j++; + } + if (!(counterPosition == numCounters || (counterPosition == numCounters - 1 && j == end))) { + e = BCExceptionNotFound; + return; + } +} +void CBC_OneDReader::RecordPatternInReverse(CBC_CommonBitArray *row, FX_INT32 start, CFX_Int32Array *counters, FX_INT32 &e) +{ + FX_INT32 numTransitionsLeft = counters->GetSize(); + FX_BOOL last = row->Get(start); + while (start > 0 && numTransitionsLeft >= 0) { + if (row->Get(--start) != last) { + numTransitionsLeft--; + last = !last; + } + } + if (numTransitionsLeft >= 0) { + e = BCExceptionNotFound; + return; + } + RecordPattern(row, start + 1, counters, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); +} +FX_INT32 CBC_OneDReader::PatternMatchVariance(CFX_Int32Array *counters, const FX_INT32 *pattern, FX_INT32 maxIndividualVariance) +{ + FX_INT32 numCounters = counters->GetSize(); + FX_INT32 total = 0; + FX_INT32 patternLength = 0; + for (FX_INT32 i = 0; i < numCounters; i++) { + total += (*counters)[i]; + patternLength += pattern[i]; + } + if (total < patternLength) { +#undef max + return FXSYS_IntMax; + } + FX_INT32 unitBarWidth = (total << INTEGER_MATH_SHIFT) / patternLength; + maxIndividualVariance = (maxIndividualVariance * unitBarWidth) >> INTEGER_MATH_SHIFT; + FX_INT32 totalVariance = 0; + for (FX_INT32 x = 0; x < numCounters; x++) { + FX_INT32 counter = (*counters)[x] << INTEGER_MATH_SHIFT; + FX_INT32 scaledPattern = pattern[x] * unitBarWidth; + FX_INT32 variance = counter > scaledPattern ? counter - scaledPattern : scaledPattern - counter; + if (variance > maxIndividualVariance) { +#undef max + return FXSYS_IntMax; + } + totalVariance += variance; + } + return totalVariance / total; +} diff --git a/xfa/src/fxbarcode/src/BC_OneDimReader.cpp b/xfa/src/fxbarcode/src/BC_OneDimReader.cpp new file mode 100644 index 0000000000..3e440d9036 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_OneDimReader.cpp @@ -0,0 +1,219 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_Reader.h" +#include "include/BC_OneDReader.h" +#include "include/BC_CommonBitArray.h" +#include "include/BC_OneDimReader.h" +const FX_INT32 CBC_OneDimReader::MAX_AVG_VARIANCE = (FX_INT32)(256 * 0.48f); +const FX_INT32 CBC_OneDimReader::MAX_INDIVIDUAL_VARIANCE = (FX_INT32)(256 * 0.7f); +const FX_INT32 CBC_OneDimReader::START_END_PATTERN[3] = {1, 1, 1}; +const FX_INT32 CBC_OneDimReader::MIDDLE_PATTERN[5] = {1, 1, 1, 1, 1}; +const FX_INT32 CBC_OneDimReader::L_PATTERNS[10][4] = { + {3, 2, 1, 1}, + {2, 2, 2, 1}, + {2, 1, 2, 2}, + {1, 4, 1, 1}, + {1, 1, 3, 2}, + {1, 2, 3, 1}, + {1, 1, 1, 4}, + {1, 3, 1, 2}, + {1, 2, 1, 3}, + {3, 1, 1, 2} +}; +const FX_INT32 CBC_OneDimReader::L_AND_G_PATTERNS[20][4] = { + {3, 2, 1, 1}, + {2, 2, 2, 1}, + {2, 1, 2, 2}, + {1, 4, 1, 1}, + {1, 1, 3, 2}, + {1, 2, 3, 1}, + {1, 1, 1, 4}, + {1, 3, 1, 2}, + {1, 2, 1, 3}, + {3, 1, 1, 2}, + {1, 1, 2, 3}, + {1, 2, 2, 2}, + {2, 2, 1, 2}, + {1, 1, 4, 1}, + {2, 3, 1, 1}, + {1, 3, 2, 1}, + {4, 1, 1, 1}, + {2, 1, 3, 1}, + {3, 1, 2, 1}, + {2, 1, 1, 3} +}; +CBC_OneDimReader::CBC_OneDimReader() +{ +} +CBC_OneDimReader::~CBC_OneDimReader() +{ +} +CFX_Int32Array *CBC_OneDimReader::FindStartGuardPattern(CBC_CommonBitArray *row, FX_INT32 &e) +{ + FX_BOOL foundStart = FALSE; + CFX_Int32Array *startRange = NULL; + CFX_Int32Array startEndPattern; + startEndPattern.SetSize(3); + startEndPattern[0] = START_END_PATTERN[0]; + startEndPattern[1] = START_END_PATTERN[1]; + startEndPattern[2] = START_END_PATTERN[2]; + FX_INT32 nextStart = 0; + while (!foundStart) { + if(startRange != NULL) { + delete startRange; + startRange = NULL; + } + startRange = FindGuardPattern(row, nextStart, FALSE, &startEndPattern, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + FX_INT32 start = (*startRange)[0]; + nextStart = (*startRange)[1]; + if (start <= 1) { + break; + } + FX_INT32 quietStart = start - (nextStart - start); + if (quietStart >= 0) { + FX_BOOL booT = row->IsRange(quietStart, start, FALSE, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + foundStart = booT; + } + } + return startRange; +} +CFX_ByteString CBC_OneDimReader::DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e) +{ + CFX_Int32Array* StartPattern = FindStartGuardPattern(row, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + CBC_AutoPtr result(StartPattern); + CFX_ByteString temp = DecodeRow(rowNumber, row, result.get(), hints, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + return temp; +} +CFX_ByteString CBC_OneDimReader::DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, CFX_Int32Array *startGuardRange, FX_INT32 hints, FX_INT32 &e) +{ + CFX_ByteString result; + FX_INT32 endStart = DecodeMiddle(row, startGuardRange, result, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + FX_BOOL b = CheckChecksum(result, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + if (!b) { + e = BCExceptionChecksumException; + return ""; + } + return result; +} +FX_BOOL CBC_OneDimReader::CheckChecksum(CFX_ByteString &s, FX_INT32 &e) +{ + FX_BOOL temp = CheckStandardUPCEANChecksum(s, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return temp; +} +FX_BOOL CBC_OneDimReader::CheckStandardUPCEANChecksum(CFX_ByteString &s, FX_INT32 &e) +{ + FX_INT32 length = s.GetLength(); + if (length == 0) { + return FALSE; + } + FX_INT32 sum = 0; + for (FX_INT32 i = length - 2; i >= 0; i -= 2) { + FX_INT32 digit = (FX_INT32) s[i] - (FX_INT32) '0'; + if (digit < 0 || digit > 9) { + e = BCExceptionFormatException; + return FALSE; + } + sum += digit; + } + sum *= 3; + for (FX_INT32 j = length - 1; j >= 0; j -= 2) { + FX_INT32 digit = (FX_INT32) s[j] - (FX_INT32) '0'; + if (digit < 0 || digit > 9) { + e = BCExceptionFormatException; + return FALSE; + } + sum += digit; + } + return sum % 10 == 0; +} +CFX_Int32Array *CBC_OneDimReader::DecodeEnd(CBC_CommonBitArray* row, FX_INT32 endStart, FX_INT32 &e) +{ + CFX_Int32Array startEndPattern; + startEndPattern.Add(START_END_PATTERN[0]); + startEndPattern.Add(START_END_PATTERN[1]); + startEndPattern.Add(START_END_PATTERN[2]); + CFX_Int32Array* FindGuard = FindGuardPattern(row, endStart, FALSE, &startEndPattern, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return FindGuard; +} +CFX_Int32Array *CBC_OneDimReader::FindGuardPattern(CBC_CommonBitArray *row, FX_INT32 rowOffset, FX_BOOL whiteFirst, CFX_Int32Array *pattern, FX_INT32 &e) +{ + FX_INT32 patternLength = pattern->GetSize(); + CFX_Int32Array counters; + counters.SetSize(patternLength); + FX_INT32 width = row->GetSize(); + FX_BOOL isWhite = FALSE; + while (rowOffset < width) { + isWhite = !row->Get(rowOffset); + if (whiteFirst == isWhite) { + break; + } + rowOffset++; + } + FX_INT32 counterPosition = 0; + FX_INT32 patternStart = rowOffset; + for (FX_INT32 x = rowOffset; x < width; x++) { + FX_BOOL pixel = row->Get(x); + if (pixel ^ isWhite) { + counters[counterPosition]++; + } else { + if (counterPosition == patternLength - 1) { + if (PatternMatchVariance(&counters, &(*pattern)[0], MAX_INDIVIDUAL_VARIANCE) < MAX_AVG_VARIANCE) { + CFX_Int32Array *result = FX_NEW CFX_Int32Array(); + result->SetSize(2); + (*result)[0] = patternStart; + (*result)[1] = x; + return result; + } + patternStart += counters[0] + counters[1]; + for (FX_INT32 y = 2; y < patternLength; y++) { + counters[y - 2] = counters[y]; + } + counters[patternLength - 2] = 0; + counters[patternLength - 1] = 0; + counterPosition--; + } else { + counterPosition++; + } + counters[counterPosition] = 1; + isWhite = !isWhite; + } + } + e = BCExceptionNotFound; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return NULL; +} +FX_INT32 CBC_OneDimReader::DecodeDigit(CBC_CommonBitArray *row, CFX_Int32Array *counters, FX_INT32 rowOffset, const FX_INT32* patterns, FX_INT32 patternLength, FX_INT32 &e) +{ + RecordPattern(row, rowOffset, counters, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + FX_INT32 bestVariance = MAX_AVG_VARIANCE; + FX_INT32 bestMatch = -1; + FX_INT32 max = patternLength; + for (FX_INT32 i = 0; i < max; i++) { + FX_INT32 variance = PatternMatchVariance(counters, &patterns[i * 4], MAX_INDIVIDUAL_VARIANCE); + if (variance < bestVariance) { + bestVariance = variance; + bestMatch = i; + } + } + if (bestMatch >= 0) { + return bestMatch; + } else { + e = BCExceptionNotFound; + return 0; + } + return 0; +} diff --git a/xfa/src/fxbarcode/src/BC_OneDimWriter.cpp b/xfa/src/fxbarcode/src/BC_OneDimWriter.cpp new file mode 100644 index 0000000000..e60eb61aa0 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_OneDimWriter.cpp @@ -0,0 +1,399 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_Writer.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_OneDimWriter.h" +CBC_OneDimWriter::CBC_OneDimWriter() +{ + m_locTextLoc = BC_TEXT_LOC_BELOWEMBED; + m_bPrintChecksum = TRUE; + m_iDataLenth = 0; + m_bCalcChecksum = FALSE; + m_pFont = NULL; + m_fFontSize = 10; ; + m_iFontStyle = 0; + m_fontColor = 0xff000000; + m_iContentLen = 0; + m_bLeftPadding = FALSE; + m_bRightPadding = FALSE; + m_output = NULL; +} +CBC_OneDimWriter::~CBC_OneDimWriter() +{ + if (m_output != NULL) { + delete m_output; + m_output = NULL; + } +} +void CBC_OneDimWriter::SetPrintChecksum(FX_BOOL checksum) +{ + m_bPrintChecksum = checksum; +} +void CBC_OneDimWriter::SetDataLength(FX_INT32 length) +{ + m_iDataLenth = length; +} +void CBC_OneDimWriter::SetCalcChecksum(FX_INT32 state) +{ + m_bCalcChecksum = state; +} +FX_BOOL CBC_OneDimWriter::SetFont(CFX_Font * cFont) +{ + if (cFont == NULL) { + return FALSE; + } + m_pFont = cFont; + return TRUE; +} +void CBC_OneDimWriter::SetFontSize(FX_FLOAT size) +{ + m_fFontSize = size; +} +void CBC_OneDimWriter::SetFontStyle(FX_INT32 style) +{ + m_iFontStyle = style; +} +void CBC_OneDimWriter::SetFontColor(FX_ARGB color) +{ + m_fontColor = color; +} +FX_WCHAR CBC_OneDimWriter::Upper(FX_WCHAR ch) +{ + if(ch >= 'a' && ch <= 'z') { + ch = ch - ('a' - 'A'); + } + return ch; +} +FX_BYTE* CBC_OneDimWriter::Encode(const CFX_ByteString &contents, BCFORMAT format, + FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) +{ + FX_BYTE *ret = NULL; + outHeight = 1; + if (m_Width >= 20) { + ret = Encode(contents, outWidth, e); + } else { + ret = Encode(contents, outWidth, e); + } + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return ret; +} +FX_BYTE *CBC_OneDimWriter::Encode(const CFX_ByteString &contents, BCFORMAT format, + FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) +{ + FX_BYTE *ret = Encode(contents, format, outWidth, outHeight, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return ret; +} +FX_INT32 CBC_OneDimWriter::AppendPattern(FX_BYTE* target, FX_INT32 pos, const FX_INT32* pattern , FX_INT32 patternLength, FX_INT32 startColor, FX_INT32 &e) +{ + if (startColor != 0 && startColor != 1) { + e = BCExceptionValueMustBeEither0or1; + return 0; + } + FX_BYTE color = (FX_BYTE) startColor; + FX_INT32 numAdded = 0; + for (FX_INT32 i = 0; i < patternLength; i++) { + for (FX_INT32 j = 0; j < pattern[i]; j++) { + target[pos] = color; + pos += 1; + numAdded += 1; + } + color ^= 1; + } + return numAdded; +} +void CBC_OneDimWriter::CalcTextInfo(const CFX_ByteString &text, FXTEXT_CHARPOS *charPos, CFX_Font *cFont, FX_FLOAT geWidth, FX_INT32 fontSize, FX_FLOAT &charsLen) +{ +#ifdef FXFM_ENCODING_NONE + IFX_FontEncodingEx* encoding = FX_CreateFontEncodingEx(cFont); +#else + IFX_FontEncoding * encoding = FXGE_CreateUnicodeEncoding(cFont); +#endif + FX_INT32 length = text.GetLength(); + FX_DWORD *pCharCode = FX_Alloc(FX_DWORD, text.GetLength()); + FX_FLOAT charWidth = 0; + for (FX_INT32 j = 0; j < text.GetLength(); j++) { + pCharCode[j] = encoding->CharCodeFromUnicode(text[j]); + FX_INT32 glyp_code = encoding->GlyphFromCharCode(pCharCode[j]); + FX_INT32 glyp_value = cFont->GetGlyphWidth(glyp_code); + FX_FLOAT temp = (FX_FLOAT)((glyp_value) * fontSize / 1000.0); + charWidth += temp; + } + charsLen = charWidth; + FX_FLOAT leftPositon = (FX_FLOAT)(geWidth - charsLen) / 2.0f; + if (leftPositon < 0 && geWidth == 0) { + leftPositon = 0; + } + FX_FLOAT penX = 0.0; + FX_FLOAT penY = (FX_FLOAT)FXSYS_abs(cFont->GetDescent()) * (FX_FLOAT)fontSize / 1000.0f; + FX_FLOAT left = leftPositon; + FX_FLOAT top = 0.0; + charPos[0].m_OriginX = penX + left; + charPos[0].m_OriginY = penY + top; + charPos[0].m_GlyphIndex = encoding->GlyphFromCharCode(pCharCode[0]); + charPos[0].m_FontCharWidth = cFont->GetGlyphWidth(charPos[0].m_GlyphIndex); +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + charPos[0].m_ExtGID = charPos[0].m_GlyphIndex; +#endif + penX += (FX_FLOAT)(charPos[0].m_FontCharWidth) * (FX_FLOAT)fontSize / 1000.0f; + for (FX_INT32 i = 1; i < length; i++) { + charPos[i].m_OriginX = penX + left; + charPos[i].m_OriginY = penY + top; + charPos[i].m_GlyphIndex = encoding->GlyphFromCharCode(pCharCode[i]); + charPos[i].m_FontCharWidth = cFont->GetGlyphWidth(charPos[i].m_GlyphIndex); +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + charPos[i].m_ExtGID = charPos[i].m_GlyphIndex; +#endif + penX += (FX_FLOAT)(charPos[i].m_FontCharWidth) * (FX_FLOAT)fontSize / 1000.0f; + } + FX_Free (pCharCode); + delete encoding; + encoding = NULL; +} +void CBC_OneDimWriter::ShowDeviceChars(CFX_RenderDevice *device, const CFX_Matrix* matrix, const CFX_ByteString str, FX_FLOAT geWidth, FXTEXT_CHARPOS* pCharPos, FX_FLOAT locX, FX_FLOAT locY, FX_INT32 barWidth) +{ + FX_INT32 iFontSize = (FX_INT32)fabs(m_fFontSize); + FX_INT32 iTextHeight = iFontSize + 1; + CFX_FloatRect rect((FX_FLOAT)locX, (FX_FLOAT)locY, (FX_FLOAT)(locX + geWidth), (FX_FLOAT)(locY + iTextHeight)); + if (geWidth != m_Width) { + rect.right -= 1; + } + matrix->TransformRect(rect); + FX_RECT re = rect.GetOutterRect(); + device->FillRect(&re, m_backgroundColor); + CFX_Matrix affine_matrix(1.0, 0.0, 0.0, -1.0, (FX_FLOAT)locX, (FX_FLOAT)(locY + iFontSize)); + if (matrix != NULL) { + affine_matrix.Concat(*matrix); + } + FX_BOOL ret = device->DrawNormalText(str.GetLength(), + pCharPos, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize, + (CFX_AffineMatrix *) &affine_matrix, + m_fontColor, FXTEXT_CLEARTYPE); +} +void CBC_OneDimWriter::ShowBitmapChars(CFX_DIBitmap *pOutBitmap, const CFX_ByteString str, FX_FLOAT geWidth, FXTEXT_CHARPOS* pCharPos, FX_FLOAT locX, FX_FLOAT locY, FX_INT32 barWidth) +{ + FX_INT32 iFontSize = (FX_INT32)fabs(m_fFontSize); + FX_INT32 iTextHeight = iFontSize + 1; + CFX_FxgeDevice ge; + ge.Create((int)geWidth, iTextHeight , m_colorSpace); + FX_RECT geRect(0, 0, (int)geWidth, iTextHeight); + ge.FillRect(&geRect, m_backgroundColor); + CFX_AffineMatrix affine_matrix(1.0, 0.0, 0.0, -1.0, 0.0, (FX_FLOAT)iFontSize); + FX_BOOL ret = ge.DrawNormalText(str.GetLength(), + pCharPos, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize, + (CFX_AffineMatrix *) &affine_matrix, + m_fontColor, FXTEXT_CLEARTYPE); + CFX_FxgeDevice geBitmap; + geBitmap.Attach(pOutBitmap); + geBitmap.SetDIBits(ge.GetBitmap(), (int)locX, (int)locY); +} +void CBC_OneDimWriter::ShowChars(FX_WSTR contents, CFX_DIBitmap *pOutBitmap, CFX_RenderDevice *device, const CFX_Matrix* matrix, FX_INT32 barWidth, FX_INT32 multiple, FX_INT32 &e) +{ + if (device == NULL && pOutBitmap == NULL) { + e = BCExceptionIllegalArgument; + return; + } + if (m_pFont == NULL) { + e = BCExceptionNullPointer; + return; + } + CFX_ByteString str = FX_UTF8Encode(contents); + FX_INT32 iLen = str.GetLength(); + FXTEXT_CHARPOS* pCharPos = FX_Alloc(FXTEXT_CHARPOS, iLen); + if (!pCharPos) { + return; + } + FXSYS_memset32(pCharPos, 0, sizeof(FXTEXT_CHARPOS) * iLen); + FX_FLOAT charsLen = 0; + FX_FLOAT geWidth = 0; + if ( m_locTextLoc == BC_TEXT_LOC_ABOVEEMBED || + m_locTextLoc == BC_TEXT_LOC_BELOWEMBED ) { + geWidth = 0; + } else if ( m_locTextLoc == BC_TEXT_LOC_ABOVE || + m_locTextLoc == BC_TEXT_LOC_BELOW ) { + geWidth = (FX_FLOAT)barWidth; + } + FX_INT32 iFontSize = (FX_INT32)fabs(m_fFontSize); + FX_INT32 iTextHeight = iFontSize + 1; + CalcTextInfo(str, pCharPos, m_pFont, geWidth, iFontSize, charsLen); + if (charsLen < 1) { + return; + } + FX_INT32 locX = 0; + FX_INT32 locY = 0; + switch (m_locTextLoc) { + case BC_TEXT_LOC_ABOVEEMBED: + locX = (FX_INT32)(barWidth - charsLen) / 2; + locY = 0; + geWidth = charsLen; + break; + case BC_TEXT_LOC_ABOVE: + locX = 0; + locY = 0; + geWidth = (FX_FLOAT)barWidth; + break; + case BC_TEXT_LOC_BELOWEMBED: + locX = (FX_INT32)(barWidth - charsLen) / 2; + locY = m_Height - iTextHeight; + geWidth = charsLen; + break; + case BC_TEXT_LOC_BELOW: + default: + locX = 0; + locY = m_Height - iTextHeight; + geWidth = (FX_FLOAT)barWidth; + break; + } + if (device != NULL) { + ShowDeviceChars(device, matrix, str, geWidth, pCharPos, (FX_FLOAT)locX, (FX_FLOAT)locY, barWidth); + } else { + ShowBitmapChars(pOutBitmap, str, geWidth, pCharPos, (FX_FLOAT)locX, (FX_FLOAT)locY, barWidth); + } + FX_Free(pCharPos); +} +void CBC_OneDimWriter::RenderBitmapResult(CFX_DIBitmap *&pOutBitmap, FX_WSTR contents, FX_INT32 &e) +{ + if (m_output == NULL) { + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + pOutBitmap = CreateDIBitmap(m_output->GetWidth(), m_output->GetHeight()); + pOutBitmap->Clear(m_backgroundColor); + if (!pOutBitmap) { + e = BCExceptionFailToCreateBitmap; + return; + } + for (FX_INT32 x = 0; x < m_output->GetWidth(); x++) { + for (FX_INT32 y = 0; y < m_output->GetHeight(); y++) { + if (m_output->Get(x, y)) { + pOutBitmap->SetPixel(x, y, m_barColor); + } + } + } + FX_INT32 i = 0; + for (; i < contents.GetLength(); i++) + if (contents.GetAt(i) != ' ') { + break; + } + if (m_locTextLoc != BC_TEXT_LOC_NONE && i < contents.GetLength()) { + ShowChars(contents, pOutBitmap, NULL, NULL, m_barWidth, m_multiple, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + CFX_DIBitmap * pStretchBitmap = pOutBitmap->StretchTo(m_Width, m_Height); + if (pOutBitmap) { + delete pOutBitmap; + } + pOutBitmap = pStretchBitmap; +} +void CBC_OneDimWriter::RenderDeviceResult(CFX_RenderDevice* device, const CFX_Matrix* matrix, FX_WSTR contents, FX_INT32 &e) +{ + if (m_output == NULL) { + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + CFX_GraphStateData stateData; + CFX_PathData path; + path.AppendRect(0, 0, (FX_FLOAT)m_Width, (FX_FLOAT)m_Height); + device->DrawPath(&path, matrix, &stateData, m_backgroundColor, m_backgroundColor, FXFILL_ALTERNATE); + CFX_Matrix matri(m_outputHScale, 0.0, 0.0, (FX_FLOAT)m_Height, 0.0, 0.0); + matri.Concat(*matrix); + for (FX_INT32 x = 0; x < m_output->GetWidth(); x++) { + for (FX_INT32 y = 0; y < m_output->GetHeight(); y++) { + CFX_PathData rect; + rect.AppendRect((FX_FLOAT)x, (FX_FLOAT)y, (FX_FLOAT)(x + 1), (FX_FLOAT)(y + 1)); + CFX_GraphStateData stateData; + if (m_output->Get(x, y)) { + device->DrawPath(&rect, &matri, &stateData, m_barColor, 0, FXFILL_WINDING); + } + } + } + FX_INT32 i = 0; + for (; i < contents.GetLength(); i++) + if (contents.GetAt(i) != ' ') { + break; + } + if (m_locTextLoc != BC_TEXT_LOC_NONE && i < contents.GetLength()) { + ShowChars(contents, NULL, device, matrix, m_barWidth, m_multiple, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +void CBC_OneDimWriter::RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e) +{ + if (codeLength < 1) { + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + if (m_ModuleHeight < 20.0) { + m_ModuleHeight = 20; + } + FX_INT32 codeOldLength = codeLength; + FX_INT32 leftPadding = 0; + FX_INT32 rightPadding = 0; + if (m_bLeftPadding) { + leftPadding = 7; + } + if (m_bRightPadding) { + rightPadding = 7; + } + codeLength += leftPadding; + codeLength += rightPadding; + m_outputHScale = 1.0; + if (m_Width > 0) { + m_outputHScale = (FX_FLOAT)m_Width / (FX_FLOAT)codeLength; + } + if (!isDevice) { + m_outputHScale = FX_MAX(m_outputHScale, m_ModuleWidth); + } + FX_FLOAT dataLengthScale = 1.0; + if (m_iDataLenth > 0 && contents.GetLength() != 0) { + dataLengthScale = FX_FLOAT(contents.GetLength()) / FX_FLOAT(m_iDataLenth); + } + if (m_iDataLenth > 0 && contents.GetLength() == 0) { + dataLengthScale = FX_FLOAT(1) / FX_FLOAT(m_iDataLenth); + } + m_multiple = 1; + if (!isDevice) { + m_multiple = (FX_INT32)ceil(m_outputHScale * dataLengthScale); + } + FX_INT32 outputHeight = 1; + if (!isDevice) { + if (m_Height == 0) { + outputHeight = FX_MAX(20, m_ModuleHeight); + } else { + outputHeight = m_Height; + } + } + FX_INT32 outputWidth = codeLength; + if (!isDevice) { + outputWidth = (FX_INT32)(codeLength * m_multiple / dataLengthScale); + } + m_barWidth = m_Width; + if (!isDevice) { + m_barWidth = codeLength * m_multiple; + } + m_output = FX_NEW CBC_CommonBitMatrix; + m_output->Init(outputWidth, outputHeight); + FX_INT32 outputX = leftPadding * m_multiple; + for (FX_INT32 inputX = 0; inputX < codeOldLength; inputX++) { + if (code[inputX] == 1) { + if (outputX >= outputWidth ) { + break; + } + if (outputX + m_multiple > outputWidth && outputWidth - outputX > 0) { + m_output->SetRegion(outputX, 0, outputWidth - outputX , outputHeight, e); + break; + } + m_output->SetRegion(outputX, 0, m_multiple, outputHeight, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + outputX += m_multiple; + } +} diff --git a/xfa/src/fxbarcode/src/BC_OnedCodaBarReader.cpp b/xfa/src/fxbarcode/src/BC_OnedCodaBarReader.cpp new file mode 100644 index 0000000000..592f938030 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_OnedCodaBarReader.cpp @@ -0,0 +1,190 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_Reader.h" +#include "include/BC_OneDReader.h" +#include "include/BC_OnedCode39Reader.h" +#include "include/BC_CommonBitArray.h" +#include "include/BC_OnedCodaBarReader.h" +FX_LPCSTR CBC_OnedCodaBarReader::ALPHABET_STRING = "0123456789-$:/.+ABCDTN"; +const FX_INT32 CBC_OnedCodaBarReader::CHARACTER_ENCODINGS[22] = { + 0x003, 0x006, 0x009, 0x060, 0x012, 0x042, 0x021, 0x024, 0x030, 0x048, + 0x00c, 0x018, 0x045, 0x051, 0x054, 0x015, 0x01A, 0x029, 0x00B, 0x00E, + 0x01A, 0x029 +}; +const FX_INT32 CBC_OnedCodaBarReader::minCharacterLength = 3; +const FX_CHAR CBC_OnedCodaBarReader::STARTEND_ENCODING[8] = {'E', '*', 'A', 'B', 'C', 'D', 'T', 'N'}; +CBC_OnedCodaBarReader::CBC_OnedCodaBarReader() +{ +} +CBC_OnedCodaBarReader::~CBC_OnedCodaBarReader() +{ +} +CFX_ByteString CBC_OnedCodaBarReader::DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e) +{ + CFX_Int32Array *int32Ptr = FindAsteriskPattern(row, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + CBC_AutoPtr start(int32Ptr); + (*start)[1] = 0; + FX_INT32 nextStart = (*start)[1]; + FX_INT32 end = row->GetSize(); + while (nextStart < end && !row->Get(nextStart)) { + nextStart++; + } + CFX_ByteString result; + CFX_Int32Array counters; + counters.SetSize(7); + FX_CHAR decodedChar; + FX_INT32 lastStart; + do { + RecordPattern(row, nextStart, &counters, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + decodedChar = ToNarrowWidePattern(&counters); + if (decodedChar == '!') { + e = BCExceptionNotFound; + return ""; + } + result += decodedChar; + lastStart = nextStart; + for (FX_INT32 i = 0; i < counters.GetSize(); i++) { + nextStart += counters[i]; + } + while (nextStart < end && !row->Get(nextStart)) { + nextStart++; + } + } while (nextStart < end); + FX_INT32 lastPatternSize = 0; + for (FX_INT32 j = 0; j < counters.GetSize(); j++) { + lastPatternSize += counters[j]; + } + FX_INT32 whiteSpaceAfterEnd = nextStart - lastStart - lastPatternSize; + if (nextStart != end && (whiteSpaceAfterEnd / 2 < lastPatternSize)) { + e = BCExceptionNotFound; + return ""; + } + if (result.GetLength() < 2) { + e = BCExceptionNotFound; + return ""; + } + FX_CHAR startchar = result[0]; + if (!ArrayContains(STARTEND_ENCODING, startchar)) { + e = BCExceptionNotFound; + return ""; + } + FX_INT32 len = result.GetLength(); + CFX_ByteString temp = result; + for (FX_INT32 k = 1; k < result.GetLength(); k++) { + if (ArrayContains(STARTEND_ENCODING, result[k])) { + if ((k + 1) != result.GetLength()) { + result.Delete(1, k); + k = 1; + } + } + } + if (result.GetLength() < 5) { + FX_INT32 index = temp.Find(result.Mid(1, result.GetLength() - 1)); + if (index == len - (result.GetLength() - 1)) { + e = BCExceptionNotFound; + return ""; + } + } + if (result.GetLength() > minCharacterLength) { + result = result.Mid(1, result.GetLength() - 2); + } else { + e = BCExceptionNotFound; + return ""; + } + return result; +} +CFX_Int32Array *CBC_OnedCodaBarReader::FindAsteriskPattern(CBC_CommonBitArray *row, FX_INT32 &e) +{ + FX_INT32 width = row->GetSize(); + FX_INT32 rowOffset = 0; + while (rowOffset < width) { + if (row->Get(rowOffset)) { + break; + } + rowOffset++; + } + FX_INT32 counterPosition = 0; + CFX_Int32Array counters; + counters.SetSize(7); + FX_INT32 patternStart = rowOffset; + FX_BOOL isWhite = FALSE; + FX_INT32 patternLength = counters.GetSize(); + for (FX_INT32 i = rowOffset; i < width; i++) { + FX_BOOL pixel = row->Get(i); + if (pixel ^ isWhite) { + counters[counterPosition]++; + } else { + if (counterPosition == patternLength - 1) { + if (ArrayContains(STARTEND_ENCODING, ToNarrowWidePattern(&counters))) { + FX_BOOL btemp3 = row->IsRange(FX_MAX(0, patternStart - (i - patternStart) / 2), patternStart, FALSE, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + if (btemp3) { + CFX_Int32Array *result = FX_NEW CFX_Int32Array(); + result->SetSize(2); + (*result)[0] = patternStart; + (*result)[1] = i; + return result; + } + } + patternStart += counters[0] + counters[1]; + for (FX_INT32 y = 2; y < patternLength; y++) { + counters[y - 2] = counters[y]; + } + counters[patternLength - 2] = 0; + counters[patternLength - 1] = 0; + counterPosition--; + } else { + counterPosition++; + } + counters[counterPosition] = 1; + isWhite = !isWhite; + } + } + e = BCExceptionNotFound; + return NULL; +} +FX_BOOL CBC_OnedCodaBarReader::ArrayContains(const FX_CHAR array[], FX_CHAR key) +{ + for(FX_INT32 i = 0; i < 8; i++) { + if(array[i] == key) { + return TRUE; + } + } + return FALSE; +} +FX_CHAR CBC_OnedCodaBarReader::ToNarrowWidePattern(CFX_Int32Array *counter) +{ + FX_INT32 numCounters = counter->GetSize(); + if (numCounters < 1) { + return '!'; + } + FX_INT32 averageCounter = 0; + FX_INT32 totalCounters = 0; + for (FX_INT32 i = 0; i < numCounters; i++) { + totalCounters += (*counter)[i]; + } + averageCounter = totalCounters / numCounters; + FX_INT32 pattern = 0; + FX_INT32 wideCounters = 0; + for (FX_INT32 j = 0; j < numCounters; j++) { + if ((*counter)[j] > averageCounter) { + pattern |= 1 << (numCounters - 1 - j); + wideCounters++; + } + } + if ((wideCounters == 2) || (wideCounters == 3)) { + for (FX_INT32 k = 0; k < 22; k++) { + if (CHARACTER_ENCODINGS[k] == pattern) { + return (ALPHABET_STRING)[k]; + } + } + } + return '!'; +} diff --git a/xfa/src/fxbarcode/src/BC_OnedCodaBarWriter.cpp b/xfa/src/fxbarcode/src/BC_OnedCodaBarWriter.cpp new file mode 100644 index 0000000000..80df7c840c --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_OnedCodaBarWriter.cpp @@ -0,0 +1,206 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_Writer.h" +#include "include/BC_Reader.h" +#include "include/BC_OneDReader.h" +#include "include/BC_CommonBitArray.h" +#include "include/BC_OneDimWriter.h" +#include "include/BC_OnedCodaBarReader.h" +#include "include/BC_OnedCodaBarWriter.h" +#include "include/BC_CommonBitMatrix.h" +const FX_CHAR CBC_OnedCodaBarWriter::START_END_CHARS[] = {'A', 'B', 'C', 'D', 'T', 'N', '*', 'E', 'a', 'b', 'c', 'd', 't', 'n', 'e'}; +const FX_CHAR CBC_OnedCodaBarWriter::CONTENT_CHARS[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '$', '/', ':', '+', '.'}; +CBC_OnedCodaBarWriter::CBC_OnedCodaBarWriter() +{ + m_chStart = 'A'; + m_chEnd = 'B'; + m_iWideNarrRatio = 2; +} +CBC_OnedCodaBarWriter::~CBC_OnedCodaBarWriter() +{ +} +FX_BOOL CBC_OnedCodaBarWriter::SetStartChar(FX_CHAR start) +{ + for (FX_INT32 i = 0; i < sizeof(START_END_CHARS) / sizeof(FX_CHAR); i++) { + if (START_END_CHARS[i] == start) { + m_chStart = start; + return TRUE; + } + } + return FALSE; +} +FX_BOOL CBC_OnedCodaBarWriter::SetEndChar(FX_CHAR end) +{ + for (FX_INT32 i = 0; i < sizeof(START_END_CHARS) / sizeof(FX_CHAR); i++) { + if (START_END_CHARS[i] == end) { + m_chEnd = end; + return TRUE; + } + } + return FALSE; +} +void CBC_OnedCodaBarWriter::SetDataLength(FX_INT32 length) +{ + m_iDataLenth = length + 2; +} +FX_BOOL CBC_OnedCodaBarWriter::SetTextLocation(BC_TEXT_LOC location) +{ + if ( location < BC_TEXT_LOC_NONE || location > BC_TEXT_LOC_BELOWEMBED) { + return FALSE; + } + m_locTextLoc = location; + return TRUE; +} +FX_BOOL CBC_OnedCodaBarWriter::SetWideNarrowRatio(FX_INT32 ratio) +{ + if(ratio < 2 || ratio > 3) { + return FALSE; + } + m_iWideNarrRatio = ratio; + return TRUE; +} +FX_BOOL CBC_OnedCodaBarWriter::FindChar(FX_WCHAR ch, FX_BOOL isContent) +{ + if(isContent) { + for(FX_INT32 i = 0 ; i < sizeof(CONTENT_CHARS) / sizeof(FX_CHAR) ; i++) { + if(ch == (FX_WCHAR)CONTENT_CHARS[i]) { + return TRUE; + } + } + for(FX_INT32 j = 0 ; j < sizeof(START_END_CHARS) / sizeof(FX_CHAR) ; j++) { + if(ch == (FX_WCHAR)START_END_CHARS[j]) { + return TRUE; + } + } + return FALSE; + } else { + for(FX_INT32 i = 0 ; i < sizeof(CONTENT_CHARS) / sizeof(FX_CHAR) ; i++) { + if(ch == (FX_WCHAR)CONTENT_CHARS[i]) { + return TRUE; + } + } + return FALSE; + } +} +FX_BOOL CBC_OnedCodaBarWriter::CheckContentValidity(FX_WSTR contents) +{ + FX_WCHAR ch; + FX_INT32 index = 0; + for (index = 0; index < contents.GetLength(); index++) { + ch = contents.GetAt(index); + if (FindChar(ch, FALSE)) { + continue; + } else { + return FALSE; + } + } + return TRUE; +} +CFX_WideString CBC_OnedCodaBarWriter::FilterContents(FX_WSTR contents) +{ + CFX_WideString filtercontents; + FX_WCHAR ch; + for (FX_INT32 index = 0; index < contents.GetLength(); index ++) { + ch = contents.GetAt(index); + if(ch > 175) { + index++; + continue; + } + if (FindChar(ch, TRUE)) { + filtercontents += ch; + } else { + continue; + } + } + return filtercontents; +} +FX_BYTE *CBC_OnedCodaBarWriter::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) +{ + FX_BYTE *ret = Encode(contents, format, outWidth, outHeight, 0 , e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return ret; +} +FX_BYTE *CBC_OnedCodaBarWriter::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) +{ + if(format != BCFORMAT_CODABAR) { + e = BCExceptionOnlyEncodeCODEBAR; + return NULL; + } + FX_BYTE *ret = CBC_OneDimWriter::Encode(contents, format, outWidth, outHeight, hints, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return ret; +} +FX_BYTE* CBC_OnedCodaBarWriter::Encode(const CFX_ByteString &contents, FX_INT32 &outLength, FX_INT32 &e) +{ + CBC_OnedCodaBarReader CodaBarR; + CFX_ByteString data = m_chStart + contents + m_chEnd; + m_iContentLen = data.GetLength(); + FX_BYTE *result = FX_Alloc(FX_BYTE, m_iWideNarrRatio * 7 * data.GetLength()); + FX_CHAR ch; + FX_INT32 position = 0; + for (FX_INT32 index = 0; index < data.GetLength(); index++) { + ch = data.GetAt(index); + if (((ch >= 'a') && (ch <= 'z'))) { + ch = ch - 32; + } + switch (ch) { + case 'T': + ch = 'A'; + break; + case 'N': + ch = 'B'; + break; + case '*': + ch = 'C'; + break; + case 'E': + ch = 'D'; + break; + default: + break; + } + FX_INT32 code = 0; + FX_INT32 len = (FX_INT32)strlen(CodaBarR.ALPHABET_STRING); + for (FX_INT32 i = 0; i < len; i++) { + if (ch == CodaBarR.ALPHABET_STRING[i]) { + code = CodaBarR.CHARACTER_ENCODINGS[i]; + break; + } + } + FX_BYTE color = 1; + FX_INT32 counter = 0; + FX_INT32 bit = 0; + while (bit < 7) { + result[position] = color; + position++; + if (((code >> (6 - bit)) & 1) == 0 || counter == m_iWideNarrRatio - 1) { + color = !color; + bit++; + counter = 0; + } else { + counter++; + } + } + if (index < data.GetLength() - 1) { + result[position] = 0; + position ++; + } + } + outLength = position; + return result; +} +CFX_WideString CBC_OnedCodaBarWriter::encodedContents(FX_WSTR contents) +{ + CFX_WideString strStart(m_chStart); + CFX_WideString strEnd(m_chEnd); + return strStart + contents + strEnd; +} +void CBC_OnedCodaBarWriter::RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e) +{ + CBC_OneDimWriter::RenderResult(encodedContents(contents), code, codeLength, isDevice, e); +} diff --git a/xfa/src/fxbarcode/src/BC_OnedCode128Reader.cpp b/xfa/src/fxbarcode/src/BC_OnedCode128Reader.cpp new file mode 100644 index 0000000000..173ce7ce4c --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_OnedCode128Reader.cpp @@ -0,0 +1,414 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_Reader.h" +#include "include/BC_OneDReader.h" +#include "include/BC_CommonBitArray.h" +#include "include/BC_OnedCode128Reader.h" +const FX_INT32 CBC_OnedCode128Reader::CODE_PATTERNS[107][7] = { + {2, 1, 2, 2, 2, 2, 0}, + {2, 2, 2, 1, 2, 2, 0}, + {2, 2, 2, 2, 2, 1, 0}, + {1, 2, 1, 2, 2, 3, 0}, + {1, 2, 1, 3, 2, 2, 0}, + {1, 3, 1, 2, 2, 2, 0}, + {1, 2, 2, 2, 1, 3, 0}, + {1, 2, 2, 3, 1, 2, 0}, + {1, 3, 2, 2, 1, 2, 0}, + {2, 2, 1, 2, 1, 3, 0}, + {2, 2, 1, 3, 1, 2, 0}, + {2, 3, 1, 2, 1, 2, 0}, + {1, 1, 2, 2, 3, 2, 0}, + {1, 2, 2, 1, 3, 2, 0}, + {1, 2, 2, 2, 3, 1, 0}, + {1, 1, 3, 2, 2, 2, 0}, + {1, 2, 3, 1, 2, 2, 0}, + {1, 2, 3, 2, 2, 1, 0}, + {2, 2, 3, 2, 1, 1, 0}, + {2, 2, 1, 1, 3, 2, 0}, + {2, 2, 1, 2, 3, 1, 0}, + {2, 1, 3, 2, 1, 2, 0}, + {2, 2, 3, 1, 1, 2, 0}, + {3, 1, 2, 1, 3, 1, 0}, + {3, 1, 1, 2, 2, 2, 0}, + {3, 2, 1, 1, 2, 2, 0}, + {3, 2, 1, 2, 2, 1, 0}, + {3, 1, 2, 2, 1, 2, 0}, + {3, 2, 2, 1, 1, 2, 0}, + {3, 2, 2, 2, 1, 1, 0}, + {2, 1, 2, 1, 2, 3, 0}, + {2, 1, 2, 3, 2, 1, 0}, + {2, 3, 2, 1, 2, 1, 0}, + {1, 1, 1, 3, 2, 3, 0}, + {1, 3, 1, 1, 2, 3, 0}, + {1, 3, 1, 3, 2, 1, 0}, + {1, 1, 2, 3, 1, 3, 0}, + {1, 3, 2, 1, 1, 3, 0}, + {1, 3, 2, 3, 1, 1, 0}, + {2, 1, 1, 3, 1, 3, 0}, + {2, 3, 1, 1, 1, 3, 0}, + {2, 3, 1, 3, 1, 1, 0}, + {1, 1, 2, 1, 3, 3, 0}, + {1, 1, 2, 3, 3, 1, 0}, + {1, 3, 2, 1, 3, 1, 0}, + {1, 1, 3, 1, 2, 3, 0}, + {1, 1, 3, 3, 2, 1, 0}, + {1, 3, 3, 1, 2, 1, 0}, + {3, 1, 3, 1, 2, 1, 0}, + {2, 1, 1, 3, 3, 1, 0}, + {2, 3, 1, 1, 3, 1, 0}, + {2, 1, 3, 1, 1, 3, 0}, + {2, 1, 3, 3, 1, 1, 0}, + {2, 1, 3, 1, 3, 1, 0}, + {3, 1, 1, 1, 2, 3, 0}, + {3, 1, 1, 3, 2, 1, 0}, + {3, 3, 1, 1, 2, 1, 0}, + {3, 1, 2, 1, 1, 3, 0}, + {3, 1, 2, 3, 1, 1, 0}, + {3, 3, 2, 1, 1, 1, 0}, + {3, 1, 4, 1, 1, 1, 0}, + {2, 2, 1, 4, 1, 1, 0}, + {4, 3, 1, 1, 1, 1, 0}, + {1, 1, 1, 2, 2, 4, 0}, + {1, 1, 1, 4, 2, 2, 0}, + {1, 2, 1, 1, 2, 4, 0}, + {1, 2, 1, 4, 2, 1, 0}, + {1, 4, 1, 1, 2, 2, 0}, + {1, 4, 1, 2, 2, 1, 0}, + {1, 1, 2, 2, 1, 4, 0}, + {1, 1, 2, 4, 1, 2, 0}, + {1, 2, 2, 1, 1, 4, 0}, + {1, 2, 2, 4, 1, 1, 0}, + {1, 4, 2, 1, 1, 2, 0}, + {1, 4, 2, 2, 1, 1, 0}, + {2, 4, 1, 2, 1, 1, 0}, + {2, 2, 1, 1, 1, 4, 0}, + {4, 1, 3, 1, 1, 1, 0}, + {2, 4, 1, 1, 1, 2, 0}, + {1, 3, 4, 1, 1, 1, 0}, + {1, 1, 1, 2, 4, 2, 0}, + {1, 2, 1, 1, 4, 2, 0}, + {1, 2, 1, 2, 4, 1, 0}, + {1, 1, 4, 2, 1, 2, 0}, + {1, 2, 4, 1, 1, 2, 0}, + {1, 2, 4, 2, 1, 1, 0}, + {4, 1, 1, 2, 1, 2, 0}, + {4, 2, 1, 1, 1, 2, 0}, + {4, 2, 1, 2, 1, 1, 0}, + {2, 1, 2, 1, 4, 1, 0}, + {2, 1, 4, 1, 2, 1, 0}, + {4, 1, 2, 1, 2, 1, 0}, + {1, 1, 1, 1, 4, 3, 0}, + {1, 1, 1, 3, 4, 1, 0}, + {1, 3, 1, 1, 4, 1, 0}, + {1, 1, 4, 1, 1, 3, 0}, + {1, 1, 4, 3, 1, 1, 0}, + {4, 1, 1, 1, 1, 3, 0}, + {4, 1, 1, 3, 1, 1, 0}, + {1, 1, 3, 1, 4, 1, 0}, + {1, 1, 4, 1, 3, 1, 0}, + {3, 1, 1, 1, 4, 1, 0}, + {4, 1, 1, 1, 3, 1, 0}, + {2, 1, 1, 4, 1, 2, 0}, + {2, 1, 1, 2, 1, 4, 0}, + {2, 1, 1, 2, 3, 2, 0}, + {2, 3, 3, 1, 1, 1, 2} +}; +const FX_INT32 CBC_OnedCode128Reader::MAX_AVG_VARIANCE = (FX_INT32) (256 * 0.25f); +const FX_INT32 CBC_OnedCode128Reader::MAX_INDIVIDUAL_VARIANCE = (FX_INT32) (256 * 0.7f); +const FX_INT32 CBC_OnedCode128Reader::CODE_SHIFT = 98; +const FX_INT32 CBC_OnedCode128Reader::CODE_CODE_C = 99; +const FX_INT32 CBC_OnedCode128Reader::CODE_CODE_B = 100; +const FX_INT32 CBC_OnedCode128Reader::CODE_CODE_A = 101; +const FX_INT32 CBC_OnedCode128Reader::CODE_FNC_1 = 102; +const FX_INT32 CBC_OnedCode128Reader::CODE_FNC_2 = 97; +const FX_INT32 CBC_OnedCode128Reader::CODE_FNC_3 = 96; +const FX_INT32 CBC_OnedCode128Reader::CODE_FNC_4_A = 101; +const FX_INT32 CBC_OnedCode128Reader::CODE_FNC_4_B = 100; +const FX_INT32 CBC_OnedCode128Reader::CODE_START_A = 103; +const FX_INT32 CBC_OnedCode128Reader::CODE_START_B = 104; +const FX_INT32 CBC_OnedCode128Reader::CODE_START_C = 105; +const FX_INT32 CBC_OnedCode128Reader::CODE_STOP = 106; +CBC_OnedCode128Reader::CBC_OnedCode128Reader() +{ +} +CBC_OnedCode128Reader::~CBC_OnedCode128Reader() +{ +} +CFX_Int32Array *CBC_OnedCode128Reader::FindStartPattern(CBC_CommonBitArray *row, FX_INT32 &e) +{ + FX_INT32 width = row->GetSize(); + FX_INT32 rowOffset = 0; + while (rowOffset < width) { + if (row->Get(rowOffset)) { + break; + } + rowOffset++; + } + FX_INT32 counterPosition = 0; + CFX_Int32Array counters; + counters.SetSize(6); + FX_INT32 patternStart = rowOffset; + FX_BOOL isWhite = FALSE; + FX_INT32 patternLength = counters.GetSize(); + for (FX_INT32 i = rowOffset; i < width; i++) { + FX_BOOL pixel = row->Get(i); + if (pixel ^ isWhite) { + counters[counterPosition]++; + } else { + if (counterPosition == patternLength - 1) { + FX_INT32 bestVariance = MAX_AVG_VARIANCE; + FX_INT32 bestMatch = -1; + for (FX_INT32 startCode = CODE_START_A; startCode <= CODE_START_C; startCode++) { + FX_INT32 variance = PatternMatchVariance(&counters, &CODE_PATTERNS[startCode][0], MAX_INDIVIDUAL_VARIANCE); + if (variance < bestVariance) { + bestVariance = variance; + bestMatch = startCode; + } + } + if (bestMatch >= 0) { + FX_BOOL btemp2 = row->IsRange(FX_MAX(0, patternStart - (i - patternStart) / 2), patternStart, FALSE, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + if (btemp2) { + CFX_Int32Array *result = FX_NEW CFX_Int32Array; + result->SetSize(3); + (*result)[0] = patternStart; + (*result)[1] = i; + (*result)[2] = bestMatch; + return result; + } + } + patternStart += counters[0] + counters[1]; + for (FX_INT32 y = 2; y < patternLength; y++) { + counters[y - 2] = counters[y]; + } + counters[patternLength - 2] = 0; + counters[patternLength - 1] = 0; + counterPosition--; + } else { + counterPosition++; + } + counters[counterPosition] = 1; + isWhite = !isWhite; + } + } + e = BCExceptionNotFound; + return NULL; +} +FX_INT32 CBC_OnedCode128Reader::DecodeCode(CBC_CommonBitArray *row, CFX_Int32Array *counters, FX_INT32 rowOffset, FX_INT32 &e) +{ + RecordPattern(row, rowOffset, counters, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + FX_INT32 bestVariance = MAX_AVG_VARIANCE; + FX_INT32 bestMatch = -1; + for (FX_INT32 d = 0; d < 107; d++) { + FX_INT32 variance = PatternMatchVariance(counters, &CODE_PATTERNS[d][0], MAX_INDIVIDUAL_VARIANCE); + if (variance < bestVariance) { + bestVariance = variance; + bestMatch = d; + } + } + if (bestMatch >= 0) { + return bestMatch; + } else { + e = BCExceptionNotFound; + return 0; + } + return 0; +} +CFX_ByteString CBC_OnedCode128Reader::DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e) +{ + CFX_Int32Array *startPatternInfo = FindStartPattern(row, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + FX_INT32 startCode = (*startPatternInfo)[2]; + FX_INT32 codeSet; + switch (startCode) { + case 103: + codeSet = CODE_CODE_A; + break; + case 104: + codeSet = CODE_CODE_B; + break; + case 105: + codeSet = CODE_CODE_C; + break; + default: + if(startPatternInfo != NULL) { + startPatternInfo->RemoveAll(); + delete startPatternInfo; + startPatternInfo = NULL; + } + e = BCExceptionFormatException; + return ""; + } + FX_BOOL done = FALSE; + FX_BOOL isNextShifted = FALSE; + CFX_ByteString result; + FX_INT32 lastStart = (*startPatternInfo)[0]; + FX_INT32 nextStart = (*startPatternInfo)[1]; + if(startPatternInfo != NULL) { + startPatternInfo->RemoveAll(); + delete startPatternInfo; + startPatternInfo = NULL; + } + CFX_Int32Array counters; + counters.SetSize(6); + FX_INT32 lastCode = 0; + FX_INT32 code = 0; + FX_INT32 checksumTotal = startCode; + FX_INT32 multiplier = 0; + FX_BOOL lastCharacterWasPrintable = TRUE; + while (!done) { + FX_BOOL unshift = isNextShifted; + isNextShifted = FALSE; + lastCode = code; + code = DecodeCode(row, &counters, nextStart, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + if (code != CODE_STOP) { + lastCharacterWasPrintable = TRUE; + } + if (code != CODE_STOP) { + multiplier++; + checksumTotal += multiplier * code; + } + lastStart = nextStart; + for (FX_INT32 i = 0; i < counters.GetSize(); i++) { + nextStart += counters[i]; + } + switch (code) { + case 103: + case 104: + case 105: + e = BCExceptionFormatException; + return ""; + } + switch (codeSet) { + case 101: + if (code < 64) { + result += (FX_CHAR) (' ' + code); + } else if (code < 96) { + result += (FX_CHAR) (code - 64); + } else { + if (code != CODE_STOP) { + lastCharacterWasPrintable = FALSE; + } + switch (code) { + case 102: + case 97: + case 96: + case 101: + break; + case 98: + isNextShifted = TRUE; + codeSet = CODE_CODE_B; + break; + case 100: + codeSet = CODE_CODE_B; + break; + case 99: + codeSet = CODE_CODE_C; + break; + case 106: + done = TRUE; + break; + } + } + break; + case 100: + if (code < 96) { + result += (FX_CHAR) (' ' + code); + } else { + if (code != CODE_STOP) { + lastCharacterWasPrintable = FALSE; + } + switch (code) { + case 102: + case 97: + case 96: + case 100: + break; + case 98: + isNextShifted = TRUE; + codeSet = CODE_CODE_A; + break; + case 101: + codeSet = CODE_CODE_A; + break; + case 99: + codeSet = CODE_CODE_C; + break; + case 106: + done = TRUE; + break; + } + } + break; + case 99: + if (code < 100) { + if (code < 10) { + result += '0'; + } + FX_CHAR temp[128]; +#if defined(_FX_WINAPI_PARTITION_APP_) + sprintf_s(temp, 128, "%d", code); +#else + sprintf(temp, "%d", code); +#endif + result += temp; + } else { + if (code != CODE_STOP) { + lastCharacterWasPrintable = FALSE; + } + switch (code) { + case 102: + break; + case 101: + codeSet = CODE_CODE_A; + break; + case 100: + codeSet = CODE_CODE_B; + break; + case 106: + done = TRUE; + break; + } + } + break; + } + if (unshift) { + codeSet = codeSet == CODE_CODE_A ? CODE_CODE_B : CODE_CODE_A; + } + } + FX_INT32 width = row->GetSize(); + while (nextStart < width && row->Get(nextStart)) { + nextStart++; + } + FX_BOOL boolT1 = row->IsRange(nextStart, FX_MIN(width, nextStart + (nextStart - lastStart) / 2), FALSE, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + if (!boolT1) { + e = BCExceptionNotFound; + return ""; + } + checksumTotal -= multiplier * lastCode; + if (checksumTotal % 103 != lastCode) { + e = BCExceptionChecksumException; + return ""; + } + FX_INT32 resultLength = result.GetLength(); + if (resultLength > 0 && lastCharacterWasPrintable) { + if (codeSet == CODE_CODE_C) { + result = result.Mid(0, result.GetLength() - 2); + } else { + result = result.Mid(0, result.GetLength() - 1); + } + } + if (result.GetLength() == 0) { + e = BCExceptionFormatException; + return ""; + } + return result; +} diff --git a/xfa/src/fxbarcode/src/BC_OnedCode128Writer.cpp b/xfa/src/fxbarcode/src/BC_OnedCode128Writer.cpp new file mode 100644 index 0000000000..217da22fbf --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_OnedCode128Writer.cpp @@ -0,0 +1,214 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_Writer.h" +#include "include/BC_Reader.h" +#include "include/BC_OneDReader.h" +#include "include/BC_OneDimWriter.h" +#include "include/BC_OnedCode128Reader.h" +#include "include/BC_OnedCode128Writer.h" +const FX_INT32 CBC_OnedCode128Writer::CODE_CODE_B = 100; +const FX_INT32 CBC_OnedCode128Writer::CODE_CODE_C = 99; +const FX_INT32 CBC_OnedCode128Writer::CODE_START_B = 104; +const FX_INT32 CBC_OnedCode128Writer::CODE_START_C = 105; +const FX_INT32 CBC_OnedCode128Writer::CODE_STOP = 106; +CBC_OnedCode128Writer::CBC_OnedCode128Writer() +{ + m_codeFormat = BC_CODE128_B; +} +CBC_OnedCode128Writer::CBC_OnedCode128Writer(BC_TYPE type) +{ + m_codeFormat = type; +} +CBC_OnedCode128Writer::~CBC_OnedCode128Writer() +{ +} +BC_TYPE CBC_OnedCode128Writer::GetType() +{ + return m_codeFormat; +} +FX_BOOL CBC_OnedCode128Writer::CheckContentValidity(FX_WSTR contents) +{ + FX_BOOL ret = TRUE; + FX_INT32 position = 0; + FX_INT32 patternIndex = -1; + if (m_codeFormat == BC_CODE128_B || m_codeFormat == BC_CODE128_C) { + while (position < contents.GetLength()) { + patternIndex = (FX_INT32)contents.GetAt(position); + if (patternIndex >= 32 && patternIndex <= 126 && patternIndex != 34) { + position++; + continue; + } else { + ret = FALSE; + break; + } + position ++; + } + } else { + ret = FALSE; + } + return ret; +} +CFX_WideString CBC_OnedCode128Writer::FilterContents(FX_WSTR contents) +{ + CFX_WideString filterChineseChar; + FX_WCHAR ch; + for (FX_INT32 i = 0; i < contents.GetLength(); i++) { + ch = contents.GetAt(i); + if(ch > 175) { + i++; + continue; + } + filterChineseChar += ch; + } + CFX_WideString filtercontents; + if (m_codeFormat == BC_CODE128_B) { + for (FX_INT32 i = 0; i < filterChineseChar.GetLength(); i++) { + ch = filterChineseChar.GetAt(i); + if (ch >= 32 && ch <= 126) { + filtercontents += ch; + } else { + continue; + } + } + } else if (m_codeFormat == BC_CODE128_C) { + for (FX_INT32 i = 0; i < filterChineseChar.GetLength(); i++) { + ch = filterChineseChar.GetAt(i); + if (ch >= 32 && ch <= 106) { + filtercontents += ch; + } else { + continue; + } + } + } else { + filtercontents = contents; + } + return filtercontents; +} +FX_BOOL CBC_OnedCode128Writer::SetTextLocation(BC_TEXT_LOC location) +{ + if ( location < BC_TEXT_LOC_NONE || location > BC_TEXT_LOC_BELOWEMBED) { + return FALSE; + } + m_locTextLoc = location; + return TRUE; +} +FX_BYTE *CBC_OnedCode128Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) +{ + if(format != BCFORMAT_CODE_128) { + e = BCExceptionOnlyEncodeCODE_128; + return NULL; + } + FX_BYTE *ret = CBC_OneDimWriter::Encode(contents, format, outWidth, outHeight, hints, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return ret; +} +FX_BYTE *CBC_OnedCode128Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) +{ + FX_BYTE *ret = Encode(contents, format, outWidth, outHeight, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return ret; +} +FX_BOOL CBC_OnedCode128Writer::IsDigits(const CFX_ByteString &contents, FX_INT32 start, FX_INT32 length) +{ + FX_INT32 end = start + length; + for (FX_INT32 i = start; i < end; i++) { + if (contents[i] < '0' || contents[i] > '9') { + return FALSE; + } + } + return TRUE; +} +FX_BYTE *CBC_OnedCode128Writer::Encode(const CFX_ByteString &contents, FX_INT32 &outLength, FX_INT32 &e) +{ + FX_INT32 length = contents.GetLength(); + if(contents.GetLength() < 1 || contents.GetLength() > 80) { + e = BCExceptionContentsLengthShouldBetween1and80; + return NULL; + } + CFX_PtrArray patterns; + FX_INT32 checkSum = 0; + if (m_codeFormat == BC_CODE128_B) { + checkSum = Encode128B(contents, patterns); + } else if (m_codeFormat == BC_CODE128_C) { + checkSum = Encode128C(contents, patterns); + } else { + e = BCExceptionFormatException; + return NULL; + } + checkSum %= 103; + patterns.Add((FX_INT32*)CBC_OnedCode128Reader::CODE_PATTERNS[checkSum]); + patterns.Add((FX_INT32*)CBC_OnedCode128Reader::CODE_PATTERNS[CODE_STOP]); + m_iContentLen = contents.GetLength() + 3; + FX_INT32 codeWidth = 0; + for(FX_INT32 k = 0; k < patterns.GetSize(); k++) { + FX_INT32 *pattern = (FX_INT32*)patterns[k]; + for(FX_INT32 j = 0; j < 7; j++) { + codeWidth += pattern[j]; + } + } + outLength = codeWidth; + FX_BYTE *result = FX_Alloc(FX_BYTE, outLength); + FX_INT32 pos = 0; + for(FX_INT32 j = 0; j < patterns.GetSize(); j++) { + FX_INT32* pattern = (FX_INT32*)patterns[j]; + pos += AppendPattern(result, pos, pattern, 7, 1, e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + } + return result; +} +FX_INT32 CBC_OnedCode128Writer::Encode128B(const CFX_ByteString &contents, CFX_PtrArray &patterns) +{ + FX_INT32 checkSum = 0; + FX_INT32 checkWeight = 1; + FX_INT32 position = 0; + patterns.Add((FX_INT32*)CBC_OnedCode128Reader::CODE_PATTERNS[CODE_START_B]); + checkSum += CODE_START_B * checkWeight; + while (position < contents.GetLength()) { + FX_INT32 patternIndex = 0; + patternIndex = contents[position] - ' '; + position += 1; + patterns.Add((FX_INT32*)CBC_OnedCode128Reader::CODE_PATTERNS[patternIndex]); + checkSum += patternIndex * checkWeight; + if (position != 0) { + checkWeight++; + } + } + return checkSum; +} +FX_INT32 CBC_OnedCode128Writer::Encode128C(const CFX_ByteString &contents, CFX_PtrArray &patterns) +{ + FX_INT32 checkSum = 0; + FX_INT32 checkWeight = 1; + FX_INT32 position = 0; + patterns.Add((FX_INT32*)CBC_OnedCode128Reader::CODE_PATTERNS[CODE_START_C]); + checkSum += CODE_START_C * checkWeight; + while (position < contents.GetLength()) { + FX_INT32 patternIndex = 0; + FX_CHAR ch = contents.GetAt(position); + if (ch < '0' || ch > '9') { + patternIndex = (FX_INT32)ch; + position++; + } else { + patternIndex = FXSYS_atoi(contents.Mid(position, 2)); + if (contents.GetAt(position + 1) < '0' || contents.GetAt(position + 1) > '9') { + position += 1; + } else { + position += 2; + } + } + patterns.Add((FX_INT32*)CBC_OnedCode128Reader::CODE_PATTERNS[patternIndex]); + checkSum += patternIndex * checkWeight; + if (position != 0) { + checkWeight++; + } + } + return checkSum; +} diff --git a/xfa/src/fxbarcode/src/BC_OnedCode39Reader.cpp b/xfa/src/fxbarcode/src/BC_OnedCode39Reader.cpp new file mode 100644 index 0000000000..7055a0368b --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_OnedCode39Reader.cpp @@ -0,0 +1,277 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_Reader.h" +#include "include/BC_OneDReader.h" +#include "include/BC_CommonBitArray.h" +#include "include/BC_OnedCode39Reader.h" +FX_LPCSTR CBC_OnedCode39Reader::ALPHABET_STRING = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. *$/+%"; +FX_LPCSTR CBC_OnedCode39Reader::CHECKSUM_STRING = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%"; +const FX_INT32 CBC_OnedCode39Reader::CHARACTER_ENCODINGS[44] = { + 0x034, 0x121, 0x061, 0x160, 0x031, 0x130, 0x070, 0x025, 0x124, 0x064, + 0x109, 0x049, 0x148, 0x019, 0x118, 0x058, 0x00D, 0x10C, 0x04C, 0x01C, + 0x103, 0x043, 0x142, 0x013, 0x112, 0x052, 0x007, 0x106, 0x046, 0x016, + 0x181, 0x0C1, 0x1C0, 0x091, 0x190, 0x0D0, 0x085, 0x184, 0x0C4, 0x094, + 0x0A8, 0x0A2, 0x08A, 0x02A +}; +const FX_INT32 CBC_OnedCode39Reader::ASTERISK_ENCODING = 0x094; +CBC_OnedCode39Reader::CBC_OnedCode39Reader(): m_extendedMode(FALSE), m_usingCheckDigit(FALSE) +{ +} +CBC_OnedCode39Reader::CBC_OnedCode39Reader(FX_BOOL usingCheckDigit) +{ + m_usingCheckDigit = usingCheckDigit; + m_extendedMode = FALSE; +} +CBC_OnedCode39Reader::CBC_OnedCode39Reader(FX_BOOL usingCheckDigit, FX_BOOL extendedMode) +{ + m_extendedMode = extendedMode; + m_usingCheckDigit = usingCheckDigit; +} +CBC_OnedCode39Reader::~CBC_OnedCode39Reader() +{ +} +CFX_ByteString CBC_OnedCode39Reader::DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e) +{ + CFX_Int32Array *start = FindAsteriskPattern(row, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + FX_INT32 nextStart = (*start)[1]; + if(start != NULL) { + delete start; + start = NULL; + } + FX_INT32 end = row->GetSize(); + while (nextStart < end && !row->Get(nextStart)) { + nextStart++; + } + CFX_ByteString result; + CFX_Int32Array counters; + counters.SetSize(9); + FX_CHAR decodedChar; + FX_INT32 lastStart; + do { + RecordPattern(row, nextStart, &counters, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + FX_INT32 pattern = ToNarrowWidePattern(&counters); + if (pattern < 0) { + e = BCExceptionNotFound; + return ""; + } + decodedChar = PatternToChar(pattern, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + result += decodedChar; + lastStart = nextStart; + for (FX_INT32 i = 0; i < counters.GetSize(); i++) { + nextStart += counters[i]; + } + while (nextStart < end && !row->Get(nextStart)) { + nextStart++; + } + } while (decodedChar != '*'); + result = result.Mid(0, result.GetLength() - 1); + FX_INT32 lastPatternSize = 0; + for (FX_INT32 j = 0; j < counters.GetSize(); j++) { + lastPatternSize += counters[j]; + } + FX_INT32 whiteSpaceAfterEnd = nextStart - lastStart - lastPatternSize; + if(m_usingCheckDigit) { + FX_INT32 max = result.GetLength() - 1; + FX_INT32 total = 0; + FX_INT32 len = (FX_INT32)strlen(ALPHABET_STRING); + for (FX_INT32 k = 0; k < max; k++) { + for (FX_INT32 j = 0; j < len; j++) + if (ALPHABET_STRING[j] == result[k]) { + total += j; + } + } + if (result[max] != (ALPHABET_STRING)[total % 43]) { + e = BCExceptionChecksumException; + return ""; + } + result = result.Mid(0, result.GetLength() - 1); + } + if (result.GetLength() == 0) { + e = BCExceptionNotFound; + return ""; + } + if(m_extendedMode) { + CFX_ByteString bytestr = DecodeExtended(result, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + return bytestr; + } else { + return result; + } +} +CFX_Int32Array *CBC_OnedCode39Reader::FindAsteriskPattern(CBC_CommonBitArray *row, FX_INT32 &e) +{ + FX_INT32 width = row->GetSize(); + FX_INT32 rowOffset = 0; + while (rowOffset < width) { + if (row->Get(rowOffset)) { + break; + } + rowOffset++; + } + FX_INT32 counterPosition = 0; + CFX_Int32Array counters; + counters.SetSize(9); + FX_INT32 patternStart = rowOffset; + FX_BOOL isWhite = FALSE; + FX_INT32 patternLength = counters.GetSize(); + for (FX_INT32 i = rowOffset; i < width; i++) { + FX_BOOL pixel = row->Get(i); + if (pixel ^ isWhite) { + counters[counterPosition]++; + } else { + if (counterPosition == patternLength - 1) { + if (ToNarrowWidePattern(&counters) == ASTERISK_ENCODING) { + FX_BOOL bT1 = row->IsRange(FX_MAX(0, patternStart - (i - patternStart) / 2), patternStart, FALSE, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + if (bT1) { + CFX_Int32Array *result = FX_NEW CFX_Int32Array; + result->SetSize(2); + (*result)[0] = patternStart; + (*result)[1] = i; + return result; + } + } + patternStart += counters[0] + counters[1]; + for (FX_INT32 y = 2; y < patternLength; y++) { + counters[y - 2] = counters[y]; + } + counters[patternLength - 2] = 0; + counters[patternLength - 1] = 0; + counterPosition--; + } else { + counterPosition++; + } + counters[counterPosition] = 1; + isWhite = !isWhite; + } + } + e = BCExceptionNotFound; + return NULL; +} +FX_INT32 CBC_OnedCode39Reader::ToNarrowWidePattern(CFX_Int32Array *counters) +{ + FX_INT32 numCounters = counters->GetSize(); + FX_INT32 maxNarrowCounter = 0; + FX_INT32 wideCounters; + do { +#undef max + FX_INT32 minCounter = FXSYS_IntMax; + for (FX_INT32 i = 0; i < numCounters; i++) { + FX_INT32 counter = (*counters)[i]; + if (counter < minCounter && counter > maxNarrowCounter) { + minCounter = counter; + } + } + maxNarrowCounter = minCounter; + wideCounters = 0; + FX_INT32 totalWideCountersWidth = 0; + FX_INT32 pattern = 0; + for (FX_INT32 j = 0; j < numCounters; j++) { + FX_INT32 counter = (*counters)[j]; + if ((*counters)[j] > maxNarrowCounter) { + pattern |= 1 << (numCounters - 1 - j); + wideCounters++; + totalWideCountersWidth += counter; + } + } + if (wideCounters == 3) { + for (FX_INT32 k = 0; k < numCounters && wideCounters > 0; k++) { + FX_INT32 counter = (*counters)[k]; + if ((*counters)[k] > maxNarrowCounter) { + wideCounters--; + if ((counter << 1) >= totalWideCountersWidth) { + return -1; + } + } + } + return pattern; + } + } while (wideCounters > 3); + return -1; +} +FX_CHAR CBC_OnedCode39Reader::PatternToChar(FX_INT32 pattern, FX_INT32 &e) +{ + for (FX_INT32 i = 0; i < 44; i++) { + if (CHARACTER_ENCODINGS[i] == pattern) { + return (ALPHABET_STRING)[i]; + } + } + e = BCExceptionNotFound; + return 0; +} +CFX_ByteString CBC_OnedCode39Reader::DecodeExtended(CFX_ByteString &encoded, FX_INT32 &e) +{ + FX_INT32 length = encoded.GetLength(); + CFX_ByteString decoded; + FX_CHAR c, next; + for(FX_INT32 i = 0; i < length; i++) { + c = encoded[i]; + if(c == '+' || c == '$' || c == '%' || c == '/') { + next = encoded[i + 1]; + FX_CHAR decodedChar = '\0'; + switch (c) { + case '+': + if (next >= 'A' && next <= 'Z') { + decodedChar = (FX_CHAR) (next + 32); + } else { + e = BCExceptionFormatException; + return ""; + } + break; + case '$': + if (next >= 'A' && next <= 'Z') { + decodedChar = (FX_CHAR) (next - 64); + } else { + e = BCExceptionFormatException; + return ""; + } + break; + case '%': + if (next >= 'A' && next <= 'E') { + decodedChar = (FX_CHAR) (next - 38); + } else if (next >= 'F' && next <= 'J') { + decodedChar = (FX_CHAR) (next - 11); + } else if (next >= 'K' && next <= 'O' && next != 'M' && next != 'N') { + decodedChar = (FX_CHAR) (next + 16); + } else if (next >= 'P' && next <= 'S') { + decodedChar = (FX_CHAR) (next + 43); + } else if (next == 'U') { + decodedChar = (FX_CHAR) 0; + } else if (next == 'V') { + decodedChar = (FX_CHAR) 64; + } else if (next == 'W') { + decodedChar = (FX_CHAR) 96; + } else if (next == 'T' || next == 'X' || next == 'Y' || next == 'Z') { + decodedChar = (FX_CHAR) 127; + } else { + e = BCExceptionFormatException; + return ""; + } + break; + case '/': + if (next >= 'A' && next <= 'O') { + decodedChar = (FX_CHAR) (next - 32); + } else if (next == 'Z') { + decodedChar = ':'; + } else { + e = BCExceptionFormatException; + return ""; + } + break; + } + decoded += decodedChar; + i++; + } else { + decoded += c; + } + } + return decoded; +} diff --git a/xfa/src/fxbarcode/src/BC_OnedCode39Writer.cpp b/xfa/src/fxbarcode/src/BC_OnedCode39Writer.cpp new file mode 100644 index 0000000000..b65c6e9de0 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_OnedCode39Writer.cpp @@ -0,0 +1,335 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_Writer.h" +#include "include/BC_Reader.h" +#include "include/BC_OneDReader.h" +#include "include/BC_OneDimWriter.h" +#include "include/BC_OnedCode39Reader.h" +#include "include/BC_OnedCode39Writer.h" +#include "include/BC_CommonBitMatrix.h" +CBC_OnedCode39Writer::CBC_OnedCode39Writer() +{ + m_extendedMode = FALSE; + m_iWideNarrRatio = 3; +} +CBC_OnedCode39Writer::CBC_OnedCode39Writer(FX_BOOL extendedMode) +{ + m_iWideNarrRatio = 3; + m_extendedMode = extendedMode; +} +CBC_OnedCode39Writer::~CBC_OnedCode39Writer() +{ +} +FX_BOOL CBC_OnedCode39Writer::CheckContentValidity(FX_WSTR contents) +{ + if (m_extendedMode) { + return CheckExtendedContentValidity(contents); + } + for(FX_INT32 i = 0; i < contents.GetLength(); i++) { + FX_WCHAR ch = contents.GetAt(i); + if ((ch >= (FX_WCHAR)'0' && ch <= (FX_WCHAR)'9') || (ch >= (FX_WCHAR)'A' && ch <= (FX_WCHAR)'Z') + || ch == (FX_WCHAR)'-' || ch == (FX_WCHAR)'.' || ch == (FX_WCHAR)' ' || ch == (FX_WCHAR)'*' + || ch == (FX_WCHAR)'$' || ch == (FX_WCHAR)'/' || ch == (FX_WCHAR)'+' || ch == (FX_WCHAR)'%') { + continue; + } + return FALSE; + } + return TRUE; +} +FX_BOOL CBC_OnedCode39Writer::CheckExtendedContentValidity(FX_WSTR contents) +{ + for(FX_INT32 i = 0; i < contents.GetLength(); i++) { + FX_WCHAR ch = contents.GetAt(i); + if (ch > 127) { + return FALSE; + } + } + return TRUE; +} +CFX_WideString CBC_OnedCode39Writer::FilterContents(FX_WSTR contents) +{ + if (m_extendedMode) { + return FilterExtendedContents(contents); + } + CFX_WideString filtercontents; + for(FX_INT32 i = 0; i < contents.GetLength(); i++) { + FX_WCHAR ch = contents.GetAt(i); + if ( ch == (FX_WCHAR)'*' && (i == 0 || i == contents.GetLength() - 1) ) { + continue; + } + if(ch > 175) { + i++; + continue; + } else { + ch = Upper(ch); + } + if ((ch >= (FX_WCHAR)'0' && ch <= (FX_WCHAR)'9') || (ch >= (FX_WCHAR)'A' && ch <= (FX_WCHAR)'Z') + || ch == (FX_WCHAR)'-' || ch == (FX_WCHAR)'.' || ch == (FX_WCHAR)' ' || ch == (FX_WCHAR)'*' + || ch == (FX_WCHAR)'$' || ch == (FX_WCHAR)'/' || ch == (FX_WCHAR)'+' || ch == (FX_WCHAR)'%') { + filtercontents += ch; + } + } + return filtercontents; +} +CFX_WideString CBC_OnedCode39Writer::FilterExtendedContents(FX_WSTR contents) +{ + CFX_WideString filtercontents; + for(FX_INT32 i = 0; i < contents.GetLength(); i++) { + FX_WCHAR ch = contents.GetAt(i); + if ( ch == (FX_WCHAR)'*' && (i == 0 || i == contents.GetLength() - 1) ) { + continue; + } + if(ch > 175) { + i++; + continue; + } + if (ch > 127 && ch < 176) { + continue; + } + if (ch == 0) { + filtercontents += '%'; + filtercontents += 'U'; + } else if(ch >= 1 && ch <= 26) { + filtercontents += '$'; + filtercontents += (ch + 64); + } else if (ch >= 27 && ch <= 31) { + filtercontents += '%'; + filtercontents += (ch + 38); + } else if (ch >= 33 && ch <= 47 && ch != 45 && ch != 46) { + filtercontents += '/'; + filtercontents += (ch + 32); + } else if (ch == 58) { + filtercontents += '/'; + filtercontents += 'Z'; + } else if (ch >= 59 && ch <= 63) { + filtercontents += '%'; + filtercontents += ch + 11; + } else if (ch == 64) { + filtercontents += '%'; + filtercontents += 'V'; + } else if (ch >= 91 && ch <= 95) { + filtercontents += '%'; + filtercontents += ch - 16; + } else if (ch == 96) { + filtercontents += '%'; + filtercontents += 'W'; + } else if (ch >= 97 && ch <= 122) { + filtercontents += '+'; + filtercontents += ch - 32; + } else if (ch >= 123 && ch <= 126) { + filtercontents += '%'; + filtercontents += ch - 43; + } else if (ch == 127) { + filtercontents += '%'; + filtercontents += 'T'; + } else { + filtercontents += ch; + } + } + return filtercontents; +} +CFX_WideString CBC_OnedCode39Writer::RenderTextContents(FX_WSTR contents) +{ + if (m_extendedMode) { + return RenderExtendedTextContents(contents); + } + CFX_WideString renderContents; + for(FX_INT32 i = 0; i < contents.GetLength(); i++) { + FX_WCHAR ch = contents.GetAt(i); + if ( ch == (FX_WCHAR)'*' && (i == 0 || i == contents.GetLength() - 1) ) { + continue; + } + if(ch > 175) { + i++; + continue; + } + if ((ch >= (FX_WCHAR)'0' && ch <= (FX_WCHAR)'9') || (ch >= (FX_WCHAR)'A' && ch <= (FX_WCHAR)'Z') + || (ch >= (FX_WCHAR)'a' && ch <= (FX_WCHAR)'z') || ch == (FX_WCHAR)'-' || ch == (FX_WCHAR)'.' + || ch == (FX_WCHAR)' ' || ch == (FX_WCHAR)'*' || ch == (FX_WCHAR)'$' || ch == (FX_WCHAR)'/' + || ch == (FX_WCHAR)'+' || ch == (FX_WCHAR)'%') { + renderContents += ch; + } + } + return renderContents; +} +CFX_WideString CBC_OnedCode39Writer::RenderExtendedTextContents(FX_WSTR contents) +{ + CFX_WideString renderContents; + for(FX_INT32 i = 0; i < contents.GetLength(); i++) { + FX_WCHAR ch = contents.GetAt(i); + if ( ch == (FX_WCHAR)'*' && (i == 0 || i == contents.GetLength() - 1) ) { + continue; + } + if(ch > 175) { + i++; + continue; + } + if (ch > 127 && ch < 176) { + continue; + } + renderContents += ch; + } + return renderContents; +} +FX_BOOL CBC_OnedCode39Writer::SetTextLocation(BC_TEXT_LOC location) +{ + if ( location < BC_TEXT_LOC_NONE || location > BC_TEXT_LOC_BELOWEMBED) { + return FALSE; + } + m_locTextLoc = location; + return TRUE; +} +FX_BOOL CBC_OnedCode39Writer::SetWideNarrowRatio(FX_INT32 ratio) +{ + if ( ratio < 2 || ratio > 3) { + return FALSE; + } + m_iWideNarrRatio = ratio; + return TRUE; +} +FX_BYTE *CBC_OnedCode39Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) +{ + FX_BYTE *ret = Encode(contents, format, outWidth, outHeight, 0 , e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return ret; +} +FX_BYTE *CBC_OnedCode39Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) +{ + if(format != BCFORMAT_CODE_39) { + e = BCExceptionOnlyEncodeCODE_39; + return NULL; + } + FX_BYTE *ret = CBC_OneDimWriter::Encode(contents, format, outWidth, outHeight, hints, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return ret; +} +void CBC_OnedCode39Writer::ToIntArray(FX_INT32 a, FX_INT32 *toReturn) +{ + for(FX_INT32 i = 0; i < 9; i++) { + toReturn[i] = (a & (1 << i) ) == 0 ? 1 : m_iWideNarrRatio; + } +} +FX_CHAR CBC_OnedCode39Writer::CalcCheckSum(const CFX_ByteString &contents, FX_INT32 &e) +{ + FX_INT32 length = contents.GetLength(); + if (length > 80) { + e = BCExceptionContentsLengthShouldBetween1and80; + return '*'; + } + FX_INT32 checksum = 0; + FX_INT32 len = (FX_INT32)strlen(CBC_OnedCode39Reader::ALPHABET_STRING); + for(FX_INT32 i = 0; i < contents.GetLength(); i++) { + FX_INT32 j = 0; + for (; j < len; j++) { + if (CBC_OnedCode39Reader::ALPHABET_STRING[j] == contents[i]) { + if(contents[i] != '*') { + checksum += j; + break; + } else { + break; + } + } + } + if (j >= len) { + e = BCExceptionUnSupportedString; + return '*'; + } + } + checksum = checksum % 43; + return CBC_OnedCode39Reader::CHECKSUM_STRING[checksum]; +} +FX_BYTE *CBC_OnedCode39Writer::Encode(const CFX_ByteString &contents, FX_INT32 &outlength , FX_INT32 &e) +{ + FX_CHAR checksum = CalcCheckSum(contents, e); + if (checksum == '*') { + return NULL; + } + FX_INT32 widths[9] = {0}; + FX_INT32 wideStrideNum = 3; + FX_INT32 narrStrideNum = 9 - wideStrideNum; + CFX_ByteString encodedContents = contents; + if ( m_bCalcChecksum ) { + encodedContents += checksum; + } + m_iContentLen = encodedContents.GetLength(); + FX_INT32 codeWidth = (wideStrideNum * m_iWideNarrRatio + narrStrideNum) * 2 + 1 + m_iContentLen; + FX_INT32 len = (FX_INT32)strlen(CBC_OnedCode39Reader::ALPHABET_STRING); + for (FX_INT32 j = 0; j < m_iContentLen; j++) { + for (FX_INT32 i = 0; i < len; i++) { + if (CBC_OnedCode39Reader::ALPHABET_STRING[i] == encodedContents[j]) { + ToIntArray(CBC_OnedCode39Reader::CHARACTER_ENCODINGS[i], widths); + for(FX_INT32 k = 0; k < 9; k++) { + codeWidth += widths[k]; + } + } + } + } + outlength = codeWidth; + FX_BYTE *result = FX_Alloc(FX_BYTE, codeWidth); + ToIntArray(CBC_OnedCode39Reader::CHARACTER_ENCODINGS[39], widths); + FX_INT32 pos = AppendPattern(result, 0, widths, 9, 1 , e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + FX_INT32 narrowWhite[] = {1}; + pos += AppendPattern(result, pos, narrowWhite, 1, 0, e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + for(FX_INT32 l = m_iContentLen - 1; l >= 0; l--) { + for (FX_INT32 i = 0; i < len; i++) { + if (CBC_OnedCode39Reader::ALPHABET_STRING[i] == encodedContents[l]) { + ToIntArray(CBC_OnedCode39Reader::CHARACTER_ENCODINGS[i], widths); + pos += AppendPattern(result, pos, widths, 9, 1, e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + } + } + pos += AppendPattern(result, pos, narrowWhite, 1, 0, e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + } + ToIntArray(CBC_OnedCode39Reader::CHARACTER_ENCODINGS[39], widths); + pos += AppendPattern(result, pos, widths, 9, 1, e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + for (FX_INT32 i = 0; i < codeWidth / 2; i++) { + result[i] ^= result[codeWidth - 1 - i]; + result[codeWidth - 1 - i] ^= result[i]; + result[i] ^= result[codeWidth - 1 - i]; + } + return result; +} +CFX_WideString CBC_OnedCode39Writer::encodedContents(FX_WSTR contents, FX_INT32 &e) +{ + CFX_WideString encodedContents = contents; + if (m_bCalcChecksum && m_bPrintChecksum) { + CFX_WideString checksumContent = FilterContents(contents); + CFX_ByteString str = checksumContent.UTF8Encode(); + FX_CHAR checksum; + checksum = CalcCheckSum(str, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L"")); + str += checksum; + encodedContents += checksum; + } + return encodedContents; +} +void CBC_OnedCode39Writer::RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e) +{ + CFX_WideString encodedCon = encodedContents(contents, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CBC_OneDimWriter::RenderResult(encodedCon, code, codeLength, isDevice, e); +} diff --git a/xfa/src/fxbarcode/src/BC_OnedEAN13Reader.cpp b/xfa/src/fxbarcode/src/BC_OnedEAN13Reader.cpp new file mode 100644 index 0000000000..a02e936c5c --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_OnedEAN13Reader.cpp @@ -0,0 +1,78 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_Reader.h" +#include "include/BC_OneDReader.h" +#include "include/BC_OneDimReader.h" +#include "include/BC_CommonBitArray.h" +#include "include/BC_OnedEAN13Reader.h" +const FX_INT32 CBC_OnedEAN13Reader::FIRST_DIGIT_ENCODINGS[10] = { + 0x00, 0x0B, 0x0D, 0xE, 0x13, 0x19, 0x1C, 0x15, 0x16, 0x1A +}; +CBC_OnedEAN13Reader::CBC_OnedEAN13Reader() +{ +} +CBC_OnedEAN13Reader::~CBC_OnedEAN13Reader() +{ +} +void CBC_OnedEAN13Reader::DetermineFirstDigit(CFX_ByteString &result, FX_INT32 lgPatternFound, FX_INT32 &e) +{ + for (FX_INT32 d = 0; d < 10; d++) { + if (lgPatternFound == FIRST_DIGIT_ENCODINGS[d]) { + result.Insert(0, (FX_CHAR) ('0' + d)); + return; + } + } + e = BCExceptionNotFound; + BC_EXCEPTION_CHECK_ReturnVoid(e); +} +FX_INT32 CBC_OnedEAN13Reader::DecodeMiddle(CBC_CommonBitArray *row, CFX_Int32Array *startRange, CFX_ByteString &resultString, FX_INT32 &e) +{ + CFX_Int32Array counters; + counters.Add(0); + counters.Add(0); + counters.Add(0); + counters.Add(0); + FX_INT32 end = row->GetSize(); + FX_INT32 rowOffset = (*startRange)[1]; + FX_INT32 lgPatternFound = 0; + for (FX_INT32 x = 0; x < 6 && rowOffset < end; x++) { + FX_INT32 bestMatch = DecodeDigit(row, &counters, rowOffset, &(CBC_OneDimReader::L_AND_G_PATTERNS[0][0]), 20, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + resultString += (FX_CHAR) ('0' + bestMatch % 10); + for (FX_INT32 i = 0; i < counters.GetSize(); i++) { + rowOffset += counters[i]; + } + if (bestMatch >= 10) { + lgPatternFound |= 1 << (5 - x); + } + } + DetermineFirstDigit(resultString, lgPatternFound, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + CFX_Int32Array result; + result.Add(CBC_OneDimReader::MIDDLE_PATTERN[0]); + result.Add(CBC_OneDimReader::MIDDLE_PATTERN[1]); + result.Add(CBC_OneDimReader::MIDDLE_PATTERN[2]); + result.Add(CBC_OneDimReader::MIDDLE_PATTERN[3]); + result.Add(CBC_OneDimReader::MIDDLE_PATTERN[4]); + CFX_Int32Array *middleRange = FindGuardPattern(row, rowOffset, TRUE, &result, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + rowOffset = (*middleRange)[1]; + if(middleRange != NULL) { + delete middleRange; + middleRange = NULL; + } + for (FX_INT32 Y = 0; Y < 6 && rowOffset < end; Y++) { + FX_INT32 bestMatch = DecodeDigit(row, &counters, rowOffset, &(CBC_OneDimReader::L_PATTERNS[0][0]), 10, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + resultString += (FX_CHAR) ('0' + bestMatch); + for (FX_INT32 k = 0; k < counters.GetSize(); k++) { + rowOffset += counters[k]; + } + } + return rowOffset; +} diff --git a/xfa/src/fxbarcode/src/BC_OnedEAN13Writer.cpp b/xfa/src/fxbarcode/src/BC_OnedEAN13Writer.cpp new file mode 100644 index 0000000000..e39a2dcad1 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_OnedEAN13Writer.cpp @@ -0,0 +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 "barcode.h" +#include "include/BC_Writer.h" +#include "include/BC_Reader.h" +#include "include/BC_OneDReader.h" +#include "include/BC_OneDimReader.h" +#include "include/BC_OneDimWriter.h" +#include "include/BC_OnedEAN13Reader.h" +#include "include/BC_OnedEAN13Writer.h" +CBC_OnedEAN13Writer::CBC_OnedEAN13Writer() +{ + m_bLeftPadding = TRUE; + m_codeWidth = 3 + + (7 * 6) + + 5 + + (7 * 6) + + 3; +} +CBC_OnedEAN13Writer::~CBC_OnedEAN13Writer() +{ +} +FX_BOOL CBC_OnedEAN13Writer::CheckContentValidity(FX_WSTR contents) +{ + for (FX_INT32 i = 0; i < contents.GetLength(); i++) { + if (contents.GetAt(i) >= '0' && contents.GetAt(i) <= '9') { + continue; + } else { + return FALSE; + } + } + return TRUE; +} +CFX_WideString CBC_OnedEAN13Writer::FilterContents(FX_WSTR contents) +{ + CFX_WideString filtercontents; + FX_WCHAR ch; + for (FX_INT32 i = 0; i < contents.GetLength(); i++) { + ch = contents.GetAt(i); + if(ch > 175) { + i++; + continue; + } + if (ch >= '0' && ch <= '9') { + filtercontents += ch; + } + } + return filtercontents; +} +FX_INT32 CBC_OnedEAN13Writer::CalcChecksum(const CFX_ByteString &contents) +{ + FX_INT32 odd = 0; + FX_INT32 even = 0; + FX_INT32 j = 1; + for(FX_INT32 i = contents.GetLength() - 1; i >= 0; i--) { + if(j % 2) { + odd += FXSYS_atoi(contents.Mid(i, 1)); + } else { + even += FXSYS_atoi(contents.Mid(i, 1)); + } + j++; + } + FX_INT32 checksum = (odd * 3 + even) % 10; + checksum = (10 - checksum) % 10; + return (checksum); +} +FX_BYTE *CBC_OnedEAN13Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) +{ + FX_BYTE *ret = Encode(contents, format, outWidth, outHeight, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return ret; +} +FX_BYTE *CBC_OnedEAN13Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) +{ + if(format != BCFORMAT_EAN_13) { + e = BCExceptionOnlyEncodeEAN_13; + } + FX_BYTE *ret = CBC_OneDimWriter::Encode(contents, format, outWidth, outHeight, hints, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return ret; +} +FX_BYTE *CBC_OnedEAN13Writer::Encode(const CFX_ByteString &contents, FX_INT32 &outLength, FX_INT32 &e) +{ + if (contents.GetLength() != 13) { + e = BCExceptionDigitLengthShould13; + return NULL; + } + m_iDataLenth = 13; + FX_INT32 firstDigit = FXSYS_atoi(contents.Mid(0, 1)); + FX_INT32 parities = CBC_OnedEAN13Reader::FIRST_DIGIT_ENCODINGS[firstDigit]; + outLength = m_codeWidth; + FX_BYTE *result = FX_Alloc(FX_BYTE, m_codeWidth); + FX_INT32 pos = 0; + pos += AppendPattern(result, pos, CBC_OneDimReader::START_END_PATTERN, 3, 1, e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + FX_INT32 i = 0; + for ( i = 1; i <= 6; i++) { + FX_INT32 digit = FXSYS_atoi(contents.Mid(i, 1)); + if ((parities >> (6 - i) & 1) == 1) { + digit += 10; + } + pos += AppendPattern(result, pos, CBC_OneDimReader::L_AND_G_PATTERNS[digit], 4, 0, e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + } + pos += AppendPattern(result, pos, CBC_OneDimReader::MIDDLE_PATTERN, 5, 0, e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + for (i = 7; i <= 12; i++) { + FX_INT32 digit = FXSYS_atoi(contents.Mid(i, 1)); + pos += AppendPattern(result, pos, CBC_OneDimReader::L_PATTERNS[digit], 4, 1, e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + } + pos += AppendPattern(result, pos, CBC_OneDimReader::START_END_PATTERN, 3, 1, e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + return result; +} +void CBC_OnedEAN13Writer::ShowChars(FX_WSTR contents, CFX_DIBitmap *pOutBitmap, CFX_RenderDevice* device, const CFX_Matrix* matrix, FX_INT32 barWidth, FX_INT32 multiple, FX_INT32 &e) +{ + if (device == NULL && pOutBitmap == NULL) { + e = BCExceptionIllegalArgument; + return; + } + FX_INT32 leftPadding = 7 * multiple; + FX_INT32 leftPosition = 3 * multiple + leftPadding; + CFX_ByteString str = FX_UTF8Encode(contents); + FX_INT32 iLen = str.GetLength(); + FXTEXT_CHARPOS* pCharPos = FX_Alloc(FXTEXT_CHARPOS, iLen); + if (!pCharPos) { + return; + } + FXSYS_memset32(pCharPos, 0, sizeof(FXTEXT_CHARPOS) * iLen); + CFX_FxgeDevice geBitmap; + if (pOutBitmap != NULL) { + geBitmap.Attach(pOutBitmap); + } + FX_INT32 iFontSize = (FX_INT32)fabs(m_fFontSize); + FX_INT32 iTextHeight = iFontSize + 1; + CFX_ByteString tempStr = str.Mid(1, 6); + FX_INT32 strWidth = multiple * 42; + if (pOutBitmap == NULL) { + CFX_Matrix matr(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0); + CFX_FloatRect rect((FX_FLOAT)leftPosition, (FX_FLOAT)(m_Height - iTextHeight), (FX_FLOAT)(leftPosition + strWidth - 0.5), (FX_FLOAT)m_Height); + matr.Concat(*matrix); + matr.TransformRect(rect); + FX_RECT re = rect.GetOutterRect(); + device->FillRect(&re, m_backgroundColor); + CFX_FloatRect rect1((FX_FLOAT)(leftPosition + 47 * multiple), (FX_FLOAT)(m_Height - iTextHeight), (FX_FLOAT)(leftPosition + 47 * multiple + strWidth - 0.5), (FX_FLOAT)m_Height); + CFX_Matrix matr1(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0); + matr1.Concat(*matrix); + matr1.TransformRect(rect1); + re = rect1.GetOutterRect(); + device->FillRect(&re, m_backgroundColor); + FX_INT32 strWidth1 = multiple * 7; + CFX_Matrix matr2(m_outputHScale, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f); + CFX_FloatRect rect2(0.0f, (FX_FLOAT)(m_Height - iTextHeight), (FX_FLOAT)strWidth1 - 0.5f, (FX_FLOAT)m_Height); + matr2.Concat(*matrix); + matr2.TransformRect(rect2); + re = rect2.GetOutterRect(); + device->FillRect(&re, m_backgroundColor); + } + FX_FLOAT blank = 0.0; + FX_FLOAT charsWidth = 0; + iLen = tempStr.GetLength(); + if (pOutBitmap == NULL) { + strWidth = (FX_INT32)(strWidth * m_outputHScale); + } + CalcTextInfo(tempStr, pCharPos + 1, m_pFont, (FX_FLOAT)strWidth, iFontSize, blank); + CFX_AffineMatrix affine_matrix(1.0, 0.0, 0.0, -1.0, 0.0, (FX_FLOAT)iFontSize); + CFX_FxgeDevice ge; + if (pOutBitmap != NULL) { + ge.Create(strWidth, iTextHeight, FXDIB_Argb); + FX_RECT rect(0, 0, strWidth, iTextHeight); + ge.FillRect(&rect, m_backgroundColor); + ge.DrawNormalText(iLen, + pCharPos + 1, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix, + m_fontColor, FXTEXT_CLEARTYPE); + geBitmap.SetDIBits(ge.GetBitmap(), leftPosition, m_Height - iTextHeight); + } else { + CFX_AffineMatrix affine_matrix1(1.0, 0.0, 0.0, -1.0, (FX_FLOAT)leftPosition * m_outputHScale, (FX_FLOAT)(m_Height - iTextHeight) + iFontSize); + if (matrix != NULL) { + affine_matrix1.Concat(*matrix); + } + device->DrawNormalText(iLen, + pCharPos + 1, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix1, + m_fontColor, FXTEXT_CLEARTYPE); + } + tempStr = str.Mid(7, 6); + iLen = tempStr.GetLength(); + charsWidth = 0.0f; + CalcTextInfo(tempStr, pCharPos + 7, m_pFont, (FX_FLOAT)strWidth, iFontSize, blank); + if(pOutBitmap != NULL) { + FX_RECT rect1(0, 0, strWidth, iTextHeight); + ge.FillRect(&rect1, m_backgroundColor); + ge.DrawNormalText(iLen, + pCharPos + 7, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix, + m_fontColor, FXTEXT_CLEARTYPE); + geBitmap.SetDIBits(ge.GetBitmap(), leftPosition + 47 * multiple, m_Height - iTextHeight); + } else { + CFX_AffineMatrix affine_matrix1(1.0, 0.0, 0.0, -1.0, (FX_FLOAT)(leftPosition + 47 * multiple) * m_outputHScale, (FX_FLOAT)(m_Height - iTextHeight + iFontSize)); + if (matrix != NULL) { + affine_matrix1.Concat(*matrix); + } + device->DrawNormalText(iLen, + pCharPos + 7, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix1, + m_fontColor, FXTEXT_CLEARTYPE); + } + tempStr = str.Mid(0, 1); + iLen = tempStr.GetLength(); + strWidth = multiple * 7; + if (pOutBitmap == NULL) { + strWidth = (FX_INT32)(strWidth * m_outputHScale); + } + CalcTextInfo(tempStr, pCharPos, m_pFont, (FX_FLOAT)strWidth, iFontSize, blank); + if(pOutBitmap != NULL) { + delete ge.GetBitmap(); + ge.Create(strWidth, iTextHeight, FXDIB_Argb); + ge.GetBitmap()->Clear(m_backgroundColor); + ge.DrawNormalText(iLen, + pCharPos, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix, + m_fontColor, FXTEXT_CLEARTYPE); + geBitmap.SetDIBits(ge.GetBitmap(), 0, m_Height - iTextHeight); + } else { + CFX_AffineMatrix affine_matrix1(1.0, 0.0, 0.0, -1.0, 0.0, (FX_FLOAT)(m_Height - iTextHeight + iFontSize)); + if (matrix != NULL) { + affine_matrix1.Concat(*matrix); + } + device->DrawNormalText(iLen, + pCharPos, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix1, + m_fontColor, FXTEXT_CLEARTYPE); + } + FX_Free(pCharPos); +} +void CBC_OnedEAN13Writer::RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e) +{ + CBC_OneDimWriter::RenderResult(contents, code, codeLength, isDevice, e); +} diff --git a/xfa/src/fxbarcode/src/BC_OnedEAN8Reader.cpp b/xfa/src/fxbarcode/src/BC_OnedEAN8Reader.cpp new file mode 100644 index 0000000000..833ff6d522 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_OnedEAN8Reader.cpp @@ -0,0 +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 + +#include "barcode.h" +#include "include/BC_Reader.h" +#include "include/BC_OneDReader.h" +#include "include/BC_OneDimReader.h" +#include "include/BC_CommonBitArray.h" +#include "include/BC_OnedEAN8Reader.h" +CBC_OnedEAN8Reader::CBC_OnedEAN8Reader() +{ +} +CBC_OnedEAN8Reader::~CBC_OnedEAN8Reader() +{ +} +FX_INT32 CBC_OnedEAN8Reader::DecodeMiddle(CBC_CommonBitArray *row, CFX_Int32Array *startRange, CFX_ByteString &resultResult, FX_INT32 &e) +{ + CFX_Int32Array counters; + counters.Add(0); + counters.Add(0); + counters.Add(0); + counters.Add(0); + FX_INT32 end = row->GetSize(); + FX_INT32 rowOffset = (*startRange)[1]; + FX_INT32 rowOffsetLeft = rowOffset; + for (FX_INT32 x = 0; x < 4 && rowOffset < end; x++) { + FX_INT32 bestMatch = DecodeDigit(row, &counters, rowOffset, &(CBC_OneDimReader::L_PATTERNS[0][0]), 10, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + resultResult += (FX_CHAR) ('0' + bestMatch); + for (FX_INT32 i = 0; i < counters.GetSize(); i++) { + rowOffset += counters[i]; + } + } + FX_INT32 RowOffsetLen = (rowOffset - rowOffsetLeft) / 4; + CFX_Int32Array result; + result.Add(CBC_OneDimReader::MIDDLE_PATTERN[0]); + result.Add(CBC_OneDimReader::MIDDLE_PATTERN[1]); + result.Add(CBC_OneDimReader::MIDDLE_PATTERN[2]); + result.Add(CBC_OneDimReader::MIDDLE_PATTERN[3]); + result.Add(CBC_OneDimReader::MIDDLE_PATTERN[4]); + CFX_Int32Array *middleRange = FindGuardPattern(row, rowOffset, TRUE, &result, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + FX_INT32 rowOffsetMid = rowOffset; + rowOffset = (*middleRange)[1]; + if((rowOffset - rowOffsetMid) > RowOffsetLen) { + e = BCExceptionNotFound; + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + } + if(middleRange != NULL) { + delete middleRange; + middleRange = NULL; + } + for (FX_INT32 y = 0; y < 4 && rowOffset < end; y++) { + FX_INT32 bestMatch = DecodeDigit(row, & counters, rowOffset, &(CBC_OneDimReader::L_PATTERNS[0][0]), 10, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + resultResult += (FX_CHAR) ('0' + bestMatch); + for (FX_INT32 i = 0; i < counters.GetSize(); i++) { + rowOffset += counters[i]; + } + } + return rowOffset; +} diff --git a/xfa/src/fxbarcode/src/BC_OnedEAN8Writer.cpp b/xfa/src/fxbarcode/src/BC_OnedEAN8Writer.cpp new file mode 100644 index 0000000000..5c7a50b9b1 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_OnedEAN8Writer.cpp @@ -0,0 +1,245 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_Writer.h" +#include "include/BC_Reader.h" +#include "include/BC_OneDReader.h" +#include "include/BC_OneDimWriter.h" +#include "include/BC_OneDimReader.h" +#include "include/BC_OnedEAN8Writer.h" +#include "include/BC_CommonBitMatrix.h" +CBC_OnedEAN8Writer::CBC_OnedEAN8Writer() +{ + m_iDataLenth = 8; + m_codeWidth = 3 + + (7 * 4) + + 5 + + (7 * 4) + + 3; +} +CBC_OnedEAN8Writer::~CBC_OnedEAN8Writer() +{ +} +void CBC_OnedEAN8Writer::SetDataLength(FX_INT32 length) +{ + m_iDataLenth = 8; +} +FX_BOOL CBC_OnedEAN8Writer::SetTextLocation(BC_TEXT_LOC location) +{ + if ( location == BC_TEXT_LOC_BELOWEMBED) { + m_locTextLoc = location; + return TRUE; + } + return FALSE; +} +FX_BOOL CBC_OnedEAN8Writer::CheckContentValidity(FX_WSTR contents) +{ + for (FX_INT32 i = 0; i < contents.GetLength(); i++) { + if (contents.GetAt(i) >= '0' && contents.GetAt(i) <= '9') { + continue; + } else { + return FALSE; + } + } + return TRUE; +} +CFX_WideString CBC_OnedEAN8Writer::FilterContents(FX_WSTR contents) +{ + CFX_WideString filtercontents; + FX_WCHAR ch; + for (FX_INT32 i = 0; i < contents.GetLength(); i++) { + ch = contents.GetAt(i); + if(ch > 175) { + i++; + continue; + } + if (ch >= '0' && ch <= '9') { + filtercontents += ch; + } + } + return filtercontents; +} +FX_INT32 CBC_OnedEAN8Writer::CalcChecksum(const CFX_ByteString &contents) +{ + FX_INT32 odd = 0; + FX_INT32 even = 0; + FX_INT32 j = 1; + for(FX_INT32 i = contents.GetLength() - 1; i >= 0; i--) { + if(j % 2) { + odd += FXSYS_atoi(contents.Mid(i, 1)); + } else { + even += FXSYS_atoi(contents.Mid(i, 1)); + } + j++; + } + FX_INT32 checksum = (odd * 3 + even) % 10; + checksum = (10 - checksum) % 10; + return (checksum); +} +FX_BYTE *CBC_OnedEAN8Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight , FX_INT32 &e) +{ + FX_BYTE *ret = Encode(contents, format, outWidth, outHeight, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return ret; +} +FX_BYTE *CBC_OnedEAN8Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, + FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints , FX_INT32 &e) +{ + if (format != BCFORMAT_EAN_8) { + e = BCExceptionOnlyEncodeEAN_8; + return NULL; + } + FX_BYTE *ret = CBC_OneDimWriter::Encode(contents, format, outWidth, outHeight, hints, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return ret; +} +FX_BYTE *CBC_OnedEAN8Writer::Encode(const CFX_ByteString &contents, FX_INT32 &outLength , FX_INT32 &e) +{ + if (contents.GetLength() != 8) { + e = BCExceptionDigitLengthMustBe8; + return NULL; + } + outLength = m_codeWidth; + FX_BYTE *result = FX_Alloc(FX_BYTE, m_codeWidth); + FX_INT32 pos = 0; + pos += AppendPattern(result, pos, CBC_OneDimReader::START_END_PATTERN, 3, 1, e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + FX_INT32 i = 0; + for (i = 0; i <= 3; i++) { + FX_INT32 digit = FXSYS_atoi(contents.Mid(i, 1)); + pos += AppendPattern(result, pos, CBC_OneDimReader::L_PATTERNS[digit], 4, 0, e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + } + pos += AppendPattern(result, pos, CBC_OneDimReader::MIDDLE_PATTERN, 5, 0, e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + for (i = 4; i <= 7; i++) { + FX_INT32 digit = FXSYS_atoi(contents.Mid(i, 1)); + pos += AppendPattern(result, pos, CBC_OneDimReader::L_PATTERNS[digit], 4, 1, e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + } + pos += AppendPattern(result, pos, CBC_OneDimReader::START_END_PATTERN, 3, 1, e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + return result; +} +void CBC_OnedEAN8Writer::ShowChars(FX_WSTR contents, CFX_DIBitmap *pOutBitmap, CFX_RenderDevice* device, const CFX_Matrix* matrix, FX_INT32 barWidth, FX_INT32 multiple, FX_INT32 &e) +{ + if (device == NULL && pOutBitmap == NULL) { + e = BCExceptionIllegalArgument; + return; + } + FX_INT32 leftPosition = 3 * multiple; + CFX_ByteString str = FX_UTF8Encode(contents); + FX_INT32 iLength = str.GetLength(); + FXTEXT_CHARPOS* pCharPos = FX_Alloc(FXTEXT_CHARPOS, iLength); + if (!pCharPos) { + return; + } + FXSYS_memset32(pCharPos, 0, sizeof(FXTEXT_CHARPOS) * iLength); + CFX_ByteString tempStr = str.Mid(0, 4); + FX_INT32 iLen = tempStr.GetLength(); + FX_INT32 strWidth = 7 * multiple * 4; + FX_FLOAT blank = 0.0; + CFX_FxgeDevice geBitmap; + if (pOutBitmap != NULL) { + geBitmap.Attach(pOutBitmap); + } + FX_FLOAT charsWidth = 0; + FX_INT32 iFontSize = (FX_INT32)fabs(m_fFontSize); + FX_INT32 iTextHeight = iFontSize + 1; + if (pOutBitmap == NULL) { + CFX_Matrix matr(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0); + CFX_FloatRect rect((FX_FLOAT)leftPosition, (FX_FLOAT)(m_Height - iTextHeight), (FX_FLOAT)(leftPosition + strWidth - 0.5), (FX_FLOAT)m_Height); + matr.Concat(*matrix); + matr.TransformRect(rect); + FX_RECT re = rect.GetOutterRect(); + device->FillRect(&re, m_backgroundColor); + CFX_Matrix matr1(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0); + CFX_FloatRect rect1((FX_FLOAT)(leftPosition + 33 * multiple), (FX_FLOAT)(m_Height - iTextHeight), (FX_FLOAT)(leftPosition + 33 * multiple + strWidth - 0.5), (FX_FLOAT)m_Height); + matr1.Concat(*matrix); + matr1.TransformRect(rect1); + re = rect1.GetOutterRect(); + device->FillRect(&re, m_backgroundColor); + } + if (pOutBitmap == NULL) { + strWidth = (FX_INT32)(strWidth * m_outputHScale); + } + CalcTextInfo(tempStr, pCharPos, m_pFont, (FX_FLOAT)strWidth, iFontSize, blank); + CFX_AffineMatrix affine_matrix(1.0, 0.0, 0.0, -1.0, 0.0, (FX_FLOAT)iFontSize); + CFX_FxgeDevice ge; + if (pOutBitmap != NULL) { + delete ge.GetBitmap(); + ge.Create(strWidth, iTextHeight, FXDIB_Argb); + ge.GetBitmap()->Clear(m_backgroundColor); + ge.DrawNormalText(iLen, + pCharPos, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix, + m_fontColor, FXTEXT_CLEARTYPE); + geBitmap.SetDIBits(ge.GetBitmap(), leftPosition, m_Height - iTextHeight); + } else { + CFX_AffineMatrix affine_matrix1(1.0, 0.0, 0.0, -1.0, (FX_FLOAT)leftPosition * m_outputHScale, (FX_FLOAT)(m_Height - iTextHeight + iFontSize)); + affine_matrix1.Concat(*matrix); + FX_BOOL ret = device->DrawNormalText(iLen, + pCharPos, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize, + (CFX_AffineMatrix *) &affine_matrix1, + m_fontColor, FXTEXT_CLEARTYPE); + } + tempStr = str.Mid(4, 4); + iLen = tempStr.GetLength(); + charsWidth = 0.0f; + CalcTextInfo(tempStr, pCharPos + 4, m_pFont, (FX_FLOAT)strWidth, iFontSize, blank); + if (pOutBitmap != NULL) { + delete ge.GetBitmap(); + ge.Create(strWidth, iTextHeight, FXDIB_Argb); + ge.GetBitmap()->Clear(m_backgroundColor); + ge.DrawNormalText(iLen, + pCharPos + 4, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix, + m_fontColor, FXTEXT_CLEARTYPE); + geBitmap.SetDIBits(ge.GetBitmap(), leftPosition + 33 * multiple, m_Height - iTextHeight); + } else { + CFX_AffineMatrix affine_matrix1(1.0, 0.0, 0.0, -1.0, (FX_FLOAT)(leftPosition + 33 * multiple) * m_outputHScale, (FX_FLOAT)(m_Height - iTextHeight + iFontSize)); + if (matrix != NULL) { + affine_matrix1.Concat(*matrix); + } + FX_BOOL ret = device->DrawNormalText(iLen, + pCharPos + 4, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix1, + m_fontColor, FXTEXT_CLEARTYPE); + } + FX_Free(pCharPos); +} +void CBC_OnedEAN8Writer::RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e) +{ + CBC_OneDimWriter::RenderResult(contents, code, codeLength, isDevice, e); +} diff --git a/xfa/src/fxbarcode/src/BC_OnedUPCAReader.cpp b/xfa/src/fxbarcode/src/BC_OnedUPCAReader.cpp new file mode 100644 index 0000000000..09c991668f --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_OnedUPCAReader.cpp @@ -0,0 +1,76 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_Reader.h" +#include "include/BC_OneDReader.h" +#include "include/BC_OneDimReader.h" +#include "include/BC_OnedEAN13Reader.h" +#include "include/BC_OnedUPCAReader.h" +CBC_OnedUPCAReader::CBC_OnedUPCAReader() +{ + m_ean13Reader = NULL; +} +void CBC_OnedUPCAReader::Init() +{ + m_ean13Reader = FX_NEW CBC_OnedEAN13Reader; +} +CBC_OnedUPCAReader::~CBC_OnedUPCAReader() +{ + if(m_ean13Reader != NULL) { + delete m_ean13Reader; + } + m_ean13Reader = NULL; +} +CFX_ByteString CBC_OnedUPCAReader::DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e) +{ + CFX_ByteString bytestring = m_ean13Reader->DecodeRow(rowNumber, row, hints, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + CFX_ByteString temp = MaybeReturnResult(bytestring, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + return temp; +} +CFX_ByteString CBC_OnedUPCAReader::DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, CFX_Int32Array *startGuardRange, FX_INT32 hints, FX_INT32 &e) +{ + CFX_ByteString bytestring = m_ean13Reader->DecodeRow(rowNumber, row, startGuardRange, hints, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + CFX_ByteString temp = MaybeReturnResult(bytestring, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + return temp; +} +CFX_ByteString CBC_OnedUPCAReader::Decode(CBC_BinaryBitmap *image, FX_INT32 &e) +{ + CFX_ByteString bytestring = m_ean13Reader->Decode(image, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + CFX_ByteString temp = MaybeReturnResult(bytestring, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + return temp; +} +CFX_ByteString CBC_OnedUPCAReader::Decode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e) +{ + CFX_ByteString bytestring = m_ean13Reader->Decode(image, hints, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + CFX_ByteString temp = MaybeReturnResult(bytestring, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + return temp; +} +FX_INT32 CBC_OnedUPCAReader::DecodeMiddle(CBC_CommonBitArray *row, CFX_Int32Array *startRange, CFX_ByteString &resultString, FX_INT32 &e) +{ + FX_INT32 temp = m_ean13Reader->DecodeMiddle(row, startRange, resultString, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + return temp; +} +CFX_ByteString CBC_OnedUPCAReader::MaybeReturnResult(CFX_ByteString &result, FX_INT32 &e) +{ + if(result[0] == '0') { + result.Delete(0); + return result; + } else { + e = BCExceptionFormatException; + return ""; + } + return ""; +} diff --git a/xfa/src/fxbarcode/src/BC_OnedUPCAWriter.cpp b/xfa/src/fxbarcode/src/BC_OnedUPCAWriter.cpp new file mode 100644 index 0000000000..b28dee7237 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_OnedUPCAWriter.cpp @@ -0,0 +1,269 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_Writer.h" +#include "include/BC_OneDimWriter.h" +#include "include/BC_OnedEAN13Writer.h" +#include "include/BC_OnedUPCAWriter.h" +CBC_OnedUPCAWriter::CBC_OnedUPCAWriter() +{ + m_subWriter = NULL; + m_bLeftPadding = TRUE; + m_bRightPadding = TRUE; +} +void CBC_OnedUPCAWriter::Init() +{ + m_subWriter = FX_NEW CBC_OnedEAN13Writer; +} +CBC_OnedUPCAWriter::~CBC_OnedUPCAWriter() +{ + if(m_subWriter != NULL) { + delete m_subWriter; + } + m_subWriter = NULL; +} +FX_BOOL CBC_OnedUPCAWriter::CheckContentValidity(FX_WSTR contents) +{ + FX_INT32 i = 0; + for (i = 0; i < contents.GetLength(); i++) { + if (contents.GetAt(i) >= '0' && contents.GetAt(i) <= '9') { + continue; + } else { + return FALSE; + } + } + return TRUE; +} +CFX_WideString CBC_OnedUPCAWriter::FilterContents(FX_WSTR contents) +{ + CFX_WideString filtercontents; + FX_WCHAR ch; + for (FX_INT32 i = 0; i < contents.GetLength(); i++) { + ch = contents.GetAt(i); + if(ch > 175) { + i++; + continue; + } + if (ch >= '0' && ch <= '9') { + filtercontents += ch; + } + } + return filtercontents; +} +FX_INT32 CBC_OnedUPCAWriter::CalcChecksum(const CFX_ByteString &contents) +{ + FX_INT32 odd = 0; + FX_INT32 even = 0; + FX_INT32 j = 1; + for(FX_INT32 i = contents.GetLength() - 1; i >= 0; i--) { + if(j % 2) { + odd += FXSYS_atoi(contents.Mid(i, 1)); + } else { + even += FXSYS_atoi(contents.Mid(i, 1)); + } + j++; + } + FX_INT32 checksum = (odd * 3 + even) % 10; + checksum = (10 - checksum) % 10; + return (checksum); +} +FX_BYTE *CBC_OnedUPCAWriter::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) +{ + FX_BYTE *ret = Encode(contents, format, outWidth, outHeight, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return ret; +} +FX_BYTE *CBC_OnedUPCAWriter::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) +{ + if (format != BCFORMAT_UPC_A) { + e = BCExceptionOnlyEncodeUPC_A; + return NULL; + } + CFX_ByteString toEAN13String = '0' + contents; + m_iDataLenth = 13; + FX_BYTE *ret = m_subWriter->Encode(toEAN13String, BCFORMAT_EAN_13, outWidth, outHeight, hints, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return ret; +} +void CBC_OnedUPCAWriter::ShowChars(FX_WSTR contents, CFX_DIBitmap *pOutBitmap, CFX_RenderDevice* device, const CFX_Matrix* matrix, FX_INT32 barWidth, FX_INT32 multiple, FX_INT32 &e) +{ + if (device == NULL && pOutBitmap == NULL) { + e = BCExceptionIllegalArgument; + return; + } + FX_INT32 leftPadding = 7 * multiple; + FX_INT32 leftPosition = 10 * multiple + leftPadding; + CFX_ByteString str = FX_UTF8Encode(contents); + FX_INT32 iLen = str.GetLength(); + FXTEXT_CHARPOS* pCharPos = FX_Alloc(FXTEXT_CHARPOS, iLen); + if (!pCharPos) { + return; + } + FXSYS_memset32(pCharPos, 0, sizeof(FXTEXT_CHARPOS) * iLen); + CFX_ByteString tempStr = str.Mid(1, 5); + FX_FLOAT strWidth = (FX_FLOAT)35 * multiple; + FX_FLOAT blank = 0.0; + CFX_FxgeDevice geBitmap; + if (pOutBitmap != NULL) { + geBitmap.Attach(pOutBitmap); + } + FX_FLOAT charsWidth = 0; + iLen = tempStr.GetLength(); + FX_INT32 iFontSize = (FX_INT32)fabs(m_fFontSize); + FX_INT32 iTextHeight = iFontSize + 1; + if (pOutBitmap == NULL) { + CFX_Matrix matr(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0); + CFX_FloatRect rect((FX_FLOAT)leftPosition, (FX_FLOAT)(m_Height - iTextHeight), (FX_FLOAT)(leftPosition + strWidth - 0.5), (FX_FLOAT)m_Height); + matr.Concat(*matrix); + matr.TransformRect(rect); + FX_RECT re = rect.GetOutterRect(); + device->FillRect(&re, m_backgroundColor); + CFX_Matrix matr1(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0); + CFX_FloatRect rect1((FX_FLOAT)(leftPosition + 40 * multiple), (FX_FLOAT)(m_Height - iTextHeight), (FX_FLOAT)((leftPosition + 40 * multiple) + strWidth - 0.5), (FX_FLOAT)m_Height); + matr1.Concat(*matrix); + matr1.TransformRect(rect1); + re = rect1.GetOutterRect(); + device->FillRect(&re, m_backgroundColor); + FX_FLOAT strWidth1 = (FX_FLOAT)multiple * 7; + CFX_Matrix matr2(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0); + CFX_FloatRect rect2(0.0, (FX_FLOAT)(m_Height - iTextHeight), (FX_FLOAT)strWidth1 - 1, (FX_FLOAT)m_Height); + matr2.Concat(*matrix); + matr2.TransformRect(rect2); + re = rect2.GetOutterRect(); + device->FillRect(&re, m_backgroundColor); + CFX_Matrix matr3(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0); + CFX_FloatRect rect3((FX_FLOAT)(leftPosition + 85 * multiple), (FX_FLOAT)(m_Height - iTextHeight), (FX_FLOAT)((leftPosition + 85 * multiple) + strWidth1 - 0.5), (FX_FLOAT)m_Height); + matr3.Concat(*matrix); + matr3.TransformRect(rect3); + re = rect3.GetOutterRect(); + device->FillRect(&re, m_backgroundColor); + } + if (pOutBitmap == NULL) { + strWidth = strWidth * m_outputHScale; + } + CalcTextInfo(tempStr, pCharPos + 1, m_pFont, strWidth, iFontSize, blank); + CFX_AffineMatrix affine_matrix(1.0, 0.0, 0.0, -1.0, 0.0, (FX_FLOAT)iFontSize); + CFX_FxgeDevice ge; + if(pOutBitmap != NULL) { + ge.Create((int)strWidth, iTextHeight, FXDIB_Argb); + ge.GetBitmap()->Clear(m_backgroundColor); + ge.DrawNormalText(iLen, + pCharPos + 1, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix, + m_fontColor, FXTEXT_CLEARTYPE); + geBitmap.SetDIBits(ge.GetBitmap(), leftPosition, m_Height - iTextHeight); + } else { + CFX_AffineMatrix affine_matrix1(1.0, 0.0, 0.0, -1.0, (FX_FLOAT)leftPosition * m_outputHScale, (FX_FLOAT)(m_Height - iTextHeight + iFontSize)); + if (matrix != NULL) { + affine_matrix1.Concat(*matrix); + } + device->DrawNormalText(iLen, + pCharPos + 1, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix1, + m_fontColor, FXTEXT_CLEARTYPE); + } + tempStr = str.Mid(6, 5); + iLen = tempStr.GetLength(); + charsWidth = 0.0f; + CalcTextInfo(tempStr, pCharPos + 6, m_pFont, strWidth, iFontSize, blank); + if(pOutBitmap != NULL) { + FX_RECT rect2(0, 0, (int)strWidth, iTextHeight); + ge.FillRect(&rect2, m_backgroundColor); + ge.DrawNormalText(iLen, + pCharPos + 6, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix, + m_fontColor, FXTEXT_CLEARTYPE); + geBitmap.SetDIBits(ge.GetBitmap(), leftPosition + 40 * multiple, m_Height - iTextHeight); + } else { + CFX_AffineMatrix affine_matrix1(1.0, 0.0, 0.0, -1.0, (FX_FLOAT)(leftPosition + 40 * multiple) * m_outputHScale, (FX_FLOAT)(m_Height - iTextHeight + iFontSize)); + if (matrix != NULL) { + affine_matrix1.Concat(*matrix); + } + device->DrawNormalText(iLen, + pCharPos + 6, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix1, + m_fontColor, FXTEXT_CLEARTYPE); + } + tempStr = str.Mid(0, 1); + iLen = tempStr.GetLength(); + strWidth = (FX_FLOAT)multiple * 7; + if (pOutBitmap == NULL) { + strWidth = strWidth * m_outputHScale; + } + CalcTextInfo(tempStr, pCharPos, m_pFont, strWidth, iFontSize, blank); + if(pOutBitmap != NULL) { + delete ge.GetBitmap(); + ge.Create((int)strWidth, iTextHeight, FXDIB_Argb); + ge.GetBitmap()->Clear(m_backgroundColor); + ge.DrawNormalText(iLen, + pCharPos, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix, + m_fontColor, FXTEXT_CLEARTYPE); + geBitmap.SetDIBits(ge.GetBitmap(), 0, m_Height - iTextHeight); + } else { + CFX_AffineMatrix affine_matrix1(1.0, 0.0, 0.0, -1.0, 0, (FX_FLOAT)(m_Height - iTextHeight + iFontSize)); + if (matrix != NULL) { + affine_matrix1.Concat(*matrix); + } + device->DrawNormalText(iLen, + pCharPos, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix1, + m_fontColor, FXTEXT_CLEARTYPE); + } + tempStr = str.Mid(11, 1); + iLen = tempStr.GetLength(); + CalcTextInfo(tempStr, pCharPos + 11, m_pFont, strWidth, iFontSize, blank); + if (pOutBitmap != NULL) { + delete ge.GetBitmap(); + ge.Create((int)strWidth, iTextHeight, FXDIB_Argb); + ge.GetBitmap()->Clear(m_backgroundColor); + ge.DrawNormalText(iLen, + pCharPos + 11, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix, + m_fontColor, FXTEXT_CLEARTYPE); + geBitmap.SetDIBits(ge.GetBitmap(), leftPosition + 85 * multiple, m_Height - iTextHeight); + } else { + CFX_AffineMatrix affine_matrix1(1.0, 0.0, 0.0, -1.0, (FX_FLOAT)(leftPosition + 85 * multiple) * m_outputHScale, (FX_FLOAT)(m_Height - iTextHeight + iFontSize)); + if (matrix != NULL) { + affine_matrix1.Concat(*matrix); + } + device->DrawNormalText(iLen, + pCharPos + 11, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix1, + m_fontColor, FXTEXT_CLEARTYPE); + } + FX_Free(pCharPos); +} +void CBC_OnedUPCAWriter::RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e) +{ + CBC_OneDimWriter::RenderResult(contents, code, codeLength, isDevice, e); +} + diff --git a/xfa/src/fxbarcode/src/BC_PDF417.cpp b/xfa/src/fxbarcode/src/BC_PDF417.cpp new file mode 100644 index 0000000000..af6cec7b7a --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_PDF417.cpp @@ -0,0 +1,676 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_PDF417Compaction.h" +#include "include/BC_PDF417BarcodeRow.h" +#include "include/BC_PDF417BarcodeMatrix.h" +#include "include/BC_PDF417ErrorCorrection.h" +#include "include/BC_PDF417HighLevelEncoder.h" +#include "include/BC_PDF417.h" +FX_INT32 CBC_PDF417::START_PATTERN = 0x1fea8; +FX_INT32 CBC_PDF417::STOP_PATTERN = 0x3fa29; +FX_INT32 CBC_PDF417::CODEWORD_TABLE[][1000] = { + { + 0x1d5c0, 0x1eaf0, 0x1f57c, 0x1d4e0, 0x1ea78, 0x1f53e, + 0x1a8c0, 0x1d470, 0x1a860, 0x15040, 0x1a830, 0x15020, + 0x1adc0, 0x1d6f0, 0x1eb7c, 0x1ace0, 0x1d678, 0x1eb3e, + 0x158c0, 0x1ac70, 0x15860, 0x15dc0, 0x1aef0, 0x1d77c, + 0x15ce0, 0x1ae78, 0x1d73e, 0x15c70, 0x1ae3c, 0x15ef0, + 0x1af7c, 0x15e78, 0x1af3e, 0x15f7c, 0x1f5fa, 0x1d2e0, + 0x1e978, 0x1f4be, 0x1a4c0, 0x1d270, 0x1e93c, 0x1a460, + 0x1d238, 0x14840, 0x1a430, 0x1d21c, 0x14820, 0x1a418, + 0x14810, 0x1a6e0, 0x1d378, 0x1e9be, 0x14cc0, 0x1a670, + 0x1d33c, 0x14c60, 0x1a638, 0x1d31e, 0x14c30, 0x1a61c, + 0x14ee0, 0x1a778, 0x1d3be, 0x14e70, 0x1a73c, 0x14e38, + 0x1a71e, 0x14f78, 0x1a7be, 0x14f3c, 0x14f1e, 0x1a2c0, + 0x1d170, 0x1e8bc, 0x1a260, 0x1d138, 0x1e89e, 0x14440, + 0x1a230, 0x1d11c, 0x14420, 0x1a218, 0x14410, 0x14408, + 0x146c0, 0x1a370, 0x1d1bc, 0x14660, 0x1a338, 0x1d19e, + 0x14630, 0x1a31c, 0x14618, 0x1460c, 0x14770, 0x1a3bc, + 0x14738, 0x1a39e, 0x1471c, 0x147bc, 0x1a160, 0x1d0b8, + 0x1e85e, 0x14240, 0x1a130, 0x1d09c, 0x14220, 0x1a118, + 0x1d08e, 0x14210, 0x1a10c, 0x14208, 0x1a106, 0x14360, + 0x1a1b8, 0x1d0de, 0x14330, 0x1a19c, 0x14318, 0x1a18e, + 0x1430c, 0x14306, 0x1a1de, 0x1438e, 0x14140, 0x1a0b0, + 0x1d05c, 0x14120, 0x1a098, 0x1d04e, 0x14110, 0x1a08c, + 0x14108, 0x1a086, 0x14104, 0x141b0, 0x14198, 0x1418c, + 0x140a0, 0x1d02e, 0x1a04c, 0x1a046, 0x14082, 0x1cae0, + 0x1e578, 0x1f2be, 0x194c0, 0x1ca70, 0x1e53c, 0x19460, + 0x1ca38, 0x1e51e, 0x12840, 0x19430, 0x12820, 0x196e0, + 0x1cb78, 0x1e5be, 0x12cc0, 0x19670, 0x1cb3c, 0x12c60, + 0x19638, 0x12c30, 0x12c18, 0x12ee0, 0x19778, 0x1cbbe, + 0x12e70, 0x1973c, 0x12e38, 0x12e1c, 0x12f78, 0x197be, + 0x12f3c, 0x12fbe, 0x1dac0, 0x1ed70, 0x1f6bc, 0x1da60, + 0x1ed38, 0x1f69e, 0x1b440, 0x1da30, 0x1ed1c, 0x1b420, + 0x1da18, 0x1ed0e, 0x1b410, 0x1da0c, 0x192c0, 0x1c970, + 0x1e4bc, 0x1b6c0, 0x19260, 0x1c938, 0x1e49e, 0x1b660, + 0x1db38, 0x1ed9e, 0x16c40, 0x12420, 0x19218, 0x1c90e, + 0x16c20, 0x1b618, 0x16c10, 0x126c0, 0x19370, 0x1c9bc, + 0x16ec0, 0x12660, 0x19338, 0x1c99e, 0x16e60, 0x1b738, + 0x1db9e, 0x16e30, 0x12618, 0x16e18, 0x12770, 0x193bc, + 0x16f70, 0x12738, 0x1939e, 0x16f38, 0x1b79e, 0x16f1c, + 0x127bc, 0x16fbc, 0x1279e, 0x16f9e, 0x1d960, 0x1ecb8, + 0x1f65e, 0x1b240, 0x1d930, 0x1ec9c, 0x1b220, 0x1d918, + 0x1ec8e, 0x1b210, 0x1d90c, 0x1b208, 0x1b204, 0x19160, + 0x1c8b8, 0x1e45e, 0x1b360, 0x19130, 0x1c89c, 0x16640, + 0x12220, 0x1d99c, 0x1c88e, 0x16620, 0x12210, 0x1910c, + 0x16610, 0x1b30c, 0x19106, 0x12204, 0x12360, 0x191b8, + 0x1c8de, 0x16760, 0x12330, 0x1919c, 0x16730, 0x1b39c, + 0x1918e, 0x16718, 0x1230c, 0x12306, 0x123b8, 0x191de, + 0x167b8, 0x1239c, 0x1679c, 0x1238e, 0x1678e, 0x167de, + 0x1b140, 0x1d8b0, 0x1ec5c, 0x1b120, 0x1d898, 0x1ec4e, + 0x1b110, 0x1d88c, 0x1b108, 0x1d886, 0x1b104, 0x1b102, + 0x12140, 0x190b0, 0x1c85c, 0x16340, 0x12120, 0x19098, + 0x1c84e, 0x16320, 0x1b198, 0x1d8ce, 0x16310, 0x12108, + 0x19086, 0x16308, 0x1b186, 0x16304, 0x121b0, 0x190dc, + 0x163b0, 0x12198, 0x190ce, 0x16398, 0x1b1ce, 0x1638c, + 0x12186, 0x16386, 0x163dc, 0x163ce, 0x1b0a0, 0x1d858, + 0x1ec2e, 0x1b090, 0x1d84c, 0x1b088, 0x1d846, 0x1b084, + 0x1b082, 0x120a0, 0x19058, 0x1c82e, 0x161a0, 0x12090, + 0x1904c, 0x16190, 0x1b0cc, 0x19046, 0x16188, 0x12084, + 0x16184, 0x12082, 0x120d8, 0x161d8, 0x161cc, 0x161c6, + 0x1d82c, 0x1d826, 0x1b042, 0x1902c, 0x12048, 0x160c8, + 0x160c4, 0x160c2, 0x18ac0, 0x1c570, 0x1e2bc, 0x18a60, + 0x1c538, 0x11440, 0x18a30, 0x1c51c, 0x11420, 0x18a18, + 0x11410, 0x11408, 0x116c0, 0x18b70, 0x1c5bc, 0x11660, + 0x18b38, 0x1c59e, 0x11630, 0x18b1c, 0x11618, 0x1160c, + 0x11770, 0x18bbc, 0x11738, 0x18b9e, 0x1171c, 0x117bc, + 0x1179e, 0x1cd60, 0x1e6b8, 0x1f35e, 0x19a40, 0x1cd30, + 0x1e69c, 0x19a20, 0x1cd18, 0x1e68e, 0x19a10, 0x1cd0c, + 0x19a08, 0x1cd06, 0x18960, 0x1c4b8, 0x1e25e, 0x19b60, + 0x18930, 0x1c49c, 0x13640, 0x11220, 0x1cd9c, 0x1c48e, + 0x13620, 0x19b18, 0x1890c, 0x13610, 0x11208, 0x13608, + 0x11360, 0x189b8, 0x1c4de, 0x13760, 0x11330, 0x1cdde, + 0x13730, 0x19b9c, 0x1898e, 0x13718, 0x1130c, 0x1370c, + 0x113b8, 0x189de, 0x137b8, 0x1139c, 0x1379c, 0x1138e, + 0x113de, 0x137de, 0x1dd40, 0x1eeb0, 0x1f75c, 0x1dd20, + 0x1ee98, 0x1f74e, 0x1dd10, 0x1ee8c, 0x1dd08, 0x1ee86, + 0x1dd04, 0x19940, 0x1ccb0, 0x1e65c, 0x1bb40, 0x19920, + 0x1eedc, 0x1e64e, 0x1bb20, 0x1dd98, 0x1eece, 0x1bb10, + 0x19908, 0x1cc86, 0x1bb08, 0x1dd86, 0x19902, 0x11140, + 0x188b0, 0x1c45c, 0x13340, 0x11120, 0x18898, 0x1c44e, + 0x17740, 0x13320, 0x19998, 0x1ccce, 0x17720, 0x1bb98, + 0x1ddce, 0x18886, 0x17710, 0x13308, 0x19986, 0x17708, + 0x11102, 0x111b0, 0x188dc, 0x133b0, 0x11198, 0x188ce, + 0x177b0, 0x13398, 0x199ce, 0x17798, 0x1bbce, 0x11186, + 0x13386, 0x111dc, 0x133dc, 0x111ce, 0x177dc, 0x133ce, + 0x1dca0, 0x1ee58, 0x1f72e, 0x1dc90, 0x1ee4c, 0x1dc88, + 0x1ee46, 0x1dc84, 0x1dc82, 0x198a0, 0x1cc58, 0x1e62e, + 0x1b9a0, 0x19890, 0x1ee6e, 0x1b990, 0x1dccc, 0x1cc46, + 0x1b988, 0x19884, 0x1b984, 0x19882, 0x1b982, 0x110a0, + 0x18858, 0x1c42e, 0x131a0, 0x11090, 0x1884c, 0x173a0, + 0x13190, 0x198cc, 0x18846, 0x17390, 0x1b9cc, 0x11084, + 0x17388, 0x13184, 0x11082, 0x13182, 0x110d8, 0x1886e, + 0x131d8, 0x110cc, 0x173d8, 0x131cc, 0x110c6, 0x173cc, + 0x131c6, 0x110ee, 0x173ee, 0x1dc50, 0x1ee2c, 0x1dc48, + 0x1ee26, 0x1dc44, 0x1dc42, 0x19850, 0x1cc2c, 0x1b8d0, + 0x19848, 0x1cc26, 0x1b8c8, 0x1dc66, 0x1b8c4, 0x19842, + 0x1b8c2, 0x11050, 0x1882c, 0x130d0, 0x11048, 0x18826, + 0x171d0, 0x130c8, 0x19866, 0x171c8, 0x1b8e6, 0x11042, + 0x171c4, 0x130c2, 0x171c2, 0x130ec, 0x171ec, 0x171e6, + 0x1ee16, 0x1dc22, 0x1cc16, 0x19824, 0x19822, 0x11028, + 0x13068, 0x170e8, 0x11022, 0x13062, 0x18560, 0x10a40, + 0x18530, 0x10a20, 0x18518, 0x1c28e, 0x10a10, 0x1850c, + 0x10a08, 0x18506, 0x10b60, 0x185b8, 0x1c2de, 0x10b30, + 0x1859c, 0x10b18, 0x1858e, 0x10b0c, 0x10b06, 0x10bb8, + 0x185de, 0x10b9c, 0x10b8e, 0x10bde, 0x18d40, 0x1c6b0, + 0x1e35c, 0x18d20, 0x1c698, 0x18d10, 0x1c68c, 0x18d08, + 0x1c686, 0x18d04, 0x10940, 0x184b0, 0x1c25c, 0x11b40, + 0x10920, 0x1c6dc, 0x1c24e, 0x11b20, 0x18d98, 0x1c6ce, + 0x11b10, 0x10908, 0x18486, 0x11b08, 0x18d86, 0x10902, + 0x109b0, 0x184dc, 0x11bb0, 0x10998, 0x184ce, 0x11b98, + 0x18dce, 0x11b8c, 0x10986, 0x109dc, 0x11bdc, 0x109ce, + 0x11bce, 0x1cea0, 0x1e758, 0x1f3ae, 0x1ce90, 0x1e74c, + 0x1ce88, 0x1e746, 0x1ce84, 0x1ce82, 0x18ca0, 0x1c658, + 0x19da0, 0x18c90, 0x1c64c, 0x19d90, 0x1cecc, 0x1c646, + 0x19d88, 0x18c84, 0x19d84, 0x18c82, 0x19d82, 0x108a0, + 0x18458, 0x119a0, 0x10890, 0x1c66e, 0x13ba0, 0x11990, + 0x18ccc, 0x18446, 0x13b90, 0x19dcc, 0x10884, 0x13b88, + 0x11984, 0x10882, 0x11982, 0x108d8, 0x1846e, 0x119d8, + 0x108cc, 0x13bd8, 0x119cc, 0x108c6, 0x13bcc, 0x119c6, + 0x108ee, 0x119ee, 0x13bee, 0x1ef50, 0x1f7ac, 0x1ef48, + 0x1f7a6, 0x1ef44, 0x1ef42, 0x1ce50, 0x1e72c, 0x1ded0, + 0x1ef6c, 0x1e726, 0x1dec8, 0x1ef66, 0x1dec4, 0x1ce42, + 0x1dec2, 0x18c50, 0x1c62c, 0x19cd0, 0x18c48, 0x1c626, + 0x1bdd0, 0x19cc8, 0x1ce66, 0x1bdc8, 0x1dee6, 0x18c42, + 0x1bdc4, 0x19cc2, 0x1bdc2, 0x10850, 0x1842c, 0x118d0, + 0x10848, 0x18426, 0x139d0, 0x118c8, 0x18c66, 0x17bd0, + 0x139c8, 0x19ce6, 0x10842, 0x17bc8, 0x1bde6, 0x118c2, + 0x17bc4, 0x1086c, 0x118ec, 0x10866, 0x139ec, 0x118e6, + 0x17bec, 0x139e6, 0x17be6, 0x1ef28, 0x1f796, 0x1ef24, + 0x1ef22, 0x1ce28, 0x1e716, 0x1de68, 0x1ef36, 0x1de64, + 0x1ce22, 0x1de62, 0x18c28, 0x1c616, 0x19c68, 0x18c24, + 0x1bce8, 0x19c64, 0x18c22, 0x1bce4, 0x19c62, 0x1bce2, + 0x10828, 0x18416, 0x11868, 0x18c36, 0x138e8, 0x11864, + 0x10822, 0x179e8, 0x138e4, 0x11862, 0x179e4, 0x138e2, + 0x179e2, 0x11876, 0x179f6, 0x1ef12, 0x1de34, 0x1de32, + 0x19c34, 0x1bc74, 0x1bc72, 0x11834, 0x13874, 0x178f4, + 0x178f2, 0x10540, 0x10520, 0x18298, 0x10510, 0x10508, + 0x10504, 0x105b0, 0x10598, 0x1058c, 0x10586, 0x105dc, + 0x105ce, 0x186a0, 0x18690, 0x1c34c, 0x18688, 0x1c346, + 0x18684, 0x18682, 0x104a0, 0x18258, 0x10da0, 0x186d8, + 0x1824c, 0x10d90, 0x186cc, 0x10d88, 0x186c6, 0x10d84, + 0x10482, 0x10d82, 0x104d8, 0x1826e, 0x10dd8, 0x186ee, + 0x10dcc, 0x104c6, 0x10dc6, 0x104ee, 0x10dee, 0x1c750, + 0x1c748, 0x1c744, 0x1c742, 0x18650, 0x18ed0, 0x1c76c, + 0x1c326, 0x18ec8, 0x1c766, 0x18ec4, 0x18642, 0x18ec2, + 0x10450, 0x10cd0, 0x10448, 0x18226, 0x11dd0, 0x10cc8, + 0x10444, 0x11dc8, 0x10cc4, 0x10442, 0x11dc4, 0x10cc2, + 0x1046c, 0x10cec, 0x10466, 0x11dec, 0x10ce6, 0x11de6, + 0x1e7a8, 0x1e7a4, 0x1e7a2, 0x1c728, 0x1cf68, 0x1e7b6, + 0x1cf64, 0x1c722, 0x1cf62, 0x18628, 0x1c316, 0x18e68, + 0x1c736, 0x19ee8, 0x18e64, 0x18622, 0x19ee4, 0x18e62, + 0x19ee2, 0x10428, 0x18216, 0x10c68, 0x18636, 0x11ce8, + 0x10c64, 0x10422, 0x13de8, 0x11ce4, 0x10c62, 0x13de4, + 0x11ce2, 0x10436, 0x10c76, 0x11cf6, 0x13df6, 0x1f7d4, + 0x1f7d2, 0x1e794, 0x1efb4, 0x1e792, 0x1efb2, 0x1c714, + 0x1cf34, 0x1c712, 0x1df74, 0x1cf32, 0x1df72, 0x18614, + 0x18e34, 0x18612, 0x19e74, 0x18e32, 0x1bef4 + }, + { + 0x1f560, 0x1fab8, 0x1ea40, 0x1f530, 0x1fa9c, 0x1ea20, + 0x1f518, 0x1fa8e, 0x1ea10, 0x1f50c, 0x1ea08, 0x1f506, + 0x1ea04, 0x1eb60, 0x1f5b8, 0x1fade, 0x1d640, 0x1eb30, + 0x1f59c, 0x1d620, 0x1eb18, 0x1f58e, 0x1d610, 0x1eb0c, + 0x1d608, 0x1eb06, 0x1d604, 0x1d760, 0x1ebb8, 0x1f5de, + 0x1ae40, 0x1d730, 0x1eb9c, 0x1ae20, 0x1d718, 0x1eb8e, + 0x1ae10, 0x1d70c, 0x1ae08, 0x1d706, 0x1ae04, 0x1af60, + 0x1d7b8, 0x1ebde, 0x15e40, 0x1af30, 0x1d79c, 0x15e20, + 0x1af18, 0x1d78e, 0x15e10, 0x1af0c, 0x15e08, 0x1af06, + 0x15f60, 0x1afb8, 0x1d7de, 0x15f30, 0x1af9c, 0x15f18, + 0x1af8e, 0x15f0c, 0x15fb8, 0x1afde, 0x15f9c, 0x15f8e, + 0x1e940, 0x1f4b0, 0x1fa5c, 0x1e920, 0x1f498, 0x1fa4e, + 0x1e910, 0x1f48c, 0x1e908, 0x1f486, 0x1e904, 0x1e902, + 0x1d340, 0x1e9b0, 0x1f4dc, 0x1d320, 0x1e998, 0x1f4ce, + 0x1d310, 0x1e98c, 0x1d308, 0x1e986, 0x1d304, 0x1d302, + 0x1a740, 0x1d3b0, 0x1e9dc, 0x1a720, 0x1d398, 0x1e9ce, + 0x1a710, 0x1d38c, 0x1a708, 0x1d386, 0x1a704, 0x1a702, + 0x14f40, 0x1a7b0, 0x1d3dc, 0x14f20, 0x1a798, 0x1d3ce, + 0x14f10, 0x1a78c, 0x14f08, 0x1a786, 0x14f04, 0x14fb0, + 0x1a7dc, 0x14f98, 0x1a7ce, 0x14f8c, 0x14f86, 0x14fdc, + 0x14fce, 0x1e8a0, 0x1f458, 0x1fa2e, 0x1e890, 0x1f44c, + 0x1e888, 0x1f446, 0x1e884, 0x1e882, 0x1d1a0, 0x1e8d8, + 0x1f46e, 0x1d190, 0x1e8cc, 0x1d188, 0x1e8c6, 0x1d184, + 0x1d182, 0x1a3a0, 0x1d1d8, 0x1e8ee, 0x1a390, 0x1d1cc, + 0x1a388, 0x1d1c6, 0x1a384, 0x1a382, 0x147a0, 0x1a3d8, + 0x1d1ee, 0x14790, 0x1a3cc, 0x14788, 0x1a3c6, 0x14784, + 0x14782, 0x147d8, 0x1a3ee, 0x147cc, 0x147c6, 0x147ee, + 0x1e850, 0x1f42c, 0x1e848, 0x1f426, 0x1e844, 0x1e842, + 0x1d0d0, 0x1e86c, 0x1d0c8, 0x1e866, 0x1d0c4, 0x1d0c2, + 0x1a1d0, 0x1d0ec, 0x1a1c8, 0x1d0e6, 0x1a1c4, 0x1a1c2, + 0x143d0, 0x1a1ec, 0x143c8, 0x1a1e6, 0x143c4, 0x143c2, + 0x143ec, 0x143e6, 0x1e828, 0x1f416, 0x1e824, 0x1e822, + 0x1d068, 0x1e836, 0x1d064, 0x1d062, 0x1a0e8, 0x1d076, + 0x1a0e4, 0x1a0e2, 0x141e8, 0x1a0f6, 0x141e4, 0x141e2, + 0x1e814, 0x1e812, 0x1d034, 0x1d032, 0x1a074, 0x1a072, + 0x1e540, 0x1f2b0, 0x1f95c, 0x1e520, 0x1f298, 0x1f94e, + 0x1e510, 0x1f28c, 0x1e508, 0x1f286, 0x1e504, 0x1e502, + 0x1cb40, 0x1e5b0, 0x1f2dc, 0x1cb20, 0x1e598, 0x1f2ce, + 0x1cb10, 0x1e58c, 0x1cb08, 0x1e586, 0x1cb04, 0x1cb02, + 0x19740, 0x1cbb0, 0x1e5dc, 0x19720, 0x1cb98, 0x1e5ce, + 0x19710, 0x1cb8c, 0x19708, 0x1cb86, 0x19704, 0x19702, + 0x12f40, 0x197b0, 0x1cbdc, 0x12f20, 0x19798, 0x1cbce, + 0x12f10, 0x1978c, 0x12f08, 0x19786, 0x12f04, 0x12fb0, + 0x197dc, 0x12f98, 0x197ce, 0x12f8c, 0x12f86, 0x12fdc, + 0x12fce, 0x1f6a0, 0x1fb58, 0x16bf0, 0x1f690, 0x1fb4c, + 0x169f8, 0x1f688, 0x1fb46, 0x168fc, 0x1f684, 0x1f682, + 0x1e4a0, 0x1f258, 0x1f92e, 0x1eda0, 0x1e490, 0x1fb6e, + 0x1ed90, 0x1f6cc, 0x1f246, 0x1ed88, 0x1e484, 0x1ed84, + 0x1e482, 0x1ed82, 0x1c9a0, 0x1e4d8, 0x1f26e, 0x1dba0, + 0x1c990, 0x1e4cc, 0x1db90, 0x1edcc, 0x1e4c6, 0x1db88, + 0x1c984, 0x1db84, 0x1c982, 0x1db82, 0x193a0, 0x1c9d8, + 0x1e4ee, 0x1b7a0, 0x19390, 0x1c9cc, 0x1b790, 0x1dbcc, + 0x1c9c6, 0x1b788, 0x19384, 0x1b784, 0x19382, 0x1b782, + 0x127a0, 0x193d8, 0x1c9ee, 0x16fa0, 0x12790, 0x193cc, + 0x16f90, 0x1b7cc, 0x193c6, 0x16f88, 0x12784, 0x16f84, + 0x12782, 0x127d8, 0x193ee, 0x16fd8, 0x127cc, 0x16fcc, + 0x127c6, 0x16fc6, 0x127ee, 0x1f650, 0x1fb2c, 0x165f8, + 0x1f648, 0x1fb26, 0x164fc, 0x1f644, 0x1647e, 0x1f642, + 0x1e450, 0x1f22c, 0x1ecd0, 0x1e448, 0x1f226, 0x1ecc8, + 0x1f666, 0x1ecc4, 0x1e442, 0x1ecc2, 0x1c8d0, 0x1e46c, + 0x1d9d0, 0x1c8c8, 0x1e466, 0x1d9c8, 0x1ece6, 0x1d9c4, + 0x1c8c2, 0x1d9c2, 0x191d0, 0x1c8ec, 0x1b3d0, 0x191c8, + 0x1c8e6, 0x1b3c8, 0x1d9e6, 0x1b3c4, 0x191c2, 0x1b3c2, + 0x123d0, 0x191ec, 0x167d0, 0x123c8, 0x191e6, 0x167c8, + 0x1b3e6, 0x167c4, 0x123c2, 0x167c2, 0x123ec, 0x167ec, + 0x123e6, 0x167e6, 0x1f628, 0x1fb16, 0x162fc, 0x1f624, + 0x1627e, 0x1f622, 0x1e428, 0x1f216, 0x1ec68, 0x1f636, + 0x1ec64, 0x1e422, 0x1ec62, 0x1c868, 0x1e436, 0x1d8e8, + 0x1c864, 0x1d8e4, 0x1c862, 0x1d8e2, 0x190e8, 0x1c876, + 0x1b1e8, 0x1d8f6, 0x1b1e4, 0x190e2, 0x1b1e2, 0x121e8, + 0x190f6, 0x163e8, 0x121e4, 0x163e4, 0x121e2, 0x163e2, + 0x121f6, 0x163f6, 0x1f614, 0x1617e, 0x1f612, 0x1e414, + 0x1ec34, 0x1e412, 0x1ec32, 0x1c834, 0x1d874, 0x1c832, + 0x1d872, 0x19074, 0x1b0f4, 0x19072, 0x1b0f2, 0x120f4, + 0x161f4, 0x120f2, 0x161f2, 0x1f60a, 0x1e40a, 0x1ec1a, + 0x1c81a, 0x1d83a, 0x1903a, 0x1b07a, 0x1e2a0, 0x1f158, + 0x1f8ae, 0x1e290, 0x1f14c, 0x1e288, 0x1f146, 0x1e284, + 0x1e282, 0x1c5a0, 0x1e2d8, 0x1f16e, 0x1c590, 0x1e2cc, + 0x1c588, 0x1e2c6, 0x1c584, 0x1c582, 0x18ba0, 0x1c5d8, + 0x1e2ee, 0x18b90, 0x1c5cc, 0x18b88, 0x1c5c6, 0x18b84, + 0x18b82, 0x117a0, 0x18bd8, 0x1c5ee, 0x11790, 0x18bcc, + 0x11788, 0x18bc6, 0x11784, 0x11782, 0x117d8, 0x18bee, + 0x117cc, 0x117c6, 0x117ee, 0x1f350, 0x1f9ac, 0x135f8, + 0x1f348, 0x1f9a6, 0x134fc, 0x1f344, 0x1347e, 0x1f342, + 0x1e250, 0x1f12c, 0x1e6d0, 0x1e248, 0x1f126, 0x1e6c8, + 0x1f366, 0x1e6c4, 0x1e242, 0x1e6c2, 0x1c4d0, 0x1e26c, + 0x1cdd0, 0x1c4c8, 0x1e266, 0x1cdc8, 0x1e6e6, 0x1cdc4, + 0x1c4c2, 0x1cdc2, 0x189d0, 0x1c4ec, 0x19bd0, 0x189c8, + 0x1c4e6, 0x19bc8, 0x1cde6, 0x19bc4, 0x189c2, 0x19bc2, + 0x113d0, 0x189ec, 0x137d0, 0x113c8, 0x189e6, 0x137c8, + 0x19be6, 0x137c4, 0x113c2, 0x137c2, 0x113ec, 0x137ec, + 0x113e6, 0x137e6, 0x1fba8, 0x175f0, 0x1bafc, 0x1fba4, + 0x174f8, 0x1ba7e, 0x1fba2, 0x1747c, 0x1743e, 0x1f328, + 0x1f996, 0x132fc, 0x1f768, 0x1fbb6, 0x176fc, 0x1327e, + 0x1f764, 0x1f322, 0x1767e, 0x1f762, 0x1e228, 0x1f116, + 0x1e668, 0x1e224, 0x1eee8, 0x1f776, 0x1e222, 0x1eee4, + 0x1e662, 0x1eee2, 0x1c468, 0x1e236, 0x1cce8, 0x1c464, + 0x1dde8, 0x1cce4, 0x1c462, 0x1dde4, 0x1cce2, 0x1dde2, + 0x188e8, 0x1c476, 0x199e8, 0x188e4, 0x1bbe8, 0x199e4, + 0x188e2, 0x1bbe4, 0x199e2, 0x1bbe2, 0x111e8, 0x188f6, + 0x133e8, 0x111e4, 0x177e8, 0x133e4, 0x111e2, 0x177e4, + 0x133e2, 0x177e2, 0x111f6, 0x133f6, 0x1fb94, 0x172f8, + 0x1b97e, 0x1fb92, 0x1727c, 0x1723e, 0x1f314, 0x1317e, + 0x1f734, 0x1f312, 0x1737e, 0x1f732, 0x1e214, 0x1e634, + 0x1e212, 0x1ee74, 0x1e632, 0x1ee72, 0x1c434, 0x1cc74, + 0x1c432, 0x1dcf4, 0x1cc72, 0x1dcf2, 0x18874, 0x198f4, + 0x18872, 0x1b9f4, 0x198f2, 0x1b9f2, 0x110f4, 0x131f4, + 0x110f2, 0x173f4, 0x131f2, 0x173f2, 0x1fb8a, 0x1717c, + 0x1713e, 0x1f30a, 0x1f71a, 0x1e20a, 0x1e61a, 0x1ee3a, + 0x1c41a, 0x1cc3a, 0x1dc7a, 0x1883a, 0x1987a, 0x1b8fa, + 0x1107a, 0x130fa, 0x171fa, 0x170be, 0x1e150, 0x1f0ac, + 0x1e148, 0x1f0a6, 0x1e144, 0x1e142, 0x1c2d0, 0x1e16c, + 0x1c2c8, 0x1e166, 0x1c2c4, 0x1c2c2, 0x185d0, 0x1c2ec, + 0x185c8, 0x1c2e6, 0x185c4, 0x185c2, 0x10bd0, 0x185ec, + 0x10bc8, 0x185e6, 0x10bc4, 0x10bc2, 0x10bec, 0x10be6, + 0x1f1a8, 0x1f8d6, 0x11afc, 0x1f1a4, 0x11a7e, 0x1f1a2, + 0x1e128, 0x1f096, 0x1e368, 0x1e124, 0x1e364, 0x1e122, + 0x1e362, 0x1c268, 0x1e136, 0x1c6e8, 0x1c264, 0x1c6e4, + 0x1c262, 0x1c6e2, 0x184e8, 0x1c276, 0x18de8, 0x184e4, + 0x18de4, 0x184e2, 0x18de2, 0x109e8, 0x184f6, 0x11be8, + 0x109e4, 0x11be4, 0x109e2, 0x11be2, 0x109f6, 0x11bf6, + 0x1f9d4, 0x13af8, 0x19d7e, 0x1f9d2, 0x13a7c, 0x13a3e, + 0x1f194, 0x1197e, 0x1f3b4, 0x1f192, 0x13b7e, 0x1f3b2, + 0x1e114, 0x1e334, 0x1e112, 0x1e774, 0x1e332, 0x1e772, + 0x1c234, 0x1c674, 0x1c232, 0x1cef4, 0x1c672, 0x1cef2, + 0x18474, 0x18cf4, 0x18472, 0x19df4, 0x18cf2, 0x19df2, + 0x108f4, 0x119f4, 0x108f2, 0x13bf4, 0x119f2, 0x13bf2, + 0x17af0, 0x1bd7c, 0x17a78, 0x1bd3e, 0x17a3c, 0x17a1e, + 0x1f9ca, 0x1397c, 0x1fbda, 0x17b7c, 0x1393e, 0x17b3e, + 0x1f18a, 0x1f39a, 0x1f7ba, 0x1e10a, 0x1e31a, 0x1e73a, + 0x1ef7a, 0x1c21a, 0x1c63a, 0x1ce7a, 0x1defa, 0x1843a, + 0x18c7a, 0x19cfa, 0x1bdfa, 0x1087a, 0x118fa, 0x139fa, + 0x17978, 0x1bcbe, 0x1793c, 0x1791e, 0x138be, 0x179be, + 0x178bc, 0x1789e, 0x1785e, 0x1e0a8, 0x1e0a4, 0x1e0a2, + 0x1c168, 0x1e0b6, 0x1c164, 0x1c162, 0x182e8, 0x1c176, + 0x182e4, 0x182e2, 0x105e8, 0x182f6, 0x105e4, 0x105e2, + 0x105f6, 0x1f0d4, 0x10d7e, 0x1f0d2, 0x1e094, 0x1e1b4, + 0x1e092, 0x1e1b2, 0x1c134, 0x1c374, 0x1c132, 0x1c372, + 0x18274, 0x186f4, 0x18272, 0x186f2, 0x104f4, 0x10df4, + 0x104f2, 0x10df2, 0x1f8ea, 0x11d7c, 0x11d3e, 0x1f0ca, + 0x1f1da, 0x1e08a, 0x1e19a, 0x1e3ba, 0x1c11a, 0x1c33a, + 0x1c77a, 0x1823a, 0x1867a, 0x18efa, 0x1047a, 0x10cfa, + 0x11dfa, 0x13d78, 0x19ebe, 0x13d3c, 0x13d1e, 0x11cbe, + 0x13dbe, 0x17d70, 0x1bebc, 0x17d38, 0x1be9e, 0x17d1c, + 0x17d0e, 0x13cbc, 0x17dbc, 0x13c9e, 0x17d9e, 0x17cb8, + 0x1be5e, 0x17c9c, 0x17c8e, 0x13c5e, 0x17cde, 0x17c5c, + 0x17c4e, 0x17c2e, 0x1c0b4, 0x1c0b2, 0x18174, 0x18172, + 0x102f4, 0x102f2, 0x1e0da, 0x1c09a, 0x1c1ba, 0x1813a, + 0x1837a, 0x1027a, 0x106fa, 0x10ebe, 0x11ebc, 0x11e9e, + 0x13eb8, 0x19f5e, 0x13e9c, 0x13e8e, 0x11e5e, 0x13ede, + 0x17eb0, 0x1bf5c, 0x17e98, 0x1bf4e, 0x17e8c, 0x17e86, + 0x13e5c, 0x17edc, 0x13e4e, 0x17ece, 0x17e58, 0x1bf2e, + 0x17e4c, 0x17e46, 0x13e2e, 0x17e6e, 0x17e2c, 0x17e26, + 0x10f5e, 0x11f5c, 0x11f4e, 0x13f58, 0x19fae, 0x13f4c, + 0x13f46, 0x11f2e, 0x13f6e, 0x13f2c, 0x13f26 + }, + { + 0x1abe0, 0x1d5f8, 0x153c0, 0x1a9f0, 0x1d4fc, 0x151e0, + 0x1a8f8, 0x1d47e, 0x150f0, 0x1a87c, 0x15078, 0x1fad0, + 0x15be0, 0x1adf8, 0x1fac8, 0x159f0, 0x1acfc, 0x1fac4, + 0x158f8, 0x1ac7e, 0x1fac2, 0x1587c, 0x1f5d0, 0x1faec, + 0x15df8, 0x1f5c8, 0x1fae6, 0x15cfc, 0x1f5c4, 0x15c7e, + 0x1f5c2, 0x1ebd0, 0x1f5ec, 0x1ebc8, 0x1f5e6, 0x1ebc4, + 0x1ebc2, 0x1d7d0, 0x1ebec, 0x1d7c8, 0x1ebe6, 0x1d7c4, + 0x1d7c2, 0x1afd0, 0x1d7ec, 0x1afc8, 0x1d7e6, 0x1afc4, + 0x14bc0, 0x1a5f0, 0x1d2fc, 0x149e0, 0x1a4f8, 0x1d27e, + 0x148f0, 0x1a47c, 0x14878, 0x1a43e, 0x1483c, 0x1fa68, + 0x14df0, 0x1a6fc, 0x1fa64, 0x14cf8, 0x1a67e, 0x1fa62, + 0x14c7c, 0x14c3e, 0x1f4e8, 0x1fa76, 0x14efc, 0x1f4e4, + 0x14e7e, 0x1f4e2, 0x1e9e8, 0x1f4f6, 0x1e9e4, 0x1e9e2, + 0x1d3e8, 0x1e9f6, 0x1d3e4, 0x1d3e2, 0x1a7e8, 0x1d3f6, + 0x1a7e4, 0x1a7e2, 0x145e0, 0x1a2f8, 0x1d17e, 0x144f0, + 0x1a27c, 0x14478, 0x1a23e, 0x1443c, 0x1441e, 0x1fa34, + 0x146f8, 0x1a37e, 0x1fa32, 0x1467c, 0x1463e, 0x1f474, + 0x1477e, 0x1f472, 0x1e8f4, 0x1e8f2, 0x1d1f4, 0x1d1f2, + 0x1a3f4, 0x1a3f2, 0x142f0, 0x1a17c, 0x14278, 0x1a13e, + 0x1423c, 0x1421e, 0x1fa1a, 0x1437c, 0x1433e, 0x1f43a, + 0x1e87a, 0x1d0fa, 0x14178, 0x1a0be, 0x1413c, 0x1411e, + 0x141be, 0x140bc, 0x1409e, 0x12bc0, 0x195f0, 0x1cafc, + 0x129e0, 0x194f8, 0x1ca7e, 0x128f0, 0x1947c, 0x12878, + 0x1943e, 0x1283c, 0x1f968, 0x12df0, 0x196fc, 0x1f964, + 0x12cf8, 0x1967e, 0x1f962, 0x12c7c, 0x12c3e, 0x1f2e8, + 0x1f976, 0x12efc, 0x1f2e4, 0x12e7e, 0x1f2e2, 0x1e5e8, + 0x1f2f6, 0x1e5e4, 0x1e5e2, 0x1cbe8, 0x1e5f6, 0x1cbe4, + 0x1cbe2, 0x197e8, 0x1cbf6, 0x197e4, 0x197e2, 0x1b5e0, + 0x1daf8, 0x1ed7e, 0x169c0, 0x1b4f0, 0x1da7c, 0x168e0, + 0x1b478, 0x1da3e, 0x16870, 0x1b43c, 0x16838, 0x1b41e, + 0x1681c, 0x125e0, 0x192f8, 0x1c97e, 0x16de0, 0x124f0, + 0x1927c, 0x16cf0, 0x1b67c, 0x1923e, 0x16c78, 0x1243c, + 0x16c3c, 0x1241e, 0x16c1e, 0x1f934, 0x126f8, 0x1937e, + 0x1fb74, 0x1f932, 0x16ef8, 0x1267c, 0x1fb72, 0x16e7c, + 0x1263e, 0x16e3e, 0x1f274, 0x1277e, 0x1f6f4, 0x1f272, + 0x16f7e, 0x1f6f2, 0x1e4f4, 0x1edf4, 0x1e4f2, 0x1edf2, + 0x1c9f4, 0x1dbf4, 0x1c9f2, 0x1dbf2, 0x193f4, 0x193f2, + 0x165c0, 0x1b2f0, 0x1d97c, 0x164e0, 0x1b278, 0x1d93e, + 0x16470, 0x1b23c, 0x16438, 0x1b21e, 0x1641c, 0x1640e, + 0x122f0, 0x1917c, 0x166f0, 0x12278, 0x1913e, 0x16678, + 0x1b33e, 0x1663c, 0x1221e, 0x1661e, 0x1f91a, 0x1237c, + 0x1fb3a, 0x1677c, 0x1233e, 0x1673e, 0x1f23a, 0x1f67a, + 0x1e47a, 0x1ecfa, 0x1c8fa, 0x1d9fa, 0x191fa, 0x162e0, + 0x1b178, 0x1d8be, 0x16270, 0x1b13c, 0x16238, 0x1b11e, + 0x1621c, 0x1620e, 0x12178, 0x190be, 0x16378, 0x1213c, + 0x1633c, 0x1211e, 0x1631e, 0x121be, 0x163be, 0x16170, + 0x1b0bc, 0x16138, 0x1b09e, 0x1611c, 0x1610e, 0x120bc, + 0x161bc, 0x1209e, 0x1619e, 0x160b8, 0x1b05e, 0x1609c, + 0x1608e, 0x1205e, 0x160de, 0x1605c, 0x1604e, 0x115e0, + 0x18af8, 0x1c57e, 0x114f0, 0x18a7c, 0x11478, 0x18a3e, + 0x1143c, 0x1141e, 0x1f8b4, 0x116f8, 0x18b7e, 0x1f8b2, + 0x1167c, 0x1163e, 0x1f174, 0x1177e, 0x1f172, 0x1e2f4, + 0x1e2f2, 0x1c5f4, 0x1c5f2, 0x18bf4, 0x18bf2, 0x135c0, + 0x19af0, 0x1cd7c, 0x134e0, 0x19a78, 0x1cd3e, 0x13470, + 0x19a3c, 0x13438, 0x19a1e, 0x1341c, 0x1340e, 0x112f0, + 0x1897c, 0x136f0, 0x11278, 0x1893e, 0x13678, 0x19b3e, + 0x1363c, 0x1121e, 0x1361e, 0x1f89a, 0x1137c, 0x1f9ba, + 0x1377c, 0x1133e, 0x1373e, 0x1f13a, 0x1f37a, 0x1e27a, + 0x1e6fa, 0x1c4fa, 0x1cdfa, 0x189fa, 0x1bae0, 0x1dd78, + 0x1eebe, 0x174c0, 0x1ba70, 0x1dd3c, 0x17460, 0x1ba38, + 0x1dd1e, 0x17430, 0x1ba1c, 0x17418, 0x1ba0e, 0x1740c, + 0x132e0, 0x19978, 0x1ccbe, 0x176e0, 0x13270, 0x1993c, + 0x17670, 0x1bb3c, 0x1991e, 0x17638, 0x1321c, 0x1761c, + 0x1320e, 0x1760e, 0x11178, 0x188be, 0x13378, 0x1113c, + 0x17778, 0x1333c, 0x1111e, 0x1773c, 0x1331e, 0x1771e, + 0x111be, 0x133be, 0x177be, 0x172c0, 0x1b970, 0x1dcbc, + 0x17260, 0x1b938, 0x1dc9e, 0x17230, 0x1b91c, 0x17218, + 0x1b90e, 0x1720c, 0x17206, 0x13170, 0x198bc, 0x17370, + 0x13138, 0x1989e, 0x17338, 0x1b99e, 0x1731c, 0x1310e, + 0x1730e, 0x110bc, 0x131bc, 0x1109e, 0x173bc, 0x1319e, + 0x1739e, 0x17160, 0x1b8b8, 0x1dc5e, 0x17130, 0x1b89c, + 0x17118, 0x1b88e, 0x1710c, 0x17106, 0x130b8, 0x1985e, + 0x171b8, 0x1309c, 0x1719c, 0x1308e, 0x1718e, 0x1105e, + 0x130de, 0x171de, 0x170b0, 0x1b85c, 0x17098, 0x1b84e, + 0x1708c, 0x17086, 0x1305c, 0x170dc, 0x1304e, 0x170ce, + 0x17058, 0x1b82e, 0x1704c, 0x17046, 0x1302e, 0x1706e, + 0x1702c, 0x17026, 0x10af0, 0x1857c, 0x10a78, 0x1853e, + 0x10a3c, 0x10a1e, 0x10b7c, 0x10b3e, 0x1f0ba, 0x1e17a, + 0x1c2fa, 0x185fa, 0x11ae0, 0x18d78, 0x1c6be, 0x11a70, + 0x18d3c, 0x11a38, 0x18d1e, 0x11a1c, 0x11a0e, 0x10978, + 0x184be, 0x11b78, 0x1093c, 0x11b3c, 0x1091e, 0x11b1e, + 0x109be, 0x11bbe, 0x13ac0, 0x19d70, 0x1cebc, 0x13a60, + 0x19d38, 0x1ce9e, 0x13a30, 0x19d1c, 0x13a18, 0x19d0e, + 0x13a0c, 0x13a06, 0x11970, 0x18cbc, 0x13b70, 0x11938, + 0x18c9e, 0x13b38, 0x1191c, 0x13b1c, 0x1190e, 0x13b0e, + 0x108bc, 0x119bc, 0x1089e, 0x13bbc, 0x1199e, 0x13b9e, + 0x1bd60, 0x1deb8, 0x1ef5e, 0x17a40, 0x1bd30, 0x1de9c, + 0x17a20, 0x1bd18, 0x1de8e, 0x17a10, 0x1bd0c, 0x17a08, + 0x1bd06, 0x17a04, 0x13960, 0x19cb8, 0x1ce5e, 0x17b60, + 0x13930, 0x19c9c, 0x17b30, 0x1bd9c, 0x19c8e, 0x17b18, + 0x1390c, 0x17b0c, 0x13906, 0x17b06, 0x118b8, 0x18c5e, + 0x139b8, 0x1189c, 0x17bb8, 0x1399c, 0x1188e, 0x17b9c, + 0x1398e, 0x17b8e, 0x1085e, 0x118de, 0x139de, 0x17bde, + 0x17940, 0x1bcb0, 0x1de5c, 0x17920, 0x1bc98, 0x1de4e, + 0x17910, 0x1bc8c, 0x17908, 0x1bc86, 0x17904, 0x17902, + 0x138b0, 0x19c5c, 0x179b0, 0x13898, 0x19c4e, 0x17998, + 0x1bcce, 0x1798c, 0x13886, 0x17986, 0x1185c, 0x138dc, + 0x1184e, 0x179dc, 0x138ce, 0x179ce, 0x178a0, 0x1bc58, + 0x1de2e, 0x17890, 0x1bc4c, 0x17888, 0x1bc46, 0x17884, + 0x17882, 0x13858, 0x19c2e, 0x178d8, 0x1384c, 0x178cc, + 0x13846, 0x178c6, 0x1182e, 0x1386e, 0x178ee, 0x17850, + 0x1bc2c, 0x17848, 0x1bc26, 0x17844, 0x17842, 0x1382c, + 0x1786c, 0x13826, 0x17866, 0x17828, 0x1bc16, 0x17824, + 0x17822, 0x13816, 0x17836, 0x10578, 0x182be, 0x1053c, + 0x1051e, 0x105be, 0x10d70, 0x186bc, 0x10d38, 0x1869e, + 0x10d1c, 0x10d0e, 0x104bc, 0x10dbc, 0x1049e, 0x10d9e, + 0x11d60, 0x18eb8, 0x1c75e, 0x11d30, 0x18e9c, 0x11d18, + 0x18e8e, 0x11d0c, 0x11d06, 0x10cb8, 0x1865e, 0x11db8, + 0x10c9c, 0x11d9c, 0x10c8e, 0x11d8e, 0x1045e, 0x10cde, + 0x11dde, 0x13d40, 0x19eb0, 0x1cf5c, 0x13d20, 0x19e98, + 0x1cf4e, 0x13d10, 0x19e8c, 0x13d08, 0x19e86, 0x13d04, + 0x13d02, 0x11cb0, 0x18e5c, 0x13db0, 0x11c98, 0x18e4e, + 0x13d98, 0x19ece, 0x13d8c, 0x11c86, 0x13d86, 0x10c5c, + 0x11cdc, 0x10c4e, 0x13ddc, 0x11cce, 0x13dce, 0x1bea0, + 0x1df58, 0x1efae, 0x1be90, 0x1df4c, 0x1be88, 0x1df46, + 0x1be84, 0x1be82, 0x13ca0, 0x19e58, 0x1cf2e, 0x17da0, + 0x13c90, 0x19e4c, 0x17d90, 0x1becc, 0x19e46, 0x17d88, + 0x13c84, 0x17d84, 0x13c82, 0x17d82, 0x11c58, 0x18e2e, + 0x13cd8, 0x11c4c, 0x17dd8, 0x13ccc, 0x11c46, 0x17dcc, + 0x13cc6, 0x17dc6, 0x10c2e, 0x11c6e, 0x13cee, 0x17dee, + 0x1be50, 0x1df2c, 0x1be48, 0x1df26, 0x1be44, 0x1be42, + 0x13c50, 0x19e2c, 0x17cd0, 0x13c48, 0x19e26, 0x17cc8, + 0x1be66, 0x17cc4, 0x13c42, 0x17cc2, 0x11c2c, 0x13c6c, + 0x11c26, 0x17cec, 0x13c66, 0x17ce6, 0x1be28, 0x1df16, + 0x1be24, 0x1be22, 0x13c28, 0x19e16, 0x17c68, 0x13c24, + 0x17c64, 0x13c22, 0x17c62, 0x11c16, 0x13c36, 0x17c76, + 0x1be14, 0x1be12, 0x13c14, 0x17c34, 0x13c12, 0x17c32, + 0x102bc, 0x1029e, 0x106b8, 0x1835e, 0x1069c, 0x1068e, + 0x1025e, 0x106de, 0x10eb0, 0x1875c, 0x10e98, 0x1874e, + 0x10e8c, 0x10e86, 0x1065c, 0x10edc, 0x1064e, 0x10ece, + 0x11ea0, 0x18f58, 0x1c7ae, 0x11e90, 0x18f4c, 0x11e88, + 0x18f46, 0x11e84, 0x11e82, 0x10e58, 0x1872e, 0x11ed8, + 0x18f6e, 0x11ecc, 0x10e46, 0x11ec6, 0x1062e, 0x10e6e, + 0x11eee, 0x19f50, 0x1cfac, 0x19f48, 0x1cfa6, 0x19f44, + 0x19f42, 0x11e50, 0x18f2c, 0x13ed0, 0x19f6c, 0x18f26, + 0x13ec8, 0x11e44, 0x13ec4, 0x11e42, 0x13ec2, 0x10e2c, + 0x11e6c, 0x10e26, 0x13eec, 0x11e66, 0x13ee6, 0x1dfa8, + 0x1efd6, 0x1dfa4, 0x1dfa2, 0x19f28, 0x1cf96, 0x1bf68, + 0x19f24, 0x1bf64, 0x19f22, 0x1bf62, 0x11e28, 0x18f16, + 0x13e68, 0x11e24, 0x17ee8, 0x13e64, 0x11e22, 0x17ee4, + 0x13e62, 0x17ee2, 0x10e16, 0x11e36, 0x13e76, 0x17ef6, + 0x1df94, 0x1df92, 0x19f14, 0x1bf34, 0x19f12, 0x1bf32, + 0x11e14, 0x13e34, 0x11e12, 0x17e74, 0x13e32, 0x17e72, + 0x1df8a, 0x19f0a, 0x1bf1a, 0x11e0a, 0x13e1a, 0x17e3a, + 0x1035c, 0x1034e, 0x10758, 0x183ae, 0x1074c, 0x10746, + 0x1032e, 0x1076e, 0x10f50, 0x187ac, 0x10f48, 0x187a6, + 0x10f44, 0x10f42, 0x1072c, 0x10f6c, 0x10726, 0x10f66, + 0x18fa8, 0x1c7d6, 0x18fa4, 0x18fa2, 0x10f28, 0x18796, + 0x11f68, 0x18fb6, 0x11f64, 0x10f22, 0x11f62, 0x10716, + 0x10f36, 0x11f76, 0x1cfd4, 0x1cfd2, 0x18f94, 0x19fb4, + 0x18f92, 0x19fb2, 0x10f14, 0x11f34, 0x10f12, 0x13f74, + 0x11f32, 0x13f72, 0x1cfca, 0x18f8a, 0x19f9a, 0x10f0a, + 0x11f1a, 0x13f3a, 0x103ac, 0x103a6, 0x107a8, 0x183d6, + 0x107a4, 0x107a2, 0x10396, 0x107b6, 0x187d4, 0x187d2, + 0x10794, 0x10fb4, 0x10792, 0x10fb2, 0x1c7ea + } +}; +FX_FLOAT CBC_PDF417::PREFERRED_RATIO = 3.0f; +FX_FLOAT CBC_PDF417::DEFAULT_MODULE_WIDTH = 0.357f; +FX_FLOAT CBC_PDF417::HEIGHT = 2.0f; +CBC_PDF417::CBC_PDF417() +{ + m_compact = FALSE; + m_compaction = AUTO; + m_minCols = 1; + m_maxCols = 30; + m_maxRows = 90; + m_minRows = 3; + m_barcodeMatrix = NULL; +} +CBC_PDF417::CBC_PDF417(FX_BOOL compact) +{ + m_compact = compact; + m_compaction = AUTO; + m_minCols = 1; + m_maxCols = 30; + m_maxRows = 90; + m_minRows = 3; + m_barcodeMatrix = NULL; +} +CBC_PDF417::~CBC_PDF417() +{ + if (m_barcodeMatrix) { + delete m_barcodeMatrix; + } +} +CBC_BarcodeMatrix* CBC_PDF417::getBarcodeMatrix() +{ + return m_barcodeMatrix; +} +void CBC_PDF417::generateBarcodeLogic(CFX_WideString msg, FX_INT32 errorCorrectionLevel, FX_INT32 &e) +{ + FX_INT32 errorCorrectionCodeWords = CBC_PDF417ErrorCorrection::getErrorCorrectionCodewordCount(errorCorrectionLevel, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CFX_WideString highLevel = CBC_PDF417HighLevelEncoder::encodeHighLevel(msg, m_compaction, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + FX_INT32 sourceCodeWords = highLevel.GetLength(); + CFX_Int32Array* dimension = determineDimensions(sourceCodeWords, errorCorrectionCodeWords, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + FX_INT32 cols = dimension->GetAt(0); + FX_INT32 rows = dimension->GetAt(1); + delete dimension; + FX_INT32 pad = getNumberOfPadCodewords(sourceCodeWords, errorCorrectionCodeWords, cols, rows); + if (sourceCodeWords + errorCorrectionCodeWords + 1 > 929) { + e = BCExceptionEncodedMessageContainsTooManyCodeWords; + return; + } + FX_INT32 n = sourceCodeWords + pad + 1; + CFX_WideString sb; + sb += (FX_WCHAR) n; + sb += highLevel; + for (FX_INT32 i = 0; i < pad; i++) { + sb += (FX_WCHAR) 900; + } + CFX_WideString dataCodewords(sb); + CFX_WideString ec = CBC_PDF417ErrorCorrection::generateErrorCorrection(dataCodewords, errorCorrectionLevel, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CFX_WideString fullCodewords = dataCodewords + ec; + m_barcodeMatrix = FX_NEW CBC_BarcodeMatrix(rows, cols); + encodeLowLevel(fullCodewords, cols, rows, errorCorrectionLevel, m_barcodeMatrix); +} +void CBC_PDF417::setDimensions(FX_INT32 maxCols, FX_INT32 minCols, FX_INT32 maxRows, FX_INT32 minRows) +{ + m_maxCols = maxCols; + m_minCols = minCols; + m_maxRows = maxRows; + m_minRows = minRows; +} +void CBC_PDF417::setCompaction(Compaction compaction) +{ + m_compaction = compaction; +} +void CBC_PDF417::setCompact(FX_BOOL compact) +{ + m_compact = compact; +} +FX_INT32 CBC_PDF417::calculateNumberOfRows(FX_INT32 m, FX_INT32 k, FX_INT32 c) +{ + FX_INT32 r = ((m + 1 + k) / c) + 1; + if (c * r >= (m + 1 + k + c)) { + r--; + } + return r; +} +FX_INT32 CBC_PDF417::getNumberOfPadCodewords(FX_INT32 m, FX_INT32 k, FX_INT32 c, FX_INT32 r) +{ + FX_INT32 n = c * r - k; + return n > m + 1 ? n - m - 1 : 0; +} +void CBC_PDF417::encodeChar(FX_INT32 pattern, FX_INT32 len, CBC_BarcodeRow* logic) +{ + FX_INT32 map = 1 << (len - 1); + FX_BOOL last = ((pattern & map) != 0); + FX_INT32 width = 0; + for (FX_INT32 i = 0; i < len; i++) { + FX_BOOL black = ((pattern & map) != 0); + if (last == black) { + width++; + } else { + logic->addBar(last, width); + last = black; + width = 1; + } + map >>= 1; + } + logic->addBar(last, width); +} +void CBC_PDF417::encodeLowLevel(CFX_WideString fullCodewords, FX_INT32 c, FX_INT32 r, FX_INT32 errorCorrectionLevel, CBC_BarcodeMatrix* logic) +{ + FX_INT32 idx = 0; + for (FX_INT32 y = 0; y < r; y++) { + FX_INT32 cluster = y % 3; + logic->startRow(); + FX_INT32 a = START_PATTERN; + encodeChar(START_PATTERN, 17, logic->getCurrentRow()); + FX_INT32 left; + FX_INT32 right; + if (cluster == 0) { + left = (30 * (y / 3)) + ((r - 1) / 3); + right = (30 * (y / 3)) + (c - 1); + } else if (cluster == 1) { + left = (30 * (y / 3)) + (errorCorrectionLevel * 3) + ((r - 1) % 3); + right = (30 * (y / 3)) + ((r - 1) / 3); + } else { + left = (30 * (y / 3)) + (c - 1); + right = (30 * (y / 3)) + (errorCorrectionLevel * 3) + ((r - 1) % 3); + } + FX_INT32 pattern = CODEWORD_TABLE[cluster][left]; + encodeChar(pattern, 17, logic->getCurrentRow()); + for (FX_INT32 x = 0; x < c; x++) { + pattern = CODEWORD_TABLE[cluster][fullCodewords.GetAt(idx)]; + encodeChar(pattern, 17, logic->getCurrentRow()); + idx++; + } + if (m_compact) { + encodeChar(STOP_PATTERN, 1, logic->getCurrentRow()); + } else { + pattern = CODEWORD_TABLE[cluster][right]; + encodeChar(pattern, 17, logic->getCurrentRow()); + encodeChar(STOP_PATTERN, 18, logic->getCurrentRow()); + } + } +} +CFX_Int32Array* CBC_PDF417::determineDimensions(FX_INT32 sourceCodeWords, FX_INT32 errorCorrectionCodeWords, FX_INT32 &e) +{ + FX_FLOAT ratio = 0.0f; + CFX_Int32Array* dimension = NULL; + for (FX_INT32 cols = m_minCols; cols <= m_maxCols; cols++) { + FX_INT32 rows = calculateNumberOfRows(sourceCodeWords, errorCorrectionCodeWords, cols); + if (rows < m_minRows) { + break; + } + if (rows > m_maxRows) { + continue; + } + FX_FLOAT newRatio = ((17 * cols + 69) * DEFAULT_MODULE_WIDTH) / (rows * HEIGHT); + if (dimension != NULL && fabsf(newRatio - PREFERRED_RATIO) > fabsf(ratio - PREFERRED_RATIO)) { + continue; + } + ratio = newRatio; + if (dimension) { + delete dimension; + } + dimension = FX_NEW CFX_Int32Array; + dimension->Add(cols); + dimension->Add(rows); + } + if (dimension == NULL) { + FX_INT32 rows = calculateNumberOfRows(sourceCodeWords, errorCorrectionCodeWords, m_minCols); + if (rows < m_minRows) { + dimension = FX_NEW CFX_Int32Array; + dimension->Add(m_minCols); + dimension->Add(m_minRows); + } else if (rows >= 3 && rows <= 90) { + dimension = FX_NEW CFX_Int32Array; + dimension->Add(m_minCols); + dimension->Add(rows); + } + } + if (dimension == NULL) { + e = BCExceptionUnableToFitMessageInColumns; + return NULL; + } + return dimension; +} diff --git a/xfa/src/fxbarcode/src/BC_PDF417BarcodeMatrix.cpp b/xfa/src/fxbarcode/src/BC_PDF417BarcodeMatrix.cpp new file mode 100644 index 0000000000..4265881c0f --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_PDF417BarcodeMatrix.cpp @@ -0,0 +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 + +#include "barcode.h" +#include "include/BC_PDF417BarcodeRow.h" +#include "include/BC_PDF417BarcodeMatrix.h" +CBC_BarcodeMatrix::CBC_BarcodeMatrix(FX_INT32 height, FX_INT32 width) +{ + m_matrix.SetSize(height + 2); + for (FX_INT32 i = 0, matrixLength = m_matrix.GetSize(); i < matrixLength; i++) { + m_matrix[i] = FX_NEW CBC_BarcodeRow((width + 4) * 17 + 1); + } + m_width = width * 17; + m_height = height + 2; + m_currentRow = 0; + m_outHeight = 0; + m_outWidth = 0; +} +CBC_BarcodeMatrix::~CBC_BarcodeMatrix() +{ + for (FX_INT32 i = 0; i < m_matrix.GetSize(); i++) { + delete (CBC_BarcodeRow*)m_matrix.GetAt(i); + } + m_matrix.RemoveAll(); + m_matrixOut.RemoveAll(); +} +void CBC_BarcodeMatrix::set(FX_INT32 x, FX_INT32 y, FX_BYTE value) +{ + ((CBC_BarcodeRow*)m_matrix[y])->set(x, value); +} +void CBC_BarcodeMatrix::setMatrix(FX_INT32 x, FX_INT32 y, FX_BOOL black) +{ + set(x, y, (FX_BYTE) (black ? 1 : 0)); +} +void CBC_BarcodeMatrix::startRow() +{ + ++m_currentRow; +} +CBC_BarcodeRow* CBC_BarcodeMatrix::getCurrentRow() +{ + return (CBC_BarcodeRow*)m_matrix[m_currentRow]; +} +FX_INT32 CBC_BarcodeMatrix::getWidth() +{ + return m_outWidth; +} +FX_INT32 CBC_BarcodeMatrix::getHeight() +{ + return m_outHeight; +} +CFX_ByteArray& CBC_BarcodeMatrix::getMatrix() +{ + return getScaledMatrix(1, 1); +} +CFX_ByteArray& CBC_BarcodeMatrix::getScaledMatrix(FX_INT32 scale) +{ + return getScaledMatrix(scale, scale); +} +CFX_ByteArray& CBC_BarcodeMatrix::getScaledMatrix(FX_INT32 xScale, FX_INT32 yScale) +{ + FX_INT32 yMax = m_height * yScale; + CFX_ByteArray bytearray; + bytearray.Copy(((CBC_BarcodeRow*)m_matrix[0])->getScaledRow(xScale)); + FX_INT32 xMax = bytearray.GetSize(); + m_matrixOut.SetSize(xMax * yMax); + m_outWidth = xMax; + m_outHeight = yMax; + FX_INT32 k = 0; + for (FX_INT32 i = 0; i < yMax; i++) { + if (i != 0) { + bytearray.Copy(((CBC_BarcodeRow*)m_matrix[i / yScale])->getScaledRow(xScale)); + } + k = i * xMax; + for (FX_INT32 l = 0; l < xMax; l++) { + m_matrixOut[k + l] = bytearray.GetAt(l); + } + } + return m_matrixOut; +} diff --git a/xfa/src/fxbarcode/src/BC_PDF417BarcodeMetadata.cpp b/xfa/src/fxbarcode/src/BC_PDF417BarcodeMetadata.cpp new file mode 100644 index 0000000000..a47deaf0fe --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_PDF417BarcodeMetadata.cpp @@ -0,0 +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 + +#include "barcode.h" +#include "include/BC_PDF417BarcodeMetadata.h" +CBC_BarcodeMetadata::CBC_BarcodeMetadata(FX_INT32 columnCount, FX_INT32 rowCountUpperPart, FX_INT32 rowCountLowerPart, FX_INT32 errorCorrectionLevel) +{ + m_columnCount = columnCount; + m_rowCountUpperPart = rowCountUpperPart; + m_rowCountLowerPart = rowCountLowerPart; + m_errorCorrectionLevel = errorCorrectionLevel; + m_rowCount = m_rowCountUpperPart + m_rowCountLowerPart; +} +CBC_BarcodeMetadata::~CBC_BarcodeMetadata() +{ +} +FX_INT32 CBC_BarcodeMetadata::getColumnCount() +{ + return m_columnCount; +} +FX_INT32 CBC_BarcodeMetadata::getErrorCorrectionLevel() +{ + return m_errorCorrectionLevel; +} +FX_INT32 CBC_BarcodeMetadata::getRowCount() +{ + return m_rowCount; +} +FX_INT32 CBC_BarcodeMetadata::getRowCountUpperPart() +{ + return m_rowCountUpperPart; +} +FX_INT32 CBC_BarcodeMetadata::getRowCountLowerPart() +{ + return m_rowCountLowerPart; +} diff --git a/xfa/src/fxbarcode/src/BC_PDF417BarcodeRow.cpp b/xfa/src/fxbarcode/src/BC_PDF417BarcodeRow.cpp new file mode 100644 index 0000000000..506256dd23 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_PDF417BarcodeRow.cpp @@ -0,0 +1,44 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_PDF417BarcodeRow.h" +CBC_BarcodeRow::CBC_BarcodeRow(FX_INT32 width) +{ + m_row.SetSize(width); + m_currentLocation = 0; +} +CBC_BarcodeRow::~CBC_BarcodeRow() +{ + m_output.RemoveAll(); + m_row.RemoveAll(); +} +void CBC_BarcodeRow::set(FX_INT32 x, FX_BYTE value) +{ + m_row.SetAt(x, value); +} +void CBC_BarcodeRow::set(FX_INT32 x, FX_BOOL black) +{ + m_row.SetAt(x, (FX_BYTE) (black ? 1 : 0)); +} +void CBC_BarcodeRow::addBar(FX_BOOL black, FX_INT32 width) +{ + for (FX_INT32 ii = 0; ii < width; ii++) { + set(m_currentLocation++, black); + } +} +CFX_ByteArray& CBC_BarcodeRow::getRow() +{ + return m_row; +} +CFX_ByteArray& CBC_BarcodeRow::getScaledRow(FX_INT32 scale) +{ + m_output.SetSize(m_row.GetSize() * scale); + for (FX_INT32 i = 0; i < m_output.GetSize(); i++) { + m_output[i] = (m_row[i / scale]); + } + return m_output; +} diff --git a/xfa/src/fxbarcode/src/BC_PDF417BarcodeValue.cpp b/xfa/src/fxbarcode/src/BC_PDF417BarcodeValue.cpp new file mode 100644 index 0000000000..725f15af10 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_PDF417BarcodeValue.cpp @@ -0,0 +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 "barcode.h" +#include "include/BC_PDF417Common.h" +#include "include/BC_PDF417BarcodeValue.h" +CBC_BarcodeValue::CBC_BarcodeValue() +{ +} +CBC_BarcodeValue::~CBC_BarcodeValue() +{ +} +void CBC_BarcodeValue::setValue(FX_INT32 value) +{ + FX_INT32 confidence = 0; + for (FX_INT32 i = 0; i < m_keys.GetSize(); i++) { + if (m_keys.GetAt(i) == value) { + confidence = m_values.GetAt(i); + m_values.SetAt(i, confidence + 1); + return; + } + } + confidence = 1; + m_keys.Add(value); + m_values.Add(confidence); +} +CFX_Int32Array* CBC_BarcodeValue::getValue() +{ + FX_INT32 maxConfidence = -1; + CFX_Int32Array* result = FX_NEW CFX_Int32Array; + for (FX_INT32 i = 0; i < m_keys.GetSize(); i++) { + if (m_values.GetAt(i) > maxConfidence) { + maxConfidence = m_values.GetAt(i); + result->RemoveAll(); + result->Add(m_keys.GetAt(i)); + } else if (m_values.GetAt(i) == maxConfidence) { + result->Add(m_keys.GetAt(i)); + } + } + return result; +} +FX_INT32 CBC_BarcodeValue::getConfidence(FX_INT32 value) +{ + for (FX_INT32 i = 0; i < m_keys.GetSize(); i++) + if (m_keys.GetAt(i) == value) { + return m_values.GetAt(i); + } + return -1; +} diff --git a/xfa/src/fxbarcode/src/BC_PDF417BoundingBox.cpp b/xfa/src/fxbarcode/src/BC_PDF417BoundingBox.cpp new file mode 100644 index 0000000000..3d0840d6d4 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_PDF417BoundingBox.cpp @@ -0,0 +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 "barcode.h" +#include "include/BC_ResultPoint.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_PDF417BoundingBox.h" +CBC_BoundingBox::CBC_BoundingBox(CBC_CommonBitMatrix* image, CBC_ResultPoint* topLeft, CBC_ResultPoint* bottomLeft, CBC_ResultPoint* topRight, CBC_ResultPoint* bottomRight, FX_INT32 &e) +{ + if ((topLeft == NULL && topRight == NULL) || + (bottomLeft == NULL && bottomRight == NULL) || + (topLeft != NULL && bottomLeft == NULL) || + (topRight != NULL && bottomRight == NULL)) { + e = BCExceptionNotFoundInstance; + } + init(image, topLeft, bottomLeft, topRight, bottomRight); +} +CBC_BoundingBox::CBC_BoundingBox(CBC_BoundingBox* boundingBox) +{ + init(boundingBox->m_image, boundingBox->m_topLeft, boundingBox->m_bottomLeft, boundingBox->m_topRight, boundingBox->m_bottomRight); +} +CBC_BoundingBox::~CBC_BoundingBox() +{ + if (m_topLeft) { + delete m_topLeft; + } + if (m_bottomLeft) { + delete m_bottomLeft; + } + if (m_topRight) { + delete m_topRight; + } + if (m_bottomRight) { + delete m_bottomRight; + } +} +CBC_BoundingBox* CBC_BoundingBox::merge(CBC_BoundingBox* leftBox, CBC_BoundingBox* rightBox, FX_INT32 &e) +{ + CBC_BoundingBox* boundingBox = NULL; + if (leftBox == NULL) { + boundingBox = FX_NEW CBC_BoundingBox(rightBox); + return boundingBox; + } + if (rightBox == NULL) { + boundingBox = FX_NEW CBC_BoundingBox(leftBox); + return boundingBox; + } + boundingBox = FX_NEW CBC_BoundingBox(leftBox->m_image, leftBox->m_topLeft, leftBox->m_bottomLeft, rightBox->m_topRight, rightBox->m_bottomRight, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return boundingBox; +} +CBC_BoundingBox* CBC_BoundingBox::addMissingRows(FX_INT32 missingStartRows, FX_INT32 missingEndRows, FX_BOOL isLeft, FX_INT32 &e) +{ + CBC_ResultPoint* newTopLeft = m_topLeft; + CBC_ResultPoint* newBottomLeft = m_bottomLeft; + CBC_ResultPoint* newTopRight = m_topRight; + CBC_ResultPoint* newBottomRight = m_bottomRight; + CBC_ResultPoint* newTop = NULL; + CBC_ResultPoint* newBottom = NULL; + if (missingStartRows > 0) { + CBC_ResultPoint* top = isLeft ? m_topLeft : m_topRight; + FX_INT32 newMinY = (FX_INT32) top->GetY() - missingStartRows; + if (newMinY < 0) { + newMinY = 0; + } + newTop = FX_NEW CBC_ResultPoint((FX_FLOAT)top->GetX(), (FX_FLOAT)newMinY); + if (isLeft) { + newTopLeft = newTop; + } else { + newTopRight = newTop; + } + } + if (missingEndRows > 0) { + CBC_ResultPoint* bottom = isLeft ? m_bottomLeft : m_bottomRight; + FX_INT32 newMaxY = (FX_INT32) bottom->GetY() + missingEndRows; + if (newMaxY >= m_image->GetHeight()) { + newMaxY = m_image->GetHeight() - 1; + } + newBottom = FX_NEW CBC_ResultPoint((FX_FLOAT)bottom->GetX(), (FX_FLOAT)newMaxY); + if (isLeft) { + newBottomLeft = newBottom; + } else { + newBottomRight = newBottom; + } + } + calculateMinMaxValues(); + CBC_BoundingBox* boundingBox = FX_NEW CBC_BoundingBox(m_image, newTopLeft, newBottomLeft, newTopRight, newBottomRight, e); + delete newTop; + delete newBottom; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return boundingBox; +} +void CBC_BoundingBox::setTopRight(CBC_ResultPoint topRight) +{ + if (m_topRight) { + delete m_topRight; + } + m_topRight = FX_NEW CBC_ResultPoint(topRight.GetX(), topRight.GetY()); + calculateMinMaxValues(); +} +void CBC_BoundingBox::setBottomRight(CBC_ResultPoint bottomRight) +{ + if (m_bottomRight) { + delete m_bottomRight; + } + m_bottomRight = FX_NEW CBC_ResultPoint(bottomRight.GetX(), bottomRight.GetY()); + calculateMinMaxValues(); +} +FX_INT32 CBC_BoundingBox::getMinX() +{ + return m_minX; +} +FX_INT32 CBC_BoundingBox::getMaxX() +{ + return m_maxX; +} +FX_INT32 CBC_BoundingBox::getMinY() +{ + return m_minY; +} +FX_INT32 CBC_BoundingBox::getMaxY() +{ + return m_maxY; +} +CBC_ResultPoint* CBC_BoundingBox::getTopLeft() +{ + return m_topLeft; +} +CBC_ResultPoint* CBC_BoundingBox::getTopRight() +{ + return m_topRight; +} +CBC_ResultPoint* CBC_BoundingBox::getBottomLeft() +{ + return m_bottomLeft; +} +CBC_ResultPoint* CBC_BoundingBox::getBottomRight() +{ + return m_bottomRight; +} +void CBC_BoundingBox::init(CBC_CommonBitMatrix* image, CBC_ResultPoint* topLeft, CBC_ResultPoint* bottomLeft, CBC_ResultPoint* topRight, CBC_ResultPoint* bottomRight) +{ + m_topLeft = NULL; + m_bottomLeft = NULL; + m_topRight = NULL; + m_bottomRight = NULL; + m_image = image; + if (topLeft) { + m_topLeft = FX_NEW CBC_ResultPoint(topLeft->GetX(), topLeft->GetY()); + } + if (bottomLeft) { + m_bottomLeft = FX_NEW CBC_ResultPoint(bottomLeft->GetX(), bottomLeft->GetY()); + } + if (topRight) { + m_topRight = FX_NEW CBC_ResultPoint(topRight->GetX(), topRight->GetY()); + } + if (bottomRight) { + m_bottomRight = FX_NEW CBC_ResultPoint(bottomRight->GetX(), bottomRight->GetY()); + } + calculateMinMaxValues(); +} +void CBC_BoundingBox::calculateMinMaxValues() +{ + if (m_topLeft == NULL) { + m_topLeft = FX_NEW CBC_ResultPoint(0, m_topRight->GetY()); + m_bottomLeft = FX_NEW CBC_ResultPoint(0, m_bottomRight->GetY()); + } else if (m_topRight == NULL) { + m_topRight = FX_NEW CBC_ResultPoint((FX_FLOAT)m_image->GetWidth() - 1, (FX_FLOAT)m_topLeft->GetY()); + m_bottomRight = FX_NEW CBC_ResultPoint((FX_FLOAT)m_image->GetWidth() - 1, (FX_FLOAT)m_bottomLeft->GetY()); + } + m_minX = (FX_INT32) (m_topLeft->GetX() < m_bottomLeft->GetX() ? m_topLeft->GetX() : m_bottomLeft->GetX()); + m_maxX = (FX_INT32) (m_topRight->GetX() > m_bottomRight->GetX() ? m_topRight->GetX() : m_bottomRight->GetX()); + m_minY = (FX_INT32) (m_topLeft->GetY() < m_topRight->GetY() ? m_topLeft->GetY() : m_topRight->GetY()); + m_maxY = (FX_INT32) (m_bottomLeft->GetY() > m_bottomRight->GetY() ? m_bottomLeft->GetY() : m_bottomRight->GetY()); +} diff --git a/xfa/src/fxbarcode/src/BC_PDF417Codeword.cpp b/xfa/src/fxbarcode/src/BC_PDF417Codeword.cpp new file mode 100644 index 0000000000..5bd69eb065 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_PDF417Codeword.cpp @@ -0,0 +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 + +#include "barcode.h" +#include "include/BC_PDF417Codeword.h" +FX_INT32 CBC_Codeword::BARCODE_ROW_UNKNOWN = -1; +CBC_Codeword::CBC_Codeword(FX_INT32 startX, FX_INT32 endX, FX_INT32 bucket, FX_INT32 cvalue) +{ + m_startX = startX; + m_endX = endX; + m_bucket = bucket; + m_value = cvalue; + m_rowNumber = BARCODE_ROW_UNKNOWN; +} +CBC_Codeword::~CBC_Codeword() +{ +} +FX_BOOL CBC_Codeword::hasValidRowNumber() +{ + return isValidRowNumber(m_rowNumber); +} +FX_BOOL CBC_Codeword::isValidRowNumber(FX_INT32 rowNumber) +{ + return m_rowNumber != BARCODE_ROW_UNKNOWN && m_bucket == (m_rowNumber % 3) * 3; +} +void CBC_Codeword::setRowNumberAsRowIndicatorColumn() +{ + m_rowNumber = (m_value / 30) * 3 + m_bucket / 3; +} +FX_INT32 CBC_Codeword::getWidth() +{ + return m_endX - m_startX; +} +FX_INT32 CBC_Codeword::getStartX() +{ + return m_startX; +} +FX_INT32 CBC_Codeword::getEndX() +{ + return m_endX; +} +FX_INT32 CBC_Codeword::getBucket() +{ + return m_bucket; +} +FX_INT32 CBC_Codeword::getValue() +{ + return m_value; +} +FX_INT32 CBC_Codeword::getRowNumber() +{ + return m_rowNumber; +} +void CBC_Codeword::setRowNumber(FX_INT32 rowNumber) +{ + m_rowNumber = rowNumber; +} +CFX_ByteString CBC_Codeword::toString() +{ + return m_rowNumber + (FX_CHAR)'|' + m_value; +} diff --git a/xfa/src/fxbarcode/src/BC_PDF417CodewordDecoder.cpp b/xfa/src/fxbarcode/src/BC_PDF417CodewordDecoder.cpp new file mode 100644 index 0000000000..41a04d0238 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_PDF417CodewordDecoder.cpp @@ -0,0 +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 "barcode.h" +#include "include/BC_PDF417Common.h" +#include "include/BC_PDF417CodewordDecoder.h" +#define SYMBOL_TABLE_Length 2787 +#define Float_MAX_VALUE 2147483647 +FX_FLOAT CBC_PDF417CodewordDecoder::RATIOS_TABLE[2787][8] = {0}; +CBC_PDF417CodewordDecoder::CBC_PDF417CodewordDecoder() +{ +} +CBC_PDF417CodewordDecoder::~CBC_PDF417CodewordDecoder() +{ +} +void CBC_PDF417CodewordDecoder::Initialize() +{ + for (FX_INT32 i = 0; i < SYMBOL_TABLE_Length; i++) { + FX_INT32 currentSymbol = CBC_PDF417Common::SYMBOL_TABLE[i]; + FX_INT32 currentBit = currentSymbol & 0x1; + for (FX_INT32 j = 0; j < CBC_PDF417Common::BARS_IN_MODULE; j++) { + FX_FLOAT size = 0.0f; + while ((currentSymbol & 0x1) == currentBit) { + size += 1.0f; + currentSymbol >>= 1; + } + currentBit = currentSymbol & 0x1; + RATIOS_TABLE[i][CBC_PDF417Common::BARS_IN_MODULE - j - 1] = size / CBC_PDF417Common::MODULES_IN_CODEWORD; + } + } +} +void CBC_PDF417CodewordDecoder::Finalize() +{ +} +FX_INT32 CBC_PDF417CodewordDecoder::getDecodedValue(CFX_Int32Array& moduleBitCount) +{ + CFX_Int32Array* array = sampleBitCounts(moduleBitCount); + FX_INT32 decodedValue = getDecodedCodewordValue(*array); + delete array; + if (decodedValue != -1) { + return decodedValue; + } + return getClosestDecodedValue(moduleBitCount); +} +CFX_Int32Array* CBC_PDF417CodewordDecoder::sampleBitCounts(CFX_Int32Array& moduleBitCount) +{ + FX_FLOAT bitCountSum = (FX_FLOAT)CBC_PDF417Common::getBitCountSum(moduleBitCount); + CFX_Int32Array* bitCount = FX_NEW CFX_Int32Array(); + bitCount->SetSize(CBC_PDF417Common::BARS_IN_MODULE); + FX_INT32 bitCountIndex = 0; + FX_INT32 sumPreviousBits = 0; + for (FX_INT32 i = 0; i < CBC_PDF417Common::MODULES_IN_CODEWORD; i++) { + FX_FLOAT sampleIndex = bitCountSum / (2 * CBC_PDF417Common::MODULES_IN_CODEWORD) + (i * bitCountSum) / CBC_PDF417Common::MODULES_IN_CODEWORD; + if (sumPreviousBits + moduleBitCount.GetAt(bitCountIndex) <= sampleIndex) { + sumPreviousBits += moduleBitCount.GetAt(bitCountIndex); + bitCountIndex++; + } + bitCount->SetAt(bitCountIndex, bitCount->GetAt(bitCountIndex) + 1); + } + return bitCount; +} +FX_INT32 CBC_PDF417CodewordDecoder::getDecodedCodewordValue(CFX_Int32Array& moduleBitCount) +{ + FX_INT32 decodedValue = getBitValue(moduleBitCount); + return CBC_PDF417Common::getCodeword(decodedValue) == -1 ? -1 : decodedValue; +} +FX_INT32 CBC_PDF417CodewordDecoder::getBitValue(CFX_Int32Array& moduleBitCount) +{ + FX_INT64 result = 0; + for (FX_INT32 i = 0; i < moduleBitCount.GetSize(); i++) { + for (FX_INT32 bit = 0; bit < moduleBitCount.GetAt(i); bit++) { + result = (result << 1) | (i % 2 == 0 ? 1 : 0); + } + } + return (FX_INT32) result; +} +FX_INT32 CBC_PDF417CodewordDecoder::getClosestDecodedValue(CFX_Int32Array& moduleBitCount) +{ + FX_INT32 bitCountSum = CBC_PDF417Common::getBitCountSum(moduleBitCount); + CFX_FloatArray bitCountRatios; + bitCountRatios.SetSize(CBC_PDF417Common::BARS_IN_MODULE); + for (FX_INT32 i = 0; i < bitCountRatios.GetSize(); i++) { + bitCountRatios[i] = moduleBitCount.GetAt(i) / (FX_FLOAT) bitCountSum; + } + FX_FLOAT bestMatchError = (FX_FLOAT)Float_MAX_VALUE; + FX_INT32 bestMatch = -1; + for (FX_INT32 j = 0; j < SYMBOL_TABLE_Length; j++) { + FX_FLOAT error = 0.0f; + for (FX_INT32 k = 0; k < CBC_PDF417Common::BARS_IN_MODULE; k++) { + FX_FLOAT diff = RATIOS_TABLE[j][k] - bitCountRatios[k]; + error += diff * diff; + } + if (error < bestMatchError) { + bestMatchError = error; + bestMatch = CBC_PDF417Common::SYMBOL_TABLE[j]; + } + } + return bestMatch; +} diff --git a/xfa/src/fxbarcode/src/BC_PDF417Common.cpp b/xfa/src/fxbarcode/src/BC_PDF417Common.cpp new file mode 100644 index 0000000000..697e07863c --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_PDF417Common.cpp @@ -0,0 +1,434 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_PDF417Common.h" +FX_INT32 CBC_PDF417Common::NUMBER_OF_CODEWORDS = 929; +FX_INT32 CBC_PDF417Common::MAX_CODEWORDS_IN_BARCODE = NUMBER_OF_CODEWORDS - 1; +FX_INT32 CBC_PDF417Common::MIN_ROWS_IN_BARCODE = 3; +FX_INT32 CBC_PDF417Common::MAX_ROWS_IN_BARCODE = 90; +FX_INT32 CBC_PDF417Common::MAX_CODEWORDS_IN_ROW = 32; +FX_INT32 CBC_PDF417Common::MODULES_IN_CODEWORD = 17; +FX_INT32 CBC_PDF417Common::MODULES_IN_STOP_PATTERN = 18; +FX_INT32 CBC_PDF417Common::BARS_IN_MODULE = 8; +CFX_Int32Array* CBC_PDF417Common::EMPTY_INT_ARRAY = NULL; +FX_INT32 CBC_PDF417Common::SYMBOL_TABLE[] = { + 0x1025e, 0x1027a, 0x1029e, 0x102bc, 0x102f2, 0x102f4, 0x1032e, 0x1034e, 0x1035c, 0x10396, 0x103a6, 0x103ac, + 0x10422, 0x10428, 0x10436, 0x10442, 0x10444, 0x10448, 0x10450, 0x1045e, 0x10466, 0x1046c, 0x1047a, 0x10482, + 0x1049e, 0x104a0, 0x104bc, 0x104c6, 0x104d8, 0x104ee, 0x104f2, 0x104f4, 0x10504, 0x10508, 0x10510, 0x1051e, + 0x10520, 0x1053c, 0x10540, 0x10578, 0x10586, 0x1058c, 0x10598, 0x105b0, 0x105be, 0x105ce, 0x105dc, 0x105e2, + 0x105e4, 0x105e8, 0x105f6, 0x1062e, 0x1064e, 0x1065c, 0x1068e, 0x1069c, 0x106b8, 0x106de, 0x106fa, 0x10716, + 0x10726, 0x1072c, 0x10746, 0x1074c, 0x10758, 0x1076e, 0x10792, 0x10794, 0x107a2, 0x107a4, 0x107a8, 0x107b6, + 0x10822, 0x10828, 0x10842, 0x10848, 0x10850, 0x1085e, 0x10866, 0x1086c, 0x1087a, 0x10882, 0x10884, 0x10890, + 0x1089e, 0x108a0, 0x108bc, 0x108c6, 0x108cc, 0x108d8, 0x108ee, 0x108f2, 0x108f4, 0x10902, 0x10908, 0x1091e, + 0x10920, 0x1093c, 0x10940, 0x10978, 0x10986, 0x10998, 0x109b0, 0x109be, 0x109ce, 0x109dc, 0x109e2, 0x109e4, + 0x109e8, 0x109f6, 0x10a08, 0x10a10, 0x10a1e, 0x10a20, 0x10a3c, 0x10a40, 0x10a78, 0x10af0, 0x10b06, 0x10b0c, + 0x10b18, 0x10b30, 0x10b3e, 0x10b60, 0x10b7c, 0x10b8e, 0x10b9c, 0x10bb8, 0x10bc2, 0x10bc4, 0x10bc8, 0x10bd0, + 0x10bde, 0x10be6, 0x10bec, 0x10c2e, 0x10c4e, 0x10c5c, 0x10c62, 0x10c64, 0x10c68, 0x10c76, 0x10c8e, 0x10c9c, + 0x10cb8, 0x10cc2, 0x10cc4, 0x10cc8, 0x10cd0, 0x10cde, 0x10ce6, 0x10cec, 0x10cfa, 0x10d0e, 0x10d1c, 0x10d38, + 0x10d70, 0x10d7e, 0x10d82, 0x10d84, 0x10d88, 0x10d90, 0x10d9e, 0x10da0, 0x10dbc, 0x10dc6, 0x10dcc, 0x10dd8, + 0x10dee, 0x10df2, 0x10df4, 0x10e16, 0x10e26, 0x10e2c, 0x10e46, 0x10e58, 0x10e6e, 0x10e86, 0x10e8c, 0x10e98, + 0x10eb0, 0x10ebe, 0x10ece, 0x10edc, 0x10f0a, 0x10f12, 0x10f14, 0x10f22, 0x10f28, 0x10f36, 0x10f42, 0x10f44, + 0x10f48, 0x10f50, 0x10f5e, 0x10f66, 0x10f6c, 0x10fb2, 0x10fb4, 0x11022, 0x11028, 0x11042, 0x11048, 0x11050, + 0x1105e, 0x1107a, 0x11082, 0x11084, 0x11090, 0x1109e, 0x110a0, 0x110bc, 0x110c6, 0x110cc, 0x110d8, 0x110ee, + 0x110f2, 0x110f4, 0x11102, 0x1111e, 0x11120, 0x1113c, 0x11140, 0x11178, 0x11186, 0x11198, 0x111b0, 0x111be, + 0x111ce, 0x111dc, 0x111e2, 0x111e4, 0x111e8, 0x111f6, 0x11208, 0x1121e, 0x11220, 0x11278, 0x112f0, 0x1130c, + 0x11330, 0x1133e, 0x11360, 0x1137c, 0x1138e, 0x1139c, 0x113b8, 0x113c2, 0x113c8, 0x113d0, 0x113de, 0x113e6, + 0x113ec, 0x11408, 0x11410, 0x1141e, 0x11420, 0x1143c, 0x11440, 0x11478, 0x114f0, 0x115e0, 0x1160c, 0x11618, + 0x11630, 0x1163e, 0x11660, 0x1167c, 0x116c0, 0x116f8, 0x1171c, 0x11738, 0x11770, 0x1177e, 0x11782, 0x11784, + 0x11788, 0x11790, 0x1179e, 0x117a0, 0x117bc, 0x117c6, 0x117cc, 0x117d8, 0x117ee, 0x1182e, 0x11834, 0x1184e, + 0x1185c, 0x11862, 0x11864, 0x11868, 0x11876, 0x1188e, 0x1189c, 0x118b8, 0x118c2, 0x118c8, 0x118d0, 0x118de, + 0x118e6, 0x118ec, 0x118fa, 0x1190e, 0x1191c, 0x11938, 0x11970, 0x1197e, 0x11982, 0x11984, 0x11990, 0x1199e, + 0x119a0, 0x119bc, 0x119c6, 0x119cc, 0x119d8, 0x119ee, 0x119f2, 0x119f4, 0x11a0e, 0x11a1c, 0x11a38, 0x11a70, + 0x11a7e, 0x11ae0, 0x11afc, 0x11b08, 0x11b10, 0x11b1e, 0x11b20, 0x11b3c, 0x11b40, 0x11b78, 0x11b8c, 0x11b98, + 0x11bb0, 0x11bbe, 0x11bce, 0x11bdc, 0x11be2, 0x11be4, 0x11be8, 0x11bf6, 0x11c16, 0x11c26, 0x11c2c, 0x11c46, + 0x11c4c, 0x11c58, 0x11c6e, 0x11c86, 0x11c98, 0x11cb0, 0x11cbe, 0x11cce, 0x11cdc, 0x11ce2, 0x11ce4, 0x11ce8, + 0x11cf6, 0x11d06, 0x11d0c, 0x11d18, 0x11d30, 0x11d3e, 0x11d60, 0x11d7c, 0x11d8e, 0x11d9c, 0x11db8, 0x11dc4, + 0x11dc8, 0x11dd0, 0x11dde, 0x11de6, 0x11dec, 0x11dfa, 0x11e0a, 0x11e12, 0x11e14, 0x11e22, 0x11e24, 0x11e28, + 0x11e36, 0x11e42, 0x11e44, 0x11e50, 0x11e5e, 0x11e66, 0x11e6c, 0x11e82, 0x11e84, 0x11e88, 0x11e90, 0x11e9e, + 0x11ea0, 0x11ebc, 0x11ec6, 0x11ecc, 0x11ed8, 0x11eee, 0x11f1a, 0x11f2e, 0x11f32, 0x11f34, 0x11f4e, 0x11f5c, + 0x11f62, 0x11f64, 0x11f68, 0x11f76, 0x12048, 0x1205e, 0x12082, 0x12084, 0x12090, 0x1209e, 0x120a0, 0x120bc, + 0x120d8, 0x120f2, 0x120f4, 0x12108, 0x1211e, 0x12120, 0x1213c, 0x12140, 0x12178, 0x12186, 0x12198, 0x121b0, + 0x121be, 0x121e2, 0x121e4, 0x121e8, 0x121f6, 0x12204, 0x12210, 0x1221e, 0x12220, 0x12278, 0x122f0, 0x12306, + 0x1230c, 0x12330, 0x1233e, 0x12360, 0x1237c, 0x1238e, 0x1239c, 0x123b8, 0x123c2, 0x123c8, 0x123d0, 0x123e6, + 0x123ec, 0x1241e, 0x12420, 0x1243c, 0x124f0, 0x125e0, 0x12618, 0x1263e, 0x12660, 0x1267c, 0x126c0, 0x126f8, + 0x12738, 0x12770, 0x1277e, 0x12782, 0x12784, 0x12790, 0x1279e, 0x127a0, 0x127bc, 0x127c6, 0x127cc, 0x127d8, + 0x127ee, 0x12820, 0x1283c, 0x12840, 0x12878, 0x128f0, 0x129e0, 0x12bc0, 0x12c18, 0x12c30, 0x12c3e, 0x12c60, + 0x12c7c, 0x12cc0, 0x12cf8, 0x12df0, 0x12e1c, 0x12e38, 0x12e70, 0x12e7e, 0x12ee0, 0x12efc, 0x12f04, 0x12f08, + 0x12f10, 0x12f20, 0x12f3c, 0x12f40, 0x12f78, 0x12f86, 0x12f8c, 0x12f98, 0x12fb0, 0x12fbe, 0x12fce, 0x12fdc, + 0x1302e, 0x1304e, 0x1305c, 0x13062, 0x13068, 0x1308e, 0x1309c, 0x130b8, 0x130c2, 0x130c8, 0x130d0, 0x130de, + 0x130ec, 0x130fa, 0x1310e, 0x13138, 0x13170, 0x1317e, 0x13182, 0x13184, 0x13190, 0x1319e, 0x131a0, 0x131bc, + 0x131c6, 0x131cc, 0x131d8, 0x131f2, 0x131f4, 0x1320e, 0x1321c, 0x13270, 0x1327e, 0x132e0, 0x132fc, 0x13308, + 0x1331e, 0x13320, 0x1333c, 0x13340, 0x13378, 0x13386, 0x13398, 0x133b0, 0x133be, 0x133ce, 0x133dc, 0x133e2, + 0x133e4, 0x133e8, 0x133f6, 0x1340e, 0x1341c, 0x13438, 0x13470, 0x1347e, 0x134e0, 0x134fc, 0x135c0, 0x135f8, + 0x13608, 0x13610, 0x1361e, 0x13620, 0x1363c, 0x13640, 0x13678, 0x136f0, 0x1370c, 0x13718, 0x13730, 0x1373e, + 0x13760, 0x1377c, 0x1379c, 0x137b8, 0x137c2, 0x137c4, 0x137c8, 0x137d0, 0x137de, 0x137e6, 0x137ec, 0x13816, + 0x13826, 0x1382c, 0x13846, 0x1384c, 0x13858, 0x1386e, 0x13874, 0x13886, 0x13898, 0x138b0, 0x138be, 0x138ce, + 0x138dc, 0x138e2, 0x138e4, 0x138e8, 0x13906, 0x1390c, 0x13930, 0x1393e, 0x13960, 0x1397c, 0x1398e, 0x1399c, + 0x139b8, 0x139c8, 0x139d0, 0x139de, 0x139e6, 0x139ec, 0x139fa, 0x13a06, 0x13a0c, 0x13a18, 0x13a30, 0x13a3e, + 0x13a60, 0x13a7c, 0x13ac0, 0x13af8, 0x13b0e, 0x13b1c, 0x13b38, 0x13b70, 0x13b7e, 0x13b88, 0x13b90, 0x13b9e, + 0x13ba0, 0x13bbc, 0x13bcc, 0x13bd8, 0x13bee, 0x13bf2, 0x13bf4, 0x13c12, 0x13c14, 0x13c22, 0x13c24, 0x13c28, + 0x13c36, 0x13c42, 0x13c48, 0x13c50, 0x13c5e, 0x13c66, 0x13c6c, 0x13c82, 0x13c84, 0x13c90, 0x13c9e, 0x13ca0, + 0x13cbc, 0x13cc6, 0x13ccc, 0x13cd8, 0x13cee, 0x13d02, 0x13d04, 0x13d08, 0x13d10, 0x13d1e, 0x13d20, 0x13d3c, + 0x13d40, 0x13d78, 0x13d86, 0x13d8c, 0x13d98, 0x13db0, 0x13dbe, 0x13dce, 0x13ddc, 0x13de4, 0x13de8, 0x13df6, + 0x13e1a, 0x13e2e, 0x13e32, 0x13e34, 0x13e4e, 0x13e5c, 0x13e62, 0x13e64, 0x13e68, 0x13e76, 0x13e8e, 0x13e9c, + 0x13eb8, 0x13ec2, 0x13ec4, 0x13ec8, 0x13ed0, 0x13ede, 0x13ee6, 0x13eec, 0x13f26, 0x13f2c, 0x13f3a, 0x13f46, + 0x13f4c, 0x13f58, 0x13f6e, 0x13f72, 0x13f74, 0x14082, 0x1409e, 0x140a0, 0x140bc, 0x14104, 0x14108, 0x14110, + 0x1411e, 0x14120, 0x1413c, 0x14140, 0x14178, 0x1418c, 0x14198, 0x141b0, 0x141be, 0x141e2, 0x141e4, 0x141e8, + 0x14208, 0x14210, 0x1421e, 0x14220, 0x1423c, 0x14240, 0x14278, 0x142f0, 0x14306, 0x1430c, 0x14318, 0x14330, + 0x1433e, 0x14360, 0x1437c, 0x1438e, 0x143c2, 0x143c4, 0x143c8, 0x143d0, 0x143e6, 0x143ec, 0x14408, 0x14410, + 0x1441e, 0x14420, 0x1443c, 0x14440, 0x14478, 0x144f0, 0x145e0, 0x1460c, 0x14618, 0x14630, 0x1463e, 0x14660, + 0x1467c, 0x146c0, 0x146f8, 0x1471c, 0x14738, 0x14770, 0x1477e, 0x14782, 0x14784, 0x14788, 0x14790, 0x147a0, + 0x147bc, 0x147c6, 0x147cc, 0x147d8, 0x147ee, 0x14810, 0x14820, 0x1483c, 0x14840, 0x14878, 0x148f0, 0x149e0, + 0x14bc0, 0x14c30, 0x14c3e, 0x14c60, 0x14c7c, 0x14cc0, 0x14cf8, 0x14df0, 0x14e38, 0x14e70, 0x14e7e, 0x14ee0, + 0x14efc, 0x14f04, 0x14f08, 0x14f10, 0x14f1e, 0x14f20, 0x14f3c, 0x14f40, 0x14f78, 0x14f86, 0x14f8c, 0x14f98, + 0x14fb0, 0x14fce, 0x14fdc, 0x15020, 0x15040, 0x15078, 0x150f0, 0x151e0, 0x153c0, 0x15860, 0x1587c, 0x158c0, + 0x158f8, 0x159f0, 0x15be0, 0x15c70, 0x15c7e, 0x15ce0, 0x15cfc, 0x15dc0, 0x15df8, 0x15e08, 0x15e10, 0x15e20, + 0x15e40, 0x15e78, 0x15ef0, 0x15f0c, 0x15f18, 0x15f30, 0x15f60, 0x15f7c, 0x15f8e, 0x15f9c, 0x15fb8, 0x1604e, + 0x1605c, 0x1608e, 0x1609c, 0x160b8, 0x160c2, 0x160c4, 0x160c8, 0x160de, 0x1610e, 0x1611c, 0x16138, 0x16170, + 0x1617e, 0x16184, 0x16188, 0x16190, 0x1619e, 0x161a0, 0x161bc, 0x161c6, 0x161cc, 0x161d8, 0x161f2, 0x161f4, + 0x1620e, 0x1621c, 0x16238, 0x16270, 0x1627e, 0x162e0, 0x162fc, 0x16304, 0x16308, 0x16310, 0x1631e, 0x16320, + 0x1633c, 0x16340, 0x16378, 0x16386, 0x1638c, 0x16398, 0x163b0, 0x163be, 0x163ce, 0x163dc, 0x163e2, 0x163e4, + 0x163e8, 0x163f6, 0x1640e, 0x1641c, 0x16438, 0x16470, 0x1647e, 0x164e0, 0x164fc, 0x165c0, 0x165f8, 0x16610, + 0x1661e, 0x16620, 0x1663c, 0x16640, 0x16678, 0x166f0, 0x16718, 0x16730, 0x1673e, 0x16760, 0x1677c, 0x1678e, + 0x1679c, 0x167b8, 0x167c2, 0x167c4, 0x167c8, 0x167d0, 0x167de, 0x167e6, 0x167ec, 0x1681c, 0x16838, 0x16870, + 0x168e0, 0x168fc, 0x169c0, 0x169f8, 0x16bf0, 0x16c10, 0x16c1e, 0x16c20, 0x16c3c, 0x16c40, 0x16c78, 0x16cf0, + 0x16de0, 0x16e18, 0x16e30, 0x16e3e, 0x16e60, 0x16e7c, 0x16ec0, 0x16ef8, 0x16f1c, 0x16f38, 0x16f70, 0x16f7e, + 0x16f84, 0x16f88, 0x16f90, 0x16f9e, 0x16fa0, 0x16fbc, 0x16fc6, 0x16fcc, 0x16fd8, 0x17026, 0x1702c, 0x17046, + 0x1704c, 0x17058, 0x1706e, 0x17086, 0x1708c, 0x17098, 0x170b0, 0x170be, 0x170ce, 0x170dc, 0x170e8, 0x17106, + 0x1710c, 0x17118, 0x17130, 0x1713e, 0x17160, 0x1717c, 0x1718e, 0x1719c, 0x171b8, 0x171c2, 0x171c4, 0x171c8, + 0x171d0, 0x171de, 0x171e6, 0x171ec, 0x171fa, 0x17206, 0x1720c, 0x17218, 0x17230, 0x1723e, 0x17260, 0x1727c, + 0x172c0, 0x172f8, 0x1730e, 0x1731c, 0x17338, 0x17370, 0x1737e, 0x17388, 0x17390, 0x1739e, 0x173a0, 0x173bc, + 0x173cc, 0x173d8, 0x173ee, 0x173f2, 0x173f4, 0x1740c, 0x17418, 0x17430, 0x1743e, 0x17460, 0x1747c, 0x174c0, + 0x174f8, 0x175f0, 0x1760e, 0x1761c, 0x17638, 0x17670, 0x1767e, 0x176e0, 0x176fc, 0x17708, 0x17710, 0x1771e, + 0x17720, 0x1773c, 0x17740, 0x17778, 0x17798, 0x177b0, 0x177be, 0x177dc, 0x177e2, 0x177e4, 0x177e8, 0x17822, + 0x17824, 0x17828, 0x17836, 0x17842, 0x17844, 0x17848, 0x17850, 0x1785e, 0x17866, 0x1786c, 0x17882, 0x17884, + 0x17888, 0x17890, 0x1789e, 0x178a0, 0x178bc, 0x178c6, 0x178cc, 0x178d8, 0x178ee, 0x178f2, 0x178f4, 0x17902, + 0x17904, 0x17908, 0x17910, 0x1791e, 0x17920, 0x1793c, 0x17940, 0x17978, 0x17986, 0x1798c, 0x17998, 0x179b0, + 0x179be, 0x179ce, 0x179dc, 0x179e2, 0x179e4, 0x179e8, 0x179f6, 0x17a04, 0x17a08, 0x17a10, 0x17a1e, 0x17a20, + 0x17a3c, 0x17a40, 0x17a78, 0x17af0, 0x17b06, 0x17b0c, 0x17b18, 0x17b30, 0x17b3e, 0x17b60, 0x17b7c, 0x17b8e, + 0x17b9c, 0x17bb8, 0x17bc4, 0x17bc8, 0x17bd0, 0x17bde, 0x17be6, 0x17bec, 0x17c2e, 0x17c32, 0x17c34, 0x17c4e, + 0x17c5c, 0x17c62, 0x17c64, 0x17c68, 0x17c76, 0x17c8e, 0x17c9c, 0x17cb8, 0x17cc2, 0x17cc4, 0x17cc8, 0x17cd0, + 0x17cde, 0x17ce6, 0x17cec, 0x17d0e, 0x17d1c, 0x17d38, 0x17d70, 0x17d82, 0x17d84, 0x17d88, 0x17d90, 0x17d9e, + 0x17da0, 0x17dbc, 0x17dc6, 0x17dcc, 0x17dd8, 0x17dee, 0x17e26, 0x17e2c, 0x17e3a, 0x17e46, 0x17e4c, 0x17e58, + 0x17e6e, 0x17e72, 0x17e74, 0x17e86, 0x17e8c, 0x17e98, 0x17eb0, 0x17ece, 0x17edc, 0x17ee2, 0x17ee4, 0x17ee8, + 0x17ef6, 0x1813a, 0x18172, 0x18174, 0x18216, 0x18226, 0x1823a, 0x1824c, 0x18258, 0x1826e, 0x18272, 0x18274, + 0x18298, 0x182be, 0x182e2, 0x182e4, 0x182e8, 0x182f6, 0x1835e, 0x1837a, 0x183ae, 0x183d6, 0x18416, 0x18426, + 0x1842c, 0x1843a, 0x18446, 0x18458, 0x1846e, 0x18472, 0x18474, 0x18486, 0x184b0, 0x184be, 0x184ce, 0x184dc, + 0x184e2, 0x184e4, 0x184e8, 0x184f6, 0x18506, 0x1850c, 0x18518, 0x18530, 0x1853e, 0x18560, 0x1857c, 0x1858e, + 0x1859c, 0x185b8, 0x185c2, 0x185c4, 0x185c8, 0x185d0, 0x185de, 0x185e6, 0x185ec, 0x185fa, 0x18612, 0x18614, + 0x18622, 0x18628, 0x18636, 0x18642, 0x18650, 0x1865e, 0x1867a, 0x18682, 0x18684, 0x18688, 0x18690, 0x1869e, + 0x186a0, 0x186bc, 0x186c6, 0x186cc, 0x186d8, 0x186ee, 0x186f2, 0x186f4, 0x1872e, 0x1874e, 0x1875c, 0x18796, + 0x187a6, 0x187ac, 0x187d2, 0x187d4, 0x18826, 0x1882c, 0x1883a, 0x18846, 0x1884c, 0x18858, 0x1886e, 0x18872, + 0x18874, 0x18886, 0x18898, 0x188b0, 0x188be, 0x188ce, 0x188dc, 0x188e2, 0x188e4, 0x188e8, 0x188f6, 0x1890c, + 0x18930, 0x1893e, 0x18960, 0x1897c, 0x1898e, 0x189b8, 0x189c2, 0x189c8, 0x189d0, 0x189de, 0x189e6, 0x189ec, + 0x189fa, 0x18a18, 0x18a30, 0x18a3e, 0x18a60, 0x18a7c, 0x18ac0, 0x18af8, 0x18b1c, 0x18b38, 0x18b70, 0x18b7e, + 0x18b82, 0x18b84, 0x18b88, 0x18b90, 0x18b9e, 0x18ba0, 0x18bbc, 0x18bc6, 0x18bcc, 0x18bd8, 0x18bee, 0x18bf2, + 0x18bf4, 0x18c22, 0x18c24, 0x18c28, 0x18c36, 0x18c42, 0x18c48, 0x18c50, 0x18c5e, 0x18c66, 0x18c7a, 0x18c82, + 0x18c84, 0x18c90, 0x18c9e, 0x18ca0, 0x18cbc, 0x18ccc, 0x18cf2, 0x18cf4, 0x18d04, 0x18d08, 0x18d10, 0x18d1e, + 0x18d20, 0x18d3c, 0x18d40, 0x18d78, 0x18d86, 0x18d98, 0x18dce, 0x18de2, 0x18de4, 0x18de8, 0x18e2e, 0x18e32, + 0x18e34, 0x18e4e, 0x18e5c, 0x18e62, 0x18e64, 0x18e68, 0x18e8e, 0x18e9c, 0x18eb8, 0x18ec2, 0x18ec4, 0x18ec8, + 0x18ed0, 0x18efa, 0x18f16, 0x18f26, 0x18f2c, 0x18f46, 0x18f4c, 0x18f58, 0x18f6e, 0x18f8a, 0x18f92, 0x18f94, + 0x18fa2, 0x18fa4, 0x18fa8, 0x18fb6, 0x1902c, 0x1903a, 0x19046, 0x1904c, 0x19058, 0x19072, 0x19074, 0x19086, + 0x19098, 0x190b0, 0x190be, 0x190ce, 0x190dc, 0x190e2, 0x190e8, 0x190f6, 0x19106, 0x1910c, 0x19130, 0x1913e, + 0x19160, 0x1917c, 0x1918e, 0x1919c, 0x191b8, 0x191c2, 0x191c8, 0x191d0, 0x191de, 0x191e6, 0x191ec, 0x191fa, + 0x19218, 0x1923e, 0x19260, 0x1927c, 0x192c0, 0x192f8, 0x19338, 0x19370, 0x1937e, 0x19382, 0x19384, 0x19390, + 0x1939e, 0x193a0, 0x193bc, 0x193c6, 0x193cc, 0x193d8, 0x193ee, 0x193f2, 0x193f4, 0x19430, 0x1943e, 0x19460, + 0x1947c, 0x194c0, 0x194f8, 0x195f0, 0x19638, 0x19670, 0x1967e, 0x196e0, 0x196fc, 0x19702, 0x19704, 0x19708, + 0x19710, 0x19720, 0x1973c, 0x19740, 0x19778, 0x19786, 0x1978c, 0x19798, 0x197b0, 0x197be, 0x197ce, 0x197dc, + 0x197e2, 0x197e4, 0x197e8, 0x19822, 0x19824, 0x19842, 0x19848, 0x19850, 0x1985e, 0x19866, 0x1987a, 0x19882, + 0x19884, 0x19890, 0x1989e, 0x198a0, 0x198bc, 0x198cc, 0x198f2, 0x198f4, 0x19902, 0x19908, 0x1991e, 0x19920, + 0x1993c, 0x19940, 0x19978, 0x19986, 0x19998, 0x199ce, 0x199e2, 0x199e4, 0x199e8, 0x19a08, 0x19a10, 0x19a1e, + 0x19a20, 0x19a3c, 0x19a40, 0x19a78, 0x19af0, 0x19b18, 0x19b3e, 0x19b60, 0x19b9c, 0x19bc2, 0x19bc4, 0x19bc8, + 0x19bd0, 0x19be6, 0x19c2e, 0x19c34, 0x19c4e, 0x19c5c, 0x19c62, 0x19c64, 0x19c68, 0x19c8e, 0x19c9c, 0x19cb8, + 0x19cc2, 0x19cc8, 0x19cd0, 0x19ce6, 0x19cfa, 0x19d0e, 0x19d1c, 0x19d38, 0x19d70, 0x19d7e, 0x19d82, 0x19d84, + 0x19d88, 0x19d90, 0x19da0, 0x19dcc, 0x19df2, 0x19df4, 0x19e16, 0x19e26, 0x19e2c, 0x19e46, 0x19e4c, 0x19e58, + 0x19e74, 0x19e86, 0x19e8c, 0x19e98, 0x19eb0, 0x19ebe, 0x19ece, 0x19ee2, 0x19ee4, 0x19ee8, 0x19f0a, 0x19f12, + 0x19f14, 0x19f22, 0x19f24, 0x19f28, 0x19f42, 0x19f44, 0x19f48, 0x19f50, 0x19f5e, 0x19f6c, 0x19f9a, 0x19fae, + 0x19fb2, 0x19fb4, 0x1a046, 0x1a04c, 0x1a072, 0x1a074, 0x1a086, 0x1a08c, 0x1a098, 0x1a0b0, 0x1a0be, 0x1a0e2, + 0x1a0e4, 0x1a0e8, 0x1a0f6, 0x1a106, 0x1a10c, 0x1a118, 0x1a130, 0x1a13e, 0x1a160, 0x1a17c, 0x1a18e, 0x1a19c, + 0x1a1b8, 0x1a1c2, 0x1a1c4, 0x1a1c8, 0x1a1d0, 0x1a1de, 0x1a1e6, 0x1a1ec, 0x1a218, 0x1a230, 0x1a23e, 0x1a260, + 0x1a27c, 0x1a2c0, 0x1a2f8, 0x1a31c, 0x1a338, 0x1a370, 0x1a37e, 0x1a382, 0x1a384, 0x1a388, 0x1a390, 0x1a39e, + 0x1a3a0, 0x1a3bc, 0x1a3c6, 0x1a3cc, 0x1a3d8, 0x1a3ee, 0x1a3f2, 0x1a3f4, 0x1a418, 0x1a430, 0x1a43e, 0x1a460, + 0x1a47c, 0x1a4c0, 0x1a4f8, 0x1a5f0, 0x1a61c, 0x1a638, 0x1a670, 0x1a67e, 0x1a6e0, 0x1a6fc, 0x1a702, 0x1a704, + 0x1a708, 0x1a710, 0x1a71e, 0x1a720, 0x1a73c, 0x1a740, 0x1a778, 0x1a786, 0x1a78c, 0x1a798, 0x1a7b0, 0x1a7be, + 0x1a7ce, 0x1a7dc, 0x1a7e2, 0x1a7e4, 0x1a7e8, 0x1a830, 0x1a860, 0x1a87c, 0x1a8c0, 0x1a8f8, 0x1a9f0, 0x1abe0, + 0x1ac70, 0x1ac7e, 0x1ace0, 0x1acfc, 0x1adc0, 0x1adf8, 0x1ae04, 0x1ae08, 0x1ae10, 0x1ae20, 0x1ae3c, 0x1ae40, + 0x1ae78, 0x1aef0, 0x1af06, 0x1af0c, 0x1af18, 0x1af30, 0x1af3e, 0x1af60, 0x1af7c, 0x1af8e, 0x1af9c, 0x1afb8, + 0x1afc4, 0x1afc8, 0x1afd0, 0x1afde, 0x1b042, 0x1b05e, 0x1b07a, 0x1b082, 0x1b084, 0x1b088, 0x1b090, 0x1b09e, + 0x1b0a0, 0x1b0bc, 0x1b0cc, 0x1b0f2, 0x1b0f4, 0x1b102, 0x1b104, 0x1b108, 0x1b110, 0x1b11e, 0x1b120, 0x1b13c, + 0x1b140, 0x1b178, 0x1b186, 0x1b198, 0x1b1ce, 0x1b1e2, 0x1b1e4, 0x1b1e8, 0x1b204, 0x1b208, 0x1b210, 0x1b21e, + 0x1b220, 0x1b23c, 0x1b240, 0x1b278, 0x1b2f0, 0x1b30c, 0x1b33e, 0x1b360, 0x1b39c, 0x1b3c2, 0x1b3c4, 0x1b3c8, + 0x1b3d0, 0x1b3e6, 0x1b410, 0x1b41e, 0x1b420, 0x1b43c, 0x1b440, 0x1b478, 0x1b4f0, 0x1b5e0, 0x1b618, 0x1b660, + 0x1b67c, 0x1b6c0, 0x1b738, 0x1b782, 0x1b784, 0x1b788, 0x1b790, 0x1b79e, 0x1b7a0, 0x1b7cc, 0x1b82e, 0x1b84e, + 0x1b85c, 0x1b88e, 0x1b89c, 0x1b8b8, 0x1b8c2, 0x1b8c4, 0x1b8c8, 0x1b8d0, 0x1b8e6, 0x1b8fa, 0x1b90e, 0x1b91c, + 0x1b938, 0x1b970, 0x1b97e, 0x1b982, 0x1b984, 0x1b988, 0x1b990, 0x1b99e, 0x1b9a0, 0x1b9cc, 0x1b9f2, 0x1b9f4, + 0x1ba0e, 0x1ba1c, 0x1ba38, 0x1ba70, 0x1ba7e, 0x1bae0, 0x1bafc, 0x1bb08, 0x1bb10, 0x1bb20, 0x1bb3c, 0x1bb40, + 0x1bb98, 0x1bbce, 0x1bbe2, 0x1bbe4, 0x1bbe8, 0x1bc16, 0x1bc26, 0x1bc2c, 0x1bc46, 0x1bc4c, 0x1bc58, 0x1bc72, + 0x1bc74, 0x1bc86, 0x1bc8c, 0x1bc98, 0x1bcb0, 0x1bcbe, 0x1bcce, 0x1bce2, 0x1bce4, 0x1bce8, 0x1bd06, 0x1bd0c, + 0x1bd18, 0x1bd30, 0x1bd3e, 0x1bd60, 0x1bd7c, 0x1bd9c, 0x1bdc2, 0x1bdc4, 0x1bdc8, 0x1bdd0, 0x1bde6, 0x1bdfa, + 0x1be12, 0x1be14, 0x1be22, 0x1be24, 0x1be28, 0x1be42, 0x1be44, 0x1be48, 0x1be50, 0x1be5e, 0x1be66, 0x1be82, + 0x1be84, 0x1be88, 0x1be90, 0x1be9e, 0x1bea0, 0x1bebc, 0x1becc, 0x1bef4, 0x1bf1a, 0x1bf2e, 0x1bf32, 0x1bf34, + 0x1bf4e, 0x1bf5c, 0x1bf62, 0x1bf64, 0x1bf68, 0x1c09a, 0x1c0b2, 0x1c0b4, 0x1c11a, 0x1c132, 0x1c134, 0x1c162, + 0x1c164, 0x1c168, 0x1c176, 0x1c1ba, 0x1c21a, 0x1c232, 0x1c234, 0x1c24e, 0x1c25c, 0x1c262, 0x1c264, 0x1c268, + 0x1c276, 0x1c28e, 0x1c2c2, 0x1c2c4, 0x1c2c8, 0x1c2d0, 0x1c2de, 0x1c2e6, 0x1c2ec, 0x1c2fa, 0x1c316, 0x1c326, + 0x1c33a, 0x1c346, 0x1c34c, 0x1c372, 0x1c374, 0x1c41a, 0x1c42e, 0x1c432, 0x1c434, 0x1c44e, 0x1c45c, 0x1c462, + 0x1c464, 0x1c468, 0x1c476, 0x1c48e, 0x1c49c, 0x1c4b8, 0x1c4c2, 0x1c4c8, 0x1c4d0, 0x1c4de, 0x1c4e6, 0x1c4ec, + 0x1c4fa, 0x1c51c, 0x1c538, 0x1c570, 0x1c57e, 0x1c582, 0x1c584, 0x1c588, 0x1c590, 0x1c59e, 0x1c5a0, 0x1c5bc, + 0x1c5c6, 0x1c5cc, 0x1c5d8, 0x1c5ee, 0x1c5f2, 0x1c5f4, 0x1c616, 0x1c626, 0x1c62c, 0x1c63a, 0x1c646, 0x1c64c, + 0x1c658, 0x1c66e, 0x1c672, 0x1c674, 0x1c686, 0x1c68c, 0x1c698, 0x1c6b0, 0x1c6be, 0x1c6ce, 0x1c6dc, 0x1c6e2, + 0x1c6e4, 0x1c6e8, 0x1c712, 0x1c714, 0x1c722, 0x1c728, 0x1c736, 0x1c742, 0x1c744, 0x1c748, 0x1c750, 0x1c75e, + 0x1c766, 0x1c76c, 0x1c77a, 0x1c7ae, 0x1c7d6, 0x1c7ea, 0x1c81a, 0x1c82e, 0x1c832, 0x1c834, 0x1c84e, 0x1c85c, + 0x1c862, 0x1c864, 0x1c868, 0x1c876, 0x1c88e, 0x1c89c, 0x1c8b8, 0x1c8c2, 0x1c8c8, 0x1c8d0, 0x1c8de, 0x1c8e6, + 0x1c8ec, 0x1c8fa, 0x1c90e, 0x1c938, 0x1c970, 0x1c97e, 0x1c982, 0x1c984, 0x1c990, 0x1c99e, 0x1c9a0, 0x1c9bc, + 0x1c9c6, 0x1c9cc, 0x1c9d8, 0x1c9ee, 0x1c9f2, 0x1c9f4, 0x1ca38, 0x1ca70, 0x1ca7e, 0x1cae0, 0x1cafc, 0x1cb02, + 0x1cb04, 0x1cb08, 0x1cb10, 0x1cb20, 0x1cb3c, 0x1cb40, 0x1cb78, 0x1cb86, 0x1cb8c, 0x1cb98, 0x1cbb0, 0x1cbbe, + 0x1cbce, 0x1cbdc, 0x1cbe2, 0x1cbe4, 0x1cbe8, 0x1cbf6, 0x1cc16, 0x1cc26, 0x1cc2c, 0x1cc3a, 0x1cc46, 0x1cc58, + 0x1cc72, 0x1cc74, 0x1cc86, 0x1ccb0, 0x1ccbe, 0x1ccce, 0x1cce2, 0x1cce4, 0x1cce8, 0x1cd06, 0x1cd0c, 0x1cd18, + 0x1cd30, 0x1cd3e, 0x1cd60, 0x1cd7c, 0x1cd9c, 0x1cdc2, 0x1cdc4, 0x1cdc8, 0x1cdd0, 0x1cdde, 0x1cde6, 0x1cdfa, + 0x1ce22, 0x1ce28, 0x1ce42, 0x1ce50, 0x1ce5e, 0x1ce66, 0x1ce7a, 0x1ce82, 0x1ce84, 0x1ce88, 0x1ce90, 0x1ce9e, + 0x1cea0, 0x1cebc, 0x1cecc, 0x1cef2, 0x1cef4, 0x1cf2e, 0x1cf32, 0x1cf34, 0x1cf4e, 0x1cf5c, 0x1cf62, 0x1cf64, + 0x1cf68, 0x1cf96, 0x1cfa6, 0x1cfac, 0x1cfca, 0x1cfd2, 0x1cfd4, 0x1d02e, 0x1d032, 0x1d034, 0x1d04e, 0x1d05c, + 0x1d062, 0x1d064, 0x1d068, 0x1d076, 0x1d08e, 0x1d09c, 0x1d0b8, 0x1d0c2, 0x1d0c4, 0x1d0c8, 0x1d0d0, 0x1d0de, + 0x1d0e6, 0x1d0ec, 0x1d0fa, 0x1d11c, 0x1d138, 0x1d170, 0x1d17e, 0x1d182, 0x1d184, 0x1d188, 0x1d190, 0x1d19e, + 0x1d1a0, 0x1d1bc, 0x1d1c6, 0x1d1cc, 0x1d1d8, 0x1d1ee, 0x1d1f2, 0x1d1f4, 0x1d21c, 0x1d238, 0x1d270, 0x1d27e, + 0x1d2e0, 0x1d2fc, 0x1d302, 0x1d304, 0x1d308, 0x1d310, 0x1d31e, 0x1d320, 0x1d33c, 0x1d340, 0x1d378, 0x1d386, + 0x1d38c, 0x1d398, 0x1d3b0, 0x1d3be, 0x1d3ce, 0x1d3dc, 0x1d3e2, 0x1d3e4, 0x1d3e8, 0x1d3f6, 0x1d470, 0x1d47e, + 0x1d4e0, 0x1d4fc, 0x1d5c0, 0x1d5f8, 0x1d604, 0x1d608, 0x1d610, 0x1d620, 0x1d640, 0x1d678, 0x1d6f0, 0x1d706, + 0x1d70c, 0x1d718, 0x1d730, 0x1d73e, 0x1d760, 0x1d77c, 0x1d78e, 0x1d79c, 0x1d7b8, 0x1d7c2, 0x1d7c4, 0x1d7c8, + 0x1d7d0, 0x1d7de, 0x1d7e6, 0x1d7ec, 0x1d826, 0x1d82c, 0x1d83a, 0x1d846, 0x1d84c, 0x1d858, 0x1d872, 0x1d874, + 0x1d886, 0x1d88c, 0x1d898, 0x1d8b0, 0x1d8be, 0x1d8ce, 0x1d8e2, 0x1d8e4, 0x1d8e8, 0x1d8f6, 0x1d90c, 0x1d918, + 0x1d930, 0x1d93e, 0x1d960, 0x1d97c, 0x1d99c, 0x1d9c2, 0x1d9c4, 0x1d9c8, 0x1d9d0, 0x1d9e6, 0x1d9fa, 0x1da0c, + 0x1da18, 0x1da30, 0x1da3e, 0x1da60, 0x1da7c, 0x1dac0, 0x1daf8, 0x1db38, 0x1db82, 0x1db84, 0x1db88, 0x1db90, + 0x1db9e, 0x1dba0, 0x1dbcc, 0x1dbf2, 0x1dbf4, 0x1dc22, 0x1dc42, 0x1dc44, 0x1dc48, 0x1dc50, 0x1dc5e, 0x1dc66, + 0x1dc7a, 0x1dc82, 0x1dc84, 0x1dc88, 0x1dc90, 0x1dc9e, 0x1dca0, 0x1dcbc, 0x1dccc, 0x1dcf2, 0x1dcf4, 0x1dd04, + 0x1dd08, 0x1dd10, 0x1dd1e, 0x1dd20, 0x1dd3c, 0x1dd40, 0x1dd78, 0x1dd86, 0x1dd98, 0x1ddce, 0x1dde2, 0x1dde4, + 0x1dde8, 0x1de2e, 0x1de32, 0x1de34, 0x1de4e, 0x1de5c, 0x1de62, 0x1de64, 0x1de68, 0x1de8e, 0x1de9c, 0x1deb8, + 0x1dec2, 0x1dec4, 0x1dec8, 0x1ded0, 0x1dee6, 0x1defa, 0x1df16, 0x1df26, 0x1df2c, 0x1df46, 0x1df4c, 0x1df58, + 0x1df72, 0x1df74, 0x1df8a, 0x1df92, 0x1df94, 0x1dfa2, 0x1dfa4, 0x1dfa8, 0x1e08a, 0x1e092, 0x1e094, 0x1e0a2, + 0x1e0a4, 0x1e0a8, 0x1e0b6, 0x1e0da, 0x1e10a, 0x1e112, 0x1e114, 0x1e122, 0x1e124, 0x1e128, 0x1e136, 0x1e142, + 0x1e144, 0x1e148, 0x1e150, 0x1e166, 0x1e16c, 0x1e17a, 0x1e19a, 0x1e1b2, 0x1e1b4, 0x1e20a, 0x1e212, 0x1e214, + 0x1e222, 0x1e224, 0x1e228, 0x1e236, 0x1e242, 0x1e248, 0x1e250, 0x1e25e, 0x1e266, 0x1e26c, 0x1e27a, 0x1e282, + 0x1e284, 0x1e288, 0x1e290, 0x1e2a0, 0x1e2bc, 0x1e2c6, 0x1e2cc, 0x1e2d8, 0x1e2ee, 0x1e2f2, 0x1e2f4, 0x1e31a, + 0x1e332, 0x1e334, 0x1e35c, 0x1e362, 0x1e364, 0x1e368, 0x1e3ba, 0x1e40a, 0x1e412, 0x1e414, 0x1e422, 0x1e428, + 0x1e436, 0x1e442, 0x1e448, 0x1e450, 0x1e45e, 0x1e466, 0x1e46c, 0x1e47a, 0x1e482, 0x1e484, 0x1e490, 0x1e49e, + 0x1e4a0, 0x1e4bc, 0x1e4c6, 0x1e4cc, 0x1e4d8, 0x1e4ee, 0x1e4f2, 0x1e4f4, 0x1e502, 0x1e504, 0x1e508, 0x1e510, + 0x1e51e, 0x1e520, 0x1e53c, 0x1e540, 0x1e578, 0x1e586, 0x1e58c, 0x1e598, 0x1e5b0, 0x1e5be, 0x1e5ce, 0x1e5dc, + 0x1e5e2, 0x1e5e4, 0x1e5e8, 0x1e5f6, 0x1e61a, 0x1e62e, 0x1e632, 0x1e634, 0x1e64e, 0x1e65c, 0x1e662, 0x1e668, + 0x1e68e, 0x1e69c, 0x1e6b8, 0x1e6c2, 0x1e6c4, 0x1e6c8, 0x1e6d0, 0x1e6e6, 0x1e6fa, 0x1e716, 0x1e726, 0x1e72c, + 0x1e73a, 0x1e746, 0x1e74c, 0x1e758, 0x1e772, 0x1e774, 0x1e792, 0x1e794, 0x1e7a2, 0x1e7a4, 0x1e7a8, 0x1e7b6, + 0x1e812, 0x1e814, 0x1e822, 0x1e824, 0x1e828, 0x1e836, 0x1e842, 0x1e844, 0x1e848, 0x1e850, 0x1e85e, 0x1e866, + 0x1e86c, 0x1e87a, 0x1e882, 0x1e884, 0x1e888, 0x1e890, 0x1e89e, 0x1e8a0, 0x1e8bc, 0x1e8c6, 0x1e8cc, 0x1e8d8, + 0x1e8ee, 0x1e8f2, 0x1e8f4, 0x1e902, 0x1e904, 0x1e908, 0x1e910, 0x1e920, 0x1e93c, 0x1e940, 0x1e978, 0x1e986, + 0x1e98c, 0x1e998, 0x1e9b0, 0x1e9be, 0x1e9ce, 0x1e9dc, 0x1e9e2, 0x1e9e4, 0x1e9e8, 0x1e9f6, 0x1ea04, 0x1ea08, + 0x1ea10, 0x1ea20, 0x1ea40, 0x1ea78, 0x1eaf0, 0x1eb06, 0x1eb0c, 0x1eb18, 0x1eb30, 0x1eb3e, 0x1eb60, 0x1eb7c, + 0x1eb8e, 0x1eb9c, 0x1ebb8, 0x1ebc2, 0x1ebc4, 0x1ebc8, 0x1ebd0, 0x1ebde, 0x1ebe6, 0x1ebec, 0x1ec1a, 0x1ec2e, + 0x1ec32, 0x1ec34, 0x1ec4e, 0x1ec5c, 0x1ec62, 0x1ec64, 0x1ec68, 0x1ec8e, 0x1ec9c, 0x1ecb8, 0x1ecc2, 0x1ecc4, + 0x1ecc8, 0x1ecd0, 0x1ece6, 0x1ecfa, 0x1ed0e, 0x1ed1c, 0x1ed38, 0x1ed70, 0x1ed7e, 0x1ed82, 0x1ed84, 0x1ed88, + 0x1ed90, 0x1ed9e, 0x1eda0, 0x1edcc, 0x1edf2, 0x1edf4, 0x1ee16, 0x1ee26, 0x1ee2c, 0x1ee3a, 0x1ee46, 0x1ee4c, + 0x1ee58, 0x1ee6e, 0x1ee72, 0x1ee74, 0x1ee86, 0x1ee8c, 0x1ee98, 0x1eeb0, 0x1eebe, 0x1eece, 0x1eedc, 0x1eee2, + 0x1eee4, 0x1eee8, 0x1ef12, 0x1ef22, 0x1ef24, 0x1ef28, 0x1ef36, 0x1ef42, 0x1ef44, 0x1ef48, 0x1ef50, 0x1ef5e, + 0x1ef66, 0x1ef6c, 0x1ef7a, 0x1efae, 0x1efb2, 0x1efb4, 0x1efd6, 0x1f096, 0x1f0a6, 0x1f0ac, 0x1f0ba, 0x1f0ca, + 0x1f0d2, 0x1f0d4, 0x1f116, 0x1f126, 0x1f12c, 0x1f13a, 0x1f146, 0x1f14c, 0x1f158, 0x1f16e, 0x1f172, 0x1f174, + 0x1f18a, 0x1f192, 0x1f194, 0x1f1a2, 0x1f1a4, 0x1f1a8, 0x1f1da, 0x1f216, 0x1f226, 0x1f22c, 0x1f23a, 0x1f246, + 0x1f258, 0x1f26e, 0x1f272, 0x1f274, 0x1f286, 0x1f28c, 0x1f298, 0x1f2b0, 0x1f2be, 0x1f2ce, 0x1f2dc, 0x1f2e2, + 0x1f2e4, 0x1f2e8, 0x1f2f6, 0x1f30a, 0x1f312, 0x1f314, 0x1f322, 0x1f328, 0x1f342, 0x1f344, 0x1f348, 0x1f350, + 0x1f35e, 0x1f366, 0x1f37a, 0x1f39a, 0x1f3ae, 0x1f3b2, 0x1f3b4, 0x1f416, 0x1f426, 0x1f42c, 0x1f43a, 0x1f446, + 0x1f44c, 0x1f458, 0x1f46e, 0x1f472, 0x1f474, 0x1f486, 0x1f48c, 0x1f498, 0x1f4b0, 0x1f4be, 0x1f4ce, 0x1f4dc, + 0x1f4e2, 0x1f4e4, 0x1f4e8, 0x1f4f6, 0x1f506, 0x1f50c, 0x1f518, 0x1f530, 0x1f53e, 0x1f560, 0x1f57c, 0x1f58e, + 0x1f59c, 0x1f5b8, 0x1f5c2, 0x1f5c4, 0x1f5c8, 0x1f5d0, 0x1f5de, 0x1f5e6, 0x1f5ec, 0x1f5fa, 0x1f60a, 0x1f612, + 0x1f614, 0x1f622, 0x1f624, 0x1f628, 0x1f636, 0x1f642, 0x1f644, 0x1f648, 0x1f650, 0x1f65e, 0x1f666, 0x1f67a, + 0x1f682, 0x1f684, 0x1f688, 0x1f690, 0x1f69e, 0x1f6a0, 0x1f6bc, 0x1f6cc, 0x1f6f2, 0x1f6f4, 0x1f71a, 0x1f72e, + 0x1f732, 0x1f734, 0x1f74e, 0x1f75c, 0x1f762, 0x1f764, 0x1f768, 0x1f776, 0x1f796, 0x1f7a6, 0x1f7ac, 0x1f7ba, + 0x1f7d2, 0x1f7d4, 0x1f89a, 0x1f8ae, 0x1f8b2, 0x1f8b4, 0x1f8d6, 0x1f8ea, 0x1f91a, 0x1f92e, 0x1f932, 0x1f934, + 0x1f94e, 0x1f95c, 0x1f962, 0x1f964, 0x1f968, 0x1f976, 0x1f996, 0x1f9a6, 0x1f9ac, 0x1f9ba, 0x1f9ca, 0x1f9d2, + 0x1f9d4, 0x1fa1a, 0x1fa2e, 0x1fa32, 0x1fa34, 0x1fa4e, 0x1fa5c, 0x1fa62, 0x1fa64, 0x1fa68, 0x1fa76, 0x1fa8e, + 0x1fa9c, 0x1fab8, 0x1fac2, 0x1fac4, 0x1fac8, 0x1fad0, 0x1fade, 0x1fae6, 0x1faec, 0x1fb16, 0x1fb26, 0x1fb2c, + 0x1fb3a, 0x1fb46, 0x1fb4c, 0x1fb58, 0x1fb6e, 0x1fb72, 0x1fb74, 0x1fb8a, 0x1fb92, 0x1fb94, 0x1fba2, 0x1fba4, + 0x1fba8, 0x1fbb6, 0x1fbda +}; +FX_INT32 CBC_PDF417Common::CODEWORD_TABLE[] = { + 2627, 1819, 2622, 2621, 1813, 1812, 2729, 2724, 2723, 2779, 2774, 2773, 902, 896, 908, 868, 865, 861, 859, 2511, + 873, 871, 1780, 835, 2493, 825, 2491, 842, 837, 844, 1764, 1762, 811, 810, 809, 2483, 807, 2482, 806, 2480, 815, + 814, 813, 812, 2484, 817, 816, 1745, 1744, 1742, 1746, 2655, 2637, 2635, 2626, 2625, 2623, 2628, 1820, 2752, + 2739, 2737, 2728, 2727, 2725, 2730, 2785, 2783, 2778, 2777, 2775, 2780, 787, 781, 747, 739, 736, 2413, 754, 752, + 1719, 692, 689, 681, 2371, 678, 2369, 700, 697, 694, 703, 1688, 1686, 642, 638, 2343, 631, 2341, 627, 2338, 651, + 646, 643, 2345, 654, 652, 1652, 1650, 1647, 1654, 601, 599, 2322, 596, 2321, 594, 2319, 2317, 611, 610, 608, 606, + 2324, 603, 2323, 615, 614, 612, 1617, 1616, 1614, 1612, 616, 1619, 1618, 2575, 2538, 2536, 905, 901, 898, 909, + 2509, 2507, 2504, 870, 867, 864, 860, 2512, 875, 872, 1781, 2490, 2489, 2487, 2485, 1748, 836, 834, 832, 830, + 2494, 827, 2492, 843, 841, 839, 845, 1765, 1763, 2701, 2676, 2674, 2653, 2648, 2656, 2634, 2633, 2631, 2629, + 1821, 2638, 2636, 2770, 2763, 2761, 2750, 2745, 2753, 2736, 2735, 2733, 2731, 1848, 2740, 2738, 2786, 2784, 591, + 588, 576, 569, 566, 2296, 1590, 537, 534, 526, 2276, 522, 2274, 545, 542, 539, 548, 1572, 1570, 481, 2245, 466, + 2242, 462, 2239, 492, 485, 482, 2249, 496, 494, 1534, 1531, 1528, 1538, 413, 2196, 406, 2191, 2188, 425, 419, + 2202, 415, 2199, 432, 430, 427, 1472, 1467, 1464, 433, 1476, 1474, 368, 367, 2160, 365, 2159, 362, 2157, 2155, + 2152, 378, 377, 375, 2166, 372, 2165, 369, 2162, 383, 381, 379, 2168, 1419, 1418, 1416, 1414, 385, 1411, 384, + 1423, 1422, 1420, 1424, 2461, 802, 2441, 2439, 790, 786, 783, 794, 2409, 2406, 2403, 750, 742, 738, 2414, 756, + 753, 1720, 2367, 2365, 2362, 2359, 1663, 693, 691, 684, 2373, 680, 2370, 702, 699, 696, 704, 1690, 1687, 2337, + 2336, 2334, 2332, 1624, 2329, 1622, 640, 637, 2344, 634, 2342, 630, 2340, 650, 648, 645, 2346, 655, 653, 1653, + 1651, 1649, 1655, 2612, 2597, 2595, 2571, 2568, 2565, 2576, 2534, 2529, 2526, 1787, 2540, 2537, 907, 904, 900, + 910, 2503, 2502, 2500, 2498, 1768, 2495, 1767, 2510, 2508, 2506, 869, 866, 863, 2513, 876, 874, 1782, 2720, 2713, + 2711, 2697, 2694, 2691, 2702, 2672, 2670, 2664, 1828, 2678, 2675, 2647, 2646, 2644, 2642, 1823, 2639, 1822, 2654, + 2652, 2650, 2657, 2771, 1855, 2765, 2762, 1850, 1849, 2751, 2749, 2747, 2754, 353, 2148, 344, 342, 336, 2142, + 332, 2140, 345, 1375, 1373, 306, 2130, 299, 2128, 295, 2125, 319, 314, 311, 2132, 1354, 1352, 1349, 1356, 262, + 257, 2101, 253, 2096, 2093, 274, 273, 267, 2107, 263, 2104, 280, 278, 275, 1316, 1311, 1308, 1320, 1318, 2052, + 202, 2050, 2044, 2040, 219, 2063, 212, 2060, 208, 2055, 224, 221, 2066, 1260, 1258, 1252, 231, 1248, 229, 1266, + 1264, 1261, 1268, 155, 1998, 153, 1996, 1994, 1991, 1988, 165, 164, 2007, 162, 2006, 159, 2003, 2000, 172, 171, + 169, 2012, 166, 2010, 1186, 1184, 1182, 1179, 175, 1176, 173, 1192, 1191, 1189, 1187, 176, 1194, 1193, 2313, + 2307, 2305, 592, 589, 2294, 2292, 2289, 578, 572, 568, 2297, 580, 1591, 2272, 2267, 2264, 1547, 538, 536, 529, + 2278, 525, 2275, 547, 544, 541, 1574, 1571, 2237, 2235, 2229, 1493, 2225, 1489, 478, 2247, 470, 2244, 465, 2241, + 493, 488, 484, 2250, 498, 495, 1536, 1533, 1530, 1539, 2187, 2186, 2184, 2182, 1432, 2179, 1430, 2176, 1427, 414, + 412, 2197, 409, 2195, 405, 2193, 2190, 426, 424, 421, 2203, 418, 2201, 431, 429, 1473, 1471, 1469, 1466, 434, + 1477, 1475, 2478, 2472, 2470, 2459, 2457, 2454, 2462, 803, 2437, 2432, 2429, 1726, 2443, 2440, 792, 789, 785, + 2401, 2399, 2393, 1702, 2389, 1699, 2411, 2408, 2405, 745, 741, 2415, 758, 755, 1721, 2358, 2357, 2355, 2353, + 1661, 2350, 1660, 2347, 1657, 2368, 2366, 2364, 2361, 1666, 690, 687, 2374, 683, 2372, 701, 698, 705, 1691, 1689, + 2619, 2617, 2610, 2608, 2605, 2613, 2593, 2588, 2585, 1803, 2599, 2596, 2563, 2561, 2555, 1797, 2551, 1795, 2573, + 2570, 2567, 2577, 2525, 2524, 2522, 2520, 1786, 2517, 1785, 2514, 1783, 2535, 2533, 2531, 2528, 1788, 2541, 2539, + 906, 903, 911, 2721, 1844, 2715, 2712, 1838, 1836, 2699, 2696, 2693, 2703, 1827, 1826, 1824, 2673, 2671, 2669, + 2666, 1829, 2679, 2677, 1858, 1857, 2772, 1854, 1853, 1851, 1856, 2766, 2764, 143, 1987, 139, 1986, 135, 133, + 131, 1984, 128, 1983, 125, 1981, 138, 137, 136, 1985, 1133, 1132, 1130, 112, 110, 1974, 107, 1973, 104, 1971, + 1969, 122, 121, 119, 117, 1977, 114, 1976, 124, 1115, 1114, 1112, 1110, 1117, 1116, 84, 83, 1953, 81, 1952, 78, + 1950, 1948, 1945, 94, 93, 91, 1959, 88, 1958, 85, 1955, 99, 97, 95, 1961, 1086, 1085, 1083, 1081, 1078, 100, + 1090, 1089, 1087, 1091, 49, 47, 1917, 44, 1915, 1913, 1910, 1907, 59, 1926, 56, 1925, 53, 1922, 1919, 66, 64, + 1931, 61, 1929, 1042, 1040, 1038, 71, 1035, 70, 1032, 68, 1048, 1047, 1045, 1043, 1050, 1049, 12, 10, 1869, 1867, + 1864, 1861, 21, 1880, 19, 1877, 1874, 1871, 28, 1888, 25, 1886, 22, 1883, 982, 980, 977, 974, 32, 30, 991, 989, + 987, 984, 34, 995, 994, 992, 2151, 2150, 2147, 2146, 2144, 356, 355, 354, 2149, 2139, 2138, 2136, 2134, 1359, + 343, 341, 338, 2143, 335, 2141, 348, 347, 346, 1376, 1374, 2124, 2123, 2121, 2119, 1326, 2116, 1324, 310, 308, + 305, 2131, 302, 2129, 298, 2127, 320, 318, 316, 313, 2133, 322, 321, 1355, 1353, 1351, 1357, 2092, 2091, 2089, + 2087, 1276, 2084, 1274, 2081, 1271, 259, 2102, 256, 2100, 252, 2098, 2095, 272, 269, 2108, 266, 2106, 281, 279, + 277, 1317, 1315, 1313, 1310, 282, 1321, 1319, 2039, 2037, 2035, 2032, 1203, 2029, 1200, 1197, 207, 2053, 205, + 2051, 201, 2049, 2046, 2043, 220, 218, 2064, 215, 2062, 211, 2059, 228, 226, 223, 2069, 1259, 1257, 1254, 232, + 1251, 230, 1267, 1265, 1263, 2316, 2315, 2312, 2311, 2309, 2314, 2304, 2303, 2301, 2299, 1593, 2308, 2306, 590, + 2288, 2287, 2285, 2283, 1578, 2280, 1577, 2295, 2293, 2291, 579, 577, 574, 571, 2298, 582, 581, 1592, 2263, 2262, + 2260, 2258, 1545, 2255, 1544, 2252, 1541, 2273, 2271, 2269, 2266, 1550, 535, 532, 2279, 528, 2277, 546, 543, 549, + 1575, 1573, 2224, 2222, 2220, 1486, 2217, 1485, 2214, 1482, 1479, 2238, 2236, 2234, 2231, 1496, 2228, 1492, 480, + 477, 2248, 473, 2246, 469, 2243, 490, 487, 2251, 497, 1537, 1535, 1532, 2477, 2476, 2474, 2479, 2469, 2468, 2466, + 2464, 1730, 2473, 2471, 2453, 2452, 2450, 2448, 1729, 2445, 1728, 2460, 2458, 2456, 2463, 805, 804, 2428, 2427, + 2425, 2423, 1725, 2420, 1724, 2417, 1722, 2438, 2436, 2434, 2431, 1727, 2444, 2442, 793, 791, 788, 795, 2388, + 2386, 2384, 1697, 2381, 1696, 2378, 1694, 1692, 2402, 2400, 2398, 2395, 1703, 2392, 1701, 2412, 2410, 2407, 751, + 748, 744, 2416, 759, 757, 1807, 2620, 2618, 1806, 1805, 2611, 2609, 2607, 2614, 1802, 1801, 1799, 2594, 2592, + 2590, 2587, 1804, 2600, 2598, 1794, 1793, 1791, 1789, 2564, 2562, 2560, 2557, 1798, 2554, 1796, 2574, 2572, 2569, + 2578, 1847, 1846, 2722, 1843, 1842, 1840, 1845, 2716, 2714, 1835, 1834, 1832, 1830, 1839, 1837, 2700, 2698, 2695, + 2704, 1817, 1811, 1810, 897, 862, 1777, 829, 826, 838, 1760, 1758, 808, 2481, 1741, 1740, 1738, 1743, 2624, 1818, + 2726, 2776, 782, 740, 737, 1715, 686, 679, 695, 1682, 1680, 639, 628, 2339, 647, 644, 1645, 1643, 1640, 1648, + 602, 600, 597, 595, 2320, 593, 2318, 609, 607, 604, 1611, 1610, 1608, 1606, 613, 1615, 1613, 2328, 926, 924, 892, + 886, 899, 857, 850, 2505, 1778, 824, 823, 821, 819, 2488, 818, 2486, 833, 831, 828, 840, 1761, 1759, 2649, 2632, + 2630, 2746, 2734, 2732, 2782, 2781, 570, 567, 1587, 531, 527, 523, 540, 1566, 1564, 476, 467, 463, 2240, 486, + 483, 1524, 1521, 1518, 1529, 411, 403, 2192, 399, 2189, 423, 416, 1462, 1457, 1454, 428, 1468, 1465, 2210, 366, + 363, 2158, 360, 2156, 357, 2153, 376, 373, 370, 2163, 1410, 1409, 1407, 1405, 382, 1402, 380, 1417, 1415, 1412, + 1421, 2175, 2174, 777, 774, 771, 784, 732, 725, 722, 2404, 743, 1716, 676, 674, 668, 2363, 665, 2360, 685, 1684, + 1681, 626, 624, 622, 2335, 620, 2333, 617, 2330, 641, 635, 649, 1646, 1644, 1642, 2566, 928, 925, 2530, 2527, + 894, 891, 888, 2501, 2499, 2496, 858, 856, 854, 851, 1779, 2692, 2668, 2665, 2645, 2643, 2640, 2651, 2768, 2759, + 2757, 2744, 2743, 2741, 2748, 352, 1382, 340, 337, 333, 1371, 1369, 307, 300, 296, 2126, 315, 312, 1347, 1342, + 1350, 261, 258, 250, 2097, 246, 2094, 271, 268, 264, 1306, 1301, 1298, 276, 1312, 1309, 2115, 203, 2048, 195, + 2045, 191, 2041, 213, 209, 2056, 1246, 1244, 1238, 225, 1234, 222, 1256, 1253, 1249, 1262, 2080, 2079, 154, 1997, + 150, 1995, 147, 1992, 1989, 163, 160, 2004, 156, 2001, 1175, 1174, 1172, 1170, 1167, 170, 1164, 167, 1185, 1183, + 1180, 1177, 174, 1190, 1188, 2025, 2024, 2022, 587, 586, 564, 559, 556, 2290, 573, 1588, 520, 518, 512, 2268, + 508, 2265, 530, 1568, 1565, 461, 457, 2233, 450, 2230, 446, 2226, 479, 471, 489, 1526, 1523, 1520, 397, 395, + 2185, 392, 2183, 389, 2180, 2177, 410, 2194, 402, 422, 1463, 1461, 1459, 1456, 1470, 2455, 799, 2433, 2430, 779, + 776, 773, 2397, 2394, 2390, 734, 728, 724, 746, 1717, 2356, 2354, 2351, 2348, 1658, 677, 675, 673, 670, 667, 688, + 1685, 1683, 2606, 2589, 2586, 2559, 2556, 2552, 927, 2523, 2521, 2518, 2515, 1784, 2532, 895, 893, 890, 2718, + 2709, 2707, 2689, 2687, 2684, 2663, 2662, 2660, 2658, 1825, 2667, 2769, 1852, 2760, 2758, 142, 141, 1139, 1138, + 134, 132, 129, 126, 1982, 1129, 1128, 1126, 1131, 113, 111, 108, 105, 1972, 101, 1970, 120, 118, 115, 1109, 1108, + 1106, 1104, 123, 1113, 1111, 82, 79, 1951, 75, 1949, 72, 1946, 92, 89, 86, 1956, 1077, 1076, 1074, 1072, 98, + 1069, 96, 1084, 1082, 1079, 1088, 1968, 1967, 48, 45, 1916, 42, 1914, 39, 1911, 1908, 60, 57, 54, 1923, 50, 1920, + 1031, 1030, 1028, 1026, 67, 1023, 65, 1020, 62, 1041, 1039, 1036, 1033, 69, 1046, 1044, 1944, 1943, 1941, 11, 9, + 1868, 7, 1865, 1862, 1859, 20, 1878, 16, 1875, 13, 1872, 970, 968, 966, 963, 29, 960, 26, 23, 983, 981, 978, 975, + 33, 971, 31, 990, 988, 985, 1906, 1904, 1902, 993, 351, 2145, 1383, 331, 330, 328, 326, 2137, 323, 2135, 339, + 1372, 1370, 294, 293, 291, 289, 2122, 286, 2120, 283, 2117, 309, 303, 317, 1348, 1346, 1344, 245, 244, 242, 2090, + 239, 2088, 236, 2085, 2082, 260, 2099, 249, 270, 1307, 1305, 1303, 1300, 1314, 189, 2038, 186, 2036, 183, 2033, + 2030, 2026, 206, 198, 2047, 194, 216, 1247, 1245, 1243, 1240, 227, 1237, 1255, 2310, 2302, 2300, 2286, 2284, + 2281, 565, 563, 561, 558, 575, 1589, 2261, 2259, 2256, 2253, 1542, 521, 519, 517, 514, 2270, 511, 533, 1569, + 1567, 2223, 2221, 2218, 2215, 1483, 2211, 1480, 459, 456, 453, 2232, 449, 474, 491, 1527, 1525, 1522, 2475, 2467, + 2465, 2451, 2449, 2446, 801, 800, 2426, 2424, 2421, 2418, 1723, 2435, 780, 778, 775, 2387, 2385, 2382, 2379, + 1695, 2375, 1693, 2396, 735, 733, 730, 727, 749, 1718, 2616, 2615, 2604, 2603, 2601, 2584, 2583, 2581, 2579, + 1800, 2591, 2550, 2549, 2547, 2545, 1792, 2542, 1790, 2558, 929, 2719, 1841, 2710, 2708, 1833, 1831, 2690, 2688, + 2686, 1815, 1809, 1808, 1774, 1756, 1754, 1737, 1736, 1734, 1739, 1816, 1711, 1676, 1674, 633, 629, 1638, 1636, + 1633, 1641, 598, 1605, 1604, 1602, 1600, 605, 1609, 1607, 2327, 887, 853, 1775, 822, 820, 1757, 1755, 1584, 524, + 1560, 1558, 468, 464, 1514, 1511, 1508, 1519, 408, 404, 400, 1452, 1447, 1444, 417, 1458, 1455, 2208, 364, 361, + 358, 2154, 1401, 1400, 1398, 1396, 374, 1393, 371, 1408, 1406, 1403, 1413, 2173, 2172, 772, 726, 723, 1712, 672, + 669, 666, 682, 1678, 1675, 625, 623, 621, 618, 2331, 636, 632, 1639, 1637, 1635, 920, 918, 884, 880, 889, 849, + 848, 847, 846, 2497, 855, 852, 1776, 2641, 2742, 2787, 1380, 334, 1367, 1365, 301, 297, 1340, 1338, 1335, 1343, + 255, 251, 247, 1296, 1291, 1288, 265, 1302, 1299, 2113, 204, 196, 192, 2042, 1232, 1230, 1224, 214, 1220, 210, + 1242, 1239, 1235, 1250, 2077, 2075, 151, 148, 1993, 144, 1990, 1163, 1162, 1160, 1158, 1155, 161, 1152, 157, + 1173, 1171, 1168, 1165, 168, 1181, 1178, 2021, 2020, 2018, 2023, 585, 560, 557, 1585, 516, 509, 1562, 1559, 458, + 447, 2227, 472, 1516, 1513, 1510, 398, 396, 393, 390, 2181, 386, 2178, 407, 1453, 1451, 1449, 1446, 420, 1460, + 2209, 769, 764, 720, 712, 2391, 729, 1713, 664, 663, 661, 659, 2352, 656, 2349, 671, 1679, 1677, 2553, 922, 919, + 2519, 2516, 885, 883, 881, 2685, 2661, 2659, 2767, 2756, 2755, 140, 1137, 1136, 130, 127, 1125, 1124, 1122, 1127, + 109, 106, 102, 1103, 1102, 1100, 1098, 116, 1107, 1105, 1980, 80, 76, 73, 1947, 1068, 1067, 1065, 1063, 90, 1060, + 87, 1075, 1073, 1070, 1080, 1966, 1965, 46, 43, 40, 1912, 36, 1909, 1019, 1018, 1016, 1014, 58, 1011, 55, 1008, + 51, 1029, 1027, 1024, 1021, 63, 1037, 1034, 1940, 1939, 1937, 1942, 8, 1866, 4, 1863, 1, 1860, 956, 954, 952, + 949, 946, 17, 14, 969, 967, 964, 961, 27, 957, 24, 979, 976, 972, 1901, 1900, 1898, 1896, 986, 1905, 1903, 350, + 349, 1381, 329, 327, 324, 1368, 1366, 292, 290, 287, 284, 2118, 304, 1341, 1339, 1337, 1345, 243, 240, 237, 2086, + 233, 2083, 254, 1297, 1295, 1293, 1290, 1304, 2114, 190, 187, 184, 2034, 180, 2031, 177, 2027, 199, 1233, 1231, + 1229, 1226, 217, 1223, 1241, 2078, 2076, 584, 555, 554, 552, 550, 2282, 562, 1586, 507, 506, 504, 502, 2257, 499, + 2254, 515, 1563, 1561, 445, 443, 441, 2219, 438, 2216, 435, 2212, 460, 454, 475, 1517, 1515, 1512, 2447, 798, + 797, 2422, 2419, 770, 768, 766, 2383, 2380, 2376, 721, 719, 717, 714, 731, 1714, 2602, 2582, 2580, 2548, 2546, + 2543, 923, 921, 2717, 2706, 2705, 2683, 2682, 2680, 1771, 1752, 1750, 1733, 1732, 1731, 1735, 1814, 1707, 1670, + 1668, 1631, 1629, 1626, 1634, 1599, 1598, 1596, 1594, 1603, 1601, 2326, 1772, 1753, 1751, 1581, 1554, 1552, 1504, + 1501, 1498, 1509, 1442, 1437, 1434, 401, 1448, 1445, 2206, 1392, 1391, 1389, 1387, 1384, 359, 1399, 1397, 1394, + 1404, 2171, 2170, 1708, 1672, 1669, 619, 1632, 1630, 1628, 1773, 1378, 1363, 1361, 1333, 1328, 1336, 1286, 1281, + 1278, 248, 1292, 1289, 2111, 1218, 1216, 1210, 197, 1206, 193, 1228, 1225, 1221, 1236, 2073, 2071, 1151, 1150, + 1148, 1146, 152, 1143, 149, 1140, 145, 1161, 1159, 1156, 1153, 158, 1169, 1166, 2017, 2016, 2014, 2019, 1582, + 510, 1556, 1553, 452, 448, 1506, 1500, 394, 391, 387, 1443, 1441, 1439, 1436, 1450, 2207, 765, 716, 713, 1709, + 662, 660, 657, 1673, 1671, 916, 914, 879, 878, 877, 882, 1135, 1134, 1121, 1120, 1118, 1123, 1097, 1096, 1094, + 1092, 103, 1101, 1099, 1979, 1059, 1058, 1056, 1054, 77, 1051, 74, 1066, 1064, 1061, 1071, 1964, 1963, 1007, + 1006, 1004, 1002, 999, 41, 996, 37, 1017, 1015, 1012, 1009, 52, 1025, 1022, 1936, 1935, 1933, 1938, 942, 940, + 938, 935, 932, 5, 2, 955, 953, 950, 947, 18, 943, 15, 965, 962, 958, 1895, 1894, 1892, 1890, 973, 1899, 1897, + 1379, 325, 1364, 1362, 288, 285, 1334, 1332, 1330, 241, 238, 234, 1287, 1285, 1283, 1280, 1294, 2112, 188, 185, + 181, 178, 2028, 1219, 1217, 1215, 1212, 200, 1209, 1227, 2074, 2072, 583, 553, 551, 1583, 505, 503, 500, 513, + 1557, 1555, 444, 442, 439, 436, 2213, 455, 451, 1507, 1505, 1502, 796, 763, 762, 760, 767, 711, 710, 708, 706, + 2377, 718, 715, 1710, 2544, 917, 915, 2681, 1627, 1597, 1595, 2325, 1769, 1749, 1747, 1499, 1438, 1435, 2204, + 1390, 1388, 1385, 1395, 2169, 2167, 1704, 1665, 1662, 1625, 1623, 1620, 1770, 1329, 1282, 1279, 2109, 1214, 1207, + 1222, 2068, 2065, 1149, 1147, 1144, 1141, 146, 1157, 1154, 2013, 2011, 2008, 2015, 1579, 1549, 1546, 1495, 1487, + 1433, 1431, 1428, 1425, 388, 1440, 2205, 1705, 658, 1667, 1664, 1119, 1095, 1093, 1978, 1057, 1055, 1052, 1062, + 1962, 1960, 1005, 1003, 1000, 997, 38, 1013, 1010, 1932, 1930, 1927, 1934, 941, 939, 936, 933, 6, 930, 3, 951, + 948, 944, 1889, 1887, 1884, 1881, 959, 1893, 1891, 35, 1377, 1360, 1358, 1327, 1325, 1322, 1331, 1277, 1275, + 1272, 1269, 235, 1284, 2110, 1205, 1204, 1201, 1198, 182, 1195, 179, 1213, 2070, 2067, 1580, 501, 1551, 1548, + 440, 437, 1497, 1494, 1490, 1503, 761, 709, 707, 1706, 913, 912, 2198, 1386, 2164, 2161, 1621, 1766, 2103, 1208, + 2058, 2054, 1145, 1142, 2005, 2002, 1999, 2009, 1488, 1429, 1426, 2200, 1698, 1659, 1656, 1975, 1053, 1957, 1954, + 1001, 998, 1924, 1921, 1918, 1928, 937, 934, 931, 1879, 1876, 1873, 1870, 945, 1885, 1882, 1323, 1273, 1270, + 2105, 1202, 1199, 1196, 1211, 2061, 2057, 1576, 1543, 1540, 1484, 1481, 1478, 1491, 1700 +}; +CBC_PDF417Common::CBC_PDF417Common() +{ +} +CBC_PDF417Common::~CBC_PDF417Common() +{ +} +FX_INT32 CBC_PDF417Common::getBitCountSum(CFX_Int32Array& moduleBitCount) +{ + FX_INT32 bitCountSum = 0; + for (FX_INT32 i = 0; i < moduleBitCount.GetSize(); i++) { + FX_INT32 count = moduleBitCount.GetAt(i); + bitCountSum += count; + } + return bitCountSum; +} +FX_INT32 CBC_PDF417Common::getCodeword(FX_DWORD symbol) +{ + FX_DWORD sym = symbol & 0x3FFFF; + FX_INT32 i = findCodewordIndex(sym); + if (i == -1) { + return -1; + } + return (CODEWORD_TABLE[i] - 1) % NUMBER_OF_CODEWORDS; +} +FX_INT32 CBC_PDF417Common::findCodewordIndex(FX_DWORD symbol) +{ + FX_INT32 first = 0; + FX_INT32 upto = sizeof(SYMBOL_TABLE) / sizeof(SYMBOL_TABLE[0]); + while (first < upto) { + FX_INT32 mid = ((FX_DWORD)(first + upto)) >> 1; + if (symbol < (FX_DWORD)SYMBOL_TABLE[mid]) { + upto = mid; + } else if (symbol > (FX_DWORD)SYMBOL_TABLE[mid]) { + first = mid + 1; + } else { + return mid; + } + } + return -1; +} diff --git a/xfa/src/fxbarcode/src/BC_PDF417Compaction.cpp b/xfa/src/fxbarcode/src/BC_PDF417Compaction.cpp new file mode 100644 index 0000000000..67a81b1178 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_PDF417Compaction.cpp @@ -0,0 +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 + +#include "barcode.h" +#include "include/BC_PDF417Compaction.h" +CBC_Compaction::CBC_Compaction() +{ +} +CBC_Compaction::~CBC_Compaction() +{ +} diff --git a/xfa/src/fxbarcode/src/BC_PDF417DecodedBitStreamParser.cpp b/xfa/src/fxbarcode/src/BC_PDF417DecodedBitStreamParser.cpp new file mode 100644 index 0000000000..cf0a1490f4 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_PDF417DecodedBitStreamParser.cpp @@ -0,0 +1,474 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by 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 "barcode.h" +#include "include/BC_DecoderResult.h" +#include "include/BC_PDF417ResultMetadata.h" +#include "include/BC_CommonDecoderResult.h" +#include "include/BC_PDF417DecodedBitStreamParser.h" +#define TEXT_COMPACTION_MODE_LATCH 900 +#define BYTE_COMPACTION_MODE_LATCH 901 +#define NUMERIC_COMPACTION_MODE_LATCH 902 +#define BYTE_COMPACTION_MODE_LATCH_6 924 +#define BEGIN_MACRO_PDF417_CONTROL_BLOCK 928 +#define BEGIN_MACRO_PDF417_OPTIONAL_FIELD 923 +#define MACRO_PDF417_TERMINATOR 922 +#define MODE_SHIFT_TO_BYTE_COMPACTION_MODE 913 +FX_INT32 CBC_DecodedBitStreamPaser::MAX_NUMERIC_CODEWORDS = 15; +FX_INT32 CBC_DecodedBitStreamPaser::EXP900[16] = {0}; +FX_INT32 CBC_DecodedBitStreamPaser::NUMBER_OF_SEQUENCE_CODEWORDS = 2; +FX_INT32 CBC_DecodedBitStreamPaser::PL = 25; +FX_INT32 CBC_DecodedBitStreamPaser::LL = 27; +FX_INT32 CBC_DecodedBitStreamPaser::AS = 27; +FX_INT32 CBC_DecodedBitStreamPaser::ML = 28; +FX_INT32 CBC_DecodedBitStreamPaser::AL = 28; +FX_INT32 CBC_DecodedBitStreamPaser::PS = 29; +FX_INT32 CBC_DecodedBitStreamPaser::PAL = 29; +FX_CHAR CBC_DecodedBitStreamPaser::PUNCT_CHARS[29] = { + ';', '<', '>', '@', '[', '\\', '}', '_', '`', '~', '!', + '\r', '\t', ',', ':', '\n', '-', '.', '$', '/', '"', '|', '*', + '(', ')', '?', '{', '}', '\'' +}; +FX_CHAR CBC_DecodedBitStreamPaser::MIXED_CHARS[30] = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '&', + '\r', '\t', ',', ':', '#', '-', '.', '$', '/', '+', '%', '*', + '=', '^' +}; +void CBC_DecodedBitStreamPaser::Initialize() +{ + EXP900[0] = 1; + FX_INT32 nineHundred = 900; + EXP900[1] = nineHundred; + for (FX_INT32 i = 2; i < sizeof(EXP900) / sizeof(FX_INT32); i++) { + EXP900[i] = EXP900[i - 1] * nineHundred; + } +} +void CBC_DecodedBitStreamPaser::Finalize() +{ +} +CBC_DecodedBitStreamPaser::CBC_DecodedBitStreamPaser() +{ +} +CBC_DecodedBitStreamPaser::~CBC_DecodedBitStreamPaser() +{ +} +CBC_CommonDecoderResult* CBC_DecodedBitStreamPaser::decode(CFX_Int32Array &codewords, CFX_ByteString ecLevel, FX_INT32 &e) +{ + CFX_ByteString result; + FX_INT32 codeIndex = 1; + FX_INT32 code = codewords.GetAt(codeIndex); + codeIndex++; + CBC_PDF417ResultMetadata* resultMetadata = FX_NEW CBC_PDF417ResultMetadata; + while (codeIndex < codewords[0]) { + switch (code) { + case TEXT_COMPACTION_MODE_LATCH: + codeIndex = textCompaction(codewords, codeIndex, result); + break; + case BYTE_COMPACTION_MODE_LATCH: + codeIndex = byteCompaction(code, codewords, codeIndex, result); + break; + case NUMERIC_COMPACTION_MODE_LATCH: + codeIndex = numericCompaction(codewords, codeIndex, result, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + break; + case MODE_SHIFT_TO_BYTE_COMPACTION_MODE: + codeIndex = byteCompaction(code, codewords, codeIndex, result); + break; + case BYTE_COMPACTION_MODE_LATCH_6: + codeIndex = byteCompaction(code, codewords, codeIndex, result); + break; + case BEGIN_MACRO_PDF417_CONTROL_BLOCK: + codeIndex = decodeMacroBlock(codewords, codeIndex, resultMetadata, e); + if (e != BCExceptionNO) { + delete resultMetadata; + return NULL; + } + break; + default: + codeIndex--; + codeIndex = textCompaction(codewords, codeIndex, result); + break; + } + if (codeIndex < codewords.GetSize()) { + code = codewords[codeIndex++]; + } else { + e = BCExceptionFormatInstance; + delete resultMetadata; + return NULL; + } + } + if (result.GetLength() == 0) { + e = BCExceptionFormatInstance; + delete resultMetadata; + return NULL; + } + CFX_ByteArray rawBytes; + CFX_PtrArray byteSegments; + CBC_CommonDecoderResult *tempCd = FX_NEW CBC_CommonDecoderResult(); + tempCd->Init(rawBytes, result, byteSegments, ecLevel, e); + if (e != BCExceptionNO) { + delete resultMetadata; + return NULL; + } + tempCd->setOther(resultMetadata); + return tempCd; +} +FX_INT32 CBC_DecodedBitStreamPaser::decodeMacroBlock(CFX_Int32Array &codewords, FX_INT32 codeIndex, CBC_PDF417ResultMetadata* resultMetadata, FX_INT32 &e) +{ + if (codeIndex + NUMBER_OF_SEQUENCE_CODEWORDS > codewords[0]) { + e = BCExceptionFormatInstance; + return -1; + } + CFX_Int32Array segmentIndexArray; + segmentIndexArray.SetSize(NUMBER_OF_SEQUENCE_CODEWORDS); + for (FX_INT32 i = 0; i < NUMBER_OF_SEQUENCE_CODEWORDS; i++, codeIndex++) { + segmentIndexArray.SetAt(i, codewords[codeIndex]); + } + CFX_ByteString str = decodeBase900toBase10(segmentIndexArray, NUMBER_OF_SEQUENCE_CODEWORDS, e); + BC_EXCEPTION_CHECK_ReturnValue(e, -1); + resultMetadata->setSegmentIndex(atoi(str.GetBuffer(str.GetLength()))); + CFX_ByteString fileId; + codeIndex = textCompaction(codewords, codeIndex, fileId); + resultMetadata->setFileId(fileId); + if (codewords[codeIndex] == BEGIN_MACRO_PDF417_OPTIONAL_FIELD) { + codeIndex++; + CFX_Int32Array additionalOptionCodeWords; + additionalOptionCodeWords.SetSize(codewords[0] - codeIndex); + FX_INT32 additionalOptionCodeWordsIndex = 0; + FX_BOOL end = FALSE; + while ((codeIndex < codewords[0]) && !end) { + FX_INT32 code = codewords[codeIndex++]; + if (code < TEXT_COMPACTION_MODE_LATCH) { + additionalOptionCodeWords[additionalOptionCodeWordsIndex++] = code; + } else { + switch (code) { + case MACRO_PDF417_TERMINATOR: + resultMetadata->setLastSegment(TRUE); + codeIndex++; + end = TRUE; + break; + default: + e = BCExceptionFormatInstance; + return -1; + } + } + } + CFX_Int32Array array; + array.SetSize(additionalOptionCodeWordsIndex); + array.Copy(additionalOptionCodeWords); + resultMetadata->setOptionalData(array); + } else if (codewords[codeIndex] == MACRO_PDF417_TERMINATOR) { + resultMetadata->setLastSegment(TRUE); + codeIndex++; + } + return codeIndex; +} +FX_INT32 CBC_DecodedBitStreamPaser::textCompaction(CFX_Int32Array &codewords, FX_INT32 codeIndex, CFX_ByteString &result) +{ + CFX_Int32Array textCompactionData; + textCompactionData.SetSize((codewords[0] - codeIndex) << 1); + CFX_Int32Array byteCompactionData; + byteCompactionData.SetSize((codewords[0] - codeIndex) << 1); + FX_INT32 index = 0; + FX_BOOL end = FALSE; + while ((codeIndex < codewords[0]) && !end) { + FX_INT32 code = codewords[codeIndex++]; + if (code < TEXT_COMPACTION_MODE_LATCH) { + textCompactionData[index] = code / 30; + textCompactionData[index + 1] = code % 30; + index += 2; + } else { + switch (code) { + case TEXT_COMPACTION_MODE_LATCH: + textCompactionData[index++] = TEXT_COMPACTION_MODE_LATCH; + break; + case BYTE_COMPACTION_MODE_LATCH: + codeIndex--; + end = TRUE; + break; + case NUMERIC_COMPACTION_MODE_LATCH: + codeIndex--; + end = TRUE; + break; + case BEGIN_MACRO_PDF417_CONTROL_BLOCK: + codeIndex--; + end = TRUE; + break; + case BEGIN_MACRO_PDF417_OPTIONAL_FIELD: + codeIndex--; + end = TRUE; + break; + case MACRO_PDF417_TERMINATOR: + codeIndex--; + end = TRUE; + break; + case MODE_SHIFT_TO_BYTE_COMPACTION_MODE: + textCompactionData[index] = MODE_SHIFT_TO_BYTE_COMPACTION_MODE; + code = codewords[codeIndex++]; + byteCompactionData[index] = code; + index++; + break; + case BYTE_COMPACTION_MODE_LATCH_6: + codeIndex--; + end = TRUE; + break; + } + } + } + decodeTextCompaction(textCompactionData, byteCompactionData, index, result); + return codeIndex; +} +void CBC_DecodedBitStreamPaser::decodeTextCompaction(CFX_Int32Array &textCompactionData, CFX_Int32Array &byteCompactionData, FX_INT32 length, CFX_ByteString &result) +{ + Mode subMode = ALPHA; + Mode priorToShiftMode = ALPHA; + FX_INT32 i = 0; + while (i < length) { + FX_INT32 subModeCh = textCompactionData[i]; + FX_CHAR ch = 0; + switch (subMode) { + case ALPHA: + if (subModeCh < 26) { + ch = (FX_CHAR) ('A' + subModeCh); + } else { + if (subModeCh == 26) { + ch = ' '; + } else if (subModeCh == LL) { + subMode = LOWER; + } else if (subModeCh == ML) { + subMode = MIXED; + } else if (subModeCh == PS) { + priorToShiftMode = subMode; + subMode = PUNCT_SHIFT; + } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { + result += (FX_CHAR) byteCompactionData[i]; + } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { + subMode = ALPHA; + } + } + break; + case LOWER: + if (subModeCh < 26) { + ch = (FX_CHAR) ('a' + subModeCh); + } else { + if (subModeCh == 26) { + ch = ' '; + } else if (subModeCh == AS) { + priorToShiftMode = subMode; + subMode = ALPHA_SHIFT; + } else if (subModeCh == ML) { + subMode = MIXED; + } else if (subModeCh == PS) { + priorToShiftMode = subMode; + subMode = PUNCT_SHIFT; + } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { + result += (FX_CHAR) byteCompactionData[i]; + } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { + subMode = ALPHA; + } + } + break; + case MIXED: + if (subModeCh < PL) { + ch = MIXED_CHARS[subModeCh]; + } else { + if (subModeCh == PL) { + subMode = PUNCT; + } else if (subModeCh == 26) { + ch = ' '; + } else if (subModeCh == LL) { + subMode = LOWER; + } else if (subModeCh == AL) { + subMode = ALPHA; + } else if (subModeCh == PS) { + priorToShiftMode = subMode; + subMode = PUNCT_SHIFT; + } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { + result += (FX_CHAR) byteCompactionData[i]; + } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { + subMode = ALPHA; + } + } + break; + case PUNCT: + if (subModeCh < PAL) { + ch = PUNCT_CHARS[subModeCh]; + } else { + if (subModeCh == PAL) { + subMode = ALPHA; + } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { + result += (FX_CHAR) byteCompactionData[i]; + } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { + subMode = ALPHA; + } + } + break; + case ALPHA_SHIFT: + subMode = priorToShiftMode; + if (subModeCh < 26) { + ch = (FX_CHAR) ('A' + subModeCh); + } else { + if (subModeCh == 26) { + ch = ' '; + } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { + subMode = ALPHA; + } + } + break; + case PUNCT_SHIFT: + subMode = priorToShiftMode; + if (subModeCh < PAL) { + ch = PUNCT_CHARS[subModeCh]; + } else { + if (subModeCh == PAL) { + subMode = ALPHA; + } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { + result += (FX_CHAR) byteCompactionData[i]; + } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { + subMode = ALPHA; + } + } + break; + } + if (ch != 0) { + result += ch; + } + i++; + } +} +FX_INT32 CBC_DecodedBitStreamPaser::byteCompaction(FX_INT32 mode, CFX_Int32Array &codewords, FX_INT32 codeIndex, CFX_ByteString &result) +{ + if (mode == BYTE_COMPACTION_MODE_LATCH) { + FX_INT32 count = 0; + FX_INT64 value = 0; + FX_WORD* decodedData = FX_Alloc(FX_WORD, 6 * sizeof(FX_WORD)); + CFX_Int32Array byteCompactedCodewords; + byteCompactedCodewords.SetSize(6); + FX_BOOL end = FALSE; + FX_INT32 nextCode = codewords[codeIndex++]; + while ((codeIndex < codewords[0]) && !end) { + byteCompactedCodewords[count++] = nextCode; + value = 900 * value + nextCode; + nextCode = codewords[codeIndex++]; + if (nextCode == TEXT_COMPACTION_MODE_LATCH || + nextCode == BYTE_COMPACTION_MODE_LATCH || + nextCode == NUMERIC_COMPACTION_MODE_LATCH || + nextCode == BYTE_COMPACTION_MODE_LATCH_6 || + nextCode == BEGIN_MACRO_PDF417_CONTROL_BLOCK || + nextCode == BEGIN_MACRO_PDF417_OPTIONAL_FIELD || + nextCode == MACRO_PDF417_TERMINATOR) { + codeIndex--; + end = TRUE; + } else { + if ((count % 5 == 0) && (count > 0)) { + FX_INT32 j = 0; + for (; j < 6; ++j) { + decodedData[5 - j] = (FX_WORD) (value % 256); + value >>= 8; + } + for (j = 0; j < 6; ++j) { + result += (FX_CHAR)decodedData[j]; + } + count = 0; + } + } + } + FX_Free(decodedData); + if (codeIndex == codewords[0] && nextCode < TEXT_COMPACTION_MODE_LATCH) { + byteCompactedCodewords[count++] = nextCode; + } + for (FX_INT32 i = 0; i < count; i++) { + result += (FX_CHAR)(FX_WORD) byteCompactedCodewords[i]; + } + } else if (mode == BYTE_COMPACTION_MODE_LATCH_6) { + FX_INT32 count = 0; + FX_INT64 value = 0; + FX_BOOL end = FALSE; + while (codeIndex < codewords[0] && !end) { + FX_INT32 code = codewords[codeIndex++]; + if (code < TEXT_COMPACTION_MODE_LATCH) { + count++; + value = 900 * value + code; + } else { + if (code == TEXT_COMPACTION_MODE_LATCH || + code == BYTE_COMPACTION_MODE_LATCH || + code == NUMERIC_COMPACTION_MODE_LATCH || + code == BYTE_COMPACTION_MODE_LATCH_6 || + code == BEGIN_MACRO_PDF417_CONTROL_BLOCK || + code == BEGIN_MACRO_PDF417_OPTIONAL_FIELD || + code == MACRO_PDF417_TERMINATOR) { + codeIndex--; + end = TRUE; + } + } + if ((count % 5 == 0) && (count > 0)) { + FX_WORD* decodedData = FX_Alloc(FX_WORD, 6 * sizeof(FX_WORD)); + FX_INT32 j = 0; + for (; j < 6; ++j) { + decodedData[5 - j] = (FX_WORD) (value & 0xFF); + value >>= 8; + } + for (j = 0; j < 6; ++j) { + result += (FX_CHAR)decodedData[j]; + } + count = 0; + FX_Free(decodedData); + } + } + } + return codeIndex; +} +FX_INT32 CBC_DecodedBitStreamPaser::numericCompaction(CFX_Int32Array &codewords, FX_INT32 codeIndex, CFX_ByteString &result, FX_INT32 &e) +{ + FX_INT32 count = 0; + FX_BOOL end = FALSE; + CFX_Int32Array numericCodewords; + numericCodewords.SetSize(MAX_NUMERIC_CODEWORDS); + while (codeIndex < codewords[0] && !end) { + FX_INT32 code = codewords[codeIndex++]; + if (codeIndex == codewords[0]) { + end = TRUE; + } + if (code < TEXT_COMPACTION_MODE_LATCH) { + numericCodewords[count] = code; + count++; + } else { + if (code == TEXT_COMPACTION_MODE_LATCH || + code == BYTE_COMPACTION_MODE_LATCH || + code == BYTE_COMPACTION_MODE_LATCH_6 || + code == BEGIN_MACRO_PDF417_CONTROL_BLOCK || + code == BEGIN_MACRO_PDF417_OPTIONAL_FIELD || + code == MACRO_PDF417_TERMINATOR) { + codeIndex--; + end = TRUE; + } + } + if (count % MAX_NUMERIC_CODEWORDS == 0 || + code == NUMERIC_COMPACTION_MODE_LATCH || + end) { + CFX_ByteString s = decodeBase900toBase10(numericCodewords, count, e); + BC_EXCEPTION_CHECK_ReturnValue(e, -1); + result += s; + count = 0; + } + } + return codeIndex; +} +CFX_ByteString CBC_DecodedBitStreamPaser::decodeBase900toBase10(CFX_Int32Array &codewords, FX_INT32 count, FX_INT32 &e) +{ + FX_INT32 result = 0; + for (FX_INT32 i = 0; i < count; i++) { + result += EXP900[count - i - 1] * codewords[i]; + } + CFX_ByteString resultString; + resultString = resultString.FormatInteger(result); + if (resultString.GetAt(0) != '1') { + e = BCExceptionFormatInstance; + return ' '; + } + return resultString.Mid(1, resultString.GetLength() - 1); +} diff --git a/xfa/src/fxbarcode/src/BC_PDF417DetectionResult.cpp b/xfa/src/fxbarcode/src/BC_PDF417DetectionResult.cpp new file mode 100644 index 0000000000..3d5faed1f9 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_PDF417DetectionResult.cpp @@ -0,0 +1,267 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_PDF417Codeword.h" +#include "include/BC_PDF417BarcodeMetadata.h" +#include "include/BC_PDF417BoundingBox.h" +#include "include/BC_PDF417DetectionResultColumn.h" +#include "include/BC_PDF417Common.h" +#include "include/BC_PDF417DetectionResultRowIndicatorColumn.h" +#include "include/BC_PDF417DetectionResult.h" +FX_INT32 CBC_DetectionResult::ADJUST_ROW_NUMBER_SKIP = 2; +CBC_DetectionResult::CBC_DetectionResult(CBC_BarcodeMetadata* barcodeMetadata, CBC_BoundingBox* boundingBox) +{ + m_barcodeMetadata = barcodeMetadata; + m_barcodeColumnCount = barcodeMetadata->getColumnCount(); + m_boundingBox = boundingBox; + m_detectionResultColumns.SetSize(m_barcodeColumnCount + 2); + for (FX_INT32 i = 0; i < m_barcodeColumnCount + 2; i++) { + m_detectionResultColumns[i] = NULL; + } +} +CBC_DetectionResult::~CBC_DetectionResult() +{ + delete m_boundingBox; + delete m_barcodeMetadata; + m_detectionResultColumns.RemoveAll(); +} +CFX_PtrArray& CBC_DetectionResult::getDetectionResultColumns() +{ + adjustIndicatorColumnRowNumbers((CBC_DetectionResultColumn*)m_detectionResultColumns.GetAt(0)); + adjustIndicatorColumnRowNumbers((CBC_DetectionResultColumn*)m_detectionResultColumns.GetAt(m_barcodeColumnCount + 1)); + FX_INT32 unadjustedCodewordCount = CBC_PDF417Common::MAX_CODEWORDS_IN_BARCODE; + FX_INT32 previousUnadjustedCount; + do { + previousUnadjustedCount = unadjustedCodewordCount; + unadjustedCodewordCount = adjustRowNumbers(); + } while (unadjustedCodewordCount > 0 && unadjustedCodewordCount < previousUnadjustedCount); + return m_detectionResultColumns; +} +void CBC_DetectionResult::setBoundingBox(CBC_BoundingBox* boundingBox) +{ + m_boundingBox = boundingBox; +} +CBC_BoundingBox* CBC_DetectionResult::getBoundingBox() +{ + return m_boundingBox; +} +void CBC_DetectionResult::setDetectionResultColumn(FX_INT32 barcodeColumn, CBC_DetectionResultColumn* detectionResultColumn) +{ + m_detectionResultColumns[barcodeColumn] = detectionResultColumn; +} +CBC_DetectionResultColumn* CBC_DetectionResult::getDetectionResultColumn(FX_INT32 barcodeColumn) +{ + return (CBC_DetectionResultColumn*)m_detectionResultColumns[barcodeColumn]; +} +CFX_ByteString CBC_DetectionResult::toString() +{ + CBC_DetectionResultColumn* rowIndicatorColumn = (CBC_DetectionResultColumn*)m_detectionResultColumns[0]; + if (rowIndicatorColumn == NULL) { + rowIndicatorColumn = (CBC_DetectionResultColumn*)m_detectionResultColumns[m_barcodeColumnCount + 1]; + } + CFX_ByteString result; + for (FX_INT32 codewordsRow = 0; codewordsRow < rowIndicatorColumn->getCodewords()->GetSize(); codewordsRow++) { + result += (FX_CHAR) codewordsRow; + for (FX_INT32 barcodeColumn = 0; barcodeColumn < m_barcodeColumnCount + 2; barcodeColumn++) { + if (m_detectionResultColumns[barcodeColumn] == NULL) { + result += " | "; + continue; + } + CBC_Codeword* codeword = (CBC_Codeword*)((CBC_DetectionResultColumn*)m_detectionResultColumns[barcodeColumn])->getCodewords()->GetAt(codewordsRow); + if (codeword == NULL) { + result += " | "; + continue; + } + result += codeword->getRowNumber(); + result += codeword->getValue(); + } + } + return result; +} +void CBC_DetectionResult::adjustIndicatorColumnRowNumbers(CBC_DetectionResultColumn* detectionResultColumn) +{ + if (detectionResultColumn != NULL) { + ((CBC_DetectionResultRowIndicatorColumn*)detectionResultColumn)->adjustCompleteIndicatorColumnRowNumbers(*m_barcodeMetadata); + } +} +FX_INT32 CBC_DetectionResult::adjustRowNumbers() +{ + FX_INT32 unadjustedCount = adjustRowNumbersByRow(); + if (unadjustedCount == 0) { + return 0; + } + for (FX_INT32 barcodeColumn = 1; barcodeColumn < m_barcodeColumnCount + 1; barcodeColumn++) { + CFX_PtrArray* codewords = ((CBC_DetectionResultColumn*)m_detectionResultColumns[barcodeColumn])->getCodewords(); + for (FX_INT32 codewordsRow = 0; codewordsRow < codewords->GetSize(); codewordsRow++) { + if (codewords->GetAt(codewordsRow) == NULL) { + continue; + } + if (!((CBC_Codeword*)codewords->GetAt(codewordsRow))->hasValidRowNumber()) { + adjustRowNumbers(barcodeColumn, codewordsRow, codewords); + } + } + } + return unadjustedCount; +} +FX_INT32 CBC_DetectionResult::adjustRowNumbersByRow() +{ + adjustRowNumbersFromBothRI(); + FX_INT32 unadjustedCount = adjustRowNumbersFromLRI(); + return unadjustedCount + adjustRowNumbersFromRRI(); +} +FX_INT32 CBC_DetectionResult::adjustRowNumbersFromBothRI() +{ + if (m_detectionResultColumns[0] == NULL || m_detectionResultColumns[m_barcodeColumnCount + 1] == NULL) { + return 0; + } + CFX_PtrArray* LRIcodewords = ((CBC_DetectionResultColumn*)m_detectionResultColumns[0])->getCodewords(); + CFX_PtrArray* RRIcodewords = ((CBC_DetectionResultColumn*)m_detectionResultColumns[m_barcodeColumnCount + 1])->getCodewords(); + for (FX_INT32 codewordsRow = 0; codewordsRow < LRIcodewords->GetSize(); codewordsRow++) { + if (LRIcodewords->GetAt(codewordsRow) != NULL && + RRIcodewords->GetAt(codewordsRow) != NULL && + ((CBC_Codeword*)LRIcodewords->GetAt(codewordsRow))->getRowNumber() == ((CBC_Codeword*)RRIcodewords->GetAt(codewordsRow))->getRowNumber()) { + for (FX_INT32 barcodeColumn = 1; barcodeColumn <= m_barcodeColumnCount; barcodeColumn++) { + CBC_Codeword* codeword = (CBC_Codeword*)((CBC_DetectionResultColumn*)m_detectionResultColumns[barcodeColumn])->getCodewords()->GetAt(codewordsRow); + if (codeword == NULL) { + continue; + } + codeword->setRowNumber(((CBC_Codeword*)LRIcodewords->GetAt(codewordsRow))->getRowNumber()); + if (!codeword->hasValidRowNumber()) { + ((CBC_DetectionResultColumn*)m_detectionResultColumns[barcodeColumn])->getCodewords()->SetAt(codewordsRow, NULL); + } + } + } + } + return 0; +} +FX_INT32 CBC_DetectionResult::adjustRowNumbersFromRRI() +{ + if (m_detectionResultColumns[m_barcodeColumnCount + 1] == NULL) { + return 0; + } + FX_INT32 unadjustedCount = 0; + CFX_PtrArray* codewords = ((CBC_DetectionResultColumn*) m_detectionResultColumns.GetAt(m_barcodeColumnCount + 1))->getCodewords(); + for (FX_INT32 codewordsRow = 0; codewordsRow < codewords->GetSize(); codewordsRow++) { + if (codewords->GetAt(codewordsRow) == NULL) { + continue; + } + FX_INT32 rowIndicatorRowNumber = ((CBC_Codeword*)codewords->GetAt(codewordsRow))->getRowNumber(); + FX_INT32 invalidRowCounts = 0; + for (FX_INT32 barcodeColumn = m_barcodeColumnCount + 1; barcodeColumn > 0 && invalidRowCounts < ADJUST_ROW_NUMBER_SKIP; barcodeColumn--) { + CBC_Codeword* codeword = (CBC_Codeword*)((CBC_DetectionResultColumn*)m_detectionResultColumns.GetAt(barcodeColumn))->getCodewords()->GetAt(codewordsRow); + if (codeword != NULL) { + invalidRowCounts = adjustRowNumberIfValid(rowIndicatorRowNumber, invalidRowCounts, codeword); + if (!codeword->hasValidRowNumber()) { + unadjustedCount++; + } + } + } + } + return unadjustedCount; +} +FX_INT32 CBC_DetectionResult::adjustRowNumbersFromLRI() +{ + if (m_detectionResultColumns[0] == NULL) { + return 0; + } + FX_INT32 unadjustedCount = 0; + CFX_PtrArray* codewords = ((CBC_DetectionResultColumn*)m_detectionResultColumns.GetAt(0))->getCodewords(); + for (FX_INT32 codewordsRow = 0; codewordsRow < codewords->GetSize(); codewordsRow++) { + if (codewords->GetAt(codewordsRow) == NULL) { + continue; + } + FX_INT32 rowIndicatorRowNumber = ((CBC_Codeword*)codewords->GetAt(codewordsRow))->getRowNumber(); + FX_INT32 invalidRowCounts = 0; + for (FX_INT32 barcodeColumn = 1; barcodeColumn < m_barcodeColumnCount + 1 && invalidRowCounts < ADJUST_ROW_NUMBER_SKIP; barcodeColumn++) { + CBC_Codeword* codeword = (CBC_Codeword*)((CBC_DetectionResultColumn*)m_detectionResultColumns[barcodeColumn])->getCodewords()->GetAt(codewordsRow); + if (codeword != NULL) { + invalidRowCounts = adjustRowNumberIfValid(rowIndicatorRowNumber, invalidRowCounts, codeword); + if (!codeword->hasValidRowNumber()) { + unadjustedCount++; + } + } + } + } + return unadjustedCount; +} +FX_INT32 CBC_DetectionResult::adjustRowNumberIfValid(FX_INT32 rowIndicatorRowNumber, FX_INT32 invalidRowCounts, CBC_Codeword* codeword) +{ + if (codeword == NULL) { + return invalidRowCounts; + } + if (!codeword->hasValidRowNumber()) { + if (codeword->isValidRowNumber(rowIndicatorRowNumber)) { + codeword->setRowNumber(rowIndicatorRowNumber); + invalidRowCounts = 0; + } else { + ++invalidRowCounts; + } + } + return invalidRowCounts; +} +void CBC_DetectionResult::adjustRowNumbers(FX_INT32 barcodeColumn, FX_INT32 codewordsRow, CFX_PtrArray* codewords) +{ + CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(codewordsRow); + CFX_PtrArray* previousColumnCodewords = ((CBC_DetectionResultColumn*)m_detectionResultColumns.GetAt(barcodeColumn - 1))->getCodewords(); + CFX_PtrArray* nextColumnCodewords = previousColumnCodewords; + if (m_detectionResultColumns[barcodeColumn + 1] != NULL) { + nextColumnCodewords = ((CBC_DetectionResultColumn*)m_detectionResultColumns[barcodeColumn + 1])->getCodewords(); + } + CFX_PtrArray otherCodewords; + otherCodewords.SetSize(14); + otherCodewords[2] = previousColumnCodewords->GetAt(codewordsRow); + otherCodewords[3] = nextColumnCodewords->GetAt(codewordsRow); + if (codewordsRow > 0) { + otherCodewords[0] = codewords->GetAt(codewordsRow - 1); + otherCodewords[4] = previousColumnCodewords->GetAt(codewordsRow - 1); + otherCodewords[5] = nextColumnCodewords->GetAt(codewordsRow - 1); + } + if (codewordsRow > 1) { + otherCodewords[8] = codewords->GetAt(codewordsRow - 2); + otherCodewords[10] = previousColumnCodewords->GetAt(codewordsRow - 2); + otherCodewords[11] = nextColumnCodewords->GetAt(codewordsRow - 2); + } + if (codewordsRow < codewords->GetSize() - 1) { + otherCodewords[1] = codewords->GetAt(codewordsRow + 1); + otherCodewords[6] = previousColumnCodewords->GetAt(codewordsRow + 1); + otherCodewords[7] = nextColumnCodewords->GetAt(codewordsRow + 1); + } + if (codewordsRow < codewords->GetSize() - 2) { + otherCodewords[9] = codewords->GetAt(codewordsRow + 2); + otherCodewords[12] = previousColumnCodewords->GetAt(codewordsRow + 2); + otherCodewords[13] = nextColumnCodewords->GetAt(codewordsRow + 2); + } + for (FX_INT32 i = 0; i < otherCodewords.GetSize(); i++) { + CBC_Codeword* otherCodeword = (CBC_Codeword*)otherCodewords.GetAt(i); + if (adjustRowNumber(codeword, otherCodeword)) { + return; + } + } +} +FX_BOOL CBC_DetectionResult::adjustRowNumber(CBC_Codeword* codeword, CBC_Codeword* otherCodeword) +{ + if (otherCodeword == NULL) { + return FALSE; + } + if (otherCodeword->hasValidRowNumber() && otherCodeword->getBucket() == codeword->getBucket()) { + codeword->setRowNumber(otherCodeword->getRowNumber()); + return TRUE; + } + return FALSE; +} +FX_INT32 CBC_DetectionResult::getBarcodeColumnCount() +{ + return m_barcodeColumnCount; +} +FX_INT32 CBC_DetectionResult::getBarcodeRowCount() +{ + return m_barcodeMetadata->getRowCount(); +} +FX_INT32 CBC_DetectionResult::getBarcodeECLevel() +{ + return m_barcodeMetadata->getErrorCorrectionLevel(); +} diff --git a/xfa/src/fxbarcode/src/BC_PDF417DetectionResultColumn.cpp b/xfa/src/fxbarcode/src/BC_PDF417DetectionResultColumn.cpp new file mode 100644 index 0000000000..63cbc581cb --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_PDF417DetectionResultColumn.cpp @@ -0,0 +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 "barcode.h" +#include "include/BC_PDF417Codeword.h" +#include "include/BC_PDF417BoundingBox.h" +#include "include/BC_PDF417DetectionResultColumn.h" +FX_INT32 CBC_DetectionResultColumn::MAX_NEARBY_DISTANCE = 5; +CBC_DetectionResultColumn::CBC_DetectionResultColumn(CBC_BoundingBox* boundingBox) +{ + m_boundingBox = boundingBox; + m_codewords = FX_NEW CFX_PtrArray; + m_codewords->SetSize(boundingBox->getMaxY() - boundingBox->getMinY() + 1); +} +CBC_DetectionResultColumn::~CBC_DetectionResultColumn() +{ + for (FX_INT32 i = 0; i < m_codewords->GetSize(); i++) { + delete (CBC_Codeword*)m_codewords->GetAt(i); + } + m_codewords->RemoveAll(); + delete m_codewords; +} +CBC_Codeword* CBC_DetectionResultColumn::getCodewordNearby(FX_INT32 imageRow) +{ + CBC_Codeword* codeword = getCodeword(imageRow); + if (codeword != NULL) { + return codeword; + } + for (FX_INT32 i = 1; i < MAX_NEARBY_DISTANCE; i++) { + FX_INT32 nearImageRow = imageRowToCodewordIndex(imageRow) - i; + if (nearImageRow >= 0) { + codeword = (CBC_Codeword*)m_codewords->GetAt(nearImageRow); + if (codeword != NULL) { + return codeword; + } + } + nearImageRow = imageRowToCodewordIndex(imageRow) + i; + if (nearImageRow < m_codewords->GetSize()) { + codeword = (CBC_Codeword*)m_codewords->GetAt(nearImageRow); + if (codeword != NULL) { + return codeword; + } + } + } + return NULL; +} +FX_INT32 CBC_DetectionResultColumn::imageRowToCodewordIndex(FX_INT32 imageRow) +{ + return imageRow - m_boundingBox->getMinY(); +} +FX_INT32 CBC_DetectionResultColumn::codewordIndexToImageRow(FX_INT32 codewordIndex) +{ + return m_boundingBox->getMinY() + codewordIndex; +} +void CBC_DetectionResultColumn::setCodeword(FX_INT32 imageRow, CBC_Codeword* codeword) +{ + m_codewords->SetAt(imageRowToCodewordIndex(imageRow), codeword); +} +CBC_Codeword* CBC_DetectionResultColumn::getCodeword(FX_INT32 imageRow) +{ + return (CBC_Codeword*)m_codewords->GetAt(imageRowToCodewordIndex(imageRow)); +} +CBC_BoundingBox* CBC_DetectionResultColumn::getBoundingBox() +{ + return m_boundingBox; +} +CFX_PtrArray* CBC_DetectionResultColumn::getCodewords() +{ + return m_codewords; +} +CFX_ByteString CBC_DetectionResultColumn::toString() +{ + CFX_ByteString result; + FX_INT32 row = 0; + for (FX_INT32 i = 0; i < m_codewords->GetSize(); i++) { + CBC_Codeword* codeword = (CBC_Codeword*)m_codewords->GetAt(i); + if (codeword == NULL) { + result += (FX_CHAR) row; + row++; + continue; + } + result += (FX_CHAR) row; + result += codeword->getRowNumber(); + result += codeword->getValue(); + row++; + } + return result; +} diff --git a/xfa/src/fxbarcode/src/BC_PDF417DetectionResultRowIndicatorColumn.cpp b/xfa/src/fxbarcode/src/BC_PDF417DetectionResultRowIndicatorColumn.cpp new file mode 100644 index 0000000000..6220011ccf --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_PDF417DetectionResultRowIndicatorColumn.cpp @@ -0,0 +1,225 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_ResultPoint.h" +#include "include/BC_PDF417BarcodeMetadata.h" +#include "include/BC_PDF417BoundingBox.h" +#include "include/BC_PDF417Codeword.h" +#include "include/BC_PDF417BarcodeValue.h" +#include "include/BC_PDF417Common.h" +#include "include/BC_PDF417DetectionResultColumn.h" +#include "include/BC_PDF417DetectionResultRowIndicatorColumn.h" +CBC_DetectionResultRowIndicatorColumn::CBC_DetectionResultRowIndicatorColumn(CBC_BoundingBox* boundingBox, FX_BOOL isLeft) + : CBC_DetectionResultColumn(boundingBox) +{ + m_isLeft = isLeft; +} +CBC_DetectionResultRowIndicatorColumn::~CBC_DetectionResultRowIndicatorColumn() +{ +} +void CBC_DetectionResultRowIndicatorColumn::setRowNumbers() +{ + for (FX_INT32 i = 0; i < m_codewords->GetSize(); i++) { + CBC_Codeword * codeword = (CBC_Codeword*)m_codewords->GetAt(i); + if (codeword != NULL) { + codeword->setRowNumberAsRowIndicatorColumn(); + } + } +} +FX_INT32 CBC_DetectionResultRowIndicatorColumn::adjustCompleteIndicatorColumnRowNumbers(CBC_BarcodeMetadata barcodeMetadata) +{ + CFX_PtrArray* codewords = getCodewords(); + setRowNumbers(); + removeIncorrectCodewords(codewords, barcodeMetadata); + CBC_BoundingBox* boundingBox = getBoundingBox(); + CBC_ResultPoint* top = m_isLeft ? boundingBox->getTopLeft() : boundingBox->getTopRight(); + CBC_ResultPoint* bottom = m_isLeft ? boundingBox->getBottomLeft() : boundingBox->getBottomRight(); + FX_INT32 firstRow = imageRowToCodewordIndex((FX_INT32) top->GetY()); + FX_INT32 lastRow = imageRowToCodewordIndex((FX_INT32) bottom->GetY()); + FX_FLOAT averageRowHeight = (lastRow - firstRow) / (FX_FLOAT) barcodeMetadata.getRowCount(); + FX_INT32 barcodeRow = -1; + FX_INT32 maxRowHeight = 1; + FX_INT32 currentRowHeight = 0; + for (FX_INT32 codewordsRow = firstRow; codewordsRow < lastRow; codewordsRow++) { + if (codewords->GetAt(codewordsRow) == NULL) { + continue; + } + CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(codewordsRow); + FX_INT32 rowDifference = codeword->getRowNumber() - barcodeRow; + if (rowDifference == 0) { + currentRowHeight++; + } else if (rowDifference == 1) { + maxRowHeight = maxRowHeight > currentRowHeight ? maxRowHeight : currentRowHeight; + currentRowHeight = 1; + barcodeRow = codeword->getRowNumber(); + } else if (rowDifference < 0) { + codewords->SetAt(codewordsRow, NULL); + } else if (codeword->getRowNumber() >= barcodeMetadata.getRowCount()) { + codewords->SetAt(codewordsRow, NULL); + } else if (rowDifference > codewordsRow) { + codewords->SetAt(codewordsRow, NULL); + } else { + FX_INT32 checkedRows; + if (maxRowHeight > 2) { + checkedRows = (maxRowHeight - 2) * rowDifference; + } else { + checkedRows = rowDifference; + } + FX_BOOL closePreviousCodewordFound = checkedRows >= codewordsRow; + for (FX_INT32 i = 1; i <= checkedRows && !closePreviousCodewordFound; i++) { + closePreviousCodewordFound = codewords->GetAt(codewordsRow - i) != NULL; + } + if (closePreviousCodewordFound) { + codewords->SetAt(codewordsRow, NULL); + } else { + barcodeRow = codeword->getRowNumber(); + currentRowHeight = 1; + } + } + } + return (FX_INT32) (averageRowHeight + 0.5); +} +CFX_Int32Array* CBC_DetectionResultRowIndicatorColumn::getRowHeights(FX_INT32 &e) +{ + CBC_BarcodeMetadata* barcodeMetadata = getBarcodeMetadata(); + if (barcodeMetadata == NULL) { + e = BCExceptionCannotMetadata; + return NULL; + } + adjustIncompleteIndicatorColumnRowNumbers(*barcodeMetadata); + CFX_Int32Array* result = FX_NEW CFX_Int32Array; + result->SetSize(barcodeMetadata->getRowCount()); + for (FX_INT32 i = 0; i < getCodewords()->GetSize(); i++) { + CBC_Codeword* codeword = (CBC_Codeword*)getCodewords()->GetAt(i); + if (codeword != NULL) { + result->SetAt(codeword->getRowNumber(), result->GetAt(codeword->getRowNumber()) + 1); + } + } + return result; +} +FX_INT32 CBC_DetectionResultRowIndicatorColumn::adjustIncompleteIndicatorColumnRowNumbers(CBC_BarcodeMetadata barcodeMetadata) +{ + CBC_BoundingBox* boundingBox = getBoundingBox(); + CBC_ResultPoint* top = m_isLeft ? boundingBox->getTopLeft() : boundingBox->getTopRight(); + CBC_ResultPoint* bottom = m_isLeft ? boundingBox->getBottomLeft() : boundingBox->getBottomRight(); + FX_INT32 firstRow = imageRowToCodewordIndex((FX_INT32) top->GetY()); + FX_INT32 lastRow = imageRowToCodewordIndex((FX_INT32) bottom->GetY()); + FX_FLOAT averageRowHeight = (lastRow - firstRow) / (FX_FLOAT) barcodeMetadata.getRowCount(); + CFX_PtrArray* codewords = getCodewords(); + FX_INT32 barcodeRow = -1; + FX_INT32 maxRowHeight = 1; + FX_INT32 currentRowHeight = 0; + for (FX_INT32 codewordsRow = firstRow; codewordsRow < lastRow; codewordsRow++) { + if (codewords->GetAt(codewordsRow) == NULL) { + continue; + } + CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(codewordsRow); + codeword->setRowNumberAsRowIndicatorColumn(); + FX_INT32 rowDifference = codeword->getRowNumber() - barcodeRow; + if (rowDifference == 0) { + currentRowHeight++; + } else if (rowDifference == 1) { + maxRowHeight = maxRowHeight > currentRowHeight ? maxRowHeight : currentRowHeight; + currentRowHeight = 1; + barcodeRow = codeword->getRowNumber(); + } else if (codeword->getRowNumber() >= barcodeMetadata.getRowCount()) { + codewords->SetAt(codewordsRow, NULL); + } else { + barcodeRow = codeword->getRowNumber(); + currentRowHeight = 1; + } + } + return (FX_INT32) (averageRowHeight + 0.5); +} +CBC_BarcodeMetadata* CBC_DetectionResultRowIndicatorColumn::getBarcodeMetadata() +{ + CFX_PtrArray* codewords = getCodewords(); + CBC_BarcodeValue barcodeColumnCount; + CBC_BarcodeValue barcodeRowCountUpperPart; + CBC_BarcodeValue barcodeRowCountLowerPart; + CBC_BarcodeValue barcodeECLevel; + for (FX_INT32 i = 0; i < codewords->GetSize(); i++) { + CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(i); + if (codeword == NULL) { + continue; + } + codeword->setRowNumberAsRowIndicatorColumn(); + FX_INT32 rowIndicatorValue = codeword->getValue() % 30; + FX_INT32 codewordRowNumber = codeword->getRowNumber(); + if (!m_isLeft) { + codewordRowNumber += 2; + } + switch (codewordRowNumber % 3) { + case 0: + barcodeRowCountUpperPart.setValue(rowIndicatorValue * 3 + 1); + break; + case 1: + barcodeECLevel.setValue(rowIndicatorValue / 3); + barcodeRowCountLowerPart.setValue(rowIndicatorValue % 3); + break; + case 2: + barcodeColumnCount.setValue(rowIndicatorValue + 1); + break; + } + } + if ((barcodeColumnCount.getValue()->GetSize() == 0) || + (barcodeRowCountUpperPart.getValue()->GetSize() == 0) || + (barcodeRowCountLowerPart.getValue()->GetSize() == 0) || + (barcodeECLevel.getValue()->GetSize() == 0) || + barcodeColumnCount.getValue()->GetAt(0) < 1 || + barcodeRowCountUpperPart.getValue()->GetAt(0) + barcodeRowCountLowerPart.getValue()->GetAt(0) < CBC_PDF417Common::MIN_ROWS_IN_BARCODE || + barcodeRowCountUpperPart.getValue()->GetAt(0) + barcodeRowCountLowerPart.getValue()->GetAt(0) > CBC_PDF417Common::MAX_ROWS_IN_BARCODE) { + return NULL; + } + CBC_BarcodeMetadata* barcodeMetadata = FX_NEW CBC_BarcodeMetadata(barcodeColumnCount.getValue()->GetAt(0), barcodeRowCountUpperPart.getValue()->GetAt(0), barcodeRowCountLowerPart.getValue()->GetAt(0), barcodeECLevel.getValue()->GetAt(0)); + removeIncorrectCodewords(codewords, *barcodeMetadata); + return barcodeMetadata; +} +FX_BOOL CBC_DetectionResultRowIndicatorColumn::isLeft() +{ + return m_isLeft; +} +CFX_ByteString CBC_DetectionResultRowIndicatorColumn::toString() +{ + return (CFX_ByteString)"IsLeft: " + (CFX_ByteString)m_isLeft + '\n' + CBC_DetectionResultColumn::toString(); +} +void CBC_DetectionResultRowIndicatorColumn::removeIncorrectCodewords(CFX_PtrArray* codewords, CBC_BarcodeMetadata barcodeMetadata) +{ + for (FX_INT32 codewordRow = 0; codewordRow < codewords->GetSize(); codewordRow++) { + CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(codewordRow); + if (codeword == NULL) { + continue; + } + FX_INT32 rowIndicatorValue = codeword->getValue() % 30; + FX_INT32 codewordRowNumber = codeword->getRowNumber(); + if (codewordRowNumber > barcodeMetadata.getRowCount()) { + codewords->SetAt(codewordRow, NULL); + continue; + } + if (!m_isLeft) { + codewordRowNumber += 2; + } + switch (codewordRowNumber % 3) { + case 0: + if (rowIndicatorValue * 3 + 1 != barcodeMetadata.getRowCountUpperPart()) { + codewords->SetAt(codewordRow, NULL); + } + break; + case 1: + if (rowIndicatorValue / 3 != barcodeMetadata.getErrorCorrectionLevel() || + rowIndicatorValue % 3 != barcodeMetadata.getRowCountLowerPart()) { + codewords->SetAt(codewordRow, NULL); + } + break; + case 2: + if (rowIndicatorValue + 1 != barcodeMetadata.getColumnCount()) { + codewords->SetAt(codewordRow, NULL); + } + break; + } + } +} diff --git a/xfa/src/fxbarcode/src/BC_PDF417Detector.cpp b/xfa/src/fxbarcode/src/BC_PDF417Detector.cpp new file mode 100644 index 0000000000..c9f67b6d7e --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_PDF417Detector.cpp @@ -0,0 +1,295 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_ResultPoint.h" +#include "include/BC_PDF417DetectorResult.h" +#include "include/BC_BinaryBitmap.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_CommonBitArray.h" +#include "include/BC_PDF417Detector.h" +#define INTERGER_MAX 2147483647 +FX_INT32 CBC_Detector::INDEXES_START_PATTERN[] = {0, 4, 1, 5}; +FX_INT32 CBC_Detector::INDEXES_STOP_PATTERN[] = {6, 2, 7, 3}; +FX_INT32 CBC_Detector::INTEGER_MATH_SHIFT = 8; +FX_INT32 CBC_Detector::PATTERN_MATCH_RESULT_SCALE_FACTOR = 1 << INTEGER_MATH_SHIFT; +FX_INT32 CBC_Detector::MAX_AVG_VARIANCE = (FX_INT32) (PATTERN_MATCH_RESULT_SCALE_FACTOR * 0.42f); +FX_INT32 CBC_Detector::MAX_INDIVIDUAL_VARIANCE = (FX_INT32) (PATTERN_MATCH_RESULT_SCALE_FACTOR * 0.8f); +FX_INT32 CBC_Detector::START_PATTERN[] = {8, 1, 1, 1, 1, 1, 1, 3}; +FX_INT32 CBC_Detector::STOP_PATTERN[] = {7, 1, 1, 3, 1, 1, 1, 2, 1}; +FX_INT32 CBC_Detector::MAX_PIXEL_DRIFT = 3; +FX_INT32 CBC_Detector::MAX_PATTERN_DRIFT = 5; +FX_INT32 CBC_Detector::SKIPPED_ROW_COUNT_MAX = 25; +FX_INT32 CBC_Detector::ROW_STEP = 5; +FX_INT32 CBC_Detector::BARCODE_MIN_HEIGHT = 10; +CBC_Detector::CBC_Detector() +{ +} +CBC_Detector::~CBC_Detector() +{ +} +CBC_PDF417DetectorResult* CBC_Detector::detect(CBC_BinaryBitmap* image, FX_INT32 hints, FX_BOOL multiple, FX_INT32 &e) +{ + CBC_CommonBitMatrix* bitMatrix = image->GetBlackMatrix(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CFX_PtrArray* barcodeCoordinates = detect(multiple, bitMatrix); + if (barcodeCoordinates->GetSize() == 0) { + rotate180(bitMatrix); + barcodeCoordinates = detect(multiple, bitMatrix); + } + if (barcodeCoordinates->GetSize() == 0) { + e = BCExceptionUnSupportedBarcode; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + CBC_PDF417DetectorResult* detectorResult = FX_NEW CBC_PDF417DetectorResult(bitMatrix, barcodeCoordinates); + return detectorResult; +} +void CBC_Detector::rotate180(CBC_CommonBitMatrix* bitMatrix) +{ + FX_INT32 width = bitMatrix->GetWidth(); + FX_INT32 height = bitMatrix->GetHeight(); + CBC_CommonBitArray* firstRowBitArray = FX_NEW CBC_CommonBitArray(width); + CBC_CommonBitArray* secondRowBitArray = FX_NEW CBC_CommonBitArray(width); + CBC_CommonBitArray* tmpBitArray = FX_NEW CBC_CommonBitArray(width); + for (FX_INT32 y = 0; y < (height + 1) >> 1; y++) { + CBC_CommonBitArray* temp = bitMatrix->GetRow(height - 1 - y, secondRowBitArray); + CBC_CommonBitArray* tempfirstRow = firstRowBitArray; + firstRowBitArray = bitMatrix->GetRow(y, tempfirstRow); + delete tempfirstRow; + CBC_CommonBitArray* row = mirror(temp, tmpBitArray); + delete temp; + bitMatrix->SetRow(y, row); + delete row; + CBC_CommonBitArray* rowfirstRow = mirror(firstRowBitArray, tmpBitArray); + bitMatrix->SetRow(height - 1 - y, rowfirstRow); + delete rowfirstRow; + } + delete tmpBitArray; + delete firstRowBitArray; + delete secondRowBitArray; +} +CBC_CommonBitArray* CBC_Detector::mirror(CBC_CommonBitArray* input, CBC_CommonBitArray* result) +{ + CBC_CommonBitArray* array = FX_NEW CBC_CommonBitArray(result->GetSize()); + array->Clear(); + FX_INT32 size = input->GetSize(); + for (FX_INT32 i = 0; i < size; i++) { + if (input->Get(i)) { + array->Set(size - 1 - i); + } + } + return array; +} +CFX_PtrArray* CBC_Detector::detect(FX_BOOL multiple, CBC_CommonBitMatrix* bitMatrix) +{ + CFX_PtrArray* barcodeCoordinates = FX_NEW CFX_PtrArray; + FX_INT32 row = 0; + FX_INT32 column = 0; + FX_BOOL foundBarcodeInRow = FALSE; + while (row < bitMatrix->GetHeight()) { + CFX_PtrArray* vertices = findVertices(bitMatrix, row, column); + if (vertices->GetAt(0) == NULL && vertices->GetAt(3) == NULL) { + if (!foundBarcodeInRow) { + if (vertices) { + delete(vertices); + } + break; + } + foundBarcodeInRow = FALSE; + column = 0; + for (FX_INT32 i = 0; i < barcodeCoordinates->GetSize(); i++) { + CFX_PtrArray* barcodeCoordinate = (CFX_PtrArray*)barcodeCoordinates->GetAt(i); + if (barcodeCoordinate->GetAt(1) != NULL) { + row = row > ((CBC_ResultPoint*)barcodeCoordinate->GetAt(1))->GetY(); + } + if (barcodeCoordinate->GetAt(3) != NULL) { + row = row > ((CBC_ResultPoint*)barcodeCoordinate->GetAt(3))->GetY(); + } + } + row += ROW_STEP; + if (vertices) { + delete(vertices); + } + continue; + } + foundBarcodeInRow = TRUE; + barcodeCoordinates->Add(vertices); + if (!multiple) { + break; + } + if (vertices->GetAt(2) != NULL) { + column = (FX_INT32) ((CBC_ResultPoint*)vertices->GetAt(2))->GetX(); + row = (FX_INT32) ((CBC_ResultPoint*)vertices->GetAt(2))->GetY(); + } else { + column = (FX_INT32) ((CBC_ResultPoint*)vertices->GetAt(4))->GetX(); + row = (FX_INT32) ((CBC_ResultPoint*)vertices->GetAt(4))->GetY(); + } + } + return barcodeCoordinates; +} +CFX_PtrArray* CBC_Detector::findVertices(CBC_CommonBitMatrix* matrix, FX_INT32 startRow, FX_INT32 startColumn) +{ + FX_INT32 height = matrix->GetHeight(); + FX_INT32 width = matrix->GetWidth(); + CFX_PtrArray* result = FX_NEW CFX_PtrArray; + result->SetSize(8); + CFX_PtrArray* startptr = findRowsWithPattern(matrix, height, width, startRow, startColumn, START_PATTERN, sizeof(START_PATTERN) / sizeof(START_PATTERN[0])); + copyToResult(result, startptr, INDEXES_START_PATTERN, sizeof(INDEXES_START_PATTERN) / sizeof(INDEXES_START_PATTERN[0])); + startptr->RemoveAll(); + delete startptr; + if (result->GetAt(4) != NULL) { + startColumn = (FX_INT32) ((CBC_ResultPoint*)result->GetAt(4))->GetX(); + startRow = (FX_INT32) ((CBC_ResultPoint*)result->GetAt(4))->GetY(); + } + CFX_PtrArray* stopptr = findRowsWithPattern(matrix, height, width, startRow, startColumn, STOP_PATTERN, sizeof(STOP_PATTERN) / sizeof(STOP_PATTERN[0])); + copyToResult(result, stopptr, INDEXES_STOP_PATTERN, sizeof(INDEXES_STOP_PATTERN) / sizeof(INDEXES_STOP_PATTERN[0])); + stopptr->RemoveAll(); + delete stopptr; + return result; +} +void CBC_Detector::copyToResult(CFX_PtrArray *result, CFX_PtrArray* tmpResult, FX_INT32* destinationIndexes, FX_INT32 destinationLength) +{ + for (FX_INT32 i = 0; i < destinationLength; i++) { + result->SetAt(destinationIndexes[i], tmpResult->GetAt(i)); + } +} +CFX_PtrArray* CBC_Detector::findRowsWithPattern(CBC_CommonBitMatrix* matrix, FX_INT32 height, FX_INT32 width, FX_INT32 startRow, FX_INT32 startColumn, FX_INT32* pattern, FX_INT32 patternLength) +{ + CFX_PtrArray* result = FX_NEW CFX_PtrArray; + result->SetSize(4); + FX_BOOL found = FALSE; + CFX_Int32Array counters; + counters.SetSize(patternLength); + for (; startRow < height; startRow += ROW_STEP) { + CFX_Int32Array* loc = findGuardPattern(matrix, startColumn, startRow, width, FALSE, pattern, patternLength, counters); + if (loc != NULL) { + while (startRow > 0) { + CFX_Int32Array* previousRowLoc = findGuardPattern(matrix, startColumn, --startRow, width, FALSE, pattern, patternLength, counters); + if (previousRowLoc != NULL) { + delete loc; + loc = previousRowLoc; + } else { + startRow++; + break; + } + } + result->SetAt(0, FX_NEW CBC_ResultPoint((FX_FLOAT)loc->GetAt(0), (FX_FLOAT)startRow)); + result->SetAt(1, FX_NEW CBC_ResultPoint((FX_FLOAT)loc->GetAt(1), (FX_FLOAT)startRow)); + found = TRUE; + delete loc; + break; + } + } + FX_INT32 stopRow = startRow + 1; + if (found) { + FX_INT32 skippedRowCount = 0; + CFX_Int32Array previousRowLoc; + previousRowLoc.Add((FX_INT32)((CBC_ResultPoint*)result->GetAt(0))->GetX()); + previousRowLoc.Add((FX_INT32)((CBC_ResultPoint*)result->GetAt(1))->GetX()); + for (; stopRow < height; stopRow++) { + CFX_Int32Array* loc = findGuardPattern(matrix, previousRowLoc[0], stopRow, width, FALSE, pattern, patternLength, counters); + if (loc != NULL && + abs(previousRowLoc[0] - loc->GetAt(0)) < MAX_PATTERN_DRIFT && + abs(previousRowLoc[1] - loc->GetAt(1)) < MAX_PATTERN_DRIFT) { + previousRowLoc.Copy(*loc); + skippedRowCount = 0; + } else { + if (skippedRowCount > SKIPPED_ROW_COUNT_MAX) { + delete loc; + break; + } else { + skippedRowCount++; + } + } + delete loc; + } + stopRow -= skippedRowCount + 1; + result->SetAt(2, FX_NEW CBC_ResultPoint((FX_FLOAT)previousRowLoc.GetAt(0), (FX_FLOAT)stopRow)); + result->SetAt(3, FX_NEW CBC_ResultPoint((FX_FLOAT)previousRowLoc.GetAt(1), (FX_FLOAT)stopRow)); + } + if (stopRow - startRow < BARCODE_MIN_HEIGHT) { + for (FX_INT32 i = 0; i < result->GetSize(); i++) { + result->SetAt(i, NULL); + } + } + return result; +} +CFX_Int32Array* CBC_Detector::findGuardPattern(CBC_CommonBitMatrix* matrix, FX_INT32 column, FX_INT32 row, FX_INT32 width, FX_BOOL whiteFirst, FX_INT32* pattern, FX_INT32 patternLength, CFX_Int32Array &counters) +{ + for (FX_INT32 i = 0; i < counters.GetSize(); i++) { + counters.SetAt(i, 0); + } + FX_BOOL isWhite = whiteFirst; + FX_INT32 patternStart = column; + FX_INT32 pixelDrift = 0; + CFX_Int32Array* intarray = FX_NEW CFX_Int32Array; + while (matrix->Get(patternStart, row) && patternStart > 0 && pixelDrift++ < MAX_PIXEL_DRIFT) { + patternStart--; + } + FX_INT32 x = patternStart; + FX_INT32 counterPosition = 0; + for (; x < width; x++) { + FX_BOOL pixel = matrix->Get(x, row); + if (pixel ^ isWhite) { + counters[counterPosition]++; + } else { + if (counterPosition == patternLength - 1) { + if (patternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE) < MAX_AVG_VARIANCE) { + intarray->Add(patternStart); + intarray->Add(x); + return intarray; + } + patternStart += counters[0] + counters[1]; + for (FX_INT32 l = 2, k = 0; l < patternLength; l++, k++) { + counters.SetAt(k, counters.GetAt(l)); + } + counters.SetAt(patternLength - 2, 0); + counters.SetAt(patternLength - 1, 0); + counterPosition--; + } else { + counterPosition++; + } + counters[counterPosition] = 1; + isWhite = !isWhite; + } + } + if (counterPosition == patternLength - 1) { + if (patternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE) < MAX_AVG_VARIANCE) { + intarray->Add(patternStart); + intarray->Add(x - 1); + return intarray; + } + } + delete intarray; + return NULL; +} +FX_INT32 CBC_Detector::patternMatchVariance(CFX_Int32Array &counters, FX_INT32* pattern, FX_INT32 maxIndividualVariance) +{ + FX_INT32 numCounters = counters.GetSize(); + FX_INT32 total = 0; + FX_INT32 patternLength = 0; + for (FX_INT32 i = 0; i < numCounters; i++) { + total += counters[i]; + patternLength += pattern[i]; + } + if (total < patternLength) { + return INTERGER_MAX; + } + FX_INT32 unitBarWidth = (total << INTEGER_MATH_SHIFT) / patternLength; + maxIndividualVariance = (maxIndividualVariance * unitBarWidth) >> INTEGER_MATH_SHIFT; + FX_INT32 totalVariance = 0; + for (FX_INT32 x = 0; x < numCounters; x++) { + FX_INT32 counter = counters[x] << INTEGER_MATH_SHIFT; + FX_INT32 scaledPattern = pattern[x] * unitBarWidth; + FX_INT32 variance = counter > scaledPattern ? counter - scaledPattern : scaledPattern - counter; + if (variance > maxIndividualVariance) { + return INTERGER_MAX; + } + totalVariance += variance; + } + return totalVariance / total; +} + diff --git a/xfa/src/fxbarcode/src/BC_PDF417DetectorResult.cpp b/xfa/src/fxbarcode/src/BC_PDF417DetectorResult.cpp new file mode 100644 index 0000000000..cf51f9e38b --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_PDF417DetectorResult.cpp @@ -0,0 +1,37 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_ResultPoint.h" +#include "include/BC_PDF417DetectorResult.h" +CBC_PDF417DetectorResult::CBC_PDF417DetectorResult(CBC_CommonBitMatrix* bits, CFX_PtrArray* points) +{ + m_bits = bits; + m_points = points; +} +CBC_PDF417DetectorResult::~CBC_PDF417DetectorResult() +{ + for (FX_INT32 i = 0; i < m_points->GetSize(); i++) { + CFX_PtrArray* temp = (CFX_PtrArray*)m_points->GetAt(i); + for (FX_INT32 j = 0; j < temp->GetSize(); j++) { + delete (CBC_ResultPoint*)temp->GetAt(j); + } + temp->RemoveAll(); + delete temp; + } + m_points->RemoveAll(); + delete m_points; +} +CBC_CommonBitMatrix* CBC_PDF417DetectorResult::getBits() +{ + return m_bits; +} + +CFX_PtrArray* CBC_PDF417DetectorResult::getPoints() +{ + return m_points; +} diff --git a/xfa/src/fxbarcode/src/BC_PDF417Dimensions.cpp b/xfa/src/fxbarcode/src/BC_PDF417Dimensions.cpp new file mode 100644 index 0000000000..7f5400a8ec --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_PDF417Dimensions.cpp @@ -0,0 +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 "barcode.h" +#include "include/BC_PDF417Dimensions.h" +CBC_Dimensions::CBC_Dimensions(FX_INT32 minCols, FX_INT32 maxCols, FX_INT32 minRows, FX_INT32 maxRows) +{ + m_minCols = minCols; + m_maxCols = maxCols; + m_minRows = minRows; + m_maxRows = maxRows; +} +CBC_Dimensions::~CBC_Dimensions() +{ +} +FX_INT32 CBC_Dimensions::getMinCols() +{ + return m_minCols; +} +FX_INT32 CBC_Dimensions::getMaxCols() +{ + return m_maxCols; +} +FX_INT32 CBC_Dimensions::getMinRows() +{ + return m_minRows; +} +FX_INT32 CBC_Dimensions::getMaxRows() +{ + return m_maxRows; +} diff --git a/xfa/src/fxbarcode/src/BC_PDF417ECErrorCorrection.cpp b/xfa/src/fxbarcode/src/BC_PDF417ECErrorCorrection.cpp new file mode 100644 index 0000000000..3d22d77c3d --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_PDF417ECErrorCorrection.cpp @@ -0,0 +1,353 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_PDF417Common.h" +#include "include/BC_PDF417ECModulusPoly.h" +#include "include/BC_PDF417ECModulusGF.h" +#include "include/BC_PDF417ECErrorCorrection.h" +CBC_PDF417ECModulusGF* CBC_PDF417ECErrorCorrection::m_field = NULL; +void CBC_PDF417ECErrorCorrection::Initialize(FX_INT32 &e) +{ + m_field = FX_NEW CBC_PDF417ECModulusGF(CBC_PDF417Common::NUMBER_OF_CODEWORDS, 3, e); +} +void CBC_PDF417ECErrorCorrection::Finalize() +{ + delete m_field; +} +CBC_PDF417ECErrorCorrection::CBC_PDF417ECErrorCorrection() +{ +} +CBC_PDF417ECErrorCorrection::~CBC_PDF417ECErrorCorrection() +{ +} +FX_INT32 CBC_PDF417ECErrorCorrection::decode(CFX_Int32Array &received, FX_INT32 numECCodewords, CFX_Int32Array &erasures, FX_INT32 &e) +{ + CBC_PDF417ECModulusPoly poly(m_field, received, e); + BC_EXCEPTION_CHECK_ReturnValue(e, -1); + CFX_Int32Array S; + S.SetSize(numECCodewords); + FX_BOOL error = FALSE; + for (FX_INT32 l = numECCodewords; l > 0; l--) { + FX_INT32 eval = poly.evaluateAt(m_field->exp(l)); + S[numECCodewords - l] = eval; + if (eval != 0) { + error = TRUE; + } + } + if (!error) { + return 0; + } + CBC_PDF417ECModulusPoly* syndrome = FX_NEW CBC_PDF417ECModulusPoly(m_field, S, e); + BC_EXCEPTION_CHECK_ReturnValue(e, -1); + CBC_PDF417ECModulusPoly* buildmonomial = m_field->buildMonomial(numECCodewords, 1, e); + if (e != BCExceptionNO) { + delete syndrome; + return -1; + } + CFX_PtrArray* sigmaOmega = runEuclideanAlgorithm(buildmonomial, syndrome, numECCodewords, e); + delete buildmonomial; + delete syndrome; + BC_EXCEPTION_CHECK_ReturnValue(e, -1); + CBC_PDF417ECModulusPoly* sigma = (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(0); + CBC_PDF417ECModulusPoly* omega = (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(1); + CFX_Int32Array* errorLocations = findErrorLocations(sigma, e); + if (e != BCExceptionNO) { + for (FX_INT32 i = 0; i < sigmaOmega->GetSize(); i++) { + delete (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(i); + } + sigmaOmega->RemoveAll(); + delete sigmaOmega; + return -1; + } + CFX_Int32Array* errorMagnitudes = findErrorMagnitudes(omega, sigma, *errorLocations, e); + if (e != BCExceptionNO) { + delete errorLocations; + for (FX_INT32 i = 0; i < sigmaOmega->GetSize(); i++) { + delete (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(i); + } + sigmaOmega->RemoveAll(); + delete sigmaOmega; + return -1; + } + for (FX_INT32 i = 0; i < errorLocations->GetSize(); i++) { + FX_INT32 log = m_field->log(errorLocations->GetAt(i), e);; + BC_EXCEPTION_CHECK_ReturnValue(e, -1); + FX_INT32 position = received.GetSize() - 1 - log; + if (position < 0) { + e = BCExceptionChecksumException; + delete errorLocations; + delete errorMagnitudes; + for (FX_INT32 j = 0; j < sigmaOmega->GetSize(); j++) { + delete (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(j); + } + sigmaOmega->RemoveAll(); + delete sigmaOmega; + return -1; + } + received[position] = m_field->subtract(received[position], errorMagnitudes->GetAt(i)); + } + FX_INT32 result = errorLocations->GetSize(); + delete errorLocations; + delete errorMagnitudes; + for (FX_INT32 k = 0; k < sigmaOmega->GetSize(); k++) { + delete (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(k); + } + sigmaOmega->RemoveAll(); + delete sigmaOmega; + return result; +} +CFX_PtrArray* CBC_PDF417ECErrorCorrection::runEuclideanAlgorithm(CBC_PDF417ECModulusPoly* a, CBC_PDF417ECModulusPoly* b, FX_INT32 R, FX_INT32 &e) +{ + if (a->getDegree() < b->getDegree()) { + CBC_PDF417ECModulusPoly* temp = a; + a = b; + b = temp; + } + CBC_PDF417ECModulusPoly* rLast = a; + CBC_PDF417ECModulusPoly* r = b; + CBC_PDF417ECModulusPoly* tLast = m_field->getZero(); + CBC_PDF417ECModulusPoly* t = m_field->getOne(); + CBC_PDF417ECModulusPoly* qtemp = NULL; + CBC_PDF417ECModulusPoly* rtemp = NULL; + CBC_PDF417ECModulusPoly* ttemp = NULL; + FX_INT32 i = 0; + FX_INT32 j = 0; + FX_INT32 m = 0; + FX_INT32 n = 0; + while (r->getDegree() >= R / 2) { + CBC_PDF417ECModulusPoly* rLastLast = rLast; + CBC_PDF417ECModulusPoly* tLastLast = tLast; + rLast = r; + tLast = t; + m = i; + n = j; + if (rLast->isZero()) { + e = BCExceptionChecksumException; + if (qtemp) { + delete qtemp; + } + if (rtemp) { + delete rtemp; + } + if (ttemp) { + delete ttemp; + } + return NULL; + } + r = rLastLast; + CBC_PDF417ECModulusPoly* q = m_field->getZero(); + FX_INT32 denominatorLeadingTerm = rLast->getCoefficient(rLast->getDegree()); + FX_INT32 dltInverse = m_field->inverse(denominatorLeadingTerm, e); + if (e != BCExceptionNO) { + if (qtemp) { + delete qtemp; + } + if (rtemp) { + delete rtemp; + } + if (ttemp) { + delete ttemp; + } + return NULL; + } + while (r->getDegree() >= rLast->getDegree() && !r->isZero()) { + FX_INT32 degreeDiff = r->getDegree() - rLast->getDegree(); + FX_INT32 scale = m_field->multiply(r->getCoefficient(r->getDegree()), dltInverse); + CBC_PDF417ECModulusPoly* buildmonomial = m_field->buildMonomial(degreeDiff, scale, e); + if (e != BCExceptionNO) { + if (qtemp) { + delete qtemp; + } + if (rtemp) { + delete rtemp; + } + if (ttemp) { + delete ttemp; + } + return NULL; + } + q = q->add(buildmonomial, e); + delete buildmonomial; + if (qtemp) { + delete qtemp; + } + if (e != BCExceptionNO) { + if (rtemp) { + delete rtemp; + } + if (ttemp) { + delete ttemp; + } + return NULL; + } + qtemp = q; + CBC_PDF417ECModulusPoly* multiply = rLast->multiplyByMonomial(degreeDiff, scale, e); + if (e != BCExceptionNO) { + if (qtemp) { + delete qtemp; + } + if (rtemp) { + delete rtemp; + } + if (ttemp) { + delete ttemp; + } + return NULL; + } + CBC_PDF417ECModulusPoly* temp = r; + r = temp->subtract(multiply, e); + delete multiply; + if (m > 1 && i > m) { + delete temp; + temp = NULL; + } + if (e != BCExceptionNO) { + if (qtemp) { + delete qtemp; + } + if (rtemp) { + delete rtemp; + } + if (ttemp) { + delete ttemp; + } + return NULL; + } + rtemp = r; + i = m + 1; + } + ttemp = q->multiply(tLast, e); + if (qtemp) { + delete qtemp; + qtemp = NULL; + } + if (e != BCExceptionNO) { + if (rtemp) { + delete rtemp; + } + if (ttemp) { + delete ttemp; + } + return NULL; + } + t = ttemp->subtract(tLastLast, e); + if (n > 1 && j > n) { + delete tLastLast; + } + delete ttemp; + if (e != BCExceptionNO) { + if (rtemp) { + delete rtemp; + } + return NULL; + } + ttemp = t; + t = ttemp->negative(e); + delete ttemp; + if (e != BCExceptionNO) { + if (rtemp) { + delete rtemp; + } + return NULL; + } + ttemp = t; + j++; + } + FX_INT32 aa = t->getCoefficient(1); + FX_INT32 sigmaTildeAtZero = t->getCoefficient(0); + if (sigmaTildeAtZero == 0) { + e = BCExceptionChecksumException; + if (rtemp) { + delete rtemp; + } + if (ttemp) { + delete ttemp; + } + return NULL; + } + FX_INT32 inverse = m_field->inverse(sigmaTildeAtZero, e); + if (e != BCExceptionNO) { + if (rtemp) { + delete rtemp; + } + if (ttemp) { + delete ttemp; + } + return NULL; + } + CBC_PDF417ECModulusPoly* sigma = t->multiply(inverse, e); + if (ttemp) { + delete ttemp; + } + if (e != BCExceptionNO) { + if (rtemp) { + delete rtemp; + } + return NULL; + } + CBC_PDF417ECModulusPoly* omega = r->multiply(inverse, e); + if (rtemp) { + delete rtemp; + } + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CFX_PtrArray* modulusPoly = FX_NEW CFX_PtrArray; + modulusPoly->Add(sigma); + modulusPoly->Add(omega); + return modulusPoly; +} +CFX_Int32Array* CBC_PDF417ECErrorCorrection::findErrorLocations(CBC_PDF417ECModulusPoly* errorLocator, FX_INT32 &e) +{ + FX_INT32 numErrors = errorLocator->getDegree(); + CFX_Int32Array* result = FX_NEW CFX_Int32Array; + result->SetSize(numErrors); + FX_INT32 ee = 0; + for (FX_INT32 i = 1; i < m_field->getSize() && ee < numErrors; i++) { + if (errorLocator->evaluateAt(i) == 0) { + result->SetAt(ee, m_field->inverse(i, e)); + if (e != BCExceptionNO) { + delete result; + return NULL; + } + ee++; + } + } + if (ee != numErrors) { + e = BCExceptionChecksumException; + delete result; + return NULL; + } + return result; +} +CFX_Int32Array* CBC_PDF417ECErrorCorrection::findErrorMagnitudes(CBC_PDF417ECModulusPoly* errorEvaluator, CBC_PDF417ECModulusPoly* errorLocator, CFX_Int32Array &errorLocations, FX_INT32 &e) +{ + FX_INT32 errorLocatorDegree = errorLocator->getDegree(); + CFX_Int32Array formalDerivativeCoefficients; + formalDerivativeCoefficients.SetSize(errorLocatorDegree); + for (FX_INT32 l = 1; l <= errorLocatorDegree; l++) { + formalDerivativeCoefficients[errorLocatorDegree - l] = m_field->multiply(l, errorLocator->getCoefficient(l)); + } + CBC_PDF417ECModulusPoly formalDerivative(m_field, formalDerivativeCoefficients, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + FX_INT32 s = errorLocations.GetSize(); + CFX_Int32Array* result = FX_NEW CFX_Int32Array; + result->SetSize(s); + for (FX_INT32 i = 0; i < s; i++) { + FX_INT32 xiInverse = m_field->inverse(errorLocations[i], e); + if (e != BCExceptionNO) { + delete result; + return NULL; + } + FX_INT32 numerator = m_field->subtract(0, errorEvaluator->evaluateAt(xiInverse)); + FX_INT32 denominator = m_field->inverse(formalDerivative.evaluateAt(xiInverse), e); + if (e != BCExceptionNO) { + delete result; + return NULL; + } + result->SetAt(i, m_field->multiply(numerator, denominator)); + } + return result; +} diff --git a/xfa/src/fxbarcode/src/BC_PDF417ECModulusGF.cpp b/xfa/src/fxbarcode/src/BC_PDF417ECModulusGF.cpp new file mode 100644 index 0000000000..d3c4f41170 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_PDF417ECModulusGF.cpp @@ -0,0 +1,110 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_PDF417Common.h" +#include "include/BC_PDF417ECModulusPoly.h" +#include "include/BC_PDF417ECModulusGF.h" +CBC_PDF417ECModulusGF* CBC_PDF417ECModulusGF::PDF417_GF = NULL; +void CBC_PDF417ECModulusGF::Initialize(FX_INT32 &e) +{ + PDF417_GF = FX_NEW CBC_PDF417ECModulusGF(CBC_PDF417Common::NUMBER_OF_CODEWORDS, 3, e); +} +void CBC_PDF417ECModulusGF::Finalize() +{ + delete PDF417_GF; +} +CBC_PDF417ECModulusGF::CBC_PDF417ECModulusGF(FX_INT32 modulus, FX_INT32 generator, FX_INT32 &e) +{ + m_modulus = modulus; + m_expTable.SetSize(modulus); + m_logTable.SetSize(modulus); + FX_INT32 x = 1; + for (FX_INT32 i = 0; i < modulus; i++) { + m_expTable[i] = x; + x = (x * generator) % modulus; + } + for (FX_INT32 j = 0; j < modulus - 1; j++) { + m_logTable[m_expTable[j]] = j; + } + CFX_Int32Array zero; + zero.Add(0); + m_zero = FX_NEW CBC_PDF417ECModulusPoly(this, zero, e); + CFX_Int32Array one; + one.Add(1); + m_one = FX_NEW CBC_PDF417ECModulusPoly(this, one, e); +} +CBC_PDF417ECModulusGF::~CBC_PDF417ECModulusGF() +{ + delete m_zero; + delete m_one; +} +CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusGF::getZero() +{ + return m_zero; +} +CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusGF::getOne() +{ + return m_one; +} +CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusGF::buildMonomial(FX_INT32 degree, FX_INT32 coefficient, FX_INT32 &e) +{ + if (degree < 0) { + e = BCExceptionIllegalArgument; + return NULL; + } + CBC_PDF417ECModulusPoly* modulusPoly = NULL; + if (coefficient == 0) { + modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_zero->getField(), m_zero->getCoefficients(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return modulusPoly; + } + CFX_Int32Array coefficients; + coefficients.SetSize(degree + 1); + coefficients[0] = coefficient; + modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(this, coefficients, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return modulusPoly; +} +FX_INT32 CBC_PDF417ECModulusGF::add(FX_INT32 a, FX_INT32 b) +{ + return (a + b) % m_modulus; +} +FX_INT32 CBC_PDF417ECModulusGF::subtract(FX_INT32 a, FX_INT32 b) +{ + return (m_modulus + a - b) % m_modulus; +} +FX_INT32 CBC_PDF417ECModulusGF::exp(FX_INT32 a) +{ + return m_expTable[a]; +} +FX_INT32 CBC_PDF417ECModulusGF::log(FX_INT32 a, FX_INT32 &e) +{ + if (a == 0) { + e = BCExceptionIllegalArgument; + return -1; + } + return m_logTable[a]; +} +FX_INT32 CBC_PDF417ECModulusGF::inverse(FX_INT32 a, FX_INT32 &e) +{ + if (a == 0) { + e = BCExceptionIllegalArgument; + return -1; + } + return m_expTable[m_modulus - m_logTable[a] - 1]; +} +FX_INT32 CBC_PDF417ECModulusGF::multiply(FX_INT32 a, FX_INT32 b) +{ + if (a == 0 || b == 0) { + return 0; + } + return m_expTable[(m_logTable[a] + m_logTable[b]) % (m_modulus - 1)]; +} +FX_INT32 CBC_PDF417ECModulusGF::getSize() +{ + return m_modulus; +} diff --git a/xfa/src/fxbarcode/src/BC_PDF417ECModulusPoly.cpp b/xfa/src/fxbarcode/src/BC_PDF417ECModulusPoly.cpp new file mode 100644 index 0000000000..b57dcc008f --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_PDF417ECModulusPoly.cpp @@ -0,0 +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 "barcode.h" +#include "include/BC_PDF417Common.h" +#include "include/BC_PDF417ECModulusGF.h" +#include "include/BC_PDF417ECModulusPoly.h" +CBC_PDF417ECModulusPoly::CBC_PDF417ECModulusPoly(CBC_PDF417ECModulusGF* field, CFX_Int32Array &coefficients, FX_INT32 &e) +{ + if (coefficients.GetSize() == 0) { + e = BCExceptionIllegalArgument; + } + m_field = field; + FX_INT32 coefficientsLength = coefficients.GetSize(); + if (coefficientsLength > 1 && coefficients[0] == 0) { + FX_INT32 firstNonZero = 1; + while (firstNonZero < coefficientsLength && coefficients[firstNonZero] == 0) { + firstNonZero++; + } + if (firstNonZero == coefficientsLength) { + m_coefficients = field->getZero()->m_coefficients; + } else { + m_coefficients.SetSize(coefficientsLength - firstNonZero); + FX_INT32 l = 0; + for (FX_INT32 i = firstNonZero; i < firstNonZero + m_coefficients.GetSize(); i++) { + m_coefficients.SetAt(l, coefficients.GetAt(i)); + l++; + } + } + } else { + m_coefficients.Copy(coefficients); + } +} +CBC_PDF417ECModulusPoly::~CBC_PDF417ECModulusPoly() +{ +} +CFX_Int32Array& CBC_PDF417ECModulusPoly::getCoefficients() +{ + return m_coefficients; +} +CBC_PDF417ECModulusGF* CBC_PDF417ECModulusPoly::getField() +{ + return m_field; +} +FX_INT32 CBC_PDF417ECModulusPoly::getDegree() +{ + return m_coefficients.GetSize() - 1; +} +FX_BOOL CBC_PDF417ECModulusPoly::isZero() +{ + return m_coefficients[0] == 0; +} +FX_INT32 CBC_PDF417ECModulusPoly::getCoefficient(FX_INT32 degree) +{ + return m_coefficients[m_coefficients.GetSize() - 1 - degree]; +} +FX_INT32 CBC_PDF417ECModulusPoly::evaluateAt(FX_INT32 a) +{ + if (a == 0) { + return getCoefficient(0); + } + FX_INT32 size = m_coefficients.GetSize(); + if (a == 1) { + FX_INT32 result = 0; + for (FX_INT32 l = 0; l < m_coefficients.GetSize(); l++) { + FX_INT32 coefficient = m_coefficients.GetAt(l); + result = m_field->add(result, coefficient); + } + return result; + } + FX_INT32 result = m_coefficients[0]; + for (FX_INT32 i = 1; i < size; i++) { + result = m_field->add(m_field->multiply(a, result), m_coefficients[i]); + } + return result; +} +CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusPoly::add(CBC_PDF417ECModulusPoly* other, FX_INT32 &e) +{ + CBC_PDF417ECModulusPoly* modulusPoly = NULL; + if (isZero()) { + modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(other->getField(), other->getCoefficients(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return modulusPoly; + } + if (other->isZero()) { + modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field, m_coefficients, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return modulusPoly; + } + CFX_Int32Array smallerCoefficients; + smallerCoefficients.Copy(m_coefficients); + CFX_Int32Array largerCoefficients; + largerCoefficients.Copy(other->m_coefficients); + if (smallerCoefficients.GetSize() > largerCoefficients.GetSize()) { + CFX_Int32Array temp; + temp.Copy(smallerCoefficients); + smallerCoefficients.Copy(largerCoefficients); + largerCoefficients.Copy(temp); + } + CFX_Int32Array sumDiff; + sumDiff.SetSize(largerCoefficients.GetSize()); + FX_INT32 lengthDiff = largerCoefficients.GetSize() - smallerCoefficients.GetSize(); + for (FX_INT32 l = 0; l < lengthDiff; l++) { + sumDiff.SetAt(l, largerCoefficients.GetAt(l)); + } + for (FX_INT32 i = lengthDiff; i < largerCoefficients.GetSize(); i++) { + sumDiff[i] = m_field->add(smallerCoefficients[i - lengthDiff], largerCoefficients[i]); + } + modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field, sumDiff, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return modulusPoly; +} +CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusPoly::subtract(CBC_PDF417ECModulusPoly* other, FX_INT32 &e) +{ + CBC_PDF417ECModulusPoly* modulusPoly = NULL; + if (other->isZero()) { + modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field, m_coefficients, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return modulusPoly; + } + CBC_PDF417ECModulusPoly* poly = other->negative(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + modulusPoly = add(poly, e); + delete poly; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return modulusPoly; +} +CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusPoly::multiply(CBC_PDF417ECModulusPoly* other, FX_INT32 &e) +{ + CBC_PDF417ECModulusPoly* modulusPoly = NULL; + if (isZero() || other->isZero()) { + modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field->getZero()->getField(), m_field->getZero()->getCoefficients(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return modulusPoly; + } + CFX_Int32Array aCoefficients; + aCoefficients.Copy(m_coefficients); + FX_INT32 aLength = aCoefficients.GetSize(); + CFX_Int32Array bCoefficients; + bCoefficients.Copy(other->m_coefficients); + FX_INT32 bLength = bCoefficients.GetSize(); + CFX_Int32Array product; + product.SetSize(aLength + bLength - 1); + for (FX_INT32 i = 0; i < aLength; i++) { + FX_INT32 aCoeff = aCoefficients[i]; + for (FX_INT32 j = 0; j < bLength; j++) { + product[i + j] = m_field->add(product[i + j], m_field->multiply(aCoeff, bCoefficients[j])); + } + } + modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field, product, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return modulusPoly; +} +CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusPoly::negative(FX_INT32 &e) +{ + FX_INT32 size = m_coefficients.GetSize(); + CFX_Int32Array negativeCoefficients; + negativeCoefficients.SetSize(size); + for (FX_INT32 i = 0; i < size; i++) { + negativeCoefficients[i] = m_field->subtract(0, m_coefficients[i]); + } + CBC_PDF417ECModulusPoly* modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field, negativeCoefficients, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return modulusPoly; +} +CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusPoly::multiply(FX_INT32 scalar, FX_INT32 &e) +{ + CBC_PDF417ECModulusPoly* modulusPoly = NULL; + if (scalar == 0) { + modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field->getZero()->getField(), m_field->getZero()->getCoefficients(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return modulusPoly; + } + if (scalar == 1) { + modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field, m_coefficients, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return modulusPoly; + } + FX_INT32 size = m_coefficients.GetSize(); + CFX_Int32Array product; + product.SetSize(size); + for (FX_INT32 i = 0; i < size; i++) { + product[i] = m_field->multiply(m_coefficients[i], scalar); + } + modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field, product, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return modulusPoly; +} +CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusPoly::multiplyByMonomial(FX_INT32 degree, FX_INT32 coefficient, FX_INT32 &e) +{ + if (degree < 0) { + e = BCExceptionIllegalArgument; + return NULL; + } + CBC_PDF417ECModulusPoly* modulusPoly = NULL; + if (coefficient == 0) { + modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field->getZero()->m_field, m_field->getZero()->m_coefficients, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return modulusPoly; + } + FX_INT32 size = m_coefficients.GetSize(); + CFX_Int32Array product; + product.SetSize(size + degree); + for (FX_INT32 i = 0; i < size; i++) { + product[i] = m_field->multiply(m_coefficients[i], coefficient); + } + modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field, product, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return modulusPoly; +} +CFX_PtrArray* CBC_PDF417ECModulusPoly::divide(CBC_PDF417ECModulusPoly* other, FX_INT32 &e) +{ + if (other->isZero()) { + e = BCExceptionDivideByZero; + return NULL; + } + CBC_PDF417ECModulusPoly* quotient = FX_NEW CBC_PDF417ECModulusPoly(m_field->getZero()->m_field, m_field->getZero()->m_coefficients, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_PDF417ECModulusPoly* remainder = FX_NEW CBC_PDF417ECModulusPoly(m_field, m_coefficients, e); + if (e != BCExceptionNO) { + delete quotient; + return NULL; + } + FX_INT32 denominatorLeadingTerm = other->getCoefficient(other->getDegree()); + FX_INT32 inverseDenominatorLeadingTerm = m_field->inverse(denominatorLeadingTerm, e); + if (e != BCExceptionNO) { + delete quotient; + delete remainder; + return NULL; + } + while (remainder->getDegree() >= other->getDegree() && !remainder->isZero()) { + FX_INT32 degreeDifference = remainder->getDegree() - other->getDegree(); + FX_INT32 scale = m_field->multiply(remainder->getCoefficient(remainder->getDegree()), inverseDenominatorLeadingTerm); + CBC_PDF417ECModulusPoly* term = other->multiplyByMonomial(degreeDifference, scale, e); + if (e != BCExceptionNO) { + delete quotient; + delete remainder; + return NULL; + } + CBC_PDF417ECModulusPoly* iterationQuotient = m_field->buildMonomial(degreeDifference, scale, e); + if (e != BCExceptionNO) { + delete quotient; + delete remainder; + delete term; + return NULL; + } + CBC_PDF417ECModulusPoly* temp = quotient; + quotient = temp->add(iterationQuotient, e); + delete iterationQuotient; + delete temp; + if (e != BCExceptionNO) { + delete remainder; + return NULL; + } + temp = remainder; + remainder = temp->subtract(term, e); + delete term; + delete temp; + if (e != BCExceptionNO) { + delete quotient; + return NULL; + } + } + CFX_PtrArray* modulusPoly = FX_NEW CFX_PtrArray; + modulusPoly->Add(quotient); + modulusPoly->Add(remainder); + return modulusPoly; +} +CFX_ByteString CBC_PDF417ECModulusPoly::toString() +{ + CFX_ByteString result; + for (FX_INT32 degree = getDegree(); degree >= 0; degree--) { + FX_INT32 coefficient = getCoefficient(degree); + if (coefficient != 0) { + if (coefficient < 0) { + result += " - "; + coefficient = -coefficient; + } else { + if (result.GetLength() > 0) { + result += " + "; + } + } + if (degree == 0 || coefficient != 1) { + result += coefficient; + } + if (degree != 0) { + if (degree == 1) { + result += 'x'; + } else { + result += "x^"; + result += degree; + } + } + } + } + return result; +} diff --git a/xfa/src/fxbarcode/src/BC_PDF417ErrorCorrection.cpp b/xfa/src/fxbarcode/src/BC_PDF417ErrorCorrection.cpp new file mode 100644 index 0000000000..1fe1512f44 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_PDF417ErrorCorrection.cpp @@ -0,0 +1,177 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_PDF417ErrorCorrection.h" +FX_INT32 CBC_PDF417ErrorCorrection::EC_COEFFICIENTS[][2500] = { + {27, 917}, + {522, 568, 723, 809}, + {237, 308, 436, 284, 646, 653, 428, 379}, + { + 274, 562, 232, 755, 599, 524, 801, 132, 295, 116, 442, 428, 295, + 42, 176, 65 + }, + { + 361, 575, 922, 525, 176, 586, 640, 321, 536, 742, 677, 742, 687, + 284, 193, 517, 273, 494, 263, 147, 593, 800, 571, 320, 803, + 133, 231, 390, 685, 330, 63, 410 + }, + { + 539, 422, 6, 93, 862, 771, 453, 106, 610, 287, 107, 505, 733, + 877, 381, 612, 723, 476, 462, 172, 430, 609, 858, 822, 543, + 376, 511, 400, 672, 762, 283, 184, 440, 35, 519, 31, 460, + 594, 225, 535, 517, 352, 605, 158, 651, 201, 488, 502, 648, + 733, 717, 83, 404, 97, 280, 771, 840, 629, 4, 381, 843, + 623, 264, 543 + }, + { + 521, 310, 864, 547, 858, 580, 296, 379, 53, 779, 897, 444, 400, + 925, 749, 415, 822, 93, 217, 208, 928, 244, 583, 620, 246, + 148, 447, 631, 292, 908, 490, 704, 516, 258, 457, 907, 594, + 723, 674, 292, 272, 96, 684, 432, 686, 606, 860, 569, 193, + 219, 129, 186, 236, 287, 192, 775, 278, 173, 40, 379, 712, + 463, 646, 776, 171, 491, 297, 763, 156, 732, 95, 270, 447, + 90, 507, 48, 228, 821, 808, 898, 784, 663, 627, 378, 382, + 262, 380, 602, 754, 336, 89, 614, 87, 432, 670, 616, 157, + 374, 242, 726, 600, 269, 375, 898, 845, 454, 354, 130, 814, + 587, 804, 34, 211, 330, 539, 297, 827, 865, 37, 517, 834, + 315, 550, 86, 801, 4, 108, 539 + }, + { + 524, 894, 75, 766, 882, 857, 74, 204, 82, 586, 708, 250, 905, + 786, 138, 720, 858, 194, 311, 913, 275, 190, 375, 850, 438, + 733, 194, 280, 201, 280, 828, 757, 710, 814, 919, 89, 68, + 569, 11, 204, 796, 605, 540, 913, 801, 700, 799, 137, 439, + 418, 592, 668, 353, 859, 370, 694, 325, 240, 216, 257, 284, + 549, 209, 884, 315, 70, 329, 793, 490, 274, 877, 162, 749, + 812, 684, 461, 334, 376, 849, 521, 307, 291, 803, 712, 19, + 358, 399, 908, 103, 511, 51, 8, 517, 225, 289, 470, 637, + 731, 66, 255, 917, 269, 463, 830, 730, 433, 848, 585, 136, + 538, 906, 90, 2, 290, 743, 199, 655, 903, 329, 49, 802, + 580, 355, 588, 188, 462, 10, 134, 628, 320, 479, 130, 739, + 71, 263, 318, 374, 601, 192, 605, 142, 673, 687, 234, 722, + 384, 177, 752, 607, 640, 455, 193, 689, 707, 805, 641, 48, + 60, 732, 621, 895, 544, 261, 852, 655, 309, 697, 755, 756, + 60, 231, 773, 434, 421, 726, 528, 503, 118, 49, 795, 32, + 144, 500, 238, 836, 394, 280, 566, 319, 9, 647, 550, 73, + 914, 342, 126, 32, 681, 331, 792, 620, 60, 609, 441, 180, + 791, 893, 754, 605, 383, 228, 749, 760, 213, 54, 297, 134, + 54, 834, 299, 922, 191, 910, 532, 609, 829, 189, 20, 167, + 29, 872, 449, 83, 402, 41, 656, 505, 579, 481, 173, 404, + 251, 688, 95, 497, 555, 642, 543, 307, 159, 924, 558, 648, + 55, 497, 10 + }, + { + 352, 77, 373, 504, 35, 599, 428, 207, 409, 574, 118, 498, 285, + 380, 350, 492, 197, 265, 920, 155, 914, 299, 229, 643, 294, + 871, 306, 88, 87, 193, 352, 781, 846, 75, 327, 520, 435, + 543, 203, 666, 249, 346, 781, 621, 640, 268, 794, 534, 539, + 781, 408, 390, 644, 102, 476, 499, 290, 632, 545, 37, 858, + 916, 552, 41, 542, 289, 122, 272, 383, 800, 485, 98, 752, + 472, 761, 107, 784, 860, 658, 741, 290, 204, 681, 407, 855, + 85, 99, 62, 482, 180, 20, 297, 451, 593, 913, 142, 808, + 684, 287, 536, 561, 76, 653, 899, 729, 567, 744, 390, 513, + 192, 516, 258, 240, 518, 794, 395, 768, 848, 51, 610, 384, + 168, 190, 826, 328, 596, 786, 303, 570, 381, 415, 641, 156, + 237, 151, 429, 531, 207, 676, 710, 89, 168, 304, 402, 40, + 708, 575, 162, 864, 229, 65, 861, 841, 512, 164, 477, 221, + 92, 358, 785, 288, 357, 850, 836, 827, 736, 707, 94, 8, + 494, 114, 521, 2, 499, 851, 543, 152, 729, 771, 95, 248, + 361, 578, 323, 856, 797, 289, 51, 684, 466, 533, 820, 669, + 45, 902, 452, 167, 342, 244, 173, 35, 463, 651, 51, 699, + 591, 452, 578, 37, 124, 298, 332, 552, 43, 427, 119, 662, + 777, 475, 850, 764, 364, 578, 911, 283, 711, 472, 420, 245, + 288, 594, 394, 511, 327, 589, 777, 699, 688, 43, 408, 842, + 383, 721, 521, 560, 644, 714, 559, 62, 145, 873, 663, 713, + 159, 672, 729, 624, 59, 193, 417, 158, 209, 563, 564, 343, + 693, 109, 608, 563, 365, 181, 772, 677, 310, 248, 353, 708, + 410, 579, 870, 617, 841, 632, 860, 289, 536, 35, 777, 618, + 586, 424, 833, 77, 597, 346, 269, 757, 632, 695, 751, 331, + 247, 184, 45, 787, 680, 18, 66, 407, 369, 54, 492, 228, + 613, 830, 922, 437, 519, 644, 905, 789, 420, 305, 441, 207, + 300, 892, 827, 141, 537, 381, 662, 513, 56, 252, 341, 242, + 797, 838, 837, 720, 224, 307, 631, 61, 87, 560, 310, 756, + 665, 397, 808, 851, 309, 473, 795, 378, 31, 647, 915, 459, + 806, 590, 731, 425, 216, 548, 249, 321, 881, 699, 535, 673, + 782, 210, 815, 905, 303, 843, 922, 281, 73, 469, 791, 660, + 162, 498, 308, 155, 422, 907, 817, 187, 62, 16, 425, 535, + 336, 286, 437, 375, 273, 610, 296, 183, 923, 116, 667, 751, + 353, 62, 366, 691, 379, 687, 842, 37, 357, 720, 742, 330, + 5, 39, 923, 311, 424, 242, 749, 321, 54, 669, 316, 342, + 299, 534, 105, 667, 488, 640, 672, 576, 540, 316, 486, 721, + 610, 46, 656, 447, 171, 616, 464, 190, 531, 297, 321, 762, + 752, 533, 175, 134, 14, 381, 433, 717, 45, 111, 20, 596, + 284, 736, 138, 646, 411, 877, 669, 141, 919, 45, 780, 407, + 164, 332, 899, 165, 726, 600, 325, 498, 655, 357, 752, 768, + 223, 849, 647, 63, 310, 863, 251, 366, 304, 282, 738, 675, + 410, 389, 244, 31, 121, 303, 263 + } +}; +CBC_PDF417ErrorCorrection::CBC_PDF417ErrorCorrection() +{ +} +CBC_PDF417ErrorCorrection::~CBC_PDF417ErrorCorrection() +{ +} +FX_INT32 CBC_PDF417ErrorCorrection::getErrorCorrectionCodewordCount(FX_INT32 errorCorrectionLevel, FX_INT32 &e) +{ + if (errorCorrectionLevel < 0 || errorCorrectionLevel > 8) { + e = BCExceptionErrorCorrectionLevelMustBeBetween0And8; + return -1; + } + return 1 << (errorCorrectionLevel + 1); +} +FX_INT32 CBC_PDF417ErrorCorrection::getRecommendedMinimumErrorCorrectionLevel(FX_INT32 n, FX_INT32 &e) +{ + if (n <= 0) { + e = BCExceptionIllegalArgumentnMustBeAbove0; + return -1; + } + if (n <= 40) { + return 2; + } + if (n <= 160) { + return 3; + } + if (n <= 320) { + return 4; + } + if (n <= 863) { + return 5; + } + e = BCExceptionNoRecommendationPossible; + return -1; +} +CFX_WideString CBC_PDF417ErrorCorrection::generateErrorCorrection(CFX_WideString dataCodewords, FX_INT32 errorCorrectionLevel, FX_INT32 &e) +{ + FX_INT32 k = getErrorCorrectionCodewordCount(errorCorrectionLevel, e); + BC_EXCEPTION_CHECK_ReturnValue(e, (FX_WCHAR)' '); + FX_WCHAR* ech = FX_Alloc(FX_WCHAR, k * sizeof(FX_WCHAR)); + FXSYS_memset32(ech, 0, k * sizeof(FX_WCHAR)); + FX_INT32 sld = dataCodewords.GetLength(); + for (FX_INT32 i = 0; i < sld; i++) { + FX_INT32 t1 = (dataCodewords.GetAt(i) + ech[k - 1]) % 929; + FX_INT32 t2; + FX_INT32 t3; + for (FX_INT32 j = k - 1; j >= 1; j--) { + t2 = (t1 * EC_COEFFICIENTS[errorCorrectionLevel][j]) % 929; + t3 = 929 - t2; + ech[j] = (FX_WCHAR) ((ech[j - 1] + t3) % 929); + } + t2 = (t1 * EC_COEFFICIENTS[errorCorrectionLevel][0]) % 929; + t3 = 929 - t2; + ech[0] = (FX_WCHAR) (t3 % 929); + } + CFX_WideString sb; + for (FX_INT32 j = k - 1; j >= 0; j--) { + if (ech[j] != 0) { + ech[j] = (FX_WCHAR) (929 - ech[j]); + } + sb += (FX_WCHAR)ech[j]; + } + FX_Free (ech); + return sb; +} diff --git a/xfa/src/fxbarcode/src/BC_PDF417HighLevelEncoder.cpp b/xfa/src/fxbarcode/src/BC_PDF417HighLevelEncoder.cpp new file mode 100644 index 0000000000..ade6977a50 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_PDF417HighLevelEncoder.cpp @@ -0,0 +1,420 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_PDF417Compaction.h" +#include "include/BC_UtilCodingConvert.h" +#include "include/BC_PDF417HighLevelEncoder.h" +#define SUBMODE_ALPHA 0 +#define SUBMODE_LOWER 1 +#define SUBMODE_MIXED 2 +FX_INT32 CBC_PDF417HighLevelEncoder::TEXT_COMPACTION = 0; +FX_INT32 CBC_PDF417HighLevelEncoder::BYTE_COMPACTION = 1; +FX_INT32 CBC_PDF417HighLevelEncoder::NUMERIC_COMPACTION = 2; +FX_INT32 CBC_PDF417HighLevelEncoder::SUBMODE_PUNCTUATION = 3; +FX_INT32 CBC_PDF417HighLevelEncoder::LATCH_TO_TEXT = 900; +FX_INT32 CBC_PDF417HighLevelEncoder::LATCH_TO_BYTE_PADDED = 901; +FX_INT32 CBC_PDF417HighLevelEncoder::LATCH_TO_NUMERIC = 902; +FX_INT32 CBC_PDF417HighLevelEncoder::SHIFT_TO_BYTE = 913; +FX_INT32 CBC_PDF417HighLevelEncoder::LATCH_TO_BYTE = 924; +FX_BYTE CBC_PDF417HighLevelEncoder::TEXT_MIXED_RAW[] = {48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 38, 13, 9, 44, 58, + 35, 45, 46, 36, 47, 43, 37, 42, 61, 94, 0, 32, 0, 0, 0 + }; +FX_BYTE CBC_PDF417HighLevelEncoder::TEXT_PUNCTUATION_RAW[] = {59, 60, 62, 64, 91, 92, 93, 95, 96, 126, 33, 13, 9, 44, 58, + 10, 45, 46, 36, 47, 34, 124, 42, 40, 41, 63, 123, 125, 39, 0 + }; +FX_INT32 CBC_PDF417HighLevelEncoder::MIXED[128] = {0}; +FX_INT32 CBC_PDF417HighLevelEncoder::PUNCTUATION[128] = {0}; +void CBC_PDF417HighLevelEncoder::Initialize() +{ + Inverse(); +} +void CBC_PDF417HighLevelEncoder::Finalize() +{ +} +CBC_PDF417HighLevelEncoder::CBC_PDF417HighLevelEncoder() +{ +} +CBC_PDF417HighLevelEncoder::~CBC_PDF417HighLevelEncoder() +{ +} +CFX_WideString CBC_PDF417HighLevelEncoder::encodeHighLevel(CFX_WideString wideMsg, Compaction compaction, FX_INT32 &e) +{ + CFX_ByteString bytes; + CBC_UtilCodingConvert::UnicodeToUTF8(wideMsg, bytes); + CFX_WideString msg; + FX_INT32 len = bytes.GetLength(); + for (FX_INT32 i = 0; i < len; i++) { + FX_WCHAR ch = (FX_WCHAR)(bytes.GetAt(i) & 0xff); + if (ch == '?' && bytes.GetAt(i) != '?') { + e = BCExceptionCharactersOutsideISO88591Encoding; + return (FX_LPWSTR)""; + } + msg += ch; + } + CFX_ByteArray byteArr; + for (FX_INT32 k = 0; k < bytes.GetLength(); k++) { + byteArr.Add(bytes.GetAt(k)); + } + CFX_WideString sb; + len = msg.GetLength(); + FX_INT32 p = 0; + FX_INT32 textSubMode = SUBMODE_ALPHA; + if (compaction == TEXT) { + encodeText(msg, p, len, sb, textSubMode); + } else if (compaction == BYTES) { + encodeBinary(&byteArr, p, byteArr.GetSize(), BYTE_COMPACTION, sb); + } else if (compaction == NUMERIC) { + sb += (FX_WCHAR) LATCH_TO_NUMERIC; + encodeNumeric(msg, p, len, sb); + } else { + FX_INT32 encodingMode = LATCH_TO_TEXT; + while (p < len) { + FX_INT32 n = determineConsecutiveDigitCount(msg, p); + if (n >= 13) { + sb += (FX_WCHAR) LATCH_TO_NUMERIC; + encodingMode = NUMERIC_COMPACTION; + textSubMode = SUBMODE_ALPHA; + encodeNumeric(msg, p, n, sb); + p += n; + } else { + FX_INT32 t = determineConsecutiveTextCount(msg, p); + if (t >= 5 || n == len) { + if (encodingMode != TEXT_COMPACTION) { + sb += (FX_WCHAR) LATCH_TO_TEXT; + encodingMode = TEXT_COMPACTION; + textSubMode = SUBMODE_ALPHA; + } + textSubMode = encodeText(msg, p, t, sb, textSubMode); + p += t; + } else { + FX_INT32 b = determineConsecutiveBinaryCount(msg, &byteArr, p, e); + BC_EXCEPTION_CHECK_ReturnValue(e, (FX_WCHAR)' '); + if (b == 0) { + b = 1; + } + if (b == 1 && encodingMode == TEXT_COMPACTION) { + encodeBinary(&byteArr, p, 1, TEXT_COMPACTION, sb); + } else { + encodeBinary(&byteArr, p, b, encodingMode, sb); + encodingMode = BYTE_COMPACTION; + textSubMode = SUBMODE_ALPHA; + } + p += b; + } + } + } + } + return sb; +} +void CBC_PDF417HighLevelEncoder::Inverse() +{ + FX_BYTE i = 0; + FX_INT32 l = 0; + for (l = 0; l < sizeof(MIXED) / sizeof(MIXED[0]); l++) { + MIXED[l] = -1; + } + for (i = 0; i < sizeof(TEXT_MIXED_RAW) / sizeof(TEXT_MIXED_RAW[0]); i++) { + FX_BYTE b = TEXT_MIXED_RAW[i]; + if (b > 0) { + MIXED[b] = i; + } + } + for (l = 0; l < sizeof(PUNCTUATION) / sizeof(PUNCTUATION[0]); l++) { + PUNCTUATION[l] = -1; + } + for (i = 0; i < sizeof(TEXT_PUNCTUATION_RAW) / sizeof(TEXT_PUNCTUATION_RAW[0]); i++) { + FX_BYTE b = TEXT_PUNCTUATION_RAW[i]; + if (b > 0) { + PUNCTUATION[b] = i; + } + } +} +CFX_ByteArray* CBC_PDF417HighLevelEncoder::getBytesForMessage(CFX_WideString msg) +{ + CFX_ByteString bytestring; + CBC_UtilCodingConvert::UnicodeToUTF8(msg, bytestring); + CFX_ByteArray* bytearray = FX_NEW CFX_ByteArray; + for (FX_INT32 i = 0; i < bytestring.GetLength(); i++) { + bytearray->Add(bytestring.GetAt(i)); + } + return bytearray; +} +FX_INT32 CBC_PDF417HighLevelEncoder::encodeText(CFX_WideString msg, FX_INT32 startpos, FX_INT32 count, CFX_WideString &sb, FX_INT32 initialSubmode) +{ + CFX_WideString tmp; + FX_INT32 submode = initialSubmode; + FX_INT32 idx = 0; + while (TRUE) { + FX_WCHAR ch = msg.GetAt(startpos + idx); + switch (submode) { + case SUBMODE_ALPHA: + if (isAlphaUpper(ch)) { + if (ch == ' ') { + tmp += (FX_WCHAR) 26; + } else { + tmp += (FX_WCHAR) (ch - 65); + } + } else { + if (isAlphaLower(ch)) { + submode = SUBMODE_LOWER; + tmp += (FX_WCHAR) 27; + continue; + } else if (isMixed(ch)) { + submode = SUBMODE_MIXED; + tmp += (FX_WCHAR) 28; + continue; + } else { + tmp += (FX_WCHAR) 29; + tmp += PUNCTUATION[ch]; + break; + } + } + break; + case SUBMODE_LOWER: + if (isAlphaLower(ch)) { + if (ch == ' ') { + tmp += (FX_WCHAR) 26; + } else { + tmp += (FX_WCHAR) (ch - 97); + } + } else { + if (isAlphaUpper(ch)) { + tmp += (FX_WCHAR) 27; + tmp += (FX_WCHAR) (ch - 65); + break; + } else if (isMixed(ch)) { + submode = SUBMODE_MIXED; + tmp += (FX_WCHAR) 28; + continue; + } else { + tmp += (FX_WCHAR) 29; + tmp += PUNCTUATION[ch]; + break; + } + } + break; + case SUBMODE_MIXED: + if (isMixed(ch)) { + FX_WCHAR a = MIXED[ch]; + FX_INT32 b = (FX_INT32)a; + tmp += MIXED[ch]; + } else { + if (isAlphaUpper(ch)) { + submode = SUBMODE_ALPHA; + tmp += (FX_WCHAR) 28; + continue; + } else if (isAlphaLower(ch)) { + submode = SUBMODE_LOWER; + tmp += (FX_WCHAR) 27; + continue; + } else { + if (startpos + idx + 1 < count) { + FX_WCHAR next = msg.GetAt(startpos + idx + 1); + if (isPunctuation(next)) { + submode = SUBMODE_PUNCTUATION; + tmp += (FX_WCHAR) 25; + continue; + } + } + tmp += (FX_WCHAR) 29; + tmp += PUNCTUATION[ch]; + } + } + break; + default: + if (isPunctuation(ch)) { + tmp += PUNCTUATION[ch]; + } else { + submode = SUBMODE_ALPHA; + tmp += (FX_WCHAR) 29; + continue; + } + } + idx++; + if (idx >= count) { + break; + } + } + FX_WCHAR h = 0; + FX_INT32 len = tmp.GetLength(); + for (FX_INT32 i = 0; i < len; i++) { + FX_BOOL odd = (i % 2) != 0; + if (odd) { + h = (FX_WCHAR) ((h * 30) + tmp.GetAt(i)); + sb += h; + } else { + h = tmp.GetAt(i); + } + } + if ((len % 2) != 0) { + sb += (FX_WCHAR) ((h * 30) + 29); + } + return submode; +} +void CBC_PDF417HighLevelEncoder::encodeBinary(CFX_ByteArray* bytes, FX_INT32 startpos, FX_INT32 count, FX_INT32 startmode, CFX_WideString &sb) +{ + if (count == 1 && startmode == TEXT_COMPACTION) { + sb += (FX_WCHAR) SHIFT_TO_BYTE; + } + FX_INT32 idx = startpos; + FX_INT32 i = 0; + if (count >= 6) { + sb += (FX_WCHAR) LATCH_TO_BYTE; + FX_WCHAR chars[5]; + while ((startpos + count - idx) >= 6) { + FX_INT64 t = 0; + for (i = 0; i < 6; i++) { + t <<= 8; + t += bytes->GetAt(idx + i) & 0xff; + } + for (i = 0; i < 5; i++) { + chars[i] = (FX_WCHAR) (t % 900); + t /= 900; + } + for (i = 4; i >= 0; i--) { + sb += (chars[i]); + } + idx += 6; + } + } + if (idx < startpos + count) { + sb += (FX_WCHAR) LATCH_TO_BYTE_PADDED; + } + for (i = idx; i < startpos + count; i++) { + FX_INT32 ch = bytes->GetAt(i) & 0xff; + sb += (FX_WCHAR) ch; + } +} +void CBC_PDF417HighLevelEncoder::encodeNumeric(CFX_WideString msg, FX_INT32 startpos, FX_INT32 count, CFX_WideString &sb) +{ + FX_INT32 idx = 0; + CFX_WideString tmp; + FX_INT32 num900 = 900; + FX_INT32 num0 = 0; + while (idx < count - 1) { + FX_INT32 len = 44 < count - idx ? 44 : count - idx; + CFX_WideString part = (FX_WCHAR)'1' + msg.Mid(startpos + idx, len); + FX_INT32 bigint = part.GetInteger(); + do { + FX_INT32 c = bigint % num900; + tmp += (FX_WCHAR) (c); + bigint = bigint / num900; + } while (bigint != num0); + for (FX_INT32 i = tmp.GetLength() - 1; i >= 0; i--) { + sb += (tmp.GetAt(i)); + } + idx += len; + } +} +FX_BOOL CBC_PDF417HighLevelEncoder::isDigit(FX_WCHAR ch) +{ + return ch >= '0' && ch <= '9'; +} +FX_BOOL CBC_PDF417HighLevelEncoder::isAlphaUpper(FX_WCHAR ch) +{ + return ch == ' ' || (ch >= 'A' && ch <= 'Z'); +} +FX_BOOL CBC_PDF417HighLevelEncoder::isAlphaLower(FX_WCHAR ch) +{ + return ch == ' ' || (ch >= 'a' && ch <= 'z'); +} +FX_BOOL CBC_PDF417HighLevelEncoder::isMixed(FX_WCHAR ch) +{ + return MIXED[ch] != -1; +} +FX_BOOL CBC_PDF417HighLevelEncoder::isPunctuation(FX_WCHAR ch) +{ + return PUNCTUATION[ch] != -1; +} +FX_BOOL CBC_PDF417HighLevelEncoder::isText(FX_WCHAR ch) +{ + return ch == '\t' || ch == '\n' || ch == '\r' || (ch >= 32 && ch <= 126); +} +FX_INT32 CBC_PDF417HighLevelEncoder::determineConsecutiveDigitCount(CFX_WideString msg, FX_INT32 startpos) +{ + FX_INT32 count = 0; + FX_INT32 len = msg.GetLength(); + FX_INT32 idx = startpos; + if (idx < len) { + FX_WCHAR ch = msg.GetAt(idx); + while (isDigit(ch) && idx < len) { + count++; + idx++; + if (idx < len) { + ch = msg.GetAt(idx); + } + } + } + return count; +} +FX_INT32 CBC_PDF417HighLevelEncoder::determineConsecutiveTextCount(CFX_WideString msg, FX_INT32 startpos) +{ + FX_INT32 len = msg.GetLength(); + FX_INT32 idx = startpos; + while (idx < len) { + FX_WCHAR ch = msg.GetAt(idx); + FX_INT32 numericCount = 0; + while (numericCount < 13 && isDigit(ch) && idx < len) { + numericCount++; + idx++; + if (idx < len) { + ch = msg.GetAt(idx); + } + } + if (numericCount >= 13) { + return idx - startpos - numericCount; + } + if (numericCount > 0) { + continue; + } + ch = msg.GetAt(idx); + if (!isText(ch)) { + break; + } + idx++; + } + return idx - startpos; +} +FX_INT32 CBC_PDF417HighLevelEncoder::determineConsecutiveBinaryCount(CFX_WideString msg, CFX_ByteArray* bytes, FX_INT32 startpos, FX_INT32 &e) +{ + FX_INT32 len = msg.GetLength(); + FX_INT32 idx = startpos; + while (idx < len) { + FX_WCHAR ch = msg.GetAt(idx); + FX_INT32 numericCount = 0; + while (numericCount < 13 && isDigit(ch)) { + numericCount++; + FX_INT32 i = idx + numericCount; + if (i >= len) { + break; + } + ch = msg.GetAt(i); + } + if (numericCount >= 13) { + return idx - startpos; + } + FX_INT32 textCount = 0; + while (textCount < 5 && isText(ch)) { + textCount++; + FX_INT32 i = idx + textCount; + if (i >= len) { + break; + } + ch = msg.GetAt(i); + } + if (textCount >= 5) { + return idx - startpos; + } + ch = msg.GetAt(idx); + if (bytes->GetAt(idx) == 63 && ch != '?') { + e = BCExceptionNonEncodableCharacterDetected; + return -1; + } + idx++; + } + return idx - startpos; +} diff --git a/xfa/src/fxbarcode/src/BC_PDF417Reader.cpp b/xfa/src/fxbarcode/src/BC_PDF417Reader.cpp new file mode 100644 index 0000000000..91599baf50 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_PDF417Reader.cpp @@ -0,0 +1,103 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_Reader.h" +#include "include/BC_BinaryBitmap.h" +#include "include/BC_ResultPoint.h" +#include "include/BC_PDF417DetectorResult.h" +#include "include/BC_BinaryBitmap.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_CommonBitArray.h" +#include "include/BC_PDF417Detector.h" +#include "include/BC_PDF417DetectorResult.h" +#include "include/BC_DecoderResult.h" +#include "include/BC_PDF417Codeword.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_PDF417Common.h" +#include "include/BC_PDF417BarcodeValue.h" +#include "include/BC_PDF417BarcodeMetadata.h" +#include "include/BC_PDF417BoundingBox.h" +#include "include/BC_PDF417DetectionResultColumn.h" +#include "include/BC_PDF417DetectionResultRowIndicatorColumn.h" +#include "include/BC_PDF417DetectionResult.h" +#include "include/BC_PDF417DecodedBitStreamParser.h" +#include "include/BC_PDF417CodewordDecoder.h" +#include "include/BC_PDF417DecodedBitStreamParser.h" +#include "include/BC_PDF417ECModulusPoly.h" +#include "include/BC_PDF417ECModulusGF.h" +#include "include/BC_PDF417ECErrorCorrection.h" +#include "include/BC_PDF417DecodedBitStreamParser.h" +#include "include/BC_CommonDecoderResult.h" +#include "include/BC_PDF417ScanningDecoder.h" +#include "include/BC_PDF417Reader.h" +#define Integer_MAX_VALUE 2147483647 +CBC_PDF417Reader::CBC_PDF417Reader() +{ +} +CBC_PDF417Reader::~CBC_PDF417Reader() +{ +} +CFX_ByteString CBC_PDF417Reader::Decode(CBC_BinaryBitmap *image, FX_INT32 &e) +{ + return Decode(image, 0, e); +} +CFX_ByteString CBC_PDF417Reader::Decode(CBC_BinaryBitmap *image, FX_BOOL multiple, FX_INT32 hints, FX_INT32 &e) +{ + CFX_ByteString results; + CBC_PDF417DetectorResult* detectorResult = CBC_Detector::detect(image, hints, multiple, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + for (FX_INT32 i = 0; i < detectorResult->getPoints()->GetSize(); i++) { + CFX_PtrArray* points = (CFX_PtrArray*)detectorResult->getPoints()->GetAt(i); + CBC_CommonDecoderResult* ResultTemp = CBC_PDF417ScanningDecoder::decode(detectorResult->getBits(), (CBC_ResultPoint*)points->GetAt(4), (CBC_ResultPoint*)points->GetAt(5), + (CBC_ResultPoint*)points->GetAt(6), (CBC_ResultPoint*)points->GetAt(7), getMinCodewordWidth(*points), getMaxCodewordWidth(*points), e); + if (ResultTemp == NULL) { + delete detectorResult; + e = BCExceptiontNotFoundInstance; + return ""; + } + results += ResultTemp->GetText(); + delete ResultTemp; + } + delete detectorResult; + return results; +} +CFX_ByteString CBC_PDF417Reader::Decode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e) +{ + CFX_ByteString bs = Decode(image, FALSE, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + return bs; +} +FX_INT32 CBC_PDF417Reader::getMaxWidth(CBC_ResultPoint* p1, CBC_ResultPoint* p2) +{ + if (p1 == NULL || p2 == NULL) { + return 0; + } + return (FX_INT32) FXSYS_fabs(p1->GetX() - p2->GetX()); +} +FX_INT32 CBC_PDF417Reader::getMinWidth(CBC_ResultPoint* p1, CBC_ResultPoint* p2) +{ + if (p1 == NULL || p2 == NULL) { + return Integer_MAX_VALUE; + } + return (FX_INT32) FXSYS_fabs(p1->GetX() - p2->GetX()); +} +FX_INT32 CBC_PDF417Reader::getMaxCodewordWidth(CFX_PtrArray& p) +{ + FX_INT32 a = getMaxWidth((CBC_ResultPoint*)p.GetAt(6), (CBC_ResultPoint*)p.GetAt(2)) * CBC_PDF417Common::MODULES_IN_CODEWORD / CBC_PDF417Common::MODULES_IN_STOP_PATTERN; + FX_INT32 b = getMaxWidth((CBC_ResultPoint*)p.GetAt(7), (CBC_ResultPoint*)p.GetAt(3)) * CBC_PDF417Common::MODULES_IN_CODEWORD / CBC_PDF417Common::MODULES_IN_STOP_PATTERN; + FX_INT32 c = getMaxWidth((CBC_ResultPoint*)p.GetAt(0), (CBC_ResultPoint*)p.GetAt(4)) < a ? getMaxWidth((CBC_ResultPoint*)p.GetAt(0), (CBC_ResultPoint*)p.GetAt(4)) : a; + FX_INT32 d = getMaxWidth((CBC_ResultPoint*)p.GetAt(1), (CBC_ResultPoint*)p.GetAt(5)) < b ? getMaxWidth((CBC_ResultPoint*)p.GetAt(1), (CBC_ResultPoint*)p.GetAt(5)) : b; + return c < d ? c : d; +} +FX_INT32 CBC_PDF417Reader::getMinCodewordWidth(CFX_PtrArray& p) +{ + FX_INT32 a = getMinWidth((CBC_ResultPoint*)p.GetAt(6), (CBC_ResultPoint*)p.GetAt(2)) * CBC_PDF417Common::MODULES_IN_CODEWORD / CBC_PDF417Common::MODULES_IN_STOP_PATTERN; + FX_INT32 b = getMinWidth((CBC_ResultPoint*)p.GetAt(7), (CBC_ResultPoint*)p.GetAt(3)) * CBC_PDF417Common::MODULES_IN_CODEWORD / CBC_PDF417Common::MODULES_IN_STOP_PATTERN; + FX_INT32 c = getMinWidth((CBC_ResultPoint*)p.GetAt(0), (CBC_ResultPoint*)p.GetAt(4)) < a ? getMinWidth((CBC_ResultPoint*)p.GetAt(0), (CBC_ResultPoint*)p.GetAt(4)) : a; + FX_INT32 d = getMinWidth((CBC_ResultPoint*)p.GetAt(1), (CBC_ResultPoint*)p.GetAt(5)) < b ? getMinWidth((CBC_ResultPoint*)p.GetAt(1), (CBC_ResultPoint*)p.GetAt(5)) : b; + return c < d ? c : d; +} diff --git a/xfa/src/fxbarcode/src/BC_PDF417ResultMetadata.cpp b/xfa/src/fxbarcode/src/BC_PDF417ResultMetadata.cpp new file mode 100644 index 0000000000..4728ba7d74 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_PDF417ResultMetadata.cpp @@ -0,0 +1,46 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_PDF417ResultMetadata.h" +CBC_PDF417ResultMetadata::CBC_PDF417ResultMetadata() +{ +} +CBC_PDF417ResultMetadata::~CBC_PDF417ResultMetadata() +{ +} +FX_INT32 CBC_PDF417ResultMetadata::getSegmentIndex() +{ + return m_segmentIndex; +} +void CBC_PDF417ResultMetadata::setSegmentIndex(FX_INT32 segmentIndex) +{ + m_segmentIndex = segmentIndex; +} +CFX_ByteString CBC_PDF417ResultMetadata::getFileId() +{ + return m_fileId; +} +void CBC_PDF417ResultMetadata::setFileId(CFX_ByteString fileId) +{ + m_fileId = fileId; +} +CFX_Int32Array& CBC_PDF417ResultMetadata::getOptionalData() +{ + return m_optionalData; +} +void CBC_PDF417ResultMetadata::setOptionalData(CFX_Int32Array &optionalData) +{ + m_optionalData.Copy(optionalData); +} +FX_BOOL CBC_PDF417ResultMetadata::isLastSegment() +{ + return m_lastSegment; +} +void CBC_PDF417ResultMetadata::setLastSegment(FX_BOOL lastSegment) +{ + m_lastSegment = lastSegment; +} diff --git a/xfa/src/fxbarcode/src/BC_PDF417ScanningDecoder.cpp b/xfa/src/fxbarcode/src/BC_PDF417ScanningDecoder.cpp new file mode 100644 index 0000000000..f5467a6ea9 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_PDF417ScanningDecoder.cpp @@ -0,0 +1,580 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_DecoderResult.h" +#include "include/BC_ResultPoint.h" +#include "include/BC_PDF417Codeword.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_PDF417Common.h" +#include "include/BC_PDF417BarcodeValue.h" +#include "include/BC_PDF417BarcodeMetadata.h" +#include "include/BC_PDF417BoundingBox.h" +#include "include/BC_PDF417DetectionResultColumn.h" +#include "include/BC_PDF417DetectionResultRowIndicatorColumn.h" +#include "include/BC_PDF417DetectionResult.h" +#include "include/BC_PDF417DecodedBitStreamParser.h" +#include "include/BC_PDF417CodewordDecoder.h" +#include "include/BC_PDF417DecodedBitStreamParser.h" +#include "include/BC_PDF417ECModulusPoly.h" +#include "include/BC_PDF417ECModulusGF.h" +#include "include/BC_PDF417ECErrorCorrection.h" +#include "include/BC_PDF417DecodedBitStreamParser.h" +#include "include/BC_PDF417ScanningDecoder.h" +FX_INT32 CBC_PDF417ScanningDecoder::CODEWORD_SKEW_SIZE = 2; +FX_INT32 CBC_PDF417ScanningDecoder::MAX_ERRORS = 3; +FX_INT32 CBC_PDF417ScanningDecoder::MAX_EC_CODEWORDS = 512; +CBC_PDF417ECErrorCorrection* CBC_PDF417ScanningDecoder::errorCorrection = NULL; +CBC_PDF417ScanningDecoder::CBC_PDF417ScanningDecoder() +{ +} +CBC_PDF417ScanningDecoder::~CBC_PDF417ScanningDecoder() +{ +} +void CBC_PDF417ScanningDecoder::Initialize() +{ + errorCorrection = FX_NEW CBC_PDF417ECErrorCorrection; +} +void CBC_PDF417ScanningDecoder::Finalize() +{ + delete errorCorrection; +} +CBC_CommonDecoderResult* CBC_PDF417ScanningDecoder::decode(CBC_CommonBitMatrix* image, CBC_ResultPoint* imageTopLeft, CBC_ResultPoint* imageBottomLeft, CBC_ResultPoint* imageTopRight, + CBC_ResultPoint* imageBottomRight, FX_INT32 minCodewordWidth, FX_INT32 maxCodewordWidth, FX_INT32 &e) +{ + CBC_BoundingBox* boundingBox = FX_NEW CBC_BoundingBox(image, imageTopLeft, imageBottomLeft, imageTopRight, imageBottomRight, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn = NULL; + CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn = NULL; + CBC_DetectionResult* detectionResult = NULL; + for (FX_INT32 i = 0; i < 2; i++) { + if (imageTopLeft != NULL) { + leftRowIndicatorColumn = getRowIndicatorColumn(image, boundingBox, *imageTopLeft, TRUE, minCodewordWidth, maxCodewordWidth); + } + if (imageTopRight != NULL) { + rightRowIndicatorColumn = getRowIndicatorColumn(image, boundingBox, *imageTopRight, FALSE, minCodewordWidth, maxCodewordWidth); + } + detectionResult = merge(leftRowIndicatorColumn, rightRowIndicatorColumn, e); + if (e != BCExceptionNO) { + e = BCExceptiontNotFoundInstance; + delete leftRowIndicatorColumn; + delete rightRowIndicatorColumn; + delete boundingBox; + return NULL; + } + if (i == 0 && (detectionResult->getBoundingBox()->getMinY() < boundingBox->getMinY() || detectionResult->getBoundingBox()->getMaxY() > boundingBox->getMaxY())) { + delete boundingBox; + boundingBox = detectionResult->getBoundingBox(); + } else { + detectionResult->setBoundingBox(boundingBox); + break; + } + } + FX_INT32 maxBarcodeColumn = detectionResult->getBarcodeColumnCount() + 1; + detectionResult->setDetectionResultColumn(0, leftRowIndicatorColumn); + detectionResult->setDetectionResultColumn(maxBarcodeColumn, rightRowIndicatorColumn); + FX_BOOL leftToRight = leftRowIndicatorColumn != NULL; + for (FX_INT32 barcodeColumnCount = 1; barcodeColumnCount <= maxBarcodeColumn; barcodeColumnCount++) { + FX_INT32 barcodeColumn = leftToRight ? barcodeColumnCount : maxBarcodeColumn - barcodeColumnCount; + if (detectionResult->getDetectionResultColumn(barcodeColumn) != NULL) { + continue; + } + CBC_DetectionResultColumn* detectionResultColumn = NULL; + if (barcodeColumn == 0 || barcodeColumn == maxBarcodeColumn) { + detectionResultColumn = FX_NEW CBC_DetectionResultRowIndicatorColumn(boundingBox, barcodeColumn == 0); + } else { + detectionResultColumn = FX_NEW CBC_DetectionResultColumn(boundingBox); + } + detectionResult->setDetectionResultColumn(barcodeColumn, detectionResultColumn); + FX_INT32 startColumn = -1; + FX_INT32 previousStartColumn = startColumn; + for (FX_INT32 imageRow = boundingBox->getMinY(); imageRow <= boundingBox->getMaxY(); imageRow++) { + startColumn = getStartColumn(detectionResult, barcodeColumn, imageRow, leftToRight); + if (startColumn < 0 || startColumn > boundingBox->getMaxX()) { + if (previousStartColumn == -1) { + continue; + } + startColumn = previousStartColumn; + } + CBC_Codeword* codeword = detectCodeword(image, boundingBox->getMinX(), boundingBox->getMaxX(), leftToRight, startColumn, imageRow, minCodewordWidth, maxCodewordWidth); + if (codeword != NULL) { + detectionResultColumn->setCodeword(imageRow, codeword); + previousStartColumn = startColumn; + minCodewordWidth = minCodewordWidth < codeword->getWidth() ? minCodewordWidth : codeword->getWidth(); + maxCodewordWidth = maxCodewordWidth > codeword->getWidth() ? maxCodewordWidth : codeword->getWidth(); + } + } + } + CBC_CommonDecoderResult* decoderresult = createDecoderResult(detectionResult, e); + if (e != BCExceptionNO) { + delete detectionResult; + return NULL; + } + return decoderresult; +} +CFX_ByteString CBC_PDF417ScanningDecoder::toString(CFX_PtrArray* barcodeMatrix) +{ + CFX_ByteString result; + for (FX_INT32 row = 0; row < barcodeMatrix->GetSize(); row++) { + result += row; + FX_INT32 l = 0; + for (; l < ((CFX_PtrArray*)barcodeMatrix->GetAt(row))->GetSize(); l++) { + CBC_BarcodeValue* barcodeValue = (CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(row))->GetAt(l); + if (barcodeValue->getValue()->GetSize() == 0) { + result += ""; + } else { + result += barcodeValue->getValue()->GetAt(0); + result += barcodeValue->getConfidence(barcodeValue->getValue()->GetAt(0)); + } + } + } + return result; +} +CBC_DetectionResult* CBC_PDF417ScanningDecoder::merge(CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn, CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn, FX_INT32 &e) +{ + if (leftRowIndicatorColumn == NULL && rightRowIndicatorColumn == NULL) { + e = BCExceptionIllegalArgument; + return NULL; + } + CBC_BarcodeMetadata* barcodeMetadata = getBarcodeMetadata(leftRowIndicatorColumn, rightRowIndicatorColumn); + if (barcodeMetadata == NULL) { + e = BCExceptionCannotMetadata; + return NULL; + } + CBC_BoundingBox* leftboundingBox = adjustBoundingBox(leftRowIndicatorColumn, e); + if (e != BCExceptionNO) { + delete barcodeMetadata; + return NULL; + } + CBC_BoundingBox* rightboundingBox = adjustBoundingBox(rightRowIndicatorColumn, e); + if (e != BCExceptionNO) { + delete barcodeMetadata; + return NULL; + } + CBC_BoundingBox* boundingBox = CBC_BoundingBox::merge(leftboundingBox, rightboundingBox, e); + if (e != BCExceptionNO) { + delete barcodeMetadata; + return NULL; + } + CBC_DetectionResult* detectionresult = FX_NEW CBC_DetectionResult(barcodeMetadata, boundingBox); + return detectionresult; +} +CBC_BoundingBox* CBC_PDF417ScanningDecoder::adjustBoundingBox(CBC_DetectionResultRowIndicatorColumn* rowIndicatorColumn, FX_INT32 &e) +{ + if (rowIndicatorColumn == NULL) { + return NULL; + } + CFX_Int32Array* rowHeights = rowIndicatorColumn->getRowHeights(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + FX_INT32 maxRowHeight = getMax(*rowHeights); + FX_INT32 missingStartRows = 0; + for (FX_INT32 i = 0; i < rowHeights->GetSize(); i++) { + FX_INT32 rowHeight = rowHeights->GetAt(i); + missingStartRows += maxRowHeight - rowHeight; + if (rowHeight > 0) { + break; + } + } + CFX_PtrArray* codewords = rowIndicatorColumn->getCodewords(); + for (FX_INT32 row = 0; missingStartRows > 0 && codewords->GetAt(row) == NULL; row++) { + missingStartRows--; + } + FX_INT32 missingEndRows = 0; + for (FX_INT32 row1 = rowHeights->GetSize() - 1; row1 >= 0; row1--) { + missingEndRows += maxRowHeight - rowHeights->GetAt(row1); + if (rowHeights->GetAt(row1) > 0) { + break; + } + } + for (FX_INT32 row2 = codewords->GetSize() - 1; missingEndRows > 0 && codewords->GetAt(row2) == NULL; row2--) { + missingEndRows--; + } + CBC_BoundingBox* boundingBox = rowIndicatorColumn->getBoundingBox()->addMissingRows(missingStartRows, missingEndRows, rowIndicatorColumn->isLeft(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return boundingBox; +} +FX_INT32 CBC_PDF417ScanningDecoder::getMax(CFX_Int32Array& values) +{ + FX_INT32 maxValue = -1; + for (FX_INT32 i = 0; i < values.GetSize(); i++) { + FX_INT32 value = values.GetAt(i); + maxValue = maxValue > value ? maxValue : value; + } + return maxValue; +} +CBC_BarcodeMetadata* CBC_PDF417ScanningDecoder::getBarcodeMetadata(CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn, + CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn) +{ + CBC_BarcodeMetadata* leftBarcodeMetadata = NULL; + CBC_BarcodeMetadata* rightBarcodeMetadata = NULL; + if (leftRowIndicatorColumn == NULL || (leftBarcodeMetadata = leftRowIndicatorColumn->getBarcodeMetadata()) == NULL) { + return rightRowIndicatorColumn == NULL ? NULL : rightRowIndicatorColumn->getBarcodeMetadata(); + } + if (rightRowIndicatorColumn == NULL || (rightBarcodeMetadata = rightRowIndicatorColumn->getBarcodeMetadata()) == NULL) { + return leftRowIndicatorColumn == NULL ? NULL : leftRowIndicatorColumn->getBarcodeMetadata(); + } + if (leftBarcodeMetadata->getColumnCount() != rightBarcodeMetadata->getColumnCount() && + leftBarcodeMetadata->getErrorCorrectionLevel() != rightBarcodeMetadata->getErrorCorrectionLevel() && + leftBarcodeMetadata->getRowCount() != rightBarcodeMetadata->getRowCount()) { + delete leftBarcodeMetadata; + delete rightBarcodeMetadata; + return NULL; + } + delete rightBarcodeMetadata; + return leftBarcodeMetadata; +} +CBC_DetectionResultRowIndicatorColumn* CBC_PDF417ScanningDecoder::getRowIndicatorColumn(CBC_CommonBitMatrix* image, CBC_BoundingBox* boundingBox, CBC_ResultPoint startPoint, + FX_BOOL leftToRight, FX_INT32 minCodewordWidth, FX_INT32 maxCodewordWidth) +{ + CBC_DetectionResultRowIndicatorColumn* rowIndicatorColumn = FX_NEW CBC_DetectionResultRowIndicatorColumn(boundingBox, leftToRight); + for (FX_INT32 i = 0; i < 2; i++) { + FX_INT32 increment = i == 0 ? 1 : -1; + FX_INT32 startColumn = (FX_INT32) startPoint.GetX(); + for (FX_INT32 imageRow = (FX_INT32) startPoint.GetY(); imageRow <= boundingBox->getMaxY() && imageRow >= boundingBox->getMinY(); imageRow += increment) { + CBC_Codeword* codeword = detectCodeword(image, 0, image->GetWidth(), leftToRight, startColumn, imageRow, minCodewordWidth, maxCodewordWidth); + if (codeword != NULL) { + rowIndicatorColumn->setCodeword(imageRow, codeword); + if (leftToRight) { + startColumn = codeword->getStartX(); + } else { + startColumn = codeword->getEndX(); + } + } + } + } + return rowIndicatorColumn; +} +void CBC_PDF417ScanningDecoder::adjustCodewordCount(CBC_DetectionResult* detectionResult, CFX_PtrArray* barcodeMatrix, FX_INT32 &e) +{ + CFX_Int32Array* numberOfCodewords = ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(0))->GetAt(1))->getValue(); + FX_INT32 calculatedNumberOfCodewords = detectionResult->getBarcodeColumnCount() * detectionResult->getBarcodeRowCount() - getNumberOfECCodeWords(detectionResult->getBarcodeECLevel()); + if (numberOfCodewords->GetSize() == 0) { + if (calculatedNumberOfCodewords < 1 || calculatedNumberOfCodewords > CBC_PDF417Common::MAX_CODEWORDS_IN_BARCODE) { + e = BCExceptiontNotFoundInstance; + delete numberOfCodewords; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(0))->GetAt(1))->setValue(calculatedNumberOfCodewords); + } else if (numberOfCodewords->GetAt(0) != calculatedNumberOfCodewords) { + ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(0))->GetAt(1))->setValue(calculatedNumberOfCodewords); + } + delete numberOfCodewords; +} +CBC_CommonDecoderResult* CBC_PDF417ScanningDecoder::createDecoderResult(CBC_DetectionResult* detectionResult, FX_INT32 &e) +{ + CFX_PtrArray* barcodeMatrix = createBarcodeMatrix(detectionResult); + adjustCodewordCount(detectionResult, barcodeMatrix, e); + if (e != BCExceptionNO) { + for (FX_INT32 i = 0; i < barcodeMatrix->GetSize(); i++) { + CFX_PtrArray* temp = (CFX_PtrArray*)barcodeMatrix->GetAt(i); + for (FX_INT32 j = 0; j < temp->GetSize(); j++) { + delete (CBC_BarcodeValue*)temp->GetAt(j); + } + temp->RemoveAll(); + delete temp; + } + barcodeMatrix->RemoveAll(); + delete barcodeMatrix; + return NULL; + } + CFX_Int32Array erasures; + CFX_Int32Array codewords; + codewords.SetSize(detectionResult->getBarcodeRowCount() * detectionResult->getBarcodeColumnCount()); + CFX_PtrArray ambiguousIndexValuesList; + CFX_Int32Array ambiguousIndexesList; + for (FX_INT32 row = 0; row < detectionResult->getBarcodeRowCount(); row++) { + for (FX_INT32 l = 0; l < detectionResult->getBarcodeColumnCount(); l++) { + CFX_Int32Array* values = ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(row))->GetAt(l + 1))->getValue(); + FX_INT32 codewordIndex = row * detectionResult->getBarcodeColumnCount() + l; + if (values->GetSize() == 0) { + erasures.Add(codewordIndex); + } else if (values->GetSize() == 1) { + codewords[codewordIndex] = values->GetAt(0); + } else { + ambiguousIndexesList.Add(codewordIndex); + ambiguousIndexValuesList.Add(values); + } + } + } + CFX_PtrArray ambiguousIndexValues; + ambiguousIndexValues.SetSize(ambiguousIndexValuesList.GetSize()); + for (FX_INT32 i = 0; i < ambiguousIndexValues.GetSize(); i++) { + ambiguousIndexValues.SetAt(i, ambiguousIndexValuesList.GetAt(i)); + } + for (FX_INT32 l = 0; l < barcodeMatrix->GetSize(); l++) { + CFX_PtrArray* temp = (CFX_PtrArray*)barcodeMatrix->GetAt(l); + for (FX_INT32 j = 0; j < temp->GetSize(); j++) { + delete (CBC_BarcodeValue*)temp->GetAt(j); + } + temp->RemoveAll(); + delete temp; + } + barcodeMatrix->RemoveAll(); + delete barcodeMatrix; + CBC_CommonDecoderResult* decoderResult = createDecoderResultFromAmbiguousValues(detectionResult->getBarcodeECLevel(), codewords, erasures, ambiguousIndexesList, ambiguousIndexValues, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return decoderResult; +} +CBC_CommonDecoderResult* CBC_PDF417ScanningDecoder::createDecoderResultFromAmbiguousValues(FX_INT32 ecLevel, CFX_Int32Array &codewords, CFX_Int32Array &erasureArray, CFX_Int32Array &ambiguousIndexes, + CFX_PtrArray& ambiguousIndexValues, FX_INT32 &e) +{ + CFX_Int32Array ambiguousIndexCount; + ambiguousIndexCount.SetSize(ambiguousIndexes.GetSize()); + FX_INT32 tries = 100; + while (tries-- > 0) { + for (FX_INT32 l = 0; l < ambiguousIndexCount.GetSize(); l++) { + codewords[ambiguousIndexes[l]] = ((CFX_Int32Array*)ambiguousIndexValues.GetAt(l))->GetAt(ambiguousIndexCount[l]); + } + CBC_CommonDecoderResult* decoderResult = decodeCodewords(codewords, ecLevel, erasureArray, e); + if (e != BCExceptionNO) { + e = BCExceptionNO; + continue; + } else { + return decoderResult; + } + if (ambiguousIndexCount.GetSize() == 0) { + e = BCExceptionChecksumInstance; + return NULL; + } + for (FX_INT32 i = 0; i < ambiguousIndexCount.GetSize(); i++) { + if (ambiguousIndexCount[i] < ((CFX_Int32Array*)(ambiguousIndexValues.GetAt(i)))->GetSize() - 1) { + ambiguousIndexCount[i]++; + break; + } else { + ambiguousIndexCount[i] = 0; + if (i == ambiguousIndexCount.GetSize() - 1) { + e = BCExceptionChecksumInstance; + return NULL; + } + } + } + } + e = BCExceptionChecksumInstance; + return NULL; +} +CFX_PtrArray* CBC_PDF417ScanningDecoder::createBarcodeMatrix(CBC_DetectionResult* detectionResult) +{ + CFX_PtrArray* barcodeMatrix = FX_NEW CFX_PtrArray; + barcodeMatrix->SetSize(detectionResult->getBarcodeRowCount()); + CFX_PtrArray* temp = NULL; + FX_INT32 colume = 0; + for (FX_INT32 row = 0; row < barcodeMatrix->GetSize(); row++) { + temp = FX_NEW CFX_PtrArray; + temp->SetSize(detectionResult->getBarcodeColumnCount() + 2); + for (colume = 0; colume < detectionResult->getBarcodeColumnCount() + 2; colume++) { + temp->SetAt(colume, FX_NEW CBC_BarcodeValue()); + } + barcodeMatrix->SetAt(row, temp); + } + colume = -1; + for (FX_INT32 i = 0; i < detectionResult->getDetectionResultColumns().GetSize(); i++) { + CBC_DetectionResultColumn* detectionResultColumn = (CBC_DetectionResultColumn*) detectionResult->getDetectionResultColumns().GetAt(i); + colume++; + if (detectionResultColumn == NULL) { + continue; + } + CFX_PtrArray* temp = detectionResultColumn->getCodewords(); + for (FX_INT32 l = 0; l < temp->GetSize(); l++) { + CBC_Codeword* codeword = (CBC_Codeword*) temp->GetAt(l); + if (codeword == NULL || codeword->getRowNumber() == -1) { + continue; + } + ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(codeword->getRowNumber()))->GetAt(colume))->setValue(codeword->getValue()); + } + } + return barcodeMatrix; +} +FX_BOOL CBC_PDF417ScanningDecoder::isValidBarcodeColumn(CBC_DetectionResult* detectionResult, FX_INT32 barcodeColumn) +{ + return barcodeColumn >= 0 && barcodeColumn <= detectionResult->getBarcodeColumnCount() + 1; +} +FX_INT32 CBC_PDF417ScanningDecoder::getStartColumn(CBC_DetectionResult* detectionResult, FX_INT32 barcodeColumn, FX_INT32 imageRow, FX_BOOL leftToRight) +{ + FX_INT32 offset = leftToRight ? 1 : -1; + CBC_Codeword* codeword = NULL; + if (isValidBarcodeColumn(detectionResult, barcodeColumn - offset)) { + codeword = detectionResult->getDetectionResultColumn(barcodeColumn - offset)->getCodeword(imageRow); + } + if (codeword != NULL) { + return leftToRight ? codeword->getEndX() : codeword->getStartX(); + } + codeword = detectionResult->getDetectionResultColumn(barcodeColumn)->getCodewordNearby(imageRow); + if (codeword != NULL) { + return leftToRight ? codeword->getStartX() : codeword->getEndX(); + } + if (isValidBarcodeColumn(detectionResult, barcodeColumn - offset)) { + codeword = detectionResult->getDetectionResultColumn(barcodeColumn - offset)->getCodewordNearby(imageRow); + } + if (codeword != NULL) { + return leftToRight ? codeword->getEndX() : codeword->getStartX(); + } + FX_INT32 skippedColumns = 0; + while (isValidBarcodeColumn(detectionResult, barcodeColumn - offset)) { + barcodeColumn -= offset; + for (FX_INT32 i = 0; i < detectionResult->getDetectionResultColumn(barcodeColumn)->getCodewords()->GetSize(); i++) { + CBC_Codeword* previousRowCodeword = (CBC_Codeword*) detectionResult->getDetectionResultColumn(barcodeColumn)->getCodewords()->GetAt(i); + if (previousRowCodeword != NULL) { + return (leftToRight ? previousRowCodeword->getEndX() : previousRowCodeword->getStartX()) + + offset * skippedColumns * (previousRowCodeword->getEndX() - previousRowCodeword->getStartX()); + } + } + skippedColumns++; + } + return leftToRight ? detectionResult->getBoundingBox()->getMinX() : detectionResult->getBoundingBox()->getMaxX(); +} +CBC_Codeword* CBC_PDF417ScanningDecoder::detectCodeword(CBC_CommonBitMatrix* image, FX_INT32 minColumn, FX_INT32 maxColumn, FX_BOOL leftToRight, FX_INT32 startColumn, + FX_INT32 imageRow, FX_INT32 minCodewordWidth, FX_INT32 maxCodewordWidth) +{ + startColumn = adjustCodewordStartColumn(image, minColumn, maxColumn, leftToRight, startColumn, imageRow); + CFX_Int32Array* moduleBitCount = getModuleBitCount(image, minColumn, maxColumn, leftToRight, startColumn, imageRow); + if (moduleBitCount == NULL) { + return NULL; + } + FX_INT32 endColumn; + FX_INT32 codewordBitCount = CBC_PDF417Common::getBitCountSum(*moduleBitCount); + if (leftToRight) { + endColumn = startColumn + codewordBitCount; + } else { + for (FX_INT32 i = 0; i < moduleBitCount->GetSize() >> 1; i++) { + FX_INT32 tmpCount = moduleBitCount->GetAt(i); + moduleBitCount->SetAt(i, moduleBitCount->GetAt(moduleBitCount->GetSize() - 1 - i)); + moduleBitCount->SetAt(moduleBitCount->GetSize() - 1 - i, tmpCount); + } + endColumn = startColumn; + startColumn = endColumn - codewordBitCount; + } + FX_INT32 decodedValue = CBC_PDF417CodewordDecoder::getDecodedValue(*moduleBitCount); + FX_INT32 codeword = CBC_PDF417Common::getCodeword(decodedValue); + delete moduleBitCount; + if (codeword == -1) { + return NULL; + } + return FX_NEW CBC_Codeword(startColumn, endColumn, getCodewordBucketNumber(decodedValue), codeword); +} +CFX_Int32Array* CBC_PDF417ScanningDecoder::getModuleBitCount(CBC_CommonBitMatrix* image, FX_INT32 minColumn, FX_INT32 maxColumn, FX_BOOL leftToRight, FX_INT32 startColumn, FX_INT32 imageRow) +{ + FX_INT32 imageColumn = startColumn; + CFX_Int32Array* moduleBitCount = FX_NEW CFX_Int32Array; + moduleBitCount->SetSize(8); + FX_INT32 moduleNumber = 0; + FX_INT32 increment = leftToRight ? 1 : -1; + FX_BOOL previousPixelValue = leftToRight; + while (((leftToRight && imageColumn < maxColumn) || (!leftToRight && imageColumn >= minColumn)) && moduleNumber < moduleBitCount->GetSize()) { + if (image->Get(imageColumn, imageRow) == previousPixelValue) { + moduleBitCount->SetAt(moduleNumber, moduleBitCount->GetAt(moduleNumber) + 1); + imageColumn += increment; + } else { + moduleNumber++; + previousPixelValue = !previousPixelValue; + } + } + if (moduleNumber == moduleBitCount->GetSize() || (((leftToRight && imageColumn == maxColumn) || (!leftToRight && imageColumn == minColumn)) && moduleNumber == moduleBitCount->GetSize() - 1)) { + return moduleBitCount; + } + delete moduleBitCount; + return NULL; +} +FX_INT32 CBC_PDF417ScanningDecoder::getNumberOfECCodeWords(FX_INT32 barcodeECLevel) +{ + return 2 << barcodeECLevel; +} +FX_INT32 CBC_PDF417ScanningDecoder::adjustCodewordStartColumn(CBC_CommonBitMatrix* image, FX_INT32 minColumn, FX_INT32 maxColumn, FX_BOOL leftToRight, FX_INT32 codewordStartColumn, FX_INT32 imageRow) +{ + FX_INT32 correctedStartColumn = codewordStartColumn; + FX_INT32 increment = leftToRight ? -1 : 1; + for (FX_INT32 i = 0; i < 2; i++) { + FX_BOOL l = image->Get(correctedStartColumn, imageRow); + while (((leftToRight && correctedStartColumn >= minColumn) || (!leftToRight && correctedStartColumn < maxColumn)) && leftToRight == image->Get(correctedStartColumn, imageRow)) { + if (abs(codewordStartColumn - correctedStartColumn) > CODEWORD_SKEW_SIZE) { + return codewordStartColumn; + } + correctedStartColumn += increment; + } + increment = -increment; + leftToRight = !leftToRight; + } + return correctedStartColumn; +} +FX_BOOL CBC_PDF417ScanningDecoder::checkCodewordSkew(FX_INT32 codewordSize, FX_INT32 minCodewordWidth, FX_INT32 maxCodewordWidth) +{ + return minCodewordWidth - CODEWORD_SKEW_SIZE <= codewordSize && codewordSize <= maxCodewordWidth + CODEWORD_SKEW_SIZE; +} +CBC_CommonDecoderResult* CBC_PDF417ScanningDecoder::decodeCodewords(CFX_Int32Array &codewords, FX_INT32 ecLevel, CFX_Int32Array &erasures, FX_INT32 &e) +{ + if (codewords.GetSize() == 0) { + e = BCExceptionFormatInstance; + return NULL; + } + FX_INT32 numECCodewords = 1 << (ecLevel + 1); + FX_INT32 correctedErrorsCount = correctErrors(codewords, erasures, numECCodewords, e); + BC_EXCEPTION_CHECK_ReturnValue(e , NULL); + verifyCodewordCount(codewords, numECCodewords, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CFX_ByteString bytestring; + CBC_CommonDecoderResult* decoderResult = CBC_DecodedBitStreamPaser::decode(codewords, bytestring.FormatInteger(ecLevel), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return decoderResult; +} +FX_INT32 CBC_PDF417ScanningDecoder::correctErrors(CFX_Int32Array &codewords, CFX_Int32Array &erasures, FX_INT32 numECCodewords, FX_INT32 &e) +{ + if ((erasures.GetSize() != 0 && erasures.GetSize() > (numECCodewords / 2 + MAX_ERRORS)) || numECCodewords < 0 || numECCodewords > MAX_EC_CODEWORDS) { + e = BCExceptionChecksumInstance; + return -1; + } + FX_INT32 result = CBC_PDF417ECErrorCorrection::decode(codewords, numECCodewords, erasures, e); + BC_EXCEPTION_CHECK_ReturnValue(e, -1); + return result; +} +void CBC_PDF417ScanningDecoder::verifyCodewordCount(CFX_Int32Array &codewords, FX_INT32 numECCodewords, FX_INT32 &e) +{ + if (codewords.GetSize() < 4) { + e = BCExceptionFormatInstance; + return; + } + FX_INT32 numberOfCodewords = codewords.GetAt(0); + if (numberOfCodewords > codewords.GetSize()) { + e = BCExceptionFormatInstance; + return; + } + if (numberOfCodewords == 0) { + if (numECCodewords < codewords.GetSize()) { + codewords[0] = codewords.GetSize() - numECCodewords; + } else { + e = BCExceptionFormatInstance; + return; + } + } +} +CFX_Int32Array* CBC_PDF417ScanningDecoder::getBitCountForCodeword(FX_INT32 codeword) +{ + CFX_Int32Array* result = FX_NEW CFX_Int32Array; + result->SetSize(8); + FX_INT32 previousValue = 0; + FX_INT32 i = result->GetSize() - 1; + while (TRUE) { + if ((codeword & 0x1) != previousValue) { + previousValue = codeword & 0x1; + i--; + if (i < 0) { + break; + } + } + result->SetAt(i, result->GetAt(i) + 1); + codeword >>= 1; + } + return result; +} +FX_INT32 CBC_PDF417ScanningDecoder::getCodewordBucketNumber(FX_INT32 codeword) +{ + CFX_Int32Array* array = getBitCountForCodeword(codeword); + FX_INT32 result = getCodewordBucketNumber(*array); + delete array; + return result; +} +FX_INT32 CBC_PDF417ScanningDecoder::getCodewordBucketNumber(CFX_Int32Array& moduleBitCount) +{ + return (moduleBitCount.GetAt(0) - moduleBitCount.GetAt(2) + moduleBitCount.GetAt(4) - moduleBitCount.GetAt(6) + 9) % 9; +} diff --git a/xfa/src/fxbarcode/src/BC_PDF417Writer.cpp b/xfa/src/fxbarcode/src/BC_PDF417Writer.cpp new file mode 100644 index 0000000000..319279c92b --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_PDF417Writer.cpp @@ -0,0 +1,110 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_TwoDimWriter.h" +#include "include/BC_PDF417Compaction.h" +#include "include/BC_PDF417.h" +#include "include/BC_PDF417BarcodeMatrix.h" +#include "include/BC_CommonBitArray.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_PDF417Writer.h" +CBC_PDF417Writer::CBC_PDF417Writer() +{ + m_bFixedSize = FALSE; +} +CBC_PDF417Writer::~CBC_PDF417Writer() +{ + m_bTruncated = TRUE; +} +FX_BOOL CBC_PDF417Writer:: SetErrorCorrectionLevel(FX_INT32 level) +{ + if (level < 0 || level > 8) { + return FALSE; + } + m_iCorrectLevel = level; + return TRUE; +} +void CBC_PDF417Writer::SetTruncated(FX_BOOL truncated) +{ + m_bTruncated = truncated; +} +FX_BYTE* CBC_PDF417Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) +{ + if ( format != BCFORMAT_PDF_417) { + return NULL; + } + CFX_WideString encodeContents = contents.UTF8Decode(); + return Encode(encodeContents, outWidth, outHeight, e ); +} +FX_BYTE* CBC_PDF417Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) +{ + return NULL; +} +FX_BYTE* CBC_PDF417Writer::Encode(const CFX_WideString &contents, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) +{ + CBC_PDF417 encoder; + FX_INT32 col = (m_Width / m_ModuleWidth - 69) / 17; + FX_INT32 row = m_Height / (m_ModuleWidth * 20); + if (row >= 3 && row <= 90 && col >= 1 && col <= 30) { + encoder.setDimensions(col, col, row, row); + } else if (col >= 1 && col <= 30) { + encoder.setDimensions(col, col, 90, 3); + } else if (row >= 3 && row <= 90) { + encoder.setDimensions(30, 1, row, row); + } + encoder.generateBarcodeLogic(contents, m_iCorrectLevel, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + FX_INT32 lineThickness = 2; + FX_INT32 aspectRatio = 4; + CBC_BarcodeMatrix* barcodeMatrix = encoder.getBarcodeMatrix(); + CFX_ByteArray originalScale; + originalScale.Copy(barcodeMatrix->getScaledMatrix(lineThickness, aspectRatio * lineThickness)); + FX_INT32 width = outWidth; + FX_INT32 height = outHeight; + outWidth = barcodeMatrix->getWidth(); + outHeight = barcodeMatrix->getHeight(); + FX_BOOL rotated = FALSE; + if ((height > width) ^ (outWidth < outHeight)) { + rotateArray(originalScale, outHeight, outWidth); + rotated = TRUE; + FX_INT32 temp = outHeight; + outHeight = outWidth; + outWidth = temp; + } + FX_INT32 scaleX = width / outWidth; + FX_INT32 scaleY = height / outHeight; + FX_INT32 scale; + if (scaleX < scaleY) { + scale = scaleX; + } else { + scale = scaleY; + } + if (scale > 1) { + originalScale.RemoveAll(); + originalScale.Copy(barcodeMatrix->getScaledMatrix(scale * lineThickness, scale * aspectRatio * lineThickness)); + if (rotated) { + rotateArray(originalScale, outHeight, outWidth); + FX_INT32 temp = outHeight; + outHeight = outWidth; + outWidth = temp; + } + } + FX_BYTE* result = (FX_BYTE*)FX_Alloc(FX_BYTE, outHeight * outWidth); + FXSYS_memcpy32(result, originalScale.GetData(), outHeight * outWidth); + return result; +} +void CBC_PDF417Writer::rotateArray(CFX_ByteArray& bitarray, FX_INT32 height, FX_INT32 width) +{ + CFX_ByteArray temp; + temp.Copy(bitarray); + for (FX_INT32 ii = 0; ii < height; ii++) { + FX_INT32 inverseii = height - ii - 1; + for (FX_INT32 jj = 0; jj < width; jj++) { + bitarray[jj * height + inverseii] = temp[ii * width + jj]; + } + } +} diff --git a/xfa/src/fxbarcode/src/BC_QRAlignmentPattern.cpp b/xfa/src/fxbarcode/src/BC_QRAlignmentPattern.cpp new file mode 100644 index 0000000000..25948cb12b --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_QRAlignmentPattern.cpp @@ -0,0 +1,36 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_ResultPoint.h" +#include "include/BC_QRAlignmentPattern.h" +CBC_QRAlignmentPattern::CBC_QRAlignmentPattern(FX_FLOAT posX, FX_FLOAT posY, FX_FLOAT estimateModuleSize): + CBC_ResultPoint(posX, posY), m_moduleSize(estimateModuleSize) +{ +} +CBC_QRAlignmentPattern::~CBC_QRAlignmentPattern() +{ +} +FX_FLOAT CBC_QRAlignmentPattern::GetX() +{ + return m_x; +} +FX_FLOAT CBC_QRAlignmentPattern::GetY() +{ + return m_y; +} +FX_BOOL CBC_QRAlignmentPattern::AboutEquals(FX_FLOAT moduleSize, FX_FLOAT i, FX_FLOAT j) +{ + if ((FXSYS_fabs(i - GetY()) <= moduleSize) && (FXSYS_fabs(j - GetX()) <= moduleSize)) { + FX_FLOAT moduleSizeDiff = FXSYS_fabs(moduleSize - m_moduleSize); + return (moduleSizeDiff <= 1.0f) || (moduleSizeDiff / m_moduleSize <= 1.0f); + } + return FALSE; +} +CBC_QRAlignmentPattern *CBC_QRAlignmentPattern::Clone() +{ + return FX_NEW CBC_QRAlignmentPattern(m_x, m_y, m_moduleSize); +} diff --git a/xfa/src/fxbarcode/src/BC_QRAlignmentPatternFinder.cpp b/xfa/src/fxbarcode/src/BC_QRAlignmentPatternFinder.cpp new file mode 100644 index 0000000000..0adabd018e --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_QRAlignmentPatternFinder.cpp @@ -0,0 +1,171 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_ResultPoint.h" +#include "include/BC_QRAlignmentPattern.h" +#include "include/BC_QRAlignmentPatternFinder.h" +#include "include/BC_CommonBitMatrix.h" +CBC_QRAlignmentPatternFinder::CBC_QRAlignmentPatternFinder(CBC_CommonBitMatrix *image, + FX_INT32 startX, + FX_INT32 startY, + FX_INT32 width, + FX_INT32 height, + FX_FLOAT moduleSize): m_image(image), + m_startX(startX), + m_startY(startY), + m_width(width), + m_height(height), + m_moduleSize(moduleSize) + +{ + m_crossCheckStateCount.SetSize(3); +} +CBC_QRAlignmentPatternFinder::~CBC_QRAlignmentPatternFinder() +{ + for (FX_INT32 i = 0; i < m_possibleCenters.GetSize(); i++) { + delete (CBC_QRAlignmentPattern*)m_possibleCenters[i]; + } + m_possibleCenters.RemoveAll(); +} +CBC_QRAlignmentPattern *CBC_QRAlignmentPatternFinder::Find(FX_INT32 &e) +{ + FX_INT32 startX = m_startX; + FX_INT32 height = m_height; + FX_INT32 maxJ = startX + m_width; + FX_INT32 middleI = m_startY + (height >> 1); + CFX_Int32Array stateCount; + stateCount.SetSize(3); + for (FX_INT32 iGen = 0; iGen < height; iGen++) { + FX_INT32 i = middleI + ((iGen & 0x01) == 0 ? ((iGen + 1) >> 1) : -((iGen + 1) >> 1)); + stateCount[0] = 0; + stateCount[1] = 0; + stateCount[2] = 0; + FX_INT32 j = startX; + while (j < maxJ && !m_image->Get(j, i)) { + j++; + } + FX_INT32 currentState = 0; + while (j < maxJ) { + if (m_image->Get(j, i)) { + if (currentState == 1) { + stateCount[currentState]++; + } else { + if (currentState == 2) { + if (FoundPatternCross(stateCount)) { + CBC_QRAlignmentPattern *confirmed = HandlePossibleCenter(stateCount, i, j); + if (confirmed != NULL) { + return confirmed; + } + } + stateCount[0] = stateCount[2]; + stateCount[1] = 1; + stateCount[2] = 0; + currentState = 1; + } else { + stateCount[++currentState]++; + } + } + } else { + if (currentState == 1) { + currentState++; + } + stateCount[currentState]++; + } + j++; + } + if (FoundPatternCross(stateCount)) { + CBC_QRAlignmentPattern *confirmed = HandlePossibleCenter(stateCount, i, maxJ); + if (confirmed != NULL) { + return confirmed; + } + } + } + if (m_possibleCenters.GetSize() != 0) { + return ((CBC_QRAlignmentPattern*) (m_possibleCenters[0]) )->Clone(); + } + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return NULL; +} +FX_FLOAT CBC_QRAlignmentPatternFinder::CenterFromEnd(const CFX_Int32Array &stateCount, FX_INT32 end) +{ + return (FX_FLOAT) (end - stateCount[2]) - stateCount[1] / 2.0f; +} +FX_BOOL CBC_QRAlignmentPatternFinder::FoundPatternCross(const CFX_Int32Array &stateCount) +{ + FX_FLOAT moduleSize = m_moduleSize; + FX_FLOAT maxVariance = moduleSize / 2.0f; + for (FX_INT32 i = 0; i < 3; i++) { + if (fabs(moduleSize - stateCount[i]) >= maxVariance) { + return false; + } + } + return TRUE; +} +FX_FLOAT CBC_QRAlignmentPatternFinder::CrossCheckVertical(FX_INT32 startI, FX_INT32 centerJ, FX_INT32 maxCount, FX_INT32 originalStateCountTotal) +{ + CBC_CommonBitMatrix *image = m_image; + FX_INT32 maxI = m_image->GetHeight(); + CFX_Int32Array stateCount; + stateCount.Copy(m_crossCheckStateCount); + stateCount[0] = 0; + stateCount[1] = 0; + stateCount[2] = 0; + FX_INT32 i = startI; + while (i >= 0 && m_image->Get(centerJ, i) && stateCount[1] <= maxCount) { + stateCount[1]++; + i--; + } + if (i < 0 || stateCount[1] > maxCount) { + return FXSYS_nan(); + } + while (i >= 0 && !m_image->Get(centerJ, i) && stateCount[0] <= maxCount) { + stateCount[0]++; + i--; + } + if (stateCount[0] > maxCount) { + return FXSYS_nan(); + } + i = startI + 1; + while (i < maxI && m_image->Get(centerJ, i) && stateCount[1] <= maxCount) { + stateCount[1]++; + i++; + } + if (i == maxI || stateCount[1] > maxCount) { + return FXSYS_nan(); + } + while (i < maxI && !m_image->Get(centerJ, i) && stateCount[2] <= maxCount) { + stateCount[2]++; + i++; + } + if (stateCount[2] > maxCount) { + return FXSYS_nan(); + } + FX_INT32 stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2]; + if (5 * abs(stateCountTotal - originalStateCountTotal) >= originalStateCountTotal) { + return FXSYS_nan(); + } + return FoundPatternCross(stateCount) ? CenterFromEnd(stateCount, i) : FXSYS_nan(); +} +CBC_QRAlignmentPattern *CBC_QRAlignmentPatternFinder::HandlePossibleCenter(const CFX_Int32Array &stateCount, FX_INT32 i, FX_INT32 j) +{ + FX_INT32 stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2]; + FX_FLOAT centerJ = CenterFromEnd(stateCount, j); + FX_FLOAT centerI = CrossCheckVertical(i, (FX_INT32) centerJ, 2 * stateCount[1], stateCountTotal); + if (!FXSYS_isnan(centerI)) { + FX_FLOAT estimatedModuleSize = (FX_FLOAT) (stateCount[0] + stateCount[1] + stateCount[2]) / 3.0f; + FX_INT32 max = m_possibleCenters.GetSize(); + for (FX_INT32 index = 0; index < max; index++) { + CBC_QRAlignmentPattern *center = (CBC_QRAlignmentPattern *)(m_possibleCenters[index]); + if (center->AboutEquals(estimatedModuleSize, centerI, centerJ)) { + return FX_NEW CBC_QRAlignmentPattern(centerJ, centerI, estimatedModuleSize); + } + } + m_possibleCenters.Add(FX_NEW CBC_QRAlignmentPattern(centerJ, centerI, estimatedModuleSize)); + } + return NULL; +} diff --git a/xfa/src/fxbarcode/src/BC_QRBitMatrixParser.cpp b/xfa/src/fxbarcode/src/BC_QRBitMatrixParser.cpp new file mode 100644 index 0000000000..2bfb000201 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_QRBitMatrixParser.cpp @@ -0,0 +1,169 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_QRCoderVersion.h" +#include "include/BC_QRCoderFormatInformation.h" +#include "include/BC_QRDataMask.h" +#include "include/BC_QRBitMatrixParser.h" +CBC_QRBitMatrixParser::CBC_QRBitMatrixParser() +{ +} +void CBC_QRBitMatrixParser::Init(CBC_CommonBitMatrix *bitMatrix, FX_INT32 &e) +{ + m_dimension = bitMatrix->GetDimension(e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + m_tempBitMatrix = bitMatrix; + if(m_dimension < 21 || (m_dimension & 0x03) != 1) { + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + m_bitMatrix = m_tempBitMatrix; + m_parsedFormatInfo = NULL; + m_version = NULL; +} +CBC_QRBitMatrixParser::~CBC_QRBitMatrixParser() +{ + if(m_parsedFormatInfo != NULL) { + delete m_parsedFormatInfo; + m_parsedFormatInfo = NULL; + } + m_version = NULL; +} +CBC_QRCoderFormatInformation* CBC_QRBitMatrixParser::ReadFormatInformation(FX_INT32 &e) +{ + if(m_parsedFormatInfo != NULL) { + return m_parsedFormatInfo; + } + FX_INT32 formatInfoBits = 0; + FX_INT32 j; + for( j = 0; j < 6; j++) { + formatInfoBits = CopyBit(8, j, formatInfoBits); + } + formatInfoBits = CopyBit(8, 7, formatInfoBits); + formatInfoBits = CopyBit(8, 8, formatInfoBits); + formatInfoBits = CopyBit(7, 8, formatInfoBits); + for(FX_INT32 i = 5; i >= 0; i--) { + formatInfoBits = CopyBit(i, 8, formatInfoBits); + } + m_parsedFormatInfo = CBC_QRCoderFormatInformation::DecodeFormatInformation(formatInfoBits); + if(m_parsedFormatInfo != NULL) { + return m_parsedFormatInfo; + } + FX_INT32 dimension = m_bitMatrix->GetDimension(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + formatInfoBits = 0; + FX_INT32 iMin = dimension - 8; + for(j = dimension - 1; j >= iMin; j--) { + formatInfoBits = CopyBit(j, 8, formatInfoBits); + } + for(FX_INT32 k = dimension - 7; k < dimension; k++) { + formatInfoBits = CopyBit(8, k , formatInfoBits); + } + m_parsedFormatInfo = CBC_QRCoderFormatInformation::DecodeFormatInformation(formatInfoBits); + if(m_parsedFormatInfo != NULL) { + return m_parsedFormatInfo; + } + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return NULL; +} +CBC_QRCoderVersion* CBC_QRBitMatrixParser::ReadVersion(FX_INT32 &e) +{ + if(m_version != NULL) { + return m_version; + } + FX_INT32 dimension = m_bitMatrix->GetDimension(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + FX_INT32 provisionVersion = (dimension - 17) >> 2; + if(provisionVersion <= 6) { + CBC_QRCoderVersion* qrv = CBC_QRCoderVersion::GetVersionForNumber(provisionVersion, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return qrv; + } + FX_INT32 versionBits = 0; + for (FX_INT32 i = 5; i >= 0; i--) { + FX_INT32 jMin = dimension - 11; + for (FX_INT32 j = dimension - 9; j >= jMin; j--) { + versionBits = CopyBit(i, j, versionBits); + } + } + m_version = CBC_QRCoderVersion::DecodeVersionInformation(versionBits, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + if (m_version != NULL && m_version->GetDimensionForVersion() == dimension) { + return m_version; + } + versionBits = 0; + for (FX_INT32 j = 5; j >= 0; j--) { + FX_INT32 iMin = dimension - 11; + for (FX_INT32 i = dimension - 9; i >= iMin; i--) { + versionBits = CopyBit(i, j, versionBits); + } + } + m_version = CBC_QRCoderVersion::DecodeVersionInformation(versionBits, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + if (m_version != NULL && m_version->GetDimensionForVersion() == dimension) { + return m_version; + } + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return NULL; +} +FX_INT32 CBC_QRBitMatrixParser::CopyBit(FX_INT32 i, FX_INT32 j, FX_INT32 versionBits) +{ + return m_bitMatrix->Get(j, i) ? (versionBits << 1) | 0x1 : versionBits << 1; +} +CFX_ByteArray* CBC_QRBitMatrixParser::ReadCodewords(FX_INT32 &e) +{ + CBC_QRCoderFormatInformation *formatInfo = ReadFormatInformation(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL) + CBC_QRCoderVersion *version = ReadVersion(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_QRDataMask *dataMask = CBC_QRDataMask::ForReference((FX_INT32)(formatInfo->GetDataMask()), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + FX_INT32 dimension = m_bitMatrix->GetDimension(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + dataMask->UnmaskBitMatirx(m_bitMatrix, dimension); + CBC_CommonBitMatrix* cbm = version->BuildFunctionPattern(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr functionPattern(cbm); + FX_BOOL readingUp = TRUE; + CFX_ByteArray * temp = FX_NEW CFX_ByteArray; + temp->SetSize(version->GetTotalCodeWords()); + CBC_AutoPtr result(temp); + FX_INT32 resultOffset = 0; + FX_INT32 currentByte = 0; + FX_INT32 bitsRead = 0; + for(FX_INT32 j = dimension - 1; j > 0; j -= 2) { + if(j == 6) { + j--; + } + for(FX_INT32 count = 0; count < dimension; count++) { + FX_INT32 i = readingUp ? dimension - 1 - count : count; + for(FX_INT32 col = 0; col < 2; col++) { + if(!functionPattern->Get(j - col, i)) { + bitsRead++; + currentByte <<= 1; + if(m_bitMatrix->Get(j - col, i)) { + currentByte |= 1; + } + if(bitsRead == 8) { + (*result)[resultOffset++] = (FX_BYTE) currentByte; + bitsRead = 0; + currentByte = 0; + } + } + } + } + readingUp ^= TRUE; + } + if(resultOffset != version->GetTotalCodeWords()) { + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + return result.release(); +} diff --git a/xfa/src/fxbarcode/src/BC_QRCodeReader.cpp b/xfa/src/fxbarcode/src/BC_QRCodeReader.cpp new file mode 100644 index 0000000000..798d549271 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_QRCodeReader.cpp @@ -0,0 +1,95 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_Reader.h" +#include "include/BC_QRCodeReader.h" +#include "include/BC_LuminanceSource.h" +#include "include/BC_BufferedImageLuminanceSource.h" +#include "include/BC_Binarizer.h" +#include "include/BC_GlobalHistogramBinarizer.h" +#include "include/BC_BinaryBitmap.h" +#include "include/BC_QRCodeReader.h" +#include "include/BC_QRCoderMode.h" +#include "include/BC_ResultPoint.h" +#include "include/BC_QRCoderDecoder.h" +#include "include/BC_QRDetector.h" +#include "include/BC_QRDetectorResult.h" +#include "include/BC_QRCoderErrorCorrectionLevel.h" +#include "include/BC_QRDataMask.h" +#include "include/BC_ReedSolomonGF256.h" +#include "include/BC_QRCoderVersion.h" +#include "include/BC_CommonDecoderResult.h" +#include "include/BC_QRCodeReader.h" +CBC_QRCodeReader::CBC_QRCodeReader(): m_decoder(NULL) +{ +} +void CBC_QRCodeReader::Init() +{ + m_decoder = FX_NEW CBC_QRCoderDecoder; + m_decoder->Init(); +} +CBC_QRCodeReader::~CBC_QRCodeReader() +{ + if(m_decoder != NULL) { + delete m_decoder; + } + m_decoder = NULL; +} +CFX_ByteString CBC_QRCodeReader::Decode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e) +{ + CBC_CommonBitMatrix *matrix = image->GetMatrix(e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + CBC_QRDetector detector(matrix); + CBC_QRDetectorResult* qdr = detector.Detect(hints, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + CBC_AutoPtr detectorResult(qdr); + CBC_CommonDecoderResult* qdr2 = m_decoder->Decode(detectorResult->GetBits(), 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + CBC_AutoPtr decodeResult(qdr2); + return (decodeResult->GetText()); +} +CFX_ByteString CBC_QRCodeReader::Decode(const CFX_WideString &filename, FX_INT32 hints, FX_INT32 byteModeDecode, FX_INT32 &e) +{ + CBC_BufferedImageLuminanceSource source(filename); + source.Init(e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + CBC_GlobalHistogramBinarizer binarizer(&source); + CBC_BinaryBitmap bitmap(&binarizer); + CFX_ByteString bs = Decode(&bitmap, hints, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + return bs; +} +CFX_ByteString CBC_QRCodeReader::Decode(CFX_DIBitmap *pBitmap, FX_INT32 hints, FX_INT32 byteModeDecode, FX_INT32 &e) +{ + CBC_BufferedImageLuminanceSource source(pBitmap); + CBC_GlobalHistogramBinarizer binarizer(&source); + CBC_BinaryBitmap bitmap(&binarizer); + CFX_ByteString bs = Decode(&bitmap, hints, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + return bs; +} +CFX_ByteString CBC_QRCodeReader::Decode(CBC_BinaryBitmap *image, FX_INT32 &e) +{ + CFX_ByteString bs = Decode(image, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + return bs; +} +void CBC_QRCodeReader::ReleaseAll() +{ + if(CBC_ReedSolomonGF256 ::QRCodeFild) { + delete CBC_ReedSolomonGF256 ::QRCodeFild; + CBC_ReedSolomonGF256 ::QRCodeFild = NULL; + } + if(CBC_ReedSolomonGF256 ::DataMatrixField) { + delete CBC_ReedSolomonGF256 ::DataMatrixField; + CBC_ReedSolomonGF256 ::DataMatrixField = NULL; + } + CBC_QRCoderMode::Destroy(); + CBC_QRCoderErrorCorrectionLevel::Destroy(); + CBC_QRDataMask::Destroy(); + CBC_QRCoderVersion::Destroy(); +} diff --git a/xfa/src/fxbarcode/src/BC_QRCodeWriter.cpp b/xfa/src/fxbarcode/src/BC_QRCodeWriter.cpp new file mode 100644 index 0000000000..d12e08c34a --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_QRCodeWriter.cpp @@ -0,0 +1,87 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_TwoDimWriter.h" +#include "include/BC_Reader.h" +#include "include/BC_QRCodeWriter.h" +#include "include/BC_QRCoderEncoder.h" +#include "include/BC_QRCoder.h" +#include "include/BC_CommonByteMatrix.h" +#include "include/BC_QRCodeReader.h" +#include "include/BC_QRCoderErrorCorrectionLevel.h" +CBC_QRCodeWriter::CBC_QRCodeWriter() +{ + m_bFixedSize = TRUE; + m_iCorrectLevel = 1; + m_iVersion = 0; +} +CBC_QRCodeWriter::~CBC_QRCodeWriter() +{ +} +void CBC_QRCodeWriter::ReleaseAll() +{ + CBC_QRCodeReader::ReleaseAll(); +} +FX_BOOL CBC_QRCodeWriter::SetVersion(FX_INT32 version) +{ + if (version < 0 || version > 40) { + return FALSE; + } + m_iVersion = version; + return TRUE; +} +FX_BOOL CBC_QRCodeWriter::SetErrorCorrectionLevel(FX_INT32 level) +{ + if (level < 0 || level > 3) { + return FALSE; + } + m_iCorrectLevel = level; + return TRUE; +} +FX_BYTE* CBC_QRCodeWriter::Encode(const CFX_WideString& contents, FX_INT32 ecLevel, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) +{ + CBC_QRCoderErrorCorrectionLevel *ec = NULL; + switch(ecLevel) { + case 0: + ec = CBC_QRCoderErrorCorrectionLevel::L; + break; + case 1: + ec = CBC_QRCoderErrorCorrectionLevel::M; + break; + case 2: + ec = CBC_QRCoderErrorCorrectionLevel::Q; + break; + case 3: + ec = CBC_QRCoderErrorCorrectionLevel::H; + break; + default: { + e = BCExceptionUnSupportEclevel; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + } + CBC_QRCoder qr; + if (m_iVersion > 0 && m_iVersion < 41) { + CFX_ByteString byteStr = contents.UTF8Encode(); + CBC_QRCoderEncoder::Encode(byteStr, ec, &qr, e, m_iVersion); + } else { + CBC_QRCoderEncoder::Encode(contents, ec, &qr, e); + } + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + outWidth = qr.GetMatrixWidth(); + outHeight = qr.GetMatrixWidth(); + FX_BYTE* result = FX_Alloc(FX_BYTE, outWidth * outWidth); + FXSYS_memcpy32(result, qr.GetMatrix()->GetArray(), outWidth * outHeight); + return result; +} +FX_BYTE *CBC_QRCodeWriter::Encode(const CFX_ByteString& contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) +{ + return NULL; +} +FX_BYTE* CBC_QRCodeWriter::Encode(const CFX_ByteString& contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) +{ + return NULL; +} diff --git a/xfa/src/fxbarcode/src/BC_QRCoder.cpp b/xfa/src/fxbarcode/src/BC_QRCoder.cpp new file mode 100644 index 0000000000..51429202c6 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_QRCoder.cpp @@ -0,0 +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 "barcode.h" +#include "include/BC_QRCoderErrorCorrectionLevel.h" +#include "include/BC_QRCoderMode.h" +#include "include/BC_CommonByteMatrix.h" +#include "include/BC_QRCoder.h" +CBC_QRCoder::CBC_QRCoder() +{ + m_mode = NULL; + m_ecLevel = NULL; + m_version = -1; + m_matrixWidth = -1; + m_maskPattern = -1; + m_numTotalBytes = -1; + m_numDataBytes = -1; + m_numECBytes = -1; + m_numRSBlocks = -1; + m_matrix = NULL; +} +CBC_QRCoder::~CBC_QRCoder() +{ + if(m_matrix != NULL) { + delete m_matrix; + m_matrix = NULL; + } + m_mode = NULL; + m_ecLevel = NULL; + m_version = -1; + m_matrixWidth = -1; + m_maskPattern = -1; + m_numTotalBytes = -1; + m_numDataBytes = -1; + m_numECBytes = -1; + m_numRSBlocks = -1; +} +CBC_QRCoderMode* CBC_QRCoder::GetMode() +{ + return m_mode; +} +CBC_QRCoderErrorCorrectionLevel* CBC_QRCoder::GetECLevel() +{ + return m_ecLevel; +} +FX_INT32 CBC_QRCoder::GetVersion() +{ + return m_version; +} +FX_INT32 CBC_QRCoder::GetMatrixWidth() +{ + return m_matrixWidth; +} +FX_INT32 CBC_QRCoder::GetMaskPattern() +{ + return m_maskPattern; +} +FX_INT32 CBC_QRCoder::GetNumTotalBytes() +{ + return m_numTotalBytes; +} +FX_INT32 CBC_QRCoder::GetNumDataBytes() +{ + return m_numDataBytes; +} +FX_INT32 CBC_QRCoder::GetNumECBytes() +{ + return m_numECBytes; +} +FX_INT32 CBC_QRCoder::GetNumRSBlocks() +{ + return m_numRSBlocks; +} +CBC_CommonByteMatrix* CBC_QRCoder::GetMatrix() +{ + return m_matrix; +} +FX_INT32 CBC_QRCoder::At(FX_INT32 x, FX_INT32 y, FX_INT32 &e) +{ + FX_INT32 value = m_matrix->Get(x, y); + if(!(value == 0 || value == 1)) { + e = BCExceptionValueMustBeEither0or1; + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + } + return value; +} +FX_BOOL CBC_QRCoder::IsValid() +{ + return + m_mode != NULL && + m_ecLevel != NULL && + m_version != -1 && + m_matrixWidth != -1 && + m_maskPattern != -1 && + m_numTotalBytes != -1 && + m_numDataBytes != -1 && + m_numECBytes != -1 && + m_numRSBlocks != -1 && + IsValidMaskPattern(m_maskPattern) && + m_numTotalBytes == m_numDataBytes + m_numECBytes && + m_matrix != NULL && + m_matrixWidth == m_matrix->GetWidth() && + m_matrix->GetWidth() == m_matrix->GetHeight(); +} +void CBC_QRCoder::SetMode(CBC_QRCoderMode* value) +{ + m_mode = value; +} +void CBC_QRCoder::SetECLevel(CBC_QRCoderErrorCorrectionLevel* ecLevel) +{ + m_ecLevel = ecLevel; +} +void CBC_QRCoder::SetVersion(FX_INT32 version) +{ + m_version = version; +} +void CBC_QRCoder::SetMatrixWidth(FX_INT32 width) +{ + m_matrixWidth = width; +} +void CBC_QRCoder::SetMaskPattern(FX_INT32 pattern) +{ + m_maskPattern = pattern; +} +void CBC_QRCoder::SetNumDataBytes(FX_INT32 bytes) +{ + m_numDataBytes = bytes; +} +void CBC_QRCoder::SetNumTotalBytes(FX_INT32 value) +{ + m_numTotalBytes = value; +} +void CBC_QRCoder::SetNumRSBlocks(FX_INT32 block) +{ + m_numRSBlocks = block; +} +void CBC_QRCoder::SetNumECBytes(FX_INT32 value) +{ + m_numECBytes = value; +} +FX_BOOL CBC_QRCoder::IsValidMaskPattern(FX_INT32 maskPattern) +{ + return maskPattern >= 0 && maskPattern < NUM_MASK_PATTERNS; +} +void CBC_QRCoder::SetMatrix(CBC_CommonByteMatrix* value) +{ + m_matrix = value; +} +const FX_INT32 CBC_QRCoder::NUM_MASK_PATTERNS = 8; diff --git a/xfa/src/fxbarcode/src/BC_QRCoderBitVector.cpp b/xfa/src/fxbarcode/src/BC_QRCoderBitVector.cpp new file mode 100644 index 0000000000..26be81cc9b --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_QRCoderBitVector.cpp @@ -0,0 +1,125 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_QRCoderBitVector.h" +CBC_QRCoderBitVector::CBC_QRCoderBitVector() +{ + m_sizeInBits = 0; + m_size = 32; +} +void CBC_QRCoderBitVector::Init() +{ + m_array = FX_Alloc(FX_BYTE, m_size); +} +CBC_QRCoderBitVector::~CBC_QRCoderBitVector() +{ + if(m_array != NULL) { + FX_Free(m_array); + } + m_size = 0; + m_sizeInBits = 0; +} +void CBC_QRCoderBitVector::Clear() +{ + if(m_array != NULL) { + FX_Free(m_array); + m_array = NULL; + } + m_sizeInBits = 0; + m_size = 32; + m_array = FX_Alloc(FX_BYTE, m_size); +} +FX_INT32 CBC_QRCoderBitVector::At(FX_INT32 index, FX_INT32 &e) +{ + if(index < 0 || index >= m_sizeInBits) { + e = BCExceptionBadIndexException; + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + } + FX_INT32 value = m_array[index >> 3] & 0xff; + return (value >> (7 - (index & 0x7))) & 1; +} +FX_INT32 CBC_QRCoderBitVector::sizeInBytes() +{ + return (m_sizeInBits + 7) >> 3; +} +FX_INT32 CBC_QRCoderBitVector::Size() +{ + return m_sizeInBits; +} +void CBC_QRCoderBitVector::AppendBit(FX_INT32 bit, FX_INT32 &e) +{ + if(!(bit == 0 || bit == 1)) { + e = BCExceptionBadValueException; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + FX_INT32 numBitsInLastByte = m_sizeInBits & 0x7; + if(numBitsInLastByte == 0) { + AppendByte(0); + m_sizeInBits -= 8; + } + m_array[m_sizeInBits >> 3] |= (bit << (7 - numBitsInLastByte)); + ++m_sizeInBits; +} +void CBC_QRCoderBitVector::AppendBits(FX_INT32 value, FX_INT32 numBits, FX_INT32 &e) +{ + if (numBits < 0 || numBits > 32) { + e = BCExceptionBadNumBitsException; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + FX_INT32 numBitsLeft = numBits; + while (numBitsLeft > 0) { + if ((m_sizeInBits & 0x7) == 0 && numBitsLeft >= 8) { + FX_INT32 newByte = (value >> (numBitsLeft - 8)) & 0xff; + AppendByte(newByte); + numBitsLeft -= 8; + } else { + FX_INT32 bit = (value >> (numBitsLeft - 1)) & 1; + AppendBit(bit, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + --numBitsLeft; + } + } +} +void CBC_QRCoderBitVector::AppendBitVector(CBC_QRCoderBitVector *bits, FX_INT32 &e) +{ + FX_INT32 size = bits->Size(); + for(FX_INT32 i = 0; i < size; i++) { + FX_INT32 num = bits->At(i, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + AppendBit(num, e); + BC_EXCEPTION_CHECK_ReturnVoid(e) + } +} +void CBC_QRCoderBitVector::XOR(CBC_QRCoderBitVector *other, FX_INT32 &e) +{ + if(m_sizeInBits != other->Size()) { + e = BCExceptioncanNotOperatexorOperator; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + FX_INT32 sizeInBytes = (m_sizeInBits + 7) >> 3; + for(FX_INT32 i = 0; i < sizeInBytes; ++i) { + m_array[i] ^= (other->GetArray())[i]; + } +} +FX_BYTE* CBC_QRCoderBitVector::GetArray() +{ + return m_array; +} +void CBC_QRCoderBitVector::AppendByte(FX_INT32 value) +{ + if((m_sizeInBits >> 3) == m_size) { + FX_BYTE* newArray = FX_Alloc(FX_BYTE, m_size << 1); + FXSYS_memcpy32(newArray, m_array, m_size); + if(m_array != NULL) { + FX_Free(m_array); + } + m_array = newArray; + m_size = m_size << 1; + } + m_array[m_sizeInBits >> 3] = (FX_BYTE) value; + m_sizeInBits += 8; +} diff --git a/xfa/src/fxbarcode/src/BC_QRCoderBlockPair.cpp b/xfa/src/fxbarcode/src/BC_QRCoderBlockPair.cpp new file mode 100644 index 0000000000..751ff0a85d --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_QRCoderBlockPair.cpp @@ -0,0 +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 + +#include "barcode.h" +#include "include/BC_CommonByteArray.h" +#include "include/BC_QRCoderBlockPair.h" +CBC_QRCoderBlockPair::CBC_QRCoderBlockPair(CBC_CommonByteArray* data, CBC_CommonByteArray* errorCorrection) +{ + m_dataBytes = data; + m_errorCorrectionBytes = errorCorrection; +} +CBC_QRCoderBlockPair::~CBC_QRCoderBlockPair() +{ + if(m_dataBytes != NULL) { + delete m_dataBytes; + m_dataBytes = NULL; + } + if(m_errorCorrectionBytes != NULL) { + delete m_errorCorrectionBytes; + m_errorCorrectionBytes = NULL; + } +} +CBC_CommonByteArray* CBC_QRCoderBlockPair::GetDataBytes() +{ + return m_dataBytes; +} +CBC_CommonByteArray* CBC_QRCoderBlockPair::GetErrorCorrectionBytes() +{ + return m_errorCorrectionBytes; +} diff --git a/xfa/src/fxbarcode/src/BC_QRCoderDecoder.cpp b/xfa/src/fxbarcode/src/BC_QRCoderDecoder.cpp new file mode 100644 index 0000000000..7a3613137d --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_QRCoderDecoder.cpp @@ -0,0 +1,112 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_ReedSolomonDecoder.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_CommonDecoderResult.h" +#include "include/BC_QRBitMatrixParser.h" +#include "include/BC_QRDataBlock.h" +#include "include/BC_QRDecodedBitStreamParser.h" +#include "include/BC_QRCoderVersion.h" +#include "include/BC_QRCoderFormatInformation.h" +#include "include/BC_ReedSolomonGF256.h" +#include "include/BC_QRCoderDecoder.h" +CBC_QRCoderDecoder::CBC_QRCoderDecoder() +{ + m_rsDecoder = NULL; +} + +void CBC_QRCoderDecoder::Init() +{ + m_rsDecoder = FX_NEW CBC_ReedSolomonDecoder(CBC_ReedSolomonGF256::QRCodeFild); +} +CBC_QRCoderDecoder::~CBC_QRCoderDecoder() +{ + if(m_rsDecoder != NULL) { + delete m_rsDecoder; + } + m_rsDecoder = NULL; +} +CBC_CommonDecoderResult* CBC_QRCoderDecoder::Decode(FX_BOOL* image, FX_INT32 width, FX_INT32 height, FX_INT32 &e) +{ + CBC_CommonBitMatrix bits; + bits.Init(width); + for(FX_INT32 i = 0; i < width; i++) { + for(FX_INT32 j = 0; j < height; j++) { + if(image[i * width + j]) { + bits.Set(j, i); + } + } + } + CBC_CommonDecoderResult* cdr = Decode(&bits, height, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return cdr; +} +CBC_CommonDecoderResult* CBC_QRCoderDecoder::Decode(CBC_CommonBitMatrix* bits, FX_INT32 byteModeDecode, FX_INT32 &e) +{ + CBC_QRBitMatrixParser parser; + parser.Init(bits, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_QRCoderVersion *version = parser.ReadVersion(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_QRCoderFormatInformation* temp = parser.ReadFormatInformation(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_QRCoderErrorCorrectionLevel* ecLevel = temp->GetErrorCorrectionLevel(); + CFX_ByteArray* ba = parser.ReadCodewords(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr codewords(ba); + CFX_PtrArray *dataBlocks = CBC_QRDataBlock::GetDataBlocks(codewords.get(), version, ecLevel, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + FX_INT32 totalBytes = 0; + for (FX_INT32 i = 0; i < dataBlocks->GetSize(); i++) { + totalBytes += ((CBC_QRDataBlock*) ((*dataBlocks)[i]))->GetNumDataCodewords(); + } + CFX_ByteArray resultBytes; + FX_INT32 resultOffset = 0; + for (FX_INT32 j = 0; j < dataBlocks->GetSize(); j++) { + CBC_QRDataBlock *dataBlock = (CBC_QRDataBlock *)((*dataBlocks)[j]); + CFX_ByteArray* codewordBytes = dataBlock->GetCodewords(); + FX_INT32 numDataCodewords = dataBlock->GetNumDataCodewords(); + CorrectErrors(codewordBytes, numDataCodewords, e); + if (e != BCExceptionNO) { + for(FX_INT32 k = 0; k < dataBlocks->GetSize(); k++) { + delete (CBC_QRDataBlock*)(*dataBlocks)[k]; + } + dataBlocks->RemoveAll(); + delete dataBlocks; + dataBlocks = NULL; + return NULL; + } + for(FX_INT32 i = 0; i < numDataCodewords; i++) { + resultBytes.Add((*codewordBytes)[i]); + } + } + for(FX_INT32 k = 0; k < dataBlocks->GetSize(); k++) { + delete (CBC_QRDataBlock*)(*dataBlocks)[k] ; + } + dataBlocks->RemoveAll(); + delete dataBlocks; + dataBlocks = NULL; + CBC_CommonDecoderResult* cdr = CBC_QRDecodedBitStreamParser::Decode(&resultBytes, version, ecLevel, byteModeDecode, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return cdr; +} +void CBC_QRCoderDecoder::CorrectErrors(CFX_ByteArray* codewordBytes, FX_INT32 numDataCodewords, FX_INT32 &e) +{ + FX_INT32 numCodewords = codewordBytes->GetSize(); + CFX_Int32Array codewordsInts; + codewordsInts.SetSize(numCodewords); + for(FX_INT32 i = 0; i < numCodewords; i++) { + codewordsInts[i] = (FX_INT32)((*codewordBytes)[i] & 0xff); + } + FX_INT32 numECCodewords = codewordBytes->GetSize() - numDataCodewords; + m_rsDecoder->Decode(&codewordsInts, numECCodewords, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + for(FX_INT32 k = 0; k < numDataCodewords; k++) { + (*codewordBytes)[k] = (FX_BYTE) codewordsInts[k]; + } +} diff --git a/xfa/src/fxbarcode/src/BC_QRCoderECB.cpp b/xfa/src/fxbarcode/src/BC_QRCoderECB.cpp new file mode 100644 index 0000000000..e7e971f299 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_QRCoderECB.cpp @@ -0,0 +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 "barcode.h" +#include "include/BC_QRCoderECB.h" +CBC_QRCoderECB::CBC_QRCoderECB(FX_INT32 count, FX_INT32 dataCodeWords) +{ + m_dataCodeWords = dataCodeWords; + m_count = count; +} +CBC_QRCoderECB::~CBC_QRCoderECB() +{ +} +FX_INT32 CBC_QRCoderECB::GetCount() +{ + return m_count; +} +FX_INT32 CBC_QRCoderECB::GetDataCodeWords() +{ + return m_dataCodeWords; +} diff --git a/xfa/src/fxbarcode/src/BC_QRCoderECBlocks.cpp b/xfa/src/fxbarcode/src/BC_QRCoderECBlocks.cpp new file mode 100644 index 0000000000..ad8997343b --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_QRCoderECBlocks.cpp @@ -0,0 +1,49 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_QRCoderECB.h" +#include "include/BC_QRCoderECBlocks.h" +CBC_QRCoderECBlocks::CBC_QRCoderECBlocks(FX_INT32 ecCodeWordsPerBlock, CBC_QRCoderECB* ecBlocks) +{ + m_ecCodeWordsPerBlock = ecCodeWordsPerBlock; + m_ecBlocks.Add(ecBlocks); +} +CBC_QRCoderECBlocks::CBC_QRCoderECBlocks(FX_INT32 ecCodeWordsPerBlock, + CBC_QRCoderECB* ecBlocks1, + CBC_QRCoderECB* ecBlocks2) +{ + m_ecCodeWordsPerBlock = ecCodeWordsPerBlock; + m_ecBlocks.Add(ecBlocks1); + m_ecBlocks.Add(ecBlocks2); +} +CBC_QRCoderECBlocks::~CBC_QRCoderECBlocks() +{ + for (FX_INT32 i = 0 ; i < m_ecBlocks.GetSize(); i++) { + delete ( (CBC_QRCoderECB*)(m_ecBlocks[i]) ) ; + } + m_ecBlocks.RemoveAll(); +} +FX_INT32 CBC_QRCoderECBlocks::GetECCodeWordsPerBlock() +{ + return m_ecCodeWordsPerBlock; +} +FX_INT32 CBC_QRCoderECBlocks::GetNumBlocks() +{ + FX_INT32 total = 0; + for(FX_INT32 i = 0; i < m_ecBlocks.GetSize(); i++) { + total += ( (CBC_QRCoderECB*)(m_ecBlocks[i]) )->GetCount(); + } + return total; +} +FX_INT32 CBC_QRCoderECBlocks::GetTotalECCodeWords() +{ + return m_ecCodeWordsPerBlock * GetNumBlocks(); +} +CFX_PtrArray* CBC_QRCoderECBlocks::GetECBlocks() +{ + return &m_ecBlocks; +} diff --git a/xfa/src/fxbarcode/src/BC_QRCoderEncoder.cpp b/xfa/src/fxbarcode/src/BC_QRCoderEncoder.cpp new file mode 100644 index 0000000000..b6e3fb8cfc --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_QRCoderEncoder.cpp @@ -0,0 +1,860 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_QRCoder.h" +#include "include/BC_QRCoderEncoder.h" +#include "include/BC_CommonByteArray.h" +#include "include/BC_QRCoderMode.h" +#include "include/BC_QRCoderEncoder.h" +#include "include/BC_QRCoderECBlocks.h" +#include "include/BC_QRCoderVersion.h" +#include "include/BC_QRCoderBlockPair.h" +#include "include/BC_QRCoderMaskUtil.h" +#include "include/BC_QRCoderMatrixUtil.h" +#include "include/BC_ReedSolomon.h" +#include "include/BC_CommonByteMatrix.h" +#include "include/BC_ReedSolomonGF256.h" +#include "include/BC_UtilCodingConvert.h" +#include "include/BC_QRCoderBitVector.h" +const FX_INT32 CBC_QRCoderEncoder::m_alphaNumbericTable[] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1 +}; +CBC_QRCoderEncoder::CBC_QRCoderEncoder() +{ +} +CBC_QRCoderEncoder::~CBC_QRCoderEncoder() +{ +} +class Make_Pair : public CFX_Object +{ +public: + CBC_QRCoderMode* m_mode; + CFX_ByteString m_string; +private: + Make_Pair(const Make_Pair &mode_string) {} + Make_Pair &operator = (Make_Pair &mode_string) + { + if (this == &mode_string) { + return *this; + } + m_mode = mode_string.m_mode; + m_string = mode_string.m_string; + return *this; + } +public: + Make_Pair(CBC_QRCoderMode *mode, const CFX_ByteString &str): m_mode(mode), m_string(str) {} + ~Make_Pair() {} +}; +void CBC_QRCoderEncoder::Encode(const CFX_ByteString &content, CBC_QRCoderErrorCorrectionLevel* ecLevel, + CBC_QRCoder *qrCode, FX_INT32 &e, FX_INT32 versionSpecify) +{ + if(versionSpecify == 0) { + EncodeWithAutoVersion(content, ecLevel, qrCode, e); + BC_EXCEPTION_CHECK_ReturnVoid(e) + } else if(versionSpecify > 0 && versionSpecify <= 40) { + EncodeWithSpecifyVersion(content, ecLevel, qrCode, versionSpecify, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } else { + e = BCExceptionVersionMust1_40; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +void CBC_QRCoderEncoder::AppendECI(CBC_QRCoderBitVector* bits) +{ +} +void CBC_QRCoderEncoder::AppendDataModeLenghInfo(CFX_PtrArray &splitResult, CBC_QRCoderBitVector &headerAndDataBits, + CBC_QRCoderMode *tempMode, CBC_QRCoder *qrCode, CFX_ByteString &encoding, FX_INT32 &e) +{ + for(FX_INT32 i = 0; i < splitResult.GetSize(); i++) { + tempMode = ((Make_Pair*)splitResult[i])->m_mode; + if(tempMode == CBC_QRCoderMode::sGBK) { + AppendModeInfo(tempMode, &headerAndDataBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + AppendLengthInfo(((Make_Pair*)splitResult[i])->m_string.GetLength(), qrCode->GetVersion(), tempMode, &headerAndDataBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + AppendBytes(((Make_Pair*)splitResult[i])->m_string, tempMode, &headerAndDataBits, encoding, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } else if(tempMode == CBC_QRCoderMode::sBYTE) { + CFX_ByteArray bytes; + CBC_UtilCodingConvert::LocaleToUtf8(((Make_Pair*)splitResult[i])->m_string, bytes); + AppendModeInfo(tempMode, &headerAndDataBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + AppendLengthInfo(bytes.GetSize(), qrCode->GetVersion(), tempMode, &headerAndDataBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + Append8BitBytes(bytes, &headerAndDataBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } else if(tempMode == CBC_QRCoderMode::sALPHANUMERIC) { + AppendModeInfo(tempMode, &headerAndDataBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + AppendLengthInfo(((Make_Pair*)splitResult[i])->m_string.GetLength(), qrCode->GetVersion(), tempMode, &headerAndDataBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + AppendBytes(((Make_Pair*)splitResult[i])->m_string, tempMode, &headerAndDataBits, encoding, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } else if(tempMode == CBC_QRCoderMode::sNUMERIC) { + AppendModeInfo(tempMode, &headerAndDataBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + AppendLengthInfo(((Make_Pair*)splitResult[i])->m_string.GetLength(), qrCode->GetVersion(), tempMode, &headerAndDataBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + AppendBytes(((Make_Pair*)splitResult[i])->m_string, tempMode, &headerAndDataBits, encoding, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } else { + e = BCExceptionUnknown; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + } +} +void CBC_QRCoderEncoder::SplitString(const CFX_ByteString &content, CFX_PtrArray &result) +{ + FX_INT32 index = 0, flag = 0; + while((((FX_BYTE)content[index] >= 0xA1 && (FX_BYTE)content[index] <= 0xAA) || + ((FX_BYTE)content[index] >= 0xB0 && (FX_BYTE)content[index] <= 0xFA)) && (index < content.GetLength())) { + index += 2; + } + if(index != flag) { + result.Add(FX_NEW Make_Pair(CBC_QRCoderMode::sGBK, content.Mid(flag, index - flag))); + } + flag = index; + if(index >= content.GetLength()) { + return; + } + while(GetAlphaNumericCode((FX_BYTE)content[index]) == -1 + && !(((FX_BYTE)content[index] >= 0xA1 && (FX_BYTE)content[index] <= 0xAA) || + ((FX_BYTE)content[index] >= 0xB0 && (FX_BYTE)content[index] <= 0xFA)) + && (index < content.GetLength())) { +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + if(IsDBCSLeadByte((FX_BYTE)content[index])) +#else + if((FX_BYTE)content[index] > 127) +#endif + { + index += 2; + } else { + index++; + } + } + if(index != flag) { + result.Add(FX_NEW Make_Pair(CBC_QRCoderMode::sBYTE, content.Mid(flag, index - flag))); + } + flag = index; + if(index >= content.GetLength()) { + return; + } + while(FXSYS_Isdigit((FX_BYTE)content[index]) && (index < content.GetLength())) { + index++; + } + if(index != flag) { + result.Add(FX_NEW Make_Pair(CBC_QRCoderMode::sNUMERIC, content.Mid(flag, index - flag))); + } + flag = index; + if(index >= content.GetLength()) { + return; + } + while(GetAlphaNumericCode((FX_BYTE)content[index]) != -1 && (index < content.GetLength())) { + index++; + } + if(index != flag) { + result.Add(FX_NEW Make_Pair(CBC_QRCoderMode::sALPHANUMERIC, content.Mid(flag, index - flag))); + } + flag = index; + if(index >= content.GetLength()) { + return; + } + SplitString(content.Mid(index, content.GetLength() - index), result); +} +FX_INT32 CBC_QRCoderEncoder::GetSpanByVersion(CBC_QRCoderMode *modeFirst, CBC_QRCoderMode *modeSecond, FX_INT32 versionNum, FX_INT32 &e) +{ + if(versionNum == 0) { + return 0; + } + if((modeFirst == CBC_QRCoderMode::sALPHANUMERIC) + && (modeSecond == CBC_QRCoderMode::sBYTE)) { + if(versionNum >= 1 && versionNum <= 9) { + return 11; + } else if(versionNum >= 10 && versionNum <= 26) { + return 15; + } else if(versionNum >= 27 && versionNum <= 40) { + return 16; + } else { + e = BCExceptionNoSuchVersion; + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + } + } else if((modeSecond == CBC_QRCoderMode::sALPHANUMERIC) + && (modeFirst == CBC_QRCoderMode::sNUMERIC)) { + if(versionNum >= 1 && versionNum <= 9) { + return 13; + } else if(versionNum >= 10 && versionNum <= 26) { + return 15; + } else if(versionNum >= 27 && versionNum <= 40) { + return 17; + } else { + e = BCExceptionNoSuchVersion; + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + } + } else if((modeSecond == CBC_QRCoderMode::sBYTE) + && (modeFirst == CBC_QRCoderMode::sNUMERIC)) { + if(versionNum >= 1 && versionNum <= 9) { + return 6; + } else if(versionNum >= 10 && versionNum <= 26) { + return 8; + } else if(versionNum >= 27 && versionNum <= 40) { + return 9; + } else { + e = BCExceptionNoSuchVersion; + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + } + } + return -1; +} +void CBC_QRCoderEncoder::MergeString(CFX_PtrArray &result, FX_INT32 versionNum, FX_INT32 &e) +{ + Make_Pair *first = NULL; + Make_Pair *second = NULL; + size_t mergeNum = 0; + FX_INT32 i; + for(i = 0; ((i < result.GetSize()) && (i + 1 < result.GetSize())); i++) { + first = (Make_Pair*)result[i]; + second = (Make_Pair*)result[i + 1]; + if(first->m_mode == CBC_QRCoderMode::sALPHANUMERIC) { + FX_INT32 tmp = GetSpanByVersion(CBC_QRCoderMode::sALPHANUMERIC, CBC_QRCoderMode::sBYTE, versionNum, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + if((second->m_mode == CBC_QRCoderMode::sBYTE) + && (first->m_string.GetLength() < tmp)) { + CFX_ByteString str = first->m_string + second->m_string; + second->m_string = str; + delete first; + result.RemoveAt(i); + i--; + mergeNum++; + } + } else if(first->m_mode == CBC_QRCoderMode::sBYTE) { + if(second->m_mode == CBC_QRCoderMode::sBYTE) { + first->m_string += second->m_string; + delete second; + result.RemoveAt(i + 1); + i--; + mergeNum++; + } + } else if(first->m_mode == CBC_QRCoderMode::sNUMERIC) { + FX_INT32 tmp = GetSpanByVersion(CBC_QRCoderMode::sNUMERIC, CBC_QRCoderMode::sBYTE, versionNum, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + if((second->m_mode == CBC_QRCoderMode::sBYTE) + && (first->m_string.GetLength() < tmp)) { + CFX_ByteString str = first->m_string + second->m_string; + second->m_string = str; + delete first; + result.RemoveAt(i); + i--; + mergeNum++; + } + tmp = GetSpanByVersion(CBC_QRCoderMode::sNUMERIC, CBC_QRCoderMode::sALPHANUMERIC, versionNum, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + if((second->m_mode == CBC_QRCoderMode::sALPHANUMERIC) + && (first->m_string.GetLength() < tmp)) { + CFX_ByteString str = first->m_string + second->m_string; + second->m_string = str; + delete first; + result.RemoveAt(i); + i--; + mergeNum++; + } + } + } + if(mergeNum == 0) { + return; + } + MergeString(result, versionNum, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); +} +void CBC_QRCoderEncoder::InitQRCode(FX_INT32 numInputBytes, FX_INT32 versionNumber, + CBC_QRCoderErrorCorrectionLevel* ecLevel, CBC_QRCoderMode* mode, CBC_QRCoder* qrCode, FX_INT32 &e) +{ + qrCode->SetECLevel(ecLevel); + qrCode->SetMode(mode); + CBC_QRCoderVersion* version = CBC_QRCoderVersion::GetVersionForNumber(versionNumber, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + FX_INT32 numBytes = version->GetTotalCodeWords(); + CBC_QRCoderECBlocks* ecBlocks = version->GetECBlocksForLevel(ecLevel); + FX_INT32 numEcBytes = ecBlocks->GetTotalECCodeWords(); + FX_INT32 numRSBlocks = ecBlocks->GetNumBlocks(); + FX_INT32 numDataBytes = numBytes - numEcBytes; + if(numDataBytes >= numInputBytes + 3) { + qrCode->SetVersion(versionNumber); + qrCode->SetNumTotalBytes(numBytes); + qrCode->SetNumDataBytes(numDataBytes); + qrCode->SetNumRSBlocks(numRSBlocks); + qrCode->SetNumECBytes(numEcBytes); + qrCode->SetMatrixWidth(version->GetDimensionForVersion()); + return; + } + e = BCExceptionCannotFindBlockInfo; + BC_EXCEPTION_CHECK_ReturnVoid(e); +} +void CBC_QRCoderEncoder::EncodeWithSpecifyVersion(const CFX_ByteString &content, CBC_QRCoderErrorCorrectionLevel* ecLevel, + CBC_QRCoder *qrCode, FX_INT32 versionSpecify, FX_INT32 &e) +{ + CFX_ByteString encoding = "utf8"; + CBC_QRCoderMode *mode = CBC_QRCoderMode::sBYTE; + CFX_PtrArray splitResult; + CBC_QRCoderBitVector dataBits; + dataBits.Init(); + SplitString(content, splitResult); + MergeString(splitResult, versionSpecify, e); + BC_EXCEPTION_CHECK_ReturnVoid(e) + CBC_QRCoderMode *tempMode = NULL; + for(FX_INT32 i = 0; i < splitResult.GetSize(); i++) { + AppendBytes(((Make_Pair*)splitResult[i])->m_string, ((Make_Pair*)splitResult[i])->m_mode, &dataBits, encoding, e); + if(e != BCExceptionNO) { + for(FX_INT32 y = 0; y < splitResult.GetSize(); y++) { + delete (Make_Pair*)splitResult[y]; + } + splitResult.RemoveAll(); + return; + } + } + FX_INT32 numInputBytes = dataBits.sizeInBytes(); + CBC_QRCoderBitVector headerAndDataBits; + headerAndDataBits.Init(); + InitQRCode(numInputBytes, versionSpecify, ecLevel, mode, qrCode, e); + if(e != BCExceptionNO) { + for(FX_INT32 k = 0; k < splitResult.GetSize(); k++) { + delete (Make_Pair*)splitResult[k]; + } + splitResult.RemoveAll(); + return ; + } + AppendDataModeLenghInfo(splitResult, headerAndDataBits, tempMode, qrCode, encoding, e); + if(e != BCExceptionNO) { + for(FX_INT32 k = 0; k < splitResult.GetSize(); k++) { + delete (Make_Pair*)splitResult[k]; + } + splitResult.RemoveAll(); + return ; + } + numInputBytes = headerAndDataBits.sizeInBytes(); + TerminateBits(qrCode->GetNumDataBytes(), &headerAndDataBits, e); + if(e != BCExceptionNO) { + for(FX_INT32 k = 0; k < splitResult.GetSize(); k++) { + delete (Make_Pair*)splitResult[k]; + } + splitResult.RemoveAll(); + return ; + } + for(FX_INT32 j = 0; j < splitResult.GetSize(); j++) { + delete (Make_Pair*)splitResult[j]; + } + splitResult.RemoveAll(); + CBC_QRCoderBitVector finalBits ; + finalBits.Init(); + InterleaveWithECBytes(&headerAndDataBits, qrCode->GetNumTotalBytes(), qrCode->GetNumDataBytes(), + qrCode->GetNumRSBlocks(), &finalBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CBC_CommonByteMatrix* pDecoder = FX_NEW CBC_CommonByteMatrix(qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth()); + pDecoder->Init(); + CBC_AutoPtr matrix(pDecoder); + FX_INT32 maskPattern = ChooseMaskPattern(&finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), matrix.get(), e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + qrCode->SetMaskPattern(maskPattern); + CBC_QRCoderMatrixUtil::BuildMatrix(&finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), qrCode->GetMaskPattern(), matrix.get(), e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + qrCode->SetMatrix(matrix.release()); + if(!qrCode->IsValid()) { + e = BCExceptionInvalidQRCode; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +void CBC_QRCoderEncoder::EncodeWithAutoVersion(const CFX_ByteString &content, CBC_QRCoderErrorCorrectionLevel* ecLevel, CBC_QRCoder *qrCode, FX_INT32 &e) +{ + CFX_ByteString encoding = "utf8"; + CBC_QRCoderMode *mode = CBC_QRCoderMode::sBYTE; + CFX_PtrArray splitResult; + CBC_QRCoderBitVector dataBits; + dataBits.Init(); + SplitString(content, splitResult); + MergeString(splitResult, 8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CBC_QRCoderMode *tempMode = NULL; + for(FX_INT32 i = 0; i < splitResult.GetSize(); i++) { + AppendBytes(((Make_Pair*)splitResult[i])->m_string, ((Make_Pair*)splitResult[i])->m_mode, &dataBits, encoding, e); + if(e != BCExceptionNO) { + for(FX_INT32 l = 0; l < splitResult.GetSize(); l++) { + delete (Make_Pair*)splitResult[l]; + } + splitResult.RemoveAll(); + return; + } + } + FX_INT32 numInputBytes = dataBits.sizeInBytes(); + InitQRCode(numInputBytes, ecLevel, mode, qrCode, e); + BC_EXCEPTION_CHECK_ReturnVoid(e) + CBC_QRCoderBitVector headerAndDataBits; + headerAndDataBits.Init(); + tempMode = NULL; + FX_INT32 versionNum = qrCode->GetVersion(); +sign: + AppendDataModeLenghInfo(splitResult, headerAndDataBits, tempMode, qrCode, encoding, e); + if (e != BCExceptionNO) { + goto catchException; + } + numInputBytes = headerAndDataBits.sizeInBytes(); + TerminateBits(qrCode->GetNumDataBytes(), &headerAndDataBits, e); + if (e != BCExceptionNO) { + goto catchException; + } +catchException: + if (e != BCExceptionNO) { + FX_INT32 e1 = BCExceptionNO; + InitQRCode(numInputBytes, ecLevel, mode, qrCode, e1); + if (e1 != BCExceptionNO) { + e = e1; + return; + } + versionNum++; + if (versionNum <= 40) { + headerAndDataBits.Clear(); + e = BCExceptionNO; + goto sign; + } else { + for (FX_INT32 j = 0; j < splitResult.GetSize(); j++) { + delete (Make_Pair*)splitResult[j]; + } + splitResult.RemoveAll(); + return; + } + } + for (FX_INT32 k = 0; k < splitResult.GetSize(); k++) { + delete (Make_Pair*)splitResult[k]; + } + splitResult.RemoveAll(); + CBC_QRCoderBitVector finalBits ; + finalBits.Init(); + InterleaveWithECBytes(&headerAndDataBits, qrCode->GetNumTotalBytes(), qrCode->GetNumDataBytes(), + qrCode->GetNumRSBlocks(), &finalBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CBC_CommonByteMatrix* pDecoder = FX_NEW CBC_CommonByteMatrix(qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth()); + pDecoder->Init(); + CBC_AutoPtr matrix(pDecoder); + FX_INT32 maskPattern = ChooseMaskPattern(&finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), matrix.get(), e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + qrCode->SetMaskPattern(maskPattern); + CBC_QRCoderMatrixUtil::BuildMatrix(&finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), qrCode->GetMaskPattern(), matrix.get(), e); + BC_EXCEPTION_CHECK_ReturnVoid(e) + qrCode->SetMatrix(matrix.release()); + if(!qrCode->IsValid()) { + e = BCExceptionInvalidQRCode; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +void CBC_QRCoderEncoder::Encode(const CFX_WideString &content, CBC_QRCoderErrorCorrectionLevel* ecLevel, CBC_QRCoder *qrCode, FX_INT32 &e) +{ + CFX_ByteString encoding = "utf8"; + CFX_ByteString utf8Data; + CBC_UtilCodingConvert::UnicodeToUTF8(content, utf8Data); + CBC_QRCoderMode* mode = ChooseMode(utf8Data, encoding); + CBC_QRCoderBitVector dataBits; + dataBits.Init(); + AppendBytes(utf8Data, mode, &dataBits, encoding, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + FX_INT32 numInputBytes = dataBits.sizeInBytes(); + InitQRCode(numInputBytes, ecLevel, mode, qrCode, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CBC_QRCoderBitVector headerAndDataBits; + headerAndDataBits.Init(); + AppendModeInfo(mode, &headerAndDataBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + FX_INT32 numLetters = mode == CBC_QRCoderMode::sBYTE ? dataBits.sizeInBytes() : content.GetLength(); + AppendLengthInfo(numLetters, qrCode->GetVersion(), mode, &headerAndDataBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + headerAndDataBits.AppendBitVector(&dataBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e) + TerminateBits(qrCode->GetNumDataBytes(), &headerAndDataBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CBC_QRCoderBitVector finalBits ; + finalBits.Init(); + InterleaveWithECBytes(&headerAndDataBits, qrCode->GetNumTotalBytes(), qrCode->GetNumDataBytes(), + qrCode->GetNumRSBlocks(), &finalBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CBC_CommonByteMatrix* pDecoder = FX_NEW CBC_CommonByteMatrix(qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth()); + pDecoder->Init(); + CBC_AutoPtr matrix(pDecoder); + FX_INT32 maskPattern = ChooseMaskPattern(&finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), matrix.get(), e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + qrCode->SetMaskPattern(maskPattern); + CBC_QRCoderMatrixUtil::BuildMatrix(&finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), qrCode->GetMaskPattern(), matrix.get(), e); + BC_EXCEPTION_CHECK_ReturnVoid(e) + qrCode->SetMatrix(matrix.release()); + if(!qrCode->IsValid()) { + e = BCExceptionInvalidQRCode; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +void CBC_QRCoderEncoder::TerminateBits(FX_INT32 numDataBytes, CBC_QRCoderBitVector* bits, FX_INT32 &e) +{ + FX_INT32 capacity = numDataBytes << 3; + if(bits->Size() > capacity) { + e = BCExceptionDataTooMany; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + for (FX_INT32 i = 0; i < 4 && bits->Size() < capacity; ++i) { + bits->AppendBit(0, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + FX_INT32 numBitsInLastByte = bits->Size() % 8; + if (numBitsInLastByte > 0) { + FX_INT32 numPaddingBits = 8 - numBitsInLastByte; + for (FX_INT32 j = 0; j < numPaddingBits; ++j) { + bits->AppendBit(0, e); + BC_EXCEPTION_CHECK_ReturnVoid(e) + } + } + if (bits->Size() % 8 != 0) { + e = BCExceptionDigitLengthMustBe8; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + FX_INT32 numPaddingBytes = numDataBytes - bits->sizeInBytes(); + for (FX_INT32 k = 0; k < numPaddingBytes; ++k) { + if (k % 2 == 0) { + bits->AppendBits(0xec, 8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } else { + bits->AppendBits(0x11, 8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + } + if (bits->Size() != capacity) { + e = BCExceptionBitsNotEqualCacity; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +FX_INT32 CBC_QRCoderEncoder::ChooseMaskPattern(CBC_QRCoderBitVector* bits, CBC_QRCoderErrorCorrectionLevel* ecLevel, FX_INT32 version, CBC_CommonByteMatrix* matrix, FX_INT32 &e) +{ + FX_INT32 minPenalty = 65535; + FX_INT32 bestMaskPattern = -1; + for(FX_INT32 maskPattern = 0; maskPattern < CBC_QRCoder::NUM_MASK_PATTERNS; maskPattern++) { + CBC_QRCoderMatrixUtil::BuildMatrix(bits, ecLevel, version, maskPattern, matrix, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + FX_INT32 penalty = CalculateMaskPenalty(matrix); + if(penalty < minPenalty) { + minPenalty = penalty; + bestMaskPattern = maskPattern; + } + } + return bestMaskPattern; +} +FX_INT32 CBC_QRCoderEncoder::CalculateMaskPenalty(CBC_CommonByteMatrix* matrix) +{ + FX_INT32 penalty = 0; + penalty += CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule1(matrix); + penalty += CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule2(matrix); + penalty += CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule3(matrix); + penalty += CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule4(matrix); + return penalty; +} +CBC_QRCoderMode *CBC_QRCoderEncoder::ChooseMode(const CFX_ByteString &content, CFX_ByteString encoding) +{ + if(encoding.Compare("SHIFT_JIS") == 0) { + return CBC_QRCoderMode::sKANJI; + } + FX_BOOL hasNumeric = FALSE; + FX_BOOL hasAlphaNumeric = FALSE; + for(FX_INT32 i = 0; i < content.GetLength(); i++) { + if(isdigit((FX_BYTE)content[i])) { + hasNumeric = TRUE; + } else if(GetAlphaNumericCode((FX_BYTE)content[i]) != -1) { + hasAlphaNumeric = TRUE; + } else { + return CBC_QRCoderMode::sBYTE; + } + } + if(hasAlphaNumeric) { + return CBC_QRCoderMode::sALPHANUMERIC; + } else if(hasNumeric) { + return CBC_QRCoderMode::sNUMERIC; + } + return CBC_QRCoderMode::sBYTE; +} +FX_INT32 CBC_QRCoderEncoder::GetAlphaNumericCode(FX_INT32 code) +{ + if(code < 96 && code >= 0) { + return m_alphaNumbericTable[code]; + } + return -1; +} +void CBC_QRCoderEncoder::AppendBytes(const CFX_ByteString &content, CBC_QRCoderMode* mode, CBC_QRCoderBitVector* bits, CFX_ByteString encoding, FX_INT32 &e) +{ + if(mode == CBC_QRCoderMode::sNUMERIC) { + AppendNumericBytes(content, bits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } else if(mode == CBC_QRCoderMode::sALPHANUMERIC) { + AppendAlphaNumericBytes(content, bits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } else if(mode == CBC_QRCoderMode::sBYTE) { + Append8BitBytes(content, bits, encoding, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } else if(mode == CBC_QRCoderMode::sKANJI) { + AppendKanjiBytes(content, bits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } else if(mode == CBC_QRCoderMode::sGBK) { + AppendGBKBytes(content, bits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } else { + e = BCExceptionUnsupportedMode; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +void CBC_QRCoderEncoder::AppendNumericBytes(const CFX_ByteString &content, CBC_QRCoderBitVector* bits, FX_INT32 &e) +{ + FX_INT32 length = content.GetLength(); + FX_INT32 i = 0; + while(i < length) { + FX_INT32 num1 = content[i] - '0'; + if(i + 2 < length) { + FX_INT32 num2 = content[i + 1] - '0'; + FX_INT32 num3 = content[i + 2] - '0'; + bits->AppendBits(num1 * 100 + num2 * 10 + num3, 10, e); + BC_EXCEPTION_CHECK_ReturnVoid(e) + i += 3; + } else if(i + 1 < length) { + FX_INT32 num2 = content[i + 1] - '0'; + bits->AppendBits(num1 * 10 + num2, 7, e); + BC_EXCEPTION_CHECK_ReturnVoid(e) + i += 2; + } else { + bits->AppendBits(num1, 4, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + i++; + } + } +} +void CBC_QRCoderEncoder::AppendAlphaNumericBytes(const CFX_ByteString &content, CBC_QRCoderBitVector* bits, FX_INT32 &e) +{ + FX_INT32 length = content.GetLength(); + FX_INT32 i = 0; + while(i < length) { + FX_INT32 code1 = GetAlphaNumericCode(content[i]); + if(code1 == -1) { + e = BCExceptionInvalidateCharacter; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + if(i + 1 < length) { + FX_INT32 code2 = GetAlphaNumericCode(content[i + 1]); + if(code2 == -1) { + e = BCExceptionInvalidateCharacter; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + bits->AppendBits(code1 * 45 + code2, 11, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + i += 2; + } else { + bits->AppendBits(code1, 6, e); + BC_EXCEPTION_CHECK_ReturnVoid(e) + i++; + } + } +} +void CBC_QRCoderEncoder::AppendGBKBytes(const CFX_ByteString &content, CBC_QRCoderBitVector* bits, FX_INT32 &e) +{ + FX_INT32 length = content.GetLength(); + FX_DWORD value = 0; + for(FX_INT32 i = 0; i < length; i += 2) { + value = (FX_DWORD)((FX_BYTE)content[i] << 8 | (FX_BYTE)content[i + 1]); + if(value <= 0xAAFE && value >= 0xA1A1) { + value -= 0xA1A1; + } else if(value <= 0xFAFE && value >= 0xB0A1) { + value -= 0xA6A1; + } else { + e = BCExceptionInvalidateCharacter; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + value = (FX_DWORD)((value >> 8 ) * 0x60) + (FX_DWORD)(value & 0xff); + bits->AppendBits(value, 13, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +void CBC_QRCoderEncoder::Append8BitBytes(const CFX_ByteString &content, CBC_QRCoderBitVector* bits, CFX_ByteString encoding, FX_INT32 &e) +{ + for(FX_INT32 i = 0; i < content.GetLength(); i++) { + bits->AppendBits(content[i], 8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +void CBC_QRCoderEncoder::Append8BitBytes(CFX_ByteArray &bytes, CBC_QRCoderBitVector *bits, FX_INT32 &e) +{ + for(FX_INT32 i = 0; i < bytes.GetSize(); i++) { + bits->AppendBits(bytes[i], 8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +void CBC_QRCoderEncoder::AppendKanjiBytes(const CFX_ByteString &content, CBC_QRCoderBitVector* bits, FX_INT32 &e) +{ + CFX_ByteArray bytes; + FX_DWORD value = 0, h = 0; + for(FX_INT32 i = 0; i < bytes.GetSize(); i += 2) { + value = (FX_DWORD)((FX_BYTE)(content[i] << 8) | (FX_BYTE)content[i + 1]); + if(value <= 0x9ffc && value >= 0x8140) { + value -= 0x8140; + } else if(value <= 0xebbf && value >= 0xe040) { + value -= 0xc140; + } else { + e = BCExceptionInvalidateCharacter; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + value = (FX_DWORD)((value >> 8 ) * 0xc0) + (FX_DWORD)(value & 0xff); + bits->AppendBits(value, 13, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +void CBC_QRCoderEncoder::InitQRCode(FX_INT32 numInputBytes, CBC_QRCoderErrorCorrectionLevel* ecLevel, + CBC_QRCoderMode* mode, CBC_QRCoder* qrCode, FX_INT32 &e) +{ + qrCode->SetECLevel(ecLevel); + qrCode->SetMode(mode); + for(FX_INT32 versionNum = 1; versionNum <= 40; versionNum++) { + CBC_QRCoderVersion* version = CBC_QRCoderVersion::GetVersionForNumber(versionNum, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + FX_INT32 numBytes = version->GetTotalCodeWords(); + CBC_QRCoderECBlocks* ecBlocks = version->GetECBlocksForLevel(ecLevel); + FX_INT32 numEcBytes = ecBlocks->GetTotalECCodeWords(); + FX_INT32 numRSBlocks = ecBlocks->GetNumBlocks(); + FX_INT32 numDataBytes = numBytes - numEcBytes; + if(numDataBytes >= numInputBytes + 3) { + qrCode->SetVersion(versionNum); + qrCode->SetNumTotalBytes(numBytes); + qrCode->SetNumDataBytes(numDataBytes); + qrCode->SetNumRSBlocks(numRSBlocks); + qrCode->SetNumECBytes(numEcBytes); + qrCode->SetMatrixWidth(version->GetDimensionForVersion()); + return; + } + } + e = BCExceptionCannotFindBlockInfo; + BC_EXCEPTION_CHECK_ReturnVoid(e); +} +void CBC_QRCoderEncoder::AppendModeInfo(CBC_QRCoderMode* mode, CBC_QRCoderBitVector* bits, FX_INT32 &e) +{ + bits->AppendBits(mode->GetBits(), 4, e); + if(mode == CBC_QRCoderMode::sGBK) { + bits->AppendBits(1, 4, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +void CBC_QRCoderEncoder::AppendLengthInfo(FX_INT32 numLetters, FX_INT32 version, CBC_QRCoderMode* mode, CBC_QRCoderBitVector* bits, FX_INT32 &e) +{ + CBC_QRCoderVersion* qcv = CBC_QRCoderVersion::GetVersionForNumber(version, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + FX_INT32 numBits = mode->GetCharacterCountBits(qcv, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + if(numBits > ((1 << numBits) - 1)) { + return; + } + if(mode == CBC_QRCoderMode::sGBK) { + bits->AppendBits(numLetters / 2, numBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + bits->AppendBits(numLetters, numBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); +} +void CBC_QRCoderEncoder::InterleaveWithECBytes(CBC_QRCoderBitVector* bits, FX_INT32 numTotalBytes, FX_INT32 numDataBytes, FX_INT32 numRSBlocks, CBC_QRCoderBitVector* result, FX_INT32 &e) +{ + if(bits->sizeInBytes() != numDataBytes) { + e = BCExceptionBitsBytesNotMatch; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + FX_INT32 dataBytesOffset = 0; + FX_INT32 maxNumDataBytes = 0; + FX_INT32 maxNumEcBytes = 0; + CFX_PtrArray blocks; + FX_INT32 i; + for(i = 0; i < numRSBlocks; i++) { + FX_INT32 numDataBytesInBlock; + FX_INT32 numEcBytesInBlosk; + GetNumDataBytesAndNumECBytesForBlockID(numTotalBytes, numDataBytes, numRSBlocks, i, + numDataBytesInBlock, numEcBytesInBlosk); + CBC_CommonByteArray* dataBytes = FX_NEW CBC_CommonByteArray; + dataBytes->Set(bits->GetArray(), dataBytesOffset, numDataBytesInBlock); + CBC_CommonByteArray* ecBytes = GenerateECBytes(dataBytes, numEcBytesInBlosk, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + blocks.Add(FX_NEW CBC_QRCoderBlockPair(dataBytes, ecBytes)); + maxNumDataBytes = FX_MAX(maxNumDataBytes, dataBytes->Size()); + maxNumEcBytes = FX_MAX(maxNumEcBytes, ecBytes->Size()); + dataBytesOffset += numDataBytesInBlock; + } + if(numDataBytes != dataBytesOffset) { + e = BCExceptionBytesNotMatchOffset; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + for(FX_INT32 x = 0; x < maxNumDataBytes; x++) { + for(FX_INT32 j = 0; j < blocks.GetSize(); j++) { + CBC_CommonByteArray* dataBytes = ((CBC_QRCoderBlockPair*)blocks[j])->GetDataBytes(); + if(x < dataBytes->Size()) { + result->AppendBits(dataBytes->At(x), 8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + } + } + for(FX_INT32 y = 0; y < maxNumEcBytes; y++) { + for(FX_INT32 l = 0; l < blocks.GetSize(); l++) { + CBC_CommonByteArray* ecBytes = ((CBC_QRCoderBlockPair*)blocks[l])->GetErrorCorrectionBytes(); + if(y < ecBytes->Size()) { + result->AppendBits(ecBytes->At(y), 8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + } + } + for(FX_INT32 k = 0; k < blocks.GetSize(); k++) { + delete (CBC_QRCoderBlockPair*)blocks[k]; + } + if(numTotalBytes != result->sizeInBytes()) { + e = BCExceptionSizeInBytesDiffer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +void CBC_QRCoderEncoder::GetNumDataBytesAndNumECBytesForBlockID(FX_INT32 numTotalBytes, FX_INT32 numDataBytes, + FX_INT32 numRSBlocks, FX_INT32 blockID, + FX_INT32 &numDataBytesInBlock, FX_INT32& numECBytesInBlock) +{ + if(blockID >= numRSBlocks) { + return; + } + FX_INT32 numRsBlocksInGroup2 = numTotalBytes % numRSBlocks; + FX_INT32 numRsBlocksInGroup1 = numRSBlocks - numRsBlocksInGroup2; + FX_INT32 numTotalBytesInGroup1 = numTotalBytes / numRSBlocks; + FX_INT32 numTotalBytesInGroup2 = numTotalBytesInGroup1 + 1; + FX_INT32 numDataBytesInGroup1 = numDataBytes / numRSBlocks; + FX_INT32 numDataBytesInGroup2 = numDataBytesInGroup1 + 1; + FX_INT32 numEcBytesInGroup1 = numTotalBytesInGroup1 - numDataBytesInGroup1; + FX_INT32 numEcBytesInGroup2 = numTotalBytesInGroup2 - numDataBytesInGroup2; + if (blockID < numRsBlocksInGroup1) { + numDataBytesInBlock = numDataBytesInGroup1; + numECBytesInBlock = numEcBytesInGroup1; + } else { + numDataBytesInBlock = numDataBytesInGroup2; + numECBytesInBlock = numEcBytesInGroup2; + } +} +CBC_CommonByteArray* CBC_QRCoderEncoder::GenerateECBytes(CBC_CommonByteArray* dataBytes, FX_INT32 numEcBytesInBlock, FX_INT32 &e) +{ + FX_INT32 numDataBytes = dataBytes->Size(); + CFX_Int32Array toEncode; + toEncode.SetSize(numDataBytes + numEcBytesInBlock); + for(FX_INT32 i = 0; i < numDataBytes; i++) { + toEncode[i] = (dataBytes->At(i)); + } + CBC_ReedSolomonEncoder encode(CBC_ReedSolomonGF256::QRCodeFild); + encode.Init(); + encode.Encode(&toEncode, numEcBytesInBlock, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_CommonByteArray* ecBytes = FX_NEW CBC_CommonByteArray(numEcBytesInBlock); + for(FX_INT32 j = 0; j < numEcBytesInBlock; j++) { + ecBytes->Set(j, toEncode[numDataBytes + j]); + } + return ecBytes; +} diff --git a/xfa/src/fxbarcode/src/BC_QRCoderErrorCorrectionLevel.cpp b/xfa/src/fxbarcode/src/BC_QRCoderErrorCorrectionLevel.cpp new file mode 100644 index 0000000000..333aa2d50e --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_QRCoderErrorCorrectionLevel.cpp @@ -0,0 +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 + +#include "barcode.h" +#include "include/BC_QRCoderErrorCorrectionLevel.h" +CBC_QRCoderErrorCorrectionLevel* CBC_QRCoderErrorCorrectionLevel::L = NULL; +CBC_QRCoderErrorCorrectionLevel* CBC_QRCoderErrorCorrectionLevel::M = NULL; +CBC_QRCoderErrorCorrectionLevel* CBC_QRCoderErrorCorrectionLevel::Q = NULL; +CBC_QRCoderErrorCorrectionLevel* CBC_QRCoderErrorCorrectionLevel::H = NULL; +CBC_QRCoderErrorCorrectionLevel::CBC_QRCoderErrorCorrectionLevel(FX_INT32 ordinal, FX_INT32 bits, FX_CHAR* name) +{ + m_name += name; + m_ordinal = ordinal; + m_bits = bits; +} +CBC_QRCoderErrorCorrectionLevel::~CBC_QRCoderErrorCorrectionLevel() +{ +} +void CBC_QRCoderErrorCorrectionLevel::Initialize() +{ + L = FX_NEW CBC_QRCoderErrorCorrectionLevel(0, 0x01, (FX_CHAR*)"L"); + M = FX_NEW CBC_QRCoderErrorCorrectionLevel(1, 0x00, (FX_CHAR*)"M"); + Q = FX_NEW CBC_QRCoderErrorCorrectionLevel(2, 0x03, (FX_CHAR*)"Q"); + H = FX_NEW CBC_QRCoderErrorCorrectionLevel(3, 0x02, (FX_CHAR*)"H"); +} +void CBC_QRCoderErrorCorrectionLevel::Finalize() +{ + delete L; + delete M; + delete Q; + delete H; +} +FX_INT32 CBC_QRCoderErrorCorrectionLevel::Ordinal() +{ + return m_ordinal; +} +FX_INT32 CBC_QRCoderErrorCorrectionLevel::GetBits() +{ + return m_bits; +} +CFX_ByteString CBC_QRCoderErrorCorrectionLevel::GetName() +{ + return m_name; +} +CBC_QRCoderErrorCorrectionLevel* CBC_QRCoderErrorCorrectionLevel::ForBits(FX_INT32 bits) +{ + switch(bits) { + case 0x00: + return M; + case 0x01: + return L; + case 0x02: + return H; + case 0x03: + return Q; + default: + return NULL; + } +} +void CBC_QRCoderErrorCorrectionLevel::Destroy() +{ + if(L) { + delete CBC_QRCoderErrorCorrectionLevel::L; + L = NULL; + } + if(M) { + delete CBC_QRCoderErrorCorrectionLevel::M; + M = NULL; + } + if(H) { + delete CBC_QRCoderErrorCorrectionLevel::H; + H = NULL; + } + if(Q) { + delete CBC_QRCoderErrorCorrectionLevel::Q; + Q = NULL; + } +} diff --git a/xfa/src/fxbarcode/src/BC_QRCoderFormatInformation.cpp b/xfa/src/fxbarcode/src/BC_QRCoderFormatInformation.cpp new file mode 100644 index 0000000000..baa2ec19b0 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_QRCoderFormatInformation.cpp @@ -0,0 +1,103 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_QRCoderErrorCorrectionLevel.h" +#include "include/BC_QRCoderFormatInformation.h" +const FX_INT32 CBC_QRCoderFormatInformation::FORMAT_INFO_MASK_QR = 0X5412; +const FX_INT32 CBC_QRCoderFormatInformation::FORMAT_INFO_DECODE_LOOKUP[32][2] = { + {0x5412, 0x00}, + {0x5125, 0x01}, + {0x5E7C, 0x02}, + {0x5B4B, 0x03}, + {0x45F9, 0x04}, + {0x40CE, 0x05}, + {0x4F97, 0x06}, + {0x4AA0, 0x07}, + {0x77C4, 0x08}, + {0x72F3, 0x09}, + {0x7DAA, 0x0A}, + {0x789D, 0x0B}, + {0x662F, 0x0C}, + {0x6318, 0x0D}, + {0x6C41, 0x0E}, + {0x6976, 0x0F}, + {0x1689, 0x10}, + {0x13BE, 0x11}, + {0x1CE7, 0x12}, + {0x19D0, 0x13}, + {0x0762, 0x14}, + {0x0255, 0x15}, + {0x0D0C, 0x16}, + {0x083B, 0x17}, + {0x355F, 0x18}, + {0x3068, 0x19}, + {0x3F31, 0x1A}, + {0x3A06, 0x1B}, + {0x24B4, 0x1C}, + {0x2183, 0x1D}, + {0x2EDA, 0x1E}, + {0x2BED, 0x1F}, +}; +const FX_INT32 CBC_QRCoderFormatInformation::BITS_SET_IN_HALF_BYTE[] = +{0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4}; +CBC_QRCoderFormatInformation::CBC_QRCoderFormatInformation(FX_INT32 formatInfo) +{ + m_errorCorrectLevl = CBC_QRCoderErrorCorrectionLevel::ForBits((formatInfo >> 3) & 0x03); + m_dataMask = (FX_BYTE) (formatInfo & 0x07); +} +CBC_QRCoderFormatInformation::~CBC_QRCoderFormatInformation() +{ +} +FX_INT32 CBC_QRCoderFormatInformation::NumBitsDiffering(FX_INT32 a, FX_INT32 b) +{ + a ^= b; + return BITS_SET_IN_HALF_BYTE[a & 0x0F] + + BITS_SET_IN_HALF_BYTE[(a >> 4) & 0x0F] + + BITS_SET_IN_HALF_BYTE[(a >> 8) & 0x0F] + + BITS_SET_IN_HALF_BYTE[(a >> 12) & 0x0F] + + BITS_SET_IN_HALF_BYTE[(a >> 16) & 0x0F] + + BITS_SET_IN_HALF_BYTE[(a >> 20) & 0x0F] + + BITS_SET_IN_HALF_BYTE[(a >> 24) & 0x0F] + + BITS_SET_IN_HALF_BYTE[(a >> 28) & 0x0F]; +} +FX_BYTE CBC_QRCoderFormatInformation::GetDataMask() +{ + return m_dataMask; +} +CBC_QRCoderErrorCorrectionLevel *CBC_QRCoderFormatInformation::GetErrorCorrectionLevel() +{ + return m_errorCorrectLevl; +} +CBC_QRCoderFormatInformation* CBC_QRCoderFormatInformation::DecodeFormatInformation(FX_INT32 maskedFormatInfo) +{ + CBC_QRCoderFormatInformation* formatInfo = DoDecodeFormatInformation(maskedFormatInfo); + if(formatInfo != NULL) { + return formatInfo; + } + return DoDecodeFormatInformation(maskedFormatInfo ^ FORMAT_INFO_MASK_QR); +} +CBC_QRCoderFormatInformation* CBC_QRCoderFormatInformation::DoDecodeFormatInformation(FX_INT32 maskedFormatInfo) +{ + FX_INT32 bestDifference = (FX_INT32)FXSYS_nan(); + FX_INT32 bestFormatInfo = 0; + for(FX_INT32 i = 0; i < 32; i++) { + FX_INT32 const* decodeInfo = &FORMAT_INFO_DECODE_LOOKUP[i][0]; + FX_INT32 targetInfo = decodeInfo[0]; + if(targetInfo == maskedFormatInfo) { + return FX_NEW CBC_QRCoderFormatInformation(decodeInfo[1]); + } + FX_INT32 bitsDifference = NumBitsDiffering(maskedFormatInfo, targetInfo); + if(bitsDifference < bestDifference) { + bestFormatInfo = decodeInfo[1]; + bestDifference = bitsDifference; + } + } + if(bestDifference <= 3) { + return FX_NEW CBC_QRCoderFormatInformation(bestFormatInfo); + } + return NULL; +} diff --git a/xfa/src/fxbarcode/src/BC_QRCoderMaskUtil.cpp b/xfa/src/fxbarcode/src/BC_QRCoderMaskUtil.cpp new file mode 100644 index 0000000000..e7a4a8bba8 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_QRCoderMaskUtil.cpp @@ -0,0 +1,192 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_CommonByteMatrix.h" +#include "include/BC_QRCoderErrorCorrectionLevel.h" +#include "include/BC_QRCoder.h" +#include "include/BC_QRCoderMaskUtil.h" +CBC_QRCoderMaskUtil::CBC_QRCoderMaskUtil() +{ +} +CBC_QRCoderMaskUtil::~CBC_QRCoderMaskUtil() +{ +} +FX_INT32 CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule1(CBC_CommonByteMatrix* matrix) +{ + return ApplyMaskPenaltyRule1Internal(matrix, TRUE) + + ApplyMaskPenaltyRule1Internal(matrix, FALSE); +} +FX_INT32 CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule2(CBC_CommonByteMatrix* matrix) +{ + FX_INT32 penalty = 0; + FX_BYTE* array = matrix->GetArray(); + FX_INT32 width = matrix->GetWidth(); + FX_INT32 height = matrix->GetHeight(); + for(FX_INT32 y = 0; y < height - 1; y++) { + for(FX_INT32 x = 0; x < width - 1; x++) { + FX_INT32 value = array[y * width + x]; + if(value == array[y * width + x + 1] && + value == array[(y + 1) * width + x] && + value == array[(y + 1) * width + x + 1]) { + penalty ++; + } + } + } + return 3 * penalty; +} +FX_INT32 CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule3(CBC_CommonByteMatrix* matrix) +{ + FX_INT32 penalty = 0; + FX_BYTE* array = matrix->GetArray(); + FX_INT32 width = matrix->GetWidth(); + FX_INT32 height = matrix->GetHeight(); + for (FX_INT32 y = 0; y < height; ++y) { + for (FX_INT32 x = 0; x < width; ++x) { + if (x == 0 && ((y >= 0 && y <= 6) || (y >= height - 7 && y <= height - 1))) { + continue; + } + if (x == width - 7 && (y >= 0 && y <= 6)) { + continue; + } + if (y == 0 && ((x >= 0 && x <= 6) || (x >= width - 7 && x <= width - 1))) { + continue; + } + if (y == height - 7 && (x >= 0 && x <= 6)) { + continue; + } + if (x + 6 < width && + array[y * width + x] == 1 && + array[y * width + x + 1] == 0 && + array[y * width + x + 2] == 1 && + array[y * width + x + 3] == 1 && + array[y * width + x + 4] == 1 && + array[y * width + x + 5] == 0 && + array[y * width + x + 6] == 1 && + ((x + 10 < width && + array[y * width + x + 7] == 0 && + array[y * width + x + 8] == 0 && + array[y * width + x + 9] == 0 && + array[y * width + x + 10] == 0) || + (x - 4 >= 0 && + array[y * width + x - 1] == 0 && + array[y * width + x - 2] == 0 && + array[y * width + x - 3] == 0 && + array[y * width + x - 4] == 0))) { + penalty += 40; + } + if (y + 6 < height && + array[y * width + x] == 1 && + array[(y + 1) * width + x] == 0 && + array[(y + 2) * width + x] == 1 && + array[(y + 3) * width + x] == 1 && + array[(y + 4) * width + x] == 1 && + array[(y + 5) * width + x] == 0 && + array[(y + 6) * width + x] == 1 && + ((y + 10 < height && + array[(y + 7) * width + x] == 0 && + array[(y + 8) * width + x] == 0 && + array[(y + 9) * width + x] == 0 && + array[(y + 10) * width + x] == 0) || + (y - 4 >= 0 && + array[(y - 1) * width + x] == 0 && + array[(y - 2) * width + x] == 0 && + array[(y - 3) * width + x] == 0 && + array[(y - 4) * width + x] == 0))) { + penalty += 40; + } + } + } + return penalty; +} +FX_INT32 CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule4(CBC_CommonByteMatrix* matrix) +{ + FX_INT32 numDarkCells = 0; + FX_BYTE* array = matrix->GetArray(); + FX_INT32 width = matrix->GetWidth(); + FX_INT32 height = matrix->GetHeight(); + for (FX_INT32 y = 0; y < height; ++y) { + for (FX_INT32 x = 0; x < width; ++x) { + if (array[y * width + x] == 1) { + numDarkCells += 1; + } + } + } + FX_INT32 numTotalCells = matrix->GetHeight() * matrix->GetWidth(); + double darkRatio = (double) numDarkCells / numTotalCells; + return abs( (FX_INT32) (darkRatio * 100 - 50) / 5 ) * 5 * 10; +} +FX_BOOL CBC_QRCoderMaskUtil::GetDataMaskBit(FX_INT32 maskPattern, FX_INT32 x, FX_INT32 y, FX_INT32 &e) +{ + if(!CBC_QRCoder::IsValidMaskPattern(maskPattern)) { + e = (BCExceptionInvalidateMaskPattern); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + } + FX_INT32 intermediate = 0, temp = 0; + switch(maskPattern) { + case 0: + intermediate = (y + x) & 0x1; + break; + case 1: + intermediate = y & 0x1; + break; + case 2: + intermediate = x % 3; + break; + case 3: + intermediate = (y + x) % 3; + break; + case 4: + intermediate = ((y >> 1) + (x / 3)) & 0x1; + break; + case 5: + temp = y * x; + intermediate = (temp & 0x1) + (temp % 3); + break; + case 6: + temp = y * x; + intermediate = (((temp & 0x1) + (temp % 3)) & 0x1); + break; + case 7: + temp = y * x; + intermediate = (((temp % 3) + ((y + x) & 0x1)) & 0x1); + break; + default: { + e = BCExceptionInvalidateMaskPattern; + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + } + } + return intermediate == 0; +} +FX_INT32 CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule1Internal(CBC_CommonByteMatrix* matrix, FX_BOOL isHorizontal) +{ + FX_INT32 penalty = 0; + FX_INT32 numSameBitCells = 0; + FX_INT32 prevBit = -1; + FX_INT32 width = matrix->GetWidth(); + FX_INT32 height = matrix->GetHeight(); + FX_INT32 iLimit = isHorizontal ? height : width; + FX_INT32 jLimit = isHorizontal ? width : height; + FX_BYTE* array = matrix->GetArray(); + for (FX_INT32 i = 0; i < iLimit; ++i) { + for (FX_INT32 j = 0; j < jLimit; ++j) { + FX_INT32 bit = isHorizontal ? array[i * width + j] : array[j * width + i]; + if (bit == prevBit) { + numSameBitCells += 1; + if (numSameBitCells == 5) { + penalty += 3; + } else if (numSameBitCells > 5) { + penalty += 1; + } + } else { + numSameBitCells = 1; + prevBit = bit; + } + } + numSameBitCells = 0; + } + return penalty; +} diff --git a/xfa/src/fxbarcode/src/BC_QRCoderMatrixUtil.cpp b/xfa/src/fxbarcode/src/BC_QRCoderMatrixUtil.cpp new file mode 100644 index 0000000000..6f56e445f9 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_QRCoderMatrixUtil.cpp @@ -0,0 +1,474 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_CommonByteMatrix.h" +#include "include/BC_QRCoderErrorCorrectionLevel.h" +#include "include/BC_QRCoder.h" +#include "include/BC_QRCoderMaskUtil.h" +#include "include/BC_QRCoderMatrixUtil.h" +#include "include/BC_QRCoderBitVector.h" +const FX_INT32 CBC_QRCoderMatrixUtil::POSITION_DETECTION_PATTERN[7][7] = { + 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 1, + 1, 0, 1, 1, 1, 0, 1, + 1, 0, 1, 1, 1, 0, 1, + 1, 0, 1, 1, 1, 0, 1, + 1, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1 +}; +const FX_INT32 CBC_QRCoderMatrixUtil::HORIZONTAL_SEPARATION_PATTERN[1][8] = { + 0, 0, 0, 0, 0, 0, 0, 0 +}; +const FX_INT32 CBC_QRCoderMatrixUtil::VERTICAL_SEPARATION_PATTERN[7][1] = { + 0, 0, 0, 0, 0, 0, 0 +}; +const FX_INT32 CBC_QRCoderMatrixUtil::POSITION_ADJUSTMENT_PATTERN[5][5] = { + 1, 1, 1, 1, 1, + 1, 0, 0, 0, 1, + 1, 0, 1, 0, 1, + 1, 0, 0, 0, 1, + 1, 1, 1, 1, 1 +}; +const FX_INT32 CBC_QRCoderMatrixUtil::POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE[40][7] = { + { -1, -1, -1, -1, -1, -1, -1}, + { 6, 18, -1, -1, -1, -1, -1}, + { 6, 22, -1, -1, -1, -1, -1}, + { 6, 26, -1, -1, -1, -1, -1}, + { 6, 30, -1, -1, -1, -1, -1}, + { 6, 34, -1, -1, -1, -1, -1}, + { 6, 22, 38, -1, -1, -1, -1}, + { 6, 24, 42, -1, -1, -1, -1}, + { 6, 26, 46, -1, -1, -1, -1}, + { 6, 28, 50, -1, -1, -1, -1}, + { 6, 30, 54, -1, -1, -1, -1}, + { 6, 32, 58, -1, -1, -1, -1}, + { 6, 34, 62, -1, -1, -1, -1}, + { 6, 26, 46, 66, -1, -1, -1}, + { 6, 26, 48, 70, -1, -1, -1}, + { 6, 26, 50, 74, -1, -1, -1}, + { 6, 30, 54, 78, -1, -1, -1}, + { 6, 30, 56, 82, -1, -1, -1}, + { 6, 30, 58, 86, -1, -1, -1}, + { 6, 34, 62, 90, -1, -1, -1}, + { 6, 28, 50, 72, 94, -1, -1}, + { 6, 26, 50, 74, 98, -1, -1}, + { 6, 30, 54, 78, 102, -1, -1}, + { 6, 28, 54, 80, 106, -1, -1}, + { 6, 32, 58, 84, 110, -1, -1}, + { 6, 30, 58, 86, 114, -1, -1}, + { 6, 34, 62, 90, 118, -1, -1}, + { 6, 26, 50, 74, 98, 122, -1}, + { 6, 30, 54, 78, 102, 126, -1}, + { 6, 26, 52, 78, 104, 130, -1}, + { 6, 30, 56, 82, 108, 134, -1}, + { 6, 34, 60, 86, 112, 138, -1}, + { 6, 30, 58, 86, 114, 142, -1}, + { 6, 34, 62, 90, 118, 146, -1}, + { 6, 30, 54, 78, 102, 126, 150}, + { 6, 24, 50, 76, 102, 128, 154}, + { 6, 28, 54, 80, 106, 132, 158}, + { 6, 32, 58, 84, 110, 136, 162}, + { 6, 26, 54, 82, 110, 138, 166}, + { 6, 30, 58, 86, 114, 142, 170}, +}; +const FX_INT32 CBC_QRCoderMatrixUtil::TYPE_INFO_COORDINATES[15][2] = { + {8, 0}, + {8, 1}, + {8, 2}, + {8, 3}, + {8, 4}, + {8, 5}, + {8, 7}, + {8, 8}, + {7, 8}, + {5, 8}, + {4, 8}, + {3, 8}, + {2, 8}, + {1, 8}, + {0, 8}, +}; +const FX_INT32 CBC_QRCoderMatrixUtil::VERSION_INFO_POLY = 0x1f25; +const FX_INT32 CBC_QRCoderMatrixUtil::TYPE_INFO_POLY = 0x0537; +const FX_INT32 CBC_QRCoderMatrixUtil::TYPE_INFO_MASK_PATTERN = 0x5412; +void CBC_QRCoderMatrixUtil::ClearMatrix(CBC_CommonByteMatrix* matrix, FX_INT32 &e) +{ + if(matrix == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + matrix->clear((FX_BYTE) - 1); +} +void CBC_QRCoderMatrixUtil::BuildMatrix(CBC_QRCoderBitVector* dataBits, + CBC_QRCoderErrorCorrectionLevel* ecLevel, + FX_INT32 version, FX_INT32 maskPattern, + CBC_CommonByteMatrix* matrix, FX_INT32 &e) +{ + if(matrix == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + ClearMatrix(matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + EmbedBasicPatterns(version, matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + EmbedTypeInfo(ecLevel, maskPattern, matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + MaybeEmbedVersionInfo(version, matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + EmbedDataBits(dataBits, maskPattern, matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); +} +void CBC_QRCoderMatrixUtil::EmbedBasicPatterns(FX_INT32 version, CBC_CommonByteMatrix* matrix, FX_INT32 &e) +{ + if(matrix == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + EmbedPositionDetectionPatternsAndSeparators(matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + EmbedDarkDotAtLeftBottomCorner(matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + MaybeEmbedPositionAdjustmentPatterns(version, matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + EmbedTimingPatterns(matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); +} +void CBC_QRCoderMatrixUtil::EmbedTypeInfo(CBC_QRCoderErrorCorrectionLevel* ecLevel, + FX_INT32 maskPattern, CBC_CommonByteMatrix *matrix, FX_INT32 &e) +{ + if(matrix == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + CBC_QRCoderBitVector typeInfoBits; + typeInfoBits.Init(); + MakeTypeInfoBits(ecLevel, maskPattern, &typeInfoBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + for(FX_INT32 i = 0; i < typeInfoBits.Size(); i++) { + FX_INT32 bit = typeInfoBits.At(typeInfoBits.Size() - 1 - i, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + FX_INT32 x1 = TYPE_INFO_COORDINATES[i][0]; + FX_INT32 y1 = TYPE_INFO_COORDINATES[i][1]; + matrix->Set(x1, y1, bit); + if(i < 8) { + FX_INT32 x2 = matrix->GetWidth() - i - 1; + FX_INT32 y2 = 8; + matrix->Set(x2, y2, bit); + } else { + FX_INT32 x2 = 8; + FX_INT32 y2 = matrix->GetHeight() - 7 + (i - 8); + matrix->Set(x2, y2, bit); + } + } +} +void CBC_QRCoderMatrixUtil::MaybeEmbedVersionInfo(FX_INT32 version, CBC_CommonByteMatrix* matrix, FX_INT32 &e) +{ + if(matrix == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + if(version < 7) { + return; + } + CBC_QRCoderBitVector versionInfoBits; + versionInfoBits.Init(); + MakeVersionInfoBits(version, &versionInfoBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + FX_INT32 bitIndex = 6 * 3 - 1; + for(FX_INT32 i = 0; i < 6; i++) { + for(FX_INT32 j = 0; j < 3; j++) { + FX_INT32 bit = versionInfoBits.At(bitIndex, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + bitIndex--; + matrix->Set(i, matrix->GetHeight() - 11 + j, bit); + matrix->Set(matrix->GetHeight() - 11 + j, i, bit); + } + } +} +void CBC_QRCoderMatrixUtil::EmbedDataBits(CBC_QRCoderBitVector* dataBits, + FX_INT32 maskPattern, CBC_CommonByteMatrix* matrix, FX_INT32 &e) +{ + if(matrix == NULL || dataBits == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + FX_INT32 bitIndex = 0; + FX_INT32 direction = -1; + FX_INT32 x = matrix->GetWidth() - 1; + FX_INT32 y = matrix->GetHeight() - 1; + while(x > 0) { + if (x == 6) { + x -= 1; + } + while(y >= 0 && y < matrix->GetHeight()) { + if (y == 6) { + y += direction; + continue; + } + for(FX_INT32 i = 0; i < 2; i++) { + FX_INT32 xx = x - i; + if(!IsEmpty(matrix->Get(xx, y))) { + continue; + } + FX_INT32 bit; + if(bitIndex < dataBits->Size()) { + bit = dataBits->At(bitIndex, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + bitIndex++; + } else { + bit = 0; + } + if( maskPattern != -1) { + FX_BOOL bol = CBC_QRCoderMaskUtil::GetDataMaskBit(maskPattern, xx, y, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + if(bol) { + bit ^= 0x01; + } + } + matrix->Set(xx, y, bit); + } + y += direction; + } + direction = -direction; + y += direction; + x -= 2; + } + if(bitIndex != dataBits->Size()) { + return; + } +} +FX_INT32 CBC_QRCoderMatrixUtil::CalculateBCHCode(FX_INT32 value, FX_INT32 poly) +{ + FX_INT32 msbSetInPoly = FindMSBSet(poly); + value <<= msbSetInPoly - 1; + while(FindMSBSet(value) >= msbSetInPoly) { + value ^= poly << (FindMSBSet(value) - msbSetInPoly); + } + return value; +} +void CBC_QRCoderMatrixUtil::MakeTypeInfoBits(CBC_QRCoderErrorCorrectionLevel* ecLevel, + FX_INT32 maskPattern, CBC_QRCoderBitVector* bits, FX_INT32 &e) +{ + if(bits == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + if(!CBC_QRCoder::IsValidMaskPattern(maskPattern)) { + e = BCExceptionBadMask; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + FX_INT32 typeInfo = (ecLevel->GetBits() << 3) | maskPattern; + BC_EXCEPTION_CHECK_ReturnVoid(e); + bits->AppendBits(typeInfo, 5, e); + FX_INT32 bchCode = CalculateBCHCode(typeInfo, TYPE_INFO_POLY); + BC_EXCEPTION_CHECK_ReturnVoid(e); + bits->AppendBits(bchCode, 10, e); + CBC_QRCoderBitVector maskBits; + maskBits.Init(); + maskBits.AppendBits(TYPE_INFO_MASK_PATTERN, 15, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + bits->XOR(&maskBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + if(bits->Size() != 15) { + e = BCExceptionBitSizeNot15; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +void CBC_QRCoderMatrixUtil::MakeVersionInfoBits(FX_INT32 version, CBC_QRCoderBitVector* bits, FX_INT32 &e) +{ + if(bits == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + bits->AppendBits(version, 6, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + FX_INT32 bchCode = CalculateBCHCode(version, VERSION_INFO_POLY); + bits->AppendBits(bchCode, 12, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + if(bits->Size() != 18) { + e = BCExceptionBitSizeNot18; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +FX_BOOL CBC_QRCoderMatrixUtil::IsEmpty(FX_INT32 value) +{ + return (FX_BYTE)value == 0xff; +} +FX_BOOL CBC_QRCoderMatrixUtil::IsValidValue(FX_INT32 value) +{ + return ((FX_BYTE)value == 0xff || (FX_BYTE)value == 0x00 || (FX_BYTE)value == 0x01); +} +void CBC_QRCoderMatrixUtil::EmbedTimingPatterns(CBC_CommonByteMatrix* matrix, FX_INT32 &e) +{ + if(matrix == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + for(FX_INT32 i = 8; i < matrix->GetWidth() - 8; i++) { + FX_INT32 bit = (i + 1) % 2; + if(!IsValidValue(matrix->Get(i, 6))) { + e = BCExceptionInvalidateImageData; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + if(IsEmpty(matrix->Get(i , 6))) { + matrix->Set(i, 6, bit); + } + if(!IsValidValue(matrix->Get(6, i))) { + e = BCExceptionInvalidateImageData; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + if(IsEmpty(matrix->Get(6, i))) { + matrix->Set(6, i, bit); + } + } +} +void CBC_QRCoderMatrixUtil::EmbedDarkDotAtLeftBottomCorner(CBC_CommonByteMatrix* matrix, FX_INT32 &e) +{ + if(matrix == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + if(matrix->Get(8, matrix->GetHeight() - 8) == 0) { + e = BCExceptionHeight_8BeZero; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + matrix->Set(8, matrix->GetHeight() - 8, 1); +} +void CBC_QRCoderMatrixUtil::EmbedHorizontalSeparationPattern(FX_INT32 xStart, FX_INT32 yStart, + CBC_CommonByteMatrix* matrix, FX_INT32 &e) +{ + if(matrix == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + for(FX_INT32 x = 0; x < 8; x++) { + if(!IsEmpty(matrix->Get(xStart + x, yStart))) { + e = BCExceptionInvalidateData; + BC_EXCEPTION_CHECK_ReturnVoid(e) + } + matrix->Set(xStart + x, yStart, HORIZONTAL_SEPARATION_PATTERN[0][x]); + } +} +void CBC_QRCoderMatrixUtil::EmbedVerticalSeparationPattern(FX_INT32 xStart, FX_INT32 yStart, + CBC_CommonByteMatrix* matrix, FX_INT32 &e) +{ + if(matrix == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + for(FX_INT32 y = 0; y < 7; y++) { + if(!IsEmpty(matrix->Get(xStart, yStart + y))) { + e = BCExceptionInvalidateData; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + matrix->Set(xStart, yStart + y, VERTICAL_SEPARATION_PATTERN[y][0]); + } +} +void CBC_QRCoderMatrixUtil::EmbedPositionAdjustmentPattern(FX_INT32 xStart, FX_INT32 yStart, + CBC_CommonByteMatrix* matrix, FX_INT32 &e) +{ + if(matrix == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + for(FX_INT32 y = 0; y < 5; y++) { + for(FX_INT32 x = 0; x < 5; x++) { + if(!IsEmpty(matrix->Get(xStart + x, y + yStart))) { + e = BCExceptionInvalidateData; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + matrix->Set(xStart + x, yStart + y, POSITION_ADJUSTMENT_PATTERN[y][x]); + } + } +} +void CBC_QRCoderMatrixUtil::EmbedPositionDetectionPattern (FX_INT32 xStart, FX_INT32 yStart, + CBC_CommonByteMatrix* matrix, FX_INT32 &e) +{ + if(matrix == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + for(FX_INT32 y = 0; y < 7; y++) { + for(FX_INT32 x = 0; x < 7; x++) { + if(!IsEmpty(matrix->Get(xStart + x, yStart + y))) { + e = BCExceptionInvalidateData; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + matrix->Set(xStart + x, yStart + y, POSITION_DETECTION_PATTERN[y][x]); + } + } +} +void CBC_QRCoderMatrixUtil::EmbedPositionDetectionPatternsAndSeparators(CBC_CommonByteMatrix* matrix, FX_INT32 &e) +{ + if(matrix == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + FX_INT32 pdpWidth = 7; + EmbedPositionDetectionPattern(0, 0, matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + EmbedPositionDetectionPattern(matrix->GetWidth() - pdpWidth, 0, matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + EmbedPositionDetectionPattern(0, matrix->GetWidth() - pdpWidth, matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + FX_INT32 hspWidth = 8; + EmbedHorizontalSeparationPattern(0, hspWidth - 1, matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + EmbedHorizontalSeparationPattern(matrix->GetWidth() - hspWidth, hspWidth - 1, matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + EmbedHorizontalSeparationPattern(0, matrix->GetWidth() - hspWidth, matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + FX_INT32 vspSize = 7; + EmbedVerticalSeparationPattern(vspSize, 0, matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + EmbedVerticalSeparationPattern(matrix->GetHeight() - vspSize - 1, 0, matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + EmbedVerticalSeparationPattern(vspSize, matrix->GetHeight() - vspSize, matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); +} +void CBC_QRCoderMatrixUtil::MaybeEmbedPositionAdjustmentPatterns(FX_INT32 version, CBC_CommonByteMatrix* matrix, FX_INT32 &e) +{ + if(matrix == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + if(version < 2) { + return; + } + FX_INT32 index = version - 1; + FX_INT32 const* coordinates = &(POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE[index][0]); + FX_INT32 numCoordinate = 7; + for(FX_INT32 i = 0; i < numCoordinate; i++) { + for(FX_INT32 j = 0; j < numCoordinate; j++) { + FX_INT32 y = coordinates[i]; + FX_INT32 x = coordinates[j]; + if(x == -1 || y == -1) { + continue; + } + if(IsEmpty(matrix->Get(x, y))) { + EmbedPositionAdjustmentPattern(x - 2, y - 2, matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + } + } +} +FX_INT32 CBC_QRCoderMatrixUtil::FindMSBSet(FX_INT32 value) +{ + FX_INT32 numDigits = 0; + while(value != 0) { + value >>= 1; + ++numDigits; + } + return numDigits; +} +CBC_QRCoderMatrixUtil::CBC_QRCoderMatrixUtil() +{ +} +CBC_QRCoderMatrixUtil::~CBC_QRCoderMatrixUtil() +{ +} diff --git a/xfa/src/fxbarcode/src/BC_QRCoderMode.cpp b/xfa/src/fxbarcode/src/BC_QRCoderMode.cpp new file mode 100644 index 0000000000..a4a5610fc4 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_QRCoderMode.cpp @@ -0,0 +1,162 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_QRCoderVersion.h" +#include "include/BC_QRCoderMode.h" +CBC_QRCoderMode* CBC_QRCoderMode::sBYTE = NULL; +CBC_QRCoderMode* CBC_QRCoderMode::sNUMERIC = NULL; +CBC_QRCoderMode* CBC_QRCoderMode::sALPHANUMERIC = NULL; +CBC_QRCoderMode* CBC_QRCoderMode::sKANJI = NULL; +CBC_QRCoderMode* CBC_QRCoderMode::sECI = NULL; +CBC_QRCoderMode* CBC_QRCoderMode::sGBK = NULL; +CBC_QRCoderMode* CBC_QRCoderMode::sTERMINATOR = NULL; +CBC_QRCoderMode* CBC_QRCoderMode::sFNC1_FIRST_POSITION = NULL; +CBC_QRCoderMode* CBC_QRCoderMode::sFNC1_SECOND_POSITION = NULL; +CBC_QRCoderMode* CBC_QRCoderMode::sSTRUCTURED_APPEND = NULL; +CBC_QRCoderMode::CBC_QRCoderMode(FX_INT32 *characterCountBitsForVersions, + FX_INT32 x1, FX_INT32 x2, FX_INT32 x3, + FX_INT32 bits, CFX_ByteString name) +{ + m_characterCountBitsForVersions = characterCountBitsForVersions; + if (m_characterCountBitsForVersions != NULL) { + m_characterCountBitsForVersions[0] = x1; + m_characterCountBitsForVersions[1] = x2; + m_characterCountBitsForVersions[2] = x3; + } + m_name += name; + m_bits = bits; +} +CBC_QRCoderMode::~CBC_QRCoderMode() +{ + if(m_characterCountBitsForVersions != NULL) { + FX_Free(m_characterCountBitsForVersions); + } +} +void CBC_QRCoderMode::Initialize() +{ + sBYTE = FX_NEW CBC_QRCoderMode(FX_Alloc(FX_INT32, 3), 8, 16, 16, 0x4, "BYTE"); + sALPHANUMERIC = FX_NEW CBC_QRCoderMode(FX_Alloc(FX_INT32, 3), 9, 11, 13, 0x2, "ALPHANUMERIC"); + sECI = FX_NEW CBC_QRCoderMode(NULL, 0, 0, 0, 0x7, "ECI"); + sKANJI = FX_NEW CBC_QRCoderMode(FX_Alloc(FX_INT32, 3), 8, 10, 12, 0x8, "KANJI"); + sNUMERIC = FX_NEW CBC_QRCoderMode(FX_Alloc(FX_INT32, 3), 10, 12, 14, 0x1, "NUMERIC"); + sGBK = FX_NEW CBC_QRCoderMode(FX_Alloc(FX_INT32, 3), 8, 10, 12, 0x0D, "GBK"); + sTERMINATOR = FX_NEW CBC_QRCoderMode(FX_Alloc(FX_INT32, 3), 0, 0, 0, 0x00, "TERMINATOR"); + sFNC1_FIRST_POSITION = FX_NEW CBC_QRCoderMode(NULL, 0, 0, 0, 0x05, "FNC1_FIRST_POSITION"); + sFNC1_SECOND_POSITION = FX_NEW CBC_QRCoderMode(NULL, 0, 0, 0, 0x09, "FNC1_SECOND_POSITION"); + sSTRUCTURED_APPEND = FX_NEW CBC_QRCoderMode(FX_Alloc(FX_INT32, 3), 0, 0, 0, 0x03, "STRUCTURED_APPEND"); +} +void CBC_QRCoderMode::Finalize() +{ + delete sBYTE; + delete sALPHANUMERIC; + delete sECI; + delete sKANJI; + delete sNUMERIC; + delete sGBK; + delete sTERMINATOR; + delete sFNC1_FIRST_POSITION; + delete sFNC1_SECOND_POSITION; + delete sSTRUCTURED_APPEND; +} +CBC_QRCoderMode* CBC_QRCoderMode::ForBits(FX_INT32 bits, FX_INT32 &e) +{ + switch (bits) { + case 0x0: + return sTERMINATOR; + case 0x1: + return sNUMERIC; + case 0x2: + return sALPHANUMERIC; + case 0x3: + return sSTRUCTURED_APPEND; + case 0x4: + return sBYTE; + case 0x5: + return sFNC1_FIRST_POSITION; + case 0x7: + return sECI; + case 0x8: + return sKANJI; + case 0x9: + return sFNC1_SECOND_POSITION; + case 0x0D: + return sGBK; + default: { + e = BCExceptionUnsupportedMode; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + } + return NULL; +} +FX_INT32 CBC_QRCoderMode::GetBits() +{ + return m_bits; +} +CFX_ByteString CBC_QRCoderMode::GetName() +{ + return m_name; +} +FX_INT32 CBC_QRCoderMode::GetCharacterCountBits(CBC_QRCoderVersion* version, FX_INT32 &e) +{ + if(m_characterCountBitsForVersions == NULL) { + e = BCExceptionCharacterNotThisMode; + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + } + FX_INT32 number = version->GetVersionNumber(); + FX_INT32 offset; + if(number <= 9) { + offset = 0; + } else if(number <= 26) { + offset = 1; + } else { + offset = 2; + } + return m_characterCountBitsForVersions[offset]; +} +void CBC_QRCoderMode::Destroy() +{ + if(sBYTE) { + delete CBC_QRCoderMode::sBYTE; + sBYTE = NULL; + } + if(sNUMERIC) { + delete CBC_QRCoderMode::sNUMERIC; + sNUMERIC = NULL; + } + if(sALPHANUMERIC) { + delete CBC_QRCoderMode::sALPHANUMERIC; + sALPHANUMERIC = NULL; + } + if(sKANJI) { + delete CBC_QRCoderMode::sKANJI; + sKANJI = NULL; + } + if(sECI) { + delete CBC_QRCoderMode::sECI; + sECI = NULL; + } + if(sGBK) { + delete CBC_QRCoderMode::sGBK; + sGBK = NULL; + } + if(sTERMINATOR) { + delete CBC_QRCoderMode::sTERMINATOR; + sTERMINATOR = NULL; + } + if(sFNC1_FIRST_POSITION) { + delete CBC_QRCoderMode::sFNC1_FIRST_POSITION; + sFNC1_FIRST_POSITION = NULL; + } + if(sFNC1_SECOND_POSITION) { + delete CBC_QRCoderMode::sFNC1_SECOND_POSITION; + sFNC1_SECOND_POSITION = NULL; + } + if(sSTRUCTURED_APPEND) { + delete CBC_QRCoderMode::sSTRUCTURED_APPEND; + sSTRUCTURED_APPEND = NULL; + } +} diff --git a/xfa/src/fxbarcode/src/BC_QRCoderVersion.cpp b/xfa/src/fxbarcode/src/BC_QRCoderVersion.cpp new file mode 100644 index 0000000000..6e1e39e316 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_QRCoderVersion.cpp @@ -0,0 +1,761 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/utils.h" +#include "include/BC_QRCoderECB.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_QRCoderFormatInformation.h" +#include "include/BC_QRCoderErrorCorrectionLevel.h" +#include "include/BC_QRCoderBitVector.h" +#include "include/BC_QRCoderECBlocks.h" +#include "include/BC_QRCoderVersion.h" +const FX_INT32 CBC_QRCoderVersion::VERSION_DECODE_INFO[] = { + 0x07C94, 0x085BC, 0x09A99, 0x0A4D3, 0x0BBF6, + 0x0C762, 0x0D847, 0x0E60D, 0x0F928, 0x10B78, + 0x1145D, 0x12A17, 0x13532, 0x149A6, 0x15683, + 0x168C9, 0x177EC, 0x18EC4, 0x191E1, 0x1AFAB, + 0x1B08E, 0x1CC1A, 0x1D33F, 0x1ED75, 0x1F250, + 0x209D5, 0x216F0, 0x228BA, 0x2379F, 0x24B0B, + 0x2542E, 0x26A64, 0x27541, 0x28C69 +}; +CFX_PtrArray *CBC_QRCoderVersion::VERSION = NULL; +void CBC_QRCoderVersion::Initialize() +{ + VERSION = FX_NEW CFX_PtrArray(); +} +void CBC_QRCoderVersion::Finalize() +{ + for(FX_INT32 i = 0 ; i < VERSION->GetSize(); i++) { + CBC_QRCoderVersion* v = (CBC_QRCoderVersion*)(VERSION->GetAt(i)); + delete v; + } + delete VERSION; +} +CBC_QRCoderVersion::CBC_QRCoderVersion(FX_INT32 versionNumber, + CBC_QRCoderECBlocks* ecBlocks1, + CBC_QRCoderECBlocks* ecBlocks2, + CBC_QRCoderECBlocks* ecBlocks3, + CBC_QRCoderECBlocks* ecBlocks4) +{ + m_versionNumber = versionNumber; + m_ecBlocks.Add(ecBlocks1); + m_ecBlocks.Add(ecBlocks2); + m_ecBlocks.Add(ecBlocks3); + m_ecBlocks.Add(ecBlocks4); + FX_INT32 total = 0; + FX_INT32 ecCodeWords = ecBlocks1->GetECCodeWordsPerBlock(); + CFX_PtrArray* ecbArray = ecBlocks1->GetECBlocks(); + for(FX_INT32 i = 0; i < ecbArray->GetSize(); i++) { + CBC_QRCoderECB* ecBlock = (CBC_QRCoderECB*)((*ecbArray)[i]); + total += ecBlock->GetCount() * (ecBlock->GetDataCodeWords() + ecCodeWords); + } + m_totalCodeWords = total; + switch(versionNumber) { + case 1: + break; + case 2: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(18); + break; + case 3: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(22); + break; + case 4: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(26); + break; + case 5: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(30); + break; + case 6: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(34); + break; + case 7: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(22); + m_alignmentPatternCenters.Add(38); + break; + case 8: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(24); + m_alignmentPatternCenters.Add(42); + break; + case 9: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(26); + m_alignmentPatternCenters.Add(46); + break; + case 10: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(28); + m_alignmentPatternCenters.Add(50); + break; + case 11: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(30); + m_alignmentPatternCenters.Add(54); + break; + case 12: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(32); + m_alignmentPatternCenters.Add(58); + break; + case 13: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(34); + m_alignmentPatternCenters.Add(62); + break; + case 14: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(26); + m_alignmentPatternCenters.Add(46); + m_alignmentPatternCenters.Add(66); + break; + case 15: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(26); + m_alignmentPatternCenters.Add(48); + m_alignmentPatternCenters.Add(70); + break; + case 16: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(26); + m_alignmentPatternCenters.Add(50); + m_alignmentPatternCenters.Add(74); + break; + case 17: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(30); + m_alignmentPatternCenters.Add(54); + m_alignmentPatternCenters.Add(78); + break; + case 18: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(30); + m_alignmentPatternCenters.Add(56); + m_alignmentPatternCenters.Add(82); + break; + case 19: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(30); + m_alignmentPatternCenters.Add(58); + m_alignmentPatternCenters.Add(86); + break; + case 20: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(34); + m_alignmentPatternCenters.Add(62); + m_alignmentPatternCenters.Add(90); + break; + case 21: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(28); + m_alignmentPatternCenters.Add(50); + m_alignmentPatternCenters.Add(72); + m_alignmentPatternCenters.Add(94); + break; + case 22: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(26); + m_alignmentPatternCenters.Add(50); + m_alignmentPatternCenters.Add(74); + m_alignmentPatternCenters.Add(98); + break; + case 23: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(30); + m_alignmentPatternCenters.Add(54); + m_alignmentPatternCenters.Add(74); + m_alignmentPatternCenters.Add(102); + break; + case 24: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(28); + m_alignmentPatternCenters.Add(54); + m_alignmentPatternCenters.Add(80); + m_alignmentPatternCenters.Add(106); + break; + case 25: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(32); + m_alignmentPatternCenters.Add(58); + m_alignmentPatternCenters.Add(84); + m_alignmentPatternCenters.Add(110); + break; + case 26: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(30); + m_alignmentPatternCenters.Add(58); + m_alignmentPatternCenters.Add(86); + m_alignmentPatternCenters.Add(114); + break; + case 27: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(34); + m_alignmentPatternCenters.Add(62); + m_alignmentPatternCenters.Add(90); + m_alignmentPatternCenters.Add(118); + break; + case 28: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(26); + m_alignmentPatternCenters.Add(50); + m_alignmentPatternCenters.Add(74); + m_alignmentPatternCenters.Add(98); + m_alignmentPatternCenters.Add(122); + break; + case 29: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(30); + m_alignmentPatternCenters.Add(54); + m_alignmentPatternCenters.Add(78); + m_alignmentPatternCenters.Add(102); + m_alignmentPatternCenters.Add(126); + break; + case 30: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(26); + m_alignmentPatternCenters.Add(52); + m_alignmentPatternCenters.Add(78); + m_alignmentPatternCenters.Add(104); + m_alignmentPatternCenters.Add(130); + break; + case 31: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(30); + m_alignmentPatternCenters.Add(56); + m_alignmentPatternCenters.Add(82); + m_alignmentPatternCenters.Add(108); + m_alignmentPatternCenters.Add(134); + break; + case 32: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(34); + m_alignmentPatternCenters.Add(60); + m_alignmentPatternCenters.Add(86); + m_alignmentPatternCenters.Add(112); + m_alignmentPatternCenters.Add(138); + break; + case 33: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(30); + m_alignmentPatternCenters.Add(58); + m_alignmentPatternCenters.Add(86); + m_alignmentPatternCenters.Add(114); + m_alignmentPatternCenters.Add(142); + break; + case 34: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(34); + m_alignmentPatternCenters.Add(62); + m_alignmentPatternCenters.Add(90); + m_alignmentPatternCenters.Add(118); + m_alignmentPatternCenters.Add(146); + break; + case 35: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(30); + m_alignmentPatternCenters.Add(54); + m_alignmentPatternCenters.Add(78); + m_alignmentPatternCenters.Add(102); + m_alignmentPatternCenters.Add(126); + m_alignmentPatternCenters.Add(150); + break; + case 36: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(24); + m_alignmentPatternCenters.Add(50); + m_alignmentPatternCenters.Add(76); + m_alignmentPatternCenters.Add(102); + m_alignmentPatternCenters.Add(128); + m_alignmentPatternCenters.Add(154); + break; + case 37: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(28); + m_alignmentPatternCenters.Add(54); + m_alignmentPatternCenters.Add(80); + m_alignmentPatternCenters.Add(106); + m_alignmentPatternCenters.Add(132); + m_alignmentPatternCenters.Add(158); + break; + case 38: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(32); + m_alignmentPatternCenters.Add(58); + m_alignmentPatternCenters.Add(84); + m_alignmentPatternCenters.Add(110); + m_alignmentPatternCenters.Add(136); + m_alignmentPatternCenters.Add(162); + break; + case 39: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(26); + m_alignmentPatternCenters.Add(54); + m_alignmentPatternCenters.Add(82); + m_alignmentPatternCenters.Add(110); + m_alignmentPatternCenters.Add(138); + m_alignmentPatternCenters.Add(166); + break; + case 40: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(30); + m_alignmentPatternCenters.Add(58); + m_alignmentPatternCenters.Add(86); + m_alignmentPatternCenters.Add(114); + m_alignmentPatternCenters.Add(142); + m_alignmentPatternCenters.Add(170); + break; + } +} +CBC_QRCoderVersion::~CBC_QRCoderVersion() +{ + if(m_ecBlocks.GetSize() != 0) { + FX_INT32 itBeg = 0; + FX_INT32 itEnd = m_ecBlocks.GetSize(); + while(itBeg != itEnd) { + delete ( (CBC_QRCoderECBlocks*)(m_ecBlocks[itBeg]) ); + itBeg++; + } + } +} +FX_INT32 CBC_QRCoderVersion::GetVersionNumber() +{ + return m_versionNumber; +} +CFX_Int32Array* CBC_QRCoderVersion::GetAlignmentPatternCenters() +{ + return &m_alignmentPatternCenters; +} +FX_INT32 CBC_QRCoderVersion::GetTotalCodeWords() +{ + return m_totalCodeWords; +} +FX_INT32 CBC_QRCoderVersion::GetDimensionForVersion() +{ + return 17 + 4 * m_versionNumber; +} +CBC_QRCoderECBlocks* CBC_QRCoderVersion::GetECBlocksForLevel(CBC_QRCoderErrorCorrectionLevel *ecLevel) +{ + return (CBC_QRCoderECBlocks*)m_ecBlocks[ecLevel->Ordinal()]; +} +CBC_QRCoderVersion* CBC_QRCoderVersion::GetProvisionalVersionForDimension(FX_INT32 dimension, FX_INT32 &e) +{ + if((dimension % 4) != 1) { + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + CBC_QRCoderVersion* qcv = GetVersionForNumber((dimension - 17) >> 2, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return qcv; +} +CBC_QRCoderVersion* CBC_QRCoderVersion::DecodeVersionInformation(FX_INT32 versionBits, FX_INT32 &e) +{ + FX_INT32 bestDifference = FXSYS_IntMax; + FX_INT32 bestVersion = 0; + for (FX_INT32 i = 0; i < 34; i++) { + FX_INT32 targetVersion = VERSION_DECODE_INFO[i]; + if(targetVersion == versionBits) { + CBC_QRCoderVersion* qcv = GetVersionForNumber(i + 7, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return qcv; + } + FX_INT32 bitsDifference = CBC_QRCoderFormatInformation::NumBitsDiffering(versionBits, targetVersion); + if(bitsDifference < bestDifference) { + bestVersion = i + 7; + bestDifference = bitsDifference; + } + } + if(bestDifference <= 3) { + CBC_QRCoderVersion* qcv = GetVersionForNumber(bestVersion, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return qcv; + } + return NULL; +} +CBC_CommonBitMatrix* CBC_QRCoderVersion::BuildFunctionPattern(FX_INT32 &e) +{ + FX_INT32 dimension = GetDimensionForVersion(); + CBC_CommonBitMatrix* bitMatrix = FX_NEW CBC_CommonBitMatrix(); + bitMatrix->Init(dimension); + bitMatrix->SetRegion(0, 0 , 9, 9, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + bitMatrix->SetRegion(dimension - 8, 0, 8, 9, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + bitMatrix->SetRegion(0, dimension - 8, 9, 8, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + FX_INT32 max = m_alignmentPatternCenters.GetSize(); + for (FX_INT32 x = 0; x < max; x++) { + FX_INT32 i = m_alignmentPatternCenters[x] - 2; + for (FX_INT32 y = 0; y < max; y++) { + if ((x == 0 && (y == 0 || y == max - 1)) || (x == max - 1 && y == 0)) { + continue; + } + bitMatrix->SetRegion(m_alignmentPatternCenters[y] - 2, i, 5, 5, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + } + bitMatrix->SetRegion(6, 9, 1, dimension - 17, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + bitMatrix->SetRegion(9, 6, dimension - 17, 1, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + if (m_versionNumber > 6) { + bitMatrix->SetRegion(dimension - 11, 0, 3, 6, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + bitMatrix->SetRegion(0, dimension - 11, 6, 3, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + return bitMatrix; +} +CBC_QRCoderVersion* CBC_QRCoderVersion::GetVersionForNumber(FX_INT32 versionNumber, FX_INT32 &e) +{ + if(VERSION->GetSize() == 0) { + VERSION->Add(FX_NEW CBC_QRCoderVersion(1, + FX_NEW CBC_QRCoderECBlocks(7, FX_NEW CBC_QRCoderECB(1, 19)), + FX_NEW CBC_QRCoderECBlocks(10, FX_NEW CBC_QRCoderECB(1, 16)), + FX_NEW CBC_QRCoderECBlocks(13, FX_NEW CBC_QRCoderECB(1, 13)), + FX_NEW CBC_QRCoderECBlocks(17, FX_NEW CBC_QRCoderECB(1, 9)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(2, + FX_NEW CBC_QRCoderECBlocks(10, FX_NEW CBC_QRCoderECB(1, 34)), + FX_NEW CBC_QRCoderECBlocks(16, FX_NEW CBC_QRCoderECB(1, 28)), + FX_NEW CBC_QRCoderECBlocks(22, FX_NEW CBC_QRCoderECB(1, 22)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(1, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(3, + FX_NEW CBC_QRCoderECBlocks(15, FX_NEW CBC_QRCoderECB(1, 55)), + FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(1, 44)), + FX_NEW CBC_QRCoderECBlocks(18, FX_NEW CBC_QRCoderECB(2, 17)), + FX_NEW CBC_QRCoderECBlocks(22, FX_NEW CBC_QRCoderECB(2, 13)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(4, + FX_NEW CBC_QRCoderECBlocks(20, FX_NEW CBC_QRCoderECB(1, 80)), + FX_NEW CBC_QRCoderECBlocks(18, FX_NEW CBC_QRCoderECB(2, 32)), + FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(2, 24)), + FX_NEW CBC_QRCoderECBlocks(16, FX_NEW CBC_QRCoderECB(4, 9)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(5, + FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(1, 108)), + FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(2, 43)), + FX_NEW CBC_QRCoderECBlocks(18, FX_NEW CBC_QRCoderECB(2, 15), + FX_NEW CBC_QRCoderECB(2, 16)), + FX_NEW CBC_QRCoderECBlocks(22, FX_NEW CBC_QRCoderECB(2, 11), + FX_NEW CBC_QRCoderECB(2, 12)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(6, + FX_NEW CBC_QRCoderECBlocks(18, FX_NEW CBC_QRCoderECB(2, 68)), + FX_NEW CBC_QRCoderECBlocks(16, FX_NEW CBC_QRCoderECB(4, 27)), + FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(4, 19)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(4, 15)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(7, + FX_NEW CBC_QRCoderECBlocks(20, FX_NEW CBC_QRCoderECB(2, 78)), + FX_NEW CBC_QRCoderECBlocks(18, FX_NEW CBC_QRCoderECB(4, 31)), + FX_NEW CBC_QRCoderECBlocks(18, FX_NEW CBC_QRCoderECB(2, 14), + FX_NEW CBC_QRCoderECB(4, 15)), + FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(4, 13), + FX_NEW CBC_QRCoderECB(1, 14)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(8, + FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(2, 97)), + FX_NEW CBC_QRCoderECBlocks(22, FX_NEW CBC_QRCoderECB(2, 38), + FX_NEW CBC_QRCoderECB(2, 39)), + FX_NEW CBC_QRCoderECBlocks(22, FX_NEW CBC_QRCoderECB(4, 18), + FX_NEW CBC_QRCoderECB(2, 19)), + FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(4, 14), + FX_NEW CBC_QRCoderECB(2, 15)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(9, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(2, 116)), + FX_NEW CBC_QRCoderECBlocks(22, FX_NEW CBC_QRCoderECB(3, 36), + FX_NEW CBC_QRCoderECB(2, 37)), + FX_NEW CBC_QRCoderECBlocks(20, FX_NEW CBC_QRCoderECB(4, 16), + FX_NEW CBC_QRCoderECB(4, 17)), + FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(4, 12), + FX_NEW CBC_QRCoderECB(4, 13)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(10, + FX_NEW CBC_QRCoderECBlocks(18, FX_NEW CBC_QRCoderECB(2, 68), + FX_NEW CBC_QRCoderECB(2, 69)), + FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(4, 43), + FX_NEW CBC_QRCoderECB(1, 44)), + FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(6, 19), + FX_NEW CBC_QRCoderECB(2, 20)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(6, 15), + FX_NEW CBC_QRCoderECB(2, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(11, + FX_NEW CBC_QRCoderECBlocks(20, FX_NEW CBC_QRCoderECB(4, 81)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(1, 50), + FX_NEW CBC_QRCoderECB(4, 51)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(4, 22), + FX_NEW CBC_QRCoderECB(4, 23)), + FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(3, 12), + FX_NEW CBC_QRCoderECB(8, 13)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(12, + FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(2, 92), + FX_NEW CBC_QRCoderECB(2, 93)), + FX_NEW CBC_QRCoderECBlocks(22, FX_NEW CBC_QRCoderECB(6, 36), + FX_NEW CBC_QRCoderECB(2, 37)), + FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(4, 20), + FX_NEW CBC_QRCoderECB(6, 21)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(7, 14), + FX_NEW CBC_QRCoderECB(4, 15)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(13, + FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(4, 107)), + FX_NEW CBC_QRCoderECBlocks(22, FX_NEW CBC_QRCoderECB(8, 37), + FX_NEW CBC_QRCoderECB(1, 38)), + FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(8, 20), + FX_NEW CBC_QRCoderECB(4, 21)), + FX_NEW CBC_QRCoderECBlocks(22, FX_NEW CBC_QRCoderECB(12, 11), + FX_NEW CBC_QRCoderECB(4, 12)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(14, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(3, 115), + FX_NEW CBC_QRCoderECB(1, 116)), + FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(4, 40), + FX_NEW CBC_QRCoderECB(5, 41)), + FX_NEW CBC_QRCoderECBlocks(20, FX_NEW CBC_QRCoderECB(11, 16), + FX_NEW CBC_QRCoderECB(5, 17)), + FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(11, 12), + FX_NEW CBC_QRCoderECB(5, 13)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(15, + FX_NEW CBC_QRCoderECBlocks(22, FX_NEW CBC_QRCoderECB(5, 87), + FX_NEW CBC_QRCoderECB(1, 88)), + FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(5, 41), + FX_NEW CBC_QRCoderECB(5, 42)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(5, 24), + FX_NEW CBC_QRCoderECB(7, 25)), + FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(11, 12), + FX_NEW CBC_QRCoderECB(7, 13)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(16, + FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(5, 98), + FX_NEW CBC_QRCoderECB(1, 99)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(7, 45), + FX_NEW CBC_QRCoderECB(3, 46)), + FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(15, 19), + FX_NEW CBC_QRCoderECB(2, 20)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(3, 15), + FX_NEW CBC_QRCoderECB(13, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(17, + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(1, 107), + FX_NEW CBC_QRCoderECB(5, 108)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(10, 46), + FX_NEW CBC_QRCoderECB(1, 47)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(1, 22), + FX_NEW CBC_QRCoderECB(15, 23)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(2, 14), + FX_NEW CBC_QRCoderECB(17, 15)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(18, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(5, 120), + FX_NEW CBC_QRCoderECB(1, 121)), + FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(9, 43), + FX_NEW CBC_QRCoderECB(4, 44)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(17, 22), + FX_NEW CBC_QRCoderECB(1, 23)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(2, 14), + FX_NEW CBC_QRCoderECB(19, 15)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(19, + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(3, 113), + FX_NEW CBC_QRCoderECB(4, 114)), + FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(3, 44), + FX_NEW CBC_QRCoderECB(11, 45)), + FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(17, 21), + FX_NEW CBC_QRCoderECB(4, 22)), + FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(9, 13), + FX_NEW CBC_QRCoderECB(16, 14)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(20, + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(3, 107), + FX_NEW CBC_QRCoderECB(5, 108)), + FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(3, 41), + FX_NEW CBC_QRCoderECB(13, 42)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(15, 24), + FX_NEW CBC_QRCoderECB(5, 25)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(15, 15), + FX_NEW CBC_QRCoderECB(10, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(21, + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(4, 116), + FX_NEW CBC_QRCoderECB(4, 117)), + FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(17, 42)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(17, 22), + FX_NEW CBC_QRCoderECB(6, 23)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(19, 16), + FX_NEW CBC_QRCoderECB(6, 17)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(22, + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(2, 111), + FX_NEW CBC_QRCoderECB(7, 112)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(17, 46)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(7, 24), + FX_NEW CBC_QRCoderECB(16, 25)), + FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(34, 13)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(23, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(4, 121), + FX_NEW CBC_QRCoderECB(5, 122)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(4, 47), + FX_NEW CBC_QRCoderECB(14, 48)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(11, 24), + FX_NEW CBC_QRCoderECB(14, 25)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(16, 15), + FX_NEW CBC_QRCoderECB(14, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(24, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(6, 117), + FX_NEW CBC_QRCoderECB(4, 118)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(6, 45), + FX_NEW CBC_QRCoderECB(14, 46)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(11, 24), + FX_NEW CBC_QRCoderECB(16, 25)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(30, 16), + FX_NEW CBC_QRCoderECB(2, 17)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(25, + FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(8, 106), + FX_NEW CBC_QRCoderECB(4, 107)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(8, 47), + FX_NEW CBC_QRCoderECB(13, 48)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(7, 24), + FX_NEW CBC_QRCoderECB(22, 25)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(22, 15), + FX_NEW CBC_QRCoderECB(13, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(26, + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(10, 114), + FX_NEW CBC_QRCoderECB(2, 115)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(19, 46), + FX_NEW CBC_QRCoderECB(4, 47)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(28, 22), + FX_NEW CBC_QRCoderECB(6, 23)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(33, 16), + FX_NEW CBC_QRCoderECB(4, 17)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(27, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(8, 122), + FX_NEW CBC_QRCoderECB(4, 123)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(22, 45), + FX_NEW CBC_QRCoderECB(3, 46)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(8, 23), + FX_NEW CBC_QRCoderECB(26, 24)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(12, 15), + FX_NEW CBC_QRCoderECB(28, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(28, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(3, 117), + FX_NEW CBC_QRCoderECB(10, 118)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(3, 45), + FX_NEW CBC_QRCoderECB(23, 46)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(4, 24), + FX_NEW CBC_QRCoderECB(31, 25)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(11, 15), + FX_NEW CBC_QRCoderECB(31, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(29, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(7, 116), + FX_NEW CBC_QRCoderECB(7, 117)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(21, 45), + FX_NEW CBC_QRCoderECB(7, 46)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(1, 23), + FX_NEW CBC_QRCoderECB(37, 24)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(19, 15), + FX_NEW CBC_QRCoderECB(26, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(30, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(5, 115), + FX_NEW CBC_QRCoderECB(10, 116)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(19, 47), + FX_NEW CBC_QRCoderECB(10, 48)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(15, 24), + FX_NEW CBC_QRCoderECB(25, 25)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(23, 15), + FX_NEW CBC_QRCoderECB(25, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(31, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(13, 115), + FX_NEW CBC_QRCoderECB(3, 116)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(2, 46), + FX_NEW CBC_QRCoderECB(29, 47)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(42, 24), + FX_NEW CBC_QRCoderECB(1, 25)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(23, 15), + FX_NEW CBC_QRCoderECB(28, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(32, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(17, 115)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(10, 46), + FX_NEW CBC_QRCoderECB(23, 47)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(10, 24), + FX_NEW CBC_QRCoderECB(35, 25)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(19, 15), + FX_NEW CBC_QRCoderECB(35, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(33, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(17, 115), + FX_NEW CBC_QRCoderECB(1, 116)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(14, 46), + FX_NEW CBC_QRCoderECB(21, 47)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(29, 24), + FX_NEW CBC_QRCoderECB(19, 25)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(11, 15), + FX_NEW CBC_QRCoderECB(46, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(34, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(13, 115), + FX_NEW CBC_QRCoderECB(6, 116)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(14, 46), + FX_NEW CBC_QRCoderECB(23, 47)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(44, 24), + FX_NEW CBC_QRCoderECB(7, 25)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(59, 16), + FX_NEW CBC_QRCoderECB(1, 17)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(35, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(12, 121), + FX_NEW CBC_QRCoderECB(7, 122)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(12, 47), + FX_NEW CBC_QRCoderECB(26, 48)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(39, 24), + FX_NEW CBC_QRCoderECB(14, 25)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(22, 15), + FX_NEW CBC_QRCoderECB(41, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(36, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(6, 121), + FX_NEW CBC_QRCoderECB(14, 122)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(6, 47), + FX_NEW CBC_QRCoderECB(34, 48)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(46, 24), + FX_NEW CBC_QRCoderECB(10, 25)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(2, 15), + FX_NEW CBC_QRCoderECB(64, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(37, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(17, 122), + FX_NEW CBC_QRCoderECB(4, 123)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(29, 46), + FX_NEW CBC_QRCoderECB(14, 47)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(49, 24), + FX_NEW CBC_QRCoderECB(10, 25)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(24, 15), + FX_NEW CBC_QRCoderECB(46, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(38, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(4, 122), + FX_NEW CBC_QRCoderECB(18, 123)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(13, 46), + FX_NEW CBC_QRCoderECB(32, 47)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(48, 24), + FX_NEW CBC_QRCoderECB(14, 25)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(42, 15), + FX_NEW CBC_QRCoderECB(32, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(39, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(20, 117), + FX_NEW CBC_QRCoderECB(4, 118)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(40, 47), + FX_NEW CBC_QRCoderECB(7, 48)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(43, 24), + FX_NEW CBC_QRCoderECB(22, 25)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(10, 15), + FX_NEW CBC_QRCoderECB(67, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(40, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(19, 118), + FX_NEW CBC_QRCoderECB(6, 119)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(18, 47), + FX_NEW CBC_QRCoderECB(31, 48)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(34, 24), + FX_NEW CBC_QRCoderECB(34, 25)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(20, 15), + FX_NEW CBC_QRCoderECB(61, 16)))); + } + if(versionNumber < 1 || versionNumber > 40) { + e = BCExceptionIllegalArgument; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + return (CBC_QRCoderVersion*)(*VERSION)[versionNumber - 1]; +} +void CBC_QRCoderVersion::Destroy() +{ + FX_INT32 i; + for(i = 0; i < VERSION->GetSize(); i++) { + delete ( (CBC_QRCoderVersion*)(*VERSION)[i] ); + } +} diff --git a/xfa/src/fxbarcode/src/BC_QRDataBlock.cpp b/xfa/src/fxbarcode/src/BC_QRDataBlock.cpp new file mode 100644 index 0000000000..4dbe91b3cf --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_QRDataBlock.cpp @@ -0,0 +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 + +#include "barcode.h" +#include "include/BC_QRCoderECBlocks.h" +#include "include/BC_QRCoderECB.h" +#include "include/BC_QRDataBlock.h" +#include "include/BC_QRCoderVersion.h" +CBC_QRDataBlock::CBC_QRDataBlock(FX_INT32 numDataCodewords, CFX_ByteArray *codewords) + : m_numDataCodewords(numDataCodewords) + , m_codewords(codewords) +{ +} +CBC_QRDataBlock::~CBC_QRDataBlock() +{ + if(m_codewords != NULL) { + delete m_codewords; + m_codewords = NULL; + } +} +FX_INT32 CBC_QRDataBlock::GetNumDataCodewords() +{ + return m_numDataCodewords; +} +CFX_ByteArray *CBC_QRDataBlock::GetCodewords() +{ + return m_codewords; +} +CFX_PtrArray *CBC_QRDataBlock::GetDataBlocks(CFX_ByteArray* rawCodewords, CBC_QRCoderVersion *version, CBC_QRCoderErrorCorrectionLevel* ecLevel, FX_INT32 &e) +{ + if(rawCodewords->GetSize() != version->GetTotalCodeWords()) { + e = BCExceptionIllegalArgument; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + CBC_QRCoderECBlocks *ecBlocks = version->GetECBlocksForLevel(ecLevel); + FX_INT32 totalBlocks = 0; + CFX_PtrArray* ecBlockArray = ecBlocks->GetECBlocks(); + FX_INT32 i = 0; + for(i = 0; i < ecBlockArray->GetSize(); i++) { + totalBlocks += ((CBC_QRCoderECB*)(*ecBlockArray)[i])->GetCount(); + } + CFX_PtrArray *datablock = FX_NEW CFX_PtrArray(); + datablock->SetSize(totalBlocks); + CBC_AutoPtr result(datablock); + FX_INT32 numResultBlocks = 0; + for(FX_INT32 j = 0; j < ecBlockArray->GetSize(); j++) { + CBC_QRCoderECB *ecBlock = (CBC_QRCoderECB*)(*ecBlockArray)[j]; + for(FX_INT32 k = 0; k < ecBlock->GetCount(); k++) { + FX_INT32 numDataCodewords = ecBlock->GetDataCodeWords(); + FX_INT32 numBlockCodewords = ecBlocks->GetECCodeWordsPerBlock() + numDataCodewords; + CFX_ByteArray *bytearray = FX_NEW CFX_ByteArray(); + bytearray->SetSize(numBlockCodewords); + (*result)[numResultBlocks++] = FX_NEW CBC_QRDataBlock(numDataCodewords, bytearray); + } + } + FX_INT32 shorterBlocksTotalCodewords = ((CBC_QRDataBlock*)(*result)[0])->m_codewords->GetSize(); + FX_INT32 longerBlocksStartAt = result->GetSize() - 1; + while(longerBlocksStartAt >= 0) { + FX_INT32 numCodewords = ((CBC_QRDataBlock*)(*result)[longerBlocksStartAt])->m_codewords->GetSize(); + if(numCodewords == shorterBlocksTotalCodewords) { + break; + } + longerBlocksStartAt--; + } + longerBlocksStartAt++; + FX_INT32 shorterBlocksNumDataCodewords = shorterBlocksTotalCodewords - ecBlocks->GetECCodeWordsPerBlock(); + FX_INT32 rawCodewordsOffset = 0; + FX_INT32 x = 0; + for(FX_INT32 k = 0; k < shorterBlocksNumDataCodewords; k++) { + for(x = 0; x < numResultBlocks; x++) { + (*(((CBC_QRDataBlock*)(*result)[x])->m_codewords))[k] = (*rawCodewords)[rawCodewordsOffset++]; + } + } + for(x = longerBlocksStartAt; x < numResultBlocks; x++) { + (*(((CBC_QRDataBlock*)(*result)[x])->m_codewords))[shorterBlocksNumDataCodewords] = (*rawCodewords)[rawCodewordsOffset++]; + } + FX_INT32 max = ((CBC_QRDataBlock*)(*result)[0])->m_codewords->GetSize(); + for(i = shorterBlocksNumDataCodewords; i < max; i++) { + for(FX_INT32 y = 0; y < numResultBlocks; y++) { + FX_INT32 iOffset = y < longerBlocksStartAt ? i : i + 1; + (*(((CBC_QRDataBlock*)(*result)[y])->m_codewords))[iOffset] = (*rawCodewords)[rawCodewordsOffset++]; + } + } + return result.release(); +} diff --git a/xfa/src/fxbarcode/src/BC_QRDataMask.cpp b/xfa/src/fxbarcode/src/BC_QRDataMask.cpp new file mode 100644 index 0000000000..ae0807d271 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_QRDataMask.cpp @@ -0,0 +1,133 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_QRDataMask.h" +static FX_INT32 N_DATA_MASKS = 0; +CFX_PtrArray* CBC_QRDataMask::DATA_MASKS = NULL; +void CBC_QRDataMask::Initialize() +{ + DATA_MASKS = FX_NEW CFX_PtrArray(); + N_DATA_MASKS = BuildDataMasks(); +} +void CBC_QRDataMask::Finalize() +{ + Destroy(); + delete DATA_MASKS; +} +void CBC_QRDataMask::Destroy() +{ + FX_INT32 i; + for(i = 0; i < N_DATA_MASKS; i++) { + CBC_QRDataMask* p = (CBC_QRDataMask*)(*DATA_MASKS)[i]; + if (p) { + delete p; + } + } +} +void CBC_QRDataMask::UnmaskBitMatirx(CBC_CommonBitMatrix *bits, FX_INT32 dimension) +{ + for(FX_INT32 i = 0; i < dimension; i++) { + for(FX_INT32 j = 0; j < dimension; j++) { + if(IsMasked(i, j)) { + bits->Flip(j, i); + } + } + } +} +CBC_QRDataMask* CBC_QRDataMask::ForReference(FX_INT32 reference, FX_INT32 &e) +{ + if(reference < 0 || reference > 7) { + e = BCExceptionReferenceMustBeBetween0And7; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + return (CBC_QRDataMask*)(*DATA_MASKS)[reference]; +} +class DataMask000 : public CBC_QRDataMask +{ +public: + FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y) + { + return ((x + y) % 2) == 0; + } +}; +class DataMask001 : public CBC_QRDataMask +{ +public: + FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y) + { + return (x % 2) == 0; + } +}; +class DataMask010 : public CBC_QRDataMask +{ +public: + FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y) + { + return y % 3 == 0; + } +}; +class DataMask011 : public CBC_QRDataMask +{ +public: + FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y) + { + return (x + y) % 3 == 0; + } +}; +class DataMask100 : public CBC_QRDataMask +{ +public: + FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y) + { + return (((x >> 1) + (y / 3)) % 2) == 0; + } +}; +class DataMask101 : public CBC_QRDataMask +{ +public: + FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y) + { + size_t temp = x * y; + return (temp % 2) + (temp % 3) == 0; + } +}; +class DataMask110 : public CBC_QRDataMask +{ +public: + FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y) + { + size_t temp = x * y; + return (((temp % 2) + (temp % 3)) % 2) == 0; + } +}; +class DataMask111 : public CBC_QRDataMask +{ +public: + FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y) + { + return ((((x + y) % 2) + ((x * y) % 3)) % 2) == 0; + } +}; +FX_INT32 CBC_QRDataMask::BuildDataMasks() +{ + DATA_MASKS->Add(FX_NEW DataMask000); + DATA_MASKS->Add(FX_NEW DataMask001); + DATA_MASKS->Add(FX_NEW DataMask010); + DATA_MASKS->Add(FX_NEW DataMask011); + DATA_MASKS->Add(FX_NEW DataMask100); + DATA_MASKS->Add(FX_NEW DataMask101); + DATA_MASKS->Add(FX_NEW DataMask110); + DATA_MASKS->Add(FX_NEW DataMask111); + return DATA_MASKS->GetSize(); +} +CBC_QRDataMask::CBC_QRDataMask() +{ +} +CBC_QRDataMask::~CBC_QRDataMask() +{ +} diff --git a/xfa/src/fxbarcode/src/BC_QRDecodedBitStreamParser.cpp b/xfa/src/fxbarcode/src/BC_QRDecodedBitStreamParser.cpp new file mode 100644 index 0000000000..cb1cfb09e7 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_QRDecodedBitStreamParser.cpp @@ -0,0 +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 + +#include "barcode.h" +#include "include/BC_QRCoderMode.h" +#include "include/BC_CommonBitSource.h" +#include "include/BC_CommonECI.h" +#include "include/BC_QRDecodedBitStreamParser.h" +#include "include/BC_CommonCharacterSetECI.h" +#include "include/BC_CommonDecoderResult.h" +#include "include/BC_UtilCodingConvert.h" +FX_LPCSTR CBC_QRDecodedBitStreamParser::UTF_8 = "utf8"; +const FX_CHAR CBC_QRDecodedBitStreamParser::ALPHANUMERIC_CHARS[45] = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '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', + ' ', '$', '%', '*', '+', '-', '.', '/', ':' +}; +CBC_QRDecodedBitStreamParser::CBC_QRDecodedBitStreamParser() +{ +} +CBC_QRDecodedBitStreamParser::~CBC_QRDecodedBitStreamParser() +{ +} +CBC_CommonDecoderResult* CBC_QRDecodedBitStreamParser::Decode(CFX_ByteArray *bytes, CBC_QRCoderVersion *version, + CBC_QRCoderErrorCorrectionLevel* ecLevel, FX_INT32 byteModeDecode, FX_INT32 &e) +{ + CBC_CommonBitSource bits(bytes); + CFX_ByteString result; + CBC_CommonCharacterSetECI* currentCharacterSetECI = NULL; + FX_BOOL fc1Infact = FALSE; + CFX_Int32Array byteSegments; + CBC_QRCoderMode* mode = NULL; + do { + if(bits.Available() < 4) { + mode = CBC_QRCoderMode::sTERMINATOR; + } else { + FX_INT32 iTemp1 = bits.ReadBits(4, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + mode = CBC_QRCoderMode::ForBits(iTemp1, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + if(mode == NULL) { + e = BCExceptionUnSupportMode; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + } + if(!(mode == CBC_QRCoderMode::sTERMINATOR)) { + if(mode == CBC_QRCoderMode::sFNC1_FIRST_POSITION || mode == CBC_QRCoderMode::sFNC1_SECOND_POSITION) { + fc1Infact = TRUE; + } else if(mode == CBC_QRCoderMode::sSTRUCTURED_APPEND) { + bits.ReadBits(16, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } else if(mode == CBC_QRCoderMode::sECI) { + FX_INT32 value = ParseECIValue(&bits, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + currentCharacterSetECI = CBC_CommonCharacterSetECI::GetCharacterSetECIByValue(value); + } else { + if(mode == CBC_QRCoderMode::sGBK) { + bits.ReadBits(4, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + FX_INT32 numBits = mode->GetCharacterCountBits(version, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + FX_INT32 count = bits.ReadBits(numBits, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + if(mode == CBC_QRCoderMode::sNUMERIC) { + DecodeNumericSegment(&bits, result, count, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } else if(mode == CBC_QRCoderMode::sALPHANUMERIC) { + DecodeAlphanumericSegment(&bits, result, count, fc1Infact, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } else if(mode == CBC_QRCoderMode::sBYTE) { + DecodeByteSegment(&bits, result, count, currentCharacterSetECI, &byteSegments, byteModeDecode, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } else if(mode == CBC_QRCoderMode::sGBK) { + DecodeGBKSegment(&bits, result, count, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } else if(mode == CBC_QRCoderMode::sKANJI) { + DecodeKanjiSegment(&bits, result, count, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } else { + e = BCExceptionUnSupportMode; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + } + } + } while (!(mode == CBC_QRCoderMode::sTERMINATOR)); + CBC_CommonDecoderResult *tempCd = FX_NEW CBC_CommonDecoderResult(); + tempCd->Init(*bytes, result, byteSegments, ecLevel, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return tempCd; +} +void CBC_QRDecodedBitStreamParser::DecodeGBKSegment(CBC_CommonBitSource* bits, CFX_ByteString &result, FX_INT32 count, FX_INT32 &e) +{ + CFX_ByteString buffer; + FX_INT32 offset = 0; + while (count > 0) { + FX_INT32 twoBytes = bits->ReadBits(13, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + FX_INT32 assembledTwoBytes = ((twoBytes / 0x060) << 8) | (twoBytes % 0x060); + if (assembledTwoBytes <= 0x0095d) { + assembledTwoBytes += 0x0a1a1; + } else { + assembledTwoBytes += 0x0a6a1; + } + buffer += (FX_BYTE) (assembledTwoBytes >> 8); + buffer += (FX_BYTE) assembledTwoBytes; + count--; + } + CBC_UtilCodingConvert::LocaleToUtf8(buffer, result); +} +void CBC_QRDecodedBitStreamParser::DecodeKanjiSegment(CBC_CommonBitSource* bits, CFX_ByteString &result, FX_INT32 count, FX_INT32 &e) +{ + CFX_ByteString buffer; + while (count > 0) { + FX_INT32 twoBytes = bits->ReadBits(13, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + FX_INT32 assembledTwoBytes = ((twoBytes / 0x0c0) << 8) | (twoBytes % 0x0c0); + if (assembledTwoBytes <= 0x01f00) { + assembledTwoBytes += 0x08140; + } else { + assembledTwoBytes += 0x0c140; + } + buffer += (FX_BYTE) (assembledTwoBytes >> 8); + buffer += (FX_BYTE) assembledTwoBytes; + count--; + } + CBC_UtilCodingConvert::LocaleToUtf8(buffer, result); +} +void CBC_QRDecodedBitStreamParser::DecodeByteSegment(CBC_CommonBitSource* bits, CFX_ByteString &result, FX_INT32 count, + CBC_CommonCharacterSetECI *currentCharacterSetECI, + CFX_Int32Array *byteSegments, FX_INT32 byteModeDecode, FX_INT32 &e) +{ + if(count < 0) { + e = BCExceptionNotFound; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + if((count << 3) > bits->Available()) { + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + FX_BYTE *readBytes = FX_Alloc(FX_BYTE, count); + FXSYS_memset32(readBytes, 0x00, count); + for(FX_INT32 i = 0; i < count; i++) { + readBytes[i] = (FX_BYTE) bits->ReadBits(8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + CFX_ByteString bs(readBytes, count); + result += bs; + FX_Free(readBytes); +} +void CBC_QRDecodedBitStreamParser::DecodeAlphanumericSegment(CBC_CommonBitSource* bits, + CFX_ByteString &result, FX_INT32 count, FX_BOOL fac1InEffect, FX_INT32 &e) +{ + FX_INT32 start = result.GetLength(); + while(count > 1) { + FX_INT32 nextTwoCharsBits = bits->ReadBits(11, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[nextTwoCharsBits / 45]); + BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[nextTwoCharsBits % 45]); + count -= 2; + } + if(count == 1) { + FX_INT32 itemp = bits->ReadBits(6, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[itemp]); + } + if(fac1InEffect) { + for(FX_INT32 i = start; i < result.GetLength(); i++) { + if(result[i] == '%') { + if((i < result.GetLength() - 1) && result[i + 1] == '%') { + result.Delete(i + 1, 1); + } else { + result.SetAt(i, (FX_CHAR)0x1d); + } + } + } + } +} +void CBC_QRDecodedBitStreamParser::DecodeNumericSegment(CBC_CommonBitSource* bits, CFX_ByteString &result, FX_INT32 count, FX_INT32 &e) +{ + while(count >= 3) { + FX_INT32 threeDigitsBits = bits->ReadBits(10, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + if(threeDigitsBits >= 1000) { + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[threeDigitsBits / 100]); + BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[(threeDigitsBits / 10) % 10]); + BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[threeDigitsBits % 10]); + count -= 3; + } + if(count == 2) { + FX_INT32 twoDigitBits = bits->ReadBits(7, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + if(twoDigitBits >= 100) { + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[twoDigitBits / 10]); + BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[twoDigitBits % 10]); + } else if(count == 1) { + FX_INT32 digitBits = bits->ReadBits(4, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + if(digitBits >= 10) { + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[digitBits]); + } +} +const CFX_ByteString CBC_QRDecodedBitStreamParser::GuessEncoding(CFX_ByteArray *bytes) +{ + return *UTF_8; +} +FX_INT32 CBC_QRDecodedBitStreamParser::ParseECIValue(CBC_CommonBitSource* bits, FX_INT32 &e) +{ + FX_INT32 firstByte = bits->ReadBits(8, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + if((firstByte & 0x80) == 0) { + return firstByte & 0x7f; + } else if((firstByte & 0xc0) == 0x80) { + FX_INT32 secondByte = bits->ReadBits(8, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + return ((firstByte & 0x3f) << 8) | secondByte; + } else if((firstByte & 0xe0) == 0xc0) { + FX_INT32 secondThirdByte = bits->ReadBits(16, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + return ((firstByte & 0x1f) << 16) | secondThirdByte; + } + e = BCExceptionBadECI; + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + return 0; +} diff --git a/xfa/src/fxbarcode/src/BC_QRDetector.cpp b/xfa/src/fxbarcode/src/BC_QRDetector.cpp new file mode 100644 index 0000000000..54abaaef30 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_QRDetector.cpp @@ -0,0 +1,248 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_ResultPoint.h" +#include "include/BC_QRFinderPattern.h" +#include "include/BC_QRCoderVersion.h" +#include "include/BC_FinderPatternInfo.h" +#include "include/BC_QRGridSampler.h" +#include "include/BC_QRAlignmentPatternFinder.h" +#include "include/BC_QRFinderPatternFinder.h" +#include "include/BC_QRDetectorResult.h" +#include "include/BC_QRDetector.h" +CBC_QRDetector::CBC_QRDetector(CBC_CommonBitMatrix *image): m_image(image) +{ +} +CBC_QRDetector::~CBC_QRDetector() +{ +} +CBC_QRDetectorResult *CBC_QRDetector::Detect(FX_INT32 hints, FX_INT32 &e) +{ + CBC_QRFinderPatternFinder finder(m_image); + CBC_QRFinderPatternInfo* qpi = finder.Find(hints, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr info(qpi); + CBC_QRDetectorResult* qdr = ProcessFinderPatternInfo(info.get(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return qdr; +} +CBC_QRDetectorResult* CBC_QRDetector::ProcessFinderPatternInfo(CBC_QRFinderPatternInfo *info, FX_INT32 &e) +{ + CBC_AutoPtr topLeft(info->GetTopLeft()); + CBC_AutoPtr topRight(info->GetTopRight()); + CBC_AutoPtr bottomLeft(info->GetBottomLeft()); + FX_FLOAT moduleSize = CalculateModuleSize(topLeft.get(), topRight.get(), bottomLeft.get()); + if(moduleSize < 1.0f) { + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + FX_INT32 dimension = ComputeDimension(topLeft.get(), topRight.get(), bottomLeft.get(), moduleSize, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_QRCoderVersion *provisionalVersion = CBC_QRCoderVersion::GetProvisionalVersionForDimension(dimension, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + FX_INT32 modulesBetweenFPCenters = provisionalVersion->GetDimensionForVersion() - 7; + CBC_QRAlignmentPattern * alignmentPattern = NULL; + if(provisionalVersion->GetAlignmentPatternCenters()->GetSize() > 0) { + FX_FLOAT bottomRightX = topRight->GetX() - topLeft->GetX() + bottomLeft->GetX(); + FX_FLOAT bottomRightY = topRight->GetY() - topLeft->GetY() + bottomLeft->GetY(); + FX_FLOAT correctionToTopLeft = 1.0f - 3.0f / (FX_FLOAT) modulesBetweenFPCenters; + FX_FLOAT xtemp = (topLeft->GetX() + correctionToTopLeft * (bottomRightX - topLeft->GetX())); + FX_INT32 estAlignmentX = (FX_INT32)xtemp ; + FX_FLOAT ytemp = (topLeft->GetY() + correctionToTopLeft * (bottomRightY - topLeft->GetY())); + FX_INT32 estAlignmentY = (FX_INT32)ytemp; + for(FX_INT32 i = 4; i <= 16; i <<= 1) { + CBC_QRAlignmentPattern *temp = FindAlignmentInRegion(moduleSize, estAlignmentX, estAlignmentY, (FX_FLOAT) i, e); + alignmentPattern = temp; + break; + } + } + CBC_CommonBitMatrix *bits = SampleGrid(m_image, topLeft.get(), topRight.get(), bottomLeft.get(), (CBC_ResultPoint*)(alignmentPattern), dimension, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CFX_PtrArray *points = FX_NEW CFX_PtrArray; + if(alignmentPattern == NULL) { + points->Add(bottomLeft.release()); + points->Add(topLeft.release()); + points->Add(topRight.release()); + } else { + points->Add(bottomLeft.release()); + points->Add(topLeft.release()); + points->Add(topRight.release()); + points->Add(alignmentPattern); + } + return FX_NEW CBC_QRDetectorResult(bits, points); +} +CBC_CommonBitMatrix *CBC_QRDetector::SampleGrid(CBC_CommonBitMatrix *image, CBC_ResultPoint *topLeft, CBC_ResultPoint *topRight, + CBC_ResultPoint *bottomLeft, CBC_ResultPoint* alignmentPattern, + FX_INT32 dimension, FX_INT32 &e) +{ + FX_FLOAT dimMinusThree = (FX_FLOAT) dimension - 3.5f; + FX_FLOAT bottomRightX; + FX_FLOAT bottomRightY; + FX_FLOAT sourceBottomRightX; + FX_FLOAT sourceBottomRightY; + if (alignmentPattern != NULL) { + bottomRightX = alignmentPattern->GetX(); + bottomRightY = alignmentPattern->GetY(); + sourceBottomRightX = sourceBottomRightY = dimMinusThree - 3.0f; + } else { + bottomRightX = (topRight->GetX() - topLeft->GetX()) + bottomLeft->GetX(); + bottomRightY = (topRight->GetY() - topLeft->GetY()) + bottomLeft->GetY(); + sourceBottomRightX = sourceBottomRightY = dimMinusThree; + } + CBC_QRGridSampler &sampler = CBC_QRGridSampler::GetInstance(); + CBC_CommonBitMatrix* cbm = sampler.SampleGrid(image, + dimension, dimension, + 3.5f, + 3.5f, + dimMinusThree, + 3.5f, + sourceBottomRightX, + sourceBottomRightY, + 3.5f, + dimMinusThree, + topLeft->GetX(), + topLeft->GetY(), + topRight->GetX(), + topRight->GetY(), + bottomRightX, + bottomRightY, + bottomLeft->GetX(), + bottomLeft->GetY(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return cbm; +} +FX_INT32 CBC_QRDetector::ComputeDimension(CBC_ResultPoint *topLeft, CBC_ResultPoint *topRight, + CBC_ResultPoint *bottomLeft, FX_FLOAT moduleSize, FX_INT32 &e) +{ + FX_INT32 tltrCentersDimension = Round(CBC_QRFinderPatternFinder::Distance(topLeft, topRight) / moduleSize); + FX_INT32 tlblCentersDimension = Round(CBC_QRFinderPatternFinder::Distance(topLeft, bottomLeft) / moduleSize); + FX_INT32 dimension = ((tltrCentersDimension + tlblCentersDimension) >> 1) + 7; + switch(dimension & 0x03) { + case 0: + dimension++; + break; + case 2: + dimension--; + break; + case 3: { + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + } + } + return dimension; +} +FX_FLOAT CBC_QRDetector::CalculateModuleSize(CBC_ResultPoint *topLeft, CBC_ResultPoint *topRight, CBC_ResultPoint *bottomLeft) +{ + return (CalculateModuleSizeOneWay(topLeft, topRight) + CalculateModuleSizeOneWay(topLeft, bottomLeft)) / 2.0f; +} +FX_FLOAT CBC_QRDetector::CalculateModuleSizeOneWay(CBC_ResultPoint *pattern, CBC_ResultPoint *otherPattern) +{ + FX_FLOAT moduleSizeEst1 = SizeOfBlackWhiteBlackRunBothWays((FX_INT32) pattern->GetX(), + (FX_INT32) pattern->GetY(), + (FX_INT32) otherPattern->GetX(), + (FX_INT32) otherPattern->GetY()); + FX_FLOAT moduleSizeEst2 = SizeOfBlackWhiteBlackRunBothWays((FX_INT32) otherPattern->GetX(), + (FX_INT32) otherPattern->GetY(), + (FX_INT32) pattern->GetX(), + (FX_INT32) pattern->GetY()); + if (FXSYS_isnan(moduleSizeEst1)) { + return moduleSizeEst2; + } + if (FXSYS_isnan(moduleSizeEst2)) { + return moduleSizeEst1; + } + return (moduleSizeEst1 + moduleSizeEst2) / 14.0f; +} +FX_INT32 CBC_QRDetector::Round(FX_FLOAT d) +{ + return (FX_INT32)(d + 0.5f); +} +FX_FLOAT CBC_QRDetector::SizeOfBlackWhiteBlackRunBothWays(FX_INT32 fromX, FX_INT32 fromY, FX_INT32 toX, FX_INT32 toY) +{ + FX_FLOAT result = SizeOfBlackWhiteBlackRun(fromX, fromY, toX, toY); + FX_INT32 otherToX = fromX - (toX - fromX); + if (otherToX < 0) { + otherToX = -1; + } else if (otherToX >= m_image->GetWidth()) { + otherToX = m_image->GetWidth(); + } + FX_INT32 otherToY = fromY - (toY - fromY); + if (otherToY < 0) { + otherToY = -1; + } else if (otherToY >= m_image->GetHeight()) { + otherToY = m_image->GetHeight(); + } + result += SizeOfBlackWhiteBlackRun(fromX, fromY, otherToX, otherToY); + return result - 1.0f; +} +FX_FLOAT CBC_QRDetector::SizeOfBlackWhiteBlackRun(FX_INT32 fromX, FX_INT32 fromY, FX_INT32 toX, FX_INT32 toY) +{ + FX_BOOL steep = FXSYS_abs(toY - fromY) > FXSYS_abs(toX - fromX); + if (steep) { + FX_INT32 temp = fromX; + fromX = fromY; + fromY = temp; + temp = toX; + toX = toY; + toY = temp; + } + FX_INT32 dx = FXSYS_abs(toX - fromX); + FX_INT32 dy = FXSYS_abs(toY - fromY); + FX_INT32 error = -dx >> 1; + FX_INT32 ystep = fromY < toY ? 1 : -1; + FX_INT32 xstep = fromX < toX ? 1 : -1; + FX_INT32 state = 0; + for (FX_INT32 x = fromX, y = fromY; x != toX; x += xstep) { + FX_INT32 realX = steep ? y : x; + FX_INT32 realY = steep ? x : y; + if (state == 1) { + if (m_image->Get(realX, realY)) { + state++; + } + } else { + if (!m_image->Get(realX, realY)) { + state++; + } + } + if (state == 3) { + FX_INT32 diffX = x - fromX; + FX_INT32 diffY = y - fromY; + return (FX_FLOAT) sqrt((double) (diffX * diffX + diffY * diffY)); + } + error += dy; + if (error > 0) { + y += ystep; + error -= dx; + } + } + FX_INT32 diffX = toX - fromX; + FX_INT32 diffY = toY - fromY; + return (FX_FLOAT) sqrt((double) (diffX * diffX + diffY * diffY)); +} +CBC_QRAlignmentPattern *CBC_QRDetector::FindAlignmentInRegion(FX_FLOAT overallEstModuleSize, FX_INT32 estAlignmentX, + FX_INT32 estAlignmentY, FX_FLOAT allowanceFactor, FX_INT32 &e) +{ + FX_INT32 allowance = (FX_INT32) (allowanceFactor * overallEstModuleSize); + FX_INT32 alignmentAreaLeftX = FX_MAX(0, estAlignmentX - allowance); + FX_INT32 alignmentAreaRightX = FX_MIN(m_image->GetWidth() - 1, estAlignmentX + allowance); + if (alignmentAreaRightX - alignmentAreaLeftX < overallEstModuleSize * 3) { + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + FX_INT32 alignmentAreaTopY = FX_MAX(0, estAlignmentY - allowance); + FX_INT32 alignmentAreaBottomY = FX_MIN(m_image->GetHeight() - 1, estAlignmentY + allowance); + CBC_QRAlignmentPatternFinder alignmentFinder(m_image, + alignmentAreaLeftX, + alignmentAreaTopY, + alignmentAreaRightX - alignmentAreaLeftX, + alignmentAreaBottomY - alignmentAreaTopY, + overallEstModuleSize); + CBC_QRAlignmentPattern *qap = alignmentFinder.Find(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return qap; +} diff --git a/xfa/src/fxbarcode/src/BC_QRDetectorResult.cpp b/xfa/src/fxbarcode/src/BC_QRDetectorResult.cpp new file mode 100644 index 0000000000..1b7b03814d --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_QRDetectorResult.cpp @@ -0,0 +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 + +#include "barcode.h" +#include "include/BC_ResultPoint.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_QRDetectorResult.h" +CBC_QRDetectorResult::CBC_QRDetectorResult(CBC_CommonBitMatrix *bits, CFX_PtrArray *points): + m_bits(bits), m_points(points) +{ +} +CBC_QRDetectorResult::~CBC_QRDetectorResult() +{ + for(FX_INT32 i = 0; i < m_points->GetSize(); i++) { + delete (CBC_ResultPoint*) (*m_points)[i]; + } + m_points->RemoveAll(); + delete m_points; + m_points = NULL; + if(m_bits != NULL) { + delete m_bits; + } + m_bits = NULL; +} +CBC_CommonBitMatrix* CBC_QRDetectorResult::GetBits() +{ + return m_bits; +} +CFX_PtrArray *CBC_QRDetectorResult::GetPoints() +{ + return m_points; +} diff --git a/xfa/src/fxbarcode/src/BC_QRFinderPattern.cpp b/xfa/src/fxbarcode/src/BC_QRFinderPattern.cpp new file mode 100644 index 0000000000..90222d301a --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_QRFinderPattern.cpp @@ -0,0 +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 "barcode.h" +#include "include/BC_ResultPoint.h" +#include "include/BC_QRFinderPattern.h" +CBC_QRFinderPattern::CBC_QRFinderPattern(FX_FLOAT x, FX_FLOAT posY, FX_FLOAT estimatedModuleSize): + CBC_ResultPoint(x, posY), + m_estimatedModuleSize(estimatedModuleSize), m_count(1) +{ +} +CBC_QRFinderPattern::~CBC_QRFinderPattern() +{ + m_count = 0; + m_x = 0.0f; + m_y = 0.0f; + m_estimatedModuleSize = 0.0f; +} +CBC_QRFinderPattern *CBC_QRFinderPattern::Clone() +{ + CBC_QRFinderPattern *temp = FX_NEW CBC_QRFinderPattern(m_x, m_y, m_estimatedModuleSize); + temp->m_count = m_count; + return temp; +} +FX_FLOAT CBC_QRFinderPattern::GetEstimatedModuleSize() +{ + return m_estimatedModuleSize; +} +FX_INT32 CBC_QRFinderPattern::GetCount() +{ + return m_count; +} +void CBC_QRFinderPattern::IncrementCount() +{ + m_count++; +} +FX_BOOL CBC_QRFinderPattern::AboutEquals(FX_FLOAT moduleSize, FX_FLOAT i, FX_FLOAT j) +{ + if((fabs(i - GetY()) <= moduleSize) && (fabs(j - GetX()) <= moduleSize)) { + FX_FLOAT moduleSizeDiff = fabs(moduleSize - m_estimatedModuleSize); + return (moduleSizeDiff <= 1.0f) || (moduleSizeDiff / m_estimatedModuleSize <= 1.0f); + } + return false; +} +FX_FLOAT CBC_QRFinderPattern::GetX() +{ + return m_x; +} +FX_FLOAT CBC_QRFinderPattern::GetY() +{ + return m_y; +} diff --git a/xfa/src/fxbarcode/src/BC_QRFinderPatternFinder.cpp b/xfa/src/fxbarcode/src/BC_QRFinderPatternFinder.cpp new file mode 100644 index 0000000000..1f5f05a2a6 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_QRFinderPatternFinder.cpp @@ -0,0 +1,435 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_ResultPoint.h" +#include "include/BC_QRFinderPatternFinder.h" +#include "include/BC_FinderPatternInfo.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_QRFinderPattern.h" +const FX_INT32 CBC_QRFinderPatternFinder::CENTER_QUORUM = 2; +const FX_INT32 CBC_QRFinderPatternFinder::MIN_SKIP = 3; +const FX_INT32 CBC_QRFinderPatternFinder::MAX_MODULES = 57; +const FX_INT32 CBC_QRFinderPatternFinder::INTEGER_MATH_SHIFT = 8; +CBC_QRFinderPatternFinder::CBC_QRFinderPatternFinder(CBC_CommonBitMatrix* image) +{ + m_image = image; + m_crossCheckStateCount.SetSize(5); + m_hasSkipped = FALSE; +} +CBC_QRFinderPatternFinder::~CBC_QRFinderPatternFinder() +{ + for(FX_INT32 i = 0; i < m_possibleCenters.GetSize(); i++) { + delete (CBC_QRFinderPattern*)m_possibleCenters[i]; + } + m_possibleCenters.RemoveAll(); +} +class ClosestToAverageComparator +{ +private: + FX_FLOAT m_averageModuleSize; +public: + ClosestToAverageComparator(FX_FLOAT averageModuleSize) : m_averageModuleSize(averageModuleSize) + { + } + FX_INT32 operator()(FinderPattern *a, FinderPattern *b) + { + FX_FLOAT dA = (FX_FLOAT)fabs(a->GetEstimatedModuleSize() - m_averageModuleSize); + FX_FLOAT dB = (FX_FLOAT)fabs(b->GetEstimatedModuleSize() - m_averageModuleSize); + return dA < dB ? -1 : dA > dB ? 1 : 0; + } +}; +class CenterComparator +{ +public: + FX_INT32 operator()(FinderPattern *a, FinderPattern *b) + { + return b->GetCount() - a->GetCount(); + } +}; +CBC_CommonBitMatrix *CBC_QRFinderPatternFinder::GetImage() +{ + return m_image; +} +CFX_Int32Array &CBC_QRFinderPatternFinder::GetCrossCheckStateCount() +{ + m_crossCheckStateCount[0] = 0; + m_crossCheckStateCount[1] = 0; + m_crossCheckStateCount[2] = 0; + m_crossCheckStateCount[3] = 0; + m_crossCheckStateCount[4] = 0; + return m_crossCheckStateCount; +} +CFX_PtrArray *CBC_QRFinderPatternFinder::GetPossibleCenters() +{ + return &m_possibleCenters; +} +CBC_QRFinderPatternInfo* CBC_QRFinderPatternFinder::Find(FX_INT32 hint, FX_INT32 &e) +{ + FX_INT32 maxI = m_image->GetHeight(); + FX_INT32 maxJ = m_image->GetWidth(); + FX_INT32 iSkip = (3 * maxI) / (4 * MAX_MODULES); + if(iSkip < MIN_SKIP || 0) { + iSkip = MIN_SKIP; + } + FX_BOOL done = FALSE; + CFX_Int32Array stateCount; + stateCount.SetSize(5); + for(FX_INT32 i = iSkip - 1; i < maxI && !done; i += iSkip) { + stateCount[0] = 0; + stateCount[1] = 0; + stateCount[2] = 0; + stateCount[3] = 0; + stateCount[4] = 0; + FX_INT32 currentState = 0; + for(FX_INT32 j = 0; j < maxJ; j++) { + if(m_image->Get(j, i)) { + if((currentState & 1) == 1) { + currentState++; + } + stateCount[currentState]++; + } else { + if((currentState & 1) == 0) { + if(currentState == 4) { + if(FoundPatternCross(stateCount)) { + FX_BOOL confirmed = HandlePossibleCenter(stateCount, i, j); + if(confirmed) { + iSkip = 2; + if(m_hasSkipped) { + done = HaveMultiplyConfirmedCenters(); + } else { + FX_INT32 rowSkip = FindRowSkip(); + if(rowSkip > stateCount[2]) { + i += rowSkip - stateCount[2] - iSkip; + j = maxJ - 1; + } + } + } else { + do { + j++; + } while (j < maxJ && !m_image->Get(j, i)); + j--; + } + currentState = 0; + stateCount[0] = 0; + stateCount[1] = 0; + stateCount[2] = 0; + stateCount[3] = 0; + stateCount[4] = 0; + } else { + stateCount[0] = stateCount[2]; + stateCount[1] = stateCount[3]; + stateCount[2] = stateCount[4]; + stateCount[3] = 1; + stateCount[4] = 0; + currentState = 3; + } + } else { + stateCount[++currentState]++; + } + } else { + stateCount[currentState]++; + } + } + } + if(FoundPatternCross(stateCount)) { + FX_BOOL confirmed = HandlePossibleCenter(stateCount, i, maxJ); + if(confirmed) { + iSkip = stateCount[0]; + if(m_hasSkipped) { + done = HaveMultiplyConfirmedCenters(); + } + } + } + } + CFX_PtrArray* ptr = SelectBestpatterns(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr patternInfo(ptr); + OrderBestPatterns(patternInfo.get()); + return new CBC_QRFinderPatternInfo(patternInfo.get()); +} +void CBC_QRFinderPatternFinder::OrderBestPatterns(CFX_PtrArray *patterns) +{ + FX_FLOAT abDistance = Distance((CBC_ResultPoint*)(*patterns)[0], (CBC_ResultPoint*)(*patterns)[1]); + FX_FLOAT bcDistance = Distance((CBC_ResultPoint*)(*patterns)[1], (CBC_ResultPoint*)(*patterns)[2]); + FX_FLOAT acDistance = Distance((CBC_ResultPoint*)(*patterns)[0], (CBC_ResultPoint*)(*patterns)[2]); + CBC_QRFinderPattern *topLeft, *topRight, *bottomLeft; + if (bcDistance >= abDistance && bcDistance >= acDistance) { + topLeft = (CBC_QRFinderPattern *)(*patterns)[0]; + topRight = (CBC_QRFinderPattern *)(*patterns)[1]; + bottomLeft = (CBC_QRFinderPattern *)(*patterns)[2]; + } else if (acDistance >= bcDistance && acDistance >= abDistance) { + topLeft = (CBC_QRFinderPattern *)(*patterns)[1]; + topRight = (CBC_QRFinderPattern *)(*patterns)[0]; + bottomLeft = (CBC_QRFinderPattern *)(*patterns)[2]; + } else { + topLeft = (CBC_QRFinderPattern *)(*patterns)[2]; + topRight = (CBC_QRFinderPattern *)(*patterns)[0]; + bottomLeft = (CBC_QRFinderPattern *)(*patterns)[1]; + } + if ((bottomLeft->GetY() - topLeft->GetY()) * (topRight->GetX() - topLeft->GetX()) < (bottomLeft->GetX() + - topLeft->GetX()) * (topRight->GetY() - topLeft->GetY())) { + CBC_QRFinderPattern* temp = topRight; + topRight = bottomLeft; + bottomLeft = temp; + } + (*patterns)[0] = bottomLeft; + (*patterns)[1] = topLeft; + (*patterns)[2] = topRight; +} +FX_FLOAT CBC_QRFinderPatternFinder::Distance(CBC_ResultPoint* point1, CBC_ResultPoint* point2) +{ + FX_FLOAT dx = point1->GetX() - point2->GetX(); + FX_FLOAT dy = point1->GetY() - point2->GetY(); + return (FX_FLOAT)FXSYS_sqrt(dx * dx + dy * dy); +} +FX_FLOAT CBC_QRFinderPatternFinder::CenterFromEnd(const CFX_Int32Array &stateCount, FX_INT32 end) +{ + return (FX_FLOAT)(end - stateCount[4] - stateCount[3]) - stateCount[2] / 2.0f; +} +FX_BOOL CBC_QRFinderPatternFinder::FoundPatternCross(const CFX_Int32Array &stateCount) +{ + FX_INT32 totalModuleSize = 0; + for (FX_INT32 i = 0; i < 5; i++) { + FX_INT32 count = stateCount[i]; + if (count == 0) { + return FALSE; + } + totalModuleSize += count; + } + if (totalModuleSize < 7) { + return FALSE; + } + FX_INT32 moduleSize = (totalModuleSize << INTEGER_MATH_SHIFT) / 7; + FX_INT32 maxVariance = moduleSize / 2; + return FXSYS_abs(moduleSize - (stateCount[0] << INTEGER_MATH_SHIFT)) < maxVariance && + FXSYS_abs(moduleSize - (stateCount[1] << INTEGER_MATH_SHIFT)) < maxVariance && + FXSYS_abs(3 * moduleSize - (stateCount[2] << INTEGER_MATH_SHIFT)) < 3 * maxVariance && + FXSYS_abs(moduleSize - (stateCount[3] << INTEGER_MATH_SHIFT)) < maxVariance && + FXSYS_abs(moduleSize - (stateCount[4] << INTEGER_MATH_SHIFT)) < maxVariance; +} +FX_FLOAT CBC_QRFinderPatternFinder::CrossCheckVertical(FX_INT32 startI, FX_INT32 centerJ, FX_INT32 maxCount, + FX_INT32 originalStateCountTotal) +{ + CBC_CommonBitMatrix *image = m_image; + FX_INT32 maxI = image->GetHeight(); + CFX_Int32Array &stateCount = GetCrossCheckStateCount(); + FX_INT32 i = startI; + while(i >= 0 && image->Get(centerJ, i)) { + stateCount[2]++; + i--; + } + if(i < 0) { + return FXSYS_nan(); + } + while(i >= 0 && !image->Get(centerJ, i) && stateCount[1] <= maxCount) { + stateCount[1]++; + i--; + } + if(i < 0 || stateCount[1] > maxCount) { + return FXSYS_nan(); + } + while(i >= 0 && image->Get(centerJ, i) && stateCount[0] <= maxCount) { + stateCount[0]++; + i--; + } + if(stateCount[0] > maxCount) { + return FXSYS_nan(); + } + i = startI + 1; + while(i < maxI && image->Get(centerJ, i)) { + stateCount[2]++; + i++; + } + if(i == maxI) { + return FXSYS_nan(); + } + while (i < maxI && !image->Get(centerJ, i) && stateCount[3] < maxCount) { + stateCount[3]++; + i++; + } + if (i == maxI || stateCount[3] >= maxCount) { + return FXSYS_nan(); + } + while (i < maxI && image->Get(centerJ, i) && stateCount[4] < maxCount) { + stateCount[4]++; + i++; + } + if (stateCount[4] >= maxCount) { + return FXSYS_nan(); + } + FX_INT32 stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] + stateCount[3] + stateCount[4]; + if (5 * FXSYS_abs(stateCountTotal - originalStateCountTotal) >= originalStateCountTotal) { + return FXSYS_nan(); + } + return FoundPatternCross(stateCount) ? CenterFromEnd(stateCount, i) : FXSYS_nan(); +} +FX_FLOAT CBC_QRFinderPatternFinder::CrossCheckHorizontal(FX_INT32 startJ, FX_INT32 centerI, FX_INT32 maxCount, FX_INT32 originalStateCountTotal) +{ + CBC_CommonBitMatrix *image = m_image; + FX_INT32 maxJ = image->GetWidth(); + CFX_Int32Array &stateCount = GetCrossCheckStateCount(); + FX_INT32 j = startJ; + while (j >= 0 && image->Get(j, centerI)) { + stateCount[2]++; + j--; + } + if (j < 0) { + return FXSYS_nan(); + } + while (j >= 0 && !image->Get(j, centerI) && stateCount[1] <= maxCount) { + stateCount[1]++; + j--; + } + if (j < 0 || stateCount[1] > maxCount) { + return FXSYS_nan(); + } + while (j >= 0 && image->Get(j, centerI) && stateCount[0] <= maxCount) { + stateCount[0]++; + j--; + } + if (stateCount[0] > maxCount) { + return FXSYS_nan(); + } + j = startJ + 1; + while (j < maxJ && image->Get(j, centerI)) { + stateCount[2]++; + j++; + } + if (j == maxJ) { + return FXSYS_nan(); + } + while (j < maxJ && !image->Get(j, centerI) && stateCount[3] < maxCount) { + stateCount[3]++; + j++; + } + if (j == maxJ || stateCount[3] >= maxCount) { + return FXSYS_nan(); + } + while (j < maxJ && image->Get(j, centerI) && stateCount[4] < maxCount) { + stateCount[4]++; + j++; + } + if (stateCount[4] >= maxCount) { + return FXSYS_nan(); + } + FX_INT32 stateCountTotal = stateCount[0] + stateCount[1] + + stateCount[2] + stateCount[3] + + stateCount[4]; + if (5 * FXSYS_abs(stateCountTotal - originalStateCountTotal) >= originalStateCountTotal) { + return FXSYS_nan(); + } + return FoundPatternCross(stateCount) ? CenterFromEnd(stateCount, j) : FXSYS_nan(); +} +FX_BOOL CBC_QRFinderPatternFinder::HandlePossibleCenter(const CFX_Int32Array &stateCount, FX_INT32 i, FX_INT32 j) +{ + FX_INT32 stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] + stateCount[3] + stateCount[4]; + FX_FLOAT centerJ = CenterFromEnd(stateCount, j); + FX_FLOAT centerI = CrossCheckVertical(i, (FX_INT32) centerJ, stateCount[2], stateCountTotal); + if(!FXSYS_isnan(centerI)) { + centerJ = CrossCheckHorizontal((FX_INT32) centerJ, (FX_INT32) centerI, stateCount[2], stateCountTotal); + if(!FXSYS_isnan(centerJ)) { + FX_FLOAT estimatedModuleSize = (FX_FLOAT) stateCountTotal / 7.0f; + FX_BOOL found = FALSE; + FX_INT32 max = m_possibleCenters.GetSize(); + for(FX_INT32 index = 0; index < max; index++) { + CBC_QRFinderPattern *center = (CBC_QRFinderPattern*)(m_possibleCenters[index]); + if(center->AboutEquals(estimatedModuleSize, centerI, centerJ)) { + center->IncrementCount(); + found = TRUE; + break; + } + } + if(!found) { + m_possibleCenters.Add(FX_NEW CBC_QRFinderPattern(centerJ, centerI, estimatedModuleSize)); + } + return TRUE; + } + } + return FALSE; +} +FX_INT32 CBC_QRFinderPatternFinder::FindRowSkip() +{ + FX_INT32 max = m_possibleCenters.GetSize(); + if (max <= 1) { + return 0; + } + FinderPattern *firstConfirmedCenter = NULL; + for (FX_INT32 i = 0; i < max; i++) { + CBC_QRFinderPattern *center = (CBC_QRFinderPattern*)m_possibleCenters[i]; + if (center->GetCount() >= CENTER_QUORUM) { + if (firstConfirmedCenter == NULL) { + firstConfirmedCenter = center; + } else { + m_hasSkipped = TRUE; + return (FX_INT32) ((fabs(firstConfirmedCenter->GetX() - center->GetX()) - + fabs(firstConfirmedCenter->GetY() - center->GetY())) / 2); + } + } + } + return 0; +} +FX_BOOL CBC_QRFinderPatternFinder::HaveMultiplyConfirmedCenters() +{ + FX_INT32 confirmedCount = 0; + FX_FLOAT totalModuleSize = 0.0f; + FX_INT32 max = m_possibleCenters.GetSize(); + FX_INT32 i; + for (i = 0; i < max; i++) { + CBC_QRFinderPattern *pattern = (CBC_QRFinderPattern*)m_possibleCenters[i]; + if (pattern->GetCount() >= CENTER_QUORUM) { + confirmedCount++; + totalModuleSize += pattern->GetEstimatedModuleSize(); + } + } + if (confirmedCount < 3) { + return FALSE; + } + FX_FLOAT average = totalModuleSize / (FX_FLOAT) max; + FX_FLOAT totalDeviation = 0.0f; + for (i = 0; i < max; i++) { + CBC_QRFinderPattern *pattern = (CBC_QRFinderPattern*)m_possibleCenters[i]; + totalDeviation += fabs(pattern->GetEstimatedModuleSize() - average); + } + return totalDeviation <= 0.05f * totalModuleSize; +} +inline FX_BOOL centerComparator(FX_LPVOID a, FX_LPVOID b) +{ + return ((CBC_QRFinderPattern*)b)->GetCount() < ((CBC_QRFinderPattern*)a)->GetCount(); +} +CFX_PtrArray *CBC_QRFinderPatternFinder::SelectBestpatterns(FX_INT32 &e) +{ + FX_INT32 startSize = m_possibleCenters.GetSize(); + if(m_possibleCenters.GetSize() < 3) { + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + FX_FLOAT average = 0.0f; + if(startSize > 3) { + FX_FLOAT totalModuleSize = 0.0f; + for(FX_INT32 i = 0; i < startSize; i++) { + totalModuleSize += ((CBC_QRFinderPattern*)m_possibleCenters[i])->GetEstimatedModuleSize(); + } + average = totalModuleSize / (FX_FLOAT)startSize; + for(FX_INT32 j = 0; j < m_possibleCenters.GetSize() && m_possibleCenters.GetSize() > 3; j++) { + CBC_QRFinderPattern *pattern = (CBC_QRFinderPattern*)m_possibleCenters[j]; + if(fabs(pattern->GetEstimatedModuleSize() - average) > 0.2f * average) { + delete pattern; + m_possibleCenters.RemoveAt(j); + j--; + } + } + } + if(m_possibleCenters.GetSize() > 3) { + BC_FX_PtrArray_Sort(m_possibleCenters, centerComparator); + } + CFX_PtrArray *vec = FX_NEW CFX_PtrArray(); + vec->SetSize(3); + (*vec)[0] = ((CBC_QRFinderPattern*)m_possibleCenters[0])->Clone(); + (*vec)[1] = ((CBC_QRFinderPattern*)m_possibleCenters[1])->Clone(); + (*vec)[2] = ((CBC_QRFinderPattern*)m_possibleCenters[2])->Clone(); + return vec; +} diff --git a/xfa/src/fxbarcode/src/BC_QRGridSampler.cpp b/xfa/src/fxbarcode/src/BC_QRGridSampler.cpp new file mode 100644 index 0000000000..03cf6a3e2f --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_QRGridSampler.cpp @@ -0,0 +1,112 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_CommonPerspectiveTransform.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_QRGridSampler.h" +CBC_QRGridSampler CBC_QRGridSampler::m_gridSampler; +CBC_QRGridSampler::CBC_QRGridSampler() +{ +} +CBC_QRGridSampler::~CBC_QRGridSampler() +{ +} +CBC_QRGridSampler &CBC_QRGridSampler::GetInstance() +{ + return m_gridSampler; +} +void CBC_QRGridSampler::CheckAndNudgePoints(CBC_CommonBitMatrix *image, CFX_FloatArray *points, FX_INT32 &e) +{ + FX_INT32 width = image->GetWidth(); + FX_INT32 height = image->GetHeight(); + FX_BOOL nudged = TRUE; + FX_INT32 offset; + for (offset = 0; offset < points->GetSize() && nudged; offset += 2) { + FX_INT32 x = (FX_INT32) (*points)[offset]; + FX_INT32 y = (FX_INT32) (*points)[offset + 1]; + if (x < -1 || x > width || y < -1 || y > height) { + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + nudged = FALSE; + if (x == -1) { + (*points)[offset] = 0.0f; + nudged = TRUE; + } else if (x == width) { + (*points)[offset] = (FX_FLOAT)(width - 1); + nudged = TRUE; + } + if (y == -1) { + (*points)[offset + 1] = 0.0f; + nudged = TRUE; + } else if (y == height) { + (*points)[offset + 1] = (FX_FLOAT)(height - 1); + nudged = TRUE; + } + } + nudged = TRUE; + for (offset = (*points).GetSize() - 2; offset >= 0 && nudged; offset -= 2) { + FX_INT32 x = (FX_INT32) (*points)[offset]; + FX_INT32 y = (FX_INT32) (*points)[offset + 1]; + if (x < -1 || x > width || y < -1 || y > height) { + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + nudged = FALSE; + if (x == -1) { + (*points)[offset] = 0.0f; + nudged = TRUE; + } else if (x == width) { + (*points)[offset] = (FX_FLOAT)(width - 1); + nudged = TRUE; + } + if (y == -1) { + (*points)[offset + 1] = 0.0f; + nudged = TRUE; + } else if (y == height) { + (*points)[offset + 1] = (FX_FLOAT)(height - 1); + nudged = TRUE; + } + } +} +CBC_CommonBitMatrix *CBC_QRGridSampler::SampleGrid(CBC_CommonBitMatrix *image, FX_INT32 dimensionX, FX_INT32 dimensionY, + FX_FLOAT p1ToX, FX_FLOAT p1ToY, + FX_FLOAT p2ToX, FX_FLOAT p2ToY, + FX_FLOAT p3ToX, FX_FLOAT p3ToY, + FX_FLOAT p4ToX, FX_FLOAT p4ToY, + FX_FLOAT p1FromX, FX_FLOAT p1FromY, + FX_FLOAT p2FromX, FX_FLOAT p2FromY, + FX_FLOAT p3FromX, FX_FLOAT p3FromY, + FX_FLOAT p4FromX, FX_FLOAT p4FromY, FX_INT32 &e) +{ + CBC_AutoPtr transform(CBC_CommonPerspectiveTransform::QuadrilateralToQuadrilateral( + p1ToX, p1ToY, p2ToX, p2ToY, p3ToX, p3ToY, p4ToX, p4ToY, + p1FromX, p1FromY, p2FromX, p2FromY, p3FromX, p3FromY, p4FromX, p4FromY)); + CBC_CommonBitMatrix *tempBitM = FX_NEW CBC_CommonBitMatrix(); + tempBitM->Init(dimensionX, dimensionY); + CBC_AutoPtr bits(tempBitM); + CFX_FloatArray points; + points.SetSize(dimensionX << 1); + for (FX_INT32 y = 0; y < dimensionY; y++) { + FX_INT32 max = points.GetSize(); + FX_FLOAT iValue = (FX_FLOAT) (y + 0.5f); + FX_INT32 x; + for (x = 0; x < max; x += 2) { + points[x] = (FX_FLOAT) ((x >> 1) + 0.5f); + points[x + 1] = iValue; + } + transform->TransformPoints(&points); + CheckAndNudgePoints(image, &points, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + for (x = 0; x < max; x += 2) { + if (image->Get((FX_INT32) points[x], (FX_INT32) points[x + 1])) { + bits->Set(x >> 1, y); + } + } + } + return bits.release(); +} diff --git a/xfa/src/fxbarcode/src/BC_Reader.cpp b/xfa/src/fxbarcode/src/BC_Reader.cpp new file mode 100644 index 0000000000..51f7188b50 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_Reader.cpp @@ -0,0 +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 + +#include "barcode.h" +#include "include/BC_Reader.h" +CBC_Reader::CBC_Reader() +{ +} +CBC_Reader::~CBC_Reader() +{ +} diff --git a/xfa/src/fxbarcode/src/BC_ReedSolomon.cpp b/xfa/src/fxbarcode/src/BC_ReedSolomon.cpp new file mode 100644 index 0000000000..69a4ddde87 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_ReedSolomon.cpp @@ -0,0 +1,84 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_ReedSolomonGF256.h" +#include "include/BC_ReedSolomonGF256Poly.h" +#include "include/BC_ReedSolomon.h" +CBC_ReedSolomonEncoder::CBC_ReedSolomonEncoder(CBC_ReedSolomonGF256* field) +{ + m_field = field; +} +void CBC_ReedSolomonEncoder::Init() +{ + m_cachedGenerators.Add(FX_NEW CBC_ReedSolomonGF256Poly(m_field, 1)); +} +CBC_ReedSolomonGF256Poly* CBC_ReedSolomonEncoder::BuildGenerator(FX_INT32 degree, FX_INT32 &e) +{ + if(degree >= m_cachedGenerators.GetSize()) { + CBC_ReedSolomonGF256Poly* lastGenerator = (CBC_ReedSolomonGF256Poly*)(m_cachedGenerators[m_cachedGenerators.GetSize() - 1]); + for(FX_INT32 d = m_cachedGenerators.GetSize(); d <= degree; d++) { + CFX_Int32Array temp; + temp.Add(1); + temp.Add(m_field->Exp(d - 1)); + CBC_ReedSolomonGF256Poly temp_poly; + temp_poly.Init(m_field, &temp, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_ReedSolomonGF256Poly* nextGenerator = lastGenerator->Multiply(&temp_poly, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + m_cachedGenerators.Add(nextGenerator); + lastGenerator = nextGenerator; + } + } + return (CBC_ReedSolomonGF256Poly*)(m_cachedGenerators[degree]); +} +void CBC_ReedSolomonEncoder::Encode(CFX_Int32Array *toEncode, FX_INT32 ecBytes, FX_INT32 &e) +{ + if(ecBytes == 0) { + e = BCExceptionNoCorrectionBytes; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + FX_INT32 dataBytes = toEncode->GetSize() - ecBytes; + if(dataBytes <= 0) { + e = BCExceptionNoDataBytesProvided; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + CBC_ReedSolomonGF256Poly* generator = BuildGenerator(ecBytes, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CFX_Int32Array infoCoefficients; + infoCoefficients.SetSize(dataBytes); + for(FX_INT32 x = 0; x < dataBytes; x++) { + infoCoefficients[x] = toEncode->operator [](x); + } + CBC_ReedSolomonGF256Poly info; + info.Init(m_field, &infoCoefficients, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CBC_ReedSolomonGF256Poly* rsg = info.MultiplyByMonomial(ecBytes, 1, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CBC_AutoPtr infoTemp(rsg); + CFX_PtrArray *pa = infoTemp->Divide(generator, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CBC_AutoPtr temp(pa); + CBC_ReedSolomonGF256Poly* remainder = (CBC_ReedSolomonGF256Poly*)(temp->operator [](1)); + CFX_Int32Array* coefficients = remainder->GetCoefficients(); + FX_INT32 numZeroCoefficients = ecBytes - coefficients->GetSize(); + for(FX_INT32 i = 0; i < numZeroCoefficients; i++) { + (*toEncode)[dataBytes + i] = 0; + } + for(FX_INT32 y = 0; y < coefficients->GetSize(); y++) { + (*toEncode)[dataBytes + numZeroCoefficients + y] = + coefficients->operator [](y); + } + for (FX_INT32 k = 0; k < temp->GetSize(); k++) { + delete (CBC_ReedSolomonGF256Poly*)(*temp)[k]; + } +} +CBC_ReedSolomonEncoder::~CBC_ReedSolomonEncoder() +{ + for (FX_INT32 i = 0; i < m_cachedGenerators.GetSize(); i++) { + delete (CBC_ReedSolomonGF256Poly*)m_cachedGenerators[i]; + } +} diff --git a/xfa/src/fxbarcode/src/BC_ReedSolomonDecoder.cpp b/xfa/src/fxbarcode/src/BC_ReedSolomonDecoder.cpp new file mode 100644 index 0000000000..36013053a0 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_ReedSolomonDecoder.cpp @@ -0,0 +1,208 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_ReedSolomonGF256.h" +#include "include/BC_ReedSolomonGF256Poly.h" +#include "include/BC_ReedSolomonDecoder.h" +CBC_ReedSolomonDecoder::CBC_ReedSolomonDecoder(CBC_ReedSolomonGF256* field) +{ + m_field = field; +} +CBC_ReedSolomonDecoder::~CBC_ReedSolomonDecoder() +{ +} +void CBC_ReedSolomonDecoder::Decode(CFX_Int32Array* received, FX_INT32 twoS, FX_INT32 &e) +{ + CBC_ReedSolomonGF256Poly poly; + poly.Init(m_field, received, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CFX_Int32Array syndromeCoefficients; + syndromeCoefficients.SetSize(twoS); + FX_BOOL dataMatrix = FALSE; + FX_BOOL noError = TRUE; + for (FX_INT32 i = 0; i < twoS; i++) { + FX_INT32 eval = poly.EvaluateAt(m_field->Exp(dataMatrix ? i + 1 : i)); + syndromeCoefficients[twoS - 1 - i] = eval; + if (eval != 0) { + noError = FALSE; + } + } + if(noError) { + return; + } + CBC_ReedSolomonGF256Poly syndrome; + syndrome.Init(m_field, &syndromeCoefficients, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CBC_ReedSolomonGF256Poly* rsg = m_field->BuildMonomial(twoS, 1, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CBC_AutoPtr temp(rsg); + CFX_PtrArray* pa = RunEuclideanAlgorithm(temp.get(), &syndrome, twoS, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CBC_AutoPtr sigmaOmega(pa); + CBC_AutoPtr sigma((CBC_ReedSolomonGF256Poly*)(*sigmaOmega)[0]); + CBC_AutoPtr omega((CBC_ReedSolomonGF256Poly*)(*sigmaOmega)[1]); + CFX_Int32Array* ia1 = FindErrorLocations(sigma.get(), e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CBC_AutoPtr errorLocations(ia1); + CFX_Int32Array* ia2 = FindErrorMagnitudes(omega.get(), errorLocations.get(), dataMatrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CBC_AutoPtr errorMagnitudes(ia2); + for (FX_INT32 k = 0; k < errorLocations->GetSize(); k++) { + FX_INT32 position = received->GetSize() - 1 - m_field->Log((*errorLocations)[k], e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + if(position < 0) { + e = BCExceptionBadErrorLocation; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + (*received)[position] = CBC_ReedSolomonGF256::AddOrSubtract((*received)[position], (*errorMagnitudes)[k]); + } +} +CFX_PtrArray *CBC_ReedSolomonDecoder::RunEuclideanAlgorithm(CBC_ReedSolomonGF256Poly* a, CBC_ReedSolomonGF256Poly* b, FX_INT32 R, FX_INT32 &e) +{ + if (a->GetDegree() < b->GetDegree()) { + CBC_ReedSolomonGF256Poly* temp = a; + a = b; + b = temp; + } + CBC_ReedSolomonGF256Poly* rsg1 = a->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr rLast(rsg1); + CBC_ReedSolomonGF256Poly* rsg2 = b->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr r(rsg2); + CBC_ReedSolomonGF256Poly* rsg3 = m_field->GetOne()->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr sLast(rsg3); + CBC_ReedSolomonGF256Poly* rsg4 = m_field->GetZero()->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr s(rsg4); + CBC_ReedSolomonGF256Poly* rsg5 = m_field->GetZero()->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr tLast(rsg5); + CBC_ReedSolomonGF256Poly* rsg6 = m_field->GetOne()->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr t(rsg6); + while (r->GetDegree() >= R / 2) { + CBC_AutoPtr rLastLast = rLast; + CBC_AutoPtr sLastLast = sLast; + CBC_AutoPtr tLastlast = tLast; + rLast = r; + sLast = s; + tLast = t; + if (rLast->IsZero()) { + e = BCExceptionR_I_1IsZero; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + CBC_ReedSolomonGF256Poly* rsg7 = rLastLast->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr rTemp(rsg7); + r = rTemp; + CBC_ReedSolomonGF256Poly* rsg8 = m_field->GetZero()->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr q(rsg8); + FX_INT32 denominatorLeadingTerm = rLast->GetCoefficients(rLast->GetDegree()); + FX_INT32 dltInverse = m_field->Inverse(denominatorLeadingTerm, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + while (r->GetDegree() >= rLast->GetDegree() && !(r->IsZero())) { + FX_INT32 degreeDiff = r->GetDegree() - rLast->GetDegree(); + FX_INT32 scale = m_field->Multiply(r->GetCoefficients(r->GetDegree()), dltInverse); + CBC_ReedSolomonGF256Poly* rsgp1 = m_field->BuildMonomial(degreeDiff, scale, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr build(rsgp1); + CBC_ReedSolomonGF256Poly* rsgp2 = q->AddOrSubtract(build.get(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr temp(rsgp2); + q = temp; + CBC_ReedSolomonGF256Poly* rsgp3 = rLast->MultiplyByMonomial(degreeDiff, scale, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr multiply(rsgp3); + CBC_ReedSolomonGF256Poly* rsgp4 = r->AddOrSubtract(multiply.get(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr temp3(rsgp4); + r = temp3; + } + CBC_ReedSolomonGF256Poly* rsg9 = q->Multiply(sLast.get(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr temp1(rsg9); + CBC_ReedSolomonGF256Poly* rsg10 = temp1->AddOrSubtract(sLastLast.get(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr temp2(rsg10); + s = temp2; + CBC_ReedSolomonGF256Poly* rsg11 = q->Multiply(tLast.get(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr temp5(rsg11); + CBC_ReedSolomonGF256Poly* rsg12 = temp5->AddOrSubtract(tLastlast.get(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr temp6(rsg12); + t = temp6; + } + FX_INT32 sigmaTildeAtZero = t->GetCoefficients(0); + if (sigmaTildeAtZero == 0) { + e = BCExceptionIsZero; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + FX_INT32 inverse = m_field->Inverse(sigmaTildeAtZero, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_ReedSolomonGF256Poly* rsg13 = t->Multiply(inverse, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr sigma(rsg13); + CBC_ReedSolomonGF256Poly* rsg14 = r->Multiply(inverse, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr omega(rsg14); + CFX_PtrArray *temp = FX_NEW CFX_PtrArray; + temp->Add(sigma.release()); + temp->Add(omega.release()); + return temp; +} +CFX_Int32Array *CBC_ReedSolomonDecoder::FindErrorLocations(CBC_ReedSolomonGF256Poly* errorLocator, FX_INT32 &e) +{ + FX_INT32 numErrors = errorLocator->GetDegree(); + if (numErrors == 1) { + CBC_AutoPtr temp(FX_NEW CFX_Int32Array); + temp->Add(errorLocator->GetCoefficients(1)); + return temp.release(); + } + CFX_Int32Array *tempT = FX_NEW CFX_Int32Array; + tempT->SetSize(numErrors); + CBC_AutoPtr result(tempT); + FX_INT32 ie = 0; + for (FX_INT32 i = 1; i < 256 && ie < numErrors; i++) { + if(errorLocator->EvaluateAt(i) == 0) { + (*result)[ie] = m_field->Inverse(i, ie); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + ie++; + } + } + if (ie != numErrors) { + e = BCExceptionDegreeNotMatchRoots; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + return result.release(); +} +CFX_Int32Array *CBC_ReedSolomonDecoder::FindErrorMagnitudes(CBC_ReedSolomonGF256Poly* errorEvaluator, CFX_Int32Array* errorLocations, FX_BOOL dataMatrix, FX_INT32 &e) +{ + FX_INT32 s = errorLocations->GetSize(); + CFX_Int32Array * temp = FX_NEW CFX_Int32Array; + temp->SetSize(s); + CBC_AutoPtr result(temp); + for (FX_INT32 i = 0; i < s; i++) { + FX_INT32 xiInverse = m_field->Inverse(errorLocations->operator [](i), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + FX_INT32 denominator = 1; + for(FX_INT32 j = 0; j < s; j++) { + if(i != j) { + denominator = m_field->Multiply(denominator, + CBC_ReedSolomonGF256::AddOrSubtract(1, m_field->Multiply(errorLocations->operator [](j), xiInverse))); + } + } + FX_INT32 temp = m_field->Inverse(denominator, temp); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + (*result)[i] = m_field->Multiply(errorEvaluator->EvaluateAt(xiInverse), + temp); + } + return result.release(); +} diff --git a/xfa/src/fxbarcode/src/BC_ReedSolomonGF256.cpp b/xfa/src/fxbarcode/src/BC_ReedSolomonGF256.cpp new file mode 100644 index 0000000000..ac856b0678 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_ReedSolomonGF256.cpp @@ -0,0 +1,124 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_ReedSolomonGF256Poly.h" +#include "include/BC_ReedSolomonGF256.h" +CBC_ReedSolomonGF256 *CBC_ReedSolomonGF256::QRCodeFild = NULL; +CBC_ReedSolomonGF256 *CBC_ReedSolomonGF256::DataMatrixField = NULL; +void CBC_ReedSolomonGF256::Initialize() +{ + QRCodeFild = FX_NEW CBC_ReedSolomonGF256(0x011D); + QRCodeFild->Init(); + DataMatrixField = FX_NEW CBC_ReedSolomonGF256(0x012D); + DataMatrixField->Init(); +} +void CBC_ReedSolomonGF256::Finalize() +{ + if (QRCodeFild) { + delete QRCodeFild; + } + QRCodeFild = NULL; + if (DataMatrixField) { + delete DataMatrixField; + } + DataMatrixField = NULL; +} +CBC_ReedSolomonGF256::CBC_ReedSolomonGF256(FX_INT32 primitive) +{ + FX_INT32 x = 1; + for(FX_INT32 j = 0; j < 256; j++) { + m_expTable[j] = x; + x <<= 1; + if(x >= 0x100) { + x ^= primitive; + } + } + for(FX_INT32 i = 0; i < 255; i++) { + m_logTable[m_expTable[i]] = i; + } + m_logTable[0] = 0; +} +void CBC_ReedSolomonGF256::Init() +{ + m_zero = FX_NEW CBC_ReedSolomonGF256Poly(this, 0); + m_one = FX_NEW CBC_ReedSolomonGF256Poly(this, 1); +} +CBC_ReedSolomonGF256::~CBC_ReedSolomonGF256() +{ + if(m_zero != NULL) { + delete m_zero; + m_zero = NULL; + } + if(m_one != NULL) { + delete m_one; + m_one = NULL; + } +} +CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256::GetZero() +{ + return m_zero; +} +CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256::GetOne() +{ + return m_one; +} +CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256::BuildMonomial(FX_INT32 degree, FX_INT32 coefficient, FX_INT32 &e) +{ + if(degree < 0) { + e = BCExceptionDegreeIsNegative; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + if(coefficient == 0) { + CBC_ReedSolomonGF256Poly* temp = m_zero->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return temp; + } + CFX_Int32Array coefficients; + coefficients.SetSize(degree + 1); + coefficients[0] = coefficient; + CBC_ReedSolomonGF256Poly *temp = FX_NEW CBC_ReedSolomonGF256Poly(); + temp->Init(this, &coefficients, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return temp; +} +FX_INT32 CBC_ReedSolomonGF256::AddOrSubtract(FX_INT32 a, FX_INT32 b) +{ + return a ^ b; +} +FX_INT32 CBC_ReedSolomonGF256::Exp(FX_INT32 a) +{ + return m_expTable[a]; +} +FX_INT32 CBC_ReedSolomonGF256::Log(FX_INT32 a, FX_INT32 &e) +{ + if(a == 0) { + e = BCExceptionAIsZero; + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + } + return m_logTable[a]; +} +FX_INT32 CBC_ReedSolomonGF256::Inverse(FX_INT32 a, FX_INT32 &e) +{ + if(a == 0) { + e = BCExceptionAIsZero; + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + } + return m_expTable[255 - m_logTable[a]]; +} +FX_INT32 CBC_ReedSolomonGF256::Multiply(FX_INT32 a, FX_INT32 b) +{ + if(a == 0 || b == 0) { + return 0; + } + if(a == 1) { + return b; + } + if(b == 1) { + return a; + } + return m_expTable[(m_logTable[a] + m_logTable[b]) % 255]; +} diff --git a/xfa/src/fxbarcode/src/BC_ReedSolomonGF256Poly.cpp b/xfa/src/fxbarcode/src/BC_ReedSolomonGF256Poly.cpp new file mode 100644 index 0000000000..85c1b5a5bf --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_ReedSolomonGF256Poly.cpp @@ -0,0 +1,241 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_ReedSolomonGF256.h" +#include "include/BC_ReedSolomonGF256Poly.h" +CBC_ReedSolomonGF256Poly::CBC_ReedSolomonGF256Poly(CBC_ReedSolomonGF256* field, FX_INT32 coefficients) +{ + if(field == NULL) { + return; + } + m_field = field; + m_coefficients.Add(coefficients); +} +CBC_ReedSolomonGF256Poly::CBC_ReedSolomonGF256Poly() +{ + m_field = NULL; +} +void CBC_ReedSolomonGF256Poly::Init(CBC_ReedSolomonGF256* field, CFX_Int32Array* coefficients, FX_INT32 &e) +{ + if(coefficients == NULL || coefficients->GetSize() == 0) { + e = BCExceptionCoefficientsSizeIsNull; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + m_field = field; + FX_INT32 coefficientsLength = coefficients->GetSize(); + if((coefficientsLength > 1 && (*coefficients)[0] == 0)) { + FX_INT32 firstNonZero = 1; + while((firstNonZero < coefficientsLength) && ((*coefficients)[firstNonZero] == 0)) { + firstNonZero++; + } + if(firstNonZero == coefficientsLength) { + m_coefficients.Copy( *(m_field->GetZero()->GetCoefficients())); + } else { + m_coefficients.SetSize(coefficientsLength - firstNonZero); + for(FX_INT32 i = firstNonZero, j = 0; i < coefficientsLength; i++, j++) { + m_coefficients[j] = coefficients->operator [](i); + } + } + } else { + m_coefficients.Copy(*coefficients); + } +} +CFX_Int32Array* CBC_ReedSolomonGF256Poly::GetCoefficients() +{ + return &m_coefficients; +} +FX_INT32 CBC_ReedSolomonGF256Poly::GetDegree() +{ + return m_coefficients.GetSize() - 1; +} +FX_BOOL CBC_ReedSolomonGF256Poly::IsZero() +{ + return m_coefficients[0] == 0; +} +FX_INT32 CBC_ReedSolomonGF256Poly::GetCoefficients(FX_INT32 degree) +{ + return m_coefficients[m_coefficients.GetSize() - 1 - degree]; +} +FX_INT32 CBC_ReedSolomonGF256Poly::EvaluateAt(FX_INT32 a) +{ + if(a == 0) { + return GetCoefficients(0); + } + FX_INT32 size = m_coefficients.GetSize(); + if(a == 1) { + FX_INT32 result = 0; + for(FX_INT32 i = 0; i < size; i++) { + result = CBC_ReedSolomonGF256::AddOrSubtract(result, m_coefficients[i]); + } + return result; + } + FX_INT32 result = m_coefficients[0]; + for(FX_INT32 j = 1; j < size; j++) { + result = CBC_ReedSolomonGF256::AddOrSubtract( + m_field->Multiply(a, result), + m_coefficients[j]); + } + return result; +} +CBC_ReedSolomonGF256Poly *CBC_ReedSolomonGF256Poly::Clone(FX_INT32 &e) +{ + CBC_ReedSolomonGF256Poly *temp = FX_NEW CBC_ReedSolomonGF256Poly(); + temp->Init(m_field, &m_coefficients, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return temp; +} +CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256Poly::AddOrSubtract(CBC_ReedSolomonGF256Poly* other, FX_INT32 &e) +{ + if(IsZero()) { + return other->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + if(other->IsZero()) { + return this->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + CFX_Int32Array smallerCoefficients; + smallerCoefficients.Copy(m_coefficients); + CFX_Int32Array largerCoefficients; + largerCoefficients.Copy( *(other->GetCoefficients())); + if(smallerCoefficients.GetSize() > largerCoefficients.GetSize()) { + CFX_Int32Array temp; + temp.Copy(smallerCoefficients); + smallerCoefficients.Copy(largerCoefficients); + largerCoefficients.Copy(temp); + } + CFX_Int32Array sumDiff; + sumDiff.SetSize(largerCoefficients.GetSize() ); + FX_INT32 lengthDiff = largerCoefficients.GetSize() - smallerCoefficients.GetSize(); + for(FX_INT32 i = 0; i < lengthDiff; i++) { + sumDiff[i] = largerCoefficients[i]; + } + for(FX_INT32 j = lengthDiff; j < largerCoefficients.GetSize(); j++) { + sumDiff[j] = (CBC_ReedSolomonGF256::AddOrSubtract(smallerCoefficients[j - lengthDiff], + largerCoefficients[j])); + } + CBC_ReedSolomonGF256Poly *temp = FX_NEW CBC_ReedSolomonGF256Poly(); + temp->Init(m_field, &sumDiff, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return temp; +} +CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256Poly::Multiply(CBC_ReedSolomonGF256Poly* other, FX_INT32 &e) +{ + if(IsZero() || other->IsZero()) { + CBC_ReedSolomonGF256Poly *temp = m_field->GetZero()->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return temp; + } + CFX_Int32Array aCoefficients ; + aCoefficients.Copy(m_coefficients); + FX_INT32 aLength = m_coefficients.GetSize(); + CFX_Int32Array bCoefficients; + bCoefficients.Copy(*(other->GetCoefficients())); + FX_INT32 bLength = other->GetCoefficients()->GetSize(); + CFX_Int32Array product; + product.SetSize(aLength + bLength - 1); + for(FX_INT32 i = 0; i < aLength; i++) { + FX_INT32 aCoeff = m_coefficients[i]; + for(FX_INT32 j = 0; j < bLength; j++) { + product[i + j] = CBC_ReedSolomonGF256::AddOrSubtract( + product[i + j], + m_field->Multiply(aCoeff, other->GetCoefficients()->operator [](j))); + } + } + CBC_ReedSolomonGF256Poly *temp = FX_NEW CBC_ReedSolomonGF256Poly(); + temp->Init(m_field, &product, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return temp; +} +CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256Poly::Multiply(FX_INT32 scalar, FX_INT32 &e) +{ + if(scalar == 0) { + CBC_ReedSolomonGF256Poly *temp = m_field->GetZero()->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return temp; + } + if(scalar == 1) { + return this->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + FX_INT32 size = m_coefficients.GetSize(); + CFX_Int32Array product; + product.SetSize(size); + for(FX_INT32 i = 0; i < size; i++) { + product[i] = m_field->Multiply(m_coefficients[i], scalar); + } + CBC_ReedSolomonGF256Poly *temp = FX_NEW CBC_ReedSolomonGF256Poly(); + temp->Init(m_field, &product, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return temp; +} +CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256Poly::MultiplyByMonomial(FX_INT32 degree, FX_INT32 coefficient, FX_INT32 &e) +{ + if(degree < 0) { + e = BCExceptionDegreeIsNegative; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + if(coefficient == 0) { + CBC_ReedSolomonGF256Poly *temp = m_field->GetZero()->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return temp; + } + FX_INT32 size = m_coefficients.GetSize(); + CFX_Int32Array product; + product.SetSize(size + degree); + for(FX_INT32 i = 0; i < size; i++) { + product[i] = (m_field->Multiply(m_coefficients[i], coefficient)); + } + CBC_ReedSolomonGF256Poly *temp = FX_NEW CBC_ReedSolomonGF256Poly(); + temp->Init(m_field, &product, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return temp; +} +CFX_PtrArray* CBC_ReedSolomonGF256Poly::Divide(CBC_ReedSolomonGF256Poly *other, FX_INT32 &e) +{ + if(other->IsZero()) { + e = BCExceptionDivideByZero; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + CBC_ReedSolomonGF256Poly* rsg1 = m_field->GetZero()->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr quotient(rsg1); + CBC_ReedSolomonGF256Poly* rsg2 = this->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr remainder(rsg2); + FX_INT32 denominatorLeadingTerm = other->GetCoefficients(other->GetDegree()); + FX_INT32 inverseDenominatorLeadingTeam = m_field->Inverse(denominatorLeadingTerm, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + FX_BOOL bFirst = TRUE; + while(remainder->GetDegree() >= other->GetDegree() && !remainder->IsZero()) { + FX_INT32 degreeDifference = remainder->GetDegree() - other->GetDegree(); + FX_INT32 scale = m_field->Multiply(remainder->GetCoefficients((remainder->GetDegree())), + inverseDenominatorLeadingTeam); + CBC_ReedSolomonGF256Poly* rsg3 = other->MultiplyByMonomial(degreeDifference, scale, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr term(rsg3); + CBC_ReedSolomonGF256Poly* rsg4 = m_field->BuildMonomial(degreeDifference, scale, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr iteratorQuotient(rsg4); + CBC_ReedSolomonGF256Poly* rsg5 = quotient->AddOrSubtract(iteratorQuotient.get(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr temp(rsg5); + quotient = temp; + CBC_ReedSolomonGF256Poly* rsg6 = remainder->AddOrSubtract(term.get(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr temp1(rsg6); + remainder = temp1; + } + CFX_PtrArray* tempPtrA = FX_NEW CFX_PtrArray; + tempPtrA->Add(quotient.release()); + tempPtrA->Add(remainder.release()); + return tempPtrA; +} +CBC_ReedSolomonGF256Poly::~CBC_ReedSolomonGF256Poly() +{ + m_coefficients.RemoveAll(); +} diff --git a/xfa/src/fxbarcode/src/BC_ResultPoint.cpp b/xfa/src/fxbarcode/src/BC_ResultPoint.cpp new file mode 100644 index 0000000000..1e9b72ae5c --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_ResultPoint.cpp @@ -0,0 +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 + +#include "barcode.h" +#include "include/BC_ResultPoint.h" +CBC_ResultPoint::CBC_ResultPoint(FX_FLOAT x, FX_FLOAT y): m_x(x), m_y(y) +{ +} +FX_FLOAT CBC_ResultPoint::GetX() +{ + return m_x; +} +FX_FLOAT CBC_ResultPoint::GetY() +{ + return m_y; +} diff --git a/xfa/src/fxbarcode/src/BC_SymbolInfo.cpp b/xfa/src/fxbarcode/src/BC_SymbolInfo.cpp new file mode 100644 index 0000000000..360da8dc1a --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_SymbolInfo.cpp @@ -0,0 +1,226 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_Encoder.h" +#include "include/BC_Dimension.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_SymbolShapeHint.h" +#include "include/BC_SymbolInfo.h" +#include "include/BC_DataMatrixSymbolInfo144.h" +#define SYMBOLS_COUNT 30 +CBC_SymbolInfo* CBC_SymbolInfo::m_PROD_SYMBOLS[30] = {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}; +CBC_SymbolInfo* CBC_SymbolInfo::m_symbols[30] = {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}; +void CBC_SymbolInfo::Initialize() +{ + m_PROD_SYMBOLS[0] = FX_NEW CBC_SymbolInfo(FALSE, 3, 5, 8, 8, 1); + m_PROD_SYMBOLS[1] = FX_NEW CBC_SymbolInfo(FALSE, 5, 7, 10, 10, 1); + m_PROD_SYMBOLS[2] = FX_NEW CBC_SymbolInfo(TRUE, 5, 7, 16, 6, 1); + m_PROD_SYMBOLS[3] = FX_NEW CBC_SymbolInfo(FALSE, 8, 10, 12, 12, 1); + m_PROD_SYMBOLS[4] = FX_NEW CBC_SymbolInfo(TRUE, 10, 11, 14, 6, 2); + m_PROD_SYMBOLS[5] = FX_NEW CBC_SymbolInfo(FALSE, 12, 12, 14, 14, 1); + m_PROD_SYMBOLS[6] = FX_NEW CBC_SymbolInfo(TRUE, 16, 14, 24, 10, 1); + m_PROD_SYMBOLS[7] = FX_NEW CBC_SymbolInfo(FALSE, 18, 14, 16, 16, 1); + m_PROD_SYMBOLS[8] = FX_NEW CBC_SymbolInfo(FALSE, 22, 18, 18, 18, 1); + m_PROD_SYMBOLS[9] = FX_NEW CBC_SymbolInfo(TRUE, 22, 18, 16, 10, 2); + m_PROD_SYMBOLS[10] = FX_NEW CBC_SymbolInfo(FALSE, 30, 20, 20, 20, 1); + m_PROD_SYMBOLS[11] = FX_NEW CBC_SymbolInfo(TRUE, 32, 24, 16, 14, 2); + m_PROD_SYMBOLS[12] = FX_NEW CBC_SymbolInfo(FALSE, 36, 24, 22, 22, 1); + m_PROD_SYMBOLS[13] = FX_NEW CBC_SymbolInfo(FALSE, 44, 28, 24, 24, 1); + m_PROD_SYMBOLS[14] = FX_NEW CBC_SymbolInfo(TRUE, 49, 28, 22, 14, 2); + m_PROD_SYMBOLS[15] = FX_NEW CBC_SymbolInfo(FALSE, 62, 36, 14, 14, 4); + m_PROD_SYMBOLS[16] = FX_NEW CBC_SymbolInfo(FALSE, 86, 42, 16, 16, 4); + m_PROD_SYMBOLS[17] = FX_NEW CBC_SymbolInfo(FALSE, 114, 48, 18, 18, 4); + m_PROD_SYMBOLS[18] = FX_NEW CBC_SymbolInfo(FALSE, 144, 56, 20, 20, 4); + m_PROD_SYMBOLS[19] = FX_NEW CBC_SymbolInfo(FALSE, 174, 68, 22, 22, 4); + m_PROD_SYMBOLS[20] = FX_NEW CBC_SymbolInfo(FALSE, 204, 84, 24, 24, 4, 102, 42); + m_PROD_SYMBOLS[21] = FX_NEW CBC_SymbolInfo(FALSE, 280, 112, 14, 14, 16, 140, 56); + m_PROD_SYMBOLS[22] = FX_NEW CBC_SymbolInfo(FALSE, 368, 144, 16, 16, 16, 92, 36); + m_PROD_SYMBOLS[23] = FX_NEW CBC_SymbolInfo(FALSE, 456, 192, 18, 18, 16, 114, 48); + m_PROD_SYMBOLS[24] = FX_NEW CBC_SymbolInfo(FALSE, 576, 224, 20, 20, 16, 144, 56); + m_PROD_SYMBOLS[25] = FX_NEW CBC_SymbolInfo(FALSE, 696, 272, 22, 22, 16, 174, 68); + m_PROD_SYMBOLS[26] = FX_NEW CBC_SymbolInfo(FALSE, 816, 336, 24, 24, 16, 136, 56); + m_PROD_SYMBOLS[27] = FX_NEW CBC_SymbolInfo(FALSE, 1050, 408, 18, 18, 36, 175, 68); + m_PROD_SYMBOLS[28] = FX_NEW CBC_SymbolInfo(FALSE, 1304, 496, 20, 20, 36, 163, 62); + m_PROD_SYMBOLS[29] = FX_NEW CBC_DataMatrixSymbolInfo144(); + for (FX_INT32 i = 0; i < SYMBOLS_COUNT; i++) { + m_symbols[i] = m_PROD_SYMBOLS[i]; + } +} +void CBC_SymbolInfo::Finalize() +{ + for (FX_INT32 i = 0; i < SYMBOLS_COUNT; i++) { + delete m_PROD_SYMBOLS[i]; + m_PROD_SYMBOLS[i] = NULL; + m_symbols[i] = NULL; + } +} +CBC_SymbolInfo::CBC_SymbolInfo(FX_BOOL rectangular, FX_INT32 dataCapacity, FX_INT32 errorCodewords, FX_INT32 matrixWidth, FX_INT32 matrixHeight, FX_INT32 dataRegions) +{ + m_rectangular = rectangular; + m_dataCapacity = dataCapacity; + m_errorCodewords = errorCodewords; + m_matrixWidth = matrixWidth; + m_matrixHeight = matrixHeight; + m_dataRegions = dataRegions; + m_rsBlockData = dataCapacity; + m_rsBlockError = errorCodewords; +} +CBC_SymbolInfo::CBC_SymbolInfo(FX_BOOL rectangular, FX_INT32 dataCapacity, FX_INT32 errorCodewords, FX_INT32 matrixWidth, FX_INT32 matrixHeight, FX_INT32 dataRegions, + FX_INT32 rsBlockData, FX_INT32 rsBlockError) +{ + m_rectangular = rectangular; + m_dataCapacity = dataCapacity; + m_errorCodewords = errorCodewords; + m_matrixWidth = matrixWidth; + m_matrixHeight = matrixHeight; + m_dataRegions = dataRegions; + m_rsBlockData = rsBlockData; + m_rsBlockError = rsBlockError; +} +CBC_SymbolInfo::~CBC_SymbolInfo() +{ +} + +CBC_SymbolInfo* CBC_SymbolInfo::lookup(FX_INT32 dataCodewords, FX_INT32 &e) +{ + return lookup(dataCodewords, FORCE_NONE, TRUE, e); +} +CBC_SymbolInfo* CBC_SymbolInfo::lookup(FX_INT32 dataCodewords, SymbolShapeHint shape, FX_INT32 &e) +{ + return lookup(dataCodewords, shape, TRUE, e); +} +CBC_SymbolInfo* CBC_SymbolInfo::lookup(FX_INT32 dataCodewords, FX_BOOL allowRectangular, FX_BOOL fail, FX_INT32 &e) +{ + SymbolShapeHint shape = allowRectangular ? FORCE_NONE : FORCE_SQUARE; + return lookup(dataCodewords, shape, fail, e); +} +CBC_SymbolInfo* CBC_SymbolInfo::lookup(FX_INT32 dataCodewords, SymbolShapeHint shape, FX_BOOL fail, FX_INT32 &e) +{ + return lookup(dataCodewords, shape, NULL, NULL, fail, e); +} +CBC_SymbolInfo* CBC_SymbolInfo::lookup(FX_INT32 dataCodewords, SymbolShapeHint shape, CBC_Dimension* minSize, CBC_Dimension* maxSize, FX_BOOL fail, FX_INT32 &e) +{ + for (FX_INT32 i = 0; i < SYMBOLS_COUNT; i++) { + CBC_SymbolInfo* symbol = m_symbols[i]; + if (shape == FORCE_SQUARE && symbol->m_rectangular) { + continue; + } + if (shape == FORCE_RECTANGLE && !symbol->m_rectangular) { + continue; + } + if (minSize != NULL && (symbol->getSymbolWidth(e) < minSize->getWidth() || symbol->getSymbolHeight(e) < minSize->getHeight())) { + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + continue; + } + if (maxSize != NULL && (symbol->getSymbolWidth(e) > maxSize->getWidth() || symbol->getSymbolHeight(e) > maxSize->getHeight())) { + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + continue; + } + if (dataCodewords <= symbol->m_dataCapacity) { + return symbol; + } + } + if (fail) { + e = BCExceptionIllegalDataCodewords; + return NULL; + } + return NULL; +} +FX_INT32 CBC_SymbolInfo::getHorizontalDataRegions(FX_INT32 &e) +{ + switch (m_dataRegions) { + case 1: + return 1; + case 2: + return 2; + case 4: + return 2; + case 16: + return 4; + case 36: + return 6; + default: + e = BCExceptionCannotHandleThisNumberOfDataRegions; + return 0; + } +} +FX_INT32 CBC_SymbolInfo::getVerticalDataRegions(FX_INT32 &e) +{ + switch (m_dataRegions) { + case 1: + return 1; + case 2: + return 1; + case 4: + return 2; + case 16: + return 4; + case 36: + return 6; + default: + e = BCExceptionCannotHandleThisNumberOfDataRegions; + return 0; + } +} +FX_INT32 CBC_SymbolInfo::getSymbolDataWidth(FX_INT32 &e) +{ + return getHorizontalDataRegions(e) * m_matrixWidth; +} +FX_INT32 CBC_SymbolInfo::getSymbolDataHeight(FX_INT32 &e) +{ + return getVerticalDataRegions(e) * m_matrixHeight; +} +FX_INT32 CBC_SymbolInfo::getSymbolWidth(FX_INT32 &e) +{ + return getSymbolDataWidth(e) + (getHorizontalDataRegions(e) * 2); +} +FX_INT32 CBC_SymbolInfo::getSymbolHeight(FX_INT32 &e) +{ + return getSymbolDataHeight(e) + (getVerticalDataRegions(e) * 2); +} +FX_INT32 CBC_SymbolInfo::getCodewordCount() +{ + return m_dataCapacity + m_errorCodewords; +} +FX_INT32 CBC_SymbolInfo::getInterleavedBlockCount() +{ + return m_dataCapacity / m_rsBlockData; +} +FX_INT32 CBC_SymbolInfo::getDataLengthForInterleavedBlock(FX_INT32 index) +{ + return m_rsBlockData; +} +FX_INT32 CBC_SymbolInfo::getErrorLengthForInterleavedBlock(FX_INT32 index) +{ + return m_rsBlockError; +} +CFX_WideString CBC_SymbolInfo::toString(FX_INT32 &e) +{ + CFX_WideString sb; + sb += (FX_LPWSTR)(m_rectangular ? "Rectangular Symbol:" : "Square Symbol:"); + sb += (FX_LPWSTR)" data region "; + sb += m_matrixWidth; + sb += (FX_WCHAR)'x'; + sb += m_matrixHeight; + sb += (FX_LPWSTR)", symbol size "; + sb += getSymbolWidth(e); + BC_EXCEPTION_CHECK_ReturnValue(e, (FX_LPWSTR)""); + sb += (FX_WCHAR)'x'; + sb += getSymbolHeight(e); + BC_EXCEPTION_CHECK_ReturnValue(e, (FX_LPWSTR)""); + sb += (FX_LPWSTR)", symbol data size "; + sb += getSymbolDataWidth(e); + BC_EXCEPTION_CHECK_ReturnValue(e, (FX_LPWSTR)""); + sb += (FX_WCHAR)'x'; + sb += getSymbolDataHeight(e); + BC_EXCEPTION_CHECK_ReturnValue(e, (FX_LPWSTR)""); + sb += (FX_LPWSTR)", codewords "; + sb += m_dataCapacity; + sb += (FX_WCHAR)'+'; + sb += m_errorCodewords; + return sb; +} diff --git a/xfa/src/fxbarcode/src/BC_SymbolShapeHint.cpp b/xfa/src/fxbarcode/src/BC_SymbolShapeHint.cpp new file mode 100644 index 0000000000..104acbf519 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_SymbolShapeHint.cpp @@ -0,0 +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 + +#include "barcode.h" +#include "include/BC_SymbolShapeHint.h" +CBC_SymbolShapeHint::CBC_SymbolShapeHint() +{ +} +CBC_SymbolShapeHint::~CBC_SymbolShapeHint() +{ +} diff --git a/xfa/src/fxbarcode/src/BC_TextEncoder.cpp b/xfa/src/fxbarcode/src/BC_TextEncoder.cpp new file mode 100644 index 0000000000..737a84d7ca --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_TextEncoder.cpp @@ -0,0 +1,86 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_Encoder.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_Dimension.h" +#include "include/BC_SymbolShapeHint.h" +#include "include/BC_SymbolInfo.h" +#include "include/BC_EncoderContext.h" +#include "include/BC_HighLevelEncoder.h" +#include "include/BC_C40Encoder.h" +#include "include/BC_TextEncoder.h" +CBC_TextEncoder::CBC_TextEncoder() +{ +} +CBC_TextEncoder::~CBC_TextEncoder() +{ +} +FX_INT32 CBC_TextEncoder::getEncodingMode() +{ + return TEXT_ENCODATION; +} +FX_INT32 CBC_TextEncoder::encodeChar(FX_WCHAR c, CFX_WideString &sb, FX_INT32 &e) +{ + if (c == ' ') { + sb += (FX_WCHAR)'\3'; + return 1; + } + if (c >= '0' && c <= '9') { + sb += (FX_WCHAR) (c - 48 + 4); + return 1; + } + if (c >= 'a' && c <= 'z') { + sb += (FX_WCHAR) (c - 97 + 14); + return 1; + } + if (c >= '\0' && c <= 0x1f) { + sb += (FX_WCHAR)'\0'; + sb += c; + return 2; + } + if (c >= '!' && c <= '/') { + sb += (FX_WCHAR) '\1'; + sb += (FX_WCHAR) (c - 33); + return 2; + } + if (c >= ':' && c <= '@') { + sb += (FX_WCHAR)'\1'; + sb += (FX_WCHAR) (c - 58 + 15); + return 2; + } + if (c >= '[' && c <= '_') { + sb += (FX_WCHAR) '\1'; + sb += (FX_WCHAR) (c - 91 + 22); + return 2; + } + if (c == 0x0060) { + sb += (FX_WCHAR) '\2'; + sb += (FX_WCHAR) (c - 96); + return 2; + } + if (c >= 'A' && c <= 'Z') { + sb += (FX_WCHAR)'\2'; + sb += (FX_WCHAR) (c - 65 + 1); + return 2; + } + if (c >= '{' && c <= 0x007f) { + sb += (FX_WCHAR)'\2'; + sb += (FX_WCHAR) (c - 123 + 27); + return 2; + } + if (c >= 0x0080) { + sb += (FX_WCHAR)'\1'; + sb += (FX_WCHAR)0x001e; + FX_INT32 len = 2; + len += encodeChar((FX_WCHAR) (c - 128), sb, e); + BC_EXCEPTION_CHECK_ReturnValue(e, -1); + return len; + } + CBC_HighLevelEncoder::illegalCharacter(c, e); + return -1; +} diff --git a/xfa/src/fxbarcode/src/BC_TwoDimWriter.cpp b/xfa/src/fxbarcode/src/BC_TwoDimWriter.cpp new file mode 100644 index 0000000000..b23802b784 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_TwoDimWriter.cpp @@ -0,0 +1,137 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_Writer.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_TwoDimWriter.h" +CBC_TwoDimWriter::CBC_TwoDimWriter() +{ + m_iCorrectLevel = 1; + m_bFixedSize = TRUE; + m_output = NULL; +} +CBC_TwoDimWriter::~CBC_TwoDimWriter() +{ + if (m_output != NULL) { + delete m_output; + m_output = NULL; + } +} +void CBC_TwoDimWriter::RenderDeviceResult(CFX_RenderDevice* device, const CFX_Matrix* matrix) +{ + CFX_GraphStateData stateData; + CFX_PathData path; + path.AppendRect(0, 0, (FX_FLOAT)m_Width, (FX_FLOAT)m_Height); + device->DrawPath(&path, matrix, &stateData, m_backgroundColor, m_backgroundColor, FXFILL_ALTERNATE); + FX_INT32 leftPos = 0; + FX_INT32 topPos = 0; + if ( m_bFixedSize) { + leftPos = (m_Width - m_output->GetWidth()) / 2; + topPos = (m_Height - m_output->GetHeight()) / 2; + } + CFX_Matrix matri = *matrix; + if (m_Width < m_output->GetWidth() && m_Height < m_output->GetHeight()) { + CFX_Matrix matriScale((FX_FLOAT)m_Width / (FX_FLOAT)m_output->GetWidth(), 0.0, 0.0, (FX_FLOAT)m_Height / (FX_FLOAT)m_output->GetHeight(), 0.0, 0.0); + matriScale.Concat(*matrix); + matri = matriScale; + } + for (FX_INT32 x = 0; x < m_output->GetWidth(); x++) { + for (FX_INT32 y = 0; y < m_output->GetHeight(); y++) { + CFX_PathData rect; + rect.AppendRect((FX_FLOAT)leftPos + x, (FX_FLOAT)topPos + y, (FX_FLOAT)(leftPos + x + 1), (FX_FLOAT)(topPos + y + 1)); + CFX_GraphStateData stateData; + if(m_output->Get(x, y)) { + device->DrawPath(&rect, &matri, &stateData, m_barColor, 0, FXFILL_WINDING); + } + } + } +} +void CBC_TwoDimWriter::RenderBitmapResult(CFX_DIBitmap *&pOutBitmap, FX_INT32& e) +{ + if (m_bFixedSize) { + pOutBitmap = CreateDIBitmap(m_Width, m_Height); + } else { + pOutBitmap = CreateDIBitmap(m_output->GetWidth(), m_output->GetHeight()); + } + if (!pOutBitmap) { + e = BCExceptionFailToCreateBitmap; + return; + } + pOutBitmap->Clear(m_backgroundColor); + FX_INT32 leftPos = 0; + FX_INT32 topPos = 0; + if ( m_bFixedSize) { + leftPos = (m_Width - m_output->GetWidth()) / 2; + topPos = (m_Height - m_output->GetHeight()) / 2; + } + for (FX_INT32 x = 0; x < m_output->GetWidth(); x++) { + for (FX_INT32 y = 0; y < m_output->GetHeight(); y++) { + if (m_output->Get(x, y)) { + pOutBitmap->SetPixel(leftPos + x, topPos + y, m_barColor); + } + } + } + if (!m_bFixedSize) { + CFX_DIBitmap * pStretchBitmap = pOutBitmap->StretchTo(m_Width, m_Height); + if (pOutBitmap) { + delete pOutBitmap; + } + pOutBitmap = pStretchBitmap; + } +} +void CBC_TwoDimWriter::RenderResult(FX_BYTE *code, FX_INT32 codeWidth, FX_INT32 codeHeight, FX_INT32 &e) +{ + FX_INT32 inputWidth = codeWidth; + FX_INT32 inputHeight = codeHeight; + FX_INT32 tempWidth = inputWidth + (1 << 1); + FX_INT32 tempHeight = inputHeight + (1 << 1); + FX_FLOAT moduleHSize = (FX_FLOAT)FX_MIN(m_ModuleWidth, m_ModuleHeight); + if (moduleHSize > 8) { + moduleHSize = 8; + } else if (moduleHSize < 1) { + moduleHSize = 1; + } + FX_INT32 outputWidth = (FX_INT32)FX_MAX(tempWidth * moduleHSize, tempWidth); + FX_INT32 outputHeight = (FX_INT32)FX_MAX(tempHeight * moduleHSize, tempHeight); + FX_INT32 multiX = 1; + FX_INT32 multiY = 1; + if (m_bFixedSize) { + if (m_Width < outputWidth || m_Height < outputHeight) { + e = BCExceptionBitmapSizeError; + return; + } + } else { + if (m_Width > outputWidth || m_Height > outputHeight) { + outputWidth = (FX_INT32)(outputWidth * ceil ( (FX_FLOAT)m_Width / (FX_FLOAT)outputWidth)); + outputHeight = (FX_INT32)(outputHeight * ceil ( (FX_FLOAT)m_Height / (FX_FLOAT)outputHeight)); + } + } + multiX = (FX_INT32)ceil((FX_FLOAT)outputWidth / (FX_FLOAT)tempWidth); + multiY = (FX_INT32)ceil((FX_FLOAT)outputHeight / (FX_FLOAT) tempHeight); + if (m_bFixedSize) { + multiX = FX_MIN(multiX, multiY); + multiY = multiX; + } + FX_INT32 leftPadding = (outputWidth - (inputWidth * multiX)) / 2; + FX_INT32 topPadding = (outputHeight - (inputHeight * multiY)) / 2; + if (leftPadding < 0) { + leftPadding = 0; + } + if (topPadding < 0) { + topPadding = 0; + } + m_output = FX_NEW CBC_CommonBitMatrix; + m_output->Init(outputWidth, outputHeight); + for (FX_INT32 inputY = 0, outputY = topPadding; (inputY < inputHeight) && (outputY < outputHeight - multiY); inputY++, outputY += multiY) { + for (FX_INT32 inputX = 0, outputX = leftPadding; (inputX < inputWidth) && (outputX < outputWidth - multiX); inputX++, outputX += multiX) { + if (code[inputX + inputY * inputWidth] == 1) { + m_output->SetRegion(outputX, outputY, multiX, multiY, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + } + } +} diff --git a/xfa/src/fxbarcode/src/BC_UtilCodingConvert.cpp b/xfa/src/fxbarcode/src/BC_UtilCodingConvert.cpp new file mode 100644 index 0000000000..993fc79689 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_UtilCodingConvert.cpp @@ -0,0 +1,49 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_UtilCodingConvert.h" +CBC_UtilCodingConvert::CBC_UtilCodingConvert() +{ +} +CBC_UtilCodingConvert::~CBC_UtilCodingConvert() +{ +} +void CBC_UtilCodingConvert::UnicodeToLocale(const CFX_WideString &src, CFX_ByteString &dst) +{ + dst.ConvertFrom(src); +} +void CBC_UtilCodingConvert::LocaleToUtf8(const CFX_ByteString &src, CFX_ByteString &dst) +{ + CFX_WideString unicode = CFX_WideString::FromLocal(src, src.GetLength()); + dst = unicode.UTF8Encode(); +} +void CBC_UtilCodingConvert::LocaleToUtf8(const CFX_ByteString &src, CFX_ByteArray &dst) +{ + CFX_WideString unicode = CFX_WideString::FromLocal(src, src.GetLength()); + CFX_ByteString utf8 = unicode.UTF8Encode(); + for (FX_INT32 i = 0; i < utf8.GetLength(); i ++) { + dst.Add(utf8[i]); + } +} +void CBC_UtilCodingConvert::Utf8ToLocale(const CFX_ByteArray &src, CFX_ByteString &dst) +{ + CFX_ByteString utf8; + for (FX_INT32 i = 0; i < src.GetSize(); i ++) { + utf8 += src[i]; + } + CFX_WideString unicode = CFX_WideString::FromUTF8(utf8, utf8.GetLength()); + dst.ConvertFrom(unicode); +} +void CBC_UtilCodingConvert::Utf8ToLocale(const FX_BYTE *src, FX_INT32 count, CFX_ByteString &dst) +{ + CFX_WideString unicode = CFX_WideString::FromUTF8((const char*)src, count); + dst.ConvertFrom(unicode); +} +void CBC_UtilCodingConvert::UnicodeToUTF8(const CFX_WideString &src, CFX_ByteString &dst) +{ + dst = src.UTF8Encode(); +} diff --git a/xfa/src/fxbarcode/src/BC_UtilRSS.cpp b/xfa/src/fxbarcode/src/BC_UtilRSS.cpp new file mode 100644 index 0000000000..539068ace7 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_UtilRSS.cpp @@ -0,0 +1,148 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_UtilRSS.h" +CBC_UtilRSS::CBC_UtilRSS() +{ +} +CBC_UtilRSS::~CBC_UtilRSS() +{ +} +CFX_Int32Array *CBC_UtilRSS::GetRssWidths(FX_INT32 val, FX_INT32 n, FX_INT32 elements, FX_INT32 maxWidth, FX_BOOL noNarrow) +{ + CFX_Int32Array *iTemp = FX_NEW CFX_Int32Array; + iTemp->SetSize(elements); + CBC_AutoPtr widths(iTemp); + FX_INT32 bar; + FX_INT32 narrowMask = 0; + for (bar = 0; bar < elements - 1; bar++) { + narrowMask |= (1 << bar); + FX_INT32 elmWidth = 1; + FX_INT32 subVal; + while (TRUE) { + subVal = Combins(n - elmWidth - 1, elements - bar - 2); + if (noNarrow && (narrowMask == 0) && + (n - elmWidth - (elements - bar - 1) >= elements - bar - 1)) { + subVal -= Combins(n - elmWidth - (elements - bar), elements - bar - 2); + } + if (elements - bar - 1 > 1) { + FX_INT32 lessVal = 0; + for (FX_INT32 mxwElement = n - elmWidth - (elements - bar - 2); + mxwElement > maxWidth; + mxwElement--) { + lessVal += Combins(n - elmWidth - mxwElement - 1, elements - bar - 3); + } + subVal -= lessVal * (elements - 1 - bar); + } else if (n - elmWidth > maxWidth) { + subVal--; + } + val -= subVal; + if (val < 0) { + break; + } + elmWidth++; + narrowMask &= ~(1 << bar); + } + val += subVal; + n -= elmWidth; + (*widths)[bar] = elmWidth; + } + (*widths)[bar] = n; + return widths.release(); +} +FX_INT32 CBC_UtilRSS::GetRSSvalue(CFX_Int32Array &widths, FX_INT32 maxWidth, FX_BOOL noNarrow) +{ + FX_INT32 elements = widths.GetSize(); + FX_INT32 n = 0; + for (FX_INT32 i = 0; i < elements; i++) { + n += widths[i]; + } + FX_INT32 val = 0; + FX_INT32 narrowMask = 0; + for (FX_INT32 bar = 0; bar < elements - 1; bar++) { + FX_INT32 elmWidth; + for (elmWidth = 1, narrowMask |= (1 << bar); + elmWidth < widths[bar]; + elmWidth++, narrowMask &= ~(1 << bar)) { + FX_INT32 subVal = Combins(n - elmWidth - 1, elements - bar - 2); + if (noNarrow && (narrowMask == 0) && + (n - elmWidth - (elements - bar - 1) >= elements - bar - 1)) { + subVal -= Combins(n - elmWidth - (elements - bar), + elements - bar - 2); + } + if (elements - bar - 1 > 1) { + FX_INT32 lessVal = 0; + for (FX_INT32 mxwElement = n - elmWidth - (elements - bar - 2); + mxwElement > maxWidth; mxwElement--) { + lessVal += Combins(n - elmWidth - mxwElement - 1, + elements - bar - 3); + } + subVal -= lessVal * (elements - 1 - bar); + } else if (n - elmWidth > maxWidth) { + subVal--; + } + val += subVal; + } + n -= elmWidth; + } + return val; +} +FX_INT32 CBC_UtilRSS::Combins(FX_INT32 n, FX_INT32 r) +{ + FX_INT32 maxDenom; + FX_INT32 minDenom; + if (n - r > r) { + minDenom = r; + maxDenom = n - r; + } else { + minDenom = n - r; + maxDenom = r; + } + FX_INT32 val = 1; + FX_INT32 j = 1; + for (FX_INT32 i = n; i > maxDenom; i--) { + val *= i; + if (j <= minDenom) { + val /= j; + j++; + } + } + while (j <= minDenom) { + val /= j; + j++; + } + return val; +} +CFX_Int32Array *CBC_UtilRSS::Elements(CFX_Int32Array &eDist, FX_INT32 N, FX_INT32 K) +{ + CFX_Int32Array *widths = FX_NEW CFX_Int32Array; + widths->SetSize(eDist.GetSize() + 2); + FX_INT32 twoK = K << 1; + (*widths)[0] = 1; + FX_INT32 i; + FX_INT32 minEven = 10; + FX_INT32 barSum = 1; + for (i = 1; i < twoK - 2; i += 2) { + (*widths)[i] = eDist[i - 1] - (*widths)[i - 1]; + (*widths)[i + 1] = eDist[i] - (*widths)[i]; + barSum += (*widths)[i] + (*widths)[i + 1]; + if ((*widths)[i] < minEven) { + minEven = (*widths)[i]; + } + } + (*widths)[twoK - 1] = N - barSum; + if ((*widths)[twoK - 1] < minEven) { + minEven = (*widths)[twoK - 1]; + } + if (minEven > 1) { + for (i = 0; i < twoK; i += 2) { + (*widths)[i] += minEven - 1; + (*widths)[i + 1] -= minEven - 1; + } + } + return widths; +} diff --git a/xfa/src/fxbarcode/src/BC_Utils.cpp b/xfa/src/fxbarcode/src/BC_Utils.cpp new file mode 100644 index 0000000000..3a04ebda2b --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_Utils.cpp @@ -0,0 +1,46 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +FX_BOOL BC_FX_ByteString_Replace(CFX_ByteString &dst, FX_DWORD first, FX_DWORD last, FX_INT32 count, FX_CHAR c) +{ + if (first > last || count <= 0) { + return FALSE; + } + dst.Delete(first, last - first); + for (FX_INT32 i = 0; i < count; i ++) { + dst.Insert(0, c); + } + return TRUE; +} +void BC_FX_ByteString_Append(CFX_ByteString &dst, FX_INT32 count, FX_CHAR c) +{ + for (FX_INT32 i = 0; i < count; i ++) { + dst += c; + } +} +void BC_FX_ByteString_Append(CFX_ByteString &dst, const CFX_ByteArray &ba) +{ + for (FX_INT32 i = 0; i < ba.GetSize(); i ++) { + dst += ba[i]; + } +} +void BC_FX_PtrArray_Sort(CFX_PtrArray &src, BC_PtrArrayCompareCallback fun) +{ + FX_INT32 nLength = src.GetSize(); + FX_BOOL changed = true; + do { + changed = false; + for (FX_INT32 i = 0; i < nLength - 1; i++) { + if ( fun(src[i + 1], src[i]) ) { + void *temp = src[i]; + src.SetAt(i, src[i + 1]); + src.SetAt(i + 1, temp); + changed = true; + } + } + } while (changed); +} diff --git a/xfa/src/fxbarcode/src/BC_WhiteRectangleDetector.cpp b/xfa/src/fxbarcode/src/BC_WhiteRectangleDetector.cpp new file mode 100644 index 0000000000..8ed6f98232 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_WhiteRectangleDetector.cpp @@ -0,0 +1,228 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "include/BC_WhiteRectangleDetector.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_ResultPoint.h" +const FX_INT32 CBC_WhiteRectangleDetector::INIT_SIZE = 30; +const FX_INT32 CBC_WhiteRectangleDetector::CORR = 1; +CBC_WhiteRectangleDetector::CBC_WhiteRectangleDetector(CBC_CommonBitMatrix *image) +{ + m_image = image; + m_height = image->GetHeight(); + m_width = image->GetWidth(); + m_leftInit = (m_width - INIT_SIZE) >> 1; + m_rightInit = (m_width + INIT_SIZE) >> 1; + m_upInit = (m_height - INIT_SIZE) >> 1; + m_downInit = (m_height + INIT_SIZE) >> 1; +} +void CBC_WhiteRectangleDetector::Init(FX_INT32 &e) +{ + if (m_upInit < 0 || m_leftInit < 0 || m_downInit >= m_height || m_rightInit >= m_width) { + e = BCExceptionNotFound; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +CBC_WhiteRectangleDetector::CBC_WhiteRectangleDetector(CBC_CommonBitMatrix *image, FX_INT32 initSize, FX_INT32 x, FX_INT32 y) +{ + m_image = image; + m_height = image->GetHeight(); + m_width = image->GetWidth(); + FX_INT32 halfsize = initSize >> 1; + m_leftInit = x - halfsize; + m_rightInit = x + halfsize; + m_upInit = y - halfsize; + m_downInit = y + halfsize; +} +CBC_WhiteRectangleDetector::~CBC_WhiteRectangleDetector() +{ +} +CFX_PtrArray *CBC_WhiteRectangleDetector::Detect(FX_INT32 &e) +{ + FX_INT32 left = m_leftInit; + FX_INT32 right = m_rightInit; + FX_INT32 up = m_upInit; + FX_INT32 down = m_downInit; + FX_BOOL sizeExceeded = FALSE; + FX_BOOL aBlackPointFoundOnBorder = TRUE; + FX_BOOL atLeastOneBlackPointFoundOnBorder = FALSE; + while (aBlackPointFoundOnBorder) { + aBlackPointFoundOnBorder = FALSE; + FX_BOOL rightBorderNotWhite = TRUE; + while (rightBorderNotWhite && right < m_width) { + rightBorderNotWhite = ContainsBlackPoint(up, down, right, FALSE); + if (rightBorderNotWhite) { + right++; + aBlackPointFoundOnBorder = TRUE; + } + } + if (right >= m_width) { + sizeExceeded = TRUE; + break; + } + FX_BOOL bottomBorderNotWhite = TRUE; + while (bottomBorderNotWhite && down < m_height) { + bottomBorderNotWhite = ContainsBlackPoint(left, right, down, TRUE); + if (bottomBorderNotWhite) { + down++; + aBlackPointFoundOnBorder = TRUE; + } + } + if (down >= m_height) { + sizeExceeded = TRUE; + break; + } + FX_BOOL leftBorderNotWhite = TRUE; + while (leftBorderNotWhite && left >= 0) { + leftBorderNotWhite = ContainsBlackPoint(up, down, left, FALSE); + if (leftBorderNotWhite) { + left--; + aBlackPointFoundOnBorder = TRUE; + } + } + if (left < 0) { + sizeExceeded = TRUE; + break; + } + FX_BOOL topBorderNotWhite = TRUE; + while (topBorderNotWhite && up >= 0) { + topBorderNotWhite = ContainsBlackPoint(left, right, up, TRUE); + if (topBorderNotWhite) { + up--; + aBlackPointFoundOnBorder = TRUE; + } + } + if (up < 0) { + sizeExceeded = TRUE; + break; + } + if (aBlackPointFoundOnBorder) { + atLeastOneBlackPointFoundOnBorder = TRUE; + } + } + if (!sizeExceeded && atLeastOneBlackPointFoundOnBorder) { + FX_INT32 maxSize = right - left; + CBC_AutoPtr z(NULL); + for (FX_INT32 i = 1; i < maxSize; i++) { + z = CBC_AutoPtr(GetBlackPointOnSegment((FX_FLOAT)left, (FX_FLOAT)(down - i), (FX_FLOAT)(left + i), (FX_FLOAT)(down)) ); + if (z.get() != NULL) { + break; + } + } + if (z.get() == NULL) { + e = BCExceptionNotFound; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + CBC_AutoPtr t(NULL); + for (FX_INT32 j = 1; j < maxSize; j++) { + t = CBC_AutoPtr(GetBlackPointOnSegment((FX_FLOAT)left, (FX_FLOAT)(up + j), (FX_FLOAT)(left + j), (FX_FLOAT)up)); + if (t.get() != NULL) { + break; + } + } + if (t.get() == NULL) { + e = BCExceptionNotFound; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + CBC_AutoPtr x(NULL); + for (FX_INT32 k = 1; k < maxSize; k++) { + x = CBC_AutoPtr(GetBlackPointOnSegment((FX_FLOAT)right, (FX_FLOAT)(up + k), (FX_FLOAT)(right - k), (FX_FLOAT)up)); + if (x.get() != NULL) { + break; + } + } + if (x.get() == NULL) { + e = BCExceptionNotFound; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + CBC_AutoPtr y(NULL); + for (FX_INT32 m = 1; m < maxSize; m++) { + y = CBC_AutoPtr(GetBlackPointOnSegment((FX_FLOAT)right, (FX_FLOAT)(down - m), (FX_FLOAT)(right - m), (FX_FLOAT) down)); + if (y.get() != NULL) { + break; + } + } + if (y.get() == NULL) { + e = BCExceptionNotFound; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + return CenterEdges(y.get(), z.get(), x.get(), t.get()); + } else { + e = BCExceptionNotFound; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + return NULL; +} +FX_INT32 CBC_WhiteRectangleDetector::Round(FX_FLOAT d) +{ + return (FX_INT32) (d + 0.5f); +} +CBC_ResultPoint *CBC_WhiteRectangleDetector::GetBlackPointOnSegment(FX_FLOAT aX, FX_FLOAT aY, FX_FLOAT bX, FX_FLOAT bY) +{ + FX_INT32 dist = DistanceL2(aX, aY, bX, bY); + float xStep = (bX - aX) / dist; + float yStep = (bY - aY) / dist; + for (FX_INT32 i = 0; i < dist; i++) { + FX_INT32 x = Round(aX + i * xStep); + FX_INT32 y = Round(aY + i * yStep); + if (m_image->Get(x, y)) { + return FX_NEW CBC_ResultPoint((FX_FLOAT)x, (FX_FLOAT) y); + } + } + return NULL; +} +FX_INT32 CBC_WhiteRectangleDetector::DistanceL2(FX_FLOAT aX, FX_FLOAT aY, FX_FLOAT bX, FX_FLOAT bY) +{ + float xDiff = aX - bX; + float yDiff = aY - bY; + return Round((float)sqrt(xDiff * xDiff + yDiff * yDiff)); +} +CFX_PtrArray *CBC_WhiteRectangleDetector::CenterEdges(CBC_ResultPoint *y, CBC_ResultPoint *z, CBC_ResultPoint *x, CBC_ResultPoint *t) +{ + float yi = y->GetX(); + float yj = y->GetY(); + float zi = z->GetX(); + float zj = z->GetY(); + float xi = x->GetX(); + float xj = x->GetY(); + float ti = t->GetX(); + float tj = t->GetY(); + if (yi < m_width / 2) { + CFX_PtrArray *result = FX_NEW CFX_PtrArray; + result->SetSize(4); + (*result)[0] = FX_NEW CBC_ResultPoint(ti - CORR, tj + CORR); + (*result)[1] = FX_NEW CBC_ResultPoint(zi + CORR, zj + CORR); + (*result)[2] = FX_NEW CBC_ResultPoint(xi - CORR, xj - CORR); + (*result)[3] = FX_NEW CBC_ResultPoint(yi + CORR, yj - CORR); + return result; + } else { + CFX_PtrArray *result = FX_NEW CFX_PtrArray; + result->SetSize(4); + (*result)[0] = FX_NEW CBC_ResultPoint(ti + CORR, tj + CORR); + (*result)[1] = FX_NEW CBC_ResultPoint(zi + CORR, zj - CORR); + (*result)[2] = FX_NEW CBC_ResultPoint(xi - CORR, xj + CORR); + (*result)[3] = FX_NEW CBC_ResultPoint(yi - CORR, yj - CORR); + return result; + } +} +FX_BOOL CBC_WhiteRectangleDetector::ContainsBlackPoint(FX_INT32 a, FX_INT32 b, FX_INT32 fixed, FX_BOOL horizontal) +{ + if (horizontal) { + for (FX_INT32 x = a; x <= b; x++) { + if (m_image->Get(x, fixed)) { + return TRUE; + } + } + } else { + for (FX_INT32 y = a; y <= b; y++) { + if (m_image->Get(fixed, y)) { + return TRUE; + } + } + } + return FALSE; +} diff --git a/xfa/src/fxbarcode/src/BC_Writer.cpp b/xfa/src/fxbarcode/src/BC_Writer.cpp new file mode 100644 index 0000000000..c372c97097 --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_Writer.cpp @@ -0,0 +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 + +#include "barcode.h" +#include "include/BC_Writer.h" +CBC_Writer::CBC_Writer() +{ + m_CharEncoding = 0; + m_ModuleHeight = 1; + m_ModuleWidth = 1; + m_Height = 320; + m_Width = 640; + m_colorSpace = FXDIB_Argb; + m_barColor = 0xff000000; + m_backgroundColor = 0xffffffff; +} +CBC_Writer::~CBC_Writer() +{ +} +FX_BOOL CBC_Writer::SetCharEncoding(FX_INT32 encoding) +{ + m_CharEncoding = encoding; + return TRUE; +} +FX_BOOL CBC_Writer::SetModuleHeight(FX_INT32 moduleHeight) +{ + if (moduleHeight > 10 || moduleHeight < 1) { + return FALSE; + } + m_ModuleHeight = moduleHeight; + return TRUE; +} +FX_BOOL CBC_Writer::SetModuleWidth(FX_INT32 moduleWidth) +{ + if ( moduleWidth > 10 || moduleWidth < 1) { + return FALSE; + } + m_ModuleWidth = moduleWidth; + return TRUE; +} +FX_BOOL CBC_Writer::SetHeight(FX_INT32 height) +{ + m_Height = height; + return TRUE; +} +FX_BOOL CBC_Writer::SetWidth(FX_INT32 width) +{ + m_Width = width; + return TRUE; +} +void CBC_Writer::SetBackgroundColor(FX_ARGB backgroundColor) +{ + m_backgroundColor = backgroundColor; +} +void CBC_Writer::SetBarcodeColor(FX_ARGB foregroundColor) +{ + m_barColor = foregroundColor; +} +CFX_DIBitmap* CBC_Writer::CreateDIBitmap(FX_INT32 width, FX_INT32 height) +{ + CFX_DIBitmap *pDIBitmap = NULL; + pDIBitmap = FX_NEW CFX_DIBitmap; + if(pDIBitmap != NULL) { + pDIBitmap->Create(width, height, m_colorSpace); + } + return pDIBitmap; +} diff --git a/xfa/src/fxbarcode/src/BC_X12Encoder.cpp b/xfa/src/fxbarcode/src/BC_X12Encoder.cpp new file mode 100644 index 0000000000..45e87c3ebf --- /dev/null +++ b/xfa/src/fxbarcode/src/BC_X12Encoder.cpp @@ -0,0 +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 + +#include "barcode.h" +#include "include/BC_Encoder.h" +#include "include/BC_CommonBitMatrix.h" +#include "include/BC_Dimension.h" +#include "include/BC_SymbolShapeHint.h" +#include "include/BC_SymbolInfo.h" +#include "include/BC_EncoderContext.h" +#include "include/BC_HighLevelEncoder.h" +#include "include/BC_C40Encoder.h" +#include "include/BC_X12Encoder.h" +CBC_X12Encoder::CBC_X12Encoder() +{ +} +CBC_X12Encoder::~CBC_X12Encoder() +{ +} +FX_INT32 CBC_X12Encoder::getEncodingMode() +{ + return X12_ENCODATION; +} +void CBC_X12Encoder::Encode(CBC_EncoderContext &context, FX_INT32 &e) +{ + CFX_WideString buffer; + while (context.hasMoreCharacters()) { + FX_WCHAR c = context.getCurrentChar(); + context.m_pos++; + encodeChar(c, buffer, e); + if (e != BCExceptionNO) { + return; + } + FX_INT32 count = buffer.GetLength(); + if ((count % 3) == 0) { + writeNextTriplet(context, buffer); + FX_INT32 newMode = CBC_HighLevelEncoder::lookAheadTest(context.m_msg, context.m_pos, getEncodingMode()); + if (newMode != getEncodingMode()) { + context.signalEncoderChange(newMode); + break; + } + } + } + handleEOD(context, buffer, e); +} +void CBC_X12Encoder::handleEOD(CBC_EncoderContext &context, CFX_WideString &buffer, FX_INT32 &e) +{ + context.updateSymbolInfo(e); + if (e != BCExceptionNO) { + return; + } + FX_INT32 available = context.m_symbolInfo->m_dataCapacity - context.getCodewordCount(); + FX_INT32 count = buffer.GetLength(); + if (count == 2) { + context.writeCodeword(CBC_HighLevelEncoder::X12_UNLATCH); + context.m_pos -= 2; + context.signalEncoderChange(ASCII_ENCODATION); + } else if (count == 1) { + context.m_pos--; + if (available > 1) { + context.writeCodeword(CBC_HighLevelEncoder::X12_UNLATCH); + } + context.signalEncoderChange(ASCII_ENCODATION); + } +} +FX_INT32 CBC_X12Encoder::encodeChar(FX_WCHAR c, CFX_WideString &sb, FX_INT32 &e) +{ + if (c == '\r') { + sb += (FX_WCHAR)'\0'; + } else if (c == '*') { + sb += (FX_WCHAR)'\1'; + } else if (c == '>') { + sb += (FX_WCHAR)'\2'; + } else if (c == ' ') { + sb += (FX_WCHAR)'\3'; + } else if (c >= '0' && c <= '9') { + sb += (FX_WCHAR) (c - 48 + 4); + } else if (c >= 'A' && c <= 'Z') { + sb += (FX_WCHAR) (c - 65 + 14); + } else { + CBC_HighLevelEncoder::illegalCharacter(c, e); + BC_EXCEPTION_CHECK_ReturnValue(e, -1); + } + return 1; +} diff --git a/xfa/src/fxbarcode/src/barcode.h b/xfa/src/fxbarcode/src/barcode.h new file mode 100644 index 0000000000..e2ad2126a0 --- /dev/null +++ b/xfa/src/fxbarcode/src/barcode.h @@ -0,0 +1,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 "../../foxitlib.h" +#include "include/utils.h" diff --git a/xfa/src/fxbarcode/src/include/BC_ASCIIEncoder.h b/xfa/src/fxbarcode/src/include/BC_ASCIIEncoder.h new file mode 100644 index 0000000000..9a48b8762f --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_ASCIIEncoder.h @@ -0,0 +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 _BC_ASCIIENCODER_H_ +#define _BC_ASCIIENCODER_H_ +class CBC_Encoder; +class CBC_EncoderContext; +class CBC_ASCIIEncoder; +class CBC_ASCIIEncoder : public CBC_Encoder +{ +public: + CBC_ASCIIEncoder(); + virtual ~CBC_ASCIIEncoder(); + FX_INT32 getEncodingMode(); + void Encode(CBC_EncoderContext &context, FX_INT32 &e); +private: + static FX_WCHAR encodeASCIIDigits(FX_WCHAR digit1, FX_WCHAR digit2, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_Base256Encoder.h b/xfa/src/fxbarcode/src/include/BC_Base256Encoder.h new file mode 100644 index 0000000000..96110b1d08 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_Base256Encoder.h @@ -0,0 +1,21 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_BASE256ENCODER_H_ +#define _BC_BASE256ENCODER_H_ +class CBC_Encoder; +class CBC_Base256Encoder; +class CBC_Base256Encoder : public CBC_Encoder +{ +public: + CBC_Base256Encoder(); + virtual ~CBC_Base256Encoder(); + FX_INT32 getEncodingMode(); + void Encode(CBC_EncoderContext &context, FX_INT32 &e); +private: + static FX_WCHAR randomize255State(FX_WCHAR ch, FX_INT32 codewordPosition); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_Binarizer.h b/xfa/src/fxbarcode/src/include/BC_Binarizer.h new file mode 100644 index 0000000000..357aef67c2 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_Binarizer.h @@ -0,0 +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 _BC_BINARIZER_H_ +#define _BC_BINARIZER_H_ +class CBC_LuminanceSource; +class CBC_CommonBitMatrix; +class CBC_CommonBitArray; +class CBC_BinaryBitmap; +class CBC_Binarizer : public CFX_Object +{ +public: + CBC_Binarizer(CBC_LuminanceSource *source); + virtual ~CBC_Binarizer(); + CBC_LuminanceSource *GetLuminanceSource(); + virtual CBC_CommonBitMatrix *GetBlackMatrix(FX_INT32 &e) = 0; + virtual CBC_CommonBitArray *GetBlackRow(FX_INT32 y, CBC_CommonBitArray *row, FX_INT32 &e) = 0; +private: + CBC_LuminanceSource *m_source; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_BinaryBitmap.h b/xfa/src/fxbarcode/src/include/BC_BinaryBitmap.h new file mode 100644 index 0000000000..638d16f5a9 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_BinaryBitmap.h @@ -0,0 +1,29 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_BINARYBITMAP_H_ +#define _BC_BINARYBITMAP_H_ +class CBC_Binarizer; +class CBC_CommonBitMatrix; +class CBC_CommonBitArray; +class CBC_BinaryBitmap; +class CBC_BinaryBitmap : public CFX_Object +{ +public: + CBC_BinaryBitmap(CBC_Binarizer *binarizer); + virtual ~CBC_BinaryBitmap(); + FX_INT32 GetWidth(); + FX_INT32 GetHeight(); + CBC_CommonBitMatrix * GetMatrix(FX_INT32 &e); + CBC_CommonBitArray * GetBlackRow(FX_INT32 y, CBC_CommonBitArray *row, FX_INT32 &e); + CBC_CommonBitMatrix * GetBlackMatrix(FX_INT32 &e); + FX_BOOL IsCropSupported(); + FX_BOOL IsRotateSupported(); +private: + CBC_Binarizer * m_binarizer; + CBC_CommonBitMatrix * m_matrix; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_BufferedImageLuminanceSource.h b/xfa/src/fxbarcode/src/include/BC_BufferedImageLuminanceSource.h new file mode 100644 index 0000000000..4bff1756d5 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_BufferedImageLuminanceSource.h @@ -0,0 +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 _BC_BUFFEREDIMAGELUMINANCESOURCE_H_ +#define _BC_BUFFEREDIMAGELUMINANCESOURCE_H_ +class CBC_LuminanceSource; +class CBC_BufferedImageLuminanceSource; +class CBC_BufferedImageLuminanceSource : public CBC_LuminanceSource +{ +public: + CBC_BufferedImageLuminanceSource(const CFX_WideString &filename); + CBC_BufferedImageLuminanceSource(CFX_DIBitmap *pBitmap); + virtual ~CBC_BufferedImageLuminanceSource(); + CBC_LuminanceSource *RotateCounterClockwise(FX_INT32 &e); + CBC_LuminanceSource *Crop(FX_INT32 left, FX_INT32 top, FX_INT32 width, FX_INT32 height); + + CFX_ByteArray *GetRow(FX_INT32 y, CFX_ByteArray &row, FX_INT32 &e); + CFX_ByteArray *GetMatrix(); + FX_BOOL IsCropSupported(); + FX_BOOL IsRotateSupported(); + virtual void Init(FX_INT32 &e); +private: + FX_INT32 m_bytesPerLine; + FX_INT32 m_left; + FX_INT32 m_top; + CFX_Int32Array m_rgbData; + CFX_DIBitmap *m_pBitmap; + const CFX_WideString m_filename; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_C40Encoder.h b/xfa/src/fxbarcode/src/include/BC_C40Encoder.h new file mode 100644 index 0000000000..7f2d2f7e79 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_C40Encoder.h @@ -0,0 +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 _BC_C40ENCODER_H_ +#define _BC_C40ENCODER_H_ +class CBC_C40Encoder; +class CBC_C40Encoder : public CBC_Encoder +{ +public: + CBC_C40Encoder(); + virtual ~CBC_C40Encoder(); + virtual FX_INT32 getEncodingMode(); + virtual void Encode(CBC_EncoderContext &context, FX_INT32 &e); + static void writeNextTriplet(CBC_EncoderContext &context, CFX_WideString &buffer); + virtual void handleEOD(CBC_EncoderContext &context, CFX_WideString &buffer, FX_INT32 &e); + virtual FX_INT32 encodeChar(FX_WCHAR c, CFX_WideString &sb, FX_INT32 &e); +private: + FX_INT32 backtrackOneCharacter(CBC_EncoderContext &context, CFX_WideString &buffer, CFX_WideString &removed, FX_INT32 lastCharSize, FX_INT32 &e); + static CFX_WideString encodeToCodewords(CFX_WideString sb, FX_INT32 startPos); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_CommonBitArray.h b/xfa/src/fxbarcode/src/include/BC_CommonBitArray.h new file mode 100644 index 0000000000..484d87d5a7 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_CommonBitArray.h @@ -0,0 +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 _BC_COMMONBITARRAY_H_ +#define _BC_COMMONBITARRAY_H_ +class CBC_CommonBitArray; +class CBC_CommonBitArray : public CFX_Object +{ +public: + CBC_CommonBitArray(CBC_CommonBitArray* array); + CBC_CommonBitArray(FX_INT32 size); + CBC_CommonBitArray(); + virtual ~CBC_CommonBitArray(); + FX_INT32 GetSize(); + CFX_Int32Array& GetBits(); + FX_INT32 GetSizeInBytes(); + FX_BOOL Get(FX_INT32 i); + void Set(FX_INT32 i); + void Flip(FX_INT32 i); + void SetBulk(FX_INT32 i, FX_INT32 newBits); + FX_BOOL IsRange(FX_INT32 start, FX_INT32 end, FX_BOOL value, FX_INT32 &e); + FX_INT32 *GetBitArray(); + void Reverse(); + void Clear(); +private: + FX_INT32 m_size; + CFX_Int32Array m_bits; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_CommonBitMatrix.h b/xfa/src/fxbarcode/src/include/BC_CommonBitMatrix.h new file mode 100644 index 0000000000..f69d7a0e33 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_CommonBitMatrix.h @@ -0,0 +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 + +#ifndef _BC_COMMONBITMATRIX_H_ +#define _BC_COMMONBITMATRIX_H_ +class CBC_CommonBitArray; +class CBC_CommonBitMatrix; +class CBC_CommonBitMatrix : public CFX_Object +{ +public: + CBC_CommonBitMatrix(); + virtual ~CBC_CommonBitMatrix(); + FX_BOOL Get(FX_INT32 x, FX_INT32 y); + void Set(FX_INT32 x, FX_INT32 y); + void Flip(FX_INT32 x, FX_INT32 y); + void Clear(); + void SetRegion(FX_INT32 left, FX_INT32 top, FX_INT32 width, FX_INT32 height, FX_INT32 &e); + CBC_CommonBitArray* GetRow(FX_INT32 y, CBC_CommonBitArray* row); + void SetRow(FX_INT32 y, CBC_CommonBitArray* row); + CBC_CommonBitArray* GetCol(FX_INT32 y, CBC_CommonBitArray* row); + void SetCol(FX_INT32 y, CBC_CommonBitArray* col); + FX_INT32 GetWidth(); + FX_INT32 GetHeight(); + FX_INT32 GetRowSize(); + FX_INT32 GetDimension(FX_INT32 &e); + virtual void Init(FX_INT32 dimension); + virtual void Init(FX_INT32 width, FX_INT32 height); + FX_INT32* GetBits(); +private: + FX_INT32 m_width; + FX_INT32 m_height; + FX_INT32 m_rowSize; + FX_INT32* m_bits; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_CommonBitSource.h b/xfa/src/fxbarcode/src/include/BC_CommonBitSource.h new file mode 100644 index 0000000000..53891cf671 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_CommonBitSource.h @@ -0,0 +1,23 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_COMMONBITSOURCE_H_ +#define _BC_COMMONBITSOURCE_H_ +class CBC_CommonBitSource; +class CBC_CommonBitSource : public CFX_Object +{ +public: + CBC_CommonBitSource(CFX_ByteArray *bytes); + virtual ~CBC_CommonBitSource(); + FX_INT32 ReadBits(FX_INT32 numBits, FX_INT32 &e); + FX_INT32 Available(); + FX_INT32 getByteOffset(); +private: + CFX_ByteArray m_bytes; + FX_INT32 m_byteOffset; + FX_INT32 m_bitOffset; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_CommonByteArray.h b/xfa/src/fxbarcode/src/include/BC_CommonByteArray.h new file mode 100644 index 0000000000..fe0a67ffd1 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_CommonByteArray.h @@ -0,0 +1,30 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_COMMONBYTEARRAY_H_ +#define _BC_COMMONBYTEARRAY_H_ +class CBC_CommonByteArray; +class CBC_CommonByteArray : public CFX_Object +{ +private: + FX_INT32 m_size; + FX_INT32 m_index; + FX_BYTE* m_bytes; +public: + CBC_CommonByteArray(); + CBC_CommonByteArray(FX_INT32 size); + CBC_CommonByteArray(FX_BYTE* byteArray, FX_INT32 size); + virtual ~CBC_CommonByteArray(); + FX_INT32 At(FX_INT32 index); + void Set(FX_INT32 index, FX_INT32 value); + FX_INT32 Size(); + FX_BOOL IsEmpty(); + void AppendByte(FX_INT32 value); + void Reserve(FX_INT32 capacity); + void Set(FX_BYTE* source, FX_INT32 offset, FX_INT32 count); + void Set(CFX_ByteArray* source, FX_INT32 offset, FX_INT32 count); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_CommonByteMatrix.h b/xfa/src/fxbarcode/src/include/BC_CommonByteMatrix.h new file mode 100644 index 0000000000..3d831d1911 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_CommonByteMatrix.h @@ -0,0 +1,29 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_COMMONBYTEMATRIX_H_ +#define _BC_COMMONBYTEMATRIX_H_ +class CBC_CommonByteMatrix; +class CBC_CommonByteMatrix : public CFX_Object +{ +public: + CBC_CommonByteMatrix(FX_INT32 width, FX_INT32 height); + virtual ~CBC_CommonByteMatrix(); + FX_INT32 GetHeight(); + FX_INT32 GetWidth(); + FX_BYTE Get(FX_INT32 x, FX_INT32 y); + FX_BYTE* GetArray(); + + void Set(FX_INT32 x, FX_INT32 y, FX_INT32 value); + void Set(FX_INT32 x, FX_INT32 y, FX_BYTE value); + void clear(FX_BYTE value); + virtual void Init(); +private: + FX_BYTE *m_bytes; + FX_INT32 m_width; + FX_INT32 m_height; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_CommonCharacterSetECI.h b/xfa/src/fxbarcode/src/include/BC_CommonCharacterSetECI.h new file mode 100644 index 0000000000..1e9f9a433f --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_CommonCharacterSetECI.h @@ -0,0 +1,25 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_COMMONCHARACTERSETECI_H_ +#define _BC_COMMONCHARACTERSETECI_H_ +class CBC_CommonECI; +class CBC_CommonCharacterSetECI; +class CBC_CommonCharacterSetECI : public CBC_CommonECI +{ +public: + CBC_CommonCharacterSetECI(FX_INT32 value, CFX_ByteString encodingName); + virtual ~CBC_CommonCharacterSetECI(); + CFX_ByteString GetEncodingName(); + static void AddCharacterSet(FX_INT32 value, CFX_ByteString encodingName); + FX_INT32 GetValue(); + static CBC_CommonCharacterSetECI* GetCharacterSetECIByValue(FX_INT32 value); + static CBC_CommonCharacterSetECI* GetCharacterSetECIByName(const CFX_ByteString& name); +private: + CFX_ByteString m_encodingName; + static void initialize(); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_CommonDecoderResult.h b/xfa/src/fxbarcode/src/include/BC_CommonDecoderResult.h new file mode 100644 index 0000000000..808203bd01 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_CommonDecoderResult.h @@ -0,0 +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 _BC_COMMONDECODERRESULT_H_ +#define _BC_COMMONDECODERRESULT_H_ +class CBC_QRCoderErrorCorrectionLevel; +class CBC_PDF417ResultMetadata; +class CBC_CommonDecoderResult; +class CBC_CommonDecoderResult : public CFX_Object +{ +public: + CBC_CommonDecoderResult(); + virtual ~CBC_CommonDecoderResult(); + const CFX_ByteArray& GetRawBytes(); + const CFX_ByteString& GetText(); + const CFX_Int32Array& GetByteSegments(); + CBC_QRCoderErrorCorrectionLevel* GetECLevel(); + virtual void Init(const CFX_ByteArray &rawBytes, const CFX_ByteString &text, const CFX_Int32Array &byteSegments, CBC_QRCoderErrorCorrectionLevel* ecLevel, FX_INT32 &e); + virtual void Init(const CFX_ByteArray &rawBytes, const CFX_ByteString &text, const CFX_PtrArray &byteSegments, const CFX_ByteString &ecLevel, FX_INT32 &e); + void setOther(CBC_PDF417ResultMetadata* other); +private: + CFX_ByteArray m_rawBytes; + CFX_ByteString m_text; + CFX_Int32Array m_byteSegments; + CFX_PtrArray m_pdf417byteSegments; + CBC_QRCoderErrorCorrectionLevel* m_ecLevel; + CFX_ByteString m_pdf417ecLevel; + CBC_PDF417ResultMetadata* m_other; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_CommonECI.h b/xfa/src/fxbarcode/src/include/BC_CommonECI.h new file mode 100644 index 0000000000..3907066066 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_CommonECI.h @@ -0,0 +1,21 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_COMMONECI_H_ +#define _BC_COMMONECI_H_ +class CBC_CommonECI; +class CBC_CommonECI : public CFX_Object +{ +public: + CBC_CommonECI(FX_INT32 value); + virtual ~CBC_CommonECI(); + + FX_INT32 GetValue(); + static CBC_CommonECI* GetEICByValue(FX_INT32 value, FX_INT32 &e); +private: + FX_INT32 m_value; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_CommonPerspectiveTransform.h b/xfa/src/fxbarcode/src/include/BC_CommonPerspectiveTransform.h new file mode 100644 index 0000000000..5c42a1a6a7 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_CommonPerspectiveTransform.h @@ -0,0 +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 _BC_COMMONPERSPECTIVETRANSFORM_H_ +#define _BC_COMMONPERSPECTIVETRANSFORM_H_ +class CBC_CommonPerspectiveTransform; +class CBC_CommonPerspectiveTransform : public CFX_Object +{ +public: + CBC_CommonPerspectiveTransform(FX_FLOAT a11, FX_FLOAT a21, FX_FLOAT a31, + FX_FLOAT a12, FX_FLOAT a22, FX_FLOAT a32, + FX_FLOAT a13, FX_FLOAT a23, FX_FLOAT a33); + virtual ~CBC_CommonPerspectiveTransform(); + static CBC_CommonPerspectiveTransform *QuadrilateralToQuadrilateral(FX_FLOAT x0, FX_FLOAT y0, + FX_FLOAT x1, FX_FLOAT y1, + FX_FLOAT x2, FX_FLOAT y2, + FX_FLOAT x3, FX_FLOAT y3, + FX_FLOAT x0p, FX_FLOAT y0p, + FX_FLOAT x1p, FX_FLOAT y1p, + FX_FLOAT x2p, FX_FLOAT y2p, + FX_FLOAT x3p, FX_FLOAT y3p); + static CBC_CommonPerspectiveTransform *SquareToQuadrilateral(FX_FLOAT x0, FX_FLOAT y0, + FX_FLOAT x1, FX_FLOAT y1, + FX_FLOAT x2, FX_FLOAT y2, + FX_FLOAT x3, FX_FLOAT y3); + static CBC_CommonPerspectiveTransform *QuadrilateralToSquare(FX_FLOAT x0, FX_FLOAT y0, + FX_FLOAT x1, FX_FLOAT y1, + FX_FLOAT x2, FX_FLOAT y2, + FX_FLOAT x3, FX_FLOAT y3); + CBC_CommonPerspectiveTransform *BuildAdjoint(); + CBC_CommonPerspectiveTransform *Times(CBC_CommonPerspectiveTransform &other); + void TransformPoints(CFX_FloatArray *points); +private: + FX_FLOAT m_a11, m_a12, m_a13, m_a21, m_a22, m_a23, m_a31, m_a32, m_a33; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_DataMatrixBitMatrixParser.h b/xfa/src/fxbarcode/src/include/BC_DataMatrixBitMatrixParser.h new file mode 100644 index 0000000000..c5f1f3f7a0 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_DataMatrixBitMatrixParser.h @@ -0,0 +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 _BC_DATAMATRIXBITMATRIXPARSER_H_ +#define _BC_DATAMATRIXBITMATRIXPARSER_H_ +class CBC_CommonBitMatrix; +class CBC_DataMatrixVersion; +class CBC_DataMatrixBitMatrixParser; +class CBC_DataMatrixBitMatrixParser : public CFX_Object +{ +public: + CBC_DataMatrixBitMatrixParser(); + virtual ~CBC_DataMatrixBitMatrixParser(); + CBC_DataMatrixVersion *GetVersion(); + CFX_ByteArray *ReadCodewords(FX_INT32 &e); + FX_BOOL ReadModule(FX_INT32 row, FX_INT32 column, FX_INT32 numRows, FX_INT32 numColumns); + FX_INT32 ReadUtah(FX_INT32 row, FX_INT32 column, FX_INT32 numRows, FX_INT32 numColumns); + FX_INT32 ReadCorner1(FX_INT32 numRows, FX_INT32 numColumns); + FX_INT32 ReadCorner2(FX_INT32 numRows, FX_INT32 numColumns); + FX_INT32 ReadCorner3(FX_INT32 numRows, FX_INT32 numColumns); + FX_INT32 ReadCorner4(FX_INT32 numRows, FX_INT32 numColumns); + CBC_CommonBitMatrix *ExtractDataRegion(CBC_CommonBitMatrix *bitMatrix, FX_INT32 &e); + virtual void Init(CBC_CommonBitMatrix *bitMatrix, FX_INT32 &e); +private: + static CBC_DataMatrixVersion* ReadVersion(CBC_CommonBitMatrix *bitMatrix, FX_INT32 &e); + CBC_CommonBitMatrix *m_mappingBitMatrix; + CBC_CommonBitMatrix *m_readMappingMatrix; + CBC_DataMatrixVersion *m_version; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_DataMatrixDataBlock.h b/xfa/src/fxbarcode/src/include/BC_DataMatrixDataBlock.h new file mode 100644 index 0000000000..1dd62fe1fe --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_DataMatrixDataBlock.h @@ -0,0 +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 _BC_DATAMATRIXDATABLOCK_H_ +#define _BC_DATAMATRIXDATABLOCK_H_ +class CBC_DataMatrixVersion; +class CBC_DataMatrixDataBlock; +class CBC_DataMatrixDataBlock : public CFX_Object +{ +public: + virtual ~CBC_DataMatrixDataBlock(); + + FX_INT32 GetNumDataCodewords(); + CFX_ByteArray* GetCodewords(); + + static CFX_PtrArray *GetDataBlocks(CFX_ByteArray* rawCodewords, CBC_DataMatrixVersion *version, FX_INT32 &e); +private: + FX_INT32 m_numDataCodewords; + CFX_ByteArray m_codewords; + + CBC_DataMatrixDataBlock(FX_INT32 numDataCodewords, CFX_ByteArray *codewords); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_DataMatrixDecodedBitStreamParser.h b/xfa/src/fxbarcode/src/include/BC_DataMatrixDecodedBitStreamParser.h new file mode 100644 index 0000000000..060972d53a --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_DataMatrixDecodedBitStreamParser.h @@ -0,0 +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 _BC_DATAMATRIXDECODEDBITSTREAMPARSER_H_ +#define _BC_DATAMATRIXDECODEDBITSTREAMPARSER_H_ +class CBC_CommonDecoderResult; +class CBC_CommonBitSource; +class CBC_DataMatrixDecodedBitStreamParser; +class CBC_DataMatrixDecodedBitStreamParser : public CFX_Object +{ +public: + CBC_DataMatrixDecodedBitStreamParser(); + virtual ~CBC_DataMatrixDecodedBitStreamParser(); + static CBC_CommonDecoderResult *Decode(CFX_ByteArray &bytes, FX_INT32 &e); + +private: + static FX_INT32 DecodeAsciiSegment(CBC_CommonBitSource *bits, CFX_ByteString &result, CFX_ByteString &resultTrailer, FX_INT32 &e); + static void DecodeC40Segment(CBC_CommonBitSource *bits, CFX_ByteString &result, FX_INT32 &e); + static void DecodeTextSegment(CBC_CommonBitSource *bits, CFX_ByteString &result, FX_INT32 &e); + static void DecodeAnsiX12Segment(CBC_CommonBitSource *bits, CFX_ByteString &result, FX_INT32 &e); + static void ParseTwoBytes(FX_INT32 firstByte, FX_INT32 secondByte, CFX_Int32Array &result); + static void DecodeEdifactSegment(CBC_CommonBitSource *bits, CFX_ByteString &result, FX_INT32 &e); + static void DecodeBase256Segment(CBC_CommonBitSource *bits, CFX_ByteString &result, CFX_Int32Array &byteSegments, FX_INT32 &e); + static FX_BYTE Unrandomize255State(FX_INT32 randomizedBase256Codeword, FX_INT32 base256CodewordPosition); + + const static FX_CHAR C40_BASIC_SET_CHARS[]; + const static FX_CHAR C40_SHIFT2_SET_CHARS[]; + + + const static FX_CHAR TEXT_BASIC_SET_CHARS[]; + const static FX_CHAR TEXT_SHIFT3_SET_CHARS[]; + const static FX_INT32 PAD_ENCODE; + const static FX_INT32 ASCII_ENCODE; + const static FX_INT32 C40_ENCODE; + const static FX_INT32 TEXT_ENCODE; + const static FX_INT32 ANSIX12_ENCODE; + const static FX_INT32 EDIFACT_ENCODE; + const static FX_INT32 BASE256_ENCODE; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_DataMatrixDecoder.h b/xfa/src/fxbarcode/src/include/BC_DataMatrixDecoder.h new file mode 100644 index 0000000000..44f7efc7b7 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_DataMatrixDecoder.h @@ -0,0 +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 _BC_DATAMATRIXDECODER_H_ +#define _BC_DATAMATRIXDECODER_H_ +class CBC_ReedSolomonDecoder; +class CBC_CommonDecoderResult; +class CBC_CommonBitMatrix; +class CBC_DataMatrixDecoder; +class CBC_DataMatrixDecoder : public CFX_Object +{ +public: + CBC_DataMatrixDecoder(); + virtual ~CBC_DataMatrixDecoder(); + CBC_CommonDecoderResult *Decode(CBC_CommonBitMatrix *bits, FX_INT32 &e); + virtual void Init(); +private: + void CorrectErrors(CFX_ByteArray &codewordBytes, FX_INT32 numDataCodewords, FX_INT32 &e); + CBC_ReedSolomonDecoder *m_rsDecoder; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_DataMatrixDetector.h b/xfa/src/fxbarcode/src/include/BC_DataMatrixDetector.h new file mode 100644 index 0000000000..2d3ca744fe --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_DataMatrixDetector.h @@ -0,0 +1,78 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_DATAMATRIXDETECTOR_H_ +#define _BC_DATAMATRIXDETECTOR_H_ +class CBC_CommonBitMatrix; +class CBC_WhiteRectangleDetector; +class CBC_ResultPoint; +class CBC_QRDetectorResult; +class CBC_DataMatrixDetector; +class ResultPointsAndTransitions; +class CBC_ResultPointsAndTransitions : public CFX_Object +{ +public: + CBC_ResultPointsAndTransitions(CBC_ResultPoint *from, CBC_ResultPoint *to, FX_INT32 transitions) + { + m_from = from; + m_to = to; + m_transitions = transitions; + } + ~CBC_ResultPointsAndTransitions() + { + } + CBC_ResultPoint *GetFrom() + { + return m_from; + } + CBC_ResultPoint *GetTo() + { + return m_to; + } + FX_INT32 GetTransitions() + { + return m_transitions; + } +private: + CBC_ResultPoint *m_from; + CBC_ResultPoint *m_to; + FX_INT32 m_transitions; +}; +class CBC_DataMatrixDetector +{ +public: + CBC_DataMatrixDetector(CBC_CommonBitMatrix *image); + virtual ~CBC_DataMatrixDetector(); + CBC_QRDetectorResult *Detect(FX_INT32 &e); + CBC_ResultPoint *CorrectTopRightRectangular(CBC_ResultPoint *bottomLeft, + CBC_ResultPoint *bottomRight, + CBC_ResultPoint *topLeft, + CBC_ResultPoint *topRight, + FX_INT32 dimensionTop, FX_INT32 dimensionRight); + CBC_ResultPoint *CorrectTopRight(CBC_ResultPoint *bottomLeft, + CBC_ResultPoint *bottomRight, + CBC_ResultPoint *topLeft, + CBC_ResultPoint *topRight, + FX_INT32 dimension); + CBC_CommonBitMatrix *SampleGrid(CBC_CommonBitMatrix *image, + CBC_ResultPoint *topLeft, + CBC_ResultPoint *bottomLeft, + CBC_ResultPoint *bottomRight, + CBC_ResultPoint *topRight, + FX_INT32 dimensionX, FX_INT32 dimensionY, FX_INT32 &e); + CBC_ResultPointsAndTransitions *TransitionsBetween(CBC_ResultPoint *from, CBC_ResultPoint *to); + FX_BOOL IsValid(CBC_ResultPoint *p); + FX_INT32 Distance(CBC_ResultPoint *a, CBC_ResultPoint *b); + void Increment(CFX_MapPtrTemplate &table, CBC_ResultPoint *key); + FX_INT32 Round(FX_FLOAT d); + void OrderBestPatterns(CFX_PtrArray *patterns); + virtual void Init(FX_INT32 &e); +private: + CBC_CommonBitMatrix *m_image; + CBC_WhiteRectangleDetector *m_rectangleDetector; + const static FX_INT32 INTEGERS[5]; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_DataMatrixReader.h b/xfa/src/fxbarcode/src/include/BC_DataMatrixReader.h new file mode 100644 index 0000000000..4301512d70 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_DataMatrixReader.h @@ -0,0 +1,25 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_DATAMATRIXREADER_H_ +#define _BC_DATAMATRIXREADER_H_ +class CBC_BinaryBitmap; +class CBC_DataMatrixDecoder; +class CBC_Reader; +class CBC_DataMatrixReader; +class CBC_DataMatrixReader : public CBC_Reader +{ +public: + CBC_DataMatrixReader(); + virtual ~CBC_DataMatrixReader(); + CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 &e); + CFX_ByteString Decode(CBC_BinaryBitmap *image, int hints, FX_INT32 &e); + + virtual void Init(); +private: + CBC_DataMatrixDecoder *m_decoder; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_DataMatrixSymbolInfo144.h b/xfa/src/fxbarcode/src/include/BC_DataMatrixSymbolInfo144.h new file mode 100644 index 0000000000..e749b27d86 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_DataMatrixSymbolInfo144.h @@ -0,0 +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 _BC_DATAMATRIXSYMBOLINFO144_H_ +#define _BC_DATAMATRIXSYMBOLINFO144_H_ +class CBC_SymbolInfo; +class CBC_DataMatrixSymbolInfo144; +class CBC_DataMatrixSymbolInfo144 : public CBC_SymbolInfo +{ +public: + CBC_DataMatrixSymbolInfo144(); + virtual ~CBC_DataMatrixSymbolInfo144(); + FX_INT32 getInterleavedBlockCount(); + FX_INT32 getDataLengthForInterleavedBlock(FX_INT32 index); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_DataMatrixVersion.h b/xfa/src/fxbarcode/src/include/BC_DataMatrixVersion.h new file mode 100644 index 0000000000..41d2f23db6 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_DataMatrixVersion.h @@ -0,0 +1,101 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_DATAMATRIXVERSION_H_ +#define _BC_DATAMATRIXVERSION_H_ +class ECB; +class ECBlocks; +class CBC_DataMatrixVersion; +class ECB : public CFX_Object +{ +public: + ECB(FX_INT32 count, FX_INT32 dataCodewords) + { + m_count = count; + m_dataCodewords = dataCodewords; + } + + FX_INT32 GetCount() + { + return m_count; + } + + FX_INT32 GetDataCodewords() + { + return m_dataCodewords; + } +private: + FX_INT32 m_count; + FX_INT32 m_dataCodewords; +}; +class ECBlocks : public CFX_Object +{ +public: + ECBlocks(FX_INT32 ecCodewords, ECB *ecBlocks) + { + m_ecCodewords = ecCodewords; + m_ecBlocks.Add(ecBlocks); + } + + ECBlocks(FX_INT32 ecCodewords, ECB *ecBlocks1, ECB *ecBlocks2) + { + m_ecCodewords = ecCodewords; + m_ecBlocks.Add(ecBlocks1); + m_ecBlocks.Add(ecBlocks2); + } + ~ECBlocks() + { + for(FX_INT32 i = 0; i < m_ecBlocks.GetSize(); i++) { + delete (ECB*)m_ecBlocks[i]; + } + m_ecBlocks.RemoveAll(); + } + + FX_INT32 GetECCodewords() + { + return m_ecCodewords; + } + + const CFX_PtrArray &GetECBlocks() + { + return m_ecBlocks; + } +private: + FX_INT32 m_ecCodewords; + CFX_PtrArray m_ecBlocks; +}; +class CBC_DataMatrixVersion : public CFX_Object +{ +public: + CBC_DataMatrixVersion(FX_INT32 versionNumber, + FX_INT32 symbolSizeRows, + FX_INT32 symbolSizeColumns, + FX_INT32 dataRegionSizeRows, + FX_INT32 dataRegionSizeColumns, + ECBlocks *ecBlocks); + virtual ~CBC_DataMatrixVersion(); + static void Initialize(); + static void Finalize(); + FX_INT32 GetVersionNumber(); + FX_INT32 GetSymbolSizeRows(); + FX_INT32 GetSymbolSizeColumns(); + FX_INT32 GetDataRegionSizeRows(); + FX_INT32 GetDataRegionSizeColumns(); + FX_INT32 GetTotalCodewords(); + ECBlocks *GetECBlocks(); + static CBC_DataMatrixVersion *GetVersionForDimensions(FX_INT32 numRows, FX_INT32 numColumns, FX_INT32 &e); + static void ReleaseAll(); +private: + FX_INT32 m_versionNumber; + FX_INT32 m_symbolSizeRows; + FX_INT32 m_symbolSizeColumns; + FX_INT32 m_dataRegionSizeRows; + FX_INT32 m_dataRegionSizeColumns; + ECBlocks *m_ecBlocks; + FX_INT32 m_totalCodewords; + static CFX_PtrArray* VERSIONS; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_DataMatrixWriter.h b/xfa/src/fxbarcode/src/include/BC_DataMatrixWriter.h new file mode 100644 index 0000000000..c8a6bdd823 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_DataMatrixWriter.h @@ -0,0 +1,30 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_DATAMATRIXWRITER_H_ +#define _BC_DATAMATRIXWRITER_H_ +class CBC_CommonByteMatrix; +class CBC_CommonBitMatrix; +class CBC_DefaultPlacement; +class CBC_SymbolShapeHint; +class CBC_SymbolInfo; +class CBC_TwoDimWriter; +class CBC_DataMatrixWriter; +class CBC_DataMatrixWriter : public CBC_TwoDimWriter +{ +public: + CBC_DataMatrixWriter(); + virtual ~CBC_DataMatrixWriter(); + FX_BYTE* Encode(const CFX_WideString &contents, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); + FX_BYTE * Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); + FX_BYTE * Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e); + FX_BOOL SetErrorCorrectionLevel (FX_INT32 level); + +private: + static CBC_CommonByteMatrix* encodeLowLevel(CBC_DefaultPlacement* placement, CBC_SymbolInfo* symbolInfo, FX_INT32 &e); + FX_INT32 m_iCorrectLevel; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_DecoderResult.h b/xfa/src/fxbarcode/src/include/BC_DecoderResult.h new file mode 100644 index 0000000000..ff98b2c407 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_DecoderResult.h @@ -0,0 +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 _BC_DECODERRESULT_H_ +#define _BC_DECODERRESULT_H_ +class CBC_DecoderResult; +class CBC_DecoderResult : public CFX_Object +{ +public: + CBC_DecoderResult(CFX_ByteArray* rawBytes, CFX_ByteString text, CFX_ByteString ecLevel); + virtual ~CBC_DecoderResult(); + CFX_ByteArray* getRawBytes(); + CFX_ByteString getText(); + CFX_ByteString getECLevel(); + FX_INT32 getErrorsCorrected(); + void setErrorsCorrected(FX_INT32 errorsCorrected); + FX_INT32 getErasures(); + void setErasures(FX_INT32 erasures); + CFX_Object* getOther(); + void setOther(CFX_Object* other); +private: + CFX_ByteArray* m_rawBytes; + CFX_ByteString m_text; + CFX_ByteString m_ecLevel; + FX_INT32 m_errorsCorrected; + FX_INT32 m_erasures; + CFX_Object* m_other; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_DefaultPlacement.h b/xfa/src/fxbarcode/src/include/BC_DefaultPlacement.h new file mode 100644 index 0000000000..ba2da03408 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_DefaultPlacement.h @@ -0,0 +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 _BC_DEFAULTPLACEMENT_H_ +#define _BC_DEFAULTPLACEMENT_H_ +class CBC_DefaultPlacement; +class CBC_DefaultPlacement : public CFX_Object +{ +public: + CBC_DefaultPlacement(CFX_WideString codewords, FX_INT32 numcols, FX_INT32 numrows); + virtual ~CBC_DefaultPlacement(); + + FX_INT32 getNumrows(); + FX_INT32 getNumcols(); + CFX_ByteArray& getBits(); + FX_BOOL getBit(FX_INT32 col, FX_INT32 row); + void setBit(FX_INT32 col, FX_INT32 row, FX_BOOL bit); + FX_BOOL hasBit(FX_INT32 col, FX_INT32 row); + void place(); +private: + CFX_WideString m_codewords; + FX_INT32 m_numrows; + FX_INT32 m_numcols; + CFX_ByteArray m_bits; + void module(FX_INT32 row, FX_INT32 col, FX_INT32 pos, FX_INT32 bit); + void utah(FX_INT32 row, FX_INT32 col, FX_INT32 pos); + void corner1(FX_INT32 pos); + void corner2(FX_INT32 pos); + void corner3(FX_INT32 pos); + void corner4(FX_INT32 pos); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_Dimension.h b/xfa/src/fxbarcode/src/include/BC_Dimension.h new file mode 100644 index 0000000000..ff4aecace4 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_Dimension.h @@ -0,0 +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 _BC_DIMENSION_H_ +#define _BC_DIMENSION_H_ +class CBC_Dimension; +class CBC_Dimension : public CFX_Object +{ +public: + CBC_Dimension(); + CBC_Dimension(FX_INT32 width, FX_INT32 height, FX_INT32 &e); + virtual ~CBC_Dimension(); + FX_INT32 getWidth(); + FX_INT32 getHeight(); + FX_INT32 hashCode(); + CFX_WideString toString(); +private: + FX_INT32 m_width; + FX_INT32 m_height; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_EdifactEncoder.h b/xfa/src/fxbarcode/src/include/BC_EdifactEncoder.h new file mode 100644 index 0000000000..7e2453a71d --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_EdifactEncoder.h @@ -0,0 +1,23 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_EDIFACTENCODER_H_ +#define _BC_EDIFACTENCODER_H_ +class CBC_EncoderContext; +class CBC_EdifactEncoder; +class CBC_EdifactEncoder : public CBC_Encoder +{ +public: + CBC_EdifactEncoder(); + virtual ~CBC_EdifactEncoder(); + FX_INT32 getEncodingMode(); + void Encode(CBC_EncoderContext &context, FX_INT32 &e); +private: + static void handleEOD(CBC_EncoderContext &context, CFX_WideString buffer, FX_INT32 &e); + static void encodeChar(FX_WCHAR c, CFX_WideString &sb, FX_INT32 &e); + static CFX_WideString encodeToCodewords(CFX_WideString sb, FX_INT32 startPos, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_Encoder.h b/xfa/src/fxbarcode/src/include/BC_Encoder.h new file mode 100644 index 0000000000..10ac8763e5 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_Encoder.h @@ -0,0 +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 _BC_ENCODER_H_ +#define _BC_ENCODER_H_ +class CBC_EncoderContext; +class CBC_Encoder; +class CBC_Encoder : public CFX_Object +{ +public: + CBC_Encoder(); + virtual ~CBC_Encoder(); + virtual FX_INT32 getEncodingMode() = 0; + virtual void Encode(CBC_EncoderContext &context, FX_INT32 &e) = 0; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_EncoderContext.h b/xfa/src/fxbarcode/src/include/BC_EncoderContext.h new file mode 100644 index 0000000000..0099dbc9f0 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_EncoderContext.h @@ -0,0 +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 + +#ifndef _BC_ENCODERCONTEXT_H_ +#define _BC_ENCODERCONTEXT_H_ +class CBC_SymbolShapeHint; +class CBC_SymbolInfo; +class CBC_Dimension; +class CBC_EncoderContext; +class CBC_EncoderContext : public CBC_SymbolShapeHint +{ +public: + CBC_EncoderContext(const CFX_WideString msg, CFX_WideString ecLevel, FX_INT32 &e); + virtual ~CBC_EncoderContext(); + void setSymbolShape(SymbolShapeHint shape); + void setSizeConstraints(CBC_Dimension* minSize, CBC_Dimension* maxSize); + CFX_WideString getMessage(); + void setSkipAtEnd(FX_INT32 count); + FX_WCHAR getCurrentChar(); + FX_WCHAR getCurrent(); + void writeCodewords(CFX_WideString codewords); + void writeCodeword(FX_WCHAR codeword); + FX_INT32 getCodewordCount(); + void signalEncoderChange(FX_INT32 encoding); + void resetEncoderSignal(); + FX_BOOL hasMoreCharacters(); + FX_INT32 getRemainingCharacters(); + void updateSymbolInfo(FX_INT32 &e); + void updateSymbolInfo(FX_INT32 len, FX_INT32 &e); + void resetSymbolInfo(); +public: + CFX_WideString m_msg; + CFX_WideString m_codewords; + FX_INT32 m_pos; + FX_INT32 m_newEncoding; + CBC_SymbolInfo* m_symbolInfo; +private: + FX_INT32 getTotalMessageCharCount(); +private: + SymbolShapeHint m_shape; + CBC_Dimension* m_minSize; + CBC_Dimension* m_maxSize; + FX_INT32 m_skipAtEnd; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_ErrorCorrection.h b/xfa/src/fxbarcode/src/include/BC_ErrorCorrection.h new file mode 100644 index 0000000000..973ff33b8e --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_ErrorCorrection.h @@ -0,0 +1,29 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_ERRORCORRECTION_H_ +#define _BC_ERRORCORRECTION_H_ +class CBC_SymbolInfo; +class CBC_ErrorCorrection; +class CBC_ErrorCorrection : public CFX_Object +{ +public: + CBC_ErrorCorrection(); + virtual ~CBC_ErrorCorrection(); + static void Initialize(); + static void Finalize(); + static CFX_WideString encodeECC200(CFX_WideString codewords, CBC_SymbolInfo* symbolInfo, FX_INT32 &e); +private: + static FX_INT32 FACTOR_SETS[]; + static FX_INT32 FACTORS[][100]; + static FX_INT32 MODULO_VALUE; + static FX_INT32 LOG[256]; + static FX_INT32 ALOG[256]; +private: + static CFX_WideString createECCBlock(CFX_WideString codewords, FX_INT32 numECWords, FX_INT32 &e); + static CFX_WideString createECCBlock(CFX_WideString codewords, FX_INT32 start, FX_INT32 len, FX_INT32 numECWords, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_FinderPatternInfo.h b/xfa/src/fxbarcode/src/include/BC_FinderPatternInfo.h new file mode 100644 index 0000000000..bac9291947 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_FinderPatternInfo.h @@ -0,0 +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 _BC_FINDERPATTERNINFO_H_ +#define _BC_FINDERPATTERNINFO_H_ +class CBC_QRFinderPattern; +class CBC_QRFinderPatternInfo; +class CBC_QRFinderPatternInfo : public CFX_Object +{ +private: + CBC_QRFinderPattern *m_bottomLeft; + CBC_QRFinderPattern *m_topLeft; + CBC_QRFinderPattern *m_topRight; +public: + CBC_QRFinderPatternInfo(CFX_PtrArray *patternCenters); + virtual ~CBC_QRFinderPatternInfo(); + CBC_QRFinderPattern* GetBottomLeft(); + CBC_QRFinderPattern* GetTopLeft(); + CBC_QRFinderPattern* GetTopRight(); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_GlobalHistogramBinarizer.h b/xfa/src/fxbarcode/src/include/BC_GlobalHistogramBinarizer.h new file mode 100644 index 0000000000..ef084c075e --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_GlobalHistogramBinarizer.h @@ -0,0 +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 + +#ifndef _BC_GLOBALHISTOGRAMBINARIZER_H_ +#define _BC_GLOBALHISTOGRAMBINARIZER_H_ +class CBC_CommonBinarizer; +class CBC_CommonBitArray; +class CBC_CommonBitMatrix; +class CBC_LuminanceSource; +class CBC_GlobalHistogramBinarizer; +class CBC_GlobalHistogramBinarizer : public CBC_Binarizer +{ +public: + CBC_GlobalHistogramBinarizer(CBC_LuminanceSource *source); + virtual ~CBC_GlobalHistogramBinarizer(); + + void InitArrays(FX_INT32 luminanceSize); + CBC_CommonBitMatrix *GetBlackMatrix(FX_INT32 &e); + CBC_CommonBitArray *GetBlackRow(FX_INT32 y, CBC_CommonBitArray *row, FX_INT32 &e); + static FX_INT32 EstimateBlackPoint(CFX_Int32Array &buckets, FX_INT32 &e); +private: + CFX_ByteArray m_luminance; + CFX_Int32Array m_buckets; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_HighLevelEncoder.h b/xfa/src/fxbarcode/src/include/BC_HighLevelEncoder.h new file mode 100644 index 0000000000..170ca9f8fa --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_HighLevelEncoder.h @@ -0,0 +1,60 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_HIGHLEVALENCODER_H_ +#define _BC_HIGHLEVALENCODER_H_ +class CBC_SymbolShapeHint; +class CBC_HighLevelEncoder; +#define ASCII_ENCODATION 0 +#define C40_ENCODATION 1 +#define TEXT_ENCODATION 2 +#define X12_ENCODATION 3 +#define EDIFACT_ENCODATION 4 +#define BASE256_ENCODATION 5 +class CBC_HighLevelEncoder : public CBC_SymbolShapeHint +{ +public: + CBC_HighLevelEncoder(); + virtual ~CBC_HighLevelEncoder(); + CFX_ByteArray& getBytesForMessage(CFX_WideString msg); + static CFX_WideString encodeHighLevel(CFX_WideString msg, CFX_WideString ecLevel, FX_INT32 &e); + static CFX_WideString encodeHighLevel(CFX_WideString msg, CFX_WideString ecLevel, SymbolShapeHint shape, CBC_Dimension* minSize, CBC_Dimension* maxSize, FX_INT32 &e); + static FX_INT32 lookAheadTest(CFX_WideString msg, FX_INT32 startpos, FX_INT32 currentMode); + static FX_BOOL isDigit(FX_WCHAR ch); + static FX_BOOL isExtendedASCII(FX_WCHAR ch); + static FX_INT32 determineConsecutiveDigitCount(CFX_WideString msg, FX_INT32 startpos); + static void illegalCharacter(FX_WCHAR c, FX_INT32 &e); + +public: + static FX_WCHAR LATCH_TO_C40; + static FX_WCHAR LATCH_TO_BASE256; + static FX_WCHAR UPPER_SHIFT; + static FX_WCHAR LATCH_TO_ANSIX12; + static FX_WCHAR LATCH_TO_TEXT; + static FX_WCHAR LATCH_TO_EDIFACT; + static FX_WCHAR C40_UNLATCH; + static FX_WCHAR X12_UNLATCH; +private: + static FX_WCHAR PAD; + static FX_WCHAR MACRO_05; + static FX_WCHAR MACRO_06; + static const wchar_t* MACRO_05_HEADER; + static const wchar_t* MACRO_06_HEADER; + static const wchar_t MACRO_TRAILER; + CFX_ByteArray m_bytearray; +private: + static FX_WCHAR randomize253State(FX_WCHAR ch, FX_INT32 codewordPosition); + static FX_INT32 findMinimums(CFX_FloatArray &charCounts, CFX_Int32Array &intCharCounts, FX_INT32 min, CFX_ByteArray &mins); + static FX_INT32 getMinimumCount(CFX_ByteArray &mins); + static FX_BOOL isNativeC40(FX_WCHAR ch); + static FX_BOOL isNativeText(FX_WCHAR ch); + static FX_BOOL isNativeX12(FX_WCHAR ch); + static FX_BOOL isX12TermSep(FX_WCHAR ch); + static FX_BOOL isNativeEDIFACT(FX_WCHAR ch); + static FX_BOOL isSpecialB256(FX_WCHAR ch); + +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_LuminanceSource.h b/xfa/src/fxbarcode/src/include/BC_LuminanceSource.h new file mode 100644 index 0000000000..6aa85101c9 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_LuminanceSource.h @@ -0,0 +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 _BC_LUMINANCESOURCE_H +#define _BC_LUMINANCESOURCE_H +class CBC_LuminanceSource; +class CBC_LuminanceSource : public CFX_Object +{ +public: + CBC_LuminanceSource(FX_INT32 width, FX_INT32 height); + virtual ~CBC_LuminanceSource(); + FX_INT32 GetWidth(); + FX_INT32 GetHeight(); + + virtual CFX_ByteArray *GetRow(FX_INT32 y, CFX_ByteArray &row, FX_INT32 &e) = 0; + virtual CFX_ByteArray *GetMatrix() = 0; + virtual FX_BOOL IsCropSupported() + { + return FALSE; + } + virtual FX_BOOL IsRotateSupported() + { + return FALSE; + } + + virtual CBC_LuminanceSource *RotateCounterClockwise(FX_INT32 &e) = 0; +protected: + FX_INT32 m_width; + FX_INT32 m_height; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_OneDReader.h b/xfa/src/fxbarcode/src/include/BC_OneDReader.h new file mode 100644 index 0000000000..8645c9edf9 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_OneDReader.h @@ -0,0 +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 _BC_ONEDREADER_H_ +#define _BC_ONEDREADER_H_ +class CBC_Reader; +class CBC_BinaryBitmap; +class CBC_CommonBitArray; +class CBC_OneDReader; +class CBC_OneDReader : public CBC_Reader +{ +public: + CBC_OneDReader(); + virtual ~CBC_OneDReader(); + virtual CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 &e); + virtual CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e); + virtual CFX_ByteString DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e) + { + return ""; + } +private: + CFX_ByteString DeDecode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e); + +protected: + const static FX_INT32 INTEGER_MATH_SHIFT; + const static FX_INT32 PATTERN_MATCH_RESULT_SCALE_FACTOR; + void RecordPattern(CBC_CommonBitArray *row, FX_INT32 start, CFX_Int32Array *counters, FX_INT32 &e); + void RecordPatternInReverse(CBC_CommonBitArray *row, FX_INT32 start, CFX_Int32Array *counters, FX_INT32 &e); + FX_INT32 PatternMatchVariance(CFX_Int32Array *counters, const FX_INT32 *pattern, FX_INT32 maxIndividualVariance); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_OneDimReader.h b/xfa/src/fxbarcode/src/include/BC_OneDimReader.h new file mode 100644 index 0000000000..bb10060ba3 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_OneDimReader.h @@ -0,0 +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 _BC_ONEDUPCEANREADER_H_ +#define _BC_ONEDUPCEANREADER_H_ +class CBC_OneDReader; +class CBC_CommonBitArray; +class CBC_OneDimReader; +class CBC_OneDimReader : public CBC_OneDReader +{ +private: + const static FX_INT32 MAX_AVG_VARIANCE; + const static FX_INT32 MAX_INDIVIDUAL_VARIANCE; + + FX_BOOL CheckStandardUPCEANChecksum(CFX_ByteString &s, FX_INT32 &e); +public: + const static FX_INT32 START_END_PATTERN[3]; + const static FX_INT32 MIDDLE_PATTERN[5]; + const static FX_INT32 L_PATTERNS[10][4]; + const static FX_INT32 L_AND_G_PATTERNS[20][4]; + CBC_OneDimReader(); + virtual ~CBC_OneDimReader(); + CFX_ByteString DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e); + CFX_ByteString DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, CFX_Int32Array *startGuardRange, FX_INT32 hints, FX_INT32 &e); +protected: + CFX_Int32Array *FindStartGuardPattern(CBC_CommonBitArray *row, FX_INT32 &e); + virtual FX_BOOL CheckChecksum(CFX_ByteString &s, FX_INT32 &e); + CFX_Int32Array *FindGuardPattern(CBC_CommonBitArray *row, FX_INT32 rowOffset, FX_BOOL whiteFirst, CFX_Int32Array *pattern, FX_INT32 &e); + FX_INT32 DecodeDigit(CBC_CommonBitArray *row, CFX_Int32Array *counters, FX_INT32 rowOffset, const FX_INT32* patterns, FX_INT32 patternLength, FX_INT32 &e); + virtual FX_INT32 DecodeMiddle(CBC_CommonBitArray *row, CFX_Int32Array *startRange, CFX_ByteString &resultResult, FX_INT32 &e) + { + return 0; + } + virtual CFX_Int32Array *DecodeEnd(CBC_CommonBitArray *row, FX_INT32 endStart, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_OneDimWriter.h b/xfa/src/fxbarcode/src/include/BC_OneDimWriter.h new file mode 100644 index 0000000000..cd5d937aca --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_OneDimWriter.h @@ -0,0 +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 _BC_ONEDIMWRITER_H_ +#define _BC_ONEDIMWRITER_H_ +class CBC_Writer; +class CBC_CommonBitMatrix; +class CBC_OneDimWriter; +class CBC_OneDimWriter : public CBC_Writer +{ +public: + CBC_OneDimWriter(); + virtual ~CBC_OneDimWriter(); + FX_BYTE *Encode(const CFX_ByteString &contents, BCFORMAT format, + FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); + FX_BYTE *Encode(const CFX_ByteString &contents, BCFORMAT format, + FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e); + virtual FX_BYTE *Encode(const CFX_ByteString &contents, FX_INT32 &outLength, FX_INT32 &e) + { + return NULL; + }; + virtual void RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e); + virtual void RenderBitmapResult(CFX_DIBitmap *&pOutBitmap, FX_WSTR contents, FX_INT32 &e); + virtual void RenderDeviceResult(CFX_RenderDevice* device, const CFX_Matrix* matrix, FX_WSTR contents, FX_INT32 &e); + virtual FX_BOOL CheckContentValidity(FX_WSTR contents) + { + return TRUE; + }; + virtual CFX_WideString FilterContents(FX_WSTR contents) + { + return CFX_WideString(); + } + virtual CFX_WideString RenderTextContents(FX_WSTR contents) + { + return CFX_WideString(); + } + virtual void SetPrintChecksum(FX_BOOL checksum); + virtual void SetDataLength(FX_INT32 length); + virtual void SetCalcChecksum(FX_INT32 state); + virtual void SetFontSize(FX_FLOAT size); + virtual void SetFontStyle(FX_INT32 style); + virtual void SetFontColor(FX_ARGB color); + virtual FX_BOOL SetFont(CFX_Font * cFont); +protected: + FX_BOOL m_bPrintChecksum; + FX_INT32 m_iDataLenth; + FX_BOOL m_bCalcChecksum; + CFX_Font* m_pFont; + FX_FLOAT m_fFontSize; + FX_INT32 m_iFontStyle; + FX_DWORD m_fontColor; + BC_TEXT_LOC m_locTextLoc; + FX_INT32 m_iContentLen; + FX_BOOL m_bLeftPadding; + FX_BOOL m_bRightPadding; + CBC_CommonBitMatrix* m_output; + FX_INT32 m_barWidth; + FX_INT32 m_multiple; + FX_FLOAT m_outputHScale; + void CalcTextInfo(const CFX_ByteString &text, FXTEXT_CHARPOS *charPos, CFX_Font *cFont, FX_FLOAT geWidth, FX_INT32 fontSize, FX_FLOAT &charsLen); + virtual void ShowChars(FX_WSTR contents, CFX_DIBitmap *pOutBitmap, CFX_RenderDevice *device, const CFX_Matrix* matrix, FX_INT32 barWidth, FX_INT32 multiple, FX_INT32 &e); + virtual void ShowBitmapChars(CFX_DIBitmap *pOutBitmap, const CFX_ByteString str, FX_FLOAT geWidth, FXTEXT_CHARPOS* pCharPos, FX_FLOAT locX, FX_FLOAT locY, FX_INT32 barWidth); + virtual void ShowDeviceChars(CFX_RenderDevice *device, const CFX_Matrix* matrix, const CFX_ByteString str, FX_FLOAT geWidth, FXTEXT_CHARPOS* pCharPos, FX_FLOAT locX, FX_FLOAT locY, FX_INT32 barWidth); + FX_INT32 AppendPattern(FX_BYTE* target, FX_INT32 pos, const FX_INT32* pattern, FX_INT32 patternLength, FX_INT32 startColor, FX_INT32 &e); + FX_WCHAR Upper(FX_WCHAR ch); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_OnedCodaBarReader.h b/xfa/src/fxbarcode/src/include/BC_OnedCodaBarReader.h new file mode 100644 index 0000000000..1d03491841 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_OnedCodaBarReader.h @@ -0,0 +1,30 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_ONEDCODABARREADER_H_ +#define _BC_ONEDCODABARREADER_H_ +class CBC_CommonBitArray; +class CBC_OneDReader; +class CBC_OnedCodaBarReader; +class CBC_OnedCodaBarReader : public CBC_OneDReader +{ +public: + CBC_OnedCodaBarReader(); + virtual ~CBC_OnedCodaBarReader(); + CFX_ByteString DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e); + CFX_Int32Array *FindAsteriskPattern(CBC_CommonBitArray *row, FX_INT32 &e); + FX_BOOL ArrayContains(const FX_CHAR array[], FX_CHAR key); + FX_CHAR ToNarrowWidePattern(CFX_Int32Array *counter); + static FX_LPCSTR ALPHABET_STRING; + + + const static FX_INT32 CHARACTER_ENCODINGS[22]; + + const static FX_INT32 minCharacterLength; + + const static FX_CHAR STARTEND_ENCODING[8]; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_OnedCodaBarWriter.h b/xfa/src/fxbarcode/src/include/BC_OnedCodaBarWriter.h new file mode 100644 index 0000000000..b81839ca4a --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_OnedCodaBarWriter.h @@ -0,0 +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 + +#ifndef _BC_ONEDCODABARWRITER_H_ +#define _BC_ONEDCODABARWRITER_H_ +enum BC_TEXT_LOC; +class CBC_OneDimWriter; +class CBC_OnedCodaBarWriter; +class CBC_OnedCodaBarWriter : public CBC_OneDimWriter +{ +public: + CBC_OnedCodaBarWriter(); + virtual ~CBC_OnedCodaBarWriter(); + FX_BYTE* Encode(const CFX_ByteString &contents, FX_INT32 &outLength, FX_INT32 &e); + FX_BYTE *Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); + FX_BYTE *Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e); + CFX_WideString encodedContents(FX_WSTR contents); + FX_BOOL CheckContentValidity(FX_WSTR contents); + CFX_WideString FilterContents(FX_WSTR contents); + FX_BOOL SetStartChar(FX_CHAR start); + FX_BOOL SetEndChar(FX_CHAR end); + void SetDataLength(FX_INT32 length); + FX_BOOL SetTextLocation(BC_TEXT_LOC location); + FX_BOOL SetWideNarrowRatio(FX_INT32 ratio); + FX_BOOL FindChar(FX_WCHAR ch, FX_BOOL isContent); +private: + void RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e); + const static FX_CHAR START_END_CHARS[]; + const static FX_CHAR CONTENT_CHARS[]; + FX_CHAR m_chStart; + FX_CHAR m_chEnd; + FX_INT32 m_iWideNarrRatio; + +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_OnedCode128Reader.h b/xfa/src/fxbarcode/src/include/BC_OnedCode128Reader.h new file mode 100644 index 0000000000..94e1a6388b --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_OnedCode128Reader.h @@ -0,0 +1,40 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_ONEDCODA128READER_H_ +#define _BC_ONEDCODA128READER_H_ +class CBC_OneDReader; +class CBC_CommonBitArray; +class CBC_OnedCoda128Reader; +class CBC_OnedCode128Reader : public CBC_OneDReader +{ +public: + CBC_OnedCode128Reader(); + virtual ~CBC_OnedCode128Reader(); + virtual CFX_ByteString DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e); + const static FX_INT32 CODE_PATTERNS[107][7]; + const static FX_INT32 MAX_AVG_VARIANCE; + const static FX_INT32 MAX_INDIVIDUAL_VARIANCE; + + const static FX_INT32 CODE_SHIFT; + const static FX_INT32 CODE_CODE_C; + const static FX_INT32 CODE_CODE_B; + const static FX_INT32 CODE_CODE_A; + const static FX_INT32 CODE_FNC_1; + const static FX_INT32 CODE_FNC_2; + const static FX_INT32 CODE_FNC_3; + const static FX_INT32 CODE_FNC_4_A; + const static FX_INT32 CODE_FNC_4_B ; + + const static FX_INT32 CODE_START_A; + const static FX_INT32 CODE_START_B; + const static FX_INT32 CODE_START_C; + const static FX_INT32 CODE_STOP; +private: + CFX_Int32Array *FindStartPattern(CBC_CommonBitArray *row, FX_INT32 &e); + FX_INT32 DecodeCode(CBC_CommonBitArray *row, CFX_Int32Array *counters, FX_INT32 rowOffset, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_OnedCode128Writer.h b/xfa/src/fxbarcode/src/include/BC_OnedCode128Writer.h new file mode 100644 index 0000000000..daa48eca51 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_OnedCode128Writer.h @@ -0,0 +1,37 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_ONEDCODA128WRITER_H_ +#define _BC_ONEDCODA128WRITER_H_ +class CBC_OneDimWriter; +class CBC_OnedCoda128Writer; +class CBC_OnedCode128Writer : public CBC_OneDimWriter +{ +public: + CBC_OnedCode128Writer(); + CBC_OnedCode128Writer(BC_TYPE type); + virtual ~CBC_OnedCode128Writer(); + FX_BYTE * Encode(const CFX_ByteString &contents, BCFORMAT format, + FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e); + FX_BYTE * Encode(const CFX_ByteString &contents, BCFORMAT format, + FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); + FX_BYTE * Encode(const CFX_ByteString &contents, FX_INT32 &outLength , FX_INT32 &e); + FX_BOOL CheckContentValidity(FX_WSTR contents); + CFX_WideString FilterContents(FX_WSTR contents); + FX_BOOL SetTextLocation(BC_TEXT_LOC location); + BC_TYPE GetType(); +private: + FX_BOOL IsDigits(const CFX_ByteString &contents, FX_INT32 start, FX_INT32 length); + FX_INT32 Encode128B(const CFX_ByteString &contents, CFX_PtrArray &patterns); + FX_INT32 Encode128C(const CFX_ByteString &contents, CFX_PtrArray &patterns); + BC_TYPE m_codeFormat; + const static FX_INT32 CODE_START_B; + const static FX_INT32 CODE_START_C; + const static FX_INT32 CODE_CODE_B; + const static FX_INT32 CODE_CODE_C; + const static FX_INT32 CODE_STOP; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_OnedCode39Reader.h b/xfa/src/fxbarcode/src/include/BC_OnedCode39Reader.h new file mode 100644 index 0000000000..81fd6b79e9 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_OnedCode39Reader.h @@ -0,0 +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 _BC_ONEDCODA39READER_H_ +#define _BC_ONEDCODA39READER_H_ +class CBC_OneDReader; +class CBC_CommonBitArray; +class CBC_OnedCoda39Reader; +class CBC_OnedCode39Reader : public CBC_OneDReader +{ +public: + static FX_LPCSTR ALPHABET_STRING; + static FX_LPCSTR CHECKSUM_STRING; + const static FX_INT32 CHARACTER_ENCODINGS[44]; + const static FX_INT32 ASTERISK_ENCODING; + CBC_OnedCode39Reader(); + CBC_OnedCode39Reader(FX_BOOL usingCheckDigit); + CBC_OnedCode39Reader(FX_BOOL usingCheckDigit, FX_BOOL extendedMode); + virtual ~CBC_OnedCode39Reader(); + CFX_ByteString DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e); +private: + FX_BOOL m_usingCheckDigit; + FX_BOOL m_extendedMode; + CFX_Int32Array *FindAsteriskPattern(CBC_CommonBitArray *row, FX_INT32 &e); + FX_INT32 ToNarrowWidePattern(CFX_Int32Array *counters); + FX_CHAR PatternToChar(FX_INT32 pattern, FX_INT32 &e); + CFX_ByteString DecodeExtended(CFX_ByteString &encoded, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_OnedCode39Writer.h b/xfa/src/fxbarcode/src/include/BC_OnedCode39Writer.h new file mode 100644 index 0000000000..b37d9d8e19 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_OnedCode39Writer.h @@ -0,0 +1,37 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_ONEDCODA39WRITER_H_ +#define _BC_ONEDCODA39WRITER_H_ +enum BC_TEXT_LOC; +class CBC_OneDimWriter; +class CBC_OnedCoda39Writer; +class CBC_OnedCode39Writer : public CBC_OneDimWriter +{ +public: + CBC_OnedCode39Writer(); + CBC_OnedCode39Writer(FX_BOOL extendedMode); + virtual ~CBC_OnedCode39Writer(); + FX_BYTE *Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); + FX_BYTE *Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e); + FX_BYTE *Encode(const CFX_ByteString &contents, FX_INT32 &outLength, FX_INT32 &e); + void RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e); + CFX_WideString encodedContents(FX_WSTR contents, FX_INT32 &e); + FX_BOOL CheckContentValidity(FX_WSTR contents); + FX_BOOL CheckExtendedContentValidity(FX_WSTR contents); + CFX_WideString FilterContents(FX_WSTR contents); + CFX_WideString FilterExtendedContents(FX_WSTR contents); + CFX_WideString RenderTextContents(FX_WSTR contents); + CFX_WideString RenderExtendedTextContents(FX_WSTR contents); + FX_BOOL SetTextLocation(BC_TEXT_LOC loction); + FX_BOOL SetWideNarrowRatio(FX_INT32 ratio); +private: + void ToIntArray(FX_INT32 a, FX_INT32 *toReturn); + FX_CHAR CalcCheckSum(const CFX_ByteString &contents, FX_INT32 &e); + FX_INT32 m_iWideNarrRatio; + FX_BOOL m_extendedMode; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_OnedEAN13Reader.h b/xfa/src/fxbarcode/src/include/BC_OnedEAN13Reader.h new file mode 100644 index 0000000000..9afb9b6418 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_OnedEAN13Reader.h @@ -0,0 +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 _BC_ONEDEAN13READER_H_ +#define _BC_ONEDEAN13READER_H_ +class CBC_OneDimReader; +class CBC_CommonBitArray; +class CBC_OnedEAN13Reader; +class CBC_OnedEAN13Reader : public CBC_OneDimReader +{ +public: + const static FX_INT32 FIRST_DIGIT_ENCODINGS[10]; + CBC_OnedEAN13Reader(); + virtual ~CBC_OnedEAN13Reader(); +private: + void DetermineFirstDigit(CFX_ByteString &result, FX_INT32 lgPatternFound, FX_INT32 &e); +protected: + FX_INT32 DecodeMiddle(CBC_CommonBitArray *row, CFX_Int32Array *startRange, CFX_ByteString &resultString, FX_INT32 &e); + friend class CBC_OnedUPCAReader; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_OnedEAN13Writer.h b/xfa/src/fxbarcode/src/include/BC_OnedEAN13Writer.h new file mode 100644 index 0000000000..2353cfda95 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_OnedEAN13Writer.h @@ -0,0 +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 + +#ifndef _BC_ONEDEAN13WRITER_H_ +#define _BC_ONEDEAN13WRITER_H_ +class CBC_OneDimWriter; +class CBC_OnedEAN13Writer; +class CBC_OnedEAN13Writer : public CBC_OneDimWriter +{ +private: + FX_INT32 m_codeWidth; +public: + CBC_OnedEAN13Writer(); + virtual ~CBC_OnedEAN13Writer(); + + FX_BYTE* Encode(const CFX_ByteString &contents, BCFORMAT format, + FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); + FX_BYTE* Encode(const CFX_ByteString &contents, BCFORMAT format, + FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e); + FX_BYTE* Encode(const CFX_ByteString &contents, FX_INT32 &outLength, FX_INT32 &e); + void RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e); + FX_BOOL CheckContentValidity(FX_WSTR contents); + CFX_WideString FilterContents(FX_WSTR contents); + FX_INT32 CalcChecksum(const CFX_ByteString &contents); +protected: + void ShowChars(FX_WSTR contents, CFX_DIBitmap *pOutBitmap, CFX_RenderDevice* device, const CFX_Matrix* matrix, FX_INT32 barWidth, FX_INT32 multiple, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_OnedEAN8Reader.h b/xfa/src/fxbarcode/src/include/BC_OnedEAN8Reader.h new file mode 100644 index 0000000000..a32bb63083 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_OnedEAN8Reader.h @@ -0,0 +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 _BC_ONEDEAN8READER_H_ +#define _BC_ONEDEAN8READER_H_ +class CBC_OneDimReader; +class CBC_CommonBitArray; +class CBC_OnedEAN8Reader; +class CBC_OnedEAN8Reader : public CBC_OneDimReader +{ +public: + CBC_OnedEAN8Reader(); + virtual ~CBC_OnedEAN8Reader(); +protected: + FX_INT32 DecodeMiddle(CBC_CommonBitArray*, CFX_Int32Array *startRange, CFX_ByteString &result, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_OnedEAN8Writer.h b/xfa/src/fxbarcode/src/include/BC_OnedEAN8Writer.h new file mode 100644 index 0000000000..2b55734538 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_OnedEAN8Writer.h @@ -0,0 +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 _BC_ONEDEAN8WRITER_H_ +#define _BC_ONEDEAN8WRITER_H_ +enum BC_TEXT_LOC; +class CBC_OneDimWriter; +class CBC_OnedEAN8Writer; +class CBC_OnedEAN8Writer : public CBC_OneDimWriter +{ +private: + FX_INT32 m_codeWidth; +public: + CBC_OnedEAN8Writer(); + virtual ~CBC_OnedEAN8Writer(); + FX_BYTE * Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight , FX_INT32 &e); + FX_BYTE * Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints , FX_INT32 &e); + FX_BYTE * Encode(const CFX_ByteString &contents, FX_INT32 &outLength, FX_INT32 &e); + void RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e); + FX_BOOL CheckContentValidity(FX_WSTR contents); + CFX_WideString FilterContents(FX_WSTR contents); + void SetDataLength(FX_INT32 length); + FX_BOOL SetTextLocation(BC_TEXT_LOC location); + FX_INT32 CalcChecksum(const CFX_ByteString &contents); +protected: + + void ShowChars(FX_WSTR contents, CFX_DIBitmap *pOutBitmap, CFX_RenderDevice* device, const CFX_Matrix* matrix, FX_INT32 barWidth, FX_INT32 multiple, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_OnedUPCAReader.h b/xfa/src/fxbarcode/src/include/BC_OnedUPCAReader.h new file mode 100644 index 0000000000..5df6c739ff --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_OnedUPCAReader.h @@ -0,0 +1,30 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_ONEDUPCAREADER_H_ +#define _BC_ONEDUPCAREADER_H_ +class CBC_BinaryBitmap; +class CBC_CommonBitArray; +class CBC_OneDimReader; +class CBC_OnedEAN13Reader; +class CBC_OnedUPCAReader; +class CBC_OnedUPCAReader : public CBC_OneDimReader +{ +private: + CBC_OnedEAN13Reader *m_ean13Reader; +public: + CBC_OnedUPCAReader(); + virtual ~CBC_OnedUPCAReader(); + CFX_ByteString DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e); + CFX_ByteString DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, CFX_Int32Array *startGuardRange, FX_INT32 hints, FX_INT32 &e); + CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 &e); + CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e); + virtual void Init(); +protected: + FX_INT32 DecodeMiddle(CBC_CommonBitArray *row, CFX_Int32Array *startRange, CFX_ByteString &resultString, FX_INT32 &e); + CFX_ByteString MaybeReturnResult(CFX_ByteString &result, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_OnedUPCAWriter.h b/xfa/src/fxbarcode/src/include/BC_OnedUPCAWriter.h new file mode 100644 index 0000000000..4174ceb36e --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_OnedUPCAWriter.h @@ -0,0 +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 + +#ifndef _BC_ONEDUPCAWRITER_H_ +#define _BC_ONEDUPCAWRITER_H_ +class CBC_Writer; +class CBC_OnedEAN13Writer; +class CBC_OnedUPCAWriter; +class CBC_OnedUPCAWriter : public CBC_OneDimWriter +{ +private: + CBC_OnedEAN13Writer *m_subWriter; +public: + CBC_OnedUPCAWriter(); + virtual ~CBC_OnedUPCAWriter(); + virtual void Init(); + FX_BYTE* Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); + FX_BYTE* Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e); + void RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e); + FX_BOOL CheckContentValidity(FX_WSTR contents); + CFX_WideString FilterContents(FX_WSTR contents); + FX_INT32 CalcChecksum(const CFX_ByteString &contents); + +protected: + + void ShowChars(FX_WSTR contents, CFX_DIBitmap *pOutBitmap, CFX_RenderDevice* device, const CFX_Matrix* matrix, FX_INT32 barWidth, FX_INT32 multiple, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417.h b/xfa/src/fxbarcode/src/include/BC_PDF417.h new file mode 100644 index 0000000000..ab31244add --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_PDF417.h @@ -0,0 +1,45 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_PDF417_H_ +#define _BC_PDF417_H_ +class CBC_Compaction; +class CBC_BarcodeRow; +class CBC_BarcodeMatrix; +class CBC_PDF417; +class CBC_PDF417 : public CFX_Object +{ +public: + CBC_PDF417(); + CBC_PDF417(FX_BOOL compact); + virtual ~CBC_PDF417(); + CBC_BarcodeMatrix* getBarcodeMatrix(); + void generateBarcodeLogic(CFX_WideString msg, FX_INT32 errorCorrectionLevel, FX_INT32 &e); + void setDimensions(FX_INT32 maxCols, FX_INT32 minCols, FX_INT32 maxRows, FX_INT32 minRows); + void setCompaction(Compaction compaction); + void setCompact(FX_BOOL compact); +private: + static FX_INT32 START_PATTERN; + static FX_INT32 STOP_PATTERN; + static FX_INT32 CODEWORD_TABLE[][1000]; + static FX_FLOAT PREFERRED_RATIO; + static FX_FLOAT DEFAULT_MODULE_WIDTH; + static FX_FLOAT HEIGHT; + CBC_BarcodeMatrix* m_barcodeMatrix; + FX_BOOL m_compact; + Compaction m_compaction; + FX_INT32 m_minCols; + FX_INT32 m_maxCols; + FX_INT32 m_maxRows; + FX_INT32 m_minRows; +private: + static FX_INT32 calculateNumberOfRows(FX_INT32 m, FX_INT32 k, FX_INT32 c); + static FX_INT32 getNumberOfPadCodewords(FX_INT32 m, FX_INT32 k, FX_INT32 c, FX_INT32 r); + static void encodeChar(FX_INT32 pattern, FX_INT32 len, CBC_BarcodeRow* logic); + void encodeLowLevel(CFX_WideString fullCodewords, FX_INT32 c, FX_INT32 r, FX_INT32 errorCorrectionLevel, CBC_BarcodeMatrix* logic); + CFX_Int32Array* determineDimensions(FX_INT32 sourceCodeWords, FX_INT32 errorCorrectionCodeWords, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417BarcodeMatrix.h b/xfa/src/fxbarcode/src/include/BC_PDF417BarcodeMatrix.h new file mode 100644 index 0000000000..d8a0c5d0ae --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_PDF417BarcodeMatrix.h @@ -0,0 +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 _BC_BARCODEMATRIX_H_ +#define _BC_BARCODEMATRIX_H_ +class CBC_BarcodeRow; +class CBC_BarcodeMatrix; +class CBC_BarcodeMatrix : public CFX_Object +{ +public: + CBC_BarcodeMatrix(); + CBC_BarcodeMatrix(FX_INT32 height, FX_INT32 width); + virtual ~CBC_BarcodeMatrix(); + void set(FX_INT32 x, FX_INT32 y, FX_BYTE value); + void setMatrix(FX_INT32 x, FX_INT32 y, FX_BOOL black); + void startRow(); + CBC_BarcodeRow* getCurrentRow(); + CFX_ByteArray& getMatrix(); + CFX_ByteArray& getScaledMatrix(FX_INT32 scale); + CFX_ByteArray& getScaledMatrix(FX_INT32 xScale, FX_INT32 yScale); + FX_INT32 getWidth(); + FX_INT32 getHeight(); +private: + CFX_PtrArray m_matrix; + CFX_ByteArray m_matrixOut; + FX_INT32 m_currentRow; + FX_INT32 m_height; + FX_INT32 m_width; + FX_INT32 m_outWidth; + FX_INT32 m_outHeight; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417BarcodeMetadata.h b/xfa/src/fxbarcode/src/include/BC_PDF417BarcodeMetadata.h new file mode 100644 index 0000000000..62b1282827 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_PDF417BarcodeMetadata.h @@ -0,0 +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 + +#ifndef _BC_BARCODEMETADATA_H_ +#define _BC_BARCODEMETADATA_H_ +class CBC_BarcodeMetadata; +class CBC_BarcodeMetadata : public CFX_Object +{ +public: + CBC_BarcodeMetadata(FX_INT32 columnCount, FX_INT32 rowCountUpperPart, FX_INT32 rowCountLowerPart, FX_INT32 errorCorrectionLevel); + virtual ~CBC_BarcodeMetadata(); + FX_INT32 getColumnCount(); + FX_INT32 getErrorCorrectionLevel(); + FX_INT32 getRowCount(); + FX_INT32 getRowCountUpperPart(); + FX_INT32 getRowCountLowerPart(); +private: + FX_INT32 m_columnCount; + FX_INT32 m_errorCorrectionLevel; + FX_INT32 m_rowCountUpperPart; + FX_INT32 m_rowCountLowerPart; + FX_INT32 m_rowCount; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417BarcodeRow.h b/xfa/src/fxbarcode/src/include/BC_PDF417BarcodeRow.h new file mode 100644 index 0000000000..75fd15b653 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_PDF417BarcodeRow.h @@ -0,0 +1,25 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_BARCODEROW_H_ +#define _BC_BARCODEROW_H_ +class CBC_BarcodeRow; +class CBC_BarcodeRow : public CFX_Object +{ +public: + CBC_BarcodeRow(FX_INT32 width); + virtual ~CBC_BarcodeRow(); + void set(FX_INT32 x, FX_BYTE value); + void set(FX_INT32 x, FX_BOOL black); + void addBar(FX_BOOL black, FX_INT32 width); + CFX_ByteArray& getRow(); + CFX_ByteArray& getScaledRow(FX_INT32 scale); +private: + CFX_ByteArray m_row; + CFX_ByteArray m_output; + FX_INT32 m_currentLocation; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417BarcodeValue.h b/xfa/src/fxbarcode/src/include/BC_PDF417BarcodeValue.h new file mode 100644 index 0000000000..1695c8ac5a --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_PDF417BarcodeValue.h @@ -0,0 +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 _BC_BARCODEVALUE_H_ +#define _BC_BARCODEVALUE_H_ +class CBC_BarcodeValue; +class CBC_BarcodeValue : public CFX_Object +{ +public: + CBC_BarcodeValue(); + virtual ~CBC_BarcodeValue(); + void setValue(FX_INT32 value); + CFX_Int32Array* getValue(); + FX_INT32 getConfidence(FX_INT32 value); +private: + CFX_Int32Array m_keys; + CFX_Int32Array m_values; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417BoundingBox.h b/xfa/src/fxbarcode/src/include/BC_PDF417BoundingBox.h new file mode 100644 index 0000000000..efae2b706f --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_PDF417BoundingBox.h @@ -0,0 +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 _BC_BOUNDINGBOX_H_ +#define _BC_BOUNDINGBOX_H_ +class CBC_CommonBitMatrix; +class CBC_ResultPoint; +class CBC_BoundingBox; +class CBC_BoundingBox : public CFX_Object +{ +public: + CBC_BoundingBox(CBC_CommonBitMatrix* image, CBC_ResultPoint* topLeft, CBC_ResultPoint* bottomLeft, CBC_ResultPoint* topRight, CBC_ResultPoint* bottomRight, FX_INT32 &e); + CBC_BoundingBox(CBC_BoundingBox* boundingBox); + virtual ~CBC_BoundingBox(); + static CBC_BoundingBox* merge(CBC_BoundingBox* leftBox, CBC_BoundingBox* rightBox, FX_INT32 &e); + CBC_BoundingBox* addMissingRows(FX_INT32 missingStartRows, FX_INT32 missingEndRows, FX_BOOL isLeft, FX_INT32 &e); + void setTopRight(CBC_ResultPoint topRight); + void setBottomRight(CBC_ResultPoint bottomRight); + FX_INT32 getMinX(); + FX_INT32 getMaxX(); + FX_INT32 getMinY(); + FX_INT32 getMaxY(); + CBC_ResultPoint* getTopLeft(); + CBC_ResultPoint* getTopRight(); + CBC_ResultPoint* getBottomLeft(); + CBC_ResultPoint* getBottomRight(); +private: + CBC_CommonBitMatrix* m_image; + CBC_ResultPoint* m_topLeft; + CBC_ResultPoint* m_bottomLeft; + CBC_ResultPoint* m_topRight; + CBC_ResultPoint* m_bottomRight; + FX_INT32 m_minX; + FX_INT32 m_maxX; + FX_INT32 m_minY; + FX_INT32 m_maxY; + void init(CBC_CommonBitMatrix* image, CBC_ResultPoint* topLeft, CBC_ResultPoint* bottomLeft, CBC_ResultPoint* topRight, CBC_ResultPoint* bottomRight); + void calculateMinMaxValues(); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417Codeword.h b/xfa/src/fxbarcode/src/include/BC_PDF417Codeword.h new file mode 100644 index 0000000000..93b3cf6bb3 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_PDF417Codeword.h @@ -0,0 +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 _BC_CODEWORD_H_ +#define _BC_CODEWORD_H_ +class CBC_Codeword; +class CBC_Codeword : public CFX_Object +{ +public: + CBC_Codeword(FX_INT32 startX, FX_INT32 endX, FX_INT32 bucket, FX_INT32 value); + virtual ~CBC_Codeword(); + FX_BOOL hasValidRowNumber() ; + FX_BOOL isValidRowNumber(FX_INT32 rowNumber); + void setRowNumberAsRowIndicatorColumn(); + FX_INT32 getWidth(); + FX_INT32 getStartX(); + FX_INT32 getEndX(); + FX_INT32 getBucket(); + FX_INT32 getValue(); + FX_INT32 getRowNumber(); + void setRowNumber(FX_INT32 rowNumber); + CFX_ByteString toString(); +private: + static FX_INT32 BARCODE_ROW_UNKNOWN; + FX_INT32 m_startX; + FX_INT32 m_endX; + FX_INT32 m_bucket; + FX_INT32 m_value; + FX_INT32 m_rowNumber; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417CodewordDecoder.h b/xfa/src/fxbarcode/src/include/BC_PDF417CodewordDecoder.h new file mode 100644 index 0000000000..da22683bfa --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_PDF417CodewordDecoder.h @@ -0,0 +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 + +#ifndef _BC_PDF417CODEWORDDECODER_H_ +#define _BC_PDF417CODEWORDDECODER_H_ +class CBC_PDF417Common; +class CBC_PDF417CodewordDecoder; +#define column 8 +class CBC_PDF417CodewordDecoder : public CFX_Object +{ +public: + CBC_PDF417CodewordDecoder(); + virtual ~CBC_PDF417CodewordDecoder(); + static void Initialize(); + static void Finalize(); + static FX_INT32 getDecodedValue(CFX_Int32Array& moduleBitCount); +private: + static FX_FLOAT RATIOS_TABLE[][8]; + static CFX_Int32Array* sampleBitCounts(CFX_Int32Array& moduleBitCount); + static FX_INT32 getDecodedCodewordValue(CFX_Int32Array& moduleBitCount); + static FX_INT32 getBitValue(CFX_Int32Array& moduleBitCount); + static FX_INT32 getClosestDecodedValue(CFX_Int32Array& moduleBitCount); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417Common.h b/xfa/src/fxbarcode/src/include/BC_PDF417Common.h new file mode 100644 index 0000000000..19e3fe57da --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_PDF417Common.h @@ -0,0 +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 + +#ifndef _BC_PDF417COMMON_H_ +#define _BC_PDF417COMMON_H_ +class CBC_PDF417Common; +class CBC_PDF417Common : public CFX_Object +{ +public: + CBC_PDF417Common(); + virtual ~CBC_PDF417Common(); + static FX_INT32 getBitCountSum(CFX_Int32Array& moduleBitCount); + static FX_INT32 getCodeword(FX_DWORD symbol); + static FX_INT32 NUMBER_OF_CODEWORDS; + static FX_INT32 MAX_CODEWORDS_IN_BARCODE; + static FX_INT32 MIN_ROWS_IN_BARCODE; + static FX_INT32 MAX_ROWS_IN_BARCODE; + static FX_INT32 MAX_CODEWORDS_IN_ROW; + static FX_INT32 MODULES_IN_CODEWORD; + static FX_INT32 MODULES_IN_STOP_PATTERN; + static FX_INT32 BARS_IN_MODULE; + static FX_INT32 SYMBOL_TABLE[]; + static FX_INT32 CODEWORD_TABLE[]; +private: + static CFX_Int32Array* EMPTY_INT_ARRAY; + static FX_INT32 findCodewordIndex(FX_DWORD symbol); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417Compaction.h b/xfa/src/fxbarcode/src/include/BC_PDF417Compaction.h new file mode 100644 index 0000000000..774a23fbdf --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_PDF417Compaction.h @@ -0,0 +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 _BC_COMPACTION_H_ +#define _BC_COMPACTION_H_ +class CBC_Compaction; +enum Compaction { + AUTO, + TEXT, + BYTES, + NUMERIC +}; +class CBC_Compaction : public CFX_Object +{ +public: + CBC_Compaction(); + virtual ~CBC_Compaction(); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417DecodedBitStreamParser.h b/xfa/src/fxbarcode/src/include/BC_PDF417DecodedBitStreamParser.h new file mode 100644 index 0000000000..a612769106 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_PDF417DecodedBitStreamParser.h @@ -0,0 +1,49 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_DECODEDBITSTREAMPARSER_H_ +#define _BC_DECODEDBITSTREAMPARSER_H_ +class CBC_CommonDecoderResult; +class CBC_PDF417ResultMetadata; +class CBC_DecodedBitStreamPaser; +class CBC_DecodedBitStreamPaser : public CFX_Object +{ +public: + CBC_DecodedBitStreamPaser(); + virtual ~CBC_DecodedBitStreamPaser(); + static void Initialize(); + static void Finalize(); + static CBC_CommonDecoderResult* decode(CFX_Int32Array &codewords, CFX_ByteString ecLevel, FX_INT32 &e); + +private: + enum Mode { + ALPHA, + LOWER, + MIXED, + PUNCT, + ALPHA_SHIFT, + PUNCT_SHIFT + }; + static FX_INT32 MAX_NUMERIC_CODEWORDS; + static FX_INT32 PL; + static FX_INT32 LL; + static FX_INT32 AS; + static FX_INT32 ML; + static FX_INT32 AL; + static FX_INT32 PS; + static FX_INT32 PAL; + static FX_CHAR PUNCT_CHARS[29]; + static FX_CHAR MIXED_CHARS[30]; + static FX_INT32 EXP900[16]; + static FX_INT32 NUMBER_OF_SEQUENCE_CODEWORDS; + static FX_INT32 decodeMacroBlock(CFX_Int32Array &codewords, FX_INT32 codeIndex, CBC_PDF417ResultMetadata* resultMetadata, FX_INT32 &e); + static FX_INT32 textCompaction(CFX_Int32Array &codewords, FX_INT32 codeIndex, CFX_ByteString &result); + static void decodeTextCompaction(CFX_Int32Array &textCompactionData, CFX_Int32Array &byteCompactionData, FX_INT32 length, CFX_ByteString &result); + static FX_INT32 byteCompaction(FX_INT32 mode, CFX_Int32Array &codewords, FX_INT32 codeIndex, CFX_ByteString &result); + static FX_INT32 numericCompaction(CFX_Int32Array &codewords, FX_INT32 codeIndex, CFX_ByteString &result, FX_INT32 &e); + static CFX_ByteString decodeBase900toBase10(CFX_Int32Array &codewords, FX_INT32 count, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417DetectionResult.h b/xfa/src/fxbarcode/src/include/BC_PDF417DetectionResult.h new file mode 100644 index 0000000000..9c3401459b --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_PDF417DetectionResult.h @@ -0,0 +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 + +#ifndef _BC_EDTECTIONRESULT_H_ +#define _BC_EDTECTIONRESULT_H_ +class CBC_BarcodeMetadata; +class CBC_BoundingBox; +class CBC_Codeword; +class CBC_DetectionResultColumn; +class CBC_DetectionResult; +class CBC_DetectionResult : public CFX_Object +{ +public: + CBC_DetectionResult(CBC_BarcodeMetadata* barcodeMetadata, CBC_BoundingBox* boundingBox); + virtual ~CBC_DetectionResult(); + CFX_PtrArray& getDetectionResultColumns(); + void setBoundingBox(CBC_BoundingBox* boundingBox); + CBC_BoundingBox* getBoundingBox(); + void setDetectionResultColumn(FX_INT32 barcodeColumn, CBC_DetectionResultColumn* detectionResultColumn); + CBC_DetectionResultColumn* getDetectionResultColumn(FX_INT32 barcodeColumn); + CFX_ByteString toString(); + + FX_INT32 getBarcodeColumnCount(); + FX_INT32 getBarcodeRowCount(); + FX_INT32 getBarcodeECLevel(); +private: + static FX_INT32 ADJUST_ROW_NUMBER_SKIP; + CBC_BarcodeMetadata* m_barcodeMetadata; + CFX_PtrArray m_detectionResultColumns; + CBC_BoundingBox* m_boundingBox; + FX_INT32 m_barcodeColumnCount; +private: + void adjustIndicatorColumnRowNumbers(CBC_DetectionResultColumn* detectionResultColumn); + FX_INT32 adjustRowNumbers(); + FX_INT32 adjustRowNumbersByRow(); + FX_INT32 adjustRowNumbersFromBothRI(); + FX_INT32 adjustRowNumbersFromRRI(); + FX_INT32 adjustRowNumbersFromLRI(); + static FX_INT32 adjustRowNumberIfValid(FX_INT32 rowIndicatorRowNumber, FX_INT32 invalidRowCounts, CBC_Codeword* codeword); + void adjustRowNumbers(FX_INT32 barcodeColumn, FX_INT32 codewordsRow, CFX_PtrArray* codewords); + static FX_BOOL adjustRowNumber(CBC_Codeword* codeword, CBC_Codeword* otherCodeword); + + +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417DetectionResultColumn.h b/xfa/src/fxbarcode/src/include/BC_PDF417DetectionResultColumn.h new file mode 100644 index 0000000000..eddc3bce6d --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_PDF417DetectionResultColumn.h @@ -0,0 +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 + +#ifndef _BC_DETECTIONRESULTCOLUMN_H_ +#define _BC_DETECTIONRESULTCOLUMN_H_ +class CBC_Codeword; +class CBC_BoundingBox; +class CBC_DetectionResultColumn; +class CBC_DetectionResultColumn : public CFX_Object +{ +public: + CBC_DetectionResultColumn(CBC_BoundingBox* boundingBox); + virtual ~CBC_DetectionResultColumn(); + CBC_Codeword* getCodewordNearby(FX_INT32 imageRow); + FX_INT32 imageRowToCodewordIndex(FX_INT32 imageRow); + FX_INT32 codewordIndexToImageRow(FX_INT32 codewordIndex); + void setCodeword(FX_INT32 imageRow, CBC_Codeword* codeword); + CBC_Codeword* getCodeword(FX_INT32 imageRow); + CBC_BoundingBox* getBoundingBox(); + CFX_PtrArray* getCodewords(); + CFX_ByteString toString(); +public: + CBC_BoundingBox* m_boundingBox; + CFX_PtrArray* m_codewords; +private: + static FX_INT32 MAX_NEARBY_DISTANCE; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417DetectionResultRowIndicatorColumn.h b/xfa/src/fxbarcode/src/include/BC_PDF417DetectionResultRowIndicatorColumn.h new file mode 100644 index 0000000000..fbdd0f0ec4 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_PDF417DetectionResultRowIndicatorColumn.h @@ -0,0 +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 + +#ifndef _BC_DETECTIONRESULTROWINDICATORCOLUMN_H_ +#define _BC_DETECTIONRESULTROWINDICATORCOLUMN_H_ +class CBC_BarcodeMetadata; +class CBC_BoundingBox; +class CBC_DetectionResultRowIndicatorColumn; +class CBC_DetectionResultRowIndicatorColumn : public CBC_DetectionResultColumn +{ +public: + CBC_DetectionResultRowIndicatorColumn(CBC_BoundingBox* boundingBox, FX_BOOL isLeft); + virtual ~CBC_DetectionResultRowIndicatorColumn(); + void setRowNumbers(); + FX_INT32 adjustCompleteIndicatorColumnRowNumbers(CBC_BarcodeMetadata barcodeMetadata); + CFX_Int32Array* getRowHeights(FX_INT32 &e); + FX_INT32 adjustIncompleteIndicatorColumnRowNumbers(CBC_BarcodeMetadata barcodeMetadata); + CBC_BarcodeMetadata* getBarcodeMetadata(); + FX_BOOL isLeft(); + CFX_ByteString toString(); +private: + FX_BOOL m_isLeft; + void removeIncorrectCodewords(CFX_PtrArray* codewords, CBC_BarcodeMetadata barcodeMetadata); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417Detector.h b/xfa/src/fxbarcode/src/include/BC_PDF417Detector.h new file mode 100644 index 0000000000..557559e1f7 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_PDF417Detector.h @@ -0,0 +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 _BC_DETECTOR_H_ +#define _BC_DETECTOR_H_ +class CBC_PDF417DetectorResult; +class CBC_BinaryBitmap; +class CBC_CommonBitMatrix; +class CBC_CommonBitArray; +class CBC_Detector; +class CBC_Detector : public CFX_Object +{ +public: + CBC_Detector(); + virtual ~CBC_Detector(); + static CBC_PDF417DetectorResult* detect(CBC_BinaryBitmap* image, FX_INT32 hints, FX_BOOL multiple, FX_INT32 &e); + static void rotate180(CBC_CommonBitMatrix* bitMatrix); + static CBC_CommonBitArray* mirror(CBC_CommonBitArray* input, CBC_CommonBitArray* result); +private: + static FX_INT32 INDEXES_START_PATTERN[]; + static FX_INT32 INDEXES_STOP_PATTERN[]; + static FX_INT32 INTEGER_MATH_SHIFT; + static FX_INT32 PATTERN_MATCH_RESULT_SCALE_FACTOR; + static FX_INT32 MAX_AVG_VARIANCE; + static FX_INT32 MAX_INDIVIDUAL_VARIANCE; + static FX_INT32 START_PATTERN[]; + static FX_INT32 STOP_PATTERN[]; + static FX_INT32 MAX_PIXEL_DRIFT; + static FX_INT32 MAX_PATTERN_DRIFT; + static FX_INT32 SKIPPED_ROW_COUNT_MAX; + static FX_INT32 ROW_STEP; + static FX_INT32 BARCODE_MIN_HEIGHT; + static CFX_PtrArray* detect(FX_BOOL multiple, CBC_CommonBitMatrix* bitMatrix); + static CFX_PtrArray* findVertices(CBC_CommonBitMatrix* matrix, FX_INT32 startRow, FX_INT32 startColumn); + static void copyToResult(CFX_PtrArray* result, CFX_PtrArray* tmpResult, FX_INT32* destinationIndexes, FX_INT32 destinationLength); + static CFX_PtrArray* findRowsWithPattern(CBC_CommonBitMatrix* matrix, FX_INT32 height, FX_INT32 width, FX_INT32 startRow, FX_INT32 startColumn, FX_INT32* pattern, FX_INT32 patternLength); + static CFX_Int32Array* findGuardPattern(CBC_CommonBitMatrix* matrix, FX_INT32 column, FX_INT32 row, FX_INT32 width, FX_BOOL whiteFirst, FX_INT32* pattern, FX_INT32 patternLength, CFX_Int32Array &counters); + static FX_INT32 patternMatchVariance(CFX_Int32Array &counters, FX_INT32* pattern, FX_INT32 maxIndividualVariance); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417DetectorResult.h b/xfa/src/fxbarcode/src/include/BC_PDF417DetectorResult.h new file mode 100644 index 0000000000..ba557f1541 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_PDF417DetectorResult.h @@ -0,0 +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 _BC_PDF417DETECTORRESULT_H_ +#define _BC_PDF417DETECTORRESULT_H_ +class CBC_CommonBitMatrix; +class CBC_PDF417DetectorResult; +class CBC_PDF417DetectorResult : public CFX_Object +{ +public: + CBC_PDF417DetectorResult(CBC_CommonBitMatrix* bits, CFX_PtrArray* points); + virtual ~CBC_PDF417DetectorResult(); + CBC_CommonBitMatrix* getBits() ; + CFX_PtrArray* getPoints(); +private: + CBC_CommonBitMatrix* m_bits; + CFX_PtrArray* m_points; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417Dimensions.h b/xfa/src/fxbarcode/src/include/BC_PDF417Dimensions.h new file mode 100644 index 0000000000..6f8eaffed7 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_PDF417Dimensions.h @@ -0,0 +1,25 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_DIMENSIONS_H_ +#define _BC_DIMENSIONS_H_ +class CBC_Dimensions; +class CBC_Dimensions : public CFX_Object +{ +public: + CBC_Dimensions(FX_INT32 minCols, FX_INT32 maxCols, FX_INT32 minRows, FX_INT32 maxRows); + virtual ~CBC_Dimensions(); + FX_INT32 getMinCols(); + FX_INT32 getMaxCols(); + FX_INT32 getMinRows(); + FX_INT32 getMaxRows(); +private: + FX_INT32 m_minCols; + FX_INT32 m_maxCols; + FX_INT32 m_minRows; + FX_INT32 m_maxRows; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417ECErrorCorrection.h b/xfa/src/fxbarcode/src/include/BC_PDF417ECErrorCorrection.h new file mode 100644 index 0000000000..4ce8eda7d6 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_PDF417ECErrorCorrection.h @@ -0,0 +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 _BC_PDF417ECERRORCORRECTION_H_ +#define _BC_PDF417ECERRORCORRECTION_H_ +class CBC_PDF417ECModulusGF; +class CBC_PDF417ECModulusPoly; +class CBC_PDF417ECErrorCorrection; +class CBC_PDF417ECErrorCorrection : public CFX_Object +{ +public: + CBC_PDF417ECErrorCorrection(); + virtual ~CBC_PDF417ECErrorCorrection(); + static void Initialize(FX_INT32 &e); + static void Finalize(); + static FX_INT32 decode(CFX_Int32Array &received, FX_INT32 numECCodewords, CFX_Int32Array &erasures, FX_INT32 &e); +private: + static CBC_PDF417ECModulusGF* m_field; + static CFX_PtrArray* runEuclideanAlgorithm(CBC_PDF417ECModulusPoly* a, CBC_PDF417ECModulusPoly* b, FX_INT32 R, FX_INT32 &e); + static CFX_Int32Array* findErrorLocations(CBC_PDF417ECModulusPoly* errorLocator, FX_INT32 &e); + static CFX_Int32Array* findErrorMagnitudes(CBC_PDF417ECModulusPoly* errorEvaluator, CBC_PDF417ECModulusPoly* errorLocator, CFX_Int32Array &errorLocations, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417ECModulusGF.h b/xfa/src/fxbarcode/src/include/BC_PDF417ECModulusGF.h new file mode 100644 index 0000000000..7ebe33ecfd --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_PDF417ECModulusGF.h @@ -0,0 +1,37 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_PDF417ECMODULUSGF_H_ +#define _BC_PDF417ECMODULUSGF_H_ +class CBC_PDF417ECModulusPoly; +class CBC_PDF417Common; +class CBC_PDF417ECModulusGF; +class CBC_PDF417ECModulusGF : public CFX_Object +{ +public: + CBC_PDF417ECModulusGF(FX_INT32 modulus, FX_INT32 generator, FX_INT32 &e); + virtual ~CBC_PDF417ECModulusGF(); + static void Initialize(FX_INT32 &e); + static void Finalize(); + CBC_PDF417ECModulusPoly* getZero(); + CBC_PDF417ECModulusPoly* getOne(); + CBC_PDF417ECModulusPoly* buildMonomial(FX_INT32 degree, FX_INT32 coefficient, FX_INT32 &e); + FX_INT32 add(FX_INT32 a, FX_INT32 b); + FX_INT32 subtract(FX_INT32 a, FX_INT32 b); + FX_INT32 exp(FX_INT32 a); + FX_INT32 log(FX_INT32 a, FX_INT32 &e); + FX_INT32 inverse(FX_INT32 a, FX_INT32 &e); + FX_INT32 multiply(FX_INT32 a, FX_INT32 b); + FX_INT32 getSize(); + static CBC_PDF417ECModulusGF* PDF417_GF; +private: + CFX_Int32Array m_expTable; + CFX_Int32Array m_logTable; + CBC_PDF417ECModulusPoly* m_zero; + CBC_PDF417ECModulusPoly* m_one; + FX_INT32 m_modulus; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417ECModulusPoly.h b/xfa/src/fxbarcode/src/include/BC_PDF417ECModulusPoly.h new file mode 100644 index 0000000000..9a9d6c16f2 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_PDF417ECModulusPoly.h @@ -0,0 +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 _BC_PDF417ECMODULUSPOLY_H_ +#define _BC_PDF417ECMODULUSPOLY_H_ +class CBC_PDF417ECModulusGF; +class CBC_PDF417ECModulusPoly; +class CBC_PDF417ECModulusPoly : public CFX_Object +{ +public: + CBC_PDF417ECModulusPoly(CBC_PDF417ECModulusGF* field, CFX_Int32Array &coefficients, FX_INT32 &e); + virtual ~CBC_PDF417ECModulusPoly(); + CFX_Int32Array& getCoefficients(); + CBC_PDF417ECModulusGF* getField(); + FX_INT32 getDegree(); + FX_BOOL isZero(); + FX_INT32 getCoefficient(FX_INT32 degree); + FX_INT32 evaluateAt(FX_INT32 a); + CBC_PDF417ECModulusPoly* add(CBC_PDF417ECModulusPoly* other, FX_INT32 &e); + CBC_PDF417ECModulusPoly* subtract(CBC_PDF417ECModulusPoly* other, FX_INT32 &e); + CBC_PDF417ECModulusPoly* multiply(CBC_PDF417ECModulusPoly* other, FX_INT32 &e); + CBC_PDF417ECModulusPoly* negative(FX_INT32 &e); + CBC_PDF417ECModulusPoly* multiply(FX_INT32 scalar, FX_INT32 &e); + CBC_PDF417ECModulusPoly* multiplyByMonomial(FX_INT32 degree, FX_INT32 coefficient, FX_INT32 &e); + CFX_PtrArray* divide(CBC_PDF417ECModulusPoly* other, FX_INT32 &e); + CFX_ByteString toString(); +private: + CBC_PDF417ECModulusGF* m_field; + CFX_Int32Array m_coefficients; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417ErrorCorrection.h b/xfa/src/fxbarcode/src/include/BC_PDF417ErrorCorrection.h new file mode 100644 index 0000000000..4e3aee8d26 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_PDF417ErrorCorrection.h @@ -0,0 +1,21 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_PDF417ERRORCORRECTION_H_ +#define _BC_PDF417ERRORCORRECTION_H_ +class CBC_PDF417ErrorCorrection; +class CBC_PDF417ErrorCorrection : public CFX_Object +{ +public: + CBC_PDF417ErrorCorrection(); + virtual ~CBC_PDF417ErrorCorrection(); + static FX_INT32 getErrorCorrectionCodewordCount(FX_INT32 errorCorrectionLevel, FX_INT32 &e); + static FX_INT32 getRecommendedMinimumErrorCorrectionLevel(FX_INT32 n, FX_INT32 &e); + static CFX_WideString generateErrorCorrection(CFX_WideString dataCodewords, FX_INT32 errorCorrectionLevel, FX_INT32 &e); +private: + static FX_INT32 EC_COEFFICIENTS[][2500]; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417HighLevelEncoder.h b/xfa/src/fxbarcode/src/include/BC_PDF417HighLevelEncoder.h new file mode 100644 index 0000000000..4bca174bb2 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_PDF417HighLevelEncoder.h @@ -0,0 +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 + +#ifndef _BC_PDF417HIGHLEVELENCODER_H_ +#define _BC_PDF417HIGHLEVELENCODER_H_ +class CBC_Compaction; +class CBC_PDF417HighLevelEncoder; +class CBC_PDF417HighLevelEncoder : public CFX_Object +{ +public: + CBC_PDF417HighLevelEncoder(); + virtual ~CBC_PDF417HighLevelEncoder(); + static CFX_WideString encodeHighLevel(CFX_WideString msg, Compaction compaction, FX_INT32 &e); + static void Inverse(); + static void Initialize(); + static void Finalize(); +private: + static FX_INT32 TEXT_COMPACTION; + static FX_INT32 BYTE_COMPACTION; + static FX_INT32 NUMERIC_COMPACTION; + static FX_INT32 SUBMODE_PUNCTUATION; + static FX_INT32 LATCH_TO_TEXT; + static FX_INT32 LATCH_TO_BYTE_PADDED; + static FX_INT32 LATCH_TO_NUMERIC; + static FX_INT32 SHIFT_TO_BYTE; + static FX_INT32 LATCH_TO_BYTE; + static FX_BYTE TEXT_MIXED_RAW[]; + static FX_BYTE TEXT_PUNCTUATION_RAW[]; + static FX_INT32 MIXED[128]; + static FX_INT32 PUNCTUATION[128]; + static CFX_ByteArray* getBytesForMessage(CFX_WideString msg); + static FX_INT32 encodeText(CFX_WideString msg, FX_INT32 startpos, FX_INT32 count, CFX_WideString &sb, FX_INT32 initialSubmode); + static void encodeBinary(CFX_ByteArray* bytes, FX_INT32 startpos, FX_INT32 count, FX_INT32 startmode, CFX_WideString &sb); + static void encodeNumeric(CFX_WideString msg, FX_INT32 startpos, FX_INT32 count, CFX_WideString &sb); + static FX_BOOL isDigit(FX_WCHAR ch); + static FX_BOOL isAlphaUpper(FX_WCHAR ch); + static FX_BOOL isAlphaLower(FX_WCHAR ch); + static FX_BOOL isMixed(FX_WCHAR ch); + static FX_BOOL isPunctuation(FX_WCHAR ch); + static FX_BOOL isText(FX_WCHAR ch); + static FX_INT32 determineConsecutiveDigitCount(CFX_WideString msg, FX_INT32 startpos); + static FX_INT32 determineConsecutiveTextCount(CFX_WideString msg, FX_INT32 startpos); + static FX_INT32 determineConsecutiveBinaryCount(CFX_WideString msg, CFX_ByteArray* bytes, FX_INT32 startpos, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417Reader.h b/xfa/src/fxbarcode/src/include/BC_PDF417Reader.h new file mode 100644 index 0000000000..e6c0236cf7 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_PDF417Reader.h @@ -0,0 +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 _BC_PDF417READER_H_ +#define _BC_PDF417READER_H_ +class CBC_BinaryBitmap; +class CBC_ResultPoint; +class CBC_PDF417Reader; +class CBC_PDF417Reader : public CBC_Reader +{ +public: + CBC_PDF417Reader(); + virtual ~CBC_PDF417Reader(); + CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 &e); + CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_BOOL multiple, FX_INT32 hints, FX_INT32 &e); + CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e); +private: + static FX_INT32 getMaxWidth(CBC_ResultPoint* p1, CBC_ResultPoint* p2); + static FX_INT32 getMinWidth(CBC_ResultPoint* p1, CBC_ResultPoint* p2); + static FX_INT32 getMaxCodewordWidth(CFX_PtrArray& p); + static FX_INT32 getMinCodewordWidth(CFX_PtrArray& p); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417ResultMetadata.h b/xfa/src/fxbarcode/src/include/BC_PDF417ResultMetadata.h new file mode 100644 index 0000000000..e6c7780304 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_PDF417ResultMetadata.h @@ -0,0 +1,29 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_PDF417READER_H_ +#define _BC_PDF417READER_H_ +class CBC_PDF417ResultMetadata; +class CBC_PDF417ResultMetadata : public CFX_Object +{ +public: + CBC_PDF417ResultMetadata(); + virtual ~CBC_PDF417ResultMetadata(); + FX_INT32 getSegmentIndex(); + void setSegmentIndex(FX_INT32 segmentIndex); + CFX_ByteString getFileId(); + void setFileId(CFX_ByteString fileId); + CFX_Int32Array& getOptionalData(); + void setOptionalData(CFX_Int32Array &optionalData); + FX_BOOL isLastSegment(); + void setLastSegment(FX_BOOL lastSegment); +private: + FX_INT32 m_segmentIndex; + CFX_ByteString m_fileId; + CFX_Int32Array m_optionalData; + FX_BOOL m_lastSegment; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417ScanningDecoder.h b/xfa/src/fxbarcode/src/include/BC_PDF417ScanningDecoder.h new file mode 100644 index 0000000000..924e5f798a --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_PDF417ScanningDecoder.h @@ -0,0 +1,61 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_PDF417SCANNINGDECODER_H_ +#define _BC_PDF417SCANNINGDECODER_H_ +class CBC_CommonDecoderResult; +class CBC_CommonBitMatrix; +class CBC_ErrorCorrection; +class CBC_Codeword; +class CBC_BoundingBox; +class CBC_ResultPoint; +class CBC_BarcodeMetadata; +class CBC_BarcodeValue; +class CBC_DetectionResult; +class CBC_DetectionResultRowIndicatorColumn; +class CBC_PDF417ScanningDecoder; +class CBC_PDF417ScanningDecoder : public CFX_Object +{ +public: + CBC_PDF417ScanningDecoder(); + virtual ~CBC_PDF417ScanningDecoder(); + static void Initialize(); + static void Finalize(); + static CBC_CommonDecoderResult* decode(CBC_CommonBitMatrix* image, CBC_ResultPoint* imageTopLeft, CBC_ResultPoint* imageBottomLeft, CBC_ResultPoint* imageTopRight, + CBC_ResultPoint* imageBottomRight, FX_INT32 minCodewordWidth, FX_INT32 maxCodewordWidth, FX_INT32 &e); + static CFX_ByteString toString(CFX_PtrArray* barcodeMatrix); +private: + static FX_INT32 CODEWORD_SKEW_SIZE; + static FX_INT32 MAX_ERRORS; + static FX_INT32 MAX_EC_CODEWORDS; + static CBC_PDF417ECErrorCorrection* errorCorrection; + static CBC_DetectionResult* merge(CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn, CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn, FX_INT32 &e); + static CBC_BoundingBox* adjustBoundingBox(CBC_DetectionResultRowIndicatorColumn* rowIndicatorColumn, FX_INT32 &e); + static FX_INT32 getMax(CFX_Int32Array& values); + static CBC_BarcodeMetadata* getBarcodeMetadata(CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn, CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn); + static CBC_DetectionResultRowIndicatorColumn* getRowIndicatorColumn(CBC_CommonBitMatrix* image, CBC_BoundingBox* boundingBox, CBC_ResultPoint startPoint, + FX_BOOL leftToRight, FX_INT32 minCodewordWidth, FX_INT32 maxCodewordWidth); + static void adjustCodewordCount(CBC_DetectionResult* detectionResult, CFX_PtrArray* barcodeMatrix, FX_INT32 &e); + static CBC_CommonDecoderResult* createDecoderResult(CBC_DetectionResult* detectionResult, FX_INT32 &e); + static CBC_CommonDecoderResult* createDecoderResultFromAmbiguousValues(FX_INT32 ecLevel, CFX_Int32Array &codewords, CFX_Int32Array &erasureArray, CFX_Int32Array &ambiguousIndexes, + CFX_PtrArray& ambiguousIndexValues, FX_INT32 &e); + static CFX_PtrArray* createBarcodeMatrix(CBC_DetectionResult* detectionResult); + static FX_BOOL isValidBarcodeColumn(CBC_DetectionResult* detectionResult, FX_INT32 barcodeColumn); + static FX_INT32 getStartColumn(CBC_DetectionResult* detectionResult, FX_INT32 barcodeColumn, FX_INT32 imageRow, FX_BOOL leftToRight); + static CBC_Codeword* detectCodeword(CBC_CommonBitMatrix* image, FX_INT32 minColumn, FX_INT32 maxColumn, FX_BOOL leftToRight, FX_INT32 startColumn, + FX_INT32 imageRow, FX_INT32 minCodewordWidth, FX_INT32 maxCodewordWidth); + static CFX_Int32Array* getModuleBitCount(CBC_CommonBitMatrix* image, FX_INT32 minColumn, FX_INT32 maxColumn, FX_BOOL leftToRight, FX_INT32 startColumn, FX_INT32 imageRow); + static FX_INT32 getNumberOfECCodeWords(FX_INT32 barcodeECLevel); + static FX_INT32 adjustCodewordStartColumn(CBC_CommonBitMatrix* image, FX_INT32 minColumn, FX_INT32 maxColumn, FX_BOOL leftToRight, FX_INT32 codewordStartColumn, FX_INT32 imageRow); + static FX_BOOL checkCodewordSkew(FX_INT32 codewordSize, FX_INT32 minCodewordWidth, FX_INT32 maxCodewordWidth); + static CBC_CommonDecoderResult* decodeCodewords(CFX_Int32Array &codewords, FX_INT32 ecLevel, CFX_Int32Array &erasures, FX_INT32 &e); + static FX_INT32 correctErrors(CFX_Int32Array &codewords, CFX_Int32Array &erasures, FX_INT32 numECCodewords, FX_INT32 &e); + static void verifyCodewordCount(CFX_Int32Array &codewords, FX_INT32 numECCodewords, FX_INT32 &e); + static CFX_Int32Array* getBitCountForCodeword(FX_INT32 codeword); + static FX_INT32 getCodewordBucketNumber(FX_INT32 codeword); + static FX_INT32 getCodewordBucketNumber(CFX_Int32Array& moduleBitCount); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417Writer.h b/xfa/src/fxbarcode/src/include/BC_PDF417Writer.h new file mode 100644 index 0000000000..5d974f9377 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_PDF417Writer.h @@ -0,0 +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 _BC_PDF417WRITER_H_ +#define _BC_PDF417WRITER_H_ +class CBC_TwoDimWriter; +class CBC_PDF417Writer; +class CBC_PDF417Writer : public CBC_TwoDimWriter +{ +public: + CBC_PDF417Writer(); + virtual ~CBC_PDF417Writer(); + FX_BYTE * Encode(const CFX_WideString &contents, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); + + FX_BYTE * Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); + FX_BYTE * Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e); + FX_BOOL SetErrorCorrectionLevel(FX_INT32 level); + void SetTruncated(FX_BOOL truncated); +private: + void rotateArray(CFX_ByteArray& bitarray, FX_INT32 width, FX_INT32 height); + FX_BOOL m_bTruncated; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRAlignmentPattern.h b/xfa/src/fxbarcode/src/include/BC_QRAlignmentPattern.h new file mode 100644 index 0000000000..a52687b6b7 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_QRAlignmentPattern.h @@ -0,0 +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 _BC_QRALIGNMENTPATTERN_H_ +#define _BC_QRALIGNMENTPATTERN_H_ +class CBC_CommonBitArray; +class CBC_ResultPoint; +class CBC_REAI013x0x1xDecoder; +class CBC_QRAlignmentPattern : public CBC_ResultPoint +{ +private: + FX_FLOAT m_moduleSize; +public: + CBC_QRAlignmentPattern(FX_FLOAT posX, FX_FLOAT posY, FX_FLOAT estimateModuleSize); + virtual ~CBC_QRAlignmentPattern(); + FX_BOOL AboutEquals(FX_FLOAT moduleSize, FX_FLOAT i, FX_FLOAT j); + FX_FLOAT GetX(); + FX_FLOAT GetY(); + CBC_QRAlignmentPattern *Clone(); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRAlignmentPatternFinder.h b/xfa/src/fxbarcode/src/include/BC_QRAlignmentPatternFinder.h new file mode 100644 index 0000000000..5471c4e62a --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_QRAlignmentPatternFinder.h @@ -0,0 +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 _BC_QRALIGNMENTPATTERNFINDER_H_ +#define _BC_QRALIGNMENTPATTERNFINDER_H_ +class CBC_CommonBitMatrix; +class CBC_QRAlignmentPattern; +class CBC_QRAlignmentPatternFinder; +class CBC_QRAlignmentPatternFinder : public CFX_Object +{ +private: + CBC_CommonBitMatrix *m_image; + CFX_PtrArray m_possibleCenters; + FX_INT32 m_startX; + FX_INT32 m_startY; + FX_INT32 m_width; + FX_INT32 m_height; + FX_FLOAT m_moduleSize; + CFX_Int32Array m_crossCheckStateCount; +public: + CBC_QRAlignmentPatternFinder(CBC_CommonBitMatrix *image, FX_INT32 startX, FX_INT32 startY, FX_INT32 width, FX_INT32 height, FX_FLOAT moduleSize); + virtual ~CBC_QRAlignmentPatternFinder(); + FX_BOOL FoundPatternCross(const CFX_Int32Array &stateCount); + FX_FLOAT CrossCheckVertical(FX_INT32 startI, FX_INT32 startJ, FX_INT32 maxCount, FX_INT32 originalStateCountTotal); + CBC_QRAlignmentPattern* Find(FX_INT32 &e); + CBC_QRAlignmentPattern *HandlePossibleCenter(const CFX_Int32Array &stateCount, FX_INT32 i, FX_INT32 j); + static FX_FLOAT CenterFromEnd(const CFX_Int32Array &stateCount, FX_INT32 end); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRBitMatrixParser.h b/xfa/src/fxbarcode/src/include/BC_QRBitMatrixParser.h new file mode 100644 index 0000000000..2e176f63d3 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_QRBitMatrixParser.h @@ -0,0 +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 + +#ifndef _BC_QRABITMATRIXPARSER_H_ +#define _BC_QRABITMATRIXPARSER_H_ +class CBC_CommonBitMatrix ; +class CBC_QRCoderVersion; +class CBC_QRCoderFormatInformation; +class CBC_QRDataMask; +class CBC_QRBitMatrixParser; +class CBC_QRBitMatrixParser : public CFX_Object +{ +private: + CBC_CommonBitMatrix *m_bitMatrix; + CBC_CommonBitMatrix *m_tempBitMatrix; + CBC_QRCoderVersion *m_version; + CBC_QRCoderFormatInformation *m_parsedFormatInfo; + FX_INT32 m_dimension; +public: + CBC_QRBitMatrixParser(); + virtual ~CBC_QRBitMatrixParser(); + CBC_QRCoderFormatInformation *ReadFormatInformation(FX_INT32 &e); + CBC_QRCoderVersion *ReadVersion(FX_INT32 &e); + FX_INT32 CopyBit(FX_INT32 i, FX_INT32 j, FX_INT32 versionBits); + CFX_ByteArray *ReadCodewords(FX_INT32 &e); + virtual void Init(CBC_CommonBitMatrix *bitMatrix, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRCodeReader.h b/xfa/src/fxbarcode/src/include/BC_QRCodeReader.h new file mode 100644 index 0000000000..71a1ad3dd6 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_QRCodeReader.h @@ -0,0 +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 _BC_QRCODEREADER_H_ +#define _BC_QRCODEREADER_H_ +class CBC_QRDetector; +class CBC_BinaryBitmap; +class CBC_QRCoderDecoder; +class CBC_ResultPoint; +class CBC_ReedSolomonGF256; +class CBC_QRCoderVersion; +class CBC_QRDetector; +class CBC_QRDetectorResult; +class CBC_QRCoderErrorCorrectionLevel; +class CBC_QRCoderMode; +class CBC_QRDataMask; +class CBC_QRCodeReader; +class CBC_QRCodeReader : public CBC_Reader +{ +private: + CBC_QRCoderDecoder *m_decoder; +public: + CBC_QRCodeReader(); + virtual ~CBC_QRCodeReader(); + CFX_ByteString Decode(CFX_DIBitmap *pBitmap, FX_INT32 hints, FX_INT32 byteModeDecode, FX_INT32 &e); + CFX_ByteString Decode(const CFX_WideString &filename, FX_INT32 hints, FX_INT32 byteModeDecode, FX_INT32 &e); + static void ReleaseAll(); + CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e); + CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 &e); + virtual void Init(); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRCodeWriter.h b/xfa/src/fxbarcode/src/include/BC_QRCodeWriter.h new file mode 100644 index 0000000000..a4a4cbe048 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_QRCodeWriter.h @@ -0,0 +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 + +#ifndef _BC_QRCODERWRITER_H_ +#define _BC_QRCODERWRITER_H_ +#include "BC_TwoDimWriter.h" +class CBC_TwoDimWriter; +class CBC_MultiBarCodes; +class CBC_QRCoderWriter; +class CBC_QRCodeWriter : public CBC_TwoDimWriter +{ +public: + CBC_QRCodeWriter(); + virtual ~CBC_QRCodeWriter(); + FX_BYTE* Encode(const CFX_WideString& contents, FX_INT32 ecLevel, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); + FX_BYTE* Encode(const CFX_ByteString& contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e); + FX_BYTE* Encode(const CFX_ByteString& contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); + FX_BOOL SetVersion(FX_INT32 version); + FX_BOOL SetErrorCorrectionLevel(FX_INT32 level); + static void ReleaseAll(); +private: + + FX_INT32 m_iVersion; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRCoder.h b/xfa/src/fxbarcode/src/include/BC_QRCoder.h new file mode 100644 index 0000000000..89ce140fbd --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_QRCoder.h @@ -0,0 +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 + +#ifndef _BC_QRCODER_H_ +#define _BC_QRCODER_H_ +class CBC_QRCoderErrorCorrectionLevel ; +class CBC_QRCoderMode; +class CBC_CommonByteMatrix; +class CBC_QRCoder; +class CBC_QRCoder : public CFX_Object +{ +private: + CBC_QRCoderMode* m_mode; + CBC_QRCoderErrorCorrectionLevel* m_ecLevel; + FX_INT32 m_version; + FX_INT32 m_matrixWidth; + FX_INT32 m_maskPattern; + FX_INT32 m_numTotalBytes; + FX_INT32 m_numDataBytes; + FX_INT32 m_numECBytes; + FX_INT32 m_numRSBlocks; + CBC_CommonByteMatrix* m_matrix; +public: + const static FX_INT32 NUM_MASK_PATTERNS; + CBC_QRCoder(); + virtual ~CBC_QRCoder(); + CBC_QRCoderMode* GetMode(); + CBC_QRCoderErrorCorrectionLevel* GetECLevel(); + FX_INT32 GetVersion(); + FX_INT32 GetMatrixWidth(); + FX_INT32 GetMaskPattern(); + FX_INT32 GetNumTotalBytes(); + FX_INT32 GetNumDataBytes(); + FX_INT32 GetNumECBytes(); + FX_INT32 GetNumRSBlocks(); + CBC_CommonByteMatrix* GetMatrix(); + FX_INT32 At(FX_INT32 x, FX_INT32 y, FX_INT32 &e); + FX_BOOL IsValid(); + + void SetMode(CBC_QRCoderMode* value); + void SetECLevel(CBC_QRCoderErrorCorrectionLevel* ecLevel); + void SetVersion(FX_INT32 version); + void SetMatrixWidth(FX_INT32 width); + void SetMaskPattern(FX_INT32 pattern); + void SetNumDataBytes(FX_INT32 bytes); + void SetNumTotalBytes(FX_INT32 value); + void SetNumECBytes(FX_INT32 value); + void SetNumRSBlocks(FX_INT32 block); + void SetMatrix(CBC_CommonByteMatrix* value); + static FX_BOOL IsValidMaskPattern(FX_INT32 maskPattern); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRCoderBitVector.h b/xfa/src/fxbarcode/src/include/BC_QRCoderBitVector.h new file mode 100644 index 0000000000..6e9abba6c9 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_QRCoderBitVector.h @@ -0,0 +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 _BC_QRECODERBITVECTOR_H_ +#define _BC_QRECODERBITVECTOR_H_ +class CBC_QRCoderBitVector; +class CBC_QRCoderBitVector : public CFX_Object +{ +private: + FX_INT32 m_sizeInBits; + FX_BYTE *m_array; + FX_INT32 m_size; + + void AppendByte(FX_INT32 value); +public: + CBC_QRCoderBitVector(); + virtual ~CBC_QRCoderBitVector(); + FX_INT32 At(FX_INT32 index, FX_INT32 &e); + FX_INT32 Size(); + FX_INT32 sizeInBytes(); + void AppendBit(FX_INT32 bit, FX_INT32 &e); + void AppendBits(FX_INT32 value, FX_INT32 numBits, FX_INT32 &e); + void AppendBitVector(CBC_QRCoderBitVector *bits, FX_INT32 &e); + void XOR(CBC_QRCoderBitVector *other, FX_INT32 &e); + FX_BYTE* GetArray(); + void Clear(); + virtual void Init(); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRCoderBlockPair.h b/xfa/src/fxbarcode/src/include/BC_QRCoderBlockPair.h new file mode 100644 index 0000000000..234ac1a776 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_QRCoderBlockPair.h @@ -0,0 +1,23 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_QRCODERBLOCKPAIR_H_ +#define _BC_QRCODERBLOCKPAIR_H_ +class CBC_CommonByteArray; +class CBC_QRCoderBlockPair; +class CBC_QRCoderBlockPair : public CFX_Object +{ +private: + CBC_CommonByteArray* m_dataBytes; + CBC_CommonByteArray* m_errorCorrectionBytes; +public: + CBC_QRCoderBlockPair(CBC_CommonByteArray* data, CBC_CommonByteArray* errorCorrection); + virtual ~CBC_QRCoderBlockPair(); + + CBC_CommonByteArray* GetDataBytes(); + CBC_CommonByteArray* GetErrorCorrectionBytes(); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRCoderDecoder.h b/xfa/src/fxbarcode/src/include/BC_QRCoderDecoder.h new file mode 100644 index 0000000000..355af78180 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_QRCoderDecoder.h @@ -0,0 +1,29 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_QRCODERDECODER_H_ +#define _BC_QRCODERDECODER_H_ +class CBC_CommonBitMatrix; +class CBC_ReedSolomonDecoder; +class CBC_CommonDecoderResult; +class CBC_QRBitMatrixParser; +class CBC_QRCoderVersion; +class CBC_QRDataBlock; +class CBC_QRCoderDecoder; +class CBC_QRCoderDecoder : public CFX_Object +{ +private: + CBC_ReedSolomonDecoder *m_rsDecoder; +public: + CBC_QRCoderDecoder(); + virtual ~CBC_QRCoderDecoder(); + + CBC_CommonDecoderResult* Decode(FX_BOOL* image, FX_INT32 width, FX_INT32 height, FX_INT32 &e); + CBC_CommonDecoderResult* Decode(CBC_CommonBitMatrix* bits, FX_INT32 byteModeDecode, FX_INT32 &e); + void CorrectErrors(CFX_ByteArray* codewordBytes, FX_INT32 numDataCodewords, FX_INT32 &e); + virtual void Init(); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRCoderECB.h b/xfa/src/fxbarcode/src/include/BC_QRCoderECB.h new file mode 100644 index 0000000000..c6494b75cd --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_QRCoderECB.h @@ -0,0 +1,21 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_QRCODERECB_H_ +#define _BC_QRCODERECB_H_ +class CBC_QRCoderECB; +class CBC_QRCoderECB : public CFX_Object +{ +private: + FX_INT32 m_count; + FX_INT32 m_dataCodeWords; +public: + CBC_QRCoderECB(FX_INT32 count, FX_INT32 dataCodeWords); + virtual ~CBC_QRCoderECB(); + FX_INT32 GetCount(); + FX_INT32 GetDataCodeWords(); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRCoderECBlocks.h b/xfa/src/fxbarcode/src/include/BC_QRCoderECBlocks.h new file mode 100644 index 0000000000..385837510a --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_QRCoderECBlocks.h @@ -0,0 +1,25 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_QRCODERECBLOCKS_H_ +#define _BC_QRCODERECBLOCKS_H_ +class CBC_QRCoderECB; +class CBC_QRCoderECBlocks; +class CBC_QRCoderECBlocks : public CFX_Object +{ +private: + FX_INT32 m_ecCodeWordsPerBlock; + CFX_PtrArray m_ecBlocks; +public: + CBC_QRCoderECBlocks(FX_INT32 ecCodeWordsPerBlock, CBC_QRCoderECB* ecBlocks); + CBC_QRCoderECBlocks(FX_INT32 ecCodeWordsPerBlock, CBC_QRCoderECB* ecBlocks1, CBC_QRCoderECB* ecBlocks2); + virtual ~CBC_QRCoderECBlocks(); + FX_INT32 GetECCodeWordsPerBlock(); + FX_INT32 GetNumBlocks(); + FX_INT32 GetTotalECCodeWords(); + CFX_PtrArray* GetECBlocks(); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRCoderEncoder.h b/xfa/src/fxbarcode/src/include/BC_QRCoderEncoder.h new file mode 100644 index 0000000000..8dea2a6477 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_QRCoderEncoder.h @@ -0,0 +1,60 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_QRCODERENCODER_H_ +#define _BC_QRCODERENCODER_H_ +class Make_Pair; +class CBC_QRCoder; +class CBC_QRCoderErrorCorrectionLevel; +class CBC_QRCoderMode; +class CBC_QRCoderBitVector; +class CBC_CommonByteArray; +class CBC_CommonByteMatrix; +class CBC_QRCoderEncoder; +class CBC_QRCoderEncoder : public CFX_Object +{ +private: + const static FX_INT32 m_alphaNumbericTable[96]; +public: + CBC_QRCoderEncoder(); + virtual ~CBC_QRCoderEncoder(); + + static void Encode(const CFX_ByteString &content, CBC_QRCoderErrorCorrectionLevel* ecLevel, CBC_QRCoder *qrCode, FX_INT32 &e, FX_INT32 versionSpecify = 0); + static void Encode(const CFX_WideString &content, CBC_QRCoderErrorCorrectionLevel* ecLevel, CBC_QRCoder *qrCode, FX_INT32 &e); + static void EncodeWithSpecifyVersion(const CFX_ByteString &content, CBC_QRCoderErrorCorrectionLevel* ecLevel, + CBC_QRCoder *qrCode, FX_INT32 versionSpecify, FX_INT32 &e); + static void EncodeWithAutoVersion(const CFX_ByteString &content, CBC_QRCoderErrorCorrectionLevel* ecLevel, CBC_QRCoder *qrCode, FX_INT32 &e); + static CBC_QRCoderMode* ChooseMode(const CFX_ByteString & content, CFX_ByteString encoding); + static FX_INT32 GetAlphaNumericCode(FX_INT32 code); + static void AppendECI(CBC_QRCoderBitVector* bits); + static void AppendBytes(const CFX_ByteString &content, CBC_QRCoderMode* mode, CBC_QRCoderBitVector* bits, CFX_ByteString encoding, FX_INT32 &e); + static void AppendNumericBytes(const CFX_ByteString &content, CBC_QRCoderBitVector* bits, FX_INT32 &e); + static void AppendAlphaNumericBytes(const CFX_ByteString &content, CBC_QRCoderBitVector* bits, FX_INT32 &e); + static void Append8BitBytes(const CFX_ByteString &content, CBC_QRCoderBitVector* bits, CFX_ByteString encoding, FX_INT32 &e); + static void Append8BitBytes(CFX_ByteArray &bytes, CBC_QRCoderBitVector *bits, FX_INT32 &e); + static void AppendKanjiBytes(const CFX_ByteString &content, CBC_QRCoderBitVector* bits, FX_INT32 &e); + static void AppendGBKBytes(const CFX_ByteString &content, CBC_QRCoderBitVector* bits, FX_INT32 &e); + static void InitQRCode(FX_INT32 numInputBytes, FX_INT32 versionNumber, + CBC_QRCoderErrorCorrectionLevel* ecLevel, CBC_QRCoderMode* mode, CBC_QRCoder* qrCode, FX_INT32 &e); + static void InitQRCode(FX_INT32 numInputBytes, CBC_QRCoderErrorCorrectionLevel* ecLevel, CBC_QRCoderMode* mode, CBC_QRCoder* qrCode, FX_INT32 &e); + static void AppendModeInfo(CBC_QRCoderMode* mode, CBC_QRCoderBitVector* bits, FX_INT32 &e); + static void AppendLengthInfo(FX_INT32 numLetters, FX_INT32 version, CBC_QRCoderMode* mode, CBC_QRCoderBitVector* bits, FX_INT32 &e); + + static void InterleaveWithECBytes(CBC_QRCoderBitVector* bits, FX_INT32 numTotalBytes, FX_INT32 numDataBytes, FX_INT32 numRSBlocks, CBC_QRCoderBitVector* result, FX_INT32 &e); + static void GetNumDataBytesAndNumECBytesForBlockID(FX_INT32 numTotalBytes, FX_INT32 numDataBytes, + FX_INT32 numRSBlocks, FX_INT32 blockID, + FX_INT32 &numDataBytesInBlock, FX_INT32& numECBytesInBlocks); + static CBC_CommonByteArray* GenerateECBytes(CBC_CommonByteArray* dataBytes, FX_INT32 numEcBytesInBlock, FX_INT32 &e); + static FX_INT32 ChooseMaskPattern(CBC_QRCoderBitVector* bits, CBC_QRCoderErrorCorrectionLevel* ecLevel, + FX_INT32 version, CBC_CommonByteMatrix* matrix, FX_INT32 &e); + static FX_INT32 CalculateMaskPenalty(CBC_CommonByteMatrix* matrix); + static void TerminateBits(FX_INT32 numDataBytes, CBC_QRCoderBitVector* bits, FX_INT32 &e); + static FX_INT32 GetSpanByVersion(CBC_QRCoderMode *modeFirst, CBC_QRCoderMode *modeSecond, FX_INT32 versionNum, FX_INT32 &e); + static void MergeString(CFX_PtrArray &result, FX_INT32 versionNum, FX_INT32 &e); + static void SplitString(const CFX_ByteString &content, CFX_PtrArray &result); + static void AppendDataModeLenghInfo(CFX_PtrArray &splitResult, CBC_QRCoderBitVector &headerAndDataBits, CBC_QRCoderMode *tempMode, CBC_QRCoder *qrCode, CFX_ByteString &encoding, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRCoderErrorCorrectionLevel.h b/xfa/src/fxbarcode/src/include/BC_QRCoderErrorCorrectionLevel.h new file mode 100644 index 0000000000..2c0ad7b0b7 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_QRCoderErrorCorrectionLevel.h @@ -0,0 +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 _BC_QRCODERERRORCORRECTIONLEVEL_H_ +#define _BC_QRCODERERRORCORRECTIONLEVEL_H_ +class CBC_QRCoderErrorCorrectionLevel; +class CBC_QRCoderErrorCorrectionLevel : public CFX_Object +{ +private: + FX_INT32 m_ordinal; + FX_INT32 m_bits; + CFX_ByteString m_name; + CBC_QRCoderErrorCorrectionLevel(FX_INT32 ordinal, FX_INT32 bits, FX_CHAR* name); + CBC_QRCoderErrorCorrectionLevel(); +public: + static CBC_QRCoderErrorCorrectionLevel* L; + static CBC_QRCoderErrorCorrectionLevel* M; + static CBC_QRCoderErrorCorrectionLevel* Q; + static CBC_QRCoderErrorCorrectionLevel* H; + virtual ~CBC_QRCoderErrorCorrectionLevel(); + static void Initialize(); + static void Finalize(); + FX_INT32 Ordinal(); + FX_INT32 GetBits(); + CFX_ByteString GetName(); + static void Destroy(); + static CBC_QRCoderErrorCorrectionLevel* ForBits(FX_INT32 bits); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRCoderFormatInformation.h b/xfa/src/fxbarcode/src/include/BC_QRCoderFormatInformation.h new file mode 100644 index 0000000000..9d828c8380 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_QRCoderFormatInformation.h @@ -0,0 +1,29 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_QRCODERFORMATINFORMATION_H_ +#define _BC_QRCODERFORMATINFORMATION_H_ +class CBC_QRCoderErrorCorrectionLevel; +class CBC_QRCoderFormatInformation; +class CBC_QRCoderFormatInformation : public CFX_Object +{ +private: + const static FX_INT32 FORMAT_INFO_MASK_QR; + const static FX_INT32 FORMAT_INFO_DECODE_LOOKUP[32][2]; + const static FX_INT32 BITS_SET_IN_HALF_BYTE[16]; + CBC_QRCoderErrorCorrectionLevel* m_errorCorrectLevl; + FX_BYTE m_dataMask; +public: + CBC_QRCoderFormatInformation(FX_INT32 formatInfo); + virtual ~CBC_QRCoderFormatInformation(); + FX_BYTE GetDataMask(); + CBC_QRCoderErrorCorrectionLevel* GetErrorCorrectionLevel(); + + static FX_INT32 NumBitsDiffering(FX_INT32 a, FX_INT32 b); + static CBC_QRCoderFormatInformation* DecodeFormatInformation(FX_INT32 maskedFormatInfo); + static CBC_QRCoderFormatInformation* DoDecodeFormatInformation(FX_INT32 maskedFormatInfo); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRCoderMaskUtil.h b/xfa/src/fxbarcode/src/include/BC_QRCoderMaskUtil.h new file mode 100644 index 0000000000..134d344e72 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_QRCoderMaskUtil.h @@ -0,0 +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 _BC_QRCODERMASKUTIL_H_ +#define _BC_QRCODERMASKUTIL_H_ +class CBC_CommonByteMatrix; +class CBC_QRCoderMaskUtil; +class CBC_QRCoderMaskUtil : public CFX_Object +{ +public: + CBC_QRCoderMaskUtil(); + virtual ~CBC_QRCoderMaskUtil(); + static FX_BOOL GetDataMaskBit(FX_INT32 maskPattern, FX_INT32 x, FX_INT32 y, FX_INT32 &e); + + static FX_INT32 ApplyMaskPenaltyRule1(CBC_CommonByteMatrix* matrix); + static FX_INT32 ApplyMaskPenaltyRule2(CBC_CommonByteMatrix* matrix); + static FX_INT32 ApplyMaskPenaltyRule3(CBC_CommonByteMatrix* matrix); + static FX_INT32 ApplyMaskPenaltyRule4(CBC_CommonByteMatrix* matrix); + static FX_INT32 ApplyMaskPenaltyRule1Internal(CBC_CommonByteMatrix* matrix, FX_BOOL isHorizontal); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRCoderMatrixUtil.h b/xfa/src/fxbarcode/src/include/BC_QRCoderMatrixUtil.h new file mode 100644 index 0000000000..23a9d88128 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_QRCoderMatrixUtil.h @@ -0,0 +1,50 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_QRCODERMATRIXUTIL_H_ +#define _BC_QRCODERMATRIXUTIL_H_ +class CBC_CommonByteMatrix; +class CBC_QRCoderErrorCorrectionLevel; +class CBC_QRCoderBitVector; +class CBC_QRCoderMatrixUtil; +class CBC_QRCoderMatrixUtil : public CFX_Object +{ +private: + const static FX_INT32 POSITION_DETECTION_PATTERN[7][7]; + const static FX_INT32 VERTICAL_SEPARATION_PATTERN[7][1]; + const static FX_INT32 HORIZONTAL_SEPARATION_PATTERN[1][8]; + const static FX_INT32 POSITION_ADJUSTMENT_PATTERN[5][5]; + const static FX_INT32 POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE[40][7]; + const static FX_INT32 TYPE_INFO_COORDINATES[15][2]; + const static FX_INT32 VERSION_INFO_POLY; + const static FX_INT32 TYPE_INFO_POLY; + const static FX_INT32 TYPE_INFO_MASK_PATTERN; +public: + CBC_QRCoderMatrixUtil(); + virtual ~CBC_QRCoderMatrixUtil(); + static void ClearMatrix(CBC_CommonByteMatrix* matrix, FX_INT32 &e); + static void BuildMatrix(CBC_QRCoderBitVector* dataBits, CBC_QRCoderErrorCorrectionLevel* ecLevel, + FX_INT32 version, FX_INT32 maskPattern, CBC_CommonByteMatrix* matrix, FX_INT32 &e); + static void EmbedBasicPatterns(FX_INT32 version, CBC_CommonByteMatrix* matrix, FX_INT32 &e); + static void EmbedTypeInfo(CBC_QRCoderErrorCorrectionLevel* ecLevel, FX_INT32 maskPattern, CBC_CommonByteMatrix *matrix, FX_INT32 &e); + static void EmbedDataBits(CBC_QRCoderBitVector* dataBits, FX_INT32 maskPattern, CBC_CommonByteMatrix* matrix, FX_INT32 &e); + static void MaybeEmbedVersionInfo(FX_INT32 version, CBC_CommonByteMatrix* matrix, FX_INT32 &e); + static FX_INT32 FindMSBSet(FX_INT32 value); + static FX_INT32 CalculateBCHCode(FX_INT32 code, FX_INT32 poly); + static void MakeTypeInfoBits(CBC_QRCoderErrorCorrectionLevel* ecLevel, FX_INT32 maskPattern, CBC_QRCoderBitVector* bits, FX_INT32 &e); + static void MakeVersionInfoBits(FX_INT32 version, CBC_QRCoderBitVector* bits, FX_INT32 &e); + static FX_BOOL IsEmpty(FX_INT32 value); + static FX_BOOL IsValidValue(FX_INT32 value); + static void EmbedTimingPatterns(CBC_CommonByteMatrix* matrix, FX_INT32 &e); + static void EmbedDarkDotAtLeftBottomCorner(CBC_CommonByteMatrix* matrix, FX_INT32 &e); + static void EmbedHorizontalSeparationPattern(FX_INT32 xStart, FX_INT32 yStart, CBC_CommonByteMatrix* matrix, FX_INT32 &e); + static void EmbedVerticalSeparationPattern(FX_INT32 xStart, FX_INT32 yStart, CBC_CommonByteMatrix* matrix, FX_INT32 &e); + static void EmbedPositionAdjustmentPattern(FX_INT32 xStart, FX_INT32 yStart, CBC_CommonByteMatrix* matrix, FX_INT32 &e); + static void EmbedPositionDetectionPattern(FX_INT32 xStart, FX_INT32 yStart, CBC_CommonByteMatrix* matrix, FX_INT32 &e); + static void EmbedPositionDetectionPatternsAndSeparators(CBC_CommonByteMatrix* matrix, FX_INT32 &e); + static void MaybeEmbedPositionAdjustmentPatterns(FX_INT32 version, CBC_CommonByteMatrix* matrix, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRCoderMode.h b/xfa/src/fxbarcode/src/include/BC_QRCoderMode.h new file mode 100644 index 0000000000..71cea9fc78 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_QRCoderMode.h @@ -0,0 +1,40 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_QRCODERMODE_H_ +#define _BC_QRCODERMODE_H_ +class CBC_QRCoderVersion; +class CBC_QRCoderMode; +class CBC_QRCoderMode : public CFX_Object +{ +private: + FX_INT32* m_characterCountBitsForVersions; + FX_INT32 m_bits; + CFX_ByteString m_name; + CBC_QRCoderMode(FX_INT32 *characterCountBitsForVersions, FX_INT32 x1, FX_INT32 x2, FX_INT32 x3, FX_INT32 bits, CFX_ByteString name); + CBC_QRCoderMode(); +public: + static CBC_QRCoderMode* sBYTE; + static CBC_QRCoderMode* sNUMERIC; + static CBC_QRCoderMode* sALPHANUMERIC; + static CBC_QRCoderMode* sKANJI; + static CBC_QRCoderMode* sECI; + static CBC_QRCoderMode* sGBK; + static CBC_QRCoderMode* sTERMINATOR; + static CBC_QRCoderMode* sFNC1_FIRST_POSITION; + static CBC_QRCoderMode* sFNC1_SECOND_POSITION; + static CBC_QRCoderMode* sSTRUCTURED_APPEND; + virtual ~CBC_QRCoderMode(); + + static void Initialize(); + static void Finalize(); + static CBC_QRCoderMode* ForBits(FX_INT32 bits, FX_INT32 &e); + FX_INT32 GetCharacterCountBits(CBC_QRCoderVersion* version, FX_INT32 &e); + FX_INT32 GetBits(); + CFX_ByteString GetName(); + static void Destroy(); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRCoderVersion.h b/xfa/src/fxbarcode/src/include/BC_QRCoderVersion.h new file mode 100644 index 0000000000..b693dd6dd7 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_QRCoderVersion.h @@ -0,0 +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 _BC_QRCODERVERSION_H_ +#define _BC_QRCODERVERSION_H_ +class CBC_QRCoderECBlocks; +class CBC_CommonBitMatrix; +class CBC_QRCoderErrorCorrectionLevel; +class CBC_QRCoderVersion; +class CBC_QRCoderVersion : public CFX_Object +{ +private: + const static FX_INT32 VERSION_DECODE_INFO[34]; + static CFX_PtrArray *VERSION; + FX_INT32 m_versionNumber; + FX_INT32 m_totalCodeWords; + CFX_Int32Array m_alignmentPatternCenters; + CFX_PtrArray m_ecBlocks; + + CBC_QRCoderVersion(); + CBC_QRCoderVersion(FX_INT32 versionNumber, CBC_QRCoderECBlocks* ecBlocks1, CBC_QRCoderECBlocks* ecBlocks2, + CBC_QRCoderECBlocks* ecBlocks3, CBC_QRCoderECBlocks* ecBlocks4); +public: + virtual ~CBC_QRCoderVersion(); + static void Initialize(); + static void Finalize(); + + FX_INT32 GetVersionNumber(); + FX_INT32 GetTotalCodeWords(); + FX_INT32 GetDimensionForVersion(); + CBC_CommonBitMatrix *BuildFunctionPattern(FX_INT32 &e); + CFX_Int32Array* GetAlignmentPatternCenters(); + CBC_QRCoderECBlocks* GetECBlocksForLevel(CBC_QRCoderErrorCorrectionLevel *ecLevel); + static CBC_QRCoderVersion* GetVersionForNumber(FX_INT32 versionNumber, FX_INT32 &e); + static CBC_QRCoderVersion* GetProvisionalVersionForDimension(FX_INT32 dimension, FX_INT32 &e); + static CBC_QRCoderVersion* DecodeVersionInformation(FX_INT32 versionBits, FX_INT32 &e); + static void Destroy(); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRDataBlock.h b/xfa/src/fxbarcode/src/include/BC_QRDataBlock.h new file mode 100644 index 0000000000..4f68c7a9f3 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_QRDataBlock.h @@ -0,0 +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 + +#ifndef _BC_QRDATABLOCK_H_ +#define _BC_QRDATABLOCK_H_ +class CBC_QRCoderVersion; +class CBC_QRCoderECBlocks; +class CBC_QRCoderECB; +class CBC_QRCoderErrorCorrectionLevel; +class CBC_QRDataBlock; +class CBC_QRDataBlock : public CFX_Object +{ +private: + FX_INT32 m_numDataCodewords; + CFX_ByteArray *m_codewords; + CBC_QRDataBlock(FX_INT32 numDataCodewords, CFX_ByteArray *codewords); +public: + virtual ~CBC_QRDataBlock(); + FX_INT32 GetNumDataCodewords(); + CFX_ByteArray* GetCodewords(); + static CFX_PtrArray *GetDataBlocks(CFX_ByteArray* rawCodewords, + CBC_QRCoderVersion *version, CBC_QRCoderErrorCorrectionLevel* ecLevel, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRDataMask.h b/xfa/src/fxbarcode/src/include/BC_QRDataMask.h new file mode 100644 index 0000000000..6fcc09d556 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_QRDataMask.h @@ -0,0 +1,25 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_QRDATAMASK_H_ +#define _BC_QRDATAMASK_H_ +class CBC_CommonBitMatrix; +class CBC_QRDataMask; +class CBC_QRDataMask : public CFX_Object +{ +public: + static CFX_PtrArray *DATA_MASKS; + CBC_QRDataMask(); + virtual ~CBC_QRDataMask(); + static void Initialize(); + static void Finalize(); + virtual FX_BOOL IsMasked(FX_INT32 i, FX_INT32 j) = 0; + void UnmaskBitMatirx(CBC_CommonBitMatrix *bits, FX_INT32 dimension); + static CBC_QRDataMask* ForReference(FX_INT32 reference, FX_INT32 &e); + static FX_INT32 BuildDataMasks(); + static void Destroy(); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRDecodedBitStreamParser.h b/xfa/src/fxbarcode/src/include/BC_QRDecodedBitStreamParser.h new file mode 100644 index 0000000000..b64485f788 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_QRDecodedBitStreamParser.h @@ -0,0 +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 _BC_QRDECODEDBITSTREAMPARSER_H_ +#define _BC_QRDECODEDBITSTREAMPARSER_H_ +class CBC_CommonDecoderResult; +class CBC_QRCoderErrorCorrectionLevel; +class CBC_CommonBitSource; +class CBC_QRCoderVersion; +class CBC_CommonCharacterSetECI; +class CBC_QRDecodedBitStreamParser; +class CBC_QRDecodedBitStreamParser : public CFX_Object +{ +private: + const static FX_CHAR ALPHANUMERIC_CHARS[45]; + static FX_LPCSTR UTF_8; + CBC_QRDecodedBitStreamParser(); +public: + virtual ~CBC_QRDecodedBitStreamParser(); + static CBC_CommonDecoderResult* Decode(CFX_ByteArray *bytes, CBC_QRCoderVersion *version, + CBC_QRCoderErrorCorrectionLevel* ecLevel, FX_INT32 byteModeDecode, FX_INT32 &e); + + static const CFX_ByteString GuessEncoding(CFX_ByteArray* bytes); + static FX_INT32 ParseECIValue(CBC_CommonBitSource* bits, FX_INT32 &e); + static void DecodeGBKSegment(CBC_CommonBitSource* bits, CFX_ByteString &result, FX_INT32 count, FX_INT32 &e); + static void DecodeKanjiSegment(CBC_CommonBitSource* bits, CFX_ByteString &result, FX_INT32 count, FX_INT32 &e); + static void DecodeNumericSegment(CBC_CommonBitSource* bits, CFX_ByteString &result, FX_INT32 count, FX_INT32 &e); + static void DecodeAlphanumericSegment(CBC_CommonBitSource* bits, CFX_ByteString &result, FX_INT32 count, FX_BOOL fac1InEffect, FX_INT32 &e); + static void DecodeByteSegment(CBC_CommonBitSource* bits, CFX_ByteString &result, FX_INT32 count, CBC_CommonCharacterSetECI *currentCharacterSetECI, + CFX_Int32Array *byteSegments, FX_INT32 byteModeDecode, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRDetector.h b/xfa/src/fxbarcode/src/include/BC_QRDetector.h new file mode 100644 index 0000000000..60c301cb7b --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_QRDetector.h @@ -0,0 +1,41 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_QRDETECTOR_H_ +#define _BC_QRDETECTOR_H_ +class CBC_ResultPoint; +class CBC_CommonBitMatrix; +class CBC_QRDetectorResult; +class CBC_QRFinderPatternInfo; +class CBC_QRAlignmentPattern; +class CBC_QRFinderPatternFinder; +class CBC_QRCoderVersion; +class CBC_QRGridSampler; +class CBC_QRAlignmentPatternFinder; +class CBC_QRAlignmentPattern; +class CBC_QRDetector; +class CBC_QRDetector +{ +private: + CBC_CommonBitMatrix *m_image; +public: + CBC_QRDetector(CBC_CommonBitMatrix *image); + virtual ~CBC_QRDetector(); + + CBC_CommonBitMatrix* GetImage(); + CBC_QRDetectorResult* Detect(FX_INT32 hints, FX_INT32 &e); + CBC_QRDetectorResult* ProcessFinderPatternInfo(CBC_QRFinderPatternInfo *info, FX_INT32 &e); + FX_FLOAT CalculateModuleSize(CBC_ResultPoint *topLeft, CBC_ResultPoint *topRight, CBC_ResultPoint *bottomLeft); + FX_FLOAT CalculateModuleSizeOneWay(CBC_ResultPoint *pattern, CBC_ResultPoint *otherPattern); + FX_FLOAT SizeOfBlackWhiteBlackRunBothWays(FX_INT32 fromX, FX_INT32 fromY, FX_INT32 toX, FX_INT32 toY); + FX_FLOAT SizeOfBlackWhiteBlackRun(FX_INT32 fromX, FX_INT32 fromY, FX_INT32 toX, FX_INT32 toY); + CBC_QRAlignmentPattern* FindAlignmentInRegion(FX_FLOAT overallEstModuleSize, FX_INT32 estAlignmentX, FX_INT32 estAlignmentY, FX_FLOAT allowanceFactor, FX_INT32 &e); + static FX_INT32 Round(FX_FLOAT d); + static FX_INT32 ComputeDimension(CBC_ResultPoint *topLeft, CBC_ResultPoint *topRight, CBC_ResultPoint *bottomLeft, FX_FLOAT moduleSize, FX_INT32 &e); + static CBC_CommonBitMatrix* SampleGrid(CBC_CommonBitMatrix *image, CBC_ResultPoint *topLeft, CBC_ResultPoint *topRight, + CBC_ResultPoint *bottomLeft, CBC_ResultPoint* alignmentPattern, FX_INT32 dimension, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRDetectorResult.h b/xfa/src/fxbarcode/src/include/BC_QRDetectorResult.h new file mode 100644 index 0000000000..13f6d3dc46 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_QRDetectorResult.h @@ -0,0 +1,23 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_QRDETECTORRESULT_H_ +#define _BC_QRDETECTORRESULT_H_ +class CBC_CommonBitMatrix; +class CBC_ResultPoint; +class CBC_QRDetectorResult; +class CBC_QRDetectorResult : public CFX_Object +{ +private: + CBC_CommonBitMatrix *m_bits; + CFX_PtrArray *m_points; +public: + CBC_QRDetectorResult(CBC_CommonBitMatrix *bits, CFX_PtrArray *points); + virtual ~CBC_QRDetectorResult(); + CBC_CommonBitMatrix *GetBits(); + CFX_PtrArray *GetPoints(); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRFinderPattern.h b/xfa/src/fxbarcode/src/include/BC_QRFinderPattern.h new file mode 100644 index 0000000000..af88a727d9 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_QRFinderPattern.h @@ -0,0 +1,29 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_QRFINDERPATTERN_H_ +#define _BC_QRFINDERPATTERN_H_ +class CBC_ResultPoint; +class CBC_QRFinderPattern; +class CBC_QRFinderPattern : public CBC_ResultPoint +{ +private: + FX_FLOAT m_estimatedModuleSize; + FX_INT32 m_count; +public: + CBC_QRFinderPattern(FX_FLOAT x, FX_FLOAT posY, FX_FLOAT estimatedModuleSize); + virtual ~CBC_QRFinderPattern(); + + FX_INT32 GetCount(); + FX_FLOAT GetX(); + FX_FLOAT GetY(); + FX_FLOAT GetEstimatedModuleSize(); + void IncrementCount(); + FX_BOOL AboutEquals(FX_FLOAT moduleSize, FX_FLOAT i, FX_FLOAT j); + CBC_QRFinderPattern *Clone(); +}; +typedef CBC_QRFinderPattern FinderPattern; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRFinderPatternFinder.h b/xfa/src/fxbarcode/src/include/BC_QRFinderPatternFinder.h new file mode 100644 index 0000000000..7470b553ee --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_QRFinderPatternFinder.h @@ -0,0 +1,45 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_QRFINDERPATTERNFINDER_H_ +#define _BC_QRFINDERPATTERNFINDER_H_ +class CBC_CommonBitMatrix; +class CBC_QRFinderPattern; +class CBC_ResultPoint; +class CBC_QRFinderPatternInfo; +class CBC_QRFinderPatternFinder; +class CBC_QRFinderPatternFinder : public CFX_Object +{ +private: + const static FX_INT32 CENTER_QUORUM; + const static FX_INT32 MIN_SKIP; + const static FX_INT32 MAX_MODULES; + const static FX_INT32 INTEGER_MATH_SHIFT; + FX_BOOL m_hasSkipped; + CBC_CommonBitMatrix* m_image; + CFX_Int32Array m_crossCheckStateCount; + CFX_PtrArray m_possibleCenters; +public: + CBC_QRFinderPatternFinder(CBC_CommonBitMatrix *image); + virtual ~CBC_QRFinderPatternFinder(); + FX_INT32 FindRowSkip(); + CBC_CommonBitMatrix* GetImage(); + CBC_QRFinderPatternInfo* Find(FX_INT32 hint, FX_INT32 &e); + + CFX_Int32Array &GetCrossCheckStateCount(); + CFX_PtrArray *GetPossibleCenters(); + CFX_PtrArray *SelectBestpatterns(FX_INT32 &e); + + FX_BOOL HandlePossibleCenter(const CFX_Int32Array &stateCount, FX_INT32 i, FX_INT32 j); + FX_BOOL HaveMultiplyConfirmedCenters(); + FX_FLOAT CenterFromEnd(const CFX_Int32Array &stateCount, FX_INT32 end); + FX_FLOAT CrossCheckVertical(FX_INT32 startI, FX_INT32 centerJ, FX_INT32 maxCount, FX_INT32 originalStateCountTotal); + FX_FLOAT CrossCheckHorizontal(FX_INT32 startJ, FX_INT32 CenterI, FX_INT32 maxCOunt, FX_INT32 originalStateCountTotal); + static void OrderBestPatterns(CFX_PtrArray *patterns); + static FX_BOOL FoundPatternCross(const CFX_Int32Array &stateCount); + static FX_FLOAT Distance(CBC_ResultPoint* point1, CBC_ResultPoint* point2); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRGridSampler.h b/xfa/src/fxbarcode/src/include/BC_QRGridSampler.h new file mode 100644 index 0000000000..0b8c7d3ab7 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_QRGridSampler.h @@ -0,0 +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 _BC_QRGRIDSAMPLER_H_ +#define _BC_QRGRIDSAMPLER_H_ +class CBC_CommonBitMatrix; +class CBC_CommonPerspectiveTransform; +class CBC_CommonDefaultGridSampler; +class CBC_QRGridSampler; +class CBC_QRGridSampler +{ +private: + static CBC_QRGridSampler m_gridSampler; +public: + CBC_QRGridSampler(); + virtual ~CBC_QRGridSampler(); + virtual CBC_CommonBitMatrix* SampleGrid(CBC_CommonBitMatrix *image, FX_INT32 dimensionX, FX_INT32 dimensionY, + FX_FLOAT p1ToX, FX_FLOAT p1ToY, + FX_FLOAT p2ToX, FX_FLOAT p2ToY, + FX_FLOAT p3ToX, FX_FLOAT p3ToY, + FX_FLOAT p4ToX, FX_FLOAT p4ToY, + FX_FLOAT p1FromX, FX_FLOAT p1FromY, + FX_FLOAT p2FromX, FX_FLOAT p2FromY, + FX_FLOAT p3FromX, FX_FLOAT p3FromY, + FX_FLOAT p4FromX, FX_FLOAT p4FromY, FX_INT32 &e); + + static CBC_QRGridSampler &GetInstance(); + static void CheckAndNudgePoints(CBC_CommonBitMatrix *image, CFX_FloatArray *points, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_Reader.h b/xfa/src/fxbarcode/src/include/BC_Reader.h new file mode 100644 index 0000000000..42b2aa11f5 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_Reader.h @@ -0,0 +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 _BC_READER_H_ +#define _BC_READER_H_ +class CBC_BinaryBitmap; +class CBC_Reader; +class CBC_Reader : public CFX_Object +{ +public: + CBC_Reader(); + virtual ~CBC_Reader(); + virtual CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 &e) = 0; + virtual CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e) = 0; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_ReedSolomon.h b/xfa/src/fxbarcode/src/include/BC_ReedSolomon.h new file mode 100644 index 0000000000..2950b8f315 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_ReedSolomon.h @@ -0,0 +1,25 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_READSOLOMON_H_ +#define _BC_READSOLOMON_H_ +class CBC_ReedSolomonGF256; +class CBC_ReedSolomonGF256Poly; +class CBC_ReedSolomonEncoder; +class CBC_ReedSolomonEncoder : public CFX_Object +{ +private: + CBC_ReedSolomonGF256* m_field; + CFX_PtrArray m_cachedGenerators; + CBC_ReedSolomonGF256Poly* BuildGenerator(FX_INT32 degree, FX_INT32 &e); +public: + CBC_ReedSolomonEncoder(CBC_ReedSolomonGF256 * field); + virtual ~CBC_ReedSolomonEncoder(); + + void Encode(CFX_Int32Array *toEncode, FX_INT32 ecBytes, FX_INT32 &e); + virtual void Init(); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_ReedSolomonDecoder.h b/xfa/src/fxbarcode/src/include/BC_ReedSolomonDecoder.h new file mode 100644 index 0000000000..c1dd0f03f5 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_ReedSolomonDecoder.h @@ -0,0 +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 _BC_REEDSOLOMONDECODER_H_ +#define _BC_REEDSOLOMONDECODER_H_ +class CBC_ReedSolomonGF256; +class CBC_ReedSolomonGF256Poly; +class CBC_ReedSolomonDecoder; +class CBC_ReedSolomonDecoder : public CFX_Object +{ +private: + CBC_ReedSolomonGF256 * m_field; +public: + CBC_ReedSolomonDecoder(CBC_ReedSolomonGF256 * field); + virtual ~CBC_ReedSolomonDecoder(); + void Decode(CFX_Int32Array* received, FX_INT32 twoS, FX_INT32 &e); + CFX_PtrArray* RunEuclideanAlgorithm(CBC_ReedSolomonGF256Poly* a, CBC_ReedSolomonGF256Poly* b, FX_INT32 R, FX_INT32 &e); + CFX_Int32Array* FindErrorLocations(CBC_ReedSolomonGF256Poly* errorLocator, FX_INT32 &e); + CFX_Int32Array* FindErrorMagnitudes(CBC_ReedSolomonGF256Poly* errorEvaluator, CFX_Int32Array* errorLocations, FX_BOOL dataMatrix, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_ReedSolomonGF256.h b/xfa/src/fxbarcode/src/include/BC_ReedSolomonGF256.h new file mode 100644 index 0000000000..1687b95e09 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_ReedSolomonGF256.h @@ -0,0 +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 _BC_REEDSOLOMONGF256_H_ +#define _BC_REEDSOLOMONGF256_H_ +class CBC_ReedSolomonGF256Poly; +class CBC_ReedSolomonGF256; +class CBC_ReedSolomonGF256 : public CFX_Object +{ +public: + static void Initialize(); + static void Finalize(); + static CBC_ReedSolomonGF256 *QRCodeFild; + static CBC_ReedSolomonGF256 *DataMatrixField; + CBC_ReedSolomonGF256(FX_INT32 primitive); + virtual ~CBC_ReedSolomonGF256(); + CBC_ReedSolomonGF256Poly* GetZero(); + CBC_ReedSolomonGF256Poly* GetOne(); + CBC_ReedSolomonGF256Poly* BuildMonomial(FX_INT32 degree, FX_INT32 coefficient, FX_INT32 &e); + static FX_INT32 AddOrSubtract(FX_INT32 a, FX_INT32 b); + FX_INT32 Exp(FX_INT32 a); + FX_INT32 Log(FX_INT32 a, FX_INT32 &e); + FX_INT32 Inverse(FX_INT32 a, FX_INT32 &e); + FX_INT32 Multiply(FX_INT32 a, FX_INT32 b); + virtual void Init(); +private: + FX_INT32 m_expTable[256]; + FX_INT32 m_logTable[256]; + CBC_ReedSolomonGF256Poly *m_zero; + CBC_ReedSolomonGF256Poly *m_one; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_ReedSolomonGF256Poly.h b/xfa/src/fxbarcode/src/include/BC_ReedSolomonGF256Poly.h new file mode 100644 index 0000000000..a6db24e231 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_ReedSolomonGF256Poly.h @@ -0,0 +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 _BC_READSOLOMONGF256POLY_H_ +#define _BC_READSOLOMONGF256POLY_H_ +class CBC_ReedSolomonGF256; +class CBC_ReedSolomonGF256Poly; +class CBC_ReedSolomonGF256Poly : public CFX_Object +{ +public: + CBC_ReedSolomonGF256Poly(CBC_ReedSolomonGF256* field, FX_INT32 coefficients); + CBC_ReedSolomonGF256Poly(); + virtual ~CBC_ReedSolomonGF256Poly(); + FX_INT32 GetCoefficients(FX_INT32 degree); + CFX_Int32Array* GetCoefficients(); + FX_INT32 GetDegree(); + FX_BOOL IsZero(); + FX_INT32 EvaluateAt(FX_INT32 a); + CBC_ReedSolomonGF256Poly* AddOrSubtract(CBC_ReedSolomonGF256Poly* other, FX_INT32 &e); + CBC_ReedSolomonGF256Poly* Multiply(CBC_ReedSolomonGF256Poly* other, FX_INT32 &e); + CBC_ReedSolomonGF256Poly* Multiply(FX_INT32 scalar, FX_INT32 &e); + CBC_ReedSolomonGF256Poly* MultiplyByMonomial(FX_INT32 degree, FX_INT32 coefficient, FX_INT32 &e); + CFX_PtrArray* Divide(CBC_ReedSolomonGF256Poly *other, FX_INT32 &e); + CBC_ReedSolomonGF256Poly* Clone(FX_INT32 &e); + virtual void Init(CBC_ReedSolomonGF256* field, CFX_Int32Array* coefficients, FX_INT32 &e); +private: + CBC_ReedSolomonGF256* m_field; + CFX_Int32Array m_coefficients; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_ResultPoint.h b/xfa/src/fxbarcode/src/include/BC_ResultPoint.h new file mode 100644 index 0000000000..7001cfa2a5 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_ResultPoint.h @@ -0,0 +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 _BC_RESULTPOINT_H_ +#define _BC_RESULTPOINT_H_ +class CBC_ResultPoint; +class CBC_ResultPoint : public CFX_Object +{ +public: + CBC_ResultPoint(); + CBC_ResultPoint(FX_FLOAT x, FX_FLOAT y); + virtual ~CBC_ResultPoint() + { + } + virtual FX_FLOAT GetX(); + virtual FX_FLOAT GetY(); +protected: + FX_FLOAT m_x; + FX_FLOAT m_y; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_SymbolInfo.h b/xfa/src/fxbarcode/src/include/BC_SymbolInfo.h new file mode 100644 index 0000000000..0450a28725 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_SymbolInfo.h @@ -0,0 +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 + +#ifndef _BC_SYMBOLINFO_H_ +#define _BC_SYMBOLINFO_H_ +class CBC_SymbolShapeHint; +class CBC_Dimension; +class CBC_SymbolInfo; +class CBC_SymbolInfo : public CBC_SymbolShapeHint +{ +public: + CBC_SymbolInfo(FX_BOOL rectangular, FX_INT32 dataCapacity, FX_INT32 errorCodewords, + FX_INT32 matrixWidth, FX_INT32 matrixHeight, FX_INT32 dataRegions); + virtual ~CBC_SymbolInfo(); + static void Initialize(); + static void Finalize(); + static void overrideSymbolSet(CBC_SymbolInfo* override); + static CBC_SymbolInfo* lookup(FX_INT32 dataCodewords, FX_INT32 &e); + static CBC_SymbolInfo* lookup(FX_INT32 dataCodewords, SymbolShapeHint shape, FX_INT32 &e); + static CBC_SymbolInfo* lookup(FX_INT32 dataCodewords, FX_BOOL allowRectangular, FX_BOOL fail, FX_INT32 &e); + static CBC_SymbolInfo* lookup(FX_INT32 dataCodewords, SymbolShapeHint shape, FX_BOOL fail, FX_INT32 &e); + static CBC_SymbolInfo* lookup(FX_INT32 dataCodewords, SymbolShapeHint shape, CBC_Dimension* minSize, CBC_Dimension* maxSize, FX_BOOL fail, FX_INT32 &e); + FX_INT32 getHorizontalDataRegions(FX_INT32 &e); + FX_INT32 getVerticalDataRegions(FX_INT32 &e); + FX_INT32 getSymbolDataWidth(FX_INT32 &e); + FX_INT32 getSymbolDataHeight(FX_INT32 &e); + FX_INT32 getSymbolWidth(FX_INT32 &e); + FX_INT32 getSymbolHeight(FX_INT32 &e); + FX_INT32 getCodewordCount(); + FX_INT32 getInterleavedBlockCount(); + FX_INT32 getDataLengthForInterleavedBlock(FX_INT32 index); + FX_INT32 getErrorLengthForInterleavedBlock(FX_INT32 index); + CFX_WideString toString(FX_INT32 &e); +public: + FX_INT32 m_dataCapacity; + FX_INT32 m_errorCodewords; + FX_INT32 m_matrixWidth; + FX_INT32 m_matrixHeight; + FX_INT32 m_rsBlockData; + FX_INT32 m_rsBlockError; + static CBC_SymbolInfo* m_PROD_SYMBOLS[30]; +private: + static CBC_SymbolInfo* m_symbols[30]; + FX_BOOL m_rectangular; + FX_INT32 m_dataRegions; +private: + CBC_SymbolInfo(FX_BOOL rectangular, FX_INT32 dataCapacity, FX_INT32 errorCodewords, FX_INT32 matrixWidth, FX_INT32 matrixHeight, FX_INT32 dataRegions, + FX_INT32 rsBlockData, FX_INT32 rsBlockError); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_SymbolShapeHint.h b/xfa/src/fxbarcode/src/include/BC_SymbolShapeHint.h new file mode 100644 index 0000000000..2b030012a3 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_SymbolShapeHint.h @@ -0,0 +1,21 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_SYMBOLSHAPEHINT_H_ +#define _BC_SYMBOLSHAPEHINT_H_ +class CBC_SymbolShapeHint; +class CBC_SymbolShapeHint : public CFX_Object +{ +public: + CBC_SymbolShapeHint(); + virtual ~CBC_SymbolShapeHint(); + enum SymbolShapeHint { + FORCE_NONE, + FORCE_SQUARE, + FORCE_RECTANGLE, + }; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_TextEncoder.h b/xfa/src/fxbarcode/src/include/BC_TextEncoder.h new file mode 100644 index 0000000000..f1168679a6 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_TextEncoder.h @@ -0,0 +1,18 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_TEXTENCODER_H_ +#define _BC_TEXTENCODER_H_ +class CBC_TextEncoder; +class CBC_TextEncoder : public CBC_C40Encoder +{ +public: + CBC_TextEncoder(); + virtual ~CBC_TextEncoder(); + FX_INT32 getEncodingMode(); + FX_INT32 encodeChar(FX_WCHAR c, CFX_WideString &sb, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_TwoDimWriter.h b/xfa/src/fxbarcode/src/include/BC_TwoDimWriter.h new file mode 100644 index 0000000000..369d494c08 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_TwoDimWriter.h @@ -0,0 +1,44 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_TWODIMWRITER_H_ +#define _BC_TWODIMWRITER_H_ +#include "BC_Writer.h" +class CBC_Writer; +class CBC_CommonBitMatrix; +class CBC_TwoDimWriter; +class CBC_TwoDimWriter : public CBC_Writer +{ +public: + CBC_TwoDimWriter(); + virtual ~CBC_TwoDimWriter(); + virtual FX_BYTE* Encode(const CFX_WideString& contents, FX_INT32 ecLevel, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) + { + return NULL; + }; + virtual FX_BYTE* Encode(const CFX_ByteString& contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) + { + return NULL; + }; + virtual FX_BYTE* Encode(const CFX_ByteString& contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) + { + return NULL; + }; + virtual void RenderResult(FX_BYTE *code, FX_INT32 codeWidth, FX_INT32 codeHeight, FX_INT32 &e); + virtual void RenderBitmapResult(CFX_DIBitmap *&pOutBitmap, FX_INT32& e); + virtual void RenderDeviceResult(CFX_RenderDevice* device, const CFX_Matrix* matrix); + virtual FX_BOOL SetErrorCorrectionLevel (FX_INT32 level) = 0; + virtual FX_INT32 GetErrorCorrectionLevel() + { + return m_iCorrectLevel; + }; + +protected: + FX_INT32 m_iCorrectLevel; + FX_BOOL m_bFixedSize; + CBC_CommonBitMatrix* m_output; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_UtilCodingConvert.h b/xfa/src/fxbarcode/src/include/BC_UtilCodingConvert.h new file mode 100644 index 0000000000..1ee3a8c64c --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_UtilCodingConvert.h @@ -0,0 +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 _BC_UTILCODINGCONVERT_H_ +#define _BC_UTILCODINGCONVERT_H_ +class CBC_UtilCodingConvert; +class CBC_UtilCodingConvert : public CFX_Object +{ +public: + CBC_UtilCodingConvert(); + virtual ~CBC_UtilCodingConvert(); + static void UnicodeToLocale(const CFX_WideString &source, CFX_ByteString &result); + static void LocaleToUtf8(const CFX_ByteString &source, CFX_ByteString &result); + static void LocaleToUtf8(const CFX_ByteString &source, CFX_ByteArray &result); + static void Utf8ToLocale(const CFX_ByteArray &source, CFX_ByteString &result); + static void Utf8ToLocale(const FX_BYTE *source, FX_INT32 count, CFX_ByteString &result); + static void UnicodeToUTF8(const CFX_WideString &source, CFX_ByteString &result); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_UtilRSS.h b/xfa/src/fxbarcode/src/include/BC_UtilRSS.h new file mode 100644 index 0000000000..37834eaa76 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_UtilRSS.h @@ -0,0 +1,23 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_UTILRESS_H_ +#define _BC_UTILRESS_H_ +class CBC_RssPair; +class CBC_UtilRSS : public CFX_Object +{ +public: + virtual ~CBC_UtilRSS(); + static FX_INT32 GetRSSvalue(CFX_Int32Array &widths, FX_INT32 maxWidth, FX_BOOL noNarrow); + +protected: + static CFX_Int32Array *GetRssWidths(FX_INT32 val, FX_INT32 n, FX_INT32 elements, FX_INT32 maxWidth, FX_BOOL noNarrow); + static FX_INT32 Combins(FX_INT32 n, FX_INT32 r); + static CFX_Int32Array *Elements(CFX_Int32Array &eDist, FX_INT32 N, FX_INT32 K); +private: + CBC_UtilRSS(); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_WhiteRectangleDetector.h b/xfa/src/fxbarcode/src/include/BC_WhiteRectangleDetector.h new file mode 100644 index 0000000000..83d91ced92 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_WhiteRectangleDetector.h @@ -0,0 +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 + +#ifndef _BC_WHITERECTANLEDETECTOR_H_ +#define _BC_WHITERECTANLEDETECTOR_H_ +class CBC_CommonBitMatrix; +class CBC_ResultPoint; +class CBC_WhiteRectangleDetector; +class CBC_WhiteRectangleDetector : public CFX_Object +{ +public: + CBC_WhiteRectangleDetector(CBC_CommonBitMatrix *image); + CBC_WhiteRectangleDetector(CBC_CommonBitMatrix *image, FX_INT32 initSize, FX_INT32 x, FX_INT32 y); + virtual ~CBC_WhiteRectangleDetector(); + CFX_PtrArray *Detect(FX_INT32 &e); + virtual void Init(FX_INT32 &e); +private: + FX_INT32 Round(float d); + CBC_ResultPoint *GetBlackPointOnSegment(FX_FLOAT aX, FX_FLOAT aY, FX_FLOAT bX, FX_FLOAT bY); + FX_INT32 DistanceL2(FX_FLOAT aX, FX_FLOAT aY, FX_FLOAT bX, FX_FLOAT bY); + CFX_PtrArray *CenterEdges(CBC_ResultPoint *y, CBC_ResultPoint *z, + CBC_ResultPoint *x, CBC_ResultPoint *t); + FX_BOOL ContainsBlackPoint(FX_INT32 a, FX_INT32 b, FX_INT32 fixed, FX_BOOL horizontal); + const static FX_INT32 INIT_SIZE; + const static FX_INT32 CORR; + + CBC_CommonBitMatrix *m_image; + FX_INT32 m_height; + FX_INT32 m_width; + FX_INT32 m_leftInit; + FX_INT32 m_rightInit; + FX_INT32 m_downInit; + FX_INT32 m_upInit; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_Writer.h b/xfa/src/fxbarcode/src/include/BC_Writer.h new file mode 100644 index 0000000000..deb68c07be --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_Writer.h @@ -0,0 +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 _BC_WRITER_H_ +#define _BC_WRITER_H_ +class CBC_Writer; +class CBC_Writer : public CFX_Object +{ +public: + CBC_Writer(); + virtual ~CBC_Writer(); + virtual FX_BYTE *Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) = 0; + virtual FX_BYTE *Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) = 0; + virtual FX_BOOL SetCharEncoding(FX_INT32 encoding); + virtual FX_BOOL SetModuleHeight(FX_INT32 moduleHeight); + virtual FX_BOOL SetModuleWidth(FX_INT32 moduleWidth); + virtual FX_BOOL SetHeight(FX_INT32 height); + virtual FX_BOOL SetWidth(FX_INT32 width); + virtual void SetBackgroundColor(FX_ARGB backgroundColor); + virtual void SetBarcodeColor(FX_ARGB foregroundColor); +protected: + CFX_DIBitmap* CreateDIBitmap(FX_INT32 width, FX_INT32 height); + FX_INT32 m_CharEncoding; + FX_INT32 m_ModuleHeight; + FX_INT32 m_ModuleWidth; + FX_INT32 m_Height; + FX_INT32 m_Width; + FXDIB_Format m_colorSpace; + FX_ARGB m_barColor; + FX_ARGB m_backgroundColor; +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/BC_X12Encoder.h b/xfa/src/fxbarcode/src/include/BC_X12Encoder.h new file mode 100644 index 0000000000..21111bc5cc --- /dev/null +++ b/xfa/src/fxbarcode/src/include/BC_X12Encoder.h @@ -0,0 +1,21 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_X12ENCODER_H_ +#define _BC_X12ENCODER_H_ +class CBC_C40Encoder; +class CBC_X12Encoder; +class CBC_X12Encoder : public CBC_C40Encoder +{ +public: + CBC_X12Encoder(); + virtual ~CBC_X12Encoder(); + FX_INT32 getEncodingMode(); + void Encode(CBC_EncoderContext &context, FX_INT32 &e); + void handleEOD(CBC_EncoderContext &context, CFX_WideString &buffer, FX_INT32 &e); + FX_INT32 encodeChar(FX_WCHAR c, CFX_WideString &sb, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/src/include/utils.h b/xfa/src/fxbarcode/src/include/utils.h new file mode 100644 index 0000000000..ecaadccef0 --- /dev/null +++ b/xfa/src/fxbarcode/src/include/utils.h @@ -0,0 +1,219 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _BC_UTILS_H_ +#define _BC_UTILS_H_ +typedef CFX_MapPtrTemplate CFX_PtrToInt32; +FX_BOOL BC_FX_ByteString_Replace(CFX_ByteString &dst, FX_DWORD first, FX_DWORD last, FX_INT32 count, FX_CHAR c); +void BC_FX_ByteString_Append(CFX_ByteString &dst, FX_INT32 count, FX_CHAR c); +void BC_FX_ByteString_Append(CFX_ByteString &dst, const CFX_ByteArray &ba); +typedef FX_BOOL (*BC_PtrArrayCompareCallback)(FX_LPVOID l, FX_LPVOID r); +void BC_FX_PtrArray_Sort(CFX_PtrArray &src, BC_PtrArrayCompareCallback fun); +template +class CBC_AutoPtr +{ +public: + typedef _Ty element_type; + explicit CBC_AutoPtr(_Ty *_P = 0) + : _Owns(_P != 0), _Ptr(_P) {} + CBC_AutoPtr(const CBC_AutoPtr<_Ty>& _Y) + : _Owns(_Y._Owns), _Ptr(_Y.release()) {} + CBC_AutoPtr<_Ty>& operator=(const CBC_AutoPtr<_Ty>& _Y) + { + if (this != &_Y) { + if (_Ptr != _Y.get()) { + if (_Owns) { + delete _Ptr; + } + _Owns = _Y._Owns; + } else if (_Y._Owns) { + _Owns = TRUE; + } + _Ptr = _Y.release(); + } + return (*this); + } + ~CBC_AutoPtr() + { + if (_Owns) { + delete _Ptr; + } + } + _Ty& operator*() const + { + return (*get()); + } + _Ty *operator->() const + { + return (get()); + } + _Ty *get() const + { + return (_Ptr); + } + _Ty *release() const + { + ((CBC_AutoPtr<_Ty> *)this)->_Owns = FALSE; + return (_Ptr); + } +private: + FX_BOOL _Owns; + _Ty *_Ptr; +}; +#if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_) +#include +#elif (_FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_IOS_) +#include +#endif +#if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_) +#define FXSYS_isnan(x) _isnan(x) +#elif (_FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_IOS_) +#include +#define FXSYS_isnan(x) std::isnan(x) +#elif (_FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_ANDROID_) +#include +#define FXSYS_isnan(x) isnan(x) +#endif +#if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_) +#define FXSYS_nan() (std::numeric_limits::quiet_NaN()) +#elif (_FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_IOS_ || _FX_OS_ == _FX_ANDROID_) +#define FXSYS_nan() NAN +#endif +enum BCFORMAT { + BCFORMAT_UNSPECIFY = -1, + BCFORMAT_CODABAR, + BCFORMAT_CODE_39, + BCFORMAT_CODE_128, + BCFORMAT_CODE_128B, + BCFORMAT_CODE_128C, + BCFORMAT_EAN_8, + BCFORMAT_UPC_A, + BCFORMAT_EAN_13, + BCFORMAT_PDF_417, + BCFORMAT_DATAMATRIX, + BCFORMAT_QR_CODE +}; +#define BCFORMAT_ECLEVEL_L 0 +#define BCFORMAT_ECLEVEL_M 1 +#define BCFORMAT_ECLEVEL_Q 2 +#define BCFORMAT_ECLEVEL_H 3 +#include +#define FXSYS_IntMax INT_MAX +#define FXSYS_Isdigit isdigit +#define BCExceptionNO 0 +#define BCExceptionNotFound 1 +#define BCExceptionEndLessThanStart 2 +#define BCExceptionUnknownDecoder 3 +#define BCExceptionRotateNotSupported 4 +#define BCExceptionHeightAndWidthMustBeAtLeast1 5 +#define BCExceptionRegionMustFitInsideMatrix 6 +#define BCExceptionCanNotCallGetDimensionOnNonSquareMatrix 7 +#define BCExceptionFormatException 8 +#define BCExceptionIllegalArgumentMustMatchVersionSize 9 +#define BCExceptionChecksumException 10 +#define BCExceptionIllegalArgumentInvalidFirstDigit 11 +#define BCExceptionIllegalArgumentInvalidSecondDigit 12 +#define BCExceptionRuntimeDecodingInvalidISO_IEC 13 +#define BCExceptionRuntimeDecodingInvalidAlphanumeric 14 +#define BCExceptionLeftAndTopMustBeNonnegative 15 +#define BCExceptionIllegalArgument 16 +#define BCExceptionBadECI 17 +#define BCExceptionUnSupportedBarcode 18 +#define BCExceptionUnSupportedString 19 +#define BCExceptionDigitLengthMustBe8 20 +#define BCExceptionDataCheckException 21 +#define BCExceptionExtractNumberValueFromBitArray 22 +#define BCExceptionRead 23 +#define BCExceptionRequestedRowIsOutSizeTheImage 24 +#define BCExceptionNoContents 26 +#define BCExceptionUnSupportEclevel 27 +#define BCExceptionUnSupportMode 28 +#define BCExceptionReferenceMustBeBetween0And7 29 +#define BCExceptionBadErrorLocation 30 +#define BCExceptionDegreeIsNegative 31 +#define BCExceptionDivideByZero 32 +#define BCExceptionCoefficientsSizeIsNull 33 +#define BCExceptionNoCorrectionBytes 34 +#define BCExceptionNoDataBytesProvided 35 +#define BCExceptionR_I_1IsZero 36 +#define BCExceptionAIsZero 37 +#define BCExceptionIsZero 38 +#define BCExceptionDegreeNotMatchRoots 39 +#define BCExceptionContentsLengthShouldBetween1and80 40 +#define BCExceptionOnlyEncodeCODE_128 41 +#define BCExceptionOnlyEncodeCODE_39 42 +#define BCExceptionOnlyEncodeEAN_13 43 +#define BCExceptionOnlyEncodeEAN_8 44 +#define BCExceptionOnlyEncodeITF 45 +#define BCExceptionDigitLengthShould13 46 +#define BCExceptionDigitLengthMustBe6or8or10or12or14or16or20or24or44 47 +#define BCExceptionOnlyEncodeUPC_A 48 +#define BCExceptionDigitLengthShouldBe12 49 +#define BCExceptionValueMustBeEither0or1 50 +#define BCExceptionReedsolomnDecodeException 51 +#define BCExceptionBadIndexException 52 +#define BCExceptionBadValueException 53 +#define BCExceptionBadNumBitsException 54 +#define BCExceptioncanNotOperatexorOperator 55 +#define BCExceptionVersionMust1_40 56 +#define BCExceptionUnknown 57 +#define BCExceptionNoSuchVersion 58 +#define BCExceptionCannotFindBlockInfo 59 +#define BCExceptionDataTooBig 60 +#define BCExceptionInvalidQRCode 61 +#define BCExceptionDataTooMany 62 +#define BCExceptionBitsNotEqualCacity 63 +#define BCExceptionUnsupportedMode 64 +#define BCExceptionInvalidateCharacter 65 +#define BCExceptionBytesNotMatchOffset 66 +#define BCExceptionSizeInBytesDiffer 67 +#define BCExceptionInvalidateMaskPattern 68 +#define BCExceptionNullPointer 69 +#define BCExceptionBadMask 70 +#define BCExceptionBitSizeNot15 71 +#define BCExceptionBitSizeNot18 72 +#define BCExceptionInvalidateImageData 73 +#define BCExceptionHeight_8BeZero 74 +#define BCExceptionCharacterNotThisMode 75 +#define BCExceptionBitsBytesNotMatch 76 +#define BCExceptionInvalidateData 77 +#define BCExceptionLoadFile 78 +#define BCExceptionPDF417EncodeFail 79 +#define BCExceptionFailToCreateBitmap 80 +#define BCExceptionLoadFontFail 81 +#define BCExceptionOnlyEncodeCODEBAR 82 +#define BCExceptionCodabarShouldStartWithOneOfABCD 83 +#define BCExceptionCodabarShouldEndWithOneOfTNE 84 +#define BCExceptionCodabarEncodeCharsInvalid 85 +#define BCExceptionOnlyEncodeDATAMATRIX 86 +#define BCExceptionCharactersOutsideISO88591Encoding 87 +#define BCExceptionIllegalDataCodewords 88 +#define BCExceptionCannotHandleThisNumberOfDataRegions 89 +#define BCExceptionIllegalStateUnexpectedCase 90 +#define BCExceptionIllegalStateCountMustNotExceed4 91 +#define BCExceptionIllegalStateMessageLengthInvalid 92 +#define BCExceptionIllegalArgumentNotGigits 93 +#define BCExceptionIllegalStateIllegalMode 94 +#define BCExceptionOnlyEncodePDF417 95 +#define BCExceptionNonEncodableCharacterDetected 96 +#define BCExceptionErrorCorrectionLevelMustBeBetween0And8 97 +#define BCExceptionNoRecommendationPossible 98 +#define BCExceptionIllegalArgumentnMustBeAbove0 99 +#define BCExceptionUnableToFitMessageInColumns 100 +#define BCExceptionEncodedMessageContainsTooManyCodeWords 101 +#define BCExceptionBitmapSizeError 102 +#define BCExceptionFormatInstance 102 +#define BCExceptionChecksumInstance 103 +#define BCExceptiontNotFoundInstance 104 +#define BCExceptionNotFoundInstance 105 +#define BCExceptionCannotMetadata 106 +#define TWO_DIGIT_DATA_LENGTH_SIZE 24 +#define THREE_DIGIT_DATA_LENGTH_SIZE 23 +#define THREE_DIGIT_PLUS_DIGIT_DATA_LENGTH_SIZE 57 +#define FOUR_DIGIT_DATA_LENGTH_SIZE 17 +#define BC_EXCEPTION_CHECK_ReturnVoid(e) if (e != BCExceptionNO) return; +#define BC_EXCEPTION_CHECK_ReturnValue(e, v) if (e != BCExceptionNO) return v; +#endif diff --git a/xfa/src/fxfa/src/app/xfa_checksum.cpp b/xfa/src/fxfa/src/app/xfa_checksum.cpp new file mode 100644 index 0000000000..0ed07bb579 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_checksum.cpp @@ -0,0 +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 "../../../foxitlib.h" +#include "../common/xfa_common.h" +#include "xfa_checksum.h" +CXFA_SAXReaderHandler::CXFA_SAXReaderHandler(CXFA_ChecksumContext *pContext) + : m_pContext(pContext) +{ + FXSYS_assert(m_pContext); +} +CXFA_SAXReaderHandler::~CXFA_SAXReaderHandler() +{ +} +FX_LPVOID CXFA_SAXReaderHandler::OnTagEnter(FX_BSTR bsTagName, FX_SAXNODE eType, FX_DWORD dwStartPos) +{ + UpdateChecksum(TRUE); + if (eType != FX_SAXNODE_Tag && eType != FX_SAXNODE_Instruction) { + return NULL; + } + m_SAXContext.m_eNode = eType; + CFX_ByteTextBuf &textBuf = m_SAXContext.m_TextBuf; + textBuf << FX_BSTRC("<"); + if (eType == FX_SAXNODE_Instruction) { + textBuf << FX_BSTRC("?"); + } + textBuf << bsTagName; + m_SAXContext.m_bsTagName = bsTagName; + return &m_SAXContext; +} +void CXFA_SAXReaderHandler::OnTagAttribute(FX_LPVOID pTag, FX_BSTR bsAttri, FX_BSTR bsValue) +{ + if (pTag == NULL) { + return; + } + CFX_ByteTextBuf &textBuf = ((CXFA_SAXContext*)pTag)->m_TextBuf; + textBuf << FX_BSTRC(" "); + textBuf << bsAttri; + textBuf << FX_BSTRC("=\""); + textBuf << bsValue; + textBuf << FX_BSTRC("\""); +} +void CXFA_SAXReaderHandler::OnTagBreak(FX_LPVOID pTag) +{ + if (pTag == NULL) { + return; + } + CFX_ByteTextBuf &textBuf = ((CXFA_SAXContext*)pTag)->m_TextBuf; + textBuf << FX_BSTRC(">"); + UpdateChecksum(FALSE); +} +void CXFA_SAXReaderHandler::OnTagData(FX_LPVOID pTag, FX_SAXNODE eType, FX_BSTR bsData, FX_DWORD dwStartPos) +{ + if (pTag == NULL) { + return; + } + CFX_ByteTextBuf &textBuf = ((CXFA_SAXContext*)pTag)->m_TextBuf; + if (eType == FX_SAXNODE_CharData) { + textBuf << FX_BSTRC(""); + } +} +void CXFA_SAXReaderHandler::OnTagClose(FX_LPVOID pTag, FX_DWORD dwEndPos) +{ + if (pTag == NULL) { + return; + } + CXFA_SAXContext *pSAXContext = (CXFA_SAXContext*)pTag; + CFX_ByteTextBuf &textBuf = pSAXContext->m_TextBuf; + if (pSAXContext->m_eNode == FX_SAXNODE_Instruction) { + textBuf << FX_BSTRC("?>"); + } else if (pSAXContext->m_eNode == FX_SAXNODE_Tag) { + textBuf << FX_BSTRC(">m_bsTagName; + textBuf << FX_BSTRC(">"); + } + UpdateChecksum(FALSE); +} +void CXFA_SAXReaderHandler::OnTagEnd(FX_LPVOID pTag, FX_BSTR bsTagName, FX_DWORD dwEndPos) +{ + if (pTag == NULL) { + return; + } + CFX_ByteTextBuf &textBuf = ((CXFA_SAXContext*)pTag)->m_TextBuf; + textBuf << FX_BSTRC(""); + UpdateChecksum(FALSE); +} +void CXFA_SAXReaderHandler::OnTargetData(FX_LPVOID pTag, FX_SAXNODE eType, FX_BSTR bsData, FX_DWORD dwStartPos) +{ + if (pTag == NULL && eType != FX_SAXNODE_Comment) { + return; + } + if (eType == FX_SAXNODE_Comment) { + CFX_ByteTextBuf &textBuf = m_SAXContext.m_TextBuf; + textBuf << FX_BSTRC(""); + UpdateChecksum(FALSE); + } else { + CFX_ByteTextBuf &textBuf = ((CXFA_SAXContext*)pTag)->m_TextBuf; + textBuf << FX_BSTRC(" "); + textBuf << bsData; + } +} +void CXFA_SAXReaderHandler::UpdateChecksum(FX_BOOL bCheckSpace) +{ + FX_INT32 iLength = m_SAXContext.m_TextBuf.GetLength(); + if (iLength < 1) { + return; + } + FX_LPBYTE pBuffer = m_SAXContext.m_TextBuf.GetBuffer(); + FX_BOOL bUpdata = TRUE; + if (bCheckSpace) { + bUpdata = FALSE; + for (FX_INT32 i = 0; i < iLength; i++) { + bUpdata = (pBuffer[i] > 0x20); + if (bUpdata) { + break; + } + } + } + if (bUpdata) { + m_pContext->Update(CFX_ByteStringC(pBuffer, iLength)); + } + m_SAXContext.m_TextBuf.Clear(); +} +IXFA_ChecksumContext* XFA_Checksum_Create() +{ + return FX_NEW CXFA_ChecksumContext; +} +CXFA_ChecksumContext::CXFA_ChecksumContext() + : m_pSAXReader(NULL) + , m_pByteContext(NULL) +{ +} +CXFA_ChecksumContext::~CXFA_ChecksumContext() +{ + FinishChecksum(); +} +FX_BOOL CXFA_ChecksumContext::StartChecksum() +{ + FinishChecksum(); + m_pByteContext = FX_Alloc(FX_BYTE, 128); + FXSYS_assert(m_pByteContext != NULL); + CRYPT_SHA1Start(m_pByteContext); + m_bsChecksum.Empty(); + m_pSAXReader = FX_SAXReader_Create(); + return m_pSAXReader != NULL; +} +FX_BOOL CXFA_ChecksumContext::UpdateChecksum(IFX_FileRead *pSrcFile, FX_FILESIZE offset, size_t size) +{ + if (m_pSAXReader == NULL) { + return FALSE; + } + if (pSrcFile == NULL) { + return FALSE; + } + if (size < 1) { + size = pSrcFile->GetSize(); + } + CXFA_SAXReaderHandler handler(this); + m_pSAXReader->SetHandler(&handler); + if (m_pSAXReader->StartParse(pSrcFile, (FX_DWORD)offset, (FX_DWORD)size, FX_SAXPARSEMODE_NotSkipSpace | FX_SAXPARSEMODE_NotConvert_amp | FX_SAXPARSEMODE_NotConvert_lt | FX_SAXPARSEMODE_NotConvert_gt | FX_SAXPARSEMODE_NotConvert_sharp) < 0) { + return FALSE; + } + return m_pSAXReader->ContinueParse(NULL) > 99; +} +void CXFA_ChecksumContext::FinishChecksum() +{ + if (m_pSAXReader != NULL) { + m_pSAXReader->Release(); + m_pSAXReader = NULL; + } + if (m_pByteContext) { + FX_BYTE digest[20]; + FXSYS_memset(digest, 0, 20); + CRYPT_SHA1Finish(m_pByteContext, digest); + FX_INT32 nLen = FX_Base64EncodeA(digest, 20, NULL); + FX_LPSTR pBuffer = m_bsChecksum.GetBuffer(nLen); + FX_Base64EncodeA(digest, 20, pBuffer); + m_bsChecksum.ReleaseBuffer(nLen); + FX_Free(m_pByteContext); + m_pByteContext = NULL; + } +} +void CXFA_ChecksumContext::GetChecksum(CFX_ByteString &bsChecksum) +{ + bsChecksum = m_bsChecksum; +} +void CXFA_ChecksumContext::Update(FX_BSTR bsText) +{ + if (m_pByteContext != NULL) { + CRYPT_SHA1Update(m_pByteContext, bsText.GetPtr(), bsText.GetLength()); + } +} diff --git a/xfa/src/fxfa/src/app/xfa_checksum.h b/xfa/src/fxfa/src/app/xfa_checksum.h new file mode 100644 index 0000000000..5e2eca72f0 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_checksum.h @@ -0,0 +1,58 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FXFA_FORMFILLER_CHECKSUM_IMP_H +#define _FXFA_FORMFILLER_CHECKSUM_IMP_H +class CXFA_SAXReaderHandler; +class CXFA_ChecksumContext; +class CXFA_SAXContext : public CFX_Object +{ +public: + CXFA_SAXContext() : m_eNode(FX_SAXNODE_Unknown) + { + } + CFX_ByteTextBuf m_TextBuf; + CFX_ByteString m_bsTagName; + FX_SAXNODE m_eNode; +}; +class CXFA_SAXReaderHandler : public IFX_SAXReaderHandler, public CFX_Object +{ +public: + CXFA_SAXReaderHandler(CXFA_ChecksumContext *pContext); + virtual ~CXFA_SAXReaderHandler(); + virtual FX_LPVOID OnTagEnter(FX_BSTR bsTagName, FX_SAXNODE eType, FX_DWORD dwStartPos); + virtual void OnTagAttribute(FX_LPVOID pTag, FX_BSTR bsAttri, FX_BSTR bsValue); + virtual void OnTagBreak(FX_LPVOID pTag); + virtual void OnTagData(FX_LPVOID pTag, FX_SAXNODE eType, FX_BSTR bsData, FX_DWORD dwStartPos); + virtual void OnTagClose(FX_LPVOID pTag, FX_DWORD dwEndPos); + virtual void OnTagEnd(FX_LPVOID pTag, FX_BSTR bsTagName, FX_DWORD dwEndPos); + + virtual void OnTargetData(FX_LPVOID pTag, FX_SAXNODE eType, FX_BSTR bsData, FX_DWORD dwStartPos); +protected: + void UpdateChecksum(FX_BOOL bCheckSpace); + CXFA_ChecksumContext *m_pContext; + CXFA_SAXContext m_SAXContext; +}; +class CXFA_ChecksumContext : public IXFA_ChecksumContext, public CFX_Object +{ +public: + CXFA_ChecksumContext(); + ~CXFA_ChecksumContext(); + virtual void Release() + { + delete this; + } + virtual FX_BOOL StartChecksum(); + virtual FX_BOOL UpdateChecksum(IFX_FileRead *pSrcFile, FX_FILESIZE offset = 0, size_t size = 0); + virtual void FinishChecksum(); + virtual void GetChecksum(CFX_ByteString &bsChecksum); + void Update(FX_BSTR bsText); +protected: + IFX_SAXReader *m_pSAXReader; + FX_LPBYTE m_pByteContext; + CFX_ByteString m_bsChecksum; +}; +#endif diff --git a/xfa/src/fxfa/src/app/xfa_ffConfigAcc.cpp b/xfa/src/fxfa/src/app/xfa_ffConfigAcc.cpp new file mode 100644 index 0000000000..de46a33b32 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffConfigAcc.cpp @@ -0,0 +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 + +#include "../../../foxitlib.h" +#include "../common/xfa_common.h" +#include "xfa_ffConfigAcc.h" +CXFA_FFConfigAcc::CXFA_FFConfigAcc(CXFA_Node *pNode) + : m_pNode(pNode) + , m_pPsMapNode(NULL) +{ +} +CXFA_FFConfigAcc::~CXFA_FFConfigAcc() +{ +} +FX_INT32 CXFA_FFConfigAcc::CountChildren() +{ + GetPsMapNode(); + if (m_pPsMapNode == NULL) { + return 0; + } + FX_INT32 iCount = 0; + CXFA_Node* pNode = m_pPsMapNode->GetNodeItem(XFA_NODEITEM_FirstChild); + for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + iCount++; + } + return iCount; +} +FX_BOOL CXFA_FFConfigAcc::GetFontInfo(FX_INT32 index, CFX_WideString &wsFontFamily, CFX_WideString &wsPsName, FX_BOOL bBold, FX_BOOL bItalic) +{ + if (index < 0 || index >= CountChildren()) { + return FALSE; + } + CXFA_Node *pFontNode = m_pPsMapNode->GetChild(index, XFA_ELEMENT_Font); + if (pFontNode == NULL) { + return FALSE; + } + wsFontFamily.Empty(); + wsPsName.Empty(); + bBold = FALSE; + bItalic = FALSE; + pFontNode->GetAttribute(XFA_ATTRIBUTE_Typeface, wsFontFamily); + pFontNode->GetAttribute(XFA_ATTRIBUTE_PsName, wsPsName); + CFX_WideString wsValue; + pFontNode->GetAttribute(XFA_ATTRIBUTE_Weight, wsValue); + wsValue.MakeLower(); + if (wsValue == FX_WSTRC(L"bold")) { + bBold = TRUE; + } + pFontNode->GetAttribute(XFA_ATTRIBUTE_Posture, wsValue); + wsValue.MakeLower(); + if (wsValue == FX_WSTRC(L"italic")) { + bItalic = TRUE; + } + return wsFontFamily.GetLength() > 0; +} +void CXFA_FFConfigAcc::GetPsMapNode() +{ + if (m_pNode == NULL) { + return; + } + m_pPsMapNode = m_pNode->GetChild(0, XFA_ELEMENT_PsMap); +} diff --git a/xfa/src/fxfa/src/app/xfa_ffConfigAcc.h b/xfa/src/fxfa/src/app/xfa_ffConfigAcc.h new file mode 100644 index 0000000000..9cd7fc345a --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffConfigAcc.h @@ -0,0 +1,21 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FXFA_FORMFILLERCONFIGACC_IMP_H +#define _FXFA_FORMFILLERCONFIGACC_IMP_H +class CXFA_FFConfigAcc : public CFX_Object +{ +public: + CXFA_FFConfigAcc(CXFA_Node *pNode); + ~CXFA_FFConfigAcc(); + FX_INT32 CountChildren(); + FX_BOOL GetFontInfo(FX_INT32 index, CFX_WideString &wsFontFamily, CFX_WideString &wsPsName, FX_BOOL bBold, FX_BOOL bItalic); +private: + void GetPsMapNode(); + CXFA_Node *m_pNode; + CXFA_Node *m_pPsMapNode; +}; +#endif diff --git a/xfa/src/fxfa/src/app/xfa_ffapp.cpp b/xfa/src/fxfa/src/app/xfa_ffapp.cpp new file mode 100644 index 0000000000..67ec95b009 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffapp.cpp @@ -0,0 +1,301 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_common.h" +#include "xfa_ffdochandler.h" +#include "xfa_fwladapter.h" +#include "xfa_ffdoc.h" +#include "xfa_ffapp.h" +#include "xfa_fwltheme.h" +#include "xfa_fontmgr.h" +#include "xfa_ffwidgethandler.h" +CXFA_FileRead::CXFA_FileRead(const CFX_ArrayTemplate &streams) + : m_dwSize(0) +{ + m_Streams.Copy(streams); +} +CXFA_FileRead::~CXFA_FileRead() +{ + m_Streams.RemoveAll(); + m_StreamSize.RemoveAll(); +} +FX_FILESIZE CXFA_FileRead::GetSize() +{ + if (m_StreamSize.GetSize() > 0) { + return m_dwSize; + } + FX_INT32 iCount = m_Streams.GetSize(); + FX_DWORD iBufferSize = 4096; + FX_LPBYTE pBuf = FX_Alloc(FX_BYTE, iBufferSize); + for (FX_INT32 i = 0; i < iCount; i++) { + CPDF_StreamFilter* pStreamFilter = m_Streams[i]->GetStreamFilter(FALSE); + FX_DWORD dwCurSize = 0; + while (TRUE) { + FX_DWORD dwRead = pStreamFilter->ReadBlock(pBuf, iBufferSize); + dwCurSize += dwRead; + if (dwRead < iBufferSize) { + break; + } + } + m_dwSize += dwCurSize; + m_StreamSize.Add(dwCurSize); + delete pStreamFilter; + } + FX_Free(pBuf); + return m_dwSize; +} +FX_BOOL CXFA_FileRead::ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) +{ + FX_FILESIZE dwLen = 0; + FX_INT32 iCount = m_Streams.GetSize(); + FX_INT32 i = 0; + for (; i < iCount; i++) { + dwLen += m_StreamSize[i]; + if (dwLen > offset) { + dwLen -= m_StreamSize[i]; + break; + } + } + if (i >= iCount) { + return FALSE; + } + CPDF_StreamFilter* pStreamFilter = m_Streams[i]->GetStreamFilter(FALSE); + if ((offset -= dwLen) > 0) { + FX_LPBYTE pBuf = FX_Alloc(FX_BYTE, offset); + FX_DWORD dwRead = pStreamFilter->ReadBlock(pBuf, offset); + FX_Free(pBuf); + } + FX_DWORD dwHadRead = pStreamFilter->ReadBlock((FX_LPBYTE)buffer, size); + delete pStreamFilter; + size -= dwHadRead; + if (size <= 0) { + return TRUE; + } + FX_DWORD dwReadSize = dwHadRead; + for (FX_INT32 iStart = i + 1; iStart < iCount; iStart++) { + CPDF_StreamFilter* pStreamFilter = m_Streams[iStart]->GetStreamFilter(FALSE); + FX_DWORD dwHadRead = pStreamFilter->ReadBlock(((FX_LPBYTE)buffer) + dwReadSize, size); + delete pStreamFilter; + size -= dwHadRead; + if (size <= 0) { + return TRUE; + } + dwReadSize += dwHadRead; + } + return FALSE; +} +CXFA_FileRead2::CXFA_FileRead2(const CFX_ArrayTemplate &streams) +{ + FX_INT32 iCount = streams.GetSize(); + for (FX_INT32 i = 0; i < iCount; i++) { + CPDF_StreamAcc &acc = m_Data.Add(); + acc.LoadAllData(streams[i]); + } +} +FX_FILESIZE CXFA_FileRead2::GetSize() +{ + FX_DWORD dwSize = 0; + FX_INT32 iCount = m_Data.GetSize(); + for (FX_INT32 i = 0; i < iCount; i++) { + CPDF_StreamAcc &acc = m_Data[i]; + dwSize += acc.GetSize(); + } + return dwSize; +} +FX_BOOL CXFA_FileRead2::ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) +{ + FX_INT32 iCount = m_Data.GetSize(); + FX_INT32 index = 0; + while (index < iCount) { + CPDF_StreamAcc &acc = m_Data[index]; + FX_FILESIZE dwSize = acc.GetSize(); + if (offset < dwSize) { + break; + } + offset -= dwSize; + index++; + } + while (index < iCount) { + CPDF_StreamAcc &acc = m_Data[index]; + FX_DWORD dwSize = acc.GetSize(); + FX_DWORD dwRead = FX_MIN(size, dwSize - offset); + FXSYS_memcpy(buffer, acc.GetData() + offset, dwRead); + size -= dwRead; + if (size == 0) { + return TRUE; + } + buffer = (FX_LPBYTE)buffer + dwRead; + offset = 0; + index++; + } + return FALSE; +} +IXFA_App* IXFA_App::Create(IXFA_AppProvider* pProvider) +{ + return FX_NEW CXFA_FFApp(pProvider); +} +CXFA_FFApp::CXFA_FFApp(IXFA_AppProvider* pProvider) + : m_pDocHandler(NULL) + , m_pFWLTheme(NULL) + , m_pProvider(pProvider) + , m_pFontMgr(NULL) + , m_pAdapterWidgetMgr(NULL) + , m_pFDEFontMgr(NULL) + , m_pMenuHandler(NULL) + , m_pAdapterThreadMgr(NULL) +#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ + , m_pFontSource(NULL) +#endif +{ + m_pFWLApp = IFWL_App::Create(this); + FWL_SetApp(m_pFWLApp); + m_pFWLApp->Initialize(); + IXFA_TimeZoneProvider::Create(); +} +CXFA_FFApp::~CXFA_FFApp() +{ + if (m_pDocHandler) { + delete m_pDocHandler; + } + if (m_pFWLApp) { + m_pFWLApp->Finalize(); + m_pFWLApp->Release(); + } + if (m_pFWLTheme) { + m_pFWLTheme->Release(); + } + if (m_pAdapterWidgetMgr) { + delete m_pAdapterWidgetMgr; + } + if (m_pAdapterThreadMgr) { + delete m_pAdapterThreadMgr; + m_pAdapterThreadMgr = NULL; + } + if (m_pMenuHandler) { + delete m_pMenuHandler; + m_pMenuHandler = NULL; + } + IXFA_TimeZoneProvider::Destroy(); + if (m_pFontMgr != NULL) { + delete m_pFontMgr; + m_pFontMgr = NULL; + } +#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ + if(m_pFontSource != NULL) { + m_pFontSource->Release(); + } +#endif + if (m_pFDEFontMgr) { + m_pFDEFontMgr->Release(); + } +} +IXFA_MenuHandler* CXFA_FFApp::GetMenuHandler() +{ + if (!m_pMenuHandler) { + m_pMenuHandler = FX_NEW CXFA_FFMenuHandler; + } + return m_pMenuHandler; +} +IXFA_DocHandler* CXFA_FFApp::GetDocHandler() +{ + if (!m_pDocHandler) { + m_pDocHandler = FX_NEW CXFA_FFDocHandler; + } + return m_pDocHandler; +} +XFA_HDOC CXFA_FFApp::CreateDoc(IXFA_DocProvider* pProvider, IFX_FileRead* pStream, FX_BOOL bTakeOverFile) +{ + CXFA_FFDoc* pDoc = FX_NEW CXFA_FFDoc(this, pProvider); + if (!pDoc) { + return NULL; + } + FX_BOOL bSuccess = pDoc->OpenDoc(pStream, bTakeOverFile); + if (!bSuccess) { + delete pDoc; + pDoc = NULL; + } + return (XFA_HDOC)pDoc; +} +XFA_HDOC CXFA_FFApp::CreateDoc(IXFA_DocProvider* pProvider, CPDF_Document *pPDFDoc) +{ + if (pPDFDoc == NULL) { + return NULL; + } + CXFA_FFDoc* pDoc = FX_NEW CXFA_FFDoc(this, pProvider); + if (!pDoc) { + return NULL; + } + FX_BOOL bSuccess = pDoc->OpenDoc(pPDFDoc); + if (!bSuccess) { + delete pDoc; + pDoc = NULL; + } + return (XFA_HDOC)pDoc; +} + +void CXFA_FFApp::SetDefaultFontMgr(IXFA_FontMgr* pFontMgr) +{ + if (!m_pFontMgr) { + m_pFontMgr = FX_NEW CXFA_FontMgr(); + } + m_pFontMgr->SetDefFontMgr(pFontMgr); +} +CXFA_FontMgr* CXFA_FFApp::GetXFAFontMgr() +{ + return m_pFontMgr; +} +IFX_FontMgr* CXFA_FFApp::GetFDEFontMgr() +{ + if (!m_pFDEFontMgr) { +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + m_pFDEFontMgr = IFX_FontMgr::Create(FX_GetDefFontEnumerator()); +#else + m_pFontSource = FX_CreateDefaultFontSourceEnum(); + m_pFDEFontMgr = IFX_FontMgr::Create(m_pFontSource); +#endif + } + return m_pFDEFontMgr; +} +CXFA_FWLTheme* CXFA_FFApp::GetFWLTheme() +{ + if (!m_pFWLTheme) { + m_pFWLTheme = FX_NEW CXFA_FWLTheme(this); + } + return m_pFWLTheme; +} +IFWL_AdapterWidgetMgr* CXFA_FFApp::GetWidgetMgr(IFWL_WidgetMgrDelegate *pDelegate) +{ + if (!m_pAdapterWidgetMgr) { + m_pAdapterWidgetMgr = FX_NEW CXFA_FWLAdapterWidgetMgr; + pDelegate->OnSetCapability(FWL_WGTMGR_DisableThread | FWL_WGTMGR_DisableForm); + m_pWidgetMgrDelegate = pDelegate; + } + return m_pAdapterWidgetMgr; +} +IFWL_AdapterThreadMgr* CXFA_FFApp::GetThreadMgr() +{ + if (!m_pAdapterThreadMgr) { + m_pAdapterThreadMgr = FX_NEW CFWL_SDAdapterThreadMgr; + } + return m_pAdapterThreadMgr; +} +IFWL_AdapterTimerMgr* CXFA_FFApp::GetTimerMgr() +{ + return m_pProvider->GetTimerMgr(); +} +IFWL_AdapterCursorMgr* CXFA_FFApp::GetCursorMgr() +{ + return NULL; +} +IFWL_AdapterMonitorMgr* CXFA_FFApp::GetMonitorMgr() +{ + return NULL; +} +IFWL_AdapterClipboardMgr* CXFA_FFApp::GetClipboardMgr() +{ + return NULL; +} diff --git a/xfa/src/fxfa/src/app/xfa_ffapp.h b/xfa/src/fxfa/src/app/xfa_ffapp.h new file mode 100644 index 0000000000..8df5fcde65 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffapp.h @@ -0,0 +1,92 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FXFA_FORMFILLER_APP_IMP_H +#define _FXFA_FORMFILLER_APP_IMP_H +class CXFA_FileRead : public IFX_FileRead, public CFX_Object +{ +public: + CXFA_FileRead(const CFX_ArrayTemplate &streams); + ~CXFA_FileRead(); + virtual FX_FILESIZE GetSize(); + virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size); + virtual void Release() + { + delete this; + } +protected: + CFX_ArrayTemplate m_Streams; + CFX_DWordArray m_StreamSize; + FX_DWORD m_dwSize; +}; +class CXFA_FileRead2 : public IFX_FileRead, public CFX_Object +{ +public: + CXFA_FileRead2(const CFX_ArrayTemplate &streams); + + virtual FX_FILESIZE GetSize(); + virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size); + + virtual void Release() + { + delete this; + } + +protected: + CFX_ObjectArray m_Data; +}; +class CXFA_FWLAdapterWidgetMgr; +class CXFA_FWLTheme; +class CXFA_FFDocHandler; +class CXFA_FFMenuHandler; +class CXFA_FontMgr; +class CXFA_FFApp : public IXFA_App, public IFWL_AdapterNative, public CFX_Object +{ +public: + CXFA_FFApp(IXFA_AppProvider* pProvider); + ~CXFA_FFApp(); + virtual void Release() + { + delete this; + } + virtual IXFA_DocHandler* GetDocHandler(); + virtual XFA_HDOC CreateDoc(IXFA_DocProvider* pProvider, IFX_FileRead* pStream, FX_BOOL bTakeOverFile); + virtual XFA_HDOC CreateDoc(IXFA_DocProvider* pProvider, CPDF_Document* pPDFDoc); + virtual IXFA_AppProvider* GetAppProvider() + { + return m_pProvider; + } + virtual void SetDefaultFontMgr(IXFA_FontMgr* pFontMgr); + virtual IXFA_MenuHandler* GetMenuHandler(); + virtual IFWL_AdapterWidgetMgr* GetWidgetMgr(IFWL_WidgetMgrDelegate* pDelegate); + virtual IFWL_AdapterThreadMgr* GetThreadMgr(); + virtual IFWL_AdapterTimerMgr* GetTimerMgr(); + virtual IFWL_AdapterCursorMgr* GetCursorMgr(); + virtual IFWL_AdapterMonitorMgr* GetMonitorMgr(); + virtual IFWL_AdapterClipboardMgr* GetClipboardMgr(); + CXFA_FontMgr* GetXFAFontMgr(); + IFX_FontMgr* GetFDEFontMgr(); + CXFA_FWLTheme* GetFWLTheme(); + IFWL_WidgetMgrDelegate* GetWidgetMgrDelegate() + { + return m_pWidgetMgrDelegate; + } +protected: + CXFA_FFDocHandler* m_pDocHandler; + IFWL_App* m_pFWLApp; + CXFA_FWLTheme* m_pFWLTheme; + IXFA_AppProvider* m_pProvider; + CXFA_FontMgr* m_pFontMgr; +#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ + IFX_FontSourceEnum* m_pFontSource; +#endif + CXFA_FWLAdapterWidgetMgr* m_pAdapterWidgetMgr; + IFWL_WidgetMgrDelegate* m_pWidgetMgrDelegate; + IFX_FontMgr* m_pFDEFontMgr; + CXFA_FFMenuHandler* m_pMenuHandler; + CFWL_SDAdapterThreadMgr* m_pAdapterThreadMgr; +}; +#endif diff --git a/xfa/src/fxfa/src/app/xfa_ffbarcode.cpp b/xfa/src/fxfa/src/app/xfa_ffbarcode.cpp new file mode 100644 index 0000000000..44fe252d4f --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffbarcode.cpp @@ -0,0 +1,223 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_common.h" +#include "xfa_fwladapter.h" +#include "xfa_ffwidget.h" +#include "xfa_fffield.h" +#include "xfa_ffpageview.h" +#include "xfa_fftextedit.h" +#include "xfa_ffbarcode.h" +static XFA_LPCBARCODETYPEENUMINFO XFA_GetBarcodeTypeByName(FX_WSTR wsName); +CXFA_FFBarcode::CXFA_FFBarcode(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc) + : CXFA_FFTextEdit(pPageView, pDataAcc) +{ +} +CXFA_FFBarcode::~CXFA_FFBarcode() +{ +} +FX_BOOL CXFA_FFBarcode::LoadWidget() +{ + CFWL_Barcode* pFWLBarcode = CFWL_Barcode::Create(); + if(pFWLBarcode) { + pFWLBarcode->Initialize(); + } + m_pNormalWidget = pFWLBarcode; + IFWL_Widget* pWidget = m_pNormalWidget->GetWidget(); + m_pNormalWidget->SetPrivateData(pWidget, this, NULL); + IFWL_NoteDriver *pNoteDriver = FWL_GetApp()->GetNoteDriver(); + pNoteDriver->RegisterEventTarget(pWidget, pWidget); + m_pOldDelegate = m_pNormalWidget->SetDelegate(this); + m_pNormalWidget->LockUpdate(); + CFX_WideString wsText; + m_pDataAcc->GetValue(wsText, XFA_VALUEPICTURE_Display); + pFWLBarcode->SetText(wsText); + UpdateWidgetProperty(); + m_pNormalWidget->UnlockUpdate(); + return CXFA_FFField::LoadWidget(); +} +void CXFA_FFBarcode::RenderWidget(CFX_Graphics* pGS, CFX_Matrix* pMatrix , FX_DWORD dwStatus , FX_INT32 iRotate ) +{ + if (!IsMatchVisibleStatus(dwStatus)) { + return; + } + CFX_Matrix mtRotate; + GetRotateMatrix(mtRotate); + if (pMatrix) { + mtRotate.Concat(*pMatrix); + } + CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus); + CXFA_Border borderUI = m_pDataAcc->GetUIBorder(); + DrawBorder(pGS, borderUI, m_rtUI, &mtRotate); + RenderCaption(pGS, &mtRotate); + CFX_RectF rtWidget; + m_pNormalWidget->GetWidgetRect(rtWidget); + CFX_Matrix mt; + mt.Set(1, 0, 0, 1, rtWidget.left, rtWidget.top); + mt.Concat(mtRotate); + m_pNormalWidget->DrawWidget(pGS, &mt); +} +void CXFA_FFBarcode::UpdateWidgetProperty() +{ + CXFA_FFTextEdit::UpdateWidgetProperty(); + CFWL_Barcode* pBarCodeWidget = (CFWL_Barcode*)m_pNormalWidget; + CFX_WideString wsType = GetDataAcc()->GetBarcodeType(); + XFA_LPCBARCODETYPEENUMINFO pBarcodeTypeInfo = XFA_GetBarcodeTypeByName(wsType); + pBarCodeWidget->SetType(pBarcodeTypeInfo->eBCType); + CXFA_WidgetAcc *pAcc = GetDataAcc(); + FX_INT32 intVal; + FX_CHAR charVal; + FX_BOOL boolVal; + FX_FLOAT floatVal; + if (pAcc->GetBarcodeAttribute_CharEncoding(intVal)) { + pBarCodeWidget->SetCharEncoding((BC_CHAR_ENCODING)intVal); + } + if (pAcc->GetBarcodeAttribute_Checksum(intVal)) { + pBarCodeWidget->SetCalChecksum(intVal); + } + if (pAcc->GetBarcodeAttribute_DataLength(intVal)) { + pBarCodeWidget->SetDataLength(intVal); + } + if (pAcc->GetBarcodeAttribute_StartChar(charVal)) { + pBarCodeWidget->SetStartChar(charVal); + } + if (pAcc->GetBarcodeAttribute_EndChar(charVal)) { + pBarCodeWidget->SetEndChar(charVal); + } + if (pAcc->GetBarcodeAttribute_ECLevel(intVal)) { + pBarCodeWidget->SetErrorCorrectionLevel(intVal); + } + if (pAcc->GetBarcodeAttribute_ModuleWidth(intVal)) { + pBarCodeWidget->SetModuleWidth(intVal); + } + if (pAcc->GetBarcodeAttribute_ModuleHeight(intVal)) { + pBarCodeWidget->SetModuleHeight(intVal); + } + if (pAcc->GetBarcodeAttribute_PrintChecksum(boolVal)) { + pBarCodeWidget->SetPrintChecksum(boolVal); + } + if (pAcc->GetBarcodeAttribute_TextLocation(intVal)) { + pBarCodeWidget->SetTextLocation((BC_TEXT_LOC)intVal); + } + if (pAcc->GetBarcodeAttribute_Truncate(boolVal)) { + pBarCodeWidget->SetTruncated(boolVal); + } + if (pAcc->GetBarcodeAttribute_WideNarrowRatio(floatVal)) { + pBarCodeWidget->SetWideNarrowRatio((FX_INT32)floatVal); + } + if (pBarcodeTypeInfo->eName == XFA_BARCODETYPE_code3Of9 + || pBarcodeTypeInfo->eName == XFA_BARCODETYPE_ean8 + || pBarcodeTypeInfo->eName == XFA_BARCODETYPE_ean13 + || pBarcodeTypeInfo->eName == XFA_BARCODETYPE_upcA) { + pBarCodeWidget->SetPrintChecksum(TRUE); + } +} +FX_BOOL CXFA_FFBarcode::OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + CFWL_Barcode* pBarCodeWidget = (CFWL_Barcode*)m_pNormalWidget; + if (!pBarCodeWidget || pBarCodeWidget->IsProtectedType()) { + return FALSE; + } + if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open) { + return FALSE; + } + return CXFA_FFTextEdit::OnLButtonDown(dwFlags, fx, fy); +} +FX_BOOL CXFA_FFBarcode::OnRButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + CFWL_Barcode* pBarCodeWidget = (CFWL_Barcode*)m_pNormalWidget; + if (!pBarCodeWidget || pBarCodeWidget->IsProtectedType()) { + return FALSE; + } + return CXFA_FFTextEdit::OnRButtonDown(dwFlags, fx, fy); +} +extern const XFA_BARCODETYPEENUMINFO g_XFABarCodeTypeEnumData[] = { + {0x7fb4a18, (FX_LPCWSTR)L"ean13", XFA_BARCODETYPE_ean13, BC_EAN13}, + {0x8d13a3d, (FX_LPCWSTR)L"code11", XFA_BARCODETYPE_code11, BC_UNKNOWN}, + {0x8d149a8, (FX_LPCWSTR)L"code49", XFA_BARCODETYPE_code49, BC_UNKNOWN}, + {0x8d16347, (FX_LPCWSTR)L"code93", XFA_BARCODETYPE_code93, BC_UNKNOWN}, + {0x91a92e2, (FX_LPCWSTR)L"upsMaxicode", XFA_BARCODETYPE_upsMaxicode, BC_UNKNOWN}, + {0xa7d48dc, (FX_LPCWSTR)L"fim", XFA_BARCODETYPE_fim, BC_UNKNOWN}, + {0xb359fe9, (FX_LPCWSTR)L"msi", XFA_BARCODETYPE_msi, BC_UNKNOWN}, + {0x121f738c, (FX_LPCWSTR)L"code2Of5Matrix", XFA_BARCODETYPE_code2Of5Matrix, BC_UNKNOWN}, + {0x15358616, (FX_LPCWSTR)L"ucc128", XFA_BARCODETYPE_ucc128, BC_UNKNOWN}, + {0x1f4bfa05, (FX_LPCWSTR)L"rfid", XFA_BARCODETYPE_rfid, BC_UNKNOWN}, + {0x1fda71bc, (FX_LPCWSTR)L"rss14Stacked", XFA_BARCODETYPE_rss14Stacked, BC_UNKNOWN}, + {0x22065087, (FX_LPCWSTR)L"ean8add2", XFA_BARCODETYPE_ean8add2, BC_UNKNOWN}, + {0x2206508a, (FX_LPCWSTR)L"ean8add5", XFA_BARCODETYPE_ean8add5, BC_UNKNOWN}, + {0x2278366c, (FX_LPCWSTR)L"codabar", XFA_BARCODETYPE_codabar, BC_CODABAR}, + {0x2a039a8d, (FX_LPCWSTR)L"telepen", XFA_BARCODETYPE_telepen, BC_UNKNOWN}, + {0x323ed337, (FX_LPCWSTR)L"upcApwcd", XFA_BARCODETYPE_upcApwcd, BC_UNKNOWN}, + {0x347a1846, (FX_LPCWSTR)L"postUSIMB", XFA_BARCODETYPE_postUSIMB, BC_UNKNOWN}, + {0x391bb836, (FX_LPCWSTR)L"code128", XFA_BARCODETYPE_code128, BC_CODE128}, + {0x398eddaf, (FX_LPCWSTR)L"dataMatrix", XFA_BARCODETYPE_dataMatrix, BC_DATAMATRIX}, + {0x3cff60a8, (FX_LPCWSTR)L"upcEadd2", XFA_BARCODETYPE_upcEadd2, BC_UNKNOWN}, + {0x3cff60ab, (FX_LPCWSTR)L"upcEadd5", XFA_BARCODETYPE_upcEadd5, BC_UNKNOWN}, + {0x402cb188, (FX_LPCWSTR)L"code2Of5Standard", XFA_BARCODETYPE_code2Of5Standard, BC_UNKNOWN}, + {0x411764f7, (FX_LPCWSTR)L"aztec", XFA_BARCODETYPE_aztec, BC_UNKNOWN}, + {0x44d4e84c, (FX_LPCWSTR)L"ean8", XFA_BARCODETYPE_ean8, BC_EAN8}, + {0x48468902, (FX_LPCWSTR)L"ucc128sscc", XFA_BARCODETYPE_ucc128sscc, BC_UNKNOWN}, + {0x4880aea4, (FX_LPCWSTR)L"upcAadd2", XFA_BARCODETYPE_upcAadd2, BC_UNKNOWN}, + {0x4880aea7, (FX_LPCWSTR)L"upcAadd5", XFA_BARCODETYPE_upcAadd5, BC_UNKNOWN}, + {0x54f18256, (FX_LPCWSTR)L"code2Of5Industrial", XFA_BARCODETYPE_code2Of5Industrial, BC_UNKNOWN}, + {0x58e15f25, (FX_LPCWSTR)L"rss14Limited", XFA_BARCODETYPE_rss14Limited, BC_UNKNOWN}, + {0x5c08d1b9, (FX_LPCWSTR)L"postAUSReplyPaid", XFA_BARCODETYPE_postAUSReplyPaid, BC_UNKNOWN}, + {0x5fa700bd, (FX_LPCWSTR)L"rss14", XFA_BARCODETYPE_rss14, BC_UNKNOWN}, + {0x631a7e35, (FX_LPCWSTR)L"logmars", XFA_BARCODETYPE_logmars, BC_UNKNOWN}, + {0x6a236236, (FX_LPCWSTR)L"pdf417", XFA_BARCODETYPE_pdf417, BC_PDF417}, + {0x6d098ece, (FX_LPCWSTR)L"upcean2", XFA_BARCODETYPE_upcean2, BC_UNKNOWN}, + {0x6d098ed1, (FX_LPCWSTR)L"upcean5", XFA_BARCODETYPE_upcean5, BC_UNKNOWN}, + {0x76b04eed, (FX_LPCWSTR)L"code3Of9extended", XFA_BARCODETYPE_code3Of9extended, BC_UNKNOWN}, + {0x7c7db84a, (FX_LPCWSTR)L"maxicode", XFA_BARCODETYPE_maxicode, BC_UNKNOWN}, + {0x8266f7f7, (FX_LPCWSTR)L"ucc128random", XFA_BARCODETYPE_ucc128random, BC_UNKNOWN}, + {0x83eca147, (FX_LPCWSTR)L"postUSDPBC", XFA_BARCODETYPE_postUSDPBC, BC_UNKNOWN}, + {0x8dd71de0, (FX_LPCWSTR)L"postAUSStandard", XFA_BARCODETYPE_postAUSStandard, BC_UNKNOWN}, + {0x98adad85, (FX_LPCWSTR)L"plessey", XFA_BARCODETYPE_plessey, BC_UNKNOWN}, + {0x9f84cce6, (FX_LPCWSTR)L"ean13pwcd", XFA_BARCODETYPE_ean13pwcd, BC_UNKNOWN}, + {0xb514fbe9, (FX_LPCWSTR)L"upcA", XFA_BARCODETYPE_upcA, BC_UPCA}, + {0xb514fbed, (FX_LPCWSTR)L"upcE", XFA_BARCODETYPE_upcE, BC_UNKNOWN}, + {0xb5c6a853, (FX_LPCWSTR)L"ean13add2", XFA_BARCODETYPE_ean13add2, BC_UNKNOWN}, + {0xb5c6a856, (FX_LPCWSTR)L"ean13add5", XFA_BARCODETYPE_ean13add5, BC_UNKNOWN}, + {0xb81fc512, (FX_LPCWSTR)L"postUKRM4SCC", XFA_BARCODETYPE_postUKRM4SCC, BC_UNKNOWN}, + {0xbad34b22, (FX_LPCWSTR)L"code128SSCC", XFA_BARCODETYPE_code128SSCC, BC_UNKNOWN}, + {0xbfbe0cf6, (FX_LPCWSTR)L"postUS5Zip", XFA_BARCODETYPE_postUS5Zip, BC_UNKNOWN}, + {0xc56618e8, (FX_LPCWSTR)L"pdf417macro", XFA_BARCODETYPE_pdf417macro, BC_UNKNOWN}, + {0xca730f8a, (FX_LPCWSTR)L"code2Of5Interleaved", XFA_BARCODETYPE_code2Of5Interleaved, BC_UNKNOWN}, + {0xd0097ac6, (FX_LPCWSTR)L"rss14Expanded", XFA_BARCODETYPE_rss14Expanded, BC_UNKNOWN}, + {0xd25a0240, (FX_LPCWSTR)L"postAUSCust2", XFA_BARCODETYPE_postAUSCust2, BC_UNKNOWN}, + {0xd25a0241, (FX_LPCWSTR)L"postAUSCust3", XFA_BARCODETYPE_postAUSCust3, BC_UNKNOWN}, + {0xd53ed3e7, (FX_LPCWSTR)L"rss14Truncated", XFA_BARCODETYPE_rss14Truncated, BC_UNKNOWN}, + {0xe72bcd57, (FX_LPCWSTR)L"code128A", XFA_BARCODETYPE_code128A, BC_UNKNOWN}, + {0xe72bcd58, (FX_LPCWSTR)L"code128B", XFA_BARCODETYPE_code128B, BC_CODE128_B}, + {0xe72bcd59, (FX_LPCWSTR)L"code128C", XFA_BARCODETYPE_code128C, BC_CODE128_C}, + {0xee83c50f, (FX_LPCWSTR)L"rss14StackedOmni", XFA_BARCODETYPE_rss14StackedOmni, BC_UNKNOWN}, + {0xf2a18f7e, (FX_LPCWSTR)L"QRCode", XFA_BARCODETYPE_QRCode, BC_QR_CODE}, + {0xfaeaf37f, (FX_LPCWSTR)L"postUSStandard", XFA_BARCODETYPE_postUSStandard, BC_UNKNOWN}, + {0xfb48155c, (FX_LPCWSTR)L"code3Of9", XFA_BARCODETYPE_code3Of9, BC_CODE39}, +}; +extern const FX_INT32 g_iXFABarcodeTypeCount = sizeof(g_XFABarCodeTypeEnumData) / sizeof(XFA_BARCODETYPEENUMINFO); +static XFA_LPCBARCODETYPEENUMINFO XFA_GetBarcodeTypeByName(FX_WSTR wsName) +{ + FX_INT32 iLength = wsName.GetLength(); + if (iLength == 0) { + return NULL; + } + FX_UINT32 uHash = FX_HashCode_String_GetW(wsName.GetPtr(), iLength, TRUE); + FX_INT32 iStart = 0, iEnd = g_iXFABarcodeTypeCount - 1; + do { + FX_INT32 iMid = (iStart + iEnd) / 2; + XFA_LPCBARCODETYPEENUMINFO pInfo = g_XFABarCodeTypeEnumData + iMid; + if (uHash == pInfo->uHash) { + return pInfo; + } else if (uHash < pInfo->uHash) { + iEnd = iMid - 1; + } else { + iStart = iMid + 1; + } + } while (iStart <= iEnd); + return NULL; +} diff --git a/xfa/src/fxfa/src/app/xfa_ffbarcode.h b/xfa/src/fxfa/src/app/xfa_ffbarcode.h new file mode 100644 index 0000000000..35b4212efa --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffbarcode.h @@ -0,0 +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 + +#ifndef _FXFA_FORMFILLER_BARCODE_IMP_H +#define _FXFA_FORMFILLER_BARCODE_IMP_H +class CXFA_FFTextEdit; +class CXFA_FFBarcode : public CXFA_FFTextEdit +{ +public: + CXFA_FFBarcode(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc); + virtual ~CXFA_FFBarcode(); + virtual FX_BOOL LoadWidget(); + virtual void RenderWidget(CFX_Graphics* pGS, CFX_Matrix* pMatrix = NULL, FX_DWORD dwStatus = 0, FX_INT32 iRotate = 0); + virtual void UpdateWidgetProperty(); + virtual FX_BOOL OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnRButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); +}; +enum XFA_BARCODETYPEENUM { + XFA_BARCODETYPE_aztec, + XFA_BARCODETYPE_codabar, + XFA_BARCODETYPE_code11, + XFA_BARCODETYPE_code128, + XFA_BARCODETYPE_code128A, + XFA_BARCODETYPE_code128B, + XFA_BARCODETYPE_code128C, + XFA_BARCODETYPE_code128SSCC, + XFA_BARCODETYPE_code2Of5Industrial, + XFA_BARCODETYPE_code2Of5Interleaved, + XFA_BARCODETYPE_code2Of5Matrix, + XFA_BARCODETYPE_code2Of5Standard, + XFA_BARCODETYPE_code3Of9, + XFA_BARCODETYPE_code3Of9extended, + XFA_BARCODETYPE_code49, + XFA_BARCODETYPE_code93, + XFA_BARCODETYPE_dataMatrix, + XFA_BARCODETYPE_ean13, + XFA_BARCODETYPE_ean13add2, + XFA_BARCODETYPE_ean13add5, + XFA_BARCODETYPE_ean13pwcd, + XFA_BARCODETYPE_ean8, + XFA_BARCODETYPE_ean8add2, + XFA_BARCODETYPE_ean8add5, + XFA_BARCODETYPE_fim, + XFA_BARCODETYPE_logmars, + XFA_BARCODETYPE_maxicode, + XFA_BARCODETYPE_msi, + XFA_BARCODETYPE_pdf417, + XFA_BARCODETYPE_pdf417macro, + XFA_BARCODETYPE_plessey, + XFA_BARCODETYPE_postAUSCust2, + XFA_BARCODETYPE_postAUSCust3, + XFA_BARCODETYPE_postAUSReplyPaid, + XFA_BARCODETYPE_postAUSStandard, + XFA_BARCODETYPE_postUKRM4SCC, + XFA_BARCODETYPE_postUS5Zip, + XFA_BARCODETYPE_postUSDPBC, + XFA_BARCODETYPE_postUSIMB, + XFA_BARCODETYPE_postUSStandard, + XFA_BARCODETYPE_QRCode, + XFA_BARCODETYPE_rfid, + XFA_BARCODETYPE_rss14, + XFA_BARCODETYPE_rss14Expanded, + XFA_BARCODETYPE_rss14Limited, + XFA_BARCODETYPE_rss14Stacked, + XFA_BARCODETYPE_rss14StackedOmni, + XFA_BARCODETYPE_rss14Truncated, + XFA_BARCODETYPE_telepen, + XFA_BARCODETYPE_ucc128, + XFA_BARCODETYPE_ucc128random, + XFA_BARCODETYPE_ucc128sscc, + XFA_BARCODETYPE_upcA, + XFA_BARCODETYPE_upcAadd2, + XFA_BARCODETYPE_upcAadd5, + XFA_BARCODETYPE_upcApwcd, + XFA_BARCODETYPE_upcE, + XFA_BARCODETYPE_upcEadd2, + XFA_BARCODETYPE_upcEadd5, + XFA_BARCODETYPE_upcean2, + XFA_BARCODETYPE_upcean5, + XFA_BARCODETYPE_upsMaxicode +}; +struct XFA_BARCODETYPEENUMINFO { + FX_UINT32 uHash; + FX_LPCWSTR pName; + XFA_BARCODETYPEENUM eName; + BC_TYPE eBCType; +}; +typedef XFA_BARCODETYPEENUMINFO const * XFA_LPCBARCODETYPEENUMINFO; +extern const XFA_BARCODETYPEENUMINFO g_XFABarCodeTypeEnumData[]; +#endif diff --git a/xfa/src/fxfa/src/app/xfa_ffcheckbutton.cpp b/xfa/src/fxfa/src/app/xfa_ffcheckbutton.cpp new file mode 100644 index 0000000000..6115d61bcd --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffcheckbutton.cpp @@ -0,0 +1,341 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_common.h" +#include "xfa_ffwidget.h" +#include "xfa_fffield.h" +#include "xfa_ffpageview.h" +#include "xfa_ffcheckbutton.h" +#include "xfa_ffexclgroup.h" +#include "xfa_ffdocview.h" +#include "xfa_ffapp.h" +#include "xfa_ffdoc.h" +CXFA_FFCheckButton::CXFA_FFCheckButton(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc) + : CXFA_FFField(pPageView, pDataAcc) + , m_pOldDelegate(NULL) +{ + m_rtCheckBox.Set(0, 0, 0, 0); +} +CXFA_FFCheckButton::~CXFA_FFCheckButton() +{ +} +FX_BOOL CXFA_FFCheckButton::LoadWidget() +{ + CFWL_CheckBox* pCheckBox = CFWL_CheckBox::Create(); + pCheckBox->Initialize(); + m_pNormalWidget = pCheckBox; + IFWL_Widget* pWidget = m_pNormalWidget->GetWidget(); + m_pNormalWidget->SetPrivateData(pWidget, this, NULL); + IFWL_NoteDriver *pNoteDriver = FWL_GetApp()->GetNoteDriver(); + pNoteDriver->RegisterEventTarget(pWidget, pWidget); + m_pOldDelegate = m_pNormalWidget->SetDelegate(this); + if (m_pDataAcc->IsRadioButton()) { + pCheckBox->ModifyStylesEx(FWL_STYLEEXT_CKB_RadioButton, 0xFFFFFFFF); + } + m_pNormalWidget = (CFWL_Widget*)pCheckBox; + m_pNormalWidget->SetPrivateData(m_pNormalWidget->GetWidget(), this, NULL); + m_pNormalWidget->LockUpdate(); + UpdateWidgetProperty(); + XFA_CHECKSTATE eState = m_pDataAcc->GetCheckState(); + SetFWLCheckState(eState); + m_pNormalWidget->UnlockUpdate(); + return CXFA_FFField::LoadWidget(); +} +void CXFA_FFCheckButton::UpdateWidgetProperty() +{ + CFWL_CheckBox* pCheckBox = (CFWL_CheckBox*)m_pNormalWidget; + if (!m_pNormalWidget) { + return; + } + FX_FLOAT fSize = m_pDataAcc->GetCheckButtonSize(); + pCheckBox->SetBoxSize(fSize); + FX_DWORD dwStyleEx = FWL_STYLEEXT_CKB_SignShapeCross; + FX_INT32 iCheckMark = m_pDataAcc->GetCheckButtonMark(); + switch(iCheckMark) { + case XFA_ATTRIBUTEENUM_Check: + dwStyleEx = FWL_STYLEEXT_CKB_SignShapeCheck; + break; + case XFA_ATTRIBUTEENUM_Circle: + dwStyleEx = FWL_STYLEEXT_CKB_SignShapeCircle; + break; + case XFA_ATTRIBUTEENUM_Cross: + break; + case XFA_ATTRIBUTEENUM_Diamond: + dwStyleEx = FWL_STYLEEXT_CKB_SignShapeDiamond; + break; + case XFA_ATTRIBUTEENUM_Square: + dwStyleEx = FWL_STYLEEXT_CKB_SignShapeSquare; + break; + case XFA_ATTRIBUTEENUM_Star: + dwStyleEx = FWL_STYLEEXT_CKB_SignShapeStar; + break; + default: { + FX_INT32 iShape = m_pDataAcc->GetCheckButtonShape(); + if (iShape == XFA_ATTRIBUTEENUM_Round) { + dwStyleEx = FWL_STYLEEXT_CKB_SignShapeCircle; + } + } + break; + } + if (m_pDataAcc->IsAllowNeutral()) { + dwStyleEx |= FWL_STYLEEXT_CKB_3State; + } + pCheckBox->ModifyStylesEx(dwStyleEx, FWL_STYLEEXT_CKB_SignShapeMask | FWL_STYLEEXT_CKB_3State); +} +FX_BOOL CXFA_FFCheckButton::LayoutWidget() +{ + CXFA_FFWidget::LayoutWidget(); + FX_FLOAT fCheckSize = m_pDataAcc->GetCheckButtonSize(); + CXFA_Margin mgWidget = m_pDataAcc->GetMargin(); + CFX_RectF rtWidget; + GetRectWithoutRotate(rtWidget); + if (mgWidget.IsExistInXML()) { + XFA_RectWidthoutMargin(rtWidget, mgWidget); + } + FX_INT32 iCapPlacement = -1; + FX_FLOAT fCapReserve = 0; + CXFA_Caption caption = m_pDataAcc->GetCaption(); + if (caption.IsExistInXML() && caption.GetPresence()) { + m_rtCaption.Set(rtWidget.left, rtWidget.top, rtWidget.width, rtWidget.height); + iCapPlacement = caption.GetPlacementType(); + fCapReserve = caption.GetReserve(); + if (fCapReserve <= 0) { + if (iCapPlacement == XFA_ATTRIBUTEENUM_Top || iCapPlacement == XFA_ATTRIBUTEENUM_Bottom) { + fCapReserve = rtWidget.height - fCheckSize; + } else { + fCapReserve = rtWidget.width - fCheckSize; + } + } + } + FX_INT32 iHorzAlign = XFA_ATTRIBUTEENUM_Left; + FX_INT32 iVertAlign = XFA_ATTRIBUTEENUM_Top; + if (CXFA_Para para = m_pDataAcc->GetPara()) { + iHorzAlign = para.GetHorizontalAlign(); + iVertAlign = para.GetVerticalAlign(); + } + m_rtUI = rtWidget; + CXFA_Margin mgCap = caption.GetMargin(); + switch(iCapPlacement) { + case XFA_ATTRIBUTEENUM_Left: { + m_rtCaption.width = fCapReserve; + CapLeftRightPlacement(mgCap); + m_rtUI.width -= fCapReserve; + m_rtUI.left += fCapReserve; + } + break; + case XFA_ATTRIBUTEENUM_Top: { + m_rtCaption.height = fCapReserve; + XFA_RectWidthoutMargin(m_rtCaption, mgCap); + m_rtUI.height -= fCapReserve; + m_rtUI.top += fCapReserve; + } + break; + case XFA_ATTRIBUTEENUM_Right: { + m_rtCaption.left = m_rtCaption.right() - fCapReserve; + m_rtCaption.width = fCapReserve; + CapLeftRightPlacement(mgCap); + m_rtUI.width -= fCapReserve; + } + break; + case XFA_ATTRIBUTEENUM_Bottom: { + m_rtCaption.top = m_rtCaption.bottom() - fCapReserve; + m_rtCaption.height = fCapReserve; + XFA_RectWidthoutMargin(m_rtCaption, mgCap); + m_rtUI.height -= fCapReserve; + } + break; + case XFA_ATTRIBUTEENUM_Inline: + break; + default: + iHorzAlign = XFA_ATTRIBUTEENUM_Right; + break; + } + if (iHorzAlign == XFA_ATTRIBUTEENUM_Center) { + m_rtUI.left += (m_rtUI.width - fCheckSize) / 2; + } else if (iHorzAlign == XFA_ATTRIBUTEENUM_Right) { + m_rtUI.left = m_rtUI.right() - fCheckSize; + } + if (iVertAlign == XFA_ATTRIBUTEENUM_Middle) { + m_rtUI.top += (m_rtUI.height - fCheckSize) / 2; + } else if (iVertAlign == XFA_ATTRIBUTEENUM_Bottom) { + m_rtUI.top = m_rtUI.bottom() - fCheckSize; + } + m_rtUI.width = fCheckSize; + m_rtUI.height = fCheckSize; + AddUIMargin(iCapPlacement); + m_rtCheckBox = m_rtUI; + CXFA_Border borderUI = m_pDataAcc->GetUIBorder(); + if (borderUI) { + CXFA_Margin margin = borderUI.GetMargin(); + if (margin.IsExistInXML()) { + XFA_RectWidthoutMargin(m_rtUI, margin); + } + } + m_rtUI.Normalize(); + LayoutCaption(); + SetFWLRect(); + if (m_pNormalWidget) { + m_pNormalWidget->Update(); + } + return TRUE; +} +void CXFA_FFCheckButton::CapLeftRightPlacement(CXFA_Margin mgCap) +{ + XFA_RectWidthoutMargin(m_rtCaption, mgCap); + if (m_rtCaption.height < 0) { + m_rtCaption.top += m_rtCaption.height; + } + if (m_rtCaption.width < 0) { + m_rtCaption.left += m_rtCaption.width; + m_rtCaption.width = -m_rtCaption.width; + } +} +void CXFA_FFCheckButton::AddUIMargin(FX_INT32 iCapPlacement) +{ + CFX_RectF rtUIMargin; + m_pDataAcc->GetUIMargin(rtUIMargin); + m_rtUI.top -= rtUIMargin.top / 2 - rtUIMargin.height / 2; + FX_FLOAT fLeftAddRight = rtUIMargin.left + rtUIMargin.width; + FX_FLOAT fTopAddBottom = rtUIMargin.top + rtUIMargin.height; + if (m_rtUI.width < fLeftAddRight) { + if (iCapPlacement == XFA_ATTRIBUTEENUM_Right || iCapPlacement == XFA_ATTRIBUTEENUM_Left) { + m_rtUI.left -= fLeftAddRight - m_rtUI.width; + } else { + m_rtUI.left -= 2 * (fLeftAddRight - m_rtUI.width); + } + m_rtUI.width += 2 * (fLeftAddRight - m_rtUI.width); + } + if (m_rtUI.height < fTopAddBottom) { + if (iCapPlacement == XFA_ATTRIBUTEENUM_Right) { + m_rtUI.left -= fTopAddBottom - m_rtUI.height; + } + m_rtUI.top -= fTopAddBottom - m_rtUI.height; + m_rtUI.height += 2 * (fTopAddBottom - m_rtUI.height); + } +} +void CXFA_FFCheckButton::RenderWidget(CFX_Graphics* pGS, CFX_Matrix* pMatrix , FX_DWORD dwStatus , FX_INT32 iRotate ) +{ + if (!IsMatchVisibleStatus(dwStatus)) { + return; + } + CFX_Matrix mtRotate; + GetRotateMatrix(mtRotate); + if (pMatrix) { + mtRotate.Concat(*pMatrix); + } + CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus); + CXFA_Border borderUI = m_pDataAcc->GetUIBorder(); + DrawBorder(pGS, borderUI, m_rtUI, &mtRotate, m_pDataAcc->GetCheckButtonShape() == XFA_ATTRIBUTEENUM_Round ? XFA_DRAWBOX_ForceRound : 0); + RenderCaption(pGS, &mtRotate); + DrawHighlight(pGS, &mtRotate, dwStatus, m_pDataAcc->GetCheckButtonShape() == XFA_ATTRIBUTEENUM_Round); + CFX_Matrix mt; + mt.Set(1, 0, 0, 1, m_rtCheckBox.left, m_rtCheckBox.top); + mt.Concat(mtRotate); + GetApp()->GetWidgetMgrDelegate()->OnDrawWidget(m_pNormalWidget->GetWidget(), pGS, &mt); +} +FX_BOOL CXFA_FFCheckButton::OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + if (!m_pNormalWidget) { + return FALSE; + } + if (!IsButtonDown()) { + return FALSE; + } + SetButtonDown(FALSE); + CFWL_MsgMouse ms; + ms.m_dwCmd = FWL_MSGMOUSECMD_LButtonUp; + ms.m_dwFlags = dwFlags; + ms.m_fx = fx; + ms.m_fy = fy; + FWLToClient(ms.m_fx, ms.m_fy); + ms.m_pDstTarget = m_pNormalWidget->m_pImp; + TranslateFWLMessage(&ms); + return TRUE; +} +XFA_CHECKSTATE CXFA_FFCheckButton::FWLState2XFAState() +{ + XFA_CHECKSTATE eCheckState = XFA_CHECKSTATE_Off; + FX_DWORD dwState = m_pNormalWidget->GetStates(); + if (dwState & FWL_STATE_CKB_Checked) { + eCheckState = XFA_CHECKSTATE_On; + } else if (dwState & FWL_STATE_CKB_Neutral) { + eCheckState = XFA_CHECKSTATE_Neutral; + } + return eCheckState; +} +FX_BOOL CXFA_FFCheckButton::CommitData() +{ + XFA_CHECKSTATE eCheckState = FWLState2XFAState(); + m_pDataAcc->SetCheckState(eCheckState, TRUE); + return TRUE; +} +FX_BOOL CXFA_FFCheckButton::IsDataChanged() +{ + XFA_CHECKSTATE eCheckState = FWLState2XFAState(); + return m_pDataAcc->GetCheckState() != eCheckState; +} +void CXFA_FFCheckButton::SetFWLCheckState(XFA_CHECKSTATE eCheckState) +{ + if (eCheckState == XFA_CHECKSTATE_Neutral) { + m_pNormalWidget->SetStates(FWL_STATE_CKB_Neutral, TRUE); + } else { + m_pNormalWidget->SetStates(FWL_STATE_CKB_Checked, eCheckState == XFA_CHECKSTATE_On); + } +} +FX_BOOL CXFA_FFCheckButton::UpdateFWLData() +{ + if (!m_pNormalWidget) { + return FALSE; + } + XFA_CHECKSTATE eState = m_pDataAcc->GetCheckState(); + SetFWLCheckState(eState); + m_pNormalWidget->Update(); + return TRUE; +} +FX_INT32 CXFA_FFCheckButton::OnProcessMessage(CFWL_Message *pMessage) +{ + return m_pOldDelegate->OnProcessMessage(pMessage); +} +FWL_ERR CXFA_FFCheckButton::OnProcessEvent(CFWL_Event *pEvent) +{ + CXFA_FFField::OnProcessEvent(pEvent); + FX_DWORD dwEventID = pEvent->GetClassID(); + switch (dwEventID) { + case FWL_EVTHASH_CKB_CheckStateChanged: { + CXFA_EventParam eParam; + eParam.m_eType = XFA_EVENT_Change; + m_pDataAcc->GetValue(eParam.m_wsNewText, XFA_VALUEPICTURE_Raw); + CXFA_WidgetAcc* pFFExclGroup = m_pDataAcc->GetExclGroup(); + if (ProcessCommittedData()) { + eParam.m_pTarget = pFFExclGroup; + if (pFFExclGroup) { + m_pDocView->AddValidateWidget(pFFExclGroup); + m_pDocView->AddCalculateWidgetAcc(pFFExclGroup); + pFFExclGroup->ProcessEvent(XFA_ATTRIBUTEENUM_Change, &eParam); + } + eParam.m_pTarget = m_pDataAcc; + m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Change, &eParam); + } else { + SetFWLCheckState(m_pDataAcc->GetCheckState()); + } + if (pFFExclGroup) { + eParam.m_pTarget = pFFExclGroup; + pFFExclGroup->ProcessEvent(XFA_ATTRIBUTEENUM_Click, &eParam); + } + eParam.m_pTarget = m_pDataAcc; + m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Click, &eParam); + break; + } + default: { + } + } + return m_pOldDelegate->OnProcessEvent(pEvent); +} +FWL_ERR CXFA_FFCheckButton::OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + return m_pOldDelegate->OnDrawWidget(pGraphics, pMatrix); +} diff --git a/xfa/src/fxfa/src/app/xfa_ffcheckbutton.h b/xfa/src/fxfa/src/app/xfa_ffcheckbutton.h new file mode 100644 index 0000000000..5c32a6d966 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffcheckbutton.h @@ -0,0 +1,36 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FXFA_FORMFILLER_CHECKBUTTON_IMP_H +#define _FXFA_FORMFILLER_CHECKBUTTON_IMP_H +class CXFA_FFExclGroup; +class CXFA_FFCheckButton : public CXFA_FFField +{ +public: + CXFA_FFCheckButton(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc); + virtual ~CXFA_FFCheckButton(); + virtual void RenderWidget(CFX_Graphics* pGS, CFX_Matrix* pMatrix = NULL, FX_DWORD dwStatus = 0, FX_INT32 iRotate = 0); + + virtual FX_BOOL LoadWidget(); + virtual FX_BOOL LayoutWidget(); + virtual FX_BOOL UpdateFWLData(); + virtual void UpdateWidgetProperty(); + virtual FX_BOOL OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + void SetFWLCheckState(XFA_CHECKSTATE eCheckState); + virtual FX_INT32 OnProcessMessage(CFWL_Message *pMessage); + virtual FWL_ERR OnProcessEvent(CFWL_Event *pEvent); + virtual FWL_ERR OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); + +protected: + virtual FX_BOOL CommitData(); + virtual FX_BOOL IsDataChanged(); + void CapLeftRightPlacement(CXFA_Margin mgCap); + void AddUIMargin(FX_INT32 iCapPlacement); + XFA_CHECKSTATE FWLState2XFAState(); + IFWL_WidgetDelegate* m_pOldDelegate; + CFX_RectF m_rtCheckBox; +}; +#endif diff --git a/xfa/src/fxfa/src/app/xfa_ffchoicelist.cpp b/xfa/src/fxfa/src/app/xfa_ffchoicelist.cpp new file mode 100644 index 0000000000..d7faedc45a --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffchoicelist.cpp @@ -0,0 +1,571 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_common.h" +#include "xfa_fwladapter.h" +#include "xfa_ffwidget.h" +#include "xfa_fffield.h" +#include "xfa_ffpageview.h" +#include "xfa_ffdocview.h" +#include "xfa_ffchoicelist.h" +#include "xfa_ffdoc.h" +CXFA_FFListBox::CXFA_FFListBox(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc) + : CXFA_FFField(pPageView, pDataAcc) + , m_pOldDelegate(NULL) +{ +} +CXFA_FFListBox::~CXFA_FFListBox() +{ + if (m_pNormalWidget) { + IFWL_Widget* pWidget = m_pNormalWidget->GetWidget(); + IFWL_NoteDriver *pNoteDriver = FWL_GetApp()->GetNoteDriver(); + pNoteDriver->UnregisterEventTarget(pWidget); + } +} +FX_BOOL CXFA_FFListBox::LoadWidget() +{ + CFWL_ListBox* pListBox = CFWL_ListBox::Create(); + pListBox->Initialize(); + pListBox->ModifyStyles(FWL_WGTSTYLE_VScroll | FWL_WGTSTYLE_NoBackground, 0xFFFFFFFF); + m_pNormalWidget = (CFWL_Widget*)pListBox; + IFWL_Widget* pWidget = m_pNormalWidget->GetWidget(); + m_pNormalWidget->SetPrivateData(pWidget, this, NULL); + IFWL_NoteDriver *pNoteDriver = FWL_GetApp()->GetNoteDriver(); + pNoteDriver->RegisterEventTarget(pWidget, pWidget); + m_pOldDelegate = m_pNormalWidget->SetDelegate(this); + m_pNormalWidget->LockUpdate(); + CFX_WideStringArray wsLabelArray; + m_pDataAcc->GetChoiceListItems(wsLabelArray, FALSE); + FX_INT32 iItems = wsLabelArray.GetSize(); + for (FX_INT32 i = 0; i < iItems; i++) { + pListBox->AddString(wsLabelArray[i]); + } + FX_DWORD dwExtendedStyle = FWL_STYLEEXT_LTB_ShowScrollBarFocus; + if (m_pDataAcc->GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) { + dwExtendedStyle |= FWL_STYLEEXT_LTB_MultiSelection; + } + dwExtendedStyle |= GetAlignment(); + m_pNormalWidget->ModifyStylesEx(dwExtendedStyle, 0xFFFFFFFF); + CFX_Int32Array iSelArray; + m_pDataAcc->GetSelectedItems(iSelArray); + FX_INT32 iSelCount = iSelArray.GetSize(); + for (FX_INT32 j = 0; j < iSelCount; j++) { + FWL_HLISTITEM item = pListBox->GetItem(iSelArray[j]); + pListBox->SetSelItem(item, TRUE); + } + m_pNormalWidget->UnlockUpdate(); + return CXFA_FFField::LoadWidget(); +} +FX_BOOL CXFA_FFListBox::OnKillFocus(CXFA_FFWidget* pNewFocus) +{ + FX_BOOL flag = ProcessCommittedData(); + if (!flag) { + UpdateFWLData(); + } + CXFA_FFField::OnKillFocus(pNewFocus); + return TRUE; +} +FX_BOOL CXFA_FFListBox::CommitData() +{ + FXSYS_assert(m_pNormalWidget != NULL); + CFWL_ListBox* pListBox = (CFWL_ListBox*)m_pNormalWidget; + FX_INT32 iSels = pListBox->CountSelItems(); + CFX_Int32Array iSelArray; + for (FX_INT32 i = 0; i < iSels; i++) { + iSelArray.Add(pListBox->GetSelIndex(i)); + } + m_pDataAcc->SetSelectdItems(iSelArray, TRUE); + return TRUE; +} +FX_BOOL CXFA_FFListBox::IsDataChanged() +{ + CFX_Int32Array iSelArray; + m_pDataAcc->GetSelectedItems(iSelArray); + FX_INT32 iOldSels = iSelArray.GetSize(); + CFWL_ListBox* pListBox = (CFWL_ListBox*)m_pNormalWidget; + FX_INT32 iSels = pListBox->CountSelItems(); + if (iOldSels == iSels) { + FX_INT32 iIndex = 0; + for (; iIndex < iSels; iIndex++) { + FWL_HLISTITEM hlistItem = pListBox->GetItem(iSelArray[iIndex]); + if(!(pListBox->GetItemStates(hlistItem) && FWL_ITEMSTATE_LTB_Selected)) { + break; + } + } + if (iIndex == iSels) { + return FALSE; + } + } + return TRUE; +} +FX_DWORD CXFA_FFListBox::GetAlignment() +{ + FX_DWORD dwExtendedStyle = 0; + if (CXFA_Para para = m_pDataAcc->GetPara()) { + FX_INT32 iHorz = para.GetHorizontalAlign(); + switch(iHorz) { + case XFA_ATTRIBUTEENUM_Center: + dwExtendedStyle |= FWL_STYLEEXT_LTB_CenterAlign; + break; + case XFA_ATTRIBUTEENUM_Justify: + break; + case XFA_ATTRIBUTEENUM_JustifyAll: + break; + case XFA_ATTRIBUTEENUM_Radix: + break; + case XFA_ATTRIBUTEENUM_Right: + dwExtendedStyle |= FWL_STYLEEXT_LTB_RightAlign; + break; + default: + dwExtendedStyle |= FWL_STYLEEXT_LTB_LeftAlign; + break; + } + } + return dwExtendedStyle; +} +FX_BOOL CXFA_FFListBox::UpdateFWLData() +{ + if (!m_pNormalWidget) { + return FALSE; + } + CFWL_ListBox* pListBox = ((CFWL_ListBox*)m_pNormalWidget); + CFX_ArrayTemplate selItemArray; + CFX_Int32Array iSelArray; + m_pDataAcc->GetSelectedItems(iSelArray); + FX_INT32 iSelCount = iSelArray.GetSize(); + for (FX_INT32 j = 0; j < iSelCount; j++) { + FWL_HLISTITEM lpItemSel = pListBox->GetSelItem(iSelArray[j]); + selItemArray.Add(lpItemSel); + } + pListBox->SetSelItem(pListBox->GetSelItem(-1), FALSE); + for(FX_INT32 i = 0; i < iSelCount; i++) { + ((CFWL_ListBox*)m_pNormalWidget)->SetSelItem(selItemArray[i], TRUE); + } + m_pNormalWidget->Update(); + return TRUE; +} +void CXFA_FFListBox::OnSelectChanged(IFWL_Widget *pWidget, const CFX_Int32Array &arrSels) +{ + CXFA_EventParam eParam; + eParam.m_eType = XFA_EVENT_Change; + eParam.m_pTarget = m_pDataAcc; + m_pDataAcc->GetValue(eParam.m_wsPrevText, XFA_VALUEPICTURE_Raw); + CFWL_ListBox* pListBox = (CFWL_ListBox*)m_pNormalWidget; + FX_INT32 iSels = pListBox->CountSelItems(); + if (iSels > 0) { + pListBox->GetItemText(pListBox->GetSelItem(0), eParam.m_wsNewText); + } + m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Change, &eParam); +} +void CXFA_FFListBox::SetItemState(FX_INT32 nIndex, FX_BOOL bSelected) +{ + FWL_HLISTITEM item = ((CFWL_ListBox*)m_pNormalWidget)->GetSelItem(nIndex); + ((CFWL_ListBox*)m_pNormalWidget)->SetSelItem(item, bSelected); + m_pNormalWidget->Update(); + AddInvalidateRect(); +} +void CXFA_FFListBox::InsertItem(FX_WSTR wsLabel, FX_INT32 nIndex ) +{ + CFX_WideString wsTemp(wsLabel); + ((CFWL_ListBox*)m_pNormalWidget)->AddString(wsTemp); + m_pNormalWidget->Update(); + AddInvalidateRect(); +} +void CXFA_FFListBox::DeleteItem(FX_INT32 nIndex) +{ + if (nIndex < 0) { + ((CFWL_ListBox*)m_pNormalWidget)->DeleteAll(); + } else { + ((CFWL_ListBox*)m_pNormalWidget)->DeleteString(((CFWL_ListBox*)m_pNormalWidget)->GetItem(nIndex)); + } + m_pNormalWidget->Update(); + AddInvalidateRect(); +} +FX_INT32 CXFA_FFListBox::OnProcessMessage(CFWL_Message *pMessage) +{ + return m_pOldDelegate->OnProcessMessage(pMessage); +} +FWL_ERR CXFA_FFListBox::OnProcessEvent(CFWL_Event *pEvent) +{ + CXFA_FFField::OnProcessEvent(pEvent); + FX_DWORD dwEventID = pEvent->GetClassID(); + switch (dwEventID) { + case FWL_EVTHASH_LTB_SelChanged: { + CFX_Int32Array arrSels; + OnSelectChanged(m_pNormalWidget->GetWidget(), arrSels); + break; + } + default: { + } + } + return m_pOldDelegate->OnProcessEvent(pEvent); +} +FWL_ERR CXFA_FFListBox::OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + return m_pOldDelegate->OnDrawWidget(pGraphics, pMatrix); +} +CXFA_FFComboBox::CXFA_FFComboBox(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc) + : CXFA_FFField(pPageView, pDataAcc) + , m_pOldDelegate(NULL) +{ +} +CXFA_FFComboBox::~CXFA_FFComboBox() +{ +} +FX_BOOL CXFA_FFComboBox::GetBBox(CFX_RectF &rtBox, FX_DWORD dwStatus, FX_BOOL bDrawFocus) +{ + if (bDrawFocus) { + return FALSE; + } +#ifndef _XFA_EMB + return CXFA_FFWidget::GetBBox(rtBox, dwStatus); +#endif + GetRectWithoutRotate(rtBox); + if (m_pNormalWidget) { + CFX_RectF rtWidget; + ((CFWL_ComboBox*)m_pNormalWidget)->GetBBox(rtWidget); + rtBox.Union(rtWidget); + } + CFX_Matrix mt; + GetRotateMatrix(mt); + mt.TransformRect(rtBox); + return TRUE; +} +FX_BOOL CXFA_FFComboBox::PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy) +{ + if (!m_pNormalWidget) { + return FALSE; + } + CFX_RectF rtWidget; + ((CFWL_ComboBox*)m_pNormalWidget)->GetBBox(rtWidget); + if (rtWidget.Contains(fx, fy)) { + return TRUE; + } + return FALSE; +} +FX_BOOL CXFA_FFComboBox::LoadWidget() +{ + CFWL_ComboBox* pComboBox = CFWL_ComboBox::Create(); + pComboBox->Initialize(); + m_pNormalWidget = (CFWL_Widget*)pComboBox; + IFWL_Widget* pWidget = m_pNormalWidget->GetWidget(); + m_pNormalWidget->SetPrivateData(pWidget, this, NULL); + IFWL_NoteDriver *pNoteDriver = FWL_GetApp()->GetNoteDriver(); + pNoteDriver->RegisterEventTarget(pWidget, pWidget); + m_pOldDelegate = m_pNormalWidget->SetDelegate(this); + m_pNormalWidget->LockUpdate(); + CFX_WideStringArray wsLabelArray; + m_pDataAcc->GetChoiceListItems(wsLabelArray, FALSE); + FX_INT32 iItems = wsLabelArray.GetSize(); + for (FX_INT32 i = 0; i < iItems; i++) { + pComboBox->AddString(wsLabelArray[i]); + } + CFX_Int32Array iSelArray; + m_pDataAcc->GetSelectedItems(iSelArray); + FX_INT32 iSelCount = iSelArray.GetSize(); + if (iSelCount > 0) { + pComboBox->SetCurSel(iSelArray[0]); + } else { + CFX_WideString wsText; + m_pDataAcc->GetValue(wsText, XFA_VALUEPICTURE_Raw); + pComboBox->SetEditText(wsText); + } + UpdateWidgetProperty(); + m_pNormalWidget->UnlockUpdate(); + return CXFA_FFField::LoadWidget(); +} +void CXFA_FFComboBox::UpdateWidgetProperty() +{ + CFWL_ComboBox* pComboBox = (CFWL_ComboBox*)m_pNormalWidget; + if (!pComboBox) { + return; + } + FX_DWORD dwExtendedStyle = 0; + FX_DWORD dwEditStyles = FWL_STYLEEXT_EDT_ReadOnly | FWL_STYLEEXT_EDT_LastLineHeight; + dwExtendedStyle |= UpdateUIProperty(); + if (m_pDataAcc->IsChoiceListAllowTextEntry()) { + dwEditStyles &= ~FWL_STYLEEXT_EDT_ReadOnly; + dwExtendedStyle |= FWL_STYLEEXT_CMB_DropDown; + } + if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open || !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) { + dwEditStyles |= FWL_STYLEEXT_EDT_ReadOnly; + dwExtendedStyle |= FWL_STYLEEXT_CMB_ReadOnly; + } + dwExtendedStyle |= GetAlignment(); + m_pNormalWidget->ModifyStylesEx(dwExtendedStyle, 0xFFFFFFFF); + if (m_pDataAcc->GetHorizontalScrollPolicy() != XFA_ATTRIBUTEENUM_Off) { + dwEditStyles |= FWL_STYLEEXT_EDT_AutoHScroll; + } + pComboBox->EditModifyStylesEx(dwEditStyles, 0xFFFFFFFF); +} +FX_BOOL CXFA_FFComboBox::OnRButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + if (!CXFA_FFField::OnRButtonUp(dwFlags, fx, fy)) { + return FALSE; + } + CFX_PointF pt; + pt.Set(fx, fy); + GetDoc()->GetDocProvider()->PopupMenu((XFA_HWIDGET)this, pt, NULL); + return TRUE; +} +FX_BOOL CXFA_FFComboBox::OnKillFocus(CXFA_FFWidget* pNewWidget) +{ + FX_BOOL flag = ProcessCommittedData(); + if (!flag) { + UpdateFWLData(); + } + CXFA_FFField::OnKillFocus(pNewWidget); + return TRUE; +} +void CXFA_FFComboBox::OpenDropDownList() +{ + ((CFWL_ComboBox*)m_pNormalWidget)->OpenDropDownList(TRUE); +} +FX_BOOL CXFA_FFComboBox::CommitData() +{ + return m_pDataAcc->SetValue(m_wsNewValue, XFA_VALUEPICTURE_Raw); +} +FX_BOOL CXFA_FFComboBox::IsDataChanged() +{ + CFWL_ComboBox* pFWLcombobox = ((CFWL_ComboBox*)m_pNormalWidget); + CFX_WideString wsText; + pFWLcombobox->GetEditText(wsText); + FX_INT32 iCursel = pFWLcombobox->GetCurSel(); + if (iCursel >= 0) { + CFX_WideString wsSel; + pFWLcombobox->GetTextByIndex(iCursel, wsSel); + if (wsSel == wsText) { + m_pDataAcc->GetChoiceListItem(wsText, iCursel, TRUE); + } + } + CFX_WideString wsOldValue; + m_pDataAcc->GetValue(wsOldValue, XFA_VALUEPICTURE_Raw); + if (wsOldValue != wsText) { + m_wsNewValue = wsText; + return TRUE; + } + return FALSE; +} +void CXFA_FFComboBox::FWLEventSelChange(CXFA_EventParam* pParam) +{ + pParam->m_eType = XFA_EVENT_Change; + pParam->m_pTarget = m_pDataAcc; + CFWL_ComboBox* pFWLcombobox = ((CFWL_ComboBox*)m_pNormalWidget); + pFWLcombobox->GetEditText(pParam->m_wsNewText); + m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Change, pParam); +} +FX_DWORD CXFA_FFComboBox::GetAlignment() +{ + FX_DWORD dwExtendedStyle = 0; + if (CXFA_Para para = m_pDataAcc->GetPara()) { + FX_INT32 iHorz = para.GetHorizontalAlign(); + switch(iHorz) { + case XFA_ATTRIBUTEENUM_Center: + dwExtendedStyle |= FWL_STYLEEXT_CMB_EditHCenter | FWL_STYLEEXT_CMB_ListItemCenterAlign; + break; + case XFA_ATTRIBUTEENUM_Justify: + dwExtendedStyle |= FWL_STYLEEXT_CMB_EditJustified; + break; + case XFA_ATTRIBUTEENUM_JustifyAll: + break; + case XFA_ATTRIBUTEENUM_Radix: + break; + case XFA_ATTRIBUTEENUM_Right: + break; + default: + dwExtendedStyle |= FWL_STYLEEXT_CMB_EditHNear | FWL_STYLEEXT_CMB_ListItemLeftAlign; + break; + } + FX_INT32 iVert = para.GetVerticalAlign(); + switch(iVert) { + case XFA_ATTRIBUTEENUM_Middle: + dwExtendedStyle |= FWL_STYLEEXT_CMB_EditVCenter; + break; + case XFA_ATTRIBUTEENUM_Bottom: + dwExtendedStyle |= FWL_STYLEEXT_CMB_EditVFar; + break; + default: + dwExtendedStyle |= FWL_STYLEEXT_CMB_EditVNear; + break; + } + } + return dwExtendedStyle; +} +FX_BOOL CXFA_FFComboBox::UpdateFWLData() +{ + if (!m_pNormalWidget) { + return FALSE; + } + CFX_Int32Array iSelArray; + m_pDataAcc->GetSelectedItems(iSelArray); + FX_INT32 iSelCount = iSelArray.GetSize(); + if (iSelCount > 0) { + ((CFWL_ComboBox*)m_pNormalWidget)->SetCurSel(iSelArray[0]); + } else { + CFX_WideString wsText; + ((CFWL_ComboBox*)m_pNormalWidget)->SetCurSel(-1); + m_pDataAcc->GetValue(wsText, XFA_VALUEPICTURE_Raw); + ((CFWL_ComboBox*)m_pNormalWidget)->SetEditText(wsText); + } + m_pNormalWidget->Update(); + return TRUE; +} +FX_BOOL CXFA_FFComboBox::CanUndo() +{ + return m_pDataAcc->IsChoiceListAllowTextEntry() && ((CFWL_ComboBox*)m_pNormalWidget)->EditCanUndo(); +} +FX_BOOL CXFA_FFComboBox::CanRedo() +{ + return m_pDataAcc->IsChoiceListAllowTextEntry() && ((CFWL_ComboBox*)m_pNormalWidget)->EditCanRedo(); +} +FX_BOOL CXFA_FFComboBox::Undo() +{ + return m_pDataAcc->IsChoiceListAllowTextEntry() && ((CFWL_ComboBox*)m_pNormalWidget)->EditUndo(); +} +FX_BOOL CXFA_FFComboBox::Redo() +{ + return m_pDataAcc->IsChoiceListAllowTextEntry() && ((CFWL_ComboBox*)m_pNormalWidget)->EditRedo(); +} +FX_BOOL CXFA_FFComboBox::CanCopy() +{ + return ((CFWL_ComboBox*)m_pNormalWidget)->EditCanCopy(); +} +FX_BOOL CXFA_FFComboBox::CanCut() +{ + if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open) { + return FALSE; + } + return m_pDataAcc->IsChoiceListAllowTextEntry() && ((CFWL_ComboBox*)m_pNormalWidget)->EditCanCut(); +} +FX_BOOL CXFA_FFComboBox::CanPaste() +{ + return m_pDataAcc->IsChoiceListAllowTextEntry() && (m_pDataAcc->GetAccess() == XFA_ATTRIBUTEENUM_Open); +} +FX_BOOL CXFA_FFComboBox::CanSelectAll() +{ + return ((CFWL_ComboBox*)m_pNormalWidget)->EditCanSelectAll(); +} +FX_BOOL CXFA_FFComboBox::Copy(CFX_WideString &wsCopy) +{ + return ((CFWL_ComboBox*)m_pNormalWidget)->EditCopy(wsCopy); +} +FX_BOOL CXFA_FFComboBox::Cut(CFX_WideString &wsCut) +{ + return m_pDataAcc->IsChoiceListAllowTextEntry() && ((CFWL_ComboBox*)m_pNormalWidget)->EditCut(wsCut); +} +FX_BOOL CXFA_FFComboBox::Paste(const CFX_WideString &wsPaste) +{ + return m_pDataAcc->IsChoiceListAllowTextEntry() && ((CFWL_ComboBox*)m_pNormalWidget)->EditPaste(wsPaste); +} +FX_BOOL CXFA_FFComboBox::SelectAll() +{ + return ((CFWL_ComboBox*)m_pNormalWidget)->EditSelectAll(); +} +FX_BOOL CXFA_FFComboBox::Delete() +{ + return ((CFWL_ComboBox*)m_pNormalWidget)->EditDelete(); +} +FX_BOOL CXFA_FFComboBox::DeSelect() +{ + return ((CFWL_ComboBox*)m_pNormalWidget)->EditDeSelect(); +} +void CXFA_FFComboBox::SetItemState(FX_INT32 nIndex, FX_BOOL bSelected) +{ + if (bSelected) { + ((CFWL_ComboBox*)m_pNormalWidget)->SetCurSel(nIndex); + } else { + ((CFWL_ComboBox*)m_pNormalWidget)->SetCurSel(-1); + } + m_pNormalWidget->Update(); + AddInvalidateRect(); +} +void CXFA_FFComboBox::InsertItem(FX_WSTR wsLabel, FX_INT32 nIndex ) +{ + ((CFWL_ComboBox*)m_pNormalWidget)->AddString(wsLabel); + m_pNormalWidget->Update(); + AddInvalidateRect(); +} +void CXFA_FFComboBox::DeleteItem(FX_INT32 nIndex) +{ + if (nIndex < 0) { + ((CFWL_ComboBox*)m_pNormalWidget)->RemoveAll(); + } else { + ((CFWL_ComboBox*)m_pNormalWidget)->RemoveAt(nIndex); + } + m_pNormalWidget->Update(); + AddInvalidateRect(); +} +void CXFA_FFComboBox::OnTextChanged(IFWL_Widget *pWidget, const CFX_WideString &wsChanged) +{ + CXFA_EventParam eParam; + m_pDataAcc->GetValue(eParam.m_wsPrevText, XFA_VALUEPICTURE_Raw); + eParam.m_wsChange = wsChanged; + FWLEventSelChange(&eParam); +} +void CXFA_FFComboBox::OnSelectChanged(IFWL_Widget *pWidget, const CFX_Int32Array &arrSels, FX_BOOL bLButtonUp) +{ + CXFA_EventParam eParam; + m_pDataAcc->GetValue(eParam.m_wsPrevText, XFA_VALUEPICTURE_Raw); + FWLEventSelChange(&eParam); + if (m_pDataAcc->GetChoiceListCommitOn() == XFA_ATTRIBUTEENUM_Select && bLButtonUp) { + m_pDocView->SetFocusWidgetAcc(NULL); + } +} +void CXFA_FFComboBox::OnPreOpen(IFWL_Widget *pWidget) +{ + CXFA_EventParam eParam; + eParam.m_eType = XFA_EVENT_PreOpen; + eParam.m_pTarget = m_pDataAcc; + m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_PreOpen, &eParam); +} +void CXFA_FFComboBox::OnPostOpen(IFWL_Widget *pWidget) +{ + CXFA_EventParam eParam; + eParam.m_eType = XFA_EVENT_PostOpen; + eParam.m_pTarget = m_pDataAcc; + m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_PostOpen, &eParam); +} +void CXFA_FFComboBox::OnAddDoRecord(IFWL_Widget *pWidget) +{ + GetDoc()->GetDocProvider()->AddDoRecord((XFA_HWIDGET)this); +} +FX_INT32 CXFA_FFComboBox::OnProcessMessage(CFWL_Message *pMessage) +{ + return m_pOldDelegate->OnProcessMessage(pMessage); +} +FWL_ERR CXFA_FFComboBox::OnProcessEvent(CFWL_Event *pEvent) +{ + CXFA_FFField::OnProcessEvent(pEvent); + FX_DWORD dwEventID = pEvent->GetClassID(); + switch (dwEventID) { + case FWL_EVTHASH_CMB_SelChanged: { + CFWL_EvtCmbSelChanged *postEvent = (CFWL_EvtCmbSelChanged*)pEvent; + OnSelectChanged(m_pNormalWidget->GetWidget(), postEvent->iArraySels, postEvent->bLButtonUp); + break; + } + case FWL_EVTHASH_CMB_EditChanged: { + CFX_WideString wsChanged; + OnTextChanged(m_pNormalWidget->GetWidget(), wsChanged); + break; + } + case FWL_EVTHASH_CMB_PreDropDown: { + OnPreOpen(m_pNormalWidget->GetWidget()); + break; + } + case FWL_EVTHASH_CMB_PostDropDown: { + OnPostOpen(m_pNormalWidget->GetWidget()); + break; + } + default: { + } + } + return m_pOldDelegate->OnProcessEvent(pEvent); +} +FWL_ERR CXFA_FFComboBox::OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + return m_pOldDelegate->OnDrawWidget(pGraphics, pMatrix); +} diff --git a/xfa/src/fxfa/src/app/xfa_ffchoicelist.h b/xfa/src/fxfa/src/app/xfa_ffchoicelist.h new file mode 100644 index 0000000000..72463ec513 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffchoicelist.h @@ -0,0 +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 + +#ifndef _FXFA_FORMFILLER_CHOICELIST_IMP_H +#define _FXFA_FORMFILLER_CHOICELIST_IMP_H +class CXFA_FFListBox : public CXFA_FFField +{ +public: + CXFA_FFListBox(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc); + virtual ~CXFA_FFListBox(); + virtual FX_BOOL LoadWidget(); + virtual FX_BOOL OnKillFocus(CXFA_FFWidget* pNewWidget); +protected: + virtual FX_BOOL CommitData(); + virtual FX_BOOL UpdateFWLData(); + virtual FX_BOOL IsDataChanged(); + FX_DWORD GetAlignment(); +public: + void OnSelectChanged(IFWL_Widget *pWidget, const CFX_Int32Array &arrSels); + void SetItemState(FX_INT32 nIndex, FX_BOOL bSelected); + void InsertItem(FX_WSTR wsLabel, FX_INT32 nIndex = -1); + void DeleteItem(FX_INT32 nIndex); + virtual FX_INT32 OnProcessMessage(CFWL_Message *pMessage); + virtual FWL_ERR OnProcessEvent(CFWL_Event *pEvent); + virtual FWL_ERR OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); +protected: + IFWL_WidgetDelegate* m_pOldDelegate; +}; +class CXFA_FFComboBox : public CXFA_FFField +{ +public: + CXFA_FFComboBox(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc); + virtual ~CXFA_FFComboBox(); + virtual FX_BOOL GetBBox(CFX_RectF &rtBox, FX_DWORD dwStatus, FX_BOOL bDrawFocus = FALSE); + virtual FX_BOOL LoadWidget(); + virtual void UpdateWidgetProperty(); + virtual FX_BOOL OnRButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnKillFocus(CXFA_FFWidget* pNewWidget); + virtual FX_BOOL CanUndo(); + virtual FX_BOOL CanRedo(); + virtual FX_BOOL Undo(); + virtual FX_BOOL Redo(); + + virtual FX_BOOL CanCopy(); + virtual FX_BOOL CanCut(); + virtual FX_BOOL CanPaste(); + virtual FX_BOOL CanSelectAll(); + virtual FX_BOOL Copy(CFX_WideString &wsCopy); + virtual FX_BOOL Cut(CFX_WideString &wsCut); + virtual FX_BOOL Paste(const CFX_WideString &wsPaste); + virtual FX_BOOL SelectAll(); + virtual FX_BOOL Delete(); + virtual FX_BOOL DeSelect(); + void OpenDropDownList(); +protected: + virtual FX_BOOL PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL CommitData(); + virtual FX_BOOL UpdateFWLData(); + virtual FX_BOOL IsDataChanged(); + FX_DWORD GetAlignment(); + void FWLEventSelChange(CXFA_EventParam* pParam); + + CFX_WideString m_wsNewValue; +public: + void OnTextChanged(IFWL_Widget *pWidget, const CFX_WideString &wsChanged); + void OnSelectChanged(IFWL_Widget *pWidget, const CFX_Int32Array &arrSels, FX_BOOL bLButtonUp); + void OnPreOpen(IFWL_Widget *pWidget); + void OnPostOpen(IFWL_Widget *pWidget); + void OnAddDoRecord(IFWL_Widget *pWidget); + void SetItemState(FX_INT32 nIndex, FX_BOOL bSelected); + void InsertItem(FX_WSTR wsLabel, FX_INT32 nIndex = -1); + void DeleteItem(FX_INT32 nIndex); + virtual FX_INT32 OnProcessMessage(CFWL_Message *pMessage); + virtual FWL_ERR OnProcessEvent(CFWL_Event *pEvent); + virtual FWL_ERR OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); +protected: + IFWL_WidgetDelegate* m_pOldDelegate; +}; +#endif diff --git a/xfa/src/fxfa/src/app/xfa_ffdoc.cpp b/xfa/src/fxfa/src/app/xfa_ffdoc.cpp new file mode 100644 index 0000000000..9c686036c0 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffdoc.cpp @@ -0,0 +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 "../../../foxitlib.h" +#include "../common/xfa_common.h" +#include "xfa_ffapp.h" +#include "xfa_ffdoc.h" +#include "xfa_ffdocview.h" +#include "xfa_ffwidget.h" +#include "xfa_ffnotify.h" +#include "xfa_fontmgr.h" +CXFA_FFDoc::CXFA_FFDoc(CXFA_FFApp* pApp, IXFA_DocProvider* pDocProvider) + : m_pDocProvider(pDocProvider) + , m_dwDocType(XFA_DOCTYPE_Static) + , m_pDocument(NULL) + , m_pStream(NULL) + , m_pApp(pApp) + , m_pNotify(NULL) + , m_pPDFDoc(NULL) + , m_bOwnStream(TRUE) +{ +} +CXFA_FFDoc::~CXFA_FFDoc() +{ + CloseDoc(); +} +FX_DWORD CXFA_FFDoc::GetDocType() +{ + return m_dwDocType; +} +FX_INT32 CXFA_FFDoc::StartLoad() +{ + m_pNotify = FX_NEW CXFA_FFNotify(this); + IXFA_DocParser* pDocParser = IXFA_DocParser::Create(m_pNotify); + FX_INT32 iStatus = pDocParser->StartParse(m_pStream); + m_pDocument = pDocParser->GetDocument(); + return iStatus; +} +FX_BOOL XFA_GetPDFContentsFromPDFXML(IFDE_XMLNode *pPDFElement, FX_LPBYTE &pByteBuffer, FX_INT32& iBufferSize) +{ + IFDE_XMLElement* pDocumentElement = NULL; + for (IFDE_XMLNode *pXMLNode = pPDFElement->GetNodeItem(IFDE_XMLNode::FirstChild); pXMLNode; pXMLNode = pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling)) { + if (pXMLNode->GetType() == FDE_XMLNODE_Element) { + CFX_WideString wsTagName; + IFDE_XMLElement * pXMLElement = (IFDE_XMLElement *)pXMLNode; + pXMLElement->GetTagName(wsTagName); + if (wsTagName.Equal(FX_WSTRC(L"document"))) { + pDocumentElement = pXMLElement; + break; + } + } + } + if (!pDocumentElement) { + return FALSE; + } + IFDE_XMLElement* pChunkElement = NULL; + for (IFDE_XMLNode *pXMLNode = pDocumentElement->GetNodeItem(IFDE_XMLNode::FirstChild); pXMLNode; pXMLNode = pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling)) { + if (pXMLNode->GetType() == FDE_XMLNODE_Element) { + CFX_WideString wsTagName; + IFDE_XMLElement * pXMLElement = (IFDE_XMLElement *)pXMLNode; + pXMLElement->GetTagName(wsTagName); + if (wsTagName.Equal(FX_WSTRC(L"chunk"))) { + pChunkElement = pXMLElement; + break; + } + } + } + if (!pChunkElement) { + return FALSE; + } + CFX_WideString wsPDFContent; + pChunkElement->GetTextData(wsPDFContent); + iBufferSize = FX_Base64DecodeW(wsPDFContent, wsPDFContent.GetLength(), NULL); + pByteBuffer = FX_Alloc(FX_BYTE, iBufferSize + 1); + if (!pByteBuffer) { + return FALSE; + } + pByteBuffer[iBufferSize] = '0'; + FX_Base64DecodeW(wsPDFContent, wsPDFContent.GetLength(), pByteBuffer); + return TRUE; +} +void XFA_XPDPacket_MergeRootNode(CXFA_Node *pOriginRoot, CXFA_Node* pNewRoot) +{ + CXFA_Node* pChildNode = pNewRoot->GetNodeItem(XFA_NODEITEM_FirstChild); + while (pChildNode) { + CXFA_Node* pOriginChild = pOriginRoot->GetFirstChildByName(pChildNode->GetNameHash()); + if (pOriginChild) { + pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling); + } else { + CXFA_Node *pNextSibling = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling); + pNewRoot->RemoveChild(pChildNode); + pOriginRoot->InsertChild(pChildNode); + pChildNode = pNextSibling; + pNextSibling = NULL; + } + } +} +FX_INT32 CXFA_FFDoc::DoLoad(IFX_Pause *pPause ) +{ + FX_INT32 iStatus = m_pDocument->GetParser()->DoParse(pPause); + if (iStatus == XFA_PARSESTATUS_Done && !m_pPDFDoc) { + CXFA_Node* pPDFNode = (CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_Pdf); + if (!pPDFNode) { + return XFA_PARSESTATUS_SyntaxErr; + } + IFDE_XMLNode *pPDFXML = pPDFNode->GetXMLMappingNode(); + if (pPDFXML->GetType() != FDE_XMLNODE_Element) { + return XFA_PARSESTATUS_SyntaxErr; + } + FX_INT32 iBufferSize = 0; + FX_LPBYTE pByteBuffer = NULL; + IFX_FileRead* pXFAReader = NULL; + if (XFA_GetPDFContentsFromPDFXML(pPDFXML, pByteBuffer, iBufferSize)) { + pXFAReader = FX_CreateMemoryStream(pByteBuffer, iBufferSize, TRUE); + if (!pXFAReader) { + if (pByteBuffer) { + FX_Free(pByteBuffer); + pByteBuffer = NULL; + } + return XFA_PARSESTATUS_SyntaxErr; + } + } else { + CFX_WideString wsHref; + ((IFDE_XMLElement*)pPDFXML)->GetString((FX_LPCWSTR)L"href", wsHref); + if (!wsHref.IsEmpty()) { + pXFAReader = GetDocProvider()->OpenLinkedFile((XFA_HDOC)this, wsHref); + } + } + if (!pXFAReader) { + return XFA_PARSESTATUS_SyntaxErr; + } + CPDF_Document* pPDFDocument = GetDocProvider()->OpenPDF(reinterpret_cast(this), pXFAReader, TRUE); + FXSYS_assert(!m_pPDFDoc); + if (!OpenDoc(pPDFDocument)) { + return XFA_PARSESTATUS_SyntaxErr; + } + IXFA_Parser* pParser = IXFA_Parser::Create(m_pDocument, TRUE); + if (!pParser) { + return XFA_PARSESTATUS_SyntaxErr; + } + CXFA_Node* pRootNode = NULL; + if (pParser->StartParse(m_pStream) == XFA_PARSESTATUS_Ready && pParser->DoParse(NULL) == XFA_PARSESTATUS_Done) { + pRootNode = pParser->GetRootNode(); + } + if (pRootNode && m_pDocument->GetRoot()) { + XFA_XPDPacket_MergeRootNode(m_pDocument->GetRoot(), pRootNode); + iStatus = XFA_PARSESTATUS_Done; + } else { + iStatus = XFA_PARSESTATUS_StatusErr; + } + pParser->Release(); + pParser = NULL; + } + return iStatus; +} +void CXFA_FFDoc::StopLoad() +{ + m_pApp->GetXFAFontMgr()->LoadDocFonts((XFA_HDOC)this); + m_dwDocType = XFA_DOCTYPE_Static; + CXFA_Node* pConfig = (CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_Config); + if (!pConfig) { + return; + } + CXFA_Node* pAcrobat = pConfig->GetFirstChildByClass(XFA_ELEMENT_Acrobat); + if (!pAcrobat) { + return; + } + CXFA_Node* pAcrobat7 = pAcrobat->GetFirstChildByClass(XFA_ELEMENT_Acrobat7); + if (!pAcrobat7) { + return; + } + CXFA_Node* pDynamicRender = pAcrobat7->GetFirstChildByClass(XFA_ELEMENT_DynamicRender); + if (!pDynamicRender) { + return; + } + CFX_WideString wsType; + if (pDynamicRender->TryContent(wsType) && wsType == FX_WSTRC(L"required")) { + m_dwDocType = XFA_DOCTYPE_Dynamic; + } +} +IXFA_DocView* CXFA_FFDoc::CreateDocView(FX_DWORD dwView ) +{ + CXFA_FFDocView* pDocView = (CXFA_FFDocView*)m_mapTypeToDocView.GetValueAt((FX_LPVOID)(FX_UINTPTR)dwView); + if (!pDocView) { + pDocView = FX_NEW CXFA_FFDocView(this); + m_mapTypeToDocView.SetAt((FX_LPVOID)(FX_UINTPTR)dwView, pDocView); + } + return pDocView; +} +CXFA_FFDocView* CXFA_FFDoc::GetDocView(IXFA_DocLayout* pLayout) +{ + FX_POSITION ps = m_mapTypeToDocView.GetStartPosition(); + while (ps) { + FX_LPVOID pType; + CXFA_FFDocView* pDocView; + m_mapTypeToDocView.GetNextAssoc(ps, pType, (void*&)pDocView); + if (pDocView->GetXFALayout() == pLayout) { + return pDocView; + } + } + return NULL; +} +CXFA_FFDocView* CXFA_FFDoc::GetDocView() +{ + FX_POSITION ps = m_mapTypeToDocView.GetStartPosition(); + if (ps) { + FX_LPVOID pType; + CXFA_FFDocView* pDocView; + m_mapTypeToDocView.GetNextAssoc(ps, pType, (void*&)pDocView); + return pDocView; + } + return NULL; +} +FX_BOOL CXFA_FFDoc::OpenDoc(IFX_FileRead* pStream, FX_BOOL bTakeOverFile) +{ + m_bOwnStream = bTakeOverFile; + m_pStream = pStream; + return TRUE; +} +FX_BOOL CXFA_FFDoc::OpenDoc(CPDF_Document* pPDFDoc) +{ + if (pPDFDoc == NULL) { + return FALSE; + } + CPDF_Dictionary* pRoot = pPDFDoc->GetRoot(); + if (pRoot == NULL) { + return FALSE; + } + CPDF_Dictionary* pAcroForm = pRoot->GetDict(FX_BSTRC("AcroForm")); + if (pAcroForm == NULL) { + return FALSE; + } + CPDF_Object* pElementXFA = pAcroForm->GetElement(FX_BSTRC("XFA")); + if (pElementXFA == NULL) { + return FALSE; + } + FX_INT32 iObjType = pElementXFA->GetType(); + if (iObjType == PDFOBJ_REFERENCE) { + pElementXFA = pElementXFA->GetDirect(); + iObjType = pElementXFA->GetType(); + } + CFX_ArrayTemplate xfaStreams; + if (iObjType == PDFOBJ_ARRAY) { + CPDF_Array* pXFAArray = (CPDF_Array*)pElementXFA; + FX_DWORD count = pXFAArray->GetCount() / 2; + for (FX_DWORD i = 0; i < count; i++) { + CPDF_Stream* pStream = pXFAArray->GetStream(i * 2 + 1); + if (pStream != NULL) { + xfaStreams.Add(pStream); + } + } + } else if (iObjType == PDFOBJ_STREAM) { + xfaStreams.Add((CPDF_Stream*)pElementXFA); + } + if (xfaStreams.GetSize() < 1) { + return FALSE; + } + IFX_FileRead* pFileRead = FX_NEW CXFA_FileRead2(xfaStreams); + if (!pFileRead) { + return FALSE; + } + m_pPDFDoc = pPDFDoc; + if (m_pStream) { + m_pStream->Release(); + m_pStream = NULL; + } + m_pStream = pFileRead; + m_bOwnStream = TRUE; + return TRUE; +} +FX_BOOL CXFA_FFDoc::CloseDoc() +{ + FX_POSITION psClose = m_mapTypeToDocView.GetStartPosition(); + while (psClose) { + FX_LPVOID pType; + CXFA_FFDocView* pDocView; + m_mapTypeToDocView.GetNextAssoc(psClose, pType, (void*&)pDocView); + pDocView->RunDocClose(); + } + if (m_pDocument) { + m_pDocument->ClearLayoutData(); + } + FX_POSITION ps = m_mapTypeToDocView.GetStartPosition(); + while (ps) { + FX_LPVOID pType; + CXFA_FFDocView* pDocView; + m_mapTypeToDocView.GetNextAssoc(ps, pType, (void*&)pDocView); + delete pDocView; + } + m_mapTypeToDocView.RemoveAll(); + if (m_pDocument) { + IXFA_Parser* pParser = m_pDocument->GetParser(); + pParser->Release(); + m_pDocument = NULL; + } + if (m_pNotify) { + delete m_pNotify; + m_pNotify = NULL; + } + m_pApp->GetXFAFontMgr()->ReleaseDocFonts((XFA_HDOC)this); + if (m_dwDocType != XFA_DOCTYPE_XDP && m_pStream && m_bOwnStream) { + m_pStream->Release(); + m_pStream = NULL; + } + ps = m_mapNamedImages.GetStartPosition(); + while (ps) { + FX_LPVOID pName; + FX_IMAGEDIB_AND_DPI* pImage = NULL; + m_mapNamedImages.GetNextAssoc(ps, pName, (void*&)pImage); + if (pImage) { + delete pImage->pDibSource; + pImage->pDibSource = NULL; + FX_Free(pImage); + pImage = NULL; + } + } + m_mapNamedImages.RemoveAll(); + IFWL_NoteDriver *pNoteDriver = FWL_GetApp()->GetNoteDriver(); + pNoteDriver->ClearEventTargets(FALSE); + return TRUE; +} +void CXFA_FFDoc::SetDocType(FX_DWORD dwType) +{ + m_dwDocType = dwType; +} +CPDF_Document* CXFA_FFDoc::GetPDFDoc() +{ + return m_pPDFDoc; +} +#define _FXLIB_NEW_VERSION_ +CFX_DIBitmap* CXFA_FFDoc::GetPDFNamedImage(FX_WSTR wsName, FX_INT32 &iImageXDpi, FX_INT32 &iImageYDpi) +{ + if (!m_pPDFDoc) { + return NULL; + } + FX_DWORD dwHash = FX_HashCode_String_GetW(wsName.GetPtr(), wsName.GetLength(), FALSE); + FX_IMAGEDIB_AND_DPI *imageDIBDpi = NULL; + if (m_mapNamedImages.Lookup((void*)(FX_UINTPTR)dwHash, (void*&)imageDIBDpi)) { + iImageXDpi = imageDIBDpi->iImageXDpi; + iImageYDpi = imageDIBDpi->iImageYDpi; + return (CFX_DIBitmap*)imageDIBDpi->pDibSource; + } + CPDF_Dictionary* pRoot = m_pPDFDoc->GetRoot(); + if (pRoot == NULL) { + return NULL; + } + CPDF_Dictionary* pNames = pRoot->GetDict("Names"); + if (!pNames) { + return NULL; + } + CPDF_Dictionary* pXFAImages = pNames->GetDict("XFAImages"); + if (!pXFAImages) { + return NULL; + } + CPDF_NameTree nametree(pXFAImages); +#ifdef _FXLIB_NEW_VERSION_ + CFX_ByteString bsName = PDF_EncodeText(wsName.GetPtr(), wsName.GetLength()); + CPDF_Object* pObject = nametree.LookupValue(bsName); + if (!pObject) { + FX_INT32 iCount = nametree.GetCount(); + for (FX_INT32 i = 0; i < iCount; i++) { + CFX_ByteString bsTemp; + CPDF_Object* pTempObject = nametree.LookupValue(i, bsTemp); + if (bsTemp == bsName) { + pObject = pTempObject; + break; + } + } + } +#else + CPDF_Object* pObject = nametree.LookupValue(wsName); + if (!pObject) { + FX_INT32 iCount = nametree.GetCount(); + for (FX_INT32 i = 0; i < iCount; i++) { + CFX_WideString wsTemp; + CPDF_Object* pTempObject = nametree.LookupValue(i, wsTemp); + if (wsTemp == wsName) { + pObject = pTempObject; + break; + } + } + } +#endif + if (!pObject || pObject->GetType() != PDFOBJ_STREAM) { + return NULL; + } + if (!imageDIBDpi) { + imageDIBDpi = FX_Alloc(FX_IMAGEDIB_AND_DPI, 1); + imageDIBDpi->pDibSource = NULL; + imageDIBDpi->iImageXDpi = 0; + imageDIBDpi->iImageYDpi = 0; + CPDF_StreamAcc streamAcc; + streamAcc.LoadAllData((CPDF_Stream*)pObject); + IFX_FileRead* pImageFileRead = FX_CreateMemoryStream((FX_LPBYTE)streamAcc.GetData(), streamAcc.GetSize()); + imageDIBDpi->pDibSource = XFA_LoadImageFromBuffer(pImageFileRead, FXCODEC_IMAGE_UNKNOWN, iImageXDpi, iImageYDpi); + imageDIBDpi->iImageXDpi = iImageXDpi; + imageDIBDpi->iImageYDpi = iImageYDpi; + pImageFileRead->Release(); + } + m_mapNamedImages.SetAt((void*)(FX_UINTPTR)dwHash, imageDIBDpi); + return (CFX_DIBitmap*)imageDIBDpi->pDibSource; +} +IFDE_XMLElement* CXFA_FFDoc::GetPackageData(FX_WSTR wsPackage) +{ + FX_DWORD packetHash = FX_HashCode_String_GetW(wsPackage.GetPtr(), wsPackage.GetLength()); + CXFA_Object* pObject = m_pDocument->GetXFANode(packetHash); + CXFA_Node *pNode = (pObject && pObject->IsNode()) ? (CXFA_Node*)pObject : NULL; + if (!pNode) { + return NULL; + } + IFDE_XMLNode *pXMLNode = pNode->GetXMLMappingNode(); + return (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) ? (IFDE_XMLElement *)pXMLNode : NULL; +} +FX_BOOL CXFA_FFDoc::SavePackage(FX_WSTR wsPackage, IFX_FileWrite* pFile, IXFA_ChecksumContext *pCSContext ) +{ + IXFA_PacketExport *pExport = IXFA_PacketExport::Create(m_pDocument); + if (!pExport) { + return FALSE; + } + FX_DWORD packetHash = FX_HashCode_String_GetW(wsPackage.GetPtr(), wsPackage.GetLength()); + CXFA_Node *pNode = NULL; + if (packetHash == XFA_HASHCODE_Xfa) { + pNode = m_pDocument->GetRoot(); + } else { + CXFA_Object *pObject = m_pDocument->GetXFANode(packetHash); + pNode = (pObject && pObject->IsNode()) ? (CXFA_Node*)pObject : NULL; + } + FX_BOOL bFlags = FALSE; + if (pNode) { + CFX_ByteString bsChecksum; + if (pCSContext) { + pCSContext->GetChecksum(bsChecksum); + } + bFlags = pExport->Export(pFile, pNode, 0, bsChecksum.GetLength() ? (FX_LPCSTR)bsChecksum : NULL); + } else { + bFlags = pExport->Export(pFile); + } + pExport->Release(); + return bFlags; +} +FX_BOOL CXFA_FFDoc::ImportData(IFX_FileRead* pStream, FX_BOOL bXDP ) +{ + FX_BOOL bRet = FALSE; + IXFA_PacketImport *pImport = IXFA_PacketImport::Create(m_pDocument); + if (pImport) { + bRet = pImport->ImportData(pStream); + pImport->Release(); + } + return bRet; +} diff --git a/xfa/src/fxfa/src/app/xfa_ffdoc.h b/xfa/src/fxfa/src/app/xfa_ffdoc.h new file mode 100644 index 0000000000..c11c675ea6 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffdoc.h @@ -0,0 +1,63 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FXFA_FORMFILLER_DOC_IMP_H +#define _FXFA_FORMFILLER_DOC_IMP_H +class CXFA_FFApp; +class CXFA_FFNotify; +class CXFA_FFDocView; +class IXFA_Locale; +typedef struct _FX_IMAGEDIB_AND_DPI { + CFX_DIBSource* pDibSource; + FX_INT32 iImageXDpi; + FX_INT32 iImageYDpi; +} FX_IMAGEDIB_AND_DPI; +class CXFA_FFDoc : public CFX_Object +{ +public: + CXFA_FFDoc(CXFA_FFApp* pApp, IXFA_DocProvider* pDocProvider); + ~CXFA_FFDoc(); + IXFA_DocProvider* GetDocProvider() + { + return m_pDocProvider; + } + FX_DWORD GetDocType(); + FX_INT32 StartLoad(); + FX_INT32 DoLoad(IFX_Pause *pPause = NULL); + void StopLoad(); + IXFA_DocView* CreateDocView(FX_DWORD dwView = 0); + FX_BOOL OpenDoc(IFX_FileRead* pStream, FX_BOOL bTakeOverFile); + FX_BOOL OpenDoc(CPDF_Document* pPDFDoc); + FX_BOOL CloseDoc(); + void SetDocType(FX_DWORD dwType); + CXFA_Document* GetXFADoc() + { + return m_pDocument; + } + CXFA_FFApp* GetApp() + { + return m_pApp; + } + CXFA_FFDocView* GetDocView(IXFA_DocLayout* pLayout); + CXFA_FFDocView* GetDocView(); + CPDF_Document* GetPDFDoc(); + CFX_DIBitmap* GetPDFNamedImage(FX_WSTR wsName, FX_INT32 &iImageXDpi, FX_INT32 &iImageYDpi); + IFDE_XMLElement* GetPackageData(FX_WSTR wsPackage); + FX_BOOL SavePackage(FX_WSTR wsPackage, IFX_FileWrite* pFile, IXFA_ChecksumContext *pCSContext = NULL); + FX_BOOL ImportData(IFX_FileRead* pStream, FX_BOOL bXDP = TRUE); +protected: + IXFA_DocProvider* m_pDocProvider; + CXFA_Document* m_pDocument; + IFX_FileRead* m_pStream; + CXFA_FFApp* m_pApp; + CXFA_FFNotify* m_pNotify; + CPDF_Document* m_pPDFDoc; + CFX_MapPtrToPtr m_mapNamedImages; + CFX_MapPtrToPtr m_mapTypeToDocView; + FX_DWORD m_dwDocType; + FX_BOOL m_bOwnStream; +}; +#endif diff --git a/xfa/src/fxfa/src/app/xfa_ffdochandler.cpp b/xfa/src/fxfa/src/app/xfa_ffdochandler.cpp new file mode 100644 index 0000000000..426a455d4f --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffdochandler.cpp @@ -0,0 +1,113 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_common.h" +#include "xfa_ffdochandler.h" +#include "xfa_ffdoc.h" +CXFA_FFDocHandler::CXFA_FFDocHandler() +{ +} +CXFA_FFDocHandler::~CXFA_FFDocHandler() +{ +} +void CXFA_FFDocHandler::ReleaseDoc(XFA_HDOC hDoc) +{ + delete (CXFA_FFDoc*)hDoc; +} +IXFA_DocProvider* CXFA_FFDocHandler::GetDocProvider(XFA_HDOC hDoc) +{ + return ((CXFA_FFDoc*)hDoc)->GetDocProvider(); +} +FX_DWORD CXFA_FFDocHandler::GetDocType(XFA_HDOC hDoc) +{ + return ((CXFA_FFDoc*)hDoc)->GetDocType(); +} +FX_INT32 CXFA_FFDocHandler::StartLoad(XFA_HDOC hDoc) +{ + return ((CXFA_FFDoc*)hDoc)->StartLoad(); +} +FX_INT32 CXFA_FFDocHandler::DoLoad(XFA_HDOC hDoc, IFX_Pause *pPause ) +{ + return ((CXFA_FFDoc*)hDoc)->DoLoad(pPause); +} +void CXFA_FFDocHandler::StopLoad(XFA_HDOC hDoc) +{ + ((CXFA_FFDoc*)hDoc)->StopLoad(); +} + +IXFA_DocView* CXFA_FFDocHandler::CreateDocView(XFA_HDOC hDoc, FX_DWORD dwView ) +{ + return ((CXFA_FFDoc*)hDoc)->CreateDocView(dwView); +} +FX_INT32 CXFA_FFDocHandler::CountPackages(XFA_HDOC hDoc) +{ + return 0; +} +void CXFA_FFDocHandler::GetPackageName(XFA_HDOC hDoc, FX_INT32 iPackage, CFX_WideStringC &wsPackage) +{ +} +IFDE_XMLElement* CXFA_FFDocHandler::GetPackageData(XFA_HDOC hDoc, FX_WSTR wsPackage) +{ + return ((CXFA_FFDoc*)hDoc)->GetPackageData(wsPackage); +} +FX_BOOL CXFA_FFDocHandler::SavePackage(XFA_HDOC hDoc, FX_WSTR wsPackage, IFX_FileWrite* pFile, IXFA_ChecksumContext *pCSContext ) +{ + return ((CXFA_FFDoc*)hDoc)->SavePackage(wsPackage, pFile, pCSContext); +} +FX_BOOL CXFA_FFDocHandler::CloseDoc(XFA_HDOC hDoc) +{ + return ((CXFA_FFDoc*)hDoc)->CloseDoc(); +} + +FX_BOOL CXFA_FFDocHandler::ImportData(XFA_HDOC hDoc, IFX_FileRead* pStream, FX_BOOL bXDP ) +{ + return ((CXFA_FFDoc*)hDoc)->ImportData(pStream, bXDP); +} +void CXFA_FFDocHandler::SetJSERuntime(XFA_HDOC hDoc, FXJSE_HRUNTIME hRuntime) +{ + ((CXFA_FFDoc*)hDoc)->GetXFADoc()->InitScriptContext(hRuntime); +} +FXJSE_HVALUE CXFA_FFDocHandler::GetXFAScriptObject(XFA_HDOC hDoc) +{ + CXFA_Document* pXFADoc = ((CXFA_FFDoc*)hDoc)->GetXFADoc(); + if (!pXFADoc) { + return NULL; + } + IXFA_ScriptContext* pScriptContext = pXFADoc->GetScriptContext(); + if (!pScriptContext) { + return NULL; + } + return pScriptContext->GetJSValueFromMap(pXFADoc->GetRoot()); +} +XFA_ATTRIBUTEENUM CXFA_FFDocHandler::GetRestoreState(XFA_HDOC hDoc) +{ + CXFA_Document* pXFADoc = ((CXFA_FFDoc*)hDoc)->GetXFADoc(); + if (!pXFADoc) { + return XFA_ATTRIBUTEENUM_Unknown; + } + CXFA_Node* pForm = (CXFA_Node*)pXFADoc->GetXFANode(XFA_HASHCODE_Form); + if (!pForm) { + return XFA_ATTRIBUTEENUM_Unknown; + } + CXFA_Node* pSubForm = pForm->GetFirstChildByClass(XFA_ELEMENT_Subform); + if (!pSubForm) { + return XFA_ATTRIBUTEENUM_Unknown; + } + return pSubForm->GetEnum(XFA_ATTRIBUTE_RestoreState); +} +FX_BOOL CXFA_FFDocHandler::RunDocScript(XFA_HDOC hDoc, XFA_SCRIPTTYPE eScriptType, FX_WSTR wsScript, FXJSE_HVALUE hRetValue, FXJSE_HVALUE hThisObject) +{ + CXFA_Document* pXFADoc = ((CXFA_FFDoc*)hDoc)->GetXFADoc(); + if (!pXFADoc) { + return FALSE; + } + IXFA_ScriptContext* pScriptContext = pXFADoc->GetScriptContext(); + if (!pScriptContext) { + return FALSE; + } + return pScriptContext->RunScript((XFA_SCRIPTLANGTYPE)eScriptType, wsScript, hRetValue, hThisObject ? (CXFA_Object*)FXJSE_Value_ToObject(hThisObject, NULL) : NULL); +} diff --git a/xfa/src/fxfa/src/app/xfa_ffdochandler.h b/xfa/src/fxfa/src/app/xfa_ffdochandler.h new file mode 100644 index 0000000000..c4c0853f12 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffdochandler.h @@ -0,0 +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 _FXFA_FORMFILLER_DOCHANDLER_IMP_H +#define _FXFA_FORMFILLER_DOCHANDLER_IMP_H +class CXFA_FFDocHandler : public IXFA_DocHandler, public CFX_Object +{ +public: + CXFA_FFDocHandler(); + ~CXFA_FFDocHandler(); + virtual void ReleaseDoc(XFA_HDOC hDoc); + virtual IXFA_DocProvider* GetDocProvider(XFA_HDOC hDoc); + virtual FX_DWORD GetDocType(XFA_HDOC hDoc); + virtual FX_INT32 StartLoad(XFA_HDOC hDoc); + virtual FX_INT32 DoLoad(XFA_HDOC hDoc, IFX_Pause *pPause = NULL); + virtual void StopLoad(XFA_HDOC hDoc); + + virtual IXFA_DocView* CreateDocView(XFA_HDOC hDoc, FX_DWORD dwView = 0); + virtual FX_INT32 CountPackages(XFA_HDOC hDoc); + virtual void GetPackageName(XFA_HDOC hDoc, FX_INT32 iPackage, CFX_WideStringC &wsPackage); + virtual IFDE_XMLElement* GetPackageData(XFA_HDOC hDoc, FX_WSTR wsPackage); + virtual FX_BOOL SavePackage(XFA_HDOC hDoc, FX_WSTR wsPackage, IFX_FileWrite* pFile, IXFA_ChecksumContext *pCSContext = NULL); + virtual FX_BOOL CloseDoc(XFA_HDOC hDoc); + virtual FX_BOOL ImportData(XFA_HDOC hDoc, IFX_FileRead* pStream, FX_BOOL bXDP = TRUE); + virtual void SetJSERuntime(XFA_HDOC hDoc, FXJSE_HRUNTIME hRuntime); + virtual FXJSE_HVALUE GetXFAScriptObject(XFA_HDOC hDoc); + virtual XFA_ATTRIBUTEENUM GetRestoreState(XFA_HDOC hDoc); + virtual FX_BOOL RunDocScript(XFA_HDOC hDoc, XFA_SCRIPTTYPE eScriptType, FX_WSTR wsScript, FXJSE_HVALUE hRetValue, FXJSE_HVALUE hThisObject); +protected: +}; +#endif diff --git a/xfa/src/fxfa/src/app/xfa_ffdocview.cpp b/xfa/src/fxfa/src/app/xfa_ffdocview.cpp new file mode 100644 index 0000000000..bb6a5ce2a9 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffdocview.cpp @@ -0,0 +1,960 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_common.h" +#include "xfa_fwladapter.h" +#include "xfa_ffdocview.h" +#include "xfa_ffpageview.h" +#include "xfa_ffwidgethandler.h" +#include "xfa_ffdoc.h" +#include "xfa_ffwidget.h" +#include "xfa_fffield.h" +#include "xfa_ffpushbutton.h" +#include "xfa_ffcheckbutton.h" +#include "xfa_ffchoicelist.h" +#include "xfa_ffimageedit.h" +#include "xfa_fftextedit.h" +#include "xfa_ffbarcode.h" +#include "xfa_ffdraw.h" +#include "xfa_fftext.h" +#include "xfa_ffpath.h" +#include "xfa_ffimage.h" +#include "xfa_ffexclgroup.h" +#include "xfa_ffsubform.h" +#include "xfa_ffsignature.h" +#include "xfa_ffapp.h" +#include "xfa_textlayout.h" +#include "xfa_ffwidgetacc.h" +extern const XFA_ATTRIBUTEENUM gs_EventActivity[] = { + XFA_ATTRIBUTEENUM_Click, + XFA_ATTRIBUTEENUM_Change, + XFA_ATTRIBUTEENUM_DocClose, + XFA_ATTRIBUTEENUM_DocReady, + XFA_ATTRIBUTEENUM_Enter, + XFA_ATTRIBUTEENUM_Exit, + XFA_ATTRIBUTEENUM_Full, + XFA_ATTRIBUTEENUM_IndexChange, + XFA_ATTRIBUTEENUM_Initialize, + XFA_ATTRIBUTEENUM_MouseDown, + XFA_ATTRIBUTEENUM_MouseEnter, + XFA_ATTRIBUTEENUM_MouseExit, + XFA_ATTRIBUTEENUM_MouseUp, + XFA_ATTRIBUTEENUM_PostExecute, + XFA_ATTRIBUTEENUM_PostOpen, + XFA_ATTRIBUTEENUM_PostPrint, + XFA_ATTRIBUTEENUM_PostSave, + XFA_ATTRIBUTEENUM_PostSign, + XFA_ATTRIBUTEENUM_PostSubmit, + XFA_ATTRIBUTEENUM_PreExecute, + XFA_ATTRIBUTEENUM_PreOpen, + XFA_ATTRIBUTEENUM_PrePrint, + XFA_ATTRIBUTEENUM_PreSave, + XFA_ATTRIBUTEENUM_PreSign, + XFA_ATTRIBUTEENUM_PreSubmit, + XFA_ATTRIBUTEENUM_Ready, + XFA_ATTRIBUTEENUM_Unknown, +}; +CXFA_FFDocView::CXFA_FFDocView(CXFA_FFDoc* pDoc) + : m_pDoc(pDoc) + , m_pWidgetHandler(NULL) + , m_pXFADocLayout(NULL) + , m_iStatus(XFA_DOCVIEW_LAYOUTSTATUS_None) + , m_iLock(0) + , m_bLayoutEvent(FALSE) + , m_pFocusAcc(NULL) + , m_pFocusWidget(NULL) + , m_pListFocusWidget(NULL) + , m_pOldFocusWidget(NULL) + , m_bInLayoutStatus(FALSE) +{ +} +CXFA_FFDocView::~CXFA_FFDocView() +{ + DestroyDocView(); + if (m_pWidgetHandler) { + delete m_pWidgetHandler; + } + m_pWidgetHandler = NULL; +} +void CXFA_FFDocView::InitLayout(CXFA_Node* pNode) +{ + RunBindItems(); + ExecEventActivityByDeepFirst(pNode, XFA_EVENT_Initialize); + ExecEventActivityByDeepFirst(pNode, XFA_EVENT_IndexChange); +} +FX_INT32 CXFA_FFDocView::StartLayout(FX_INT32 iStartPage ) +{ + m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_Start; + m_pDoc->GetXFADoc()->DoProtoMerge(); + m_pDoc->GetXFADoc()->DoDataMerge(); + m_pXFADocLayout = GetXFALayout(); + FX_INT32 iStatus = m_pXFADocLayout->StartLayout(); + if (iStatus < 0) { + return iStatus; + } + CXFA_Node* pRootItem = (CXFA_Node*)m_pDoc->GetXFADoc()->GetXFANode(XFA_HASHCODE_Form); + if (!pRootItem) { + return iStatus; + } + InitLayout(pRootItem); + InitCalculate(pRootItem); + InitValidate(pRootItem); + ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready, TRUE); + m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_Start; + return iStatus; +} +FX_INT32 CXFA_FFDocView::DoLayout(IFX_Pause *pPause ) +{ + FX_INT32 iStatus = 100; + iStatus = m_pXFADocLayout->DoLayout(pPause); + if (iStatus != 100) { + return iStatus; + } + m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_Doing; + return iStatus; +} +void CXFA_FFDocView::StopLayout() +{ + CXFA_Node* pRootItem = (CXFA_Node*)m_pDoc->GetXFADoc()->GetXFANode(XFA_HASHCODE_Form); + if (!pRootItem) { + return; + } + CXFA_Node* pSubformNode = pRootItem->GetChild(0, XFA_ELEMENT_Subform); + if (!pSubformNode) { + return; + } + CXFA_Node* pPageSetNode = pSubformNode->GetFirstChildByClass(XFA_ELEMENT_PageSet); + if(!pPageSetNode) { + return; + } + RunCalculateWidgets(); + RunValidate(); + InitLayout(pPageSetNode); + InitCalculate(pPageSetNode); + InitValidate(pPageSetNode); + ExecEventActivityByDeepFirst(pPageSetNode, XFA_EVENT_Ready, TRUE); + ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready); + ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_DocReady); + RunCalculateWidgets(); + RunValidate(); + if(RunLayout()) { + ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready); + } + m_CalculateAccs.RemoveAll(); + if (m_pFocusAcc && !m_pFocusWidget) { + SetFocusWidgetAcc(m_pFocusAcc); + } + m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_End; +} +FX_INT32 CXFA_FFDocView::GetLayoutStatus() +{ + return m_iStatus; +} +void CXFA_FFDocView::ShowNullTestMsg() +{ + FX_INT32 iCount = m_arrNullTestMsg.GetSize(); + CXFA_FFApp* pApp = m_pDoc->GetApp(); + IXFA_AppProvider* pAppProvider = pApp->GetAppProvider(); + if (pAppProvider && iCount) { + FX_INT32 iRemain = iCount > 7 ? iCount - 7 : 0; + iCount -= iRemain; + CFX_WideString wsMsg; + for (FX_INT32 i = 0; i < iCount; i++) { + wsMsg += m_arrNullTestMsg[i] + FX_WSTRC(L"\n"); + } + if (iRemain > 0) { + CFX_WideString wsLimit; + pAppProvider->LoadString(XFA_IDS_ValidateLimit, wsLimit); + if (!wsLimit.IsEmpty()) { + CFX_WideString wsTemp; + wsTemp.Format((FX_LPCWSTR)wsLimit, iRemain); + wsMsg += FX_WSTRC(L"\n") + wsTemp; + } + } + CFX_WideString wsTitle; + pAppProvider->LoadString(XFA_IDS_AppName, wsTitle); + pAppProvider->MsgBox(wsMsg, wsTitle, XFA_MBICON_Status, XFA_MB_OK); + } + m_arrNullTestMsg.RemoveAll(); +} +void CXFA_FFDocView::UpdateDocView() +{ + if (IsUpdateLocked()) { + return; + } + LockUpdate(); + FX_INT32 iNewAdds = m_NewAddedNodes.GetSize(); + for (FX_INT32 i = 0; i < iNewAdds; i++) { + CXFA_Node* pNode = (CXFA_Node*)m_NewAddedNodes[i]; + InitCalculate(pNode); + InitValidate(pNode); + ExecEventActivityByDeepFirst(pNode, XFA_EVENT_Ready, TRUE); + } + m_NewAddedNodes.RemoveAll(); + this->RunSubformIndexChange(); + this->RunCalculateWidgets(); + this->RunValidate(); + ShowNullTestMsg(); + m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_Next; + if (RunLayout() && m_bLayoutEvent) { + RunEventLayoutReady(); + } + m_bLayoutEvent = FALSE; + m_CalculateAccs.RemoveAll(); + this->RunInvalidate(); + UnlockUpdate(); +} +FX_INT32 CXFA_FFDocView::CountPageViews() +{ + if (!m_pXFADocLayout) { + return 0; + } + return m_pXFADocLayout->CountPages(); +} +IXFA_PageView* CXFA_FFDocView::GetPageView(FX_INT32 nIndex) +{ + if (!m_pXFADocLayout) { + return NULL; + } + return (CXFA_FFPageView*)m_pXFADocLayout->GetPage(nIndex); +} +XFA_HWIDGET CXFA_FFDocView::GetWidgetByName(FX_WSTR wsName) +{ + return (XFA_HWIDGET)GetWidgetByName(wsName, NULL); +} +CXFA_WidgetAcc* CXFA_FFDocView::GetWidgetAccByName(FX_WSTR wsName) +{ + return GetWidgetAccByName(wsName, NULL); +} +IXFA_DocLayout* CXFA_FFDocView::GetXFALayout() const +{ + return m_pDoc->GetXFADoc()->GetDocLayout(); +} +FX_BOOL CXFA_FFDocView::ResetSingleWidgetAccData(CXFA_WidgetAcc* pWidgetAcc) +{ + CXFA_Node* pNode = pWidgetAcc->GetNode(); + XFA_ELEMENT eType = pNode->GetClassID(); + if (eType != XFA_ELEMENT_Field && eType != XFA_ELEMENT_ExclGroup) { + return FALSE; + } + FX_BOOL bNotify = IsStaticNotify(); + pWidgetAcc->ResetData(); + pWidgetAcc->UpdateUIDisplay(); + if (bNotify) { + pWidgetAcc->NotifyEvent(XFA_WIDGETEVENT_PostContentChanged, NULL, NULL, NULL); + } + if (CXFA_Validate validate = pWidgetAcc->GetValidate()) { + AddValidateWidget(pWidgetAcc); + ((CXFA_Node*)validate)->SetFlag(XFA_NODEFLAG_NeedsInitApp, TRUE, FALSE); + } + return TRUE; +} +void CXFA_FFDocView::ResetWidgetData(CXFA_WidgetAcc* pWidgetAcc ) +{ + m_bLayoutEvent = TRUE; + FX_BOOL bChanged = FALSE; + CXFA_Node* pFormNode = NULL; + if (pWidgetAcc) { + bChanged = ResetSingleWidgetAccData(pWidgetAcc); + pFormNode = pWidgetAcc->GetNode(); + } else { + pFormNode = GetRootSubform(); + } + if (!pFormNode) { + return; + } + if (pFormNode->GetClassID() != XFA_ELEMENT_Field && pFormNode->GetClassID() != XFA_ELEMENT_ExclGroup) { + CXFA_WidgetAccIterator Iterator(this, pFormNode); + while (CXFA_WidgetAcc* pAcc = Iterator.MoveToNext()) { + bChanged |= ResetSingleWidgetAccData(pAcc); + if (pAcc->GetNode()->GetClassID() == XFA_ELEMENT_ExclGroup) { + Iterator.SkipTree(); + } + } + } + if (bChanged) { + m_pDoc->GetDocProvider()->SetChangeMark((XFA_HDOC)m_pDoc); + } +} +FX_INT32 CXFA_FFDocView::ProcessWidgetEvent(CXFA_EventParam* pParam, CXFA_WidgetAcc* pWidgetAcc ) +{ + if (pParam == NULL) { + return XFA_EVENTERROR_Error; + } + if (pParam->m_eType == XFA_EVENT_Validate) { + CFX_WideString wsValidateStr = FX_WSTRC(L"preSubmit"); + CXFA_Node* pConfigItem = (CXFA_Node*)m_pDoc->GetXFADoc()->GetXFANode(XFA_HASHCODE_Config); + if (pConfigItem) { + CXFA_Node* pValidateNode = NULL; + CXFA_Node* pAcrobatNode = pConfigItem->GetChild(0, XFA_ELEMENT_Acrobat); + pValidateNode = pAcrobatNode ? pAcrobatNode->GetChild(0, XFA_ELEMENT_Validate) : NULL; + if (!pValidateNode) { + CXFA_Node* pPresentNode = pConfigItem->GetChild(0, XFA_ELEMENT_Present); + pValidateNode = pPresentNode ? pPresentNode->GetChild(0, XFA_ELEMENT_Validate) : NULL; + } + if (pValidateNode) { + wsValidateStr = pValidateNode->GetContent(); + } + } + FX_BOOL bValidate = FALSE; + switch (pParam->m_iValidateActivities) { + case XFA_VALIDATE_preSubmit: + bValidate = wsValidateStr.Find(L"preSubmit") != -1; + break; + case XFA_VALIDATE_prePrint: + bValidate = wsValidateStr.Find(L"prePrint") != -1; + break; + case XFA_VALIDATE_preExecute: + bValidate = wsValidateStr.Find(L"preExecute") != -1; + break; + case XFA_VALIDATE_preSave: + bValidate = wsValidateStr.Find(L"preSave") != -1; + break; + } + if (!bValidate) { + return XFA_EVENTERROR_Sucess; + } + } + CXFA_Node* pNode = pWidgetAcc ? pWidgetAcc->GetNode() : NULL; + if (!pNode) { + CXFA_Node* pRootItem = (CXFA_Node*)m_pDoc->GetXFADoc()->GetXFANode(XFA_HASHCODE_Form); + if (!pRootItem) { + return XFA_EVENTERROR_Error; + } + pNode = pRootItem->GetChild(0, XFA_ELEMENT_Subform); + } + ExecEventActivityByDeepFirst(pNode, pParam->m_eType, pParam->m_bIsFormReady); + return XFA_EVENTERROR_Sucess; +} +IXFA_WidgetHandler* CXFA_FFDocView::GetWidgetHandler() +{ + if (!m_pWidgetHandler) { + m_pWidgetHandler = FX_NEW CXFA_FFWidgetHandler(this); + } + return m_pWidgetHandler; +} +IXFA_WidgetIterator* CXFA_FFDocView::CreateWidgetIterator() +{ + CXFA_Node* pFormRoot = GetRootSubform(); + if (!pFormRoot) { + return NULL; + } + return FX_NEW CXFA_FFDocWidgetIterator(this, pFormRoot); +} +IXFA_WidgetAccIterator* CXFA_FFDocView::CreateWidgetAccIterator(XFA_WIDGETORDER eOrder ) +{ + CXFA_Node* pFormRoot = GetRootSubform(); + if (!pFormRoot) { + return NULL; + } + return FX_NEW CXFA_WidgetAccIterator(this, pFormRoot); +} +XFA_HWIDGET CXFA_FFDocView::GetFocusWidget() +{ + return (XFA_HWIDGET)m_pFocusWidget; +} +void CXFA_FFDocView::KillFocus() +{ + if (m_pFocusWidget && (m_pFocusWidget->GetStatus() & XFA_WIDGETSTATUS_Focused)) { + (m_pFocusWidget)->OnKillFocus(NULL); + } + m_pFocusAcc = NULL; + m_pFocusWidget = NULL; + m_pOldFocusWidget = NULL; +} +FX_BOOL CXFA_FFDocView::SetFocus(XFA_HWIDGET hWidget) +{ + CXFA_FFWidget* pNewFocus = (CXFA_FFWidget*)hWidget; + if (m_pOldFocusWidget == pNewFocus) { + return FALSE; + } + CXFA_FFWidget* pOldFocus = m_pOldFocusWidget; + m_pOldFocusWidget = pNewFocus; + if (pOldFocus) { + if (m_pFocusWidget != m_pOldFocusWidget && (pOldFocus->GetStatus() & XFA_WIDGETSTATUS_Focused)) { + m_pFocusWidget = pOldFocus; + pOldFocus->OnKillFocus(pNewFocus); + } else if ((pOldFocus->GetStatus() & XFA_WIDGETSTATUS_Visible)) { + if (!pOldFocus->IsLoaded()) { + pOldFocus->LoadWidget(); + } + pOldFocus->OnSetFocus(m_pFocusWidget); + m_pFocusWidget = pOldFocus; + pOldFocus->OnKillFocus(pNewFocus); + } + } + if (m_pFocusWidget == m_pOldFocusWidget) { + return FALSE; + } + pNewFocus = m_pOldFocusWidget; + if (m_pListFocusWidget && pNewFocus == m_pListFocusWidget) { + m_pFocusAcc = NULL; + m_pFocusWidget = NULL; + m_pListFocusWidget = NULL; + m_pOldFocusWidget = NULL; + return FALSE; + } + if (pNewFocus && (pNewFocus->GetStatus() & XFA_WIDGETSTATUS_Visible)) { + if (!pNewFocus->IsLoaded()) { + pNewFocus->LoadWidget(); + } + pNewFocus->OnSetFocus(m_pFocusWidget); + } + m_pFocusAcc = pNewFocus ? pNewFocus->GetDataAcc() : NULL; + m_pFocusWidget = pNewFocus; + m_pOldFocusWidget = m_pFocusWidget; + return TRUE; +} +CXFA_WidgetAcc* CXFA_FFDocView::GetFocusWidgetAcc() +{ + return m_pFocusAcc; +} +void CXFA_FFDocView::SetFocusWidgetAcc(CXFA_WidgetAcc* pWidgetAcc) +{ + CXFA_FFWidget* pNewFocus = pWidgetAcc ? pWidgetAcc->GetNextWidget(NULL) : NULL; + if (SetFocus((XFA_HWIDGET)pNewFocus)) { + m_pFocusAcc = pWidgetAcc; + if (m_iStatus >= XFA_DOCVIEW_LAYOUTSTATUS_End) { + m_pDoc->GetDocProvider()->SetFocusWidget((XFA_HDOC)m_pDoc, (XFA_HWIDGET)m_pFocusWidget); + } + } +} +void CXFA_FFDocView::DeleteLayoutItem(CXFA_FFWidget* pWidget) +{ + if (m_pFocusAcc == pWidget->GetDataAcc()) { + m_pFocusAcc = NULL; + m_pFocusWidget = NULL; + m_pOldFocusWidget = NULL; + } +} +static FX_INT32 XFA_ProcessEvent(CXFA_FFDocView* pDocView, CXFA_WidgetAcc* pWidgetAcc, CXFA_EventParam* pParam) +{ + if (!pParam || pParam->m_eType == XFA_EVENT_Unknown) { + return XFA_EVENTERROR_NotExist; + } + if (!pWidgetAcc || pWidgetAcc->GetClassID() == XFA_ELEMENT_Draw) { + return XFA_EVENTERROR_NotExist; + } + switch (pParam->m_eType) { + case XFA_EVENT_Calculate: + return pWidgetAcc->ProcessCalculate(); + case XFA_EVENT_Validate: + if (((CXFA_FFDoc*)pDocView->GetDoc())->GetDocProvider()->IsValidationsEnabled(pDocView->GetDoc())) { + return pWidgetAcc->ProcessValidate(0x01); + } + return XFA_EVENTERROR_Disabled; + case XFA_EVENT_InitCalculate: { + CXFA_Calculate calc = pWidgetAcc->GetCalculate(); + if (!calc) { + return XFA_EVENTERROR_NotExist; + } + if (pWidgetAcc->GetNode()->HasFlag(XFA_NODEFLAG_UserInteractive)) { + return XFA_EVENTERROR_Disabled; + } + CXFA_Script script = calc.GetScript(); + return pWidgetAcc->ExecuteScript(script, pParam); + } + default: + break; + } + FX_INT32 iRet = pWidgetAcc->ProcessEvent(gs_EventActivity[pParam->m_eType], pParam); + return iRet; +} +FX_INT32 CXFA_FFDocView::ExecEventActivityByDeepFirst(CXFA_Node* pFormNode, XFA_EVENTTYPE eEventType, FX_BOOL bIsFormReady, FX_BOOL bRecursive, CXFA_Node* pExclude) +{ + FX_INT32 iRet = XFA_EVENTERROR_NotExist; + if (pFormNode == pExclude) { + return iRet; + } + XFA_ELEMENT elementType = pFormNode->GetClassID(); + if (elementType == XFA_ELEMENT_Field) { + if (eEventType == XFA_EVENT_IndexChange) { + return iRet; + } + CXFA_WidgetAcc* pWidgetAcc = (CXFA_WidgetAcc*)pFormNode->GetWidgetData(); + if (pWidgetAcc == NULL) { + return iRet; + } + CXFA_EventParam eParam; + eParam.m_eType = eEventType; + eParam.m_pTarget = pWidgetAcc; + eParam.m_bIsFormReady = bIsFormReady; + return XFA_ProcessEvent(this, pWidgetAcc, &eParam); + } + if (bRecursive) { + for(CXFA_Node* pNode = pFormNode->GetNodeItem(XFA_NODEITEM_FirstChild, XFA_OBJECTTYPE_ContainerNode); pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling, XFA_OBJECTTYPE_ContainerNode)) { + elementType = pNode->GetClassID(); + if (elementType != XFA_ELEMENT_Variables && elementType != XFA_ELEMENT_Draw) { + iRet |= ExecEventActivityByDeepFirst(pNode, eEventType, bIsFormReady, bRecursive, pExclude); + } + } + } + CXFA_WidgetAcc* pWidgetAcc = (CXFA_WidgetAcc*)pFormNode->GetWidgetData(); + if (pWidgetAcc == NULL) { + return iRet; + } + CXFA_EventParam eParam; + eParam.m_eType = eEventType; + eParam.m_pTarget = pWidgetAcc; + eParam.m_bIsFormReady = bIsFormReady; + iRet |= XFA_ProcessEvent(this, pWidgetAcc, &eParam); + return iRet; +} +CXFA_FFWidget* CXFA_FFDocView::GetWidgetByName(FX_WSTR wsName, CXFA_FFWidget* pRefWidget ) +{ + CXFA_WidgetAcc* pRefAcc = pRefWidget ? pRefWidget->GetDataAcc() : NULL; + if (CXFA_WidgetAcc* pAcc = GetWidgetAccByName(wsName, pRefAcc)) { + return pAcc->GetNextWidget(NULL); + } + return NULL; +} +CXFA_WidgetAcc* CXFA_FFDocView::GetWidgetAccByName(FX_WSTR wsName, CXFA_WidgetAcc* pRefWidgetAcc ) +{ + CFX_WideString wsExpression; + FX_DWORD dwStyle = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent; + IXFA_ScriptContext* pScriptContext = m_pDoc->GetXFADoc()->GetScriptContext(); + if (!pScriptContext) { + return NULL; + } + CXFA_Node* refNode = NULL; + if(pRefWidgetAcc != NULL) { + refNode = pRefWidgetAcc->GetNode(); + wsExpression = wsName; + } else { + wsExpression = L"$form." + wsName; + } + XFA_RESOLVENODE_RS resoveNodeRS; + FX_INT32 iRet = pScriptContext->ResolveObjects(refNode, wsExpression, resoveNodeRS, dwStyle); + if (iRet < 1) { + return NULL; + } + if (resoveNodeRS.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) { + CXFA_Object* pNode = resoveNodeRS.nodes[0]; + if(pNode->IsNode()) { + return (CXFA_WidgetAcc*)((CXFA_Node*)pNode)->GetWidgetData(); + } + } + return NULL; +} +void CXFA_FFDocView::OnPageEvent(IXFA_LayoutPage *pSender, XFA_PAGEEVENT eEvent, FX_INT32 iPageIndex) +{ + FX_BOOL bNofify = m_iStatus >= XFA_DOCVIEW_LAYOUTSTATUS_End; + if (eEvent == XFA_PAGEEVENT_PageRemoved) { + if (bNofify) { + m_pDoc->GetDocProvider()->PageViewEvent((CXFA_FFPageView*)pSender, XFA_PAGEVIEWEVENT_PostRemoved); + } + } else if (eEvent == XFA_PAGEEVENT_PageAdded) { + if (bNofify) { + m_pDoc->GetDocProvider()->PageViewEvent((CXFA_FFPageView*)pSender, XFA_PAGEVIEWEVENT_PostAdded); + ((CXFA_FFPageView*)pSender)->LoadPageView(); + } + } +} +void CXFA_FFDocView::LockUpdate() +{ + m_iLock++; +} +void CXFA_FFDocView::UnlockUpdate() +{ + m_iLock--; +} +FX_BOOL CXFA_FFDocView::IsUpdateLocked() +{ + return m_iLock; +} +void CXFA_FFDocView::ClearInvalidateList() +{ + FX_POSITION ps = m_mapPageInvalidate.GetStartPosition(); + while (ps) { + void* pPageView = NULL; + CFX_RectF* pRect = NULL; + m_mapPageInvalidate.GetNextAssoc(ps, pPageView, (void*&)pRect); + delete pRect; + } + m_mapPageInvalidate.RemoveAll(); +} +void CXFA_FFDocView::AddInvalidateRect(CXFA_FFWidget* pWidget, const CFX_RectF &rtInvalidate) +{ + AddInvalidateRect(pWidget->GetPageView(), rtInvalidate); +} +void CXFA_FFDocView::AddInvalidateRect(IXFA_PageView* pPageView, const CFX_RectF &rtInvalidate) +{ + CFX_RectF* pRect = (CFX_RectF*)m_mapPageInvalidate.GetValueAt(pPageView); + if (!pRect) { + pRect = FX_NEW CFX_RectF; + pRect->Set(rtInvalidate.left, rtInvalidate.top, rtInvalidate.width, rtInvalidate.height); + m_mapPageInvalidate.SetAt(pPageView, pRect); + } else { + pRect->Union(rtInvalidate); + } +} +void CXFA_FFDocView::RunInvalidate() +{ + FX_POSITION ps = m_mapPageInvalidate.GetStartPosition(); + while (ps) { + IXFA_PageView* pPageView = NULL; + CFX_RectF* pRect = NULL; + m_mapPageInvalidate.GetNextAssoc(ps, (void*&)pPageView, (void*&)pRect); + m_pDoc->GetDocProvider()->InvalidateRect(pPageView, *pRect); + delete pRect; + } + m_mapPageInvalidate.RemoveAll(); +} +FX_BOOL CXFA_FFDocView::RunLayout() +{ + LockUpdate(); + m_bInLayoutStatus = TRUE; + if (!m_pXFADocLayout->IncrementLayout() && m_pXFADocLayout->StartLayout() < 100) { + m_pXFADocLayout->DoLayout(); + UnlockUpdate(); + m_bInLayoutStatus = FALSE; + return TRUE; + } + m_bInLayoutStatus = FALSE; + UnlockUpdate(); + return FALSE; +} +void CXFA_FFDocView::RunSubformIndexChange() +{ + FX_INT32 iSubforms = m_IndexChangedSubforms.GetSize(); + for (FX_INT32 i = 0; i < iSubforms; i++) { + CXFA_Node* pSubformNode = (CXFA_Node*)m_IndexChangedSubforms[i]; + CXFA_WidgetAcc* pWidgetAcc = (CXFA_WidgetAcc*)pSubformNode->GetWidgetData(); + if (!pWidgetAcc) { + continue; + } + CXFA_EventParam eParam; + eParam.m_eType = XFA_EVENT_IndexChange; + eParam.m_pTarget = pWidgetAcc; + pWidgetAcc->ProcessEvent(XFA_ATTRIBUTEENUM_IndexChange, &eParam); + } + m_IndexChangedSubforms.RemoveAll(); +} +void CXFA_FFDocView::AddNewFormNode(CXFA_Node* pNode) +{ + m_NewAddedNodes.Add(pNode); + this->InitLayout(pNode); +} +void CXFA_FFDocView::AddIndexChangedSubform(CXFA_Node* pNode) +{ + FXSYS_assert(pNode->GetClassID() == XFA_ELEMENT_Subform ); + m_IndexChangedSubforms.Add(pNode); +} +void CXFA_FFDocView::RunDocClose() +{ + CXFA_Node* pRootItem = (CXFA_Node*)m_pDoc->GetXFADoc()->GetXFANode(XFA_HASHCODE_Form); + if (!pRootItem) { + return; + } + ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_DocClose); +} +void CXFA_FFDocView::DestroyDocView() +{ + ClearInvalidateList(); + m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_None; + m_iLock = 0; + m_ValidateAccs.RemoveAll(); + m_bindItems.RemoveAll(); + m_CalculateAccs.RemoveAll(); +} +FX_BOOL CXFA_FFDocView::IsStaticNotify() +{ + return m_pDoc->GetDocType() == XFA_DOCTYPE_Static; +} +void CXFA_FFDocView::AddCalculateWidgetAcc(CXFA_WidgetAcc* pWidgetAcc) +{ + FX_INT32 iAccs = m_CalculateAccs.GetSize(); + CXFA_WidgetAcc* pCurrentAcc = (iAccs < 1) ? (CXFA_WidgetAcc*)NULL : (CXFA_WidgetAcc*)m_CalculateAccs[iAccs - 1]; + if (pCurrentAcc != pWidgetAcc) { + m_CalculateAccs.Add(pWidgetAcc); + } +} +void CXFA_FFDocView::AddCalculateNodeNotify(CXFA_Node* pNodeChange) +{ + CXFA_CalcData* pGlobalData = (CXFA_CalcData*)pNodeChange->GetUserData(XFA_CalcData); + FX_INT32 iCount = pGlobalData ? pGlobalData->m_Globals.GetSize() : 0; + for (FX_INT32 i = 0; i < iCount; i++) { + CXFA_WidgetAcc* pResultAcc = (CXFA_WidgetAcc*)pGlobalData->m_Globals[i]; + if (pResultAcc->GetNode()->HasFlag(XFA_NODEFLAG_HasRemoved)) { + continue; + } + FX_INT32 iAccs = m_CalculateAccs.GetSize(); + CXFA_WidgetAcc* pCurrentAcc = (iAccs < 1) ? (CXFA_WidgetAcc*)NULL : (CXFA_WidgetAcc*)m_CalculateAccs[iAccs - 1]; + if (pCurrentAcc != pResultAcc) { + m_CalculateAccs.Add(pResultAcc); + } + } +} +void CXFA_FFDocView::RunCalculateRecursive(FX_INT32& iIndex) +{ + while (iIndex < m_CalculateAccs.GetSize()) { + CXFA_WidgetAcc* pCurAcc = (CXFA_WidgetAcc*)m_CalculateAccs[iIndex]; + AddCalculateNodeNotify(pCurAcc->GetNode()); + FX_INT32 iRefCount = (FX_INT32)(FX_UINTPTR)pCurAcc->GetNode()->GetUserData(XFA_CalcRefCount); + iRefCount++; + pCurAcc->GetNode()->SetUserData(XFA_CalcRefCount, (FX_LPVOID)(FX_UINTPTR)iRefCount); + if (iRefCount > 11) { + break; + } + if ((pCurAcc->ProcessCalculate()) == XFA_EVENTERROR_Sucess) { + AddValidateWidget(pCurAcc); + } + iIndex++; + RunCalculateRecursive(iIndex); + } +} +FX_INT32 CXFA_FFDocView::RunCalculateWidgets() +{ + if (!m_pDoc->GetDocProvider()->IsCalculationsEnabled((XFA_HDOC)m_pDoc)) { + return XFA_EVENTERROR_Disabled; + } + FX_INT32 iCounts = m_CalculateAccs.GetSize(); + FX_INT32 iIndex = 0; + if (iCounts > 0) { + RunCalculateRecursive(iIndex); + } + for (FX_INT32 i = 0; i < m_CalculateAccs.GetSize(); i++) { + CXFA_WidgetAcc* pCurAcc = (CXFA_WidgetAcc*)m_CalculateAccs[i]; + pCurAcc->GetNode()->SetUserData(XFA_CalcRefCount, (FX_LPVOID)(FX_UINTPTR)0); + } + m_CalculateAccs.RemoveAll(); + return XFA_EVENTERROR_Sucess; +} +void CXFA_FFDocView::AddValidateWidget(CXFA_WidgetAcc* pWidget) +{ + if (m_ValidateAccs.Find(pWidget) < 0) { + m_ValidateAccs.Add(pWidget); + } +} +FX_BOOL CXFA_FFDocView::InitCalculate(CXFA_Node* pNode) +{ + ExecEventActivityByDeepFirst(pNode, XFA_EVENT_InitCalculate); + return TRUE; +} +FX_BOOL CXFA_FFDocView::InitValidate(CXFA_Node* pNode) +{ + if (!m_pDoc->GetDocProvider()->IsValidationsEnabled((XFA_HDOC)m_pDoc)) { + return FALSE; + } + ExecEventActivityByDeepFirst(pNode, XFA_EVENT_Validate); + m_ValidateAccs.RemoveAll(); + return TRUE; +} +FX_BOOL CXFA_FFDocView::RunValidate() +{ + if (!m_pDoc->GetDocProvider()->IsValidationsEnabled((XFA_HDOC)m_pDoc)) { + return FALSE; + } + FX_INT32 iCounts = m_ValidateAccs.GetSize(); + for (FX_INT32 i = 0; i < iCounts; i++) { + CXFA_WidgetAcc* pAcc = (CXFA_WidgetAcc*)m_ValidateAccs[i]; + if (pAcc->GetNode()->HasFlag(XFA_NODEFLAG_HasRemoved)) { + continue; + } + pAcc->ProcessValidate(); + } + m_ValidateAccs.RemoveAll(); + return TRUE; +} +FX_BOOL CXFA_FFDocView::RunEventLayoutReady() +{ + CXFA_Node* pRootItem = (CXFA_Node*)m_pDoc->GetXFADoc()->GetXFANode(XFA_HASHCODE_Form); + if (!pRootItem) { + return FALSE; + } + ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready); + RunLayout(); + return TRUE; +} +void CXFA_FFDocView::RunBindItems() +{ + FX_INT32 iCount = m_bindItems.GetSize(); + for (FX_INT32 i = 0; i < iCount; i++) { + if (((CXFA_Node*)m_bindItems[i])->HasFlag(XFA_NODEFLAG_HasRemoved)) { + continue; + } + CXFA_Node* pWidgetNode = ((CXFA_Node*)m_bindItems[i])->GetNodeItem(XFA_NODEITEM_Parent); + CXFA_WidgetAcc* pAcc = (CXFA_WidgetAcc*)pWidgetNode->GetWidgetData(); + if (!pAcc) { + continue; + } + CXFA_BindItems binditems((CXFA_Node*)m_bindItems[i]); + IXFA_ScriptContext* pScriptContext = pWidgetNode->GetDocument()->GetScriptContext(); + CFX_WideStringC wsRef; + binditems.GetRef(wsRef); + FX_DWORD dwStyle = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_ALL; + XFA_RESOLVENODE_RS rs; + pScriptContext->ResolveObjects(pWidgetNode, wsRef, rs, dwStyle); + FX_INT32 iCount = rs.nodes.GetSize(); + pAcc->DeleteItem(-1); + if (rs.dwFlags != XFA_RESOVENODE_RSTYPE_Nodes || iCount < 1) { + continue; + } + CFX_WideStringC wsValueRef, wsLabelRef; + binditems.GetValueRef(wsValueRef); + binditems.GetLabelRef(wsLabelRef); + FX_BOOL bUseValue = wsLabelRef.IsEmpty() || wsLabelRef == wsValueRef; + FX_BOOL bLabelUseContent = wsLabelRef.IsEmpty() || wsLabelRef == FX_WSTRC(L"$"); + FX_BOOL bValueUseContent = wsValueRef.IsEmpty() || wsValueRef == FX_WSTRC(L"$"); + CFX_WideString wsValue, wsLabel; + FX_DWORD uValueHash = FX_HashCode_String_GetW(CFX_WideString(wsValueRef), wsValueRef.GetLength()); + FX_DWORD uLableHash = FX_HashCode_String_GetW(CFX_WideString(wsLabelRef), wsLabelRef.GetLength()); + for (FX_INT32 i = 0; i < iCount; i++) { + CXFA_Object* refObj = rs.nodes[i]; + if(!refObj->IsNode()) { + continue; + } + CXFA_Node* refNode = (CXFA_Node*)refObj; + if (bValueUseContent) { + wsValue = refNode->GetContent(); + } else { + CXFA_Node* nodeValue = refNode->GetFirstChildByName(uValueHash); + if (nodeValue == NULL) { + wsValue = refNode->GetContent(); + } else { + wsValue = nodeValue->GetContent(); + } + } + if (!bUseValue) { + if (bLabelUseContent) { + wsLabel = refNode->GetContent(); + } else { + CXFA_Node* nodeLabel = refNode->GetFirstChildByName(wsLabelRef); + if (nodeLabel != NULL) { + wsLabel = nodeLabel->GetContent(); + } + } + } else { + wsLabel = wsValue; + } + pAcc->InsertItem(wsLabel, wsValue); + } + } + m_bindItems.RemoveAll(); +} +void CXFA_FFDocView::SetChangeMark() +{ + if (m_iStatus < XFA_DOCVIEW_LAYOUTSTATUS_End) { + return; + } + m_pDoc->GetDocProvider()->SetChangeMark((XFA_HDOC)m_pDoc); +} +CXFA_Node* CXFA_FFDocView::GetRootSubform() +{ + CXFA_Node* pFormPacketNode = (CXFA_Node*)m_pDoc->GetXFADoc()->GetXFANode(XFA_HASHCODE_Form); + if (!pFormPacketNode) { + return NULL; + } + return pFormPacketNode->GetFirstChildByClass(XFA_ELEMENT_Subform); +} +CXFA_FFDocWidgetIterator::CXFA_FFDocWidgetIterator(CXFA_FFDocView* pDocView, CXFA_Node* pTravelRoot) + : m_ContentIterator(pTravelRoot) +{ + m_pDocView = pDocView; + m_pCurWidget = NULL; +} +CXFA_FFDocWidgetIterator::~CXFA_FFDocWidgetIterator() +{ +} +void CXFA_FFDocWidgetIterator::Reset() +{ + m_ContentIterator.Reset(); + m_pCurWidget = NULL; +} +XFA_HWIDGET CXFA_FFDocWidgetIterator::MoveToFirst() +{ + return NULL; +} +XFA_HWIDGET CXFA_FFDocWidgetIterator::MoveToLast() +{ + return NULL; +} +XFA_HWIDGET CXFA_FFDocWidgetIterator::MoveToNext() +{ + CXFA_Node* pItem = m_pCurWidget ? m_ContentIterator.MoveToNext() : m_ContentIterator.GetCurrent(); + while (pItem) { + if (CXFA_WidgetAcc* pAcc = (CXFA_WidgetAcc*)pItem->GetWidgetData()) { + while ((m_pCurWidget = pAcc->GetNextWidget(NULL)) != NULL) { + if (!m_pCurWidget->IsLoaded() && (m_pCurWidget->GetStatus() & XFA_WIDGETSTATUS_Visible)) { + m_pCurWidget->LoadWidget(); + } + return (XFA_HWIDGET)m_pCurWidget; + } + } + pItem = m_ContentIterator.MoveToNext(); + } + return NULL; +} +XFA_HWIDGET CXFA_FFDocWidgetIterator::MoveToPrevious() +{ + return NULL; +} +XFA_HWIDGET CXFA_FFDocWidgetIterator::GetCurrentWidget() +{ + return NULL; +} +FX_BOOL CXFA_FFDocWidgetIterator::SetCurrentWidget(XFA_HWIDGET hWidget) +{ + return FALSE; +} +IXFA_WidgetAccIterator* XFA_WidgetAccIterator_Create(CXFA_WidgetAcc* pTravelRoot, XFA_WIDGETORDER eOrder) +{ + if (!pTravelRoot) { + return NULL; + } + return FX_NEW CXFA_WidgetAccIterator(pTravelRoot->GetDocView(), pTravelRoot->GetNode()); +} +CXFA_WidgetAccIterator::CXFA_WidgetAccIterator(CXFA_FFDocView* pDocView, CXFA_Node* pTravelRoot) + : m_ContentIterator(pTravelRoot) +{ + m_pDocView = pDocView; + m_pCurWidgetAcc = NULL; +} +CXFA_WidgetAccIterator::~CXFA_WidgetAccIterator() +{ +} +void CXFA_WidgetAccIterator::Reset() +{ + m_pCurWidgetAcc = NULL; + m_ContentIterator.Reset(); +} +CXFA_WidgetAcc* CXFA_WidgetAccIterator::MoveToFirst() +{ + return NULL; +} +CXFA_WidgetAcc* CXFA_WidgetAccIterator::MoveToLast() +{ + return NULL; +} +CXFA_WidgetAcc* CXFA_WidgetAccIterator::MoveToNext() +{ + CXFA_Node* pItem = m_pCurWidgetAcc ? m_ContentIterator.MoveToNext() : m_ContentIterator.GetCurrent(); + while (pItem) { + if ((m_pCurWidgetAcc = (CXFA_WidgetAcc*)pItem->GetWidgetData()) != NULL) { + return m_pCurWidgetAcc; + } + pItem = m_ContentIterator.MoveToNext(); + } + return NULL; +} +CXFA_WidgetAcc* CXFA_WidgetAccIterator::MoveToPrevious() +{ + return NULL; +} +CXFA_WidgetAcc* CXFA_WidgetAccIterator::GetCurrentWidgetAcc() +{ + return NULL; +} +FX_BOOL CXFA_WidgetAccIterator::SetCurrentWidgetAcc(CXFA_WidgetAcc* hWidget) +{ + return FALSE; +} +void CXFA_WidgetAccIterator::SkipTree() +{ + m_ContentIterator.SkipChildrenAndMoveToNext(); + m_pCurWidgetAcc = NULL; +} diff --git a/xfa/src/fxfa/src/app/xfa_ffdocview.h b/xfa/src/fxfa/src/app/xfa_ffdocview.h new file mode 100644 index 0000000000..1e73499032 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffdocview.h @@ -0,0 +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 + +#ifndef _FXFA_FORMFILLER_DOCVIEW_IMP_H +#define _FXFA_FORMFILLER_DOCVIEW_IMP_H +class CXFA_FFPageView; +class CXFA_FFWidgetHandler; +class CXFA_FFDoc; +class CXFA_FFWidget; +extern const XFA_ATTRIBUTEENUM gs_EventActivity[]; +enum XFA_DOCVIEW_LAYOUTSTATUS { + XFA_DOCVIEW_LAYOUTSTATUS_None, + XFA_DOCVIEW_LAYOUTSTATUS_Start, + XFA_DOCVIEW_LAYOUTSTATUS_FormInitialize, + XFA_DOCVIEW_LAYOUTSTATUS_FormInitCalculate, + XFA_DOCVIEW_LAYOUTSTATUS_FormInitValidate, + XFA_DOCVIEW_LAYOUTSTATUS_FormFormReady, + XFA_DOCVIEW_LAYOUTSTATUS_Doing, + XFA_DOCVIEW_LAYOUTSTATUS_PagesetInitialize, + XFA_DOCVIEW_LAYOUTSTATUS_PagesetInitCalculate, + XFA_DOCVIEW_LAYOUTSTATUS_PagesetInitValidate, + XFA_DOCVIEW_LAYOUTSTATUS_PagesetFormReady, + XFA_DOCVIEW_LAYOUTSTATUS_LayoutReady, + XFA_DOCVIEW_LAYOUTSTATUS_DocReady, + XFA_DOCVIEW_LAYOUTSTATUS_End, + XFA_DOCVIEW_LAYOUTSTATUS_Next, +}; +class CXFA_FFDocView : public IXFA_DocView, public CFX_Object +{ +public: + CXFA_FFDocView(CXFA_FFDoc* pDoc); + ~CXFA_FFDocView(); + virtual XFA_HDOC GetDoc() + { + return (XFA_HDOC)m_pDoc; + } + virtual FX_INT32 StartLayout(FX_INT32 iStartPage = 0); + virtual FX_INT32 DoLayout(IFX_Pause *pPause = NULL); + virtual void StopLayout(); + virtual FX_INT32 GetLayoutStatus(); + virtual void UpdateDocView(); + virtual FX_INT32 CountPageViews(); + virtual IXFA_PageView* GetPageView(FX_INT32 nIndex); + virtual XFA_HWIDGET GetWidgetByName(FX_WSTR wsName); + virtual CXFA_WidgetAcc* GetWidgetAccByName(FX_WSTR wsName); + virtual void ResetWidgetData(CXFA_WidgetAcc* pWidgetAcc = NULL); + virtual FX_INT32 ProcessWidgetEvent(CXFA_EventParam* pParam, CXFA_WidgetAcc* pWidgetAcc = NULL); + virtual IXFA_WidgetHandler* GetWidgetHandler(); + virtual IXFA_WidgetIterator* CreateWidgetIterator(); + virtual IXFA_WidgetAccIterator* CreateWidgetAccIterator(XFA_WIDGETORDER eOrder = XFA_WIDGETORDER_PreOrder); + virtual XFA_HWIDGET GetFocusWidget(); + virtual void KillFocus(); + virtual FX_BOOL SetFocus(XFA_HWIDGET hWidget); + CXFA_FFWidget* GetWidgetByName(FX_WSTR wsName, CXFA_FFWidget* pRefWidget = NULL); + CXFA_WidgetAcc* GetWidgetAccByName(FX_WSTR wsName, CXFA_WidgetAcc* pRefWidgetAcc = NULL); + IXFA_DocLayout* GetXFALayout() const; + void OnPageEvent(IXFA_LayoutPage *pSender, XFA_PAGEEVENT eEvent, FX_INT32 iPageIndex); + void LockUpdate(); + void UnlockUpdate(); + FX_BOOL IsUpdateLocked(); + void ClearInvalidateList(); + void AddInvalidateRect(CXFA_FFWidget* pWidget, const CFX_RectF &rtInvalidate); + void AddInvalidateRect(IXFA_PageView* pPageView, const CFX_RectF &rtInvalidate); + void RunInvalidate(); + void RunDocClose(); + void DestroyDocView(); + + FX_BOOL InitValidate(CXFA_Node* pNode); + FX_BOOL RunValidate(); + + void SetChangeMark(); + + void AddValidateWidget(CXFA_WidgetAcc* pWidget); + void AddCalculateNodeNotify(CXFA_Node* pNodeChange); + void AddCalculateWidgetAcc(CXFA_WidgetAcc* pWidgetAcc); + FX_INT32 RunCalculateWidgets(); + FX_BOOL IsStaticNotify(); + FX_BOOL RunLayout(); + void RunSubformIndexChange(); + void AddNewFormNode(CXFA_Node* pNode); + void AddIndexChangedSubform(CXFA_Node* pNode); + CXFA_WidgetAcc* GetFocusWidgetAcc(); + void SetFocusWidgetAcc(CXFA_WidgetAcc* pWidgetAcc); + void DeleteLayoutItem(CXFA_FFWidget* pWidget); + FX_INT32 ExecEventActivityByDeepFirst(CXFA_Node* pFormNode, XFA_EVENTTYPE eEventType, FX_BOOL bIsFormReady = FALSE, FX_BOOL bRecursive = TRUE, CXFA_Node* pExclude = NULL); + FX_BOOL m_bLayoutEvent; + CFX_WideStringArray m_arrNullTestMsg; + CXFA_FFWidget* m_pListFocusWidget; + FX_BOOL m_bInLayoutStatus; +protected: + FX_BOOL RunEventLayoutReady(); + void RunBindItems(); + FX_BOOL InitCalculate(CXFA_Node* pNode); + void InitLayout(CXFA_Node* pNode); + void RunCalculateRecursive(FX_INT32& iIndex); + void ShowNullTestMsg(); + FX_BOOL ResetSingleWidgetAccData(CXFA_WidgetAcc* pWidgetAcc); + CXFA_Node* GetRootSubform(); + CXFA_FFDoc* m_pDoc; + CXFA_FFWidgetHandler* m_pWidgetHandler; + IXFA_DocLayout* m_pXFADocLayout; + CXFA_WidgetAcc* m_pFocusAcc; + CXFA_FFWidget* m_pFocusWidget; + CXFA_FFWidget* m_pOldFocusWidget; + CFX_MapPtrToPtr m_mapPageInvalidate; + CFX_PtrArray m_ValidateAccs; + CFX_PtrArray m_bindItems; + CFX_PtrArray m_CalculateAccs; + + CFX_PtrArray m_NewAddedNodes; + CFX_PtrArray m_IndexChangedSubforms; + XFA_DOCVIEW_LAYOUTSTATUS m_iStatus; + FX_INT32 m_iLock; + friend class CXFA_FFNotify; +}; +class CXFA_FFDocWidgetIterator : public IXFA_WidgetIterator, public CFX_Object +{ +public: + CXFA_FFDocWidgetIterator(CXFA_FFDocView* pDocView, CXFA_Node* pTravelRoot); + ~CXFA_FFDocWidgetIterator(); + + virtual void Release() + { + delete this; + } + + virtual void Reset(); + virtual XFA_HWIDGET MoveToFirst(); + virtual XFA_HWIDGET MoveToLast(); + virtual XFA_HWIDGET MoveToNext(); + virtual XFA_HWIDGET MoveToPrevious(); + virtual XFA_HWIDGET GetCurrentWidget(); + virtual FX_BOOL SetCurrentWidget(XFA_HWIDGET hWidget); +protected: + CXFA_ContainerIterator m_ContentIterator; + CXFA_FFDocView* m_pDocView; + CXFA_FFWidget* m_pCurWidget; +}; +class CXFA_WidgetAccIterator : public IXFA_WidgetAccIterator, public CFX_Object +{ +public: + CXFA_WidgetAccIterator(CXFA_FFDocView* pDocView, CXFA_Node* pTravelRoot); + ~CXFA_WidgetAccIterator(); + virtual void Release() + { + delete this; + } + virtual void Reset(); + virtual CXFA_WidgetAcc* MoveToFirst(); + virtual CXFA_WidgetAcc* MoveToLast(); + virtual CXFA_WidgetAcc* MoveToNext(); + virtual CXFA_WidgetAcc* MoveToPrevious(); + virtual CXFA_WidgetAcc* GetCurrentWidgetAcc(); + virtual FX_BOOL SetCurrentWidgetAcc(CXFA_WidgetAcc* hWidget); + virtual void SkipTree(); +protected: + CXFA_ContainerIterator m_ContentIterator; + CXFA_FFDocView* m_pDocView; + CXFA_WidgetAcc* m_pCurWidgetAcc; +}; +#endif diff --git a/xfa/src/fxfa/src/app/xfa_ffdraw.cpp b/xfa/src/fxfa/src/app/xfa_ffdraw.cpp new file mode 100644 index 0000000000..a681c14516 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffdraw.cpp @@ -0,0 +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 + +#include "../../../foxitlib.h" +#include "../common/xfa_common.h" +#include "xfa_ffwidget.h" +#include "xfa_ffdraw.h" +#include "xfa_ffpageview.h" +#include "xfa_ffapp.h" +#include "xfa_ffdoc.h" +CXFA_FFDraw::CXFA_FFDraw(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc) + : CXFA_FFWidget(pPageView, pDataAcc) +{ +} +CXFA_FFDraw::~CXFA_FFDraw() +{ +} diff --git a/xfa/src/fxfa/src/app/xfa_ffdraw.h b/xfa/src/fxfa/src/app/xfa_ffdraw.h new file mode 100644 index 0000000000..28b41083ed --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffdraw.h @@ -0,0 +1,16 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FXFA_FORMFILLER_DRAW_IMP_H +#define _FXFA_FORMFILLER_DRAW_IMP_H +class CXFA_FFDraw : public CXFA_FFWidget +{ +public: + CXFA_FFDraw(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc); + virtual ~CXFA_FFDraw(); +protected: +}; +#endif diff --git a/xfa/src/fxfa/src/app/xfa_ffexclgroup.cpp b/xfa/src/fxfa/src/app/xfa_ffexclgroup.cpp new file mode 100644 index 0000000000..75d5f7e5c4 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffexclgroup.cpp @@ -0,0 +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 + +#include "../../../foxitlib.h" +#include "../common/xfa_common.h" +#include "xfa_ffwidget.h" +#include "xfa_ffexclgroup.h" +#include "xfa_ffpageview.h" +#include "xfa_ffapp.h" +#include "xfa_ffdoc.h" +CXFA_FFExclGroup::CXFA_FFExclGroup(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc) + : CXFA_FFWidget(pPageView, pDataAcc) +{ +} +CXFA_FFExclGroup::~CXFA_FFExclGroup() +{ +} +void CXFA_FFExclGroup::RenderWidget(CFX_Graphics* pGS, CFX_Matrix* pMatrix , FX_DWORD dwStatus , FX_INT32 iRotate ) +{ + if (!IsMatchVisibleStatus(dwStatus)) { + return; + } + CFX_Matrix mtRotate; + GetRotateMatrix(mtRotate); + if (pMatrix) { + mtRotate.Concat(*pMatrix); + } + CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus); +} diff --git a/xfa/src/fxfa/src/app/xfa_ffexclgroup.h b/xfa/src/fxfa/src/app/xfa_ffexclgroup.h new file mode 100644 index 0000000000..bc8acd6789 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffexclgroup.h @@ -0,0 +1,18 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FXFA_FORMFILLER_EXCLGROUP_IMP_H +#define _FXFA_FORMFILLER_EXCLGROUP_IMP_H +class CXFA_FFExclGroup : public CXFA_FFWidget +{ +public: + CXFA_FFExclGroup(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc); + virtual ~CXFA_FFExclGroup(); + + virtual void RenderWidget(CFX_Graphics* pGS, CFX_Matrix* pMatrix = NULL, FX_DWORD dwStatus = 0, FX_INT32 iRotate = 0); +protected: +}; +#endif diff --git a/xfa/src/fxfa/src/app/xfa_fffield.cpp b/xfa/src/fxfa/src/app/xfa_fffield.cpp new file mode 100644 index 0000000000..5f32db5bb3 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_fffield.cpp @@ -0,0 +1,874 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_common.h" +#include "xfa_ffwidget.h" +#include "xfa_fffield.h" +#include "xfa_ffpageview.h" +#include "xfa_ffapp.h" +#include "xfa_ffdoc.h" +#include "xfa_fwltheme.h" +#include "xfa_textlayout.h" +#include "xfa_ffdocview.h" +CXFA_FFField::CXFA_FFField(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc) + : CXFA_FFWidget(pPageView, pDataAcc) + , m_pNormalWidget(NULL) +{ + m_rtUI.Set(0, 0, 0, 0); + m_rtCaption.Set(0, 0, 0, 0); +} +CXFA_FFField::~CXFA_FFField() +{ + CXFA_FFField::UnloadWidget(); +} +FX_BOOL CXFA_FFField::GetBBox(CFX_RectF &rtBox, FX_DWORD dwStatus, FX_BOOL bDrawFocus) +{ + if (bDrawFocus) { + XFA_ELEMENT type = (XFA_ELEMENT)m_pDataAcc->GetUIType(); + if (type == XFA_ELEMENT_Button || type == XFA_ELEMENT_CheckButton || type == XFA_ELEMENT_ImageEdit + || type == XFA_ELEMENT_Signature || type == XFA_ELEMENT_ChoiceList) { + rtBox = m_rtUI; + CFX_Matrix mt; + GetRotateMatrix(mt); + mt.TransformRect(rtBox); + return TRUE; + } + return FALSE; + } +#ifndef _XFA_EMB + return CXFA_FFWidget::GetBBox(rtBox, dwStatus); +#endif + GetRectWithoutRotate(rtBox); + if (m_pNormalWidget) { + CFX_RectF rtWidget; + m_pNormalWidget->GetWidgetRect(rtWidget); + rtBox.Union(rtWidget); + } + CFX_Matrix mt; + GetRotateMatrix(mt); + mt.TransformRect(rtBox); + return TRUE; +} +void CXFA_FFField::RenderWidget(CFX_Graphics* pGS, CFX_Matrix* pMatrix , FX_DWORD dwStatus , FX_INT32 iRotate ) +{ + if (!IsMatchVisibleStatus(dwStatus)) { + return; + } + CFX_Matrix mtRotate; + GetRotateMatrix(mtRotate); + if (pMatrix) { + mtRotate.Concat(*pMatrix); + } + CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus); + CXFA_Border borderUI = m_pDataAcc->GetUIBorder(); + DrawBorder(pGS, borderUI, m_rtUI, &mtRotate); + RenderCaption(pGS, &mtRotate); + DrawHighlight(pGS, &mtRotate, dwStatus, FALSE); + CFX_RectF rtWidget; + m_pNormalWidget->GetWidgetRect(rtWidget); + CFX_Matrix mt; + mt.Set(1, 0, 0, 1, rtWidget.left, rtWidget.top); + mt.Concat(mtRotate); + GetApp()->GetWidgetMgrDelegate()->OnDrawWidget(m_pNormalWidget->GetWidget(), pGS, &mt); +} +void CXFA_FFField::DrawHighlight(CFX_Graphics* pGS, CFX_Matrix* pMatrix, FX_DWORD dwStatus, FX_BOOL bEllipse) +{ + if (m_rtUI.IsEmpty() || !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) { + return; + } + if ((dwStatus & XFA_WIDGETSTATUS_Highlight) && m_pDataAcc->GetAccess() == XFA_ATTRIBUTEENUM_Open) { + CXFA_FFDoc* pDoc = GetDoc(); + CFX_Color crHighlight(pDoc->GetDocProvider()->GetHighlightColor((XFA_HDOC)pDoc)); + pGS->SetFillColor(&crHighlight); + CFX_Path path; + path.Create(); + if (bEllipse) { + path.AddEllipse(m_rtUI); + } else { + path.AddRectangle(m_rtUI.left, m_rtUI.top, m_rtUI.width, m_rtUI.height); + } + pGS->FillPath(&path, FXFILL_WINDING, pMatrix); + } +} +void CXFA_FFField::DrawFocus(CFX_Graphics* pGS, CFX_Matrix* pMatrix) +{ + if (m_dwStatus & XFA_WIDGETSTATUS_Focused) { + CFX_Color cr(0xFF000000); + pGS->SetStrokeColor(&cr); + FX_FLOAT DashPattern[2] = {1, 1}; + pGS->SetLineDash(0.0f, DashPattern, 2); + pGS->SetLineWidth(0, FALSE); + CFX_Path path; + path.Create(); + path.AddRectangle(m_rtUI.left, m_rtUI.top, m_rtUI.width, m_rtUI.height); + pGS->StrokePath(&path, pMatrix); + } +} +void CXFA_FFField::SetFWLThemeProvider() +{ + if (m_pNormalWidget) { + m_pNormalWidget->m_pImp->SetThemeProvider(GetApp()->GetFWLTheme()); + } +} +FX_BOOL CXFA_FFField::IsLoaded() +{ + return m_pNormalWidget != NULL && CXFA_FFWidget::IsLoaded(); +} +FX_BOOL CXFA_FFField::LoadWidget() +{ + SetFWLThemeProvider(); + m_pDataAcc->LoadCaption(); + LayoutWidget(); + return TRUE; +} +void CXFA_FFField::UnloadWidget() +{ + if (m_pNormalWidget) { + m_pNormalWidget->Release(); + m_pNormalWidget = NULL; + } +} +void CXFA_FFField::SetEditScrollOffset() +{ + XFA_ELEMENT eType = m_pDataAcc->GetUIType(); + if (eType == XFA_ELEMENT_TextEdit || eType == XFA_ELEMENT_NumericEdit || eType == XFA_ELEMENT_PasswordEdit) { + FX_FLOAT fScrollOffset = 0; + CXFA_FFField* pPrev = (CXFA_FFField*)GetLayoutItem()->GetPrev(); + if (pPrev) { + CFX_RectF rtMargin; + m_pDataAcc->GetUIMargin(rtMargin); + fScrollOffset = -rtMargin.top; + } + while(pPrev) { + fScrollOffset += pPrev->m_rtUI.height; + pPrev = (CXFA_FFField*)pPrev->GetLayoutItem()->GetPrev(); + } + ((CFWL_Edit*)m_pNormalWidget)->SetScrollOffset(fScrollOffset); + } +} +FX_BOOL CXFA_FFField::LayoutWidget() +{ + CXFA_FFWidget::LayoutWidget(); + CapPlacement(); + LayoutCaption(); + SetFWLRect(); + SetEditScrollOffset(); + if (m_pNormalWidget) { + m_pNormalWidget->Update(); + } + return TRUE; +} +void CXFA_FFField::CapPlacement() +{ + CFX_RectF rtWidget; + GetRectWithoutRotate(rtWidget); + CXFA_Margin mgWidget = m_pDataAcc->GetMargin(); + if (mgWidget) { + CXFA_LayoutItem* pItem = this->GetLayoutItem(); + if (!pItem) { + return; + } + FX_FLOAT fLeftInset = 0, fRightInset = 0, fTopInset = 0, fBottomInset = 0; + mgWidget.GetLeftInset(fLeftInset); + mgWidget.GetRightInset(fRightInset); + mgWidget.GetTopInset(fTopInset); + mgWidget.GetBottomInset(fBottomInset); + if (pItem->GetPrev() == NULL && pItem->GetNext() == NULL) { + rtWidget.Deflate(fLeftInset, fTopInset, fRightInset, fBottomInset); + } else { + if (pItem->GetPrev() == NULL) { + rtWidget.Deflate(fLeftInset, fTopInset, fRightInset, 0); + } else if (pItem->GetNext() == NULL) { + rtWidget.Deflate(fLeftInset, 0, fRightInset, fBottomInset); + } else { + rtWidget.Deflate(fLeftInset, 0, fRightInset, 0); + } + } + } + XFA_ATTRIBUTEENUM iCapPlacement = XFA_ATTRIBUTEENUM_Unknown; + FX_FLOAT fCapReserve = 0; + CXFA_Caption caption = m_pDataAcc->GetCaption(); + if (caption.IsExistInXML() && caption.GetPresence() != XFA_ATTRIBUTEENUM_Hidden) { + iCapPlacement = (XFA_ATTRIBUTEENUM)caption.GetPlacementType(); + if (iCapPlacement == XFA_ATTRIBUTEENUM_Top && (GetLayoutItem()->GetPrev())) { + m_rtCaption.Set(0, 0, 0, 0); + } else if (iCapPlacement == XFA_ATTRIBUTEENUM_Bottom && (GetLayoutItem()->GetNext())) { + m_rtCaption.Set(0, 0, 0, 0); + } else { + fCapReserve = caption.GetReserve(); + CXFA_LayoutItem* pItem = this->GetLayoutItem(); + if (pItem->GetPrev() == NULL && pItem->GetNext() == NULL) { + m_rtCaption.Set(rtWidget.left, rtWidget.top, rtWidget.width, rtWidget.height); + } else { + pItem = pItem->GetFirst(); + pItem->GetRect(m_rtCaption); + pItem = pItem->GetNext(); + while (pItem) { + CFX_RectF rtRect; + pItem->GetRect(rtRect); + m_rtCaption.height += rtRect.Height(); + pItem = pItem->GetNext(); + } + XFA_RectWidthoutMargin(m_rtCaption, mgWidget); + } + CXFA_TextLayout* pCapTextLayout = m_pDataAcc->GetCaptionTextLayout(); + if (fCapReserve <= 0 && pCapTextLayout) { + CFX_SizeF size; + size.Set(0, 0); + CFX_SizeF minSize; + minSize.Set(0, 0); + CFX_SizeF maxSize; + maxSize.Set(0, 0); + pCapTextLayout->CalcSize(minSize, maxSize, size); + if (iCapPlacement == XFA_ATTRIBUTEENUM_Top || iCapPlacement == XFA_ATTRIBUTEENUM_Bottom) { + fCapReserve = size.y; + } else { + fCapReserve = size.x; + } + } + } + } + m_rtUI = rtWidget; + switch(iCapPlacement) { + case XFA_ATTRIBUTEENUM_Left: { + m_rtCaption.width = fCapReserve; + CapLeftRightPlacement(caption, rtWidget, iCapPlacement); + m_rtUI.width -= fCapReserve; + m_rtUI.left += fCapReserve; + } + break; + case XFA_ATTRIBUTEENUM_Top: { + m_rtCaption.height = fCapReserve; + CapTopBottomPlacement(caption, rtWidget, iCapPlacement); + m_rtUI.top += fCapReserve; + m_rtUI.height -= fCapReserve; + } + break; + case XFA_ATTRIBUTEENUM_Right: { + m_rtCaption.left = m_rtCaption.right() - fCapReserve; + m_rtCaption.width = fCapReserve; + CapLeftRightPlacement(caption, rtWidget, iCapPlacement); + m_rtUI.width -= fCapReserve; + } + break; + case XFA_ATTRIBUTEENUM_Bottom: { + m_rtCaption.top = m_rtCaption.bottom() - fCapReserve; + m_rtCaption.height = fCapReserve; + CapTopBottomPlacement(caption, rtWidget, iCapPlacement); + m_rtUI.height -= fCapReserve; + } + break; + case XFA_ATTRIBUTEENUM_Inline: + break; + default: + break; + } + CXFA_Border borderUI = m_pDataAcc->GetUIBorder(); + if (borderUI) { + CXFA_Margin margin = borderUI.GetMargin(); + if (margin.IsExistInXML()) { + XFA_RectWidthoutMargin(m_rtUI, margin); + } + } + m_rtUI.Normalize(); +} +void CXFA_FFField::CapTopBottomPlacement(CXFA_Caption caption, const CFX_RectF &rtWidget, FX_INT32 iCapPlacement) +{ + CFX_RectF rtUIMargin; + m_pDataAcc->GetUIMargin(rtUIMargin); + m_rtCaption.left += rtUIMargin.left; + if (CXFA_Margin mgCap = caption.GetMargin()) { + XFA_RectWidthoutMargin(m_rtCaption, mgCap); + if (m_rtCaption.height < 0) { + m_rtCaption.top += m_rtCaption.height; + } + } + FX_FLOAT fWidth = rtUIMargin.left + rtUIMargin.width; + FX_FLOAT fHeight = m_rtCaption.height + rtUIMargin.top + rtUIMargin.height; + if (fWidth > rtWidget.width) { + m_rtUI.width += fWidth - rtWidget.width; + } + if (fHeight == XFA_DEFAULTUI_HEIGHT && m_rtUI.height < XFA_MINUI_HEIGHT) { + m_rtUI.height = XFA_MINUI_HEIGHT; + m_rtCaption.top += rtUIMargin.top + rtUIMargin.height; + } else if (fHeight > rtWidget.height) { + m_rtUI.height += fHeight - rtWidget.height; + if (iCapPlacement == XFA_ATTRIBUTEENUM_Bottom) { + m_rtCaption.top += fHeight - rtWidget.height; + } + } +} +void CXFA_FFField::CapLeftRightPlacement(CXFA_Caption caption, const CFX_RectF &rtWidget, FX_INT32 iCapPlacement) +{ + CFX_RectF rtUIMargin; + m_pDataAcc->GetUIMargin(rtUIMargin); + m_rtCaption.top += rtUIMargin.top; + m_rtCaption.height -= rtUIMargin.top; + if (CXFA_Margin mgCap = caption.GetMargin()) { + XFA_RectWidthoutMargin(m_rtCaption, mgCap); + if (m_rtCaption.height < 0) { + m_rtCaption.top += m_rtCaption.height; + } + } + FX_FLOAT fWidth = m_rtCaption.width + rtUIMargin.left + rtUIMargin.width; + FX_FLOAT fHeight = rtUIMargin.top + rtUIMargin.height; + if (fWidth > rtWidget.width) { + m_rtUI.width += fWidth - rtWidget.width; + if (iCapPlacement == XFA_ATTRIBUTEENUM_Right) { + m_rtCaption.left += fWidth - rtWidget.width; + } + } + if (fHeight == XFA_DEFAULTUI_HEIGHT && m_rtUI.height < XFA_MINUI_HEIGHT) { + m_rtUI.height = XFA_MINUI_HEIGHT; + m_rtCaption.top += rtUIMargin.top + rtUIMargin.height; + } else if (fHeight > rtWidget.height) { + m_rtUI.height += fHeight - rtWidget.height; + } +} +void CXFA_FFField::UpdateFWL() +{ + if (m_pNormalWidget) { + m_pNormalWidget->Update(); + } +} +FX_DWORD CXFA_FFField::UpdateUIProperty() +{ + CXFA_Node* pUiNode = m_pDataAcc->GetUIChild(); + FX_DWORD dwStyle = 0; + if (pUiNode && pUiNode->GetClassID() == XFA_ELEMENT_DefaultUi) { + dwStyle = FWL_STYLEEXT_EDT_ReadOnly; + } + return dwStyle; +} +void CXFA_FFField::SetFWLRect() +{ + if (!m_pNormalWidget) { + return; + } + CFX_RectF rtUi = m_rtUI; + if (rtUi.width < 1.0) { + FXSYS_assert(rtUi.width < 1.0); + rtUi.width = 1.0; + } + if (!m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) { + FX_FLOAT fFontSize = m_pDataAcc->GetFontSize(); + if (rtUi.height < fFontSize) { + rtUi.height = fFontSize; + } + } + m_pNormalWidget->SetWidgetRect(rtUi); +} +FX_BOOL CXFA_FFField::OnMouseEnter() +{ + if (!m_pNormalWidget) { + return FALSE; + } + CFWL_MsgMouse ms; + ms.m_dwCmd = FWL_MSGMOUSECMD_MouseEnter; + ms.m_pDstTarget = m_pNormalWidget->m_pImp; + ms.m_pSrcTarget = NULL; + TranslateFWLMessage(&ms); + return TRUE; +} +FX_BOOL CXFA_FFField::OnMouseExit() +{ + if (!m_pNormalWidget) { + return FALSE; + } + CFWL_MsgMouse ms; + ms.m_dwCmd = FWL_MSGMOUSECMD_MouseLeave; + ms.m_pDstTarget = m_pNormalWidget->m_pImp; + TranslateFWLMessage(&ms); + return TRUE; +} +void CXFA_FFField::FWLToClient(FX_FLOAT &fx, FX_FLOAT &fy) +{ + if (!m_pNormalWidget) { + return; + } + CFX_RectF rtWidget; + m_pNormalWidget->GetWidgetRect(rtWidget); + fx -= rtWidget.left; + fy -= rtWidget.top; +} +FX_BOOL CXFA_FFField::OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + if (!m_pNormalWidget) { + return FALSE; + } + if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open || !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) { + return FALSE; + } + if (!PtInActiveRect(fx, fy)) { + return FALSE; + } + SetButtonDown(TRUE); + CFWL_MsgMouse ms; + ms.m_dwCmd = FWL_MSGMOUSECMD_LButtonDown; + ms.m_dwFlags = dwFlags; + ms.m_fx = fx; + ms.m_fy = fy; + FWLToClient(ms.m_fx, ms.m_fy); + ms.m_pDstTarget = m_pNormalWidget->m_pImp; + TranslateFWLMessage(&ms); + return TRUE; +} +FX_BOOL CXFA_FFField::OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + if (!m_pNormalWidget) { + return FALSE; + } + if (!IsButtonDown()) { + return FALSE; + } + SetButtonDown(FALSE); + CFWL_MsgMouse ms; + ms.m_dwCmd = FWL_MSGMOUSECMD_LButtonUp; + ms.m_dwFlags = dwFlags; + ms.m_fx = fx; + ms.m_fy = fy; + FWLToClient(ms.m_fx, ms.m_fy); + ms.m_pDstTarget = m_pNormalWidget->m_pImp; + TranslateFWLMessage(&ms); + return TRUE; +} +FX_BOOL CXFA_FFField::OnLButtonDblClk(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + if (!m_pNormalWidget) { + return FALSE; + } + CFWL_MsgMouse ms; + ms.m_dwCmd = FWL_MSGMOUSECMD_LButtonDblClk; + ms.m_dwFlags = dwFlags; + ms.m_fx = fx; + ms.m_fy = fy; + FWLToClient(ms.m_fx, ms.m_fy); + ms.m_pDstTarget = m_pNormalWidget->m_pImp; + TranslateFWLMessage(&ms); + return TRUE; +} +FX_BOOL CXFA_FFField::OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + if (!m_pNormalWidget) { + return FALSE; + } + CFWL_MsgMouse ms; + ms.m_dwCmd = FWL_MSGMOUSECMD_MouseMove; + ms.m_dwFlags = dwFlags; + ms.m_fx = fx; + ms.m_fy = fy; + FWLToClient(ms.m_fx, ms.m_fy); + ms.m_pDstTarget = m_pNormalWidget->m_pImp; + TranslateFWLMessage(&ms); + return TRUE; +} +FX_BOOL CXFA_FFField::OnMouseWheel(FX_DWORD dwFlags, FX_SHORT zDelta, FX_FLOAT fx, FX_FLOAT fy) +{ + return FALSE; + if (!m_pNormalWidget) { + return FALSE; + } + CFWL_MsgMouseWheel ms; + ms.m_dwFlags = dwFlags; + ms.m_fx = fx; + ms.m_fy = fy; + FWLToClient(ms.m_fx, ms.m_fy); + ms.m_fDeltaX = zDelta; + ms.m_fDeltaY = 0; + ms.m_pDstTarget = m_pNormalWidget->m_pImp; + TranslateFWLMessage(&ms); + return TRUE; +} +FX_BOOL CXFA_FFField::OnRButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + if (!m_pNormalWidget) { + return FALSE; + } + if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open || !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) { + return FALSE; + } + if (!PtInActiveRect(fx, fy)) { + return FALSE; + } + SetButtonDown(TRUE); + CFWL_MsgMouse ms; + ms.m_dwCmd = FWL_MSGMOUSECMD_RButtonDown; + ms.m_dwFlags = dwFlags; + ms.m_fx = fx; + ms.m_fy = fy; + FWLToClient(ms.m_fx, ms.m_fy); + ms.m_pDstTarget = m_pNormalWidget->m_pImp; + TranslateFWLMessage(&ms); + return TRUE; +} +FX_BOOL CXFA_FFField::OnRButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + if (!m_pNormalWidget) { + return FALSE; + } + if (!IsButtonDown()) { + return FALSE; + } + SetButtonDown(FALSE); + CFWL_MsgMouse ms; + ms.m_dwCmd = FWL_MSGMOUSECMD_RButtonUp; + ms.m_dwFlags = dwFlags; + ms.m_fx = fx; + ms.m_fy = fy; + FWLToClient(ms.m_fx, ms.m_fy); + ms.m_pDstTarget = m_pNormalWidget->m_pImp; + TranslateFWLMessage(&ms); + return TRUE; +} +FX_BOOL CXFA_FFField::OnRButtonDblClk(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + if (!m_pNormalWidget) { + return FALSE; + } + CFWL_MsgMouse ms; + ms.m_dwCmd = FWL_MSGMOUSECMD_RButtonDblClk; + ms.m_dwFlags = dwFlags; + ms.m_fx = fx; + ms.m_fy = fy; + FWLToClient(ms.m_fx, ms.m_fy); + ms.m_pDstTarget = m_pNormalWidget->m_pImp; + TranslateFWLMessage(&ms); + return TRUE; +} + +FX_BOOL CXFA_FFField::OnSetFocus(CXFA_FFWidget* pOldWidget) +{ + CXFA_FFWidget::OnSetFocus(pOldWidget); + if (!m_pNormalWidget) { + return FALSE; + } + CFWL_MsgSetFocus ms; + ms.m_pDstTarget = m_pNormalWidget->m_pImp; + ms.m_pSrcTarget = NULL; + TranslateFWLMessage(&ms); + m_dwStatus |= XFA_WIDGETSTATUS_Focused; + AddInvalidateRect(); + return TRUE; +} +FX_BOOL CXFA_FFField::OnKillFocus(CXFA_FFWidget* pNewWidget) +{ + if (!m_pNormalWidget) { + return CXFA_FFWidget::OnKillFocus(pNewWidget); + } + CFWL_MsgKillFocus ms; + ms.m_pDstTarget = m_pNormalWidget->m_pImp; + ms.m_pSrcTarget = NULL; + TranslateFWLMessage(&ms); + m_dwStatus &= ~XFA_WIDGETSTATUS_Focused; + AddInvalidateRect(); + CXFA_FFWidget::OnKillFocus(pNewWidget); + return TRUE; +} +FX_BOOL CXFA_FFField::OnKeyDown(FX_DWORD dwKeyCode, FX_DWORD dwFlags) +{ + if (!m_pNormalWidget || !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) { + return FALSE; + } + CFWL_MsgKey ms; + ms.m_dwCmd = FWL_MSGKEYCMD_KeyDown; + ms.m_dwFlags = dwFlags; + ms.m_dwKeyCode = dwKeyCode; + ms.m_pDstTarget = m_pNormalWidget->m_pImp; + ms.m_pSrcTarget = NULL; + TranslateFWLMessage(&ms); + return TRUE; +} +FX_BOOL CXFA_FFField::OnKeyUp(FX_DWORD dwKeyCode, FX_DWORD dwFlags) +{ + if (!m_pNormalWidget || !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) { + return FALSE; + } + CFWL_MsgKey ms; + ms.m_dwCmd = FWL_MSGKEYCMD_KeyUp; + ms.m_dwFlags = dwFlags; + ms.m_dwKeyCode = dwKeyCode; + ms.m_pDstTarget = m_pNormalWidget->m_pImp; + ms.m_pSrcTarget = NULL; + TranslateFWLMessage(&ms); + return TRUE; +} +FX_BOOL CXFA_FFField::OnChar(FX_DWORD dwChar, FX_DWORD dwFlags) +{ + if (!m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) { + return FALSE; + } + if (dwChar == FWL_VKEY_Tab) { + return TRUE; + } + if (!m_pNormalWidget) { + return FALSE; + } + if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open) { + return FALSE; + } + CFWL_MsgKey ms; + ms.m_dwCmd = FWL_MSGKEYCMD_Char; + ms.m_dwFlags = dwFlags; + ms.m_dwKeyCode = dwChar; + ms.m_pDstTarget = m_pNormalWidget->m_pImp; + ms.m_pSrcTarget = NULL; + TranslateFWLMessage(&ms); + return TRUE; +} +FX_DWORD CXFA_FFField::OnHitTest(FX_FLOAT fx, FX_FLOAT fy) +{ + if (m_pNormalWidget) { + FX_FLOAT ffx = fx, ffy = fy; + FWLToClient(ffx, ffy); + FX_DWORD dwWidgetHit = m_pNormalWidget->HitTest(ffx, ffy); + if (dwWidgetHit != FWL_WGTHITTEST_Unknown) { + return FWL_WGTHITTEST_Client; + } + } + CFX_RectF rtBox; + GetRectWithoutRotate(rtBox); + if (!rtBox.Contains(fx, fy)) { + return FWL_WGTHITTEST_Unknown; + } + if (m_rtCaption.Contains(fx, fy)) { + return FWL_WGTHITTEST_Titlebar; + } + return FWL_WGTHITTEST_Border; +} +FX_BOOL CXFA_FFField::OnSetCursor(FX_FLOAT fx, FX_FLOAT fy) +{ + return TRUE; +} +FX_BOOL CXFA_FFField::PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy) +{ + if (!m_pNormalWidget) { + return FALSE; + } + CFX_RectF rtWidget; + m_pNormalWidget->GetWidgetRect(rtWidget); + if (rtWidget.Contains(fx, fy)) { + return TRUE; + } + return FALSE; +} +void CXFA_FFField::LayoutCaption() +{ + CXFA_TextLayout* pCapTextLayout = m_pDataAcc->GetCaptionTextLayout(); + if (!pCapTextLayout) { + return; + } + CFX_SizeF size; + size.Set(m_rtCaption.width, m_rtCaption.height); + FX_FLOAT fHeight = 0; + pCapTextLayout->Layout(size, &fHeight); + if (m_rtCaption.height < fHeight) { + m_rtCaption.height = fHeight; + } +} +void CXFA_FFField::RenderCaption(CFX_Graphics* pGS, CFX_Matrix* pMatrix ) +{ + CXFA_TextLayout* pCapTextLayout = m_pDataAcc->GetCaptionTextLayout(); + if (!pCapTextLayout) { + return; + } + CXFA_Caption caption = m_pDataAcc->GetCaption(); + if (caption.IsExistInXML() && caption.GetPresence() == XFA_ATTRIBUTEENUM_Visible) { + if (!pCapTextLayout->IsLoaded()) { + CFX_SizeF size; + size.Set(m_rtCaption.width, m_rtCaption.height); + pCapTextLayout->Layout(size); + } + CFX_RectF rtWidget; + GetRectWithoutRotate(rtWidget); + CFX_RectF rtClip = m_rtCaption; + rtClip.Intersect(rtWidget); + CFX_RenderDevice* pRenderDevice = pGS->GetRenderDevice(); + CFX_Matrix mt; + mt.Set(1, 0, 0, 1, m_rtCaption.left, m_rtCaption.top); + if (pMatrix) { + pMatrix->TransformRect(rtClip); + mt.Concat(*pMatrix); + } + pCapTextLayout->DrawString(pRenderDevice, mt, rtClip); + } +} +FX_BOOL CXFA_FFField::ProcessCommittedData() +{ + if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open) { + return FALSE; + } + if (!IsDataChanged()) { + return FALSE; + } + if (CalculateOverride() != 1) { + return FALSE; + } + if (!CommitData()) { + return FALSE; + } + m_pDocView->SetChangeMark(); + m_pDocView->AddValidateWidget(m_pDataAcc); + return TRUE; +} +FX_INT32 CXFA_FFField::CalculateOverride() +{ + CXFA_WidgetAcc* pAcc = m_pDataAcc->GetExclGroup(); + if (!pAcc) { + return CalculateWidgetAcc(m_pDataAcc); + } + FX_INT32 iOverride = 0; + if (CalculateWidgetAcc(pAcc) == 0) { + return 0; + } + CXFA_Node* pNode = pAcc->GetExclGroupFirstMember(); + if (!pNode) { + return 1; + } + CXFA_WidgetAcc* pWidgetAcc = NULL; + while (pNode) { + pWidgetAcc = (CXFA_WidgetAcc*)pNode->GetWidgetData(); + if (!pWidgetAcc) { + return 1; + } + if (CalculateWidgetAcc(pWidgetAcc) == 0) { + return 0; + } + pNode = pWidgetAcc->GetExclGroupNextMember(pNode); + } + return 1; +} +FX_INT32 CXFA_FFField::CalculateWidgetAcc(CXFA_WidgetAcc* pAcc) +{ + CXFA_Calculate calc = pAcc->GetCalculate(); + if (!calc) { + return 1; + } + XFA_VERSION version = pAcc->GetDoc()->GetXFADoc()->GetCurVersionMode(); + if (calc) { + FX_INT32 iOverride = calc.GetOverride(); + switch (iOverride) { + case XFA_ATTRIBUTEENUM_Error: { + if (version <= XFA_VERSION_204) { + return 1; + } + IXFA_AppProvider* pAppProvider = GetApp()->GetAppProvider(); + if (pAppProvider) { + CFX_WideString wsMessage; + CFX_WideString wsWarning; + pAppProvider->LoadString(XFA_IDS_NotModifyField, wsWarning); + wsMessage += wsWarning; + CFX_WideString wsTitle; + pAppProvider->LoadString(XFA_IDS_CalcOverride, wsTitle); + pAppProvider->MsgBox(wsMessage, wsTitle, XFA_MBICON_Warning, XFA_MB_OK); + } + } + return 0; + case XFA_ATTRIBUTEENUM_Warning: { + if (version <= XFA_VERSION_204) { + CXFA_Script script = calc.GetScript(); + if (!script) { + return 1; + } + CFX_WideString wsExpression; + script.GetExpression(wsExpression); + if (wsExpression.IsEmpty()) { + return 1; + } + } + if (pAcc->GetNode()->HasFlag(XFA_NODEFLAG_UserInteractive)) { + return 1; + } + IXFA_AppProvider* pAppProvider = GetApp()->GetAppProvider(); + if (pAppProvider) { + CFX_WideString wsMessage; + calc.GetMessageText(wsMessage); + if (!wsMessage.IsEmpty()) { + wsMessage += L"\r\n"; + } + CFX_WideString wsWarning; + pAppProvider->LoadString(XFA_IDS_ModifyField, wsWarning); + wsMessage += wsWarning; + CFX_WideString wsTitle; + pAppProvider->LoadString(XFA_IDS_CalcOverride, wsTitle); + if (pAppProvider->MsgBox(wsMessage, wsTitle, XFA_MBICON_Warning, XFA_MB_YesNo) == XFA_IDYes) { + pAcc->GetNode()->SetFlag(XFA_NODEFLAG_UserInteractive, TRUE, FALSE); + return 1; + } + } + return 0; + } + case XFA_ATTRIBUTEENUM_Ignore: + return 0; + case XFA_ATTRIBUTEENUM_Disabled: + pAcc->GetNode()->SetFlag(XFA_NODEFLAG_UserInteractive, TRUE, FALSE); + default: + return 1; + } + } + return 1; +} +FX_BOOL CXFA_FFField::CommitData() +{ + return FALSE; +} +FX_BOOL CXFA_FFField::IsDataChanged() +{ + return FALSE; +} +void CXFA_FFField::TranslateFWLMessage(CFWL_Message* pMessage) +{ + GetApp()->GetWidgetMgrDelegate()->OnProcessMessageToForm(pMessage); +} +FX_INT32 CXFA_FFField::OnProcessMessage(CFWL_Message *pMessage) +{ + return FWL_ERR_Succeeded; +} +FWL_ERR CXFA_FFField::OnProcessEvent(CFWL_Event *pEvent) +{ + FX_DWORD dwEventID = pEvent->GetClassID(); + switch (dwEventID) { + case FWL_EVTHASH_Mouse: { + CFWL_EvtMouse *event = (CFWL_EvtMouse*)pEvent; + if (event->m_dwCmd == FWL_MSGMOUSECMD_MouseEnter) { + CXFA_EventParam eParam; + eParam.m_eType = XFA_EVENT_MouseEnter; + eParam.m_pTarget = m_pDataAcc; + m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_MouseEnter, &eParam); + } else if (event->m_dwCmd == FWL_MSGMOUSECMD_MouseLeave) { + CXFA_EventParam eParam; + eParam.m_eType = XFA_EVENT_MouseExit; + eParam.m_pTarget = m_pDataAcc; + m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_MouseExit, &eParam); + } else if (event->m_dwCmd == FWL_MSGMOUSECMD_LButtonDown) { + CXFA_EventParam eParam; + eParam.m_eType = XFA_EVENT_MouseDown; + eParam.m_pTarget = m_pDataAcc; + m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_MouseDown, &eParam); + } else if (event->m_dwCmd == FWL_MSGMOUSECMD_LButtonUp) { + CXFA_EventParam eParam; + eParam.m_eType = XFA_EVENT_MouseUp; + eParam.m_pTarget = m_pDataAcc; + m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_MouseUp, &eParam); + } + break; + } + case FWL_EVTHASH_Click: { + CXFA_EventParam eParam; + eParam.m_eType = XFA_EVENT_Click; + eParam.m_pTarget = m_pDataAcc; + m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Click, &eParam); + break; + } + default: { + } + } + return FWL_ERR_Succeeded; +} +FWL_ERR CXFA_FFField::OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + return FWL_ERR_Succeeded; +} diff --git a/xfa/src/fxfa/src/app/xfa_fffield.h b/xfa/src/fxfa/src/app/xfa_fffield.h new file mode 100644 index 0000000000..c2f7e680e2 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_fffield.h @@ -0,0 +1,77 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FXFA_FORMFILLER_FIELD_IMP_H +#define _FXFA_FORMFILLER_FIELD_IMP_H +#define XFA_MINUI_HEIGHT 4.32f +#define XFA_DEFAULTUI_HEIGHT 2.0f +class CXFA_TextLayout; +class CXFA_FFField : public CXFA_FFWidget, public IFWL_WidgetDelegate +{ +public: + CXFA_FFField(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc); + virtual ~CXFA_FFField(); + + virtual FX_BOOL GetBBox(CFX_RectF &rtBox, FX_DWORD dwStatus, FX_BOOL bDrawFocus = FALSE); + virtual void RenderWidget(CFX_Graphics* pGS, CFX_Matrix* pMatrix = NULL, FX_DWORD dwStatus = 0, FX_INT32 iRotate = 0); + virtual FX_BOOL IsLoaded(); + virtual FX_BOOL LoadWidget(); + virtual void UnloadWidget(); + virtual FX_BOOL LayoutWidget(); + virtual void UpdateFWL(); + FX_DWORD UpdateUIProperty(); + virtual FX_BOOL OnMouseEnter(); + virtual FX_BOOL OnMouseExit(); + virtual FX_BOOL OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnLButtonDblClk(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnMouseWheel(FX_DWORD dwFlags, FX_SHORT zDelta, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnRButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnRButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnRButtonDblClk(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + + virtual FX_BOOL OnSetFocus(CXFA_FFWidget* pOldWidget); + virtual FX_BOOL OnKillFocus(CXFA_FFWidget* pNewWidget); + virtual FX_BOOL OnKeyDown(FX_DWORD dwKeyCode, FX_DWORD dwFlags); + virtual FX_BOOL OnKeyUp(FX_DWORD dwKeyCode, FX_DWORD dwFlags); + virtual FX_BOOL OnChar(FX_DWORD dwChar, FX_DWORD dwFlags); + virtual FX_DWORD OnHitTest(FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnSetCursor(FX_FLOAT fx, FX_FLOAT fy); +protected: + virtual FX_BOOL PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy); + virtual void SetFWLRect(); + void SetFWLThemeProvider(); + CFWL_Widget* GetNormalWidget() + { + return m_pNormalWidget; + } + void FWLToClient(FX_FLOAT &fx, FX_FLOAT &fy); + void LayoutCaption(); + void RenderCaption(CFX_Graphics* pGS, CFX_Matrix* pMatrix = NULL); + + FX_INT32 CalculateOverride(); + FX_INT32 CalculateWidgetAcc(CXFA_WidgetAcc* pAcc); + FX_BOOL ProcessCommittedData(); + virtual FX_BOOL CommitData(); + virtual FX_BOOL IsDataChanged(); + void DrawHighlight(CFX_Graphics* pGS, CFX_Matrix* pMatrix, FX_DWORD dwStatus, FX_BOOL bEllipse = FALSE); + void DrawFocus(CFX_Graphics* pGS, CFX_Matrix* pMatrix); + void TranslateFWLMessage(CFWL_Message* pMessage); + void CapPlacement(); + void CapTopBottomPlacement(CXFA_Caption caption, const CFX_RectF &rtWidget, FX_INT32 iCapPlacement); + void CapLeftRightPlacement(CXFA_Caption caption, const CFX_RectF &rtWidget, FX_INT32 iCapPlacement); + void SetEditScrollOffset(); +public: + virtual FX_INT32 OnProcessMessage(CFWL_Message *pMessage); + virtual FWL_ERR OnProcessEvent(CFWL_Event *pEvent); + virtual FWL_ERR OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); +protected: + CFWL_Widget* m_pNormalWidget; + CFX_RectF m_rtUI; + CFX_RectF m_rtCaption; +}; +#endif diff --git a/xfa/src/fxfa/src/app/xfa_ffimage.cpp b/xfa/src/fxfa/src/app/xfa_ffimage.cpp new file mode 100644 index 0000000000..a12b1ff9dc --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffimage.cpp @@ -0,0 +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 + +#include "../../../foxitlib.h" +#include "../common/xfa_common.h" +#include "xfa_ffwidget.h" +#include "xfa_ffdraw.h" +#include "xfa_ffimage.h" +#include "xfa_ffpageview.h" +#include "xfa_ffdoc.h" +#include "xfa_ffapp.h" +CXFA_FFImage::CXFA_FFImage(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc) + : CXFA_FFDraw(pPageView, pDataAcc) +{ +} +CXFA_FFImage::~CXFA_FFImage() +{ + CXFA_FFImage::UnloadWidget(); +} +FX_BOOL CXFA_FFImage::IsLoaded() +{ + return GetDataAcc()->GetImageImage() != NULL; +} +FX_BOOL CXFA_FFImage::LoadWidget() +{ + if (GetDataAcc()->GetImageImage()) { + return TRUE; + } + GetDataAcc()->LoadImageImage(); + return CXFA_FFDraw::LoadWidget(); +} +void CXFA_FFImage::UnloadWidget() +{ + GetDataAcc()->SetImageImage(NULL); +} +void CXFA_FFImage::RenderWidget(CFX_Graphics* pGS, CFX_Matrix* pMatrix , FX_DWORD dwStatus , FX_INT32 iRotate ) +{ + if (!IsMatchVisibleStatus(dwStatus)) { + return; + } + CFX_Matrix mtRotate; + GetRotateMatrix(mtRotate); + if (pMatrix) { + mtRotate.Concat(*pMatrix); + } + CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus); + if (CFX_DIBitmap* pDIBitmap = GetDataAcc()->GetImageImage()) { + CFX_RectF rtImage; + GetRectWithoutRotate(rtImage); + if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin()) { + XFA_RectWidthoutMargin(rtImage, mgWidget); + } + FX_INT32 iHorzAlign = XFA_ATTRIBUTEENUM_Left; + FX_INT32 iVertAlign = XFA_ATTRIBUTEENUM_Top; + if (CXFA_Para para = m_pDataAcc->GetPara()) { + iHorzAlign = para.GetHorizontalAlign(); + iVertAlign = para.GetVerticalAlign(); + } + CXFA_Value value = m_pDataAcc->GetFormValue(); + CXFA_Image imageObj = value.GetImage(); + FX_INT32 iAspect = imageObj.GetAspect(); + FX_INT32 iImageXDpi = 0; + FX_INT32 iImageYDpi = 0; + m_pDataAcc->GetImageDpi(iImageXDpi, iImageYDpi); + XFA_DrawImage(pGS, rtImage, &mtRotate, pDIBitmap, iAspect, iImageXDpi, iImageYDpi, iHorzAlign, iVertAlign); + } +} diff --git a/xfa/src/fxfa/src/app/xfa_ffimage.h b/xfa/src/fxfa/src/app/xfa_ffimage.h new file mode 100644 index 0000000000..f6b985c304 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffimage.h @@ -0,0 +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 _XFA_DRAW_IMAGE_IMP_H +#define _XFA_DRAW_IMAGE_IMP_H +class CXFA_FFImage : public CXFA_FFDraw +{ +public: + CXFA_FFImage(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc); + virtual ~CXFA_FFImage(); + virtual void RenderWidget(CFX_Graphics* pGS, CFX_Matrix* pMatrix = NULL, FX_DWORD dwStatus = 0, FX_INT32 iRotate = 0); + virtual FX_BOOL IsLoaded(); + virtual FX_BOOL LoadWidget(); + virtual void UnloadWidget(); +}; +#endif diff --git a/xfa/src/fxfa/src/app/xfa_ffimageedit.cpp b/xfa/src/fxfa/src/app/xfa_ffimageedit.cpp new file mode 100644 index 0000000000..2075d90d21 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffimageedit.cpp @@ -0,0 +1,188 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_common.h" +#include "xfa_ffwidget.h" +#include "xfa_fffield.h" +#include "xfa_ffpageview.h" +#include "xfa_ffimageedit.h" +#include "xfa_ffdocview.h" +#include "xfa_ffdoc.h" +CXFA_FFImageEdit::CXFA_FFImageEdit(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc) + : CXFA_FFField(pPageView, pDataAcc) + , m_pOldDelegate(NULL) +{ +} +CXFA_FFImageEdit::~CXFA_FFImageEdit() +{ + CXFA_FFImageEdit::UnloadWidget(); +} +FX_BOOL CXFA_FFImageEdit::LoadWidget() +{ + CFWL_PictureBox* pPictureBox = FX_NEW CFWL_PictureBox; + if (pPictureBox) { + pPictureBox->Initialize(); + } + m_pNormalWidget = (CFWL_Widget*)pPictureBox; + IFWL_Widget* pWidget = m_pNormalWidget->GetWidget(); + m_pNormalWidget->SetPrivateData(pWidget, this, NULL); + IFWL_NoteDriver *pNoteDriver = FWL_GetApp()->GetNoteDriver(); + pNoteDriver->RegisterEventTarget(pWidget, pWidget); + m_pOldDelegate = pPictureBox->SetDelegate(this); + CXFA_FFField::LoadWidget(); + if (m_pDataAcc->GetImageEditImage() != NULL) { + return TRUE; + } + UpdateFWLData(); + return TRUE; +} +void CXFA_FFImageEdit::UnloadWidget() +{ + m_pDataAcc->SetImageEditImage(NULL); + CXFA_FFField::UnloadWidget(); +} +void CXFA_FFImageEdit::RenderWidget(CFX_Graphics* pGS, CFX_Matrix* pMatrix , FX_DWORD dwStatus , FX_INT32 iRotate ) +{ + if (!IsMatchVisibleStatus(dwStatus)) { + return; + } + CFX_Matrix mtRotate; + GetRotateMatrix(mtRotate); + if (pMatrix) { + mtRotate.Concat(*pMatrix); + } + CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus); + CXFA_Border borderUI = m_pDataAcc->GetUIBorder(); + DrawBorder(pGS, borderUI, m_rtUI, &mtRotate); + RenderCaption(pGS, &mtRotate); + if (CFX_DIBitmap* pDIBitmap = m_pDataAcc->GetImageEditImage()) { + CFX_RectF rtImage; + m_pNormalWidget->GetWidgetRect(rtImage); + FX_INT32 iHorzAlign = XFA_ATTRIBUTEENUM_Left; + FX_INT32 iVertAlign = XFA_ATTRIBUTEENUM_Top; + if (CXFA_Para para = m_pDataAcc->GetPara()) { + iHorzAlign = para.GetHorizontalAlign(); + iVertAlign = para.GetVerticalAlign(); + } + FX_INT32 iAspect = XFA_ATTRIBUTEENUM_Fit; + if (CXFA_Value value = m_pDataAcc->GetFormValue()) { + if (CXFA_Image imageObj = value.GetImage()) { + iAspect = imageObj.GetAspect(); + } + } + FX_INT32 iImageXDpi = 0; + FX_INT32 iImageYDpi = 0; + m_pDataAcc->GetImageEditDpi(iImageXDpi, iImageYDpi); + XFA_DrawImage(pGS, rtImage, &mtRotate, pDIBitmap, iAspect, iImageXDpi, iImageYDpi, iHorzAlign, iVertAlign); + } +} +FX_BOOL CXFA_FFImageEdit::OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open) { + return FALSE; + } + if (!PtInActiveRect(fx, fy)) { + return FALSE; + } + SetButtonDown(TRUE); + CFWL_MsgMouse ms; + ms.m_dwCmd = FWL_MSGMOUSECMD_LButtonDown; + ms.m_dwFlags = dwFlags; + ms.m_fx = fx; + ms.m_fy = fy; + ms.m_pDstTarget = m_pNormalWidget->m_pImp; + FWLToClient(ms.m_fx, ms.m_fy); + TranslateFWLMessage(&ms); + IXFA_AppProvider* pAppProvider = GetAppProvider(); + if (!pAppProvider) { + return TRUE; + } + CFX_WideString wsTitle; + CFX_WideString wsFilter; + pAppProvider->LoadString(XFA_IDS_ImageFilter, wsFilter); + CFX_WideStringArray wsPathArray; + pAppProvider->ShowFileDialog(wsTitle, wsFilter, wsPathArray); + FX_INT32 iSize = wsPathArray.GetSize(); + if (iSize < 1) { + return TRUE; + } + CFX_WideString wsFilePath = wsPathArray[0]; + FX_STRSIZE nLen = wsFilePath.GetLength(); + FX_STRSIZE nIndex = nLen - 1; + while (nIndex > 0 && wsFilePath[nIndex] != '.') { + nIndex--; + } + if (nIndex <= 0) { + return TRUE; + } + CFX_WideString wsContentType(L"image/"); + wsContentType += wsFilePath.Right(nLen - nIndex - 1); + wsContentType.MakeLower(); + FXCODEC_IMAGE_TYPE eImageType = XFA_GetImageType(wsContentType); + if (eImageType == FXCODEC_IMAGE_UNKNOWN) { + return TRUE; + } + CFX_WideString wsImage; + IFX_FileRead* pFileRead = FX_CreateFileRead(wsFilePath); + if (pFileRead != NULL) { + FX_INT32 nDataSize = pFileRead->GetSize(); + if (nDataSize > 0) { + CFX_ByteString bsBuf; + FX_LPSTR pImageBuffer = bsBuf.GetBuffer(nDataSize); + pFileRead->ReadBlock(pImageBuffer, 0, nDataSize); + bsBuf.ReleaseBuffer(); + if (!bsBuf.IsEmpty()) { + FX_LPSTR pData = XFA_Base64Encode(bsBuf, nDataSize); + wsImage = CFX_WideString::FromLocal(pData); + if (pData != NULL) { + FX_Free(pData); + } + } + } + m_pDataAcc->SetImageEditImage(NULL); + pFileRead->Release(); + } + m_pDataAcc->SetImageEdit(wsContentType, CFX_WideStringC(), wsImage); + m_pDataAcc->LoadImageEditImage(); + AddInvalidateRect(); + m_pDocView->SetChangeMark(); + return TRUE; +} +void CXFA_FFImageEdit::SetFWLRect() +{ + if (!m_pNormalWidget) { + return; + } + CFX_RectF rtUIMargin; + m_pDataAcc->GetUIMargin(rtUIMargin); + CFX_RectF rtImage(m_rtUI); + rtImage.Deflate(rtUIMargin.left, rtUIMargin.top, rtUIMargin.width, rtUIMargin.height); + m_pNormalWidget->SetWidgetRect(rtImage); +} +FX_BOOL CXFA_FFImageEdit::CommitData() +{ + return TRUE; +} +FX_BOOL CXFA_FFImageEdit::UpdateFWLData() +{ + m_pDataAcc->SetImageEditImage(NULL); + m_pDataAcc->LoadImageEditImage(); + return TRUE; +} +FX_INT32 CXFA_FFImageEdit::OnProcessMessage(CFWL_Message *pMessage) +{ + return m_pOldDelegate->OnProcessMessage(pMessage); +} +FWL_ERR CXFA_FFImageEdit::OnProcessEvent(CFWL_Event *pEvent) +{ + CXFA_FFField::OnProcessEvent(pEvent); + return m_pOldDelegate->OnProcessEvent(pEvent); +} +FWL_ERR CXFA_FFImageEdit::OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + return m_pOldDelegate->OnDrawWidget(pGraphics, pMatrix); +} diff --git a/xfa/src/fxfa/src/app/xfa_ffimageedit.h b/xfa/src/fxfa/src/app/xfa_ffimageedit.h new file mode 100644 index 0000000000..7ba8333103 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffimageedit.h @@ -0,0 +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 + +#ifndef _FXFA_FORMFILLER_IMAGEEDIT_IMP_H +#define _FXFA_FORMFILLER_IMAGEEDIT_IMP_H +class CXFA_FFImageEdit : public CXFA_FFField +{ +public: + CXFA_FFImageEdit(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc); + virtual ~CXFA_FFImageEdit(); + + virtual void RenderWidget(CFX_Graphics* pGS, CFX_Matrix* pMatrix = NULL, FX_DWORD dwStatus = 0, FX_INT32 iRotate = 0); + virtual FX_BOOL LoadWidget(); + virtual void UnloadWidget(); + virtual FX_BOOL OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_INT32 OnProcessMessage(CFWL_Message *pMessage); + virtual FWL_ERR OnProcessEvent(CFWL_Event *pEvent); + virtual FWL_ERR OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); +protected: + virtual void SetFWLRect(); + virtual FX_BOOL UpdateFWLData(); + virtual FX_BOOL CommitData(); + IFWL_WidgetDelegate *m_pOldDelegate; +}; +#endif diff --git a/xfa/src/fxfa/src/app/xfa_ffnotify.cpp b/xfa/src/fxfa/src/app/xfa_ffnotify.cpp new file mode 100644 index 0000000000..e4e4cd30a8 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffnotify.cpp @@ -0,0 +1,611 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_common.h" +#include "xfa_fwladapter.h" +#include "xfa_ffdocview.h" +#include "xfa_ffpageview.h" +#include "xfa_ffwidgethandler.h" +#include "xfa_ffdoc.h" +#include "xfa_ffwidget.h" +#include "xfa_fffield.h" +#include "xfa_ffpushbutton.h" +#include "xfa_ffcheckbutton.h" +#include "xfa_ffchoicelist.h" +#include "xfa_ffimageedit.h" +#include "xfa_fftextedit.h" +#include "xfa_ffbarcode.h" +#include "xfa_ffdraw.h" +#include "xfa_fftext.h" +#include "xfa_ffpath.h" +#include "xfa_ffimage.h" +#include "xfa_ffexclgroup.h" +#include "xfa_ffsubform.h" +#include "xfa_ffsignature.h" +#include "xfa_ffapp.h" +#include "xfa_textlayout.h" +#include "xfa_ffwidgetacc.h" +#include "xfa_ffnotify.h" +static void XFA_FFDeleteWidgetAcc(FX_LPVOID pData) +{ + if (pData) { + delete (CXFA_WidgetAcc*)pData; + } +} +static XFA_MAPDATABLOCKCALLBACKINFO gs_XFADeleteWidgetAcc = {XFA_FFDeleteWidgetAcc, NULL}; +CXFA_FFNotify::CXFA_FFNotify(CXFA_FFDoc* pDoc) + : m_pDoc(pDoc) +{ +} +CXFA_FFNotify::~CXFA_FFNotify() +{ +} +void CXFA_FFNotify::OnPageEvent(IXFA_LayoutPage *pSender, XFA_PAGEEVENT eEvent, FX_LPVOID pParam) +{ + CXFA_FFDocView* pDocView = m_pDoc->GetDocView(pSender->GetLayout()); + if (!pDocView) { + return; + } + pDocView->OnPageEvent(pSender, eEvent, (FX_INT32)(FX_UINTPTR)pParam); +} +void CXFA_FFNotify::OnNodeEvent(CXFA_Node *pSender, XFA_NODEEVENT eEvent, FX_LPVOID pParam , FX_LPVOID pParam2 , FX_LPVOID pParam3, FX_LPVOID pParam4) +{ + switch (eEvent) { + case XFA_NODEEVENT_Ready: + OnNodeReady(pSender); + break; + case XFA_NODEEVENT_ValueChanging: + OnValueChanging(pSender, pParam, pParam2); + break; + case XFA_NODEEVENT_ValueChanged: + OnValueChanged(pSender, pParam, pParam2, pParam3, pParam4); + break; + case XFA_NODEEVENT_ChildAdded: + OnChildAdded(pSender, pParam, pParam2); + break; + case XFA_NODEEVENT_ChildRemoved: + OnChildRemoved(pSender, pParam, pParam2); + break; + } +} +void CXFA_FFNotify::OnWidgetDataEvent(CXFA_WidgetData* pSender, FX_DWORD dwEvent, FX_LPVOID pParam , FX_LPVOID pAdditional , FX_LPVOID pAdditional2 ) +{ + CXFA_WidgetAcc* pWidgetAcc = (CXFA_WidgetAcc*)pSender; + switch (dwEvent) { + case XFA_WIDGETEVENT_ListItemAdded: { + if (pWidgetAcc->GetUIType() != XFA_ELEMENT_ChoiceList) { + return; + } + FX_BOOL bStaticNotify = pWidgetAcc->GetDocView()->IsStaticNotify(); + CXFA_FFWidget* pWidget = pWidgetAcc->GetNextWidget(NULL); + if (!pWidget) { + if (bStaticNotify) { + pWidgetAcc->GetDoc()->GetDocProvider()->WidgetEvent((XFA_HWIDGET)pWidget, pWidgetAcc, XFA_WIDGETEVENT_ListItemAdded, pParam, pAdditional); + } + return; + } + while (pWidget) { + if (pWidget->IsLoaded()) { + if (pWidgetAcc->IsListBox()) { + ((CXFA_FFListBox*)pWidget)->InsertItem((FX_WSTR)(FX_LPCWSTR)pParam, (FX_INT32)(FX_UINTPTR)pAdditional2); + } else { + ((CXFA_FFComboBox*)pWidget)->InsertItem((FX_WSTR)(FX_LPCWSTR)pParam, (FX_INT32)(FX_UINTPTR)pAdditional2); + } + } + if (bStaticNotify) { + pWidgetAcc->GetDoc()->GetDocProvider()->WidgetEvent((XFA_HWIDGET)pWidget, pWidgetAcc, XFA_WIDGETEVENT_ListItemAdded, pParam, pAdditional); + } + pWidget = pWidgetAcc->GetNextWidget(pWidget); + } + } + break; + case XFA_WIDGETEVENT_ListItemRemoved: { + if (pWidgetAcc->GetUIType() != XFA_ELEMENT_ChoiceList) { + return; + } + FX_BOOL bStaticNotify = pWidgetAcc->GetDocView()->IsStaticNotify(); + CXFA_FFWidget* pWidget = pWidgetAcc->GetNextWidget(NULL); + if (!pWidget) { + if (bStaticNotify) { + pWidgetAcc->GetDoc()->GetDocProvider()->WidgetEvent((XFA_HWIDGET)pWidget, pWidgetAcc, XFA_WIDGETEVENT_ListItemRemoved, pParam, pAdditional); + } + return; + } + while (pWidget) { + if (pWidget->IsLoaded()) { + if (pWidgetAcc->IsListBox()) { + ((CXFA_FFListBox*)pWidget)->DeleteItem((FX_INT32)(FX_UINTPTR)pParam); + } else { + ((CXFA_FFComboBox*)pWidget)->DeleteItem((FX_INT32)(FX_UINTPTR)pParam); + } + } + if (bStaticNotify) { + pWidgetAcc->GetDoc()->GetDocProvider()->WidgetEvent((XFA_HWIDGET)pWidget, pWidgetAcc, XFA_WIDGETEVENT_ListItemRemoved, pParam, pAdditional); + } + pWidget = pWidgetAcc->GetNextWidget(pWidget); + } + } + break; + } +} +CXFA_LayoutItem* CXFA_FFNotify::OnCreateLayoutItem(CXFA_Node* pNode) +{ + IXFA_DocLayout* pLayout = m_pDoc->GetXFADoc()->GetDocLayout(); + CXFA_FFDocView* pDocView = m_pDoc->GetDocView(pLayout); + XFA_ELEMENT eType = pNode->GetClassID(); + if (eType == XFA_ELEMENT_PageArea) { + return (CXFA_LayoutItem*)(FX_NEW CXFA_FFPageView(pDocView, pNode)); + } else if (eType == XFA_ELEMENT_ContentArea) { + return (CXFA_LayoutItem*)(FX_NEW CXFA_ContainerLayoutItemImpl(pNode)); + } + CXFA_WidgetAcc* pAcc = (CXFA_WidgetAcc*)pNode->GetWidgetData(); + if (!pAcc) { + return (CXFA_LayoutItem*)(FX_NEW CXFA_ContentLayoutItemImpl(pNode)); + } + CXFA_FFPageView* pPageView = NULL; + CXFA_FFWidget* pWidget = NULL; + switch(pAcc->GetUIType()) { + case XFA_ELEMENT_Barcode: + pWidget = FX_NEW CXFA_FFBarcode(pPageView, pAcc); + break; + case XFA_ELEMENT_Button: + pWidget = FX_NEW CXFA_FFPushButton(pPageView, pAcc); + break; + case XFA_ELEMENT_CheckButton: + pWidget = FX_NEW CXFA_FFCheckButton(pPageView, pAcc); + break; + case XFA_ELEMENT_ChoiceList: { + if (pAcc->IsListBox()) { + pWidget = FX_NEW CXFA_FFListBox(pPageView, pAcc); + } else { + pWidget = FX_NEW CXFA_FFComboBox(pPageView, pAcc); + } + } + break; + case XFA_ELEMENT_DateTimeEdit: + pWidget = FX_NEW CXFA_FFDateTimeEdit(pPageView, pAcc); + break; + case XFA_ELEMENT_ImageEdit: + pWidget = FX_NEW CXFA_FFImageEdit(pPageView, pAcc); + break; + case XFA_ELEMENT_NumericEdit: + pWidget = FX_NEW CXFA_FFNumericEdit(pPageView, pAcc); + break; + case XFA_ELEMENT_PasswordEdit: + pWidget = FX_NEW CXFA_FFPasswordEdit(pPageView, pAcc); + break; + case XFA_ELEMENT_Signature: + pWidget = FX_NEW CXFA_FFSignature(pPageView, pAcc); + break; + case XFA_ELEMENT_TextEdit: + pWidget = FX_NEW CXFA_FFTextEdit(pPageView, pAcc); + break; + case XFA_ELEMENT_Arc: + pWidget = FX_NEW CXFA_FFArc(pPageView, pAcc); + break; + case XFA_ELEMENT_Line: + pWidget = FX_NEW CXFA_FFLine(pPageView, pAcc); + break; + case XFA_ELEMENT_Rectangle: + pWidget = FX_NEW CXFA_FFRectangle(pPageView, pAcc); + break; + case XFA_ELEMENT_Text: + pWidget = FX_NEW CXFA_FFText(pPageView, pAcc); + break; + case XFA_ELEMENT_Image: + pWidget = FX_NEW CXFA_FFImage(pPageView, pAcc); + break; + case XFA_ELEMENT_Draw: + pWidget = FX_NEW CXFA_FFDraw(pPageView, pAcc); + break; + case XFA_ELEMENT_Subform: + pWidget = FX_NEW CXFA_FFSubForm(pPageView, pAcc); + break; + case XFA_ELEMENT_ExclGroup: + pWidget = FX_NEW CXFA_FFExclGroup(pPageView, pAcc); + break; + case XFA_ELEMENT_DefaultUi: + default: + pWidget = NULL; + break; + } + if (!pWidget) { + return NULL; + } + pWidget->SetDocView(pDocView); + return pWidget->GetLayoutItem(); +} +void CXFA_FFNotify::OnLayoutEvent(IXFA_DocLayout *pLayout, CXFA_LayoutItem *pSender, XFA_LAYOUTEVENT eEvent, FX_LPVOID pParam , FX_LPVOID pParam2 ) +{ + CXFA_FFDocView* pDocView = m_pDoc->GetDocView(pLayout); + if (!pDocView || !XFA_GetWidgetFromLayoutItem(pSender)) { + return; + } + switch (eEvent) { + case XFA_LAYOUTEVENT_ItemAdded: + OnLayoutItemAdd(pDocView, pLayout, pSender, pParam, pParam2); + break; + case XFA_LAYOUTEVENT_ItemRemoving: + OnLayoutItemRemoving(pDocView, pLayout, pSender, pParam, pParam2); + break; + case XFA_LAYOUTEVENT_RectChanged: + OnLayoutItemRectChanged(pDocView, pLayout, pSender, pParam, pParam2); + break; + case XFA_LAYOUTEVENT_StatusChanged: + OnLayoutItemStatustChanged(pDocView, pLayout, pSender, pParam, pParam2); + break; + } +} +void CXFA_FFNotify::StartFieldDrawLayout(CXFA_Node *pItem, FX_FLOAT &fCalcWidth, FX_FLOAT &fCalcHeight) +{ + CXFA_WidgetAcc *pAcc = (CXFA_WidgetAcc*)pItem->GetWidgetData(); + if (!pAcc) { + return; + } + pAcc->StartWidgetLayout(fCalcWidth, fCalcHeight); +} +FX_BOOL CXFA_FFNotify::FindSplitPos(CXFA_Node *pItem, FX_INT32 iBlockIndex, FX_FLOAT &fCalcHeightPos) +{ + CXFA_WidgetAcc *pAcc = (CXFA_WidgetAcc*)pItem->GetWidgetData(); + if (!pAcc) { + return FALSE; + } + return (XFA_LAYOUTRESULT)pAcc->FindSplitPos(iBlockIndex, fCalcHeightPos); +} +FX_BOOL CXFA_FFNotify::RunScript(CXFA_Node* pScript, CXFA_Node* pFormItem) +{ + FX_BOOL bRet = FALSE; + CXFA_FFDocView* pDocView = m_pDoc->GetDocView(); + if (!pDocView) { + return bRet; + } + CXFA_WidgetAcc* pWidgetAcc = (CXFA_WidgetAcc*)pFormItem->GetWidgetData(); + if (!pWidgetAcc) { + return bRet; + } + CXFA_EventParam EventParam; + EventParam.m_eType = XFA_EVENT_Unknown; + FXJSE_HVALUE pRetValue = NULL; + FX_INT32 iRet = pWidgetAcc->ExecuteScript(CXFA_Script(pScript), &EventParam, &pRetValue); + if (iRet == XFA_EVENTERROR_Sucess && pRetValue) { + bRet = FXJSE_Value_ToBoolean(pRetValue); + FXJSE_Value_Release(pRetValue); + } + return bRet; +} +FX_INT32 CXFA_FFNotify::ExecEventByDeepFirst(CXFA_Node* pFormNode, XFA_EVENTTYPE eEventType, FX_BOOL bIsFormReady, FX_BOOL bRecursive, CXFA_WidgetAcc* pExclude) +{ + CXFA_FFDocView* pDocView = m_pDoc->GetDocView(); + if (!pDocView) { + return XFA_EVENTERROR_NotExist; + } + return pDocView->ExecEventActivityByDeepFirst(pFormNode, eEventType, bIsFormReady, bRecursive, pExclude ? pExclude->GetNode() : NULL); +} +void CXFA_FFNotify::AddCalcValidate(CXFA_Node* pNode) +{ + CXFA_FFDocView* pDocView = m_pDoc->GetDocView(); + if (!pDocView) { + return; + } + CXFA_WidgetAcc* pWidgetAcc = (CXFA_WidgetAcc*)pNode->GetWidgetData(); + if (!pWidgetAcc) { + return; + } + pDocView->AddCalculateWidgetAcc(pWidgetAcc); + pDocView->AddValidateWidget(pWidgetAcc); +} +XFA_HDOC CXFA_FFNotify::GetHDOC() +{ + return (XFA_HDOC)m_pDoc; +} +IXFA_DocProvider* CXFA_FFNotify::GetDocProvider() +{ + return m_pDoc->GetDocProvider(); +} +IXFA_AppProvider* CXFA_FFNotify::GetAppProvider() +{ + return m_pDoc->GetApp()->GetAppProvider(); +} +IXFA_WidgetHandler* CXFA_FFNotify::GetWidgetHandler() +{ + CXFA_FFDocView* pDocView = m_pDoc->GetDocView(); + return pDocView ? pDocView->GetWidgetHandler() : NULL; +} +XFA_HWIDGET CXFA_FFNotify::GetHWidget(CXFA_LayoutItem* pLayoutItem) +{ + return (XFA_HWIDGET)XFA_GetWidgetFromLayoutItem(pLayoutItem); +} +void CXFA_FFNotify::OpenDropDownList(XFA_HWIDGET hWidget) +{ + CXFA_FFWidget* pWidget = (CXFA_FFWidget*)hWidget; + if (pWidget->GetDataAcc()->GetUIType() != XFA_ELEMENT_ChoiceList) { + return; + } + CXFA_FFDocView* pDocView = m_pDoc->GetDocView(); + pDocView->LockUpdate(); + ((CXFA_FFComboBox*)pWidget)->OpenDropDownList(); + pDocView->UnlockUpdate(); + pDocView->UpdateDocView(); +} +CFX_WideString CXFA_FFNotify::GetCurrentDateTime() +{ + CFX_Unitime dataTime; + dataTime.Now(); + CFX_WideString wsDateTime; + wsDateTime.Format((FX_LPCWSTR)L"%d%02d%02dT%02d%02d%02d", dataTime.GetYear(), dataTime.GetMonth(), dataTime.GetDay(), dataTime.GetHour(), dataTime.GetMinute(), dataTime.GetSecond()); + return wsDateTime; +} +void CXFA_FFNotify::ResetData(CXFA_WidgetData* pWidgetData) +{ + CXFA_FFDocView* pDocView = m_pDoc->GetDocView(); + if (!pDocView) { + return; + } + pDocView->ResetWidgetData((CXFA_WidgetAcc*)pWidgetData); +} +FX_INT32 CXFA_FFNotify::GetLayoutStatus() +{ + CXFA_FFDocView* pDocView = m_pDoc->GetDocView(); + return pDocView ? pDocView->GetLayoutStatus() : 0; +} +void CXFA_FFNotify::RunNodeInitialize(CXFA_Node* pNode) +{ + CXFA_FFDocView* pDocView = m_pDoc->GetDocView(); + if (!pDocView) { + return; + } + pDocView->AddNewFormNode(pNode); +} +void CXFA_FFNotify::RunSubformIndexChange(CXFA_Node* pSubformNode) +{ + CXFA_FFDocView* pDocView = m_pDoc->GetDocView(); + if (!pDocView) { + return; + } + pDocView->AddIndexChangedSubform(pSubformNode); +} +CXFA_Node* CXFA_FFNotify::GetFocusWidgetNode() +{ + CXFA_FFDocView* pDocView = m_pDoc->GetDocView(); + if (!pDocView) { + return NULL; + } + CXFA_WidgetAcc* pAcc = pDocView->GetFocusWidgetAcc(); + return pAcc ? pAcc->GetNode() : NULL; +} +void CXFA_FFNotify::SetFocusWidgetNode(CXFA_Node* pNode) +{ + CXFA_FFDocView* pDocView = m_pDoc->GetDocView(); + if (!pDocView) { + return; + } + CXFA_WidgetAcc* pAcc = pNode ? (CXFA_WidgetAcc*)pNode->GetWidgetData() : NULL; + pDocView->SetFocusWidgetAcc(pAcc); +} +void CXFA_FFNotify::OnNodeReady(CXFA_Node *pNode) +{ + CXFA_FFDocView* pDocView = m_pDoc->GetDocView(); + if (!pDocView) { + return; + } + XFA_ELEMENT iType = pNode->GetClassID(); + if (XFA_IsCreateWidget(iType)) { + CXFA_WidgetAcc* pAcc = FX_NEW CXFA_WidgetAcc(pDocView, (CXFA_Node*)pNode); + pNode->SetObject(XFA_ATTRIBUTE_WidgetData, pAcc, &gs_XFADeleteWidgetAcc); + return; + } + switch (iType) { + case XFA_ELEMENT_BindItems: + pDocView->m_bindItems.Add(pNode); + break; + case XFA_ELEMENT_Validate: { + pNode->SetFlag(XFA_NODEFLAG_NeedsInitApp, TRUE, FALSE); + } + break; + default: + break; + } +} +void CXFA_FFNotify::OnValueChanging(CXFA_Node *pSender, FX_LPVOID pParam, FX_LPVOID pParam2) +{ + CXFA_FFDocView* pDocView = m_pDoc->GetDocView(); + if (!pDocView) { + return; + } + if (pDocView->GetLayoutStatus() < XFA_DOCVIEW_LAYOUTSTATUS_End) { + return; + } + FX_DWORD dwPacket = pSender->GetPacketID(); + if (dwPacket & XFA_XDPPACKET_Datasets) { + } else if (pSender->IsFormContainer()) { + XFA_ATTRIBUTE eAttr = (XFA_ATTRIBUTE)(FX_UINTPTR)pParam; + if (eAttr == XFA_ATTRIBUTE_Presence) { + CXFA_WidgetAcc* pWidgetAcc = (CXFA_WidgetAcc*)pSender->GetWidgetData(); + if (!pWidgetAcc) { + return; + } + CXFA_FFWidget* pWidget = NULL; + while ((pWidget = pWidgetAcc->GetNextWidget(pWidget)) != NULL) { + if (pWidget->IsLoaded()) { + pWidget->AddInvalidateRect(); + } + } + } + } +} +void CXFA_FFNotify::OnValueChanged(CXFA_Node *pSender, FX_LPVOID pParam, FX_LPVOID pParam2, FX_LPVOID pParam3, FX_LPVOID pParam4) +{ + CXFA_FFDocView* pDocView = m_pDoc->GetDocView(); + if (!pDocView) { + return; + } + FX_DWORD dwPacket = pSender->GetPacketID(); + XFA_ATTRIBUTE eAttr = (XFA_ATTRIBUTE)(FX_UINTPTR)pParam; + if (dwPacket & XFA_XDPPACKET_Form) { + CXFA_Node* pParentNode = (CXFA_Node*)pParam3; + CXFA_Node* pWidgetNode = (CXFA_Node*)pParam4; + XFA_ELEMENT ePType = pParentNode->GetClassID(); + FX_BOOL bIsContainerNode = pParentNode->IsContainerNode(); + CXFA_WidgetAcc* pWidgetAcc = (CXFA_WidgetAcc*)pWidgetNode->GetWidgetData(); + if (!pWidgetAcc) { + return; + } + FX_BOOL bUpdateProperty = FALSE; + pDocView->SetChangeMark(); + switch (ePType) { + case XFA_ELEMENT_Caption: { + CXFA_TextLayout* pCapOut = pWidgetAcc->GetCaptionTextLayout(); + if (!pCapOut) { + return; + } + pCapOut->Unload(); + } + break; + case XFA_ELEMENT_Ui: + case XFA_ELEMENT_Para: + bUpdateProperty = TRUE; + break; + case XFA_ELEMENT_Font: + case XFA_ELEMENT_Margin: + case XFA_ELEMENT_Value: + case XFA_ELEMENT_Items: + break; + default: + break; + } + if (bIsContainerNode && eAttr == XFA_ATTRIBUTE_Access) { + bUpdateProperty = TRUE; + FX_BOOL bNotify = pDocView->IsStaticNotify(); + if (bNotify) { + pWidgetAcc->NotifyEvent(XFA_WIDGETEVENT_AccessChanged, NULL, pParam2, NULL); + } + } + if (eAttr == XFA_ATTRIBUTE_Value) { + pDocView->AddCalculateNodeNotify(pSender); + if (ePType == XFA_ELEMENT_Value || bIsContainerNode) { + FX_BOOL bNotify = pDocView->IsStaticNotify(); + if (bIsContainerNode) { + pWidgetAcc->UpdateUIDisplay(); + pDocView->AddCalculateWidgetAcc(pWidgetAcc); + pDocView->AddValidateWidget(pWidgetAcc); + } else if (pWidgetNode->GetNodeItem(XFA_NODEITEM_Parent)->GetClassID() == XFA_ELEMENT_ExclGroup) { + pWidgetAcc->UpdateUIDisplay(); + } + if (bNotify) { + pWidgetAcc->NotifyEvent(XFA_WIDGETEVENT_PostContentChanged, NULL, NULL, NULL); + } + return; + } + } + CXFA_FFWidget* pWidget = NULL; + while ((pWidget = pWidgetAcc->GetNextWidget(pWidget)) != NULL) { + if (!pWidget->IsLoaded()) { + continue; + } + if (bUpdateProperty) { + pWidget->UpdateWidgetProperty(); + } + pWidget->LayoutWidget(); + pWidget->AddInvalidateRect(); + } + } else { + if (eAttr == XFA_ATTRIBUTE_Value) { + pDocView->AddCalculateNodeNotify(pSender); + } + } +} +void CXFA_FFNotify::OnChildAdded(CXFA_Node *pSender, FX_LPVOID pParam, FX_LPVOID pParam2) +{ + if (!pSender->IsFormContainer()) { + return; + } + CXFA_FFDocView* pDocView = m_pDoc->GetDocView(); + if (!pDocView) { + return; + } + FX_BOOL bLayoutReady = !(pDocView->m_bInLayoutStatus) && (pDocView->GetLayoutStatus() >= XFA_DOCVIEW_LAYOUTSTATUS_End); + if (bLayoutReady) { + m_pDoc->GetDocProvider()->SetChangeMark((XFA_HDOC)m_pDoc); + } +} +void CXFA_FFNotify::OnChildRemoved(CXFA_Node *pSender, FX_LPVOID pParam, FX_LPVOID pParam2) +{ + if (CXFA_FFDocView* pDocView = m_pDoc->GetDocView()) { + FX_BOOL bLayoutReady = !(pDocView->m_bInLayoutStatus) && (pDocView->GetLayoutStatus() >= XFA_DOCVIEW_LAYOUTSTATUS_End); + if (bLayoutReady) { + m_pDoc->GetDocProvider()->SetChangeMark((XFA_HDOC)m_pDoc); + } + } +} +void CXFA_FFNotify::OnLayoutItemAdd(CXFA_FFDocView* pDocView, IXFA_DocLayout *pLayout, CXFA_LayoutItem *pSender, FX_LPVOID pParam, FX_LPVOID pParam2) +{ + CXFA_FFWidget* pWidget = (CXFA_FFWidget*)(CXFA_ContentLayoutItemImpl*)pSender; + FX_INT32 iPageIdx = (FX_INT32)(FX_UINTPTR)pParam; + IXFA_PageView* pNewPageView = pDocView->GetPageView(iPageIdx); + FX_DWORD dwStatus = (FX_DWORD)(FX_UINTPTR)pParam2; + FX_DWORD dwFilter = XFA_WIDGETSTATUS_Visible | XFA_WIDGETSTATUS_Viewable | XFA_WIDGETSTATUS_Printable; + pWidget->ModifyStatus(dwStatus, dwFilter); + if (pDocView->GetLayoutStatus() >= XFA_DOCVIEW_LAYOUTSTATUS_End) { + IXFA_PageView* pPrePageView = pWidget->GetPageView(); + if (pPrePageView != pNewPageView || (dwStatus & (XFA_WIDGETSTATUS_Visible | XFA_WIDGETSTATUS_Viewable)) == (XFA_WIDGETSTATUS_Visible | XFA_WIDGETSTATUS_Viewable)) { + pWidget->SetPageView(pNewPageView); + m_pDoc->GetDocProvider()->WidgetEvent((XFA_HWIDGET)pWidget, pWidget->GetDataAcc(), XFA_WIDGETEVENT_PostAdded, pNewPageView, pPrePageView); + } + if ((dwStatus & XFA_WIDGETSTATUS_Visible) == 0) { + return; + } + if (pWidget->IsLoaded()) { + CFX_RectF rtOld; + pWidget->GetWidgetRect(rtOld); + CFX_RectF rtNew = pWidget->ReCacheWidgetRect(); + if(rtOld != rtNew) { + pWidget->LayoutWidget(); + } + } else { + pWidget->LoadWidget(); + } + pWidget->AddInvalidateRect(NULL); + } else { + pWidget->SetPageView(pNewPageView); + } +} +void CXFA_FFNotify::OnLayoutItemRemoving(CXFA_FFDocView* pDocView, IXFA_DocLayout *pLayout, CXFA_LayoutItem *pSender, FX_LPVOID pParam, FX_LPVOID pParam2) +{ + CXFA_FFWidget* pWidget = (CXFA_FFWidget*)pSender; + pDocView->DeleteLayoutItem(pWidget); + if (pDocView->GetLayoutStatus() < XFA_DOCVIEW_LAYOUTSTATUS_End) { + return; + } + m_pDoc->GetDocProvider()->WidgetEvent((XFA_HWIDGET)pWidget, pWidget->GetDataAcc(), XFA_WIDGETEVENT_PreRemoved, NULL, NULL); + pWidget->AddInvalidateRect(NULL); +} +void CXFA_FFNotify::OnLayoutItemRectChanged(CXFA_FFDocView* pDocView, IXFA_DocLayout *pLayout, CXFA_LayoutItem *pSender, FX_LPVOID pParam, FX_LPVOID pParam2) +{ +} +void CXFA_FFNotify::OnLayoutItemStatustChanged(CXFA_FFDocView* pDocView, IXFA_DocLayout *pLayout, CXFA_LayoutItem *pSender, FX_LPVOID pParam, FX_LPVOID pParam2) +{ + CXFA_FFWidget* pWidget = (CXFA_FFWidget*)(CXFA_ContentLayoutItemImpl*)pSender; + if (!pWidget) { + return; + } + FX_DWORD dwStatus = (FX_DWORD)(FX_UINTPTR)pParam; + if (dwStatus == 0) { + CXFA_LayoutItem* pPreItem = pSender->GetPrev(); + if (pPreItem) { + CXFA_FFWidget* pPreWidget = (CXFA_FFWidget*)(CXFA_ContentLayoutItemImpl*)pPreItem; + if (pPreWidget) { + dwStatus = pPreWidget->GetStatus(); + } + } + } + FX_DWORD dwOldStatus = pWidget->GetStatus(); + FX_DWORD dwFilter = XFA_WIDGETSTATUS_Visible | XFA_WIDGETSTATUS_Viewable | XFA_WIDGETSTATUS_Printable; + if ((dwOldStatus & dwFilter) == dwStatus) { + return; + } + pWidget->ModifyStatus(dwStatus, dwFilter); +} diff --git a/xfa/src/fxfa/src/app/xfa_ffnotify.h b/xfa/src/fxfa/src/app/xfa_ffnotify.h new file mode 100644 index 0000000000..dd2b80ed29 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffnotify.h @@ -0,0 +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 + +#ifndef _FXFA_FFNOTIFY_H_ +#define _FXFA_FFNOTIFY_H_ +class CXFA_FFNotify : public IXFA_Notify, public CFX_Object +{ +public: + CXFA_FFNotify(CXFA_FFDoc* pDoc); + ~CXFA_FFNotify(); + + virtual void OnPageEvent(IXFA_LayoutPage *pSender, XFA_PAGEEVENT eEvent, FX_LPVOID pParam = NULL); + + virtual void OnNodeEvent(CXFA_Node *pSender, XFA_NODEEVENT eEvent, FX_LPVOID pParam = NULL, FX_LPVOID pParam2 = NULL, FX_LPVOID pParam3 = NULL, FX_LPVOID pParam4 = NULL); + virtual void OnWidgetDataEvent(CXFA_WidgetData* pSender, FX_DWORD dwEvent, FX_LPVOID pParam = NULL, FX_LPVOID pAdditional = NULL, FX_LPVOID pAdditional2 = NULL); + virtual CXFA_LayoutItem* OnCreateLayoutItem(CXFA_Node *pNode); + virtual void OnLayoutEvent(IXFA_DocLayout *pLayout, CXFA_LayoutItem *pSender, XFA_LAYOUTEVENT eEvent, FX_LPVOID pParam = NULL, FX_LPVOID pParam2 = NULL); + + virtual void StartFieldDrawLayout(CXFA_Node *pItem, FX_FLOAT &fCalcWidth, FX_FLOAT &fCalcHeight); + virtual FX_BOOL FindSplitPos(CXFA_Node *pItem, FX_INT32 iBlockIndex, FX_FLOAT &fCalcHeightPos); + virtual FX_BOOL RunScript(CXFA_Node* pScript, CXFA_Node* pFormItem); + virtual FX_INT32 ExecEventByDeepFirst(CXFA_Node* pFormNode, XFA_EVENTTYPE eEventType, FX_BOOL bIsFormReady = FALSE, FX_BOOL bRecursive = TRUE, CXFA_WidgetAcc * pExclude = NULL); + virtual void AddCalcValidate(CXFA_Node* pNode); + virtual XFA_HDOC GetHDOC(); + virtual IXFA_DocProvider* GetDocProvider(); + virtual IXFA_AppProvider* GetAppProvider(); + virtual IXFA_WidgetHandler* GetWidgetHandler(); + virtual XFA_HWIDGET GetHWidget(CXFA_LayoutItem* pLayoutItem); + virtual void OpenDropDownList(XFA_HWIDGET hWidget); + virtual CFX_WideString GetCurrentDateTime(); + virtual void ResetData(CXFA_WidgetData* pWidgetData = NULL); + virtual FX_INT32 GetLayoutStatus(); + virtual void RunNodeInitialize(CXFA_Node* pNode); + virtual void RunSubformIndexChange(CXFA_Node* pSubformNode); + virtual CXFA_Node* GetFocusWidgetNode(); + virtual void SetFocusWidgetNode(CXFA_Node* pNode); +protected: + void OnNodeReady(CXFA_Node *pNode); + void OnValueChanging(CXFA_Node *pSender, FX_LPVOID pParam, FX_LPVOID pParam2); + void OnValueChanged(CXFA_Node *pSender, FX_LPVOID pParam, FX_LPVOID pParam2, FX_LPVOID pParam3, FX_LPVOID pParam4); + void OnChildAdded(CXFA_Node *pSender, FX_LPVOID pParam, FX_LPVOID pParam2); + void OnChildRemoved(CXFA_Node *pSender, FX_LPVOID pParam, FX_LPVOID pParam2); + void OnLayoutItemAdd(CXFA_FFDocView* pDocView, IXFA_DocLayout *pLayout, CXFA_LayoutItem *pSender, FX_LPVOID pParam, FX_LPVOID pParam2); + void OnLayoutItemRemoving(CXFA_FFDocView* pDocView, IXFA_DocLayout *pLayout, CXFA_LayoutItem *pSender, FX_LPVOID pParam, FX_LPVOID pParam2); + void OnLayoutItemRectChanged(CXFA_FFDocView* pDocView, IXFA_DocLayout *pLayout, CXFA_LayoutItem *pSender, FX_LPVOID pParam, FX_LPVOID pParam2); + void OnLayoutItemStatustChanged(CXFA_FFDocView* pDocView, IXFA_DocLayout *pLayout, CXFA_LayoutItem *pSender, FX_LPVOID pParam, FX_LPVOID pParam2); + CXFA_FFDoc* m_pDoc; +}; +#endif diff --git a/xfa/src/fxfa/src/app/xfa_ffpageview.cpp b/xfa/src/fxfa/src/app/xfa_ffpageview.cpp new file mode 100644 index 0000000000..ec591adb72 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffpageview.cpp @@ -0,0 +1,428 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_common.h" +#include "xfa_fwladapter.h" +#include "xfa_ffpageview.h" +#include "xfa_ffwidget.h" +#include "xfa_ffdoc.h" +#include "xfa_ffdocview.h" +#include "xfa_fffield.h" +#include "xfa_ffpushbutton.h" +#include "xfa_ffcheckbutton.h" +#include "xfa_ffchoicelist.h" +#include "xfa_ffimageedit.h" +#include "xfa_fftextedit.h" +CXFA_FFPageView::CXFA_FFPageView(CXFA_FFDocView* pDocView, CXFA_Node* pPageArea) + : CXFA_ContainerLayoutItemImpl(pPageArea) + , m_pDocView(pDocView) + , m_bLoaded(FALSE) +{ +} +CXFA_FFPageView::~CXFA_FFPageView() +{ +} +IXFA_DocView* CXFA_FFPageView::GetDocView() +{ + return m_pDocView; +} +FX_INT32 CXFA_FFPageView::GetPageViewIndex() +{ + return GetLayoutPage()->GetPageIndex(); +} +void CXFA_FFPageView::GetPageViewRect(CFX_RectF &rtPage) +{ + CFX_SizeF sz; + GetLayoutPage()->GetPageSize(sz); + rtPage.Set(0, 0, sz); +} +void CXFA_FFPageView::GetDisplayMatrix(CFX_Matrix &mt, const CFX_Rect &rtDisp, FX_INT32 iRotate) +{ + CFX_SizeF sz; + GetLayoutPage()->GetPageSize(sz); + CFX_RectF fdePage; + fdePage.Set(0, 0, sz.x, sz.y); + FDE_GetPageMatrix(mt, fdePage, rtDisp, iRotate, 0); +} +FX_INT32 CXFA_FFPageView::LoadPageView(IFX_Pause *pPause ) +{ + if (m_bLoaded) { + return 100; + } + m_bLoaded = TRUE; + return 100; +} +void CXFA_FFPageView::UnloadPageView() +{ + if (!m_bLoaded) { + return; + } +} +FX_BOOL CXFA_FFPageView::IsPageViewLoaded() +{ + return m_bLoaded; +} +XFA_HWIDGET CXFA_FFPageView::GetWidgetByPos(FX_FLOAT fx, FX_FLOAT fy) +{ + if (!m_bLoaded) { + return NULL; + } + IXFA_WidgetIterator* pIterator = CreateWidgetIterator(); + while (CXFA_FFWidget* pWidget = (CXFA_FFWidget*)pIterator->MoveToNext()) { + if (!(pWidget->GetStatus() & XFA_WIDGETSTATUS_Visible)) { + continue; + } + CXFA_WidgetAcc* pAcc = pWidget->GetDataAcc(); + FX_INT32 type = pAcc->GetClassID(); + if (type != XFA_ELEMENT_Field && type != XFA_ELEMENT_Draw) { + continue; + } + FX_FLOAT fWidgetx = fx, fWidgety = fy; + pWidget->Rotate2Normal(fWidgetx, fWidgety); + FX_DWORD dwFlag = pWidget->OnHitTest(fWidgetx, fWidgety); + if (( FWL_WGTHITTEST_Client == dwFlag + || FWL_WGTHITTEST_Transparent == dwFlag)) { + pIterator->Release(); + return (XFA_HWIDGET)pWidget; + } + } + pIterator->Release(); + return NULL; +} +IXFA_WidgetIterator* CXFA_FFPageView::CreateWidgetIterator(FX_DWORD dwTraverseWay , + FX_DWORD dwWidgetFilter ) +{ + switch (dwTraverseWay) { + case XFA_TRAVERSEWAY_Tranvalse: + return FX_NEW CXFA_FFTabOrderPageWidgetIterator(this, dwWidgetFilter); + case XFA_TRAVERSEWAY_Form: + return FX_NEW CXFA_FFPageWidgetIterator(this, dwWidgetFilter); + } + return NULL; +} +static FX_BOOL XFA_PageWidgetFilter(CXFA_FFWidget* pWidget, FX_DWORD dwFilter, FX_BOOL bTraversal, FX_BOOL bIgnorerelevant) +{ + CXFA_WidgetAcc* pWidgetAcc = pWidget->GetDataAcc(); + FX_DWORD dwType = dwFilter & XFA_WIDGETFILTER_AllType; + if ((dwType == XFA_WIDGETFILTER_Field) && (pWidgetAcc->GetClassID() != XFA_ELEMENT_Field)) { + return FALSE; + } + FX_DWORD dwStatus = pWidget->GetStatus(); + if (bTraversal && (dwStatus & XFA_WIDGETSTATUS_Disabled)) { + return FALSE; + } + if (bIgnorerelevant) { + return (dwStatus & XFA_WIDGETFILTER_Visible) != 0; + } + dwFilter &= (XFA_WIDGETFILTER_Visible | XFA_WIDGETFILTER_Viewable | XFA_WIDGETFILTER_Printable); + return (dwFilter & dwStatus) == dwFilter; +} +CXFA_FFPageWidgetIterator::CXFA_FFPageWidgetIterator(CXFA_FFPageView* pPageView, FX_DWORD dwFilter) +{ + m_pPageView = pPageView; + m_dwFilter = dwFilter; + m_sIterator.Init((CXFA_LayoutItem*)pPageView->GetLayoutPage()); + m_bIgnorerelevant = ((CXFA_FFDoc*)m_pPageView->GetDocView()->GetDoc())->GetXFADoc()->GetCurVersionMode() < XFA_VERSION_205; +} +CXFA_FFPageWidgetIterator::~CXFA_FFPageWidgetIterator() +{ +} +void CXFA_FFPageWidgetIterator::Reset() +{ + m_sIterator.Reset(); +} +XFA_HWIDGET CXFA_FFPageWidgetIterator::MoveToFirst() +{ + m_sIterator.Reset(); + for(CXFA_LayoutItem* pLayoutItem = m_sIterator.GetCurrent(); pLayoutItem; pLayoutItem = m_sIterator.MoveToNext()) { + if (XFA_HWIDGET hWidget = GetWidget(pLayoutItem)) { + return hWidget; + } + } + return NULL; +} +XFA_HWIDGET CXFA_FFPageWidgetIterator::MoveToLast() +{ + m_sIterator.SetCurrent(NULL); + return MoveToPrevious(); +} +XFA_HWIDGET CXFA_FFPageWidgetIterator::MoveToNext() +{ + for(CXFA_LayoutItem* pLayoutItem = m_sIterator.MoveToNext(); pLayoutItem; pLayoutItem = m_sIterator.MoveToNext()) { + if (XFA_HWIDGET hWidget = GetWidget(pLayoutItem)) { + return hWidget; + } + } + return NULL; +} +XFA_HWIDGET CXFA_FFPageWidgetIterator::MoveToPrevious() +{ + for(CXFA_LayoutItem* pLayoutItem = m_sIterator.MoveToPrev(); pLayoutItem; pLayoutItem = m_sIterator.MoveToPrev()) { + if (XFA_HWIDGET hWidget = GetWidget(pLayoutItem)) { + return hWidget; + } + } + return NULL; +} +XFA_HWIDGET CXFA_FFPageWidgetIterator::GetCurrentWidget() +{ + CXFA_LayoutItem* pLayoutItem = m_sIterator.GetCurrent(); + return pLayoutItem ? (XFA_HWIDGET)XFA_GetWidgetFromLayoutItem(pLayoutItem) : NULL; +} +FX_BOOL CXFA_FFPageWidgetIterator::SetCurrentWidget(XFA_HWIDGET hWidget) +{ + if(hWidget && m_sIterator.SetCurrent(((CXFA_FFWidget*)hWidget)->GetLayoutItem())) { + return TRUE; + } + return FALSE; +} +XFA_HWIDGET CXFA_FFPageWidgetIterator::GetWidget(CXFA_LayoutItem* pLayoutItem) +{ + if (CXFA_FFWidget* pWidget = XFA_GetWidgetFromLayoutItem(pLayoutItem)) { + if (!XFA_PageWidgetFilter(pWidget, m_dwFilter, FALSE, m_bIgnorerelevant)) { + return NULL; + } + if (!pWidget->IsLoaded() && (pWidget->GetStatus() & XFA_WIDGETSTATUS_Visible) != 0) { + pWidget->LoadWidget(); + } + return (XFA_HWIDGET)pWidget; + } + return NULL; +} +CXFA_FFTabOrderPageWidgetIterator::CXFA_FFTabOrderPageWidgetIterator(CXFA_FFPageView* pPageView, FX_DWORD dwFilter) + : m_pPageView(pPageView) + , m_dwFilter(dwFilter) + , m_iCurWidget(-1) +{ + m_bIgnorerelevant = ((CXFA_FFDoc*)m_pPageView->GetDocView()->GetDoc())->GetXFADoc()->GetCurVersionMode() < XFA_VERSION_205; + Reset(); +} +CXFA_FFTabOrderPageWidgetIterator::~CXFA_FFTabOrderPageWidgetIterator() +{ +} +void CXFA_FFTabOrderPageWidgetIterator::Release() +{ + delete this; +} +void CXFA_FFTabOrderPageWidgetIterator::Reset() +{ + CreateTabOrderWidgetArray(); + m_iCurWidget = -1; +} +XFA_HWIDGET CXFA_FFTabOrderPageWidgetIterator::MoveToFirst() +{ + if (m_TabOrderWidgetArray.GetSize() > 0) { + for (FX_INT32 i = 0; i < m_TabOrderWidgetArray.GetSize(); i++) { + if (XFA_PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, TRUE, m_bIgnorerelevant)) { + m_iCurWidget = i; + return (XFA_HWIDGET)m_TabOrderWidgetArray[m_iCurWidget]; + } + } + } + return NULL; +} +XFA_HWIDGET CXFA_FFTabOrderPageWidgetIterator::MoveToLast() +{ + if (m_TabOrderWidgetArray.GetSize() > 0) { + for (FX_INT32 i = m_TabOrderWidgetArray.GetSize() - 1; i >= 0; i--) { + if (XFA_PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, TRUE, m_bIgnorerelevant)) { + m_iCurWidget = i; + return (XFA_HWIDGET)m_TabOrderWidgetArray[m_iCurWidget]; + } + } + } + return NULL; +} +XFA_HWIDGET CXFA_FFTabOrderPageWidgetIterator::MoveToNext() +{ + for (FX_INT32 i = m_iCurWidget + 1; i < m_TabOrderWidgetArray.GetSize(); i++) { + if (XFA_PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, TRUE, m_bIgnorerelevant)) { + m_iCurWidget = i; + return (XFA_HWIDGET)m_TabOrderWidgetArray[m_iCurWidget]; + } + } + m_iCurWidget = -1; + return NULL; +} +XFA_HWIDGET CXFA_FFTabOrderPageWidgetIterator::MoveToPrevious() +{ + for (FX_INT32 i = m_iCurWidget - 1; i >= 0; i--) { + if (XFA_PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, TRUE, m_bIgnorerelevant)) { + m_iCurWidget = i; + return (XFA_HWIDGET)m_TabOrderWidgetArray[m_iCurWidget]; + } + } + m_iCurWidget = -1; + return NULL; +} +XFA_HWIDGET CXFA_FFTabOrderPageWidgetIterator::GetCurrentWidget() +{ + if (m_iCurWidget >= 0) { + return (XFA_HWIDGET)m_TabOrderWidgetArray[m_iCurWidget]; + } + return NULL; +} +FX_BOOL CXFA_FFTabOrderPageWidgetIterator::SetCurrentWidget(XFA_HWIDGET hWidget) +{ + FX_INT32 iWidgetIndex = m_TabOrderWidgetArray.Find((CXFA_FFWidget*)hWidget); + if (iWidgetIndex >= 0) { + m_iCurWidget = iWidgetIndex; + return TRUE; + } + return FALSE; +} +CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::GetTraverseWidget(CXFA_FFWidget* pWidget) +{ + CXFA_WidgetAcc* pAcc = pWidget->GetDataAcc(); + CXFA_Node* pTraversal = pAcc->GetNode()->GetChild(0, XFA_ELEMENT_Traversal); + if (pTraversal != NULL) { + CXFA_Node* pTraverse = pTraversal->GetChild(0, XFA_ELEMENT_Traverse); + if (pTraverse != NULL) { + CFX_WideString wsTraverseWidgetName; + if (pTraverse->GetAttribute(XFA_ATTRIBUTE_Ref, wsTraverseWidgetName)) { + return FindWidgetByName(wsTraverseWidgetName, pWidget); + } + } + } + return NULL; +} +CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::FindWidgetByName(FX_WSTR wsWidgetName, CXFA_FFWidget* pRefWidget) +{ + return pRefWidget->GetDocView()->GetWidgetByName(wsWidgetName, pRefWidget); +} +void CXFA_FFTabOrderPageWidgetIterator::CreateTabOrderWidgetArray() +{ + m_TabOrderWidgetArray.RemoveAll(); + CXFA_WidgetArray SpaceOrderWidgetArray; + CreateSpaceOrderWidgetArray(SpaceOrderWidgetArray); + FX_INT32 nWidgetCount = SpaceOrderWidgetArray.GetSize(); + if (nWidgetCount < 1) { + return; + } + CXFA_FFWidget* hWidget = SpaceOrderWidgetArray[0]; + for (; m_TabOrderWidgetArray.GetSize() < nWidgetCount; ) { + if (m_TabOrderWidgetArray.Find(hWidget) < 0) { + m_TabOrderWidgetArray.Add(hWidget); + CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc(); + if (pWidgetAcc->GetUIType() == XFA_ELEMENT_ExclGroup) { + FX_INT32 iWidgetIndex = SpaceOrderWidgetArray.Find(hWidget) + 1; + while (TRUE) { + CXFA_FFWidget* pRadio = SpaceOrderWidgetArray[(iWidgetIndex) % nWidgetCount]; + if (pRadio->GetDataAcc()->GetExclGroup() != pWidgetAcc) { + break; + } + if (m_TabOrderWidgetArray.Find(hWidget) < 0) { + m_TabOrderWidgetArray.Add(pRadio); + } + iWidgetIndex++; + } + } + if (CXFA_FFWidget* hTraverseWidget = GetTraverseWidget(hWidget)) { + hWidget = hTraverseWidget; + continue; + } + } + FX_INT32 iWidgetIndex = SpaceOrderWidgetArray.Find(hWidget); + hWidget = SpaceOrderWidgetArray[(iWidgetIndex + 1) % nWidgetCount]; + } +} +static FX_INT32 XFA_TabOrderWidgetComparator(const void* phWidget1, const void* phWidget2) +{ + CXFA_FFWidget* pWidget1 = (*(CXFA_TabParam**)phWidget1)->m_pWidget; + CXFA_FFWidget* pWidget2 = (*(CXFA_TabParam**)phWidget2)->m_pWidget; + CFX_RectF rt1, rt2; + pWidget1->GetWidgetRect(rt1); + pWidget2->GetWidgetRect(rt2); + FX_FLOAT x1 = rt1.left, y1 = rt1.top, x2 = rt2.left, y2 = rt2.top; + if (y1 < y2 || (y1 - y2 < XFA_FLOAT_PERCISION && x1 < x2)) { + return -1; + } + return 1; +} +void CXFA_FFTabOrderPageWidgetIterator::OrderContainer(CXFA_LayoutItemIterator* sIterator, CXFA_LayoutItem* pContainerItem, CXFA_TabParam* pContainer, FX_BOOL &bCurrentItem, FX_BOOL& bContentArea, FX_BOOL bMarsterPage) +{ + CFX_PtrArray tabParams; + CXFA_LayoutItem* pSearchItem = sIterator->MoveToNext(); + while(pSearchItem) { + FX_BOOL bIsContentLayoutItem = ((CXFA_LayoutItemImpl*)pSearchItem)->IsContentLayoutItem(); + if(!bIsContentLayoutItem) { + bContentArea = TRUE; + pSearchItem = sIterator->MoveToNext(); + continue; + } + if (bMarsterPage && bContentArea) { + break; + } + if (bMarsterPage || bContentArea) { + CXFA_FFWidget* hWidget = GetWidget(pSearchItem); + if (!hWidget) { + pSearchItem = sIterator->MoveToNext(); + continue; + } + if (pContainerItem && (pSearchItem->GetParent() != pContainerItem)) { + bCurrentItem = TRUE; + break; + } + CXFA_TabParam* pParam = FX_NEW CXFA_TabParam; + pParam->m_pWidget = hWidget; + tabParams.Add(pParam); + if (XFA_IsLayoutElement(pSearchItem->GetFormNode()->GetClassID(), TRUE)) { + OrderContainer(sIterator, pSearchItem, pParam, bCurrentItem, bContentArea, bMarsterPage); + } + } + if (bCurrentItem) { + pSearchItem = sIterator->GetCurrent(); + bCurrentItem = FALSE; + } else { + pSearchItem = sIterator->MoveToNext(); + } + } + FX_INT32 iChildren = tabParams.GetSize(); + if (iChildren > 1) { + FXSYS_qsort(tabParams.GetData(), iChildren, sizeof(FX_LPVOID), XFA_TabOrderWidgetComparator); + } + for (FX_INT32 iStart = 0; iStart < iChildren; iStart++) { + CXFA_TabParam* pParam = (CXFA_TabParam*)tabParams[iStart]; + pContainer->m_Children.Add(pParam->m_pWidget); + if (pParam->m_Children.GetSize() > 0) { + pContainer->m_Children.Append(pParam->m_Children); + } + delete pParam; + } + tabParams.RemoveAll(); +} +void CXFA_FFTabOrderPageWidgetIterator::CreateSpaceOrderWidgetArray(CXFA_WidgetArray& WidgetArray) +{ + CXFA_LayoutItemIterator sIterator; + sIterator.Init((CXFA_LayoutItem*)m_pPageView->GetLayoutPage()); + CXFA_TabParam* pParam = FX_NEW CXFA_TabParam; + FX_BOOL bCurrentItem = FALSE; + FX_BOOL bContentArea = FALSE; + OrderContainer(&sIterator, NULL, pParam, bCurrentItem, bContentArea); + if (pParam->m_Children.GetSize() > 0) { + WidgetArray.Append(pParam->m_Children); + } + sIterator.Reset(); + bCurrentItem = FALSE; + bContentArea = FALSE; + pParam->m_Children.RemoveAll(); + OrderContainer(&sIterator, NULL, pParam, bCurrentItem, bContentArea, TRUE); + if (pParam->m_Children.GetSize() > 0) { + WidgetArray.Append(pParam->m_Children); + } + delete pParam; +} +CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::GetWidget(CXFA_LayoutItem* pLayoutItem) +{ + if (CXFA_FFWidget* pWidget = XFA_GetWidgetFromLayoutItem(pLayoutItem)) { + if (!pWidget->IsLoaded() && (pWidget->GetStatus() & XFA_WIDGETSTATUS_Visible)) { + pWidget->LoadWidget(); + } + return pWidget; + } + return NULL; +} diff --git a/xfa/src/fxfa/src/app/xfa_ffpageview.h b/xfa/src/fxfa/src/app/xfa_ffpageview.h new file mode 100644 index 0000000000..3ebe1b9d31 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffpageview.h @@ -0,0 +1,99 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FXFA_FORMFILLER_PAGEVIEW_IMP_H +#define _FXFA_FORMFILLER_PAGEVIEW_IMP_H +class CXFA_FFWidget; +class CXFA_FFDocView; +class CXFA_FFPageView : public CXFA_ContainerLayoutItemImpl, public IXFA_PageView +{ +public: + CXFA_FFPageView(CXFA_FFDocView* pDocView, CXFA_Node* pPageArea); + ~CXFA_FFPageView(); + virtual IXFA_DocView* GetDocView(); + virtual FX_INT32 GetPageViewIndex(); + virtual void GetPageViewRect(CFX_RectF &rtPage); + virtual void GetDisplayMatrix(CFX_Matrix &mt, const CFX_Rect &rtDisp, FX_INT32 iRotate); + virtual FX_INT32 LoadPageView(IFX_Pause *pPause = NULL); + virtual void UnloadPageView(); + FX_BOOL IsPageViewLoaded(); + + virtual XFA_HWIDGET GetWidgetByPos(FX_FLOAT fx, FX_FLOAT fy); + virtual IXFA_WidgetIterator* CreateWidgetIterator(FX_DWORD dwTraverseWay = XFA_TRAVERSEWAY_Form, + FX_DWORD dwWidgetFilter = XFA_WIDGETFILTER_Visible | XFA_WIDGETFILTER_Viewable | XFA_WIDGETFILTER_AllType); + IXFA_LayoutPage* GetLayoutPage() + { + return (IXFA_LayoutPage*)this; + } +protected: + CXFA_FFDocView* m_pDocView; + FX_BOOL m_bLoaded; +}; +typedef CXFA_NodeIteratorTemplate CXFA_LayoutItemIterator; +class CXFA_FFPageWidgetIterator : public IXFA_WidgetIterator, public CFX_Object +{ +public: + CXFA_FFPageWidgetIterator(CXFA_FFPageView* pPageView, FX_DWORD dwFilter); + virtual ~CXFA_FFPageWidgetIterator(); + virtual void Release() + { + delete this; + } + + virtual void Reset(); + virtual XFA_HWIDGET MoveToFirst(); + virtual XFA_HWIDGET MoveToLast(); + virtual XFA_HWIDGET MoveToNext(); + virtual XFA_HWIDGET MoveToPrevious(); + virtual XFA_HWIDGET GetCurrentWidget(); + virtual FX_BOOL SetCurrentWidget(XFA_HWIDGET hWidget); +protected: + XFA_HWIDGET GetWidget(CXFA_LayoutItem* pLayoutItem); + CXFA_FFPageView* m_pPageView; + XFA_HWIDGET m_hCurWidget; + FX_DWORD m_dwFilter; + FX_BOOL m_bIgnorerelevant; + CXFA_LayoutItemIterator m_sIterator; +}; +typedef CFX_ArrayTemplate CXFA_WidgetArray; +class CXFA_TabParam : public CFX_Object +{ +public: + CXFA_TabParam() : m_pWidget(NULL) {} + ~CXFA_TabParam() {} + + CXFA_FFWidget* m_pWidget; + CXFA_WidgetArray m_Children; +}; +class CXFA_FFTabOrderPageWidgetIterator : public IXFA_WidgetIterator, public CFX_Object +{ +public: + CXFA_FFTabOrderPageWidgetIterator(CXFA_FFPageView* pPageView, FX_DWORD dwFilter); + virtual ~CXFA_FFTabOrderPageWidgetIterator(); + + virtual void Release(); + + virtual void Reset(); + virtual XFA_HWIDGET MoveToFirst(); + virtual XFA_HWIDGET MoveToLast(); + virtual XFA_HWIDGET MoveToNext(); + virtual XFA_HWIDGET MoveToPrevious(); + virtual XFA_HWIDGET GetCurrentWidget(); + virtual FX_BOOL SetCurrentWidget(XFA_HWIDGET hWidget); +protected: + CXFA_WidgetArray m_TabOrderWidgetArray; + CXFA_FFPageView* m_pPageView; + FX_DWORD m_dwFilter; + FX_INT32 m_iCurWidget; + FX_BOOL m_bIgnorerelevant; + CXFA_FFWidget* GetTraverseWidget(CXFA_FFWidget* pWidget); + CXFA_FFWidget* FindWidgetByName(FX_WSTR wsWidgetName, CXFA_FFWidget* pRefWidget); + void CreateTabOrderWidgetArray(); + void CreateSpaceOrderWidgetArray(CXFA_WidgetArray& WidgetArray); + CXFA_FFWidget* GetWidget(CXFA_LayoutItem* pLayoutItem); + void OrderContainer(CXFA_LayoutItemIterator* sIterator, CXFA_LayoutItem* pContainerItem, CXFA_TabParam* pContainer, FX_BOOL &bCurrentItem, FX_BOOL& bContentArea, FX_BOOL bMarsterPage = FALSE); +}; +#endif diff --git a/xfa/src/fxfa/src/app/xfa_ffpath.cpp b/xfa/src/fxfa/src/app/xfa_ffpath.cpp new file mode 100644 index 0000000000..2f8b71a50a --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffpath.cpp @@ -0,0 +1,162 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_common.h" +#include "xfa_ffwidget.h" +#include "xfa_ffdraw.h" +#include "xfa_ffpath.h" +#include "xfa_ffpageview.h" +#include "xfa_ffdoc.h" +#include "xfa_ffapp.h" +CXFA_FFLine::CXFA_FFLine(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc) + : CXFA_FFDraw(pPageView, pDataAcc) +{ +} +CXFA_FFLine::~CXFA_FFLine() +{ +} +void CXFA_FFLine::GetRectFromHand(CFX_RectF &rect, FX_INT32 iHand, FX_FLOAT fLineWidth) +{ + FX_FLOAT fHalfWidth = fLineWidth / 2.0f; + if (rect.height < 1.0f) { + switch (iHand) { + case XFA_ATTRIBUTEENUM_Left: + rect.top -= fHalfWidth; + break; + case XFA_ATTRIBUTEENUM_Right: + rect.top += fHalfWidth; + } + } else if (rect.width < 1.0f) { + switch (iHand) { + case XFA_ATTRIBUTEENUM_Left: + rect.left += fHalfWidth; + break; + case XFA_ATTRIBUTEENUM_Right: + rect.left += fHalfWidth; + break; + } + } else { + switch (iHand) { + case XFA_ATTRIBUTEENUM_Left: + rect.Inflate(fHalfWidth, fHalfWidth); + break; + case XFA_ATTRIBUTEENUM_Right: + rect.Deflate(fHalfWidth, fHalfWidth); + break; + } + } +} +void CXFA_FFLine::RenderWidget(CFX_Graphics* pGS, CFX_Matrix* pMatrix , FX_DWORD dwStatus , FX_INT32 iRotate ) +{ + if (!IsMatchVisibleStatus(dwStatus)) { + return; + } + CXFA_Value value = m_pDataAcc->GetFormValue(); + if (!value) { + return; + } + CXFA_Line lineObj = value.GetLine(); + FX_ARGB lineColor = 0xFF000000; + FX_INT32 iStrokeType = 0; + FX_FLOAT fLineWidth = 1.0f; + FX_BOOL bSlope = lineObj.GetSlop(); + FX_INT32 iCap = 0; + CXFA_Edge edge = lineObj.GetEdge(); + if (edge.IsExistInXML()) { + if (edge.GetPresence() != XFA_ATTRIBUTEENUM_Visible) { + return; + } + lineColor = edge.GetColor(); + iStrokeType = edge.GetStrokeType(); + fLineWidth = edge.GetThickness(); + iCap = edge.GetCapType(); + } + CFX_Matrix mtRotate; + GetRotateMatrix(mtRotate); + if (pMatrix) { + mtRotate.Concat(*pMatrix); + } + CFX_RectF rtLine; + GetRectWithoutRotate(rtLine); + if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin()) { + XFA_RectWidthoutMargin(rtLine, mgWidget); + } + GetRectFromHand(rtLine, lineObj.GetHand(), fLineWidth); + CFX_Path linePath; + linePath.Create(); + if (bSlope && rtLine.right() > 0.0f && rtLine.bottom() > 0.0f) { + linePath.AddLine(rtLine.right(), rtLine.top, rtLine.left, rtLine.bottom()); + } else { + linePath.AddLine(rtLine.left, rtLine.top, rtLine.right(), rtLine.bottom()); + } + CFX_Color color(lineColor); + pGS->SaveGraphState(); + pGS->SetLineWidth(fLineWidth, TRUE); + XFA_StrokeTypeSetLineDash(pGS, iStrokeType, iCap); + pGS->SetStrokeColor(&color); + pGS->SetLineCap(XFA_LineCapToFXGE(iCap)); + pGS->StrokePath(&linePath, &mtRotate); + pGS->RestoreGraphState(); +} +CXFA_FFArc::CXFA_FFArc(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc) + : CXFA_FFDraw(pPageView, pDataAcc) +{ +} +CXFA_FFArc::~CXFA_FFArc() +{ +} +void CXFA_FFArc::RenderWidget(CFX_Graphics* pGS, CFX_Matrix* pMatrix , FX_DWORD dwStatus , FX_INT32 iRotate ) +{ + if (!IsMatchVisibleStatus(dwStatus)) { + return; + } + CXFA_Value value = m_pDataAcc->GetFormValue(); + if (!value) { + return; + } + CXFA_Arc arcObj = value.GetArc(); + CFX_Matrix mtRotate; + GetRotateMatrix(mtRotate); + if (pMatrix) { + mtRotate.Concat(*pMatrix); + } + CFX_RectF rtArc; + GetRectWithoutRotate(rtArc); + if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin()) { + XFA_RectWidthoutMargin(rtArc, mgWidget); + } + DrawBorder(pGS, arcObj, rtArc, &mtRotate); +} +CXFA_FFRectangle::CXFA_FFRectangle(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc) + : CXFA_FFDraw(pPageView, pDataAcc) +{ +} +CXFA_FFRectangle::~CXFA_FFRectangle() +{ +} +void CXFA_FFRectangle::RenderWidget(CFX_Graphics* pGS, CFX_Matrix* pMatrix , FX_DWORD dwStatus , FX_INT32 iRotate ) +{ + if (!IsMatchVisibleStatus(dwStatus)) { + return; + } + CXFA_Value value = m_pDataAcc->GetFormValue(); + if (!value) { + return; + } + CXFA_Rectangle rtObj = value.GetRectangle(); + CFX_RectF rect; + GetRectWithoutRotate(rect); + if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin()) { + XFA_RectWidthoutMargin(rect, mgWidget); + } + CFX_Matrix mtRotate; + GetRotateMatrix(mtRotate); + if (pMatrix) { + mtRotate.Concat(*pMatrix); + } + DrawBorder(pGS, rtObj, rect, &mtRotate); +} diff --git a/xfa/src/fxfa/src/app/xfa_ffpath.h b/xfa/src/fxfa/src/app/xfa_ffpath.h new file mode 100644 index 0000000000..08828f3b84 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffpath.h @@ -0,0 +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 _XFA_DRAW_PATH_IMP_H +#define _XFA_DRAW_PATH_IMP_H +class CXFA_FFLine : public CXFA_FFDraw +{ +public: + CXFA_FFLine(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc); + virtual ~CXFA_FFLine(); + virtual void RenderWidget(CFX_Graphics* pGS, CFX_Matrix* pMatrix = NULL, FX_DWORD dwStatus = 0, FX_INT32 iRotate = 0); +private: + void GetRectFromHand(CFX_RectF &rect, FX_INT32 iHand, FX_FLOAT fLineWidth); +}; +class CXFA_FFArc : public CXFA_FFDraw +{ +public: + CXFA_FFArc(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc); + virtual ~CXFA_FFArc(); + virtual void RenderWidget(CFX_Graphics* pGS, CFX_Matrix* pMatrix = NULL, FX_DWORD dwStatus = 0, FX_INT32 iRotate = 0); +}; +class CXFA_FFRectangle : public CXFA_FFDraw +{ +public: + CXFA_FFRectangle(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc); + virtual ~CXFA_FFRectangle(); + virtual void RenderWidget(CFX_Graphics* pGS, CFX_Matrix* pMatrix = NULL, FX_DWORD dwStatus = 0, FX_INT32 iRotate = 0); +}; +#endif diff --git a/xfa/src/fxfa/src/app/xfa_ffpushbutton.cpp b/xfa/src/fxfa/src/app/xfa_ffpushbutton.cpp new file mode 100644 index 0000000000..125cb4f5b7 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffpushbutton.cpp @@ -0,0 +1,252 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_common.h" +#include "xfa_ffwidget.h" +#include "xfa_ffwidgetacc.h" +#include "xfa_fffield.h" +#include "xfa_ffpageview.h" +#include "xfa_ffpushbutton.h" +#include "xfa_textlayout.h" +#include "xfa_ffapp.h" +CXFA_FFPushButton::CXFA_FFPushButton(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc) + : CXFA_FFField(pPageView, pDataAcc) + , m_pRolloverTextLayout(NULL) + , m_pDownTextLayout(NULL) + , m_pDownProvider(NULL) + , m_pRollProvider(NULL) + , m_pOldDelegate(NULL) +{ +} +CXFA_FFPushButton::~CXFA_FFPushButton() +{ + CXFA_FFPushButton::UnloadWidget(); +} +void CXFA_FFPushButton::RenderWidget(CFX_Graphics* pGS, CFX_Matrix* pMatrix , FX_DWORD dwStatus , FX_INT32 iRotate ) +{ + if (!IsMatchVisibleStatus(dwStatus)) { + return; + } + CFX_Matrix mtRotate; + GetRotateMatrix(mtRotate); + if (pMatrix) { + mtRotate.Concat(*pMatrix); + } + CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus); + RenderHighlightCaption(pGS, &mtRotate); + CFX_RectF rtWidget; + GetRectWithoutRotate(rtWidget); + CFX_Matrix mt; + mt.Set(1, 0, 0, 1, rtWidget.left, rtWidget.top); + mt.Concat(mtRotate); + GetApp()->GetWidgetMgrDelegate()->OnDrawWidget(m_pNormalWidget->GetWidget(), pGS, &mt); +} +FX_BOOL CXFA_FFPushButton::LoadWidget() +{ + FXSYS_assert(m_pNormalWidget == NULL); + CFWL_PushButton* pPushButton = CFWL_PushButton::Create(); + if (pPushButton) { + pPushButton->Initialize(); + } + m_pOldDelegate = pPushButton->SetDelegate(this); + m_pNormalWidget = (CFWL_Widget*)pPushButton; + IFWL_Widget* pWidget = m_pNormalWidget->GetWidget(); + m_pNormalWidget->SetPrivateData(pWidget, this, NULL); + IFWL_NoteDriver *pNoteDriver = FWL_GetApp()->GetNoteDriver(); + pNoteDriver->RegisterEventTarget(pWidget, pWidget); + m_pNormalWidget->LockUpdate(); + UpdateWidgetProperty(); + LoadHighlightCaption(); + m_pNormalWidget->UnlockUpdate(); + return CXFA_FFField::LoadWidget(); +} +void CXFA_FFPushButton::UpdateWidgetProperty() +{ + FX_DWORD dwStyleEx = 0; + switch(m_pDataAcc->GetButtonHighlight()) { + case XFA_ATTRIBUTEENUM_Inverted: + dwStyleEx = XFA_FWL_PSBSTYLEEXT_HiliteInverted; + break; + case XFA_ATTRIBUTEENUM_Outline: + dwStyleEx = XFA_FWL_PSBSTYLEEXT_HiliteOutLine; + break; + case XFA_ATTRIBUTEENUM_Push: + dwStyleEx = XFA_FWL_PSBSTYLEEXT_HilitePush; + break; + default: + break; + } + m_pNormalWidget->ModifyStylesEx(dwStyleEx, 0xFFFFFFFF); +} +void CXFA_FFPushButton::UnloadWidget() +{ + if (m_pRolloverTextLayout) { + delete m_pRolloverTextLayout; + m_pRolloverTextLayout = NULL; + } + if (m_pDownTextLayout) { + delete m_pDownTextLayout; + m_pDownTextLayout = NULL; + } + if (m_pDownProvider) { + delete m_pDownProvider; + m_pDownProvider = NULL; + } + if (m_pRollProvider) { + delete m_pRollProvider; + m_pRollProvider = NULL; + } + CXFA_FFField::UnloadWidget(); +} +FX_BOOL CXFA_FFPushButton::LayoutWidget() +{ + CXFA_FFWidget::LayoutWidget(); + CFX_RectF rtWidget; + GetRectWithoutRotate(rtWidget); + m_rtUI = rtWidget; + if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin()) { + XFA_RectWidthoutMargin(rtWidget, mgWidget); + } + CXFA_Caption caption = m_pDataAcc->GetCaption(); + m_rtCaption.Set(rtWidget.left, rtWidget.top, rtWidget.width, rtWidget.height); + if (CXFA_Margin mgCap = caption.GetMargin()) { + XFA_RectWidthoutMargin(m_rtCaption, mgCap); + } + LayoutHighlightCaption(); + SetFWLRect(); + if (m_pNormalWidget) { + m_pNormalWidget->Update(); + } + return TRUE; +} +FX_FLOAT CXFA_FFPushButton::GetLineWidth() +{ + CXFA_Border border = m_pDataAcc->GetBorder(); + if (border.IsExistInXML() && (border.GetPresence() == XFA_ATTRIBUTEENUM_Visible)) { + CXFA_Edge edge = border.GetEdge(0); + return edge.GetThickness(); + } + return 0; +} +FX_ARGB CXFA_FFPushButton::GetLineColor() +{ + return 0xFF000000; +} +FX_ARGB CXFA_FFPushButton::GetFillColor() +{ + return 0xFFFFFFFF; +} +void CXFA_FFPushButton::LoadHighlightCaption() +{ + CXFA_Caption caption = m_pDataAcc->GetCaption(); + if (caption.IsExistInXML() && caption.GetPresence() != XFA_ATTRIBUTEENUM_Hidden) { + { + CFX_WideString wsRollover; + FX_BOOL bRichText; + if (m_pDataAcc->GetButtonRollover(wsRollover, bRichText)) { + if (m_pRollProvider == NULL) { + m_pRollProvider = FX_NEW CXFA_TextProvider(m_pDataAcc, XFA_TEXTPROVIDERTYPE_Rollover); + } + m_pRolloverTextLayout = FX_NEW CXFA_TextLayout(m_pRollProvider); + } + CFX_WideString wsDown; + if (m_pDataAcc->GetButtonDown(wsDown, bRichText)) { + if (m_pDownProvider == NULL) { + m_pDownProvider = FX_NEW CXFA_TextProvider(m_pDataAcc, XFA_TEXTPROVIDERTYPE_Down); + } + m_pDownTextLayout = FX_NEW CXFA_TextLayout(m_pDownProvider); + } + } + } +} +void CXFA_FFPushButton::LayoutHighlightCaption() +{ + CFX_SizeF sz; + sz.Set(m_rtCaption.width, m_rtCaption.height); + LayoutCaption(); + if (m_pRolloverTextLayout) { + m_pRolloverTextLayout->Layout(sz); + } + if (m_pDownTextLayout) { + m_pDownTextLayout->Layout(sz); + } +} +void CXFA_FFPushButton::RenderHighlightCaption(CFX_Graphics* pGS, CFX_Matrix* pMatrix ) +{ + CXFA_TextLayout* pCapTextLayout = m_pDataAcc->GetCaptionTextLayout(); + CXFA_Caption caption = m_pDataAcc->GetCaption(); + if (caption.IsExistInXML() && caption.GetPresence() == XFA_ATTRIBUTEENUM_Visible) { + CFX_RenderDevice* pRenderDevice = pGS->GetRenderDevice(); + CFX_RectF rtWidget; + GetRectWithoutRotate(rtWidget); + CFX_RectF rtClip = m_rtCaption; + rtClip.Intersect(rtWidget); + CFX_Matrix mt; + mt.Set(1, 0, 0, 1, m_rtCaption.left, m_rtCaption.top); + if (pMatrix) { + pMatrix->TransformRect(rtClip); + mt.Concat(*pMatrix); + } + { + FX_DWORD dwState = m_pNormalWidget->GetStates(); + if (m_pDownTextLayout && (dwState & FWL_STATE_PSB_Pressed) && (dwState & FWL_STATE_PSB_Hovered)) { + if (m_pDownTextLayout->DrawString(pRenderDevice, mt, rtClip)) { + return; + } + } else if (m_pRolloverTextLayout && (dwState & FWL_STATE_PSB_Hovered)) { + if (m_pRolloverTextLayout->DrawString(pRenderDevice, mt, rtClip)) { + return; + } + } + } + if (pCapTextLayout) { + pCapTextLayout->DrawString(pRenderDevice, mt, rtClip); + } + } +} +FX_INT32 CXFA_FFPushButton::OnProcessMessage(CFWL_Message *pMessage) +{ + return m_pOldDelegate->OnProcessMessage(pMessage); +} +FWL_ERR CXFA_FFPushButton::OnProcessEvent(CFWL_Event *pEvent) +{ + m_pOldDelegate->OnProcessEvent(pEvent); + return CXFA_FFField::OnProcessEvent(pEvent); +} +FWL_ERR CXFA_FFPushButton::OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + if (m_pNormalWidget->GetStylesEx() & XFA_FWL_PSBSTYLEEXT_HiliteInverted) { + if ((m_pNormalWidget->GetStates() & FWL_STATE_PSB_Pressed) && (m_pNormalWidget->GetStates() & FWL_STATE_PSB_Hovered)) { + CFX_RectF rtFill; + m_pNormalWidget->GetWidgetRect(rtFill); + rtFill.left = rtFill.top = 0; + FX_FLOAT fLineWith = GetLineWidth(); + rtFill.Deflate(fLineWith, fLineWith); + CFX_Color cr(FXARGB_MAKE(128, 128, 255, 255)); + pGraphics->SetFillColor(&cr); + CFX_Path path; + path.Create(); + path.AddRectangle(rtFill.left, rtFill.top, rtFill.width, rtFill.height); + pGraphics->FillPath(&path, FXFILL_WINDING, (CFX_Matrix*)pMatrix); + } + } else if (m_pNormalWidget->GetStylesEx() & XFA_FWL_PSBSTYLEEXT_HiliteOutLine) { + if ((m_pNormalWidget->GetStates() & FWL_STATE_PSB_Pressed) && (m_pNormalWidget->GetStates() & FWL_STATE_PSB_Hovered)) { + FX_FLOAT fLineWidth = GetLineWidth(); + CFX_Color cr(FXARGB_MAKE(255, 128, 255, 255)); + pGraphics->SetStrokeColor(&cr); + pGraphics->SetLineWidth(fLineWidth); + CFX_Path path; + path.Create(); + CFX_RectF rect; + m_pNormalWidget->GetWidgetRect(rect); + path.AddRectangle(0, 0, rect.width, rect.height); + pGraphics->StrokePath(&path, (CFX_Matrix*)pMatrix); + } + } else if (m_pNormalWidget->GetStylesEx() & XFA_FWL_PSBSTYLEEXT_HilitePush) { + } + return FWL_ERR_Succeeded; +} diff --git a/xfa/src/fxfa/src/app/xfa_ffpushbutton.h b/xfa/src/fxfa/src/app/xfa_ffpushbutton.h new file mode 100644 index 0000000000..07503292f5 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffpushbutton.h @@ -0,0 +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 _FXFA_FORMFILLER_PUSHBUTTON_IMP_H +#define _FXFA_FORMFILLER_PUSHBUTTON_IMP_H +#define XFA_FWL_PSBSTYLEEXT_HiliteNone (0L << 0) +#define XFA_FWL_PSBSTYLEEXT_HiliteInverted (1L << 0) +#define XFA_FWL_PSBSTYLEEXT_HilitePush (2L << 0) +#define XFA_FWL_PSBSTYLEEXT_HiliteOutLine (4L << 0) +class CXFA_FFPushButton : public CXFA_FFField +{ +public: + CXFA_FFPushButton(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc); + virtual ~CXFA_FFPushButton(); + virtual void RenderWidget(CFX_Graphics* pGS, CFX_Matrix* pMatrix = NULL, FX_DWORD dwStatus = 0, FX_INT32 iRotate = 0); + virtual FX_BOOL LoadWidget(); + virtual void UnloadWidget(); + virtual FX_BOOL LayoutWidget(); + virtual void UpdateWidgetProperty(); + virtual FX_INT32 OnProcessMessage(CFWL_Message *pMessage); + virtual FWL_ERR OnProcessEvent(CFWL_Event *pEvent); + virtual FWL_ERR OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); +protected: + void LoadHighlightCaption(); + void LayoutHighlightCaption(); + void RenderHighlightCaption(CFX_Graphics* pGS, CFX_Matrix* pMatrix = NULL); + FX_FLOAT GetLineWidth(); + FX_ARGB GetLineColor(); + FX_ARGB GetFillColor(); + CXFA_TextLayout *m_pRolloverTextLayout; + CXFA_TextLayout *m_pDownTextLayout; + CXFA_TextProvider *m_pDownProvider; + CXFA_TextProvider *m_pRollProvider; + IFWL_WidgetDelegate *m_pOldDelegate; +}; +#endif diff --git a/xfa/src/fxfa/src/app/xfa_ffsignature.cpp b/xfa/src/fxfa/src/app/xfa_ffsignature.cpp new file mode 100644 index 0000000000..42b75d60c6 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffsignature.cpp @@ -0,0 +1,129 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_common.h" +#include "xfa_ffwidget.h" +#include "xfa_fffield.h" +#include "xfa_ffpageview.h" +#include "xfa_ffsignature.h" +#include "xfa_ffdoc.h" +CXFA_FFSignature::CXFA_FFSignature(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc) + : CXFA_FFField(pPageView, pDataAcc) +{ +} +CXFA_FFSignature::~CXFA_FFSignature() +{ +} +FX_BOOL CXFA_FFSignature::LoadWidget() +{ + return CXFA_FFField::LoadWidget(); +} +void CXFA_FFSignature::RenderWidget(CFX_Graphics* pGS, CFX_Matrix* pMatrix , FX_DWORD dwStatus , FX_INT32 iRotate ) +{ + if (!IsMatchVisibleStatus(dwStatus)) { + return; + } + CFX_Matrix mtRotate; + GetRotateMatrix(mtRotate); + if (pMatrix) { + mtRotate.Concat(*pMatrix); + } + CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus); + CXFA_Border borderUI = m_pDataAcc->GetUIBorder(); + DrawBorder(pGS, borderUI, m_rtUI, &mtRotate); + RenderCaption(pGS, &mtRotate); + DrawHighlight(pGS, &mtRotate, dwStatus, FALSE); + CFX_RectF rtWidget = m_rtUI; + IXFA_DocProvider* pDocProvider = m_pDataAcc->GetDoc()->GetDocProvider(); + FXSYS_assert(pDocProvider); + pDocProvider->RenderCustomWidget((XFA_HWIDGET)this, pGS, &mtRotate, rtWidget); +} +FX_BOOL CXFA_FFSignature::OnMouseEnter() +{ + return FALSE; +} +FX_BOOL CXFA_FFSignature::OnMouseExit() +{ + return FALSE; +} +FX_BOOL CXFA_FFSignature::OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + return FALSE; +} +FX_BOOL CXFA_FFSignature::OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + return FALSE; +} +FX_BOOL CXFA_FFSignature::OnLButtonDblClk(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + return FALSE; +} +FX_BOOL CXFA_FFSignature::OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + return FALSE; +} +FX_BOOL CXFA_FFSignature::OnMouseWheel(FX_DWORD dwFlags, FX_SHORT zDelta, FX_FLOAT fx, FX_FLOAT fy) +{ + return FALSE; +} +FX_BOOL CXFA_FFSignature::OnRButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + return FALSE; +} +FX_BOOL CXFA_FFSignature::OnRButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + return FALSE; +} +FX_BOOL CXFA_FFSignature::OnRButtonDblClk(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + return FALSE; +} + +FX_BOOL CXFA_FFSignature::OnSetFocus() +{ + return FALSE; +} +FX_BOOL CXFA_FFSignature::OnKillFocus() +{ + return FALSE; +} +FX_BOOL CXFA_FFSignature::OnKeyDown(FX_DWORD dwKeyCode, FX_DWORD dwFlags) +{ + return FALSE; +} +FX_BOOL CXFA_FFSignature::OnKeyUp(FX_DWORD dwKeyCode, FX_DWORD dwFlags) +{ + return FALSE; +} +FX_BOOL CXFA_FFSignature::OnChar(FX_DWORD dwChar, FX_DWORD dwFlags) +{ + return FALSE; +} +FX_DWORD CXFA_FFSignature::OnHitTest(FX_FLOAT fx, FX_FLOAT fy) +{ + if (m_pNormalWidget) { + FX_FLOAT ffx = fx, ffy = fy; + FWLToClient(ffx, ffy); + FX_DWORD dwWidgetHit = m_pNormalWidget->HitTest(ffx, ffy); + if (dwWidgetHit != FWL_WGTHITTEST_Unknown) { + return FWL_WGTHITTEST_Client; + } + } + CFX_RectF rtBox; + GetRectWithoutRotate(rtBox); + if (!rtBox.Contains(fx, fy)) { + return FWL_WGTHITTEST_Unknown; + } + if (m_rtCaption.Contains(fx, fy)) { + return FWL_WGTHITTEST_Titlebar; + } + return FWL_WGTHITTEST_Client; +} +FX_BOOL CXFA_FFSignature::OnSetCursor(FX_FLOAT fx, FX_FLOAT fy) +{ + return FALSE; +} diff --git a/xfa/src/fxfa/src/app/xfa_ffsignature.h b/xfa/src/fxfa/src/app/xfa_ffsignature.h new file mode 100644 index 0000000000..f7848d8b32 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffsignature.h @@ -0,0 +1,37 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FXFA_FORMFILLER_SIGNATURE_IMP_H +#define _FXFA_FORMFILLER_SIGNATURE_IMP_H +class CXFA_FFSignature : public CXFA_FFField +{ +public: + CXFA_FFSignature(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc); + virtual ~CXFA_FFSignature(); + + virtual void RenderWidget(CFX_Graphics* pGS, CFX_Matrix* pMatrix = NULL, FX_DWORD dwStatus = 0, FX_INT32 iRotate = 0); + virtual FX_BOOL LoadWidget(); + virtual FX_BOOL OnMouseEnter(); + virtual FX_BOOL OnMouseExit(); + virtual FX_BOOL OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnLButtonDblClk(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnMouseWheel(FX_DWORD dwFlags, FX_SHORT zDelta, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnRButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnRButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnRButtonDblClk(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + + virtual FX_BOOL OnSetFocus(); + virtual FX_BOOL OnKillFocus(); + virtual FX_BOOL OnKeyDown(FX_DWORD dwKeyCode, FX_DWORD dwFlags); + virtual FX_BOOL OnKeyUp(FX_DWORD dwKeyCode, FX_DWORD dwFlags); + virtual FX_BOOL OnChar(FX_DWORD dwChar, FX_DWORD dwFlags); + virtual FX_DWORD OnHitTest(FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnSetCursor(FX_FLOAT fx, FX_FLOAT fy); +protected: +}; +#endif diff --git a/xfa/src/fxfa/src/app/xfa_ffsubform.cpp b/xfa/src/fxfa/src/app/xfa_ffsubform.cpp new file mode 100644 index 0000000000..c7bfbfbc54 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffsubform.cpp @@ -0,0 +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 + +#include "../../../foxitlib.h" +#include "../common/xfa_common.h" +#include "xfa_ffwidget.h" +#include "xfa_ffsubform.h" +#include "xfa_ffpageview.h" +#include "xfa_ffapp.h" +#include "xfa_ffdoc.h" +CXFA_FFSubForm::CXFA_FFSubForm(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc) + : CXFA_FFWidget(pPageView, pDataAcc) +{ +} +CXFA_FFSubForm::~CXFA_FFSubForm() +{ +} diff --git a/xfa/src/fxfa/src/app/xfa_ffsubform.h b/xfa/src/fxfa/src/app/xfa_ffsubform.h new file mode 100644 index 0000000000..09deef4e31 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffsubform.h @@ -0,0 +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 _FXFA_FORMFILLER_SUBFORM_IMP_H +#define _FXFA_FORMFILLER_SUBFORM_IMP_H +class CXFA_FFSubForm : public CXFA_FFWidget +{ +public: + CXFA_FFSubForm(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc); + virtual ~CXFA_FFSubForm(); + +protected: +}; +#endif diff --git a/xfa/src/fxfa/src/app/xfa_fftext.cpp b/xfa/src/fxfa/src/app/xfa_fftext.cpp new file mode 100644 index 0000000000..8b90a180cd --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_fftext.cpp @@ -0,0 +1,188 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_common.h" +#include "xfa_ffwidget.h" +#include "xfa_ffdraw.h" +#include "xfa_fftext.h" +#include "xfa_textlayout.h" +#include "xfa_ffpageview.h" +#include "xfa_ffdoc.h" +#include "xfa_ffapp.h" +CXFA_FFText::CXFA_FFText(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc) + : CXFA_FFDraw(pPageView, pDataAcc) +{ +} +CXFA_FFText::~CXFA_FFText() +{ +} +void CXFA_FFText::RenderWidget(CFX_Graphics* pGS, CFX_Matrix* pMatrix , FX_DWORD dwStatus , FX_INT32 iRotate ) +{ + if (!IsMatchVisibleStatus(dwStatus)) { + return; + } + { + CFX_Matrix mtRotate; + GetRotateMatrix(mtRotate); + if (pMatrix) { + mtRotate.Concat(*pMatrix); + } + CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus); + CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout(); + if (pTextLayout) { + CFX_RenderDevice* pRenderDevice = pGS->GetRenderDevice(); + CFX_RectF rtText; + GetRectWithoutRotate(rtText); + if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin()) { + CXFA_LayoutItem* pItem = this->GetLayoutItem(); + if (pItem->GetPrev() == NULL && pItem->GetNext() == NULL) { + XFA_RectWidthoutMargin(rtText, mgWidget); + } else { + FX_FLOAT fLeftInset, fRightInset, fTopInset = 0, fBottomInset = 0; + mgWidget.GetLeftInset(fLeftInset); + mgWidget.GetRightInset(fRightInset); + if (pItem->GetPrev() == NULL) { + mgWidget.GetTopInset(fTopInset); + } else if (pItem->GetNext() == NULL) { + mgWidget.GetBottomInset(fBottomInset); + } + rtText.Deflate(fLeftInset, fTopInset, fRightInset, fBottomInset); + } + } + CFX_Matrix mt; + mt.Set(1, 0, 0, 1, rtText.left, rtText.top); + CFX_RectF rtClip = rtText; + mtRotate.TransformRect(rtClip); + mt.Concat(mtRotate); + pTextLayout->DrawString(pRenderDevice, mt, rtClip, this->GetLayoutItem()->GetIndex()); + } + } +} +FX_BOOL CXFA_FFText::IsLoaded() +{ + CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout(); + return pTextLayout != NULL && !pTextLayout->m_bHasBlock; +} +FX_BOOL CXFA_FFText::LayoutWidget() +{ + CXFA_FFDraw::LayoutWidget(); + CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout(); + if (!pTextLayout) { + return FALSE; + } + if (!pTextLayout->m_bHasBlock) { + return TRUE; + } + pTextLayout->m_Blocks.RemoveAll(); + CXFA_LayoutItem* pItem = this->GetLayoutItem(); + if (pItem->GetPrev() == NULL && pItem->GetNext() == NULL) { + return TRUE; + } + pItem = pItem->GetFirst(); + while (pItem) { + CFX_RectF rtText; + pItem->GetRect(rtText); + if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin()) { + if (pItem->GetPrev() == NULL) { + FX_FLOAT fTopInset; + mgWidget.GetTopInset(fTopInset); + rtText.height -= fTopInset; + } else if (pItem->GetNext() == NULL) { + FX_FLOAT fBottomInset; + mgWidget.GetBottomInset(fBottomInset); + rtText.height -= fBottomInset; + } + } + pTextLayout->ItemBlocks(rtText, pItem->GetIndex()); + pItem = pItem->GetNext(); + } + pTextLayout->m_bHasBlock = FALSE; + return TRUE; +} +FX_BOOL CXFA_FFText::OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + CFX_RectF rtBox; + GetRectWithoutRotate(rtBox); + if (!rtBox.Contains(fx, fy)) { + return FALSE; + } + FX_LPCWSTR wsURLContent = GetLinkURLAtPoint(fx, fy); + if (NULL == wsURLContent) { + return FALSE; + } + SetButtonDown(TRUE); + return TRUE; +} +FX_BOOL CXFA_FFText::OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + CFX_RectF rtBox; + GetRectWithoutRotate(rtBox); + if (!rtBox.Contains(fx, fy)) { + return FALSE; + } + FX_LPCWSTR wsURLContent = GetLinkURLAtPoint(fx, fy); + if (NULL == wsURLContent) { + return FALSE; + } + return TRUE; +} +FX_BOOL CXFA_FFText::OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + if (!IsButtonDown()) { + return FALSE; + } + SetButtonDown(FALSE); + FX_LPCWSTR wsURLContent = GetLinkURLAtPoint(fx, fy); + if (NULL == wsURLContent) { + return FALSE; + } + CXFA_FFDoc* pDoc = GetDoc(); + pDoc->GetDocProvider()->GotoURL((XFA_HDOC)pDoc, FX_WSTRC(wsURLContent), FALSE); + return TRUE; +} +FX_DWORD CXFA_FFText::OnHitTest(FX_FLOAT fx, FX_FLOAT fy) +{ + CFX_RectF rtBox; + GetRectWithoutRotate(rtBox); + if (!rtBox.Contains(fx, fy)) { + return FWL_WGTHITTEST_Unknown; + } + FX_LPCWSTR wsURLContent = GetLinkURLAtPoint(fx, fy); + if (NULL == wsURLContent) { + return FWL_WGTHITTEST_Unknown; + } + return FWL_WGTHITTEST_Transparent; +} +FX_LPCWSTR CXFA_FFText::GetLinkURLAtPoint(FX_FLOAT fx, FX_FLOAT fy) +{ + CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout(); + if ( NULL == pTextLayout) { + return NULL; + } + FX_FLOAT x(fx), y(fy); + FWLToClient(x, y); + const CXFA_PieceLineArray* pPieceLines = pTextLayout->GetPieceLines(); + FX_INT32 iCount = pPieceLines->GetSize(); + for (FX_INT32 i = 0; i < iCount; i++) { + CXFA_PieceLine *pPieceLine = pPieceLines->GetAt(i); + FX_INT32 iPieces = pPieceLine->m_textPieces.GetSize(); + for (FX_INT32 j = 0; j < iPieces; j++) { + XFA_LPTEXTPIECE pPiece = pPieceLine->m_textPieces.GetAt(j); + if (pPiece->pLinkData && pPiece->rtPiece.Contains(x, y)) { + return pPiece->pLinkData->GetLinkURL(); + } + } + } + return NULL; +} +void CXFA_FFText::FWLToClient(FX_FLOAT &fx, FX_FLOAT &fy) +{ + CFX_RectF rtWidget; + GetRectWithoutRotate(rtWidget); + fx -= rtWidget.left; + fy -= rtWidget.top; +} diff --git a/xfa/src/fxfa/src/app/xfa_fftext.h b/xfa/src/fxfa/src/app/xfa_fftext.h new file mode 100644 index 0000000000..d686a97f4c --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_fftext.h @@ -0,0 +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 _FXFA_FORMFILLER_DRAWTEXT_IMP_H +#define _FXFA_FORMFILLER_DRAWTEXT_IMP_H +class CXFA_TextLayout; +class CXFA_FFText : public CXFA_FFDraw +{ +public: + CXFA_FFText(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc); + virtual ~CXFA_FFText(); + virtual FX_BOOL OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_DWORD OnHitTest(FX_FLOAT fx, FX_FLOAT fy); + virtual void RenderWidget(CFX_Graphics* pGS, CFX_Matrix* pMatrix = NULL, FX_DWORD dwStatus = 0, FX_INT32 iRotate = 0); + virtual FX_BOOL IsLoaded(); + virtual FX_BOOL LayoutWidget(); +private: + virtual FX_LPCWSTR GetLinkURLAtPoint(FX_FLOAT fx, FX_FLOAT fy); + void FWLToClient(FX_FLOAT &fx, FX_FLOAT &fy); +}; +#endif diff --git a/xfa/src/fxfa/src/app/xfa_fftextedit.cpp b/xfa/src/fxfa/src/app/xfa_fftextedit.cpp new file mode 100644 index 0000000000..a046f25611 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_fftextedit.cpp @@ -0,0 +1,830 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_common.h" +#include "xfa_fwladapter.h" +#include "xfa_ffwidget.h" +#include "xfa_fffield.h" +#include "xfa_ffpageview.h" +#include "xfa_fftextedit.h" +#include "xfa_textlayout.h" +#include "xfa_ffapp.h" +#include "xfa_ffdocview.h" +#include "xfa_ffdoc.h" +CXFA_FFTextEdit::CXFA_FFTextEdit(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc) + : CXFA_FFField(pPageView, pDataAcc) + , m_pOldDelegate(NULL) +{ +} +CXFA_FFTextEdit::~CXFA_FFTextEdit() +{ + if (m_pNormalWidget) { + IFWL_Widget* pWidget = m_pNormalWidget->GetWidget(); + IFWL_NoteDriver *pNoteDriver = FWL_GetApp()->GetNoteDriver(); + pNoteDriver->UnregisterEventTarget(pWidget); + } +} +FX_BOOL CXFA_FFTextEdit::LoadWidget() +{ + CFWL_Edit* pFWLEdit = CFWL_Edit::Create(); + pFWLEdit->Initialize(); + m_pNormalWidget = pFWLEdit; + IFWL_Widget* pWidget = m_pNormalWidget->GetWidget(); + m_pNormalWidget->SetPrivateData(pWidget, this, NULL); + IFWL_NoteDriver *pNoteDriver = FWL_GetApp()->GetNoteDriver(); + pNoteDriver->RegisterEventTarget(pWidget, pWidget); + m_pOldDelegate = m_pNormalWidget->SetDelegate(this); + m_pNormalWidget->LockUpdate(); + UpdateWidgetProperty(); + CFX_WideString wsText; + m_pDataAcc->GetValue(wsText, XFA_VALUEPICTURE_Display); + pFWLEdit->SetText(wsText); + m_pNormalWidget->UnlockUpdate(); + return CXFA_FFField::LoadWidget(); +} +void CXFA_FFTextEdit::UpdateWidgetProperty() +{ + CFWL_Edit* pWidget = (CFWL_Edit*)m_pNormalWidget; + if (!pWidget) { + return; + } + FX_DWORD dwStyle = 0; + FX_DWORD dwExtendedStyle = FWL_STYLEEXT_EDT_ShowScrollbarFocus | FWL_STYLEEXT_EDT_OuterScrollbar | FWL_STYLEEXT_EDT_LastLineHeight; + dwExtendedStyle |= UpdateUIProperty(); + if (m_pDataAcc->IsMultiLine()) { + dwExtendedStyle |= FWL_STYLEEXT_EDT_MultiLine | FWL_STYLEEXT_EDT_WantReturn; + if (m_pDataAcc->GetVerticalScrollPolicy() != XFA_ATTRIBUTEENUM_Off) { + dwStyle |= FWL_WGTSTYLE_VScroll; + dwExtendedStyle |= FWL_STYLEEXT_EDT_AutoVScroll; + } + } else if (m_pDataAcc->GetHorizontalScrollPolicy() != XFA_ATTRIBUTEENUM_Off) { + dwExtendedStyle |= FWL_STYLEEXT_EDT_AutoHScroll; + } + if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open || !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) { + dwExtendedStyle |= FWL_STYLEEXT_EDT_ReadOnly; + dwExtendedStyle |= FWL_STYLEEXT_EDT_MultiLine; + } + XFA_ELEMENT eType = XFA_ELEMENT_UNKNOWN; + FX_INT32 iMaxChars = m_pDataAcc->GetMaxChars(eType); + if (eType == XFA_ELEMENT_ExData) { + iMaxChars = 0; + } + FX_INT32 iNumCells = m_pDataAcc->GetNumberOfCells(); + if (iNumCells == 0) { + dwExtendedStyle |= FWL_STYLEEXT_EDT_CombText; + pWidget->SetLimit(iMaxChars > 0 ? iMaxChars : 1); + } else if (iNumCells > 0) { + dwExtendedStyle |= FWL_STYLEEXT_EDT_CombText; + pWidget->SetLimit(iNumCells); + } else { + pWidget->SetLimit(iMaxChars); + } + dwExtendedStyle |= GetAlignment(); + m_pNormalWidget->ModifyStyles(dwStyle, 0xFFFFFFFF); + m_pNormalWidget->ModifyStylesEx(dwExtendedStyle, 0xFFFFFFFF); +} +FX_BOOL CXFA_FFTextEdit::OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + if (!PtInActiveRect(fx, fy)) { + return FALSE; + } + if (!IsFocused()) { + m_dwStatus |= XFA_WIDGETSTATUS_Focused; + UpdateFWLData(); + AddInvalidateRect(); + } + SetButtonDown(TRUE); + CFWL_MsgMouse ms; + ms.m_dwCmd = FWL_MSGMOUSECMD_LButtonDown; + ms.m_dwFlags = dwFlags; + ms.m_fx = fx; + ms.m_fy = fy; + ms.m_pDstTarget = m_pNormalWidget->m_pImp; + FWLToClient(ms.m_fx, ms.m_fy); + TranslateFWLMessage(&ms); + return TRUE; +} +FX_BOOL CXFA_FFTextEdit::OnRButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open) { + return FALSE; + } + if (!PtInActiveRect(fx, fy)) { + return FALSE; + } + if (!IsFocused()) { + m_dwStatus |= XFA_WIDGETSTATUS_Focused; + UpdateFWLData(); + AddInvalidateRect(); + } + SetButtonDown(TRUE); + CFWL_MsgMouse ms; + ms.m_dwCmd = FWL_MSGMOUSECMD_RButtonDown; + ms.m_dwFlags = dwFlags; + ms.m_fx = fx; + ms.m_fy = fy; + FWLToClient(ms.m_fx, ms.m_fy); + TranslateFWLMessage(&ms); + return TRUE; +} +FX_BOOL CXFA_FFTextEdit::OnRButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + if (!CXFA_FFField::OnRButtonUp(dwFlags, fx, fy)) { + return FALSE; + } + CFX_PointF pt; + pt.Set(fx, fy); + GetDoc()->GetDocProvider()->PopupMenu((XFA_HWIDGET)this, pt, NULL); + return TRUE; +} +FX_BOOL CXFA_FFTextEdit::OnSetFocus(CXFA_FFWidget* pOldWidget) +{ + m_dwStatus &= ~XFA_WIDGETSTATUS_TextEditValueChanged; + if (!IsFocused()) { + m_dwStatus |= XFA_WIDGETSTATUS_Focused; + UpdateFWLData(); + AddInvalidateRect(); + } + CXFA_FFWidget::OnSetFocus(pOldWidget); + CFWL_MsgSetFocus ms; + ms.m_pDstTarget = m_pNormalWidget->m_pImp; + ms.m_pSrcTarget = NULL; + TranslateFWLMessage(&ms); + return TRUE; +} +FX_BOOL CXFA_FFTextEdit::OnKillFocus(CXFA_FFWidget* pNewWidget) +{ + CFWL_MsgKillFocus ms; + ms.m_pDstTarget = m_pNormalWidget->m_pImp; + ms.m_pSrcTarget = NULL; + TranslateFWLMessage(&ms); + m_dwStatus &= ~XFA_WIDGETSTATUS_Focused; + SetEditScrollOffset(); + ProcessCommittedData(); + UpdateFWLData(); + AddInvalidateRect(); + CXFA_FFWidget::OnKillFocus(pNewWidget); + m_dwStatus &= ~XFA_WIDGETSTATUS_TextEditValueChanged; + return TRUE; +} +FX_BOOL CXFA_FFTextEdit::CommitData() +{ + CFX_WideString wsText; + ((CFWL_Edit*)m_pNormalWidget)->GetText(wsText); + if (m_pDataAcc->SetValue(wsText, XFA_VALUEPICTURE_Edit)) { + m_pDataAcc->UpdateUIDisplay(this); + return TRUE; + } + return FALSE; +} +FX_BOOL CXFA_FFTextEdit::IsDataChanged() +{ + return (m_dwStatus & XFA_WIDGETSTATUS_TextEditValueChanged) != 0; +} +FX_DWORD CXFA_FFTextEdit::GetAlignment() +{ + FX_DWORD dwExtendedStyle = 0; + if (CXFA_Para para = m_pDataAcc->GetPara()) { + FX_INT32 iHorz = para.GetHorizontalAlign(); + switch(iHorz) { + case XFA_ATTRIBUTEENUM_Center: + dwExtendedStyle |= FWL_STYLEEXT_EDT_HCenter; + break; + case XFA_ATTRIBUTEENUM_Justify: + dwExtendedStyle |= FWL_STYLEEXT_EDT_Justified; + break; + case XFA_ATTRIBUTEENUM_JustifyAll: + break; + case XFA_ATTRIBUTEENUM_Radix: + break; + case XFA_ATTRIBUTEENUM_Right: + dwExtendedStyle |= FWL_STYLEEXT_EDT_HFar; + break; + default: + dwExtendedStyle |= FWL_STYLEEXT_EDT_HNear; + break; + } + FX_INT32 iVert = para.GetVerticalAlign(); + switch(iVert) { + case XFA_ATTRIBUTEENUM_Middle: + dwExtendedStyle |= FWL_STYLEEXT_EDT_VCenter; + break; + case XFA_ATTRIBUTEENUM_Bottom: + dwExtendedStyle |= FWL_STYLEEXT_EDT_VFar; + break; + default: + dwExtendedStyle |= FWL_STYLEEXT_EDT_VNear; + break; + } + } + return dwExtendedStyle; +} +FX_BOOL CXFA_FFTextEdit::UpdateFWLData() +{ + if (!m_pNormalWidget) { + return FALSE; + } + XFA_VALUEPICTURE eType = XFA_VALUEPICTURE_Display; + if (IsFocused()) { + eType = XFA_VALUEPICTURE_Edit; + } + FX_BOOL bUpdate = FALSE; + if (m_pDataAcc->GetUIType() == XFA_ELEMENT_TextEdit && m_pDataAcc->GetNumberOfCells() < 0) { + XFA_ELEMENT elementType = XFA_ELEMENT_UNKNOWN; + FX_INT32 iMaxChars = m_pDataAcc->GetMaxChars(elementType); + if (elementType == XFA_ELEMENT_ExData) { + iMaxChars = eType == XFA_VALUEPICTURE_Edit ? iMaxChars : 0; + } + if (((CFWL_Edit*)m_pNormalWidget)->GetLimit() != iMaxChars) { + ((CFWL_Edit*)m_pNormalWidget)->SetLimit(iMaxChars); + bUpdate = TRUE; + } + } + CFX_WideString wsText; + m_pDataAcc->GetValue(wsText, eType); + CFX_WideString wsOldText; + ((CFWL_Edit*)m_pNormalWidget)->GetText(wsOldText); + if (wsText != wsOldText || (eType == XFA_VALUEPICTURE_Edit && bUpdate)) { + ((CFWL_Edit*)m_pNormalWidget)->SetText(wsText); + bUpdate = TRUE; + } + if (bUpdate) { + m_pNormalWidget->Update(); + } + return TRUE; +} +FX_BOOL CXFA_FFTextEdit::CanUndo() +{ + return ((CFWL_Edit*)m_pNormalWidget)->CanUndo(); +} +FX_BOOL CXFA_FFTextEdit::CanRedo() +{ + return ((CFWL_Edit*)m_pNormalWidget)->CanRedo(); +} +FX_BOOL CXFA_FFTextEdit::Undo() +{ + return ((CFWL_Edit*)m_pNormalWidget)->Undo(); +} +FX_BOOL CXFA_FFTextEdit::Redo() +{ + return ((CFWL_Edit*)m_pNormalWidget)->Redo(); +} +FX_BOOL CXFA_FFTextEdit::CanCopy() +{ + FX_INT32 nCount = ((CFWL_Edit*)m_pNormalWidget)->CountSelRanges(); + return nCount > 0; +} +FX_BOOL CXFA_FFTextEdit::CanCut() +{ + if (m_pNormalWidget->GetStylesEx() & FWL_STYLEEXT_EDT_ReadOnly) { + return FALSE; + } + FX_INT32 nCount = ((CFWL_Edit*)m_pNormalWidget)->CountSelRanges(); + return nCount > 0; +} +FX_BOOL CXFA_FFTextEdit::CanPaste() +{ + return m_pDataAcc->GetAccess() == XFA_ATTRIBUTEENUM_Open; +} +FX_BOOL CXFA_FFTextEdit::CanSelectAll() +{ + return ((CFWL_Edit*)m_pNormalWidget)->GetTextLength() > 0; +} +FX_BOOL CXFA_FFTextEdit::Copy(CFX_WideString &wsCopy) +{ + return ((CFWL_Edit*)m_pNormalWidget)->Copy(wsCopy); +} +FX_BOOL CXFA_FFTextEdit::Cut(CFX_WideString &wsCut) +{ + return ((CFWL_Edit*)m_pNormalWidget)->Cut(wsCut); +} +FX_BOOL CXFA_FFTextEdit::Paste(const CFX_WideString &wsPaste) +{ + return ((CFWL_Edit*)m_pNormalWidget)->Paste(wsPaste); +} +FX_BOOL CXFA_FFTextEdit::SelectAll() +{ + FX_INT32 nCount = ((CFWL_Edit*)m_pNormalWidget)->GetTextLength(); + return ((CFWL_Edit*)m_pNormalWidget)->AddSelRange(0, nCount); +} +FX_BOOL CXFA_FFTextEdit::Delete() +{ + return ((CFWL_Edit*)m_pNormalWidget)->Delete(); +} +FX_BOOL CXFA_FFTextEdit::DeSelect() +{ + return ((CFWL_Edit*)m_pNormalWidget)->ClearSelections(); +} +FX_BOOL CXFA_FFTextEdit::GetSuggestWords(CFX_PointF pointf, CFX_ByteStringArray &sSuggest) +{ + if (m_pDataAcc->GetUIType() != XFA_ELEMENT_TextEdit) { + return FALSE; + } + FWLToClient(pointf.x, pointf.y); + return ((CFWL_Edit*)m_pNormalWidget)->GetSuggestWords(pointf, sSuggest); +} +FX_BOOL CXFA_FFTextEdit::ReplaceSpellCheckWord(CFX_PointF pointf, FX_BSTR bsReplace) +{ + if (m_pDataAcc->GetUIType() != XFA_ELEMENT_TextEdit) { + return FALSE; + } + FWLToClient(pointf.x, pointf.y); + return ((CFWL_Edit*)m_pNormalWidget)->ReplaceSpellCheckWord(pointf, bsReplace); +} +void CXFA_FFTextEdit::OnTextChanged(IFWL_Widget *pWidget, const CFX_WideString &wsChanged, const CFX_WideString &wsPrevText) +{ + m_dwStatus |= XFA_WIDGETSTATUS_TextEditValueChanged; + CXFA_EventParam eParam; + eParam.m_eType = XFA_EVENT_Change; + eParam.m_wsChange = wsChanged; + eParam.m_pTarget = m_pDataAcc; + eParam.m_wsPrevText = wsPrevText; + CFWL_Edit* pEdit = ((CFWL_Edit*)m_pNormalWidget); + if (m_pDataAcc->GetUIType() == XFA_ELEMENT_DateTimeEdit) { + CFWL_DateTimePicker* pDateTime = (CFWL_DateTimePicker*)pEdit; + pDateTime->GetEditText(eParam.m_wsNewText); + FX_INT32 iSels = pDateTime->CountSelRanges(); + if (iSels ) { + eParam.m_iSelEnd = pDateTime->GetSelRange(0, eParam.m_iSelStart); + } + } else { + pEdit->GetText(eParam.m_wsNewText); + FX_INT32 iSels = pEdit->CountSelRanges(); + if (iSels ) { + eParam.m_iSelEnd = pEdit->GetSelRange(0, eParam.m_iSelStart); + } + } + m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Change, &eParam); +} +void CXFA_FFTextEdit::OnTextFull(IFWL_Widget *pWidget) +{ + CXFA_EventParam eParam; + eParam.m_eType = XFA_EVENT_Full; + eParam.m_pTarget = m_pDataAcc; + m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Full, &eParam); +} +void CXFA_FFTextEdit::OnAddDoRecord(IFWL_Widget *pWidget) +{ + GetDoc()->GetDocProvider()->AddDoRecord((XFA_HWIDGET)this); +} +FX_BOOL CXFA_FFTextEdit::CheckWord(FX_BSTR sWord) +{ + if (sWord.IsEmpty() || m_pDataAcc->GetUIType() != XFA_ELEMENT_TextEdit) { + return TRUE; + } + return GetDoc()->GetDocProvider()->CheckWord((XFA_HDOC)GetDoc(), sWord); +} +FX_BOOL CXFA_FFTextEdit::GetSuggestWords(FX_BSTR sWord, CFX_ByteStringArray &sSuggest) +{ + if (m_pDataAcc->GetUIType() != XFA_ELEMENT_TextEdit) { + return FALSE; + } + return GetDoc()->GetDocProvider()->GetSuggestWords((XFA_HDOC)GetDoc(), sWord, sSuggest); +} +FX_INT32 CXFA_FFTextEdit::OnProcessMessage(CFWL_Message *pMessage) +{ + return m_pOldDelegate->OnProcessMessage(pMessage); +} +FWL_ERR CXFA_FFTextEdit::OnProcessEvent(CFWL_Event *pEvent) +{ + CXFA_FFField::OnProcessEvent(pEvent); + FX_DWORD dwEventID = pEvent->GetClassID(); + switch (dwEventID) { + case FWL_EVTHASH_EDT_TextChanged: { + CFWL_EvtEdtTextChanged *event = (CFWL_EvtEdtTextChanged*)pEvent; + CFX_WideString wsChange; + OnTextChanged(m_pNormalWidget->GetWidget(), wsChange, event->wsPrevText); + break; + } + case FWL_EVTHASH_EDT_AddDoRecord: { + OnAddDoRecord(m_pNormalWidget->GetWidget()); + break; + } + case FWL_EVTHASH_EDT_TextFull: { + OnTextFull(m_pNormalWidget->GetWidget()); + break; + } + case FWL_EVTHASH_EDT_CheckWord: { + CFX_WideString wstr(L"FWL_EVENT_DTP_SelectChanged"); + FX_DWORD hashcode = FX_HashCode_String_GetW(wstr, wstr.GetLength()); + CFWL_EvtEdtCheckWord *event = (CFWL_EvtEdtCheckWord*)pEvent; + event->bCheckWord = CheckWord(event->bsWord); + break; + } + case FWL_EVTHASH_EDT_GetSuggestWords: { + CFWL_EvtEdtGetSuggestWords *event = (CFWL_EvtEdtGetSuggestWords*)pEvent; + event->bSuggestWords = GetSuggestWords(event->bsWord, event->bsArraySuggestWords); + break; + } + default: { + } + } + return m_pOldDelegate->OnProcessEvent(pEvent); +} +FWL_ERR CXFA_FFTextEdit::OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix ) +{ + return m_pOldDelegate->OnDrawWidget(pGraphics, pMatrix); +} +CXFA_FFNumericEdit::CXFA_FFNumericEdit(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc) + : CXFA_FFTextEdit(pPageView, pDataAcc) +{ +} +CXFA_FFNumericEdit::~CXFA_FFNumericEdit() +{ +} +FX_BOOL CXFA_FFNumericEdit::LoadWidget() +{ + CFWL_Edit* pWidget = CFWL_Edit::Create(); + pWidget->Initialize(); + m_pNormalWidget = (CFWL_Widget*)pWidget; + IFWL_Widget* pIWidget = m_pNormalWidget->GetWidget(); + m_pNormalWidget->SetPrivateData(pIWidget, this, NULL); + IFWL_NoteDriver *pNoteDriver = FWL_GetApp()->GetNoteDriver(); + pNoteDriver->RegisterEventTarget(pIWidget, pIWidget); + m_pOldDelegate = m_pNormalWidget->SetDelegate(this); + m_pNormalWidget->LockUpdate(); + CFX_WideString wsText; + m_pDataAcc->GetValue(wsText, XFA_VALUEPICTURE_Display); + pWidget->SetText(wsText); + UpdateWidgetProperty(); + m_pNormalWidget->UnlockUpdate(); + return CXFA_FFField::LoadWidget(); +} +void CXFA_FFNumericEdit::UpdateWidgetProperty() +{ + CFWL_Edit* pWidget = (CFWL_Edit*)m_pNormalWidget; + if (!pWidget) { + return; + } + FX_DWORD dwExtendedStyle = FWL_STYLEEXT_EDT_ShowScrollbarFocus | + FWL_STYLEEXT_EDT_OuterScrollbar | FWL_STYLEEXT_EDT_Validate | FWL_STYLEEXT_EDT_Number | FWL_STYLEEXT_EDT_LastLineHeight; + dwExtendedStyle |= UpdateUIProperty(); + if (m_pDataAcc->GetHorizontalScrollPolicy() != XFA_ATTRIBUTEENUM_Off) { + dwExtendedStyle |= FWL_STYLEEXT_EDT_AutoHScroll; + } + FX_INT32 iNumCells = m_pDataAcc->GetNumberOfCells(); + if (iNumCells > 0) { + dwExtendedStyle |= FWL_STYLEEXT_EDT_CombText; + pWidget->SetLimit(iNumCells); + } + dwExtendedStyle |= GetAlignment(); + if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open || !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) { + dwExtendedStyle |= FWL_STYLEEXT_EDT_ReadOnly; + } + m_pNormalWidget->ModifyStylesEx(dwExtendedStyle, 0xFFFFFFFF); +} +FWL_ERR CXFA_FFNumericEdit::OnProcessEvent(CFWL_Event *pEvent) +{ + FX_DWORD dwEventID = pEvent->GetClassID(); + if (dwEventID == FWL_EVTHASH_EDT_Validate) { + CFWL_EvtEdtValidate *event = (CFWL_EvtEdtValidate*)pEvent; + CFX_WideString wsChange = event->wsInsert; + event->bValidate = OnValidate(m_pNormalWidget->GetWidget(), wsChange); + return event->bValidate; + } else { + return CXFA_FFTextEdit::OnProcessEvent(pEvent); + } +} +FX_BOOL CXFA_FFNumericEdit::OnValidate(IFWL_Widget *pWidget, CFX_WideString &wsText) +{ + CFX_WideString wsPattern; + m_pDataAcc->GetPictureContent(wsPattern, XFA_VALUEPICTURE_Edit); + if (!wsPattern.IsEmpty()) { + return TRUE; + } + FX_INT32 iLeads = 0; + m_pDataAcc->GetLeadDigits(iLeads); + FX_INT32 iFracs = 0; + m_pDataAcc->GetFracDigits(iFracs); + CFX_WideString wsFormat; + CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(m_pDataAcc); + widgetValue.GetNumbericFormat(wsFormat, iLeads, iFracs); + return widgetValue.ValidateNumericTemp(wsText, wsFormat, m_pDataAcc->GetLocal()); +} +CXFA_FFPasswordEdit::CXFA_FFPasswordEdit(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc) + : CXFA_FFTextEdit(pPageView, pDataAcc) +{ +} +CXFA_FFPasswordEdit::~CXFA_FFPasswordEdit() +{ +} +FX_BOOL CXFA_FFPasswordEdit::LoadWidget() +{ + CFWL_Edit* pWidget = CFWL_Edit::Create(); + pWidget->Initialize(); + m_pNormalWidget = (CFWL_Widget*)pWidget; + IFWL_Widget* pIWidget = m_pNormalWidget->GetWidget(); + m_pNormalWidget->SetPrivateData(pIWidget, this, NULL); + IFWL_NoteDriver *pNoteDriver = FWL_GetApp()->GetNoteDriver(); + pNoteDriver->RegisterEventTarget(pIWidget, pIWidget); + m_pOldDelegate = m_pNormalWidget->SetDelegate(this); + m_pNormalWidget->LockUpdate(); + CFX_WideString wsText; + m_pDataAcc->GetValue(wsText, XFA_VALUEPICTURE_Display); + pWidget->SetText(wsText); + UpdateWidgetProperty(); + m_pNormalWidget->UnlockUpdate(); + return CXFA_FFField::LoadWidget(); +} +void CXFA_FFPasswordEdit::UpdateWidgetProperty() +{ + CFWL_Edit* pWidget = (CFWL_Edit*)m_pNormalWidget; + if (!pWidget) { + return; + } + FX_DWORD dwExtendedStyle = FWL_STYLEEXT_EDT_ShowScrollbarFocus | + FWL_STYLEEXT_EDT_OuterScrollbar | FWL_STYLEEXT_EDT_Password | FWL_STYLEEXT_EDT_LastLineHeight; + dwExtendedStyle |= UpdateUIProperty(); + CFX_WideString wsPassWord; + m_pDataAcc->GetPasswordChar(wsPassWord); + if (!wsPassWord.IsEmpty()) { + pWidget->SetAliasChar(wsPassWord.GetAt(0)); + } + if (m_pDataAcc->GetHorizontalScrollPolicy() != XFA_ATTRIBUTEENUM_Off) { + dwExtendedStyle |= FWL_STYLEEXT_EDT_AutoHScroll; + } + if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open || !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) { + dwExtendedStyle |= FWL_STYLEEXT_EDT_ReadOnly; + } + dwExtendedStyle |= GetAlignment(); + m_pNormalWidget->ModifyStylesEx(dwExtendedStyle, 0xFFFFFFFF); +} +CXFA_FFDateTimeEdit::CXFA_FFDateTimeEdit(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc) + : CXFA_FFTextEdit(pPageView, pDataAcc) +{ +} +CXFA_FFDateTimeEdit::~CXFA_FFDateTimeEdit() +{ +} +FX_BOOL CXFA_FFDateTimeEdit::GetBBox(CFX_RectF &rtBox, FX_DWORD dwStatus, FX_BOOL bDrawFocus) +{ + if (bDrawFocus) { + return FALSE; + } +#ifndef _XFA_EMB + return CXFA_FFWidget::GetBBox(rtBox, dwStatus); +#endif + GetRectWithoutRotate(rtBox); + if (m_pNormalWidget) { + CFX_RectF rtWidget; + ((CFWL_DateTimePicker*)m_pNormalWidget)->GetBBox(rtWidget); + rtBox.Union(rtWidget); + } + CFX_Matrix mt; + GetRotateMatrix(mt); + mt.TransformRect(rtBox); + return TRUE; +} +FX_BOOL CXFA_FFDateTimeEdit::PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy) +{ + if (!m_pNormalWidget) { + return FALSE; + } + CFX_RectF rtWidget; + ((CFWL_DateTimePicker*)m_pNormalWidget)->GetBBox(rtWidget); + if (rtWidget.Contains(fx, fy)) { + return TRUE; + } + return FALSE; +} +FX_BOOL CXFA_FFDateTimeEdit::LoadWidget() +{ + CFWL_DateTimePicker *pWidget = CFWL_DateTimePicker::Create(); + pWidget->Initialize(); + m_pNormalWidget = (CFWL_Widget*)pWidget; + IFWL_Widget* pIWidget = m_pNormalWidget->GetWidget(); + m_pNormalWidget->SetPrivateData(pIWidget, this, NULL); + IFWL_NoteDriver *pNoteDriver = FWL_GetApp()->GetNoteDriver(); + pNoteDriver->RegisterEventTarget(pIWidget, pIWidget); + m_pOldDelegate = m_pNormalWidget->SetDelegate(this); + m_pNormalWidget->LockUpdate(); + CFX_WideString wsText; + m_pDataAcc->GetValue(wsText, XFA_VALUEPICTURE_Display); + pWidget->SetEditText(wsText); + XFA_DATETIMETYPE eType = XFA_DATETIMETYPE_DateAndTime; + if (CXFA_Value value = m_pDataAcc->GetFormValue()) { + switch(value.GetChildValueClassID()) { + case XFA_ELEMENT_Date: { + eType = XFA_DATETIMETYPE_Date; + if (!wsText.IsEmpty()) { + CXFA_LocaleValue lcValue = XFA_GetLocaleValue(m_pDataAcc); + CFX_Unitime date = lcValue.GetDate(); + if ((FX_UNITIME)date != 0) { + pWidget->SetCurSel(date.GetYear(), date.GetMonth(), date.GetDay()); + } + } + } + break; + case XFA_ELEMENT_Time: + eType = XFA_DATETIMETYPE_Time; + break; + default: + eType = XFA_DATETIMETYPE_DateAndTime; + break; + } + } + UpdateWidgetProperty(); + m_pNormalWidget->UnlockUpdate(); + return CXFA_FFField::LoadWidget(); +} +void CXFA_FFDateTimeEdit::UpdateWidgetProperty() +{ + CFWL_DateTimePicker* pWidget = (CFWL_DateTimePicker*)m_pNormalWidget; + if (!pWidget) { + return; + } + FX_DWORD dwExtendedStyle = FWL_STYLEEXT_DTP_ShortDateFormat; + dwExtendedStyle |= UpdateUIProperty(); + dwExtendedStyle |= GetAlignment(); + m_pNormalWidget->ModifyStylesEx(dwExtendedStyle, 0xFFFFFFFF); + FX_DWORD dwEditStyles = FWL_STYLEEXT_EDT_LastLineHeight; + FX_INT32 iNumCells = m_pDataAcc->GetNumberOfCells(); + if (iNumCells > 0) { + dwEditStyles |= FWL_STYLEEXT_EDT_CombText; + pWidget->SetEditLimit(iNumCells); + } + if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open || !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) { + dwEditStyles |= FWL_STYLEEXT_EDT_ReadOnly; + } + if (m_pDataAcc->GetHorizontalScrollPolicy() != XFA_ATTRIBUTEENUM_Off) { + dwEditStyles |= FWL_STYLEEXT_EDT_AutoHScroll; + } + pWidget->ModifyEditStylesEx(dwEditStyles, 0xFFFFFFFF); +} +FX_DWORD CXFA_FFDateTimeEdit::GetAlignment() +{ + FX_DWORD dwExtendedStyle = 0; + if (CXFA_Para para = m_pDataAcc->GetPara()) { + FX_INT32 iHorz = para.GetHorizontalAlign(); + switch(iHorz) { + case XFA_ATTRIBUTEENUM_Center: + dwExtendedStyle |= FWL_STYLEEXT_DTP_EditHCenter; + break; + case XFA_ATTRIBUTEENUM_Justify: + dwExtendedStyle |= FWL_STYLEEXT_DTP_EditJustified; + break; + case XFA_ATTRIBUTEENUM_JustifyAll: + break; + case XFA_ATTRIBUTEENUM_Radix: + break; + case XFA_ATTRIBUTEENUM_Right: + dwExtendedStyle |= FWL_STYLEEXT_DTP_EditHFar; + break; + default: + dwExtendedStyle |= FWL_STYLEEXT_DTP_EditHNear; + break; + } + FX_INT32 iVert = para.GetVerticalAlign(); + switch(iVert) { + case XFA_ATTRIBUTEENUM_Middle: + dwExtendedStyle |= FWL_STYLEEXT_DTP_EditVCenter; + break; + case XFA_ATTRIBUTEENUM_Bottom: + dwExtendedStyle |= FWL_STYLEEXT_DTP_EditVFar; + break; + default: + dwExtendedStyle |= FWL_STYLEEXT_DTP_EditVNear; + break; + } + } + return dwExtendedStyle; +} +FX_BOOL CXFA_FFDateTimeEdit::CommitData() +{ + CFX_WideString wsText; + ((CFWL_DateTimePicker*)m_pNormalWidget)->GetEditText(wsText); + if (m_pDataAcc->SetValue(wsText, XFA_VALUEPICTURE_Edit)) { + m_pDataAcc->UpdateUIDisplay(this); + return TRUE; + } + return FALSE; +} +FX_BOOL CXFA_FFDateTimeEdit::UpdateFWLData() +{ + if (!m_pNormalWidget) { + return FALSE; + } + XFA_VALUEPICTURE eType = XFA_VALUEPICTURE_Display; + if (IsFocused()) { + eType = XFA_VALUEPICTURE_Edit; + } + CFX_WideString wsText; + m_pDataAcc->GetValue(wsText, eType); + ((CFWL_DateTimePicker*)m_pNormalWidget)->SetEditText(wsText); + if (IsFocused() && !wsText.IsEmpty()) { + CXFA_LocaleValue lcValue = XFA_GetLocaleValue(m_pDataAcc); + CFX_Unitime date = lcValue.GetDate(); + if (lcValue.IsValid()) { + if ((FX_UNITIME)date != 0) { + ((CFWL_DateTimePicker*)m_pNormalWidget)->SetCurSel(date.GetYear(), date.GetMonth(), date.GetDay()); + } + } + } + m_pNormalWidget->Update(); + return TRUE; +} +FX_BOOL CXFA_FFDateTimeEdit::IsDataChanged() +{ + if (m_dwStatus & XFA_WIDGETSTATUS_TextEditValueChanged) { + return TRUE; + } + CFX_WideString wsText; + ((CFWL_DateTimePicker*)m_pNormalWidget)->GetEditText(wsText); + CFX_WideString wsOldValue; + m_pDataAcc->GetValue(wsOldValue, XFA_VALUEPICTURE_Edit); + return wsOldValue != wsText; +} +FX_BOOL CXFA_FFDateTimeEdit::CanUndo() +{ + return ((CFWL_DateTimePicker*)m_pNormalWidget)->CanUndo(); +} +FX_BOOL CXFA_FFDateTimeEdit::CanRedo() +{ + return ((CFWL_DateTimePicker*)m_pNormalWidget)->CanRedo(); +} +FX_BOOL CXFA_FFDateTimeEdit::Undo() +{ + return ((CFWL_DateTimePicker*)m_pNormalWidget)->Undo(); +} +FX_BOOL CXFA_FFDateTimeEdit::Redo() +{ + return ((CFWL_DateTimePicker*)m_pNormalWidget)->Redo(); +} +FX_BOOL CXFA_FFDateTimeEdit::CanCopy() +{ + return ((CFWL_DateTimePicker*)m_pNormalWidget)->CanCopy(); +} +FX_BOOL CXFA_FFDateTimeEdit::CanCut() +{ + if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open) { + return FALSE; + } + return ((CFWL_DateTimePicker*)m_pNormalWidget)->CanCut(); +} +FX_BOOL CXFA_FFDateTimeEdit::CanPaste() +{ + return m_pDataAcc->GetAccess() == XFA_ATTRIBUTEENUM_Open; +} +FX_BOOL CXFA_FFDateTimeEdit::CanSelectAll() +{ + return ((CFWL_DateTimePicker*)m_pNormalWidget)->CanSelectAll(); +} +FX_BOOL CXFA_FFDateTimeEdit::Copy(CFX_WideString &wsCopy) +{ + return ((CFWL_DateTimePicker*)m_pNormalWidget)->Copy(wsCopy); +} +FX_BOOL CXFA_FFDateTimeEdit::Cut(CFX_WideString &wsCut) +{ + return ((CFWL_DateTimePicker*)m_pNormalWidget)->Cut(wsCut); +} +FX_BOOL CXFA_FFDateTimeEdit::Paste(const CFX_WideString &wsPaste) +{ + return ((CFWL_DateTimePicker*)m_pNormalWidget)->Paste(wsPaste); +} +FX_BOOL CXFA_FFDateTimeEdit::SelectAll() +{ + return ((CFWL_DateTimePicker*)m_pNormalWidget)->SelectAll(); +} +FX_BOOL CXFA_FFDateTimeEdit::Delete() +{ + return ((CFWL_DateTimePicker*)m_pNormalWidget)->Delete(); +} +FX_BOOL CXFA_FFDateTimeEdit::DeSelect() +{ + return ((CFWL_DateTimePicker*)m_pNormalWidget)->DeSelect(); +} +void CXFA_FFDateTimeEdit::OnSelectChanged(IFWL_Widget *pWidget, FX_INT32 iYear, FX_INT32 iMonth, FX_INT32 iDay) +{ + CFX_WideString wsPicture; + m_pDataAcc->GetPictureContent(wsPicture, XFA_VALUEPICTURE_Edit); + CXFA_LocaleValue date(XFA_VT_DATE, this->GetDoc()->GetXFADoc()->GetLocalMgr()); + CFX_Unitime dt; + dt.Set(iYear, iMonth, iDay); + date.SetDate(dt); + CFX_WideString wsDate; + date.FormatPatterns(wsDate, wsPicture, m_pDataAcc->GetLocal(), XFA_VALUEPICTURE_Edit); + CFWL_DateTimePicker* pDateTime = (CFWL_DateTimePicker*)m_pNormalWidget; + pDateTime->SetEditText(wsDate); + pDateTime->Update(); + GetDoc()->GetDocProvider()->SetFocusWidget((XFA_HDOC)GetDoc(), NULL); + CXFA_EventParam eParam; + eParam.m_eType = XFA_EVENT_Change; + eParam.m_pTarget = m_pDataAcc; + m_pDataAcc->GetValue(eParam.m_wsNewText, XFA_VALUEPICTURE_Raw); + m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Change, &eParam); +} +FWL_ERR CXFA_FFDateTimeEdit::OnProcessEvent(CFWL_Event *pEvent) +{ + FX_DWORD dwEventID = pEvent->GetClassID(); + if (dwEventID == FWL_EVTHASH_DTP_SelectChanged) { + CFWL_Event_DtpSelectChanged *event = (CFWL_Event_DtpSelectChanged*)pEvent; + OnSelectChanged(m_pNormalWidget->GetWidget(), event->iYear, event->iMonth, event->iDay); + return TRUE; + } else { + return CXFA_FFTextEdit::OnProcessEvent(pEvent); + } +} diff --git a/xfa/src/fxfa/src/app/xfa_fftextedit.h b/xfa/src/fxfa/src/app/xfa_fftextedit.h new file mode 100644 index 0000000000..a6c2b507c9 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_fftextedit.h @@ -0,0 +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 + +#ifndef _FXFA_FORMFILLER_TEXTEDIT_IMP_H +#define _FXFA_FORMFILLER_TEXTEDIT_IMP_H +class CXFA_FFTextEdit : public CXFA_FFField +{ +public: + CXFA_FFTextEdit(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc); + virtual ~CXFA_FFTextEdit(); + virtual FX_BOOL LoadWidget(); + virtual void UpdateWidgetProperty(); + virtual FX_BOOL OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnRButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnRButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnSetFocus(CXFA_FFWidget* pOldWidget); + virtual FX_BOOL OnKillFocus(CXFA_FFWidget* pNewWidget); + virtual FX_BOOL CanUndo(); + virtual FX_BOOL CanRedo(); + virtual FX_BOOL Undo(); + virtual FX_BOOL Redo(); + virtual FX_BOOL CanCopy(); + virtual FX_BOOL CanCut(); + virtual FX_BOOL CanPaste(); + virtual FX_BOOL CanSelectAll(); + virtual FX_BOOL Copy(CFX_WideString &wsCopy); + virtual FX_BOOL Cut(CFX_WideString &wsCut); + virtual FX_BOOL Paste(const CFX_WideString &wsPaste); + virtual FX_BOOL SelectAll(); + virtual FX_BOOL Delete(); + virtual FX_BOOL DeSelect(); + FX_BOOL GetSuggestWords(CFX_PointF pointf, CFX_ByteStringArray &sSuggest); + FX_BOOL ReplaceSpellCheckWord(CFX_PointF pointf, FX_BSTR bsReplace); +protected: + FX_DWORD GetAlignment(); + virtual FX_BOOL CommitData(); + virtual FX_BOOL UpdateFWLData(); + virtual FX_BOOL IsDataChanged(); + IFWL_WidgetDelegate* m_pOldDelegate; +public: + void OnTextChanged(IFWL_Widget *pWidget, const CFX_WideString &wsChanged, const CFX_WideString &wsPrevText); + void OnTextFull(IFWL_Widget *pWidget); + void OnAddDoRecord(IFWL_Widget *pWidget); + FX_BOOL CheckWord(FX_BSTR sWord); + FX_BOOL GetSuggestWords(FX_BSTR sWord, CFX_ByteStringArray &sSuggest); + virtual FX_INT32 OnProcessMessage(CFWL_Message *pMessage); + virtual FWL_ERR OnProcessEvent(CFWL_Event *pEvent); + virtual FWL_ERR OnDrawWidget(CFX_Graphics *pGraphics, const CFX_Matrix *pMatrix = NULL); +}; +class CXFA_FFNumericEdit : public CXFA_FFTextEdit +{ +public: + CXFA_FFNumericEdit(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc); + virtual ~CXFA_FFNumericEdit(); + virtual FX_BOOL LoadWidget(); + virtual void UpdateWidgetProperty(); + virtual FWL_ERR OnProcessEvent(CFWL_Event *pEvent); +public: + FX_BOOL OnValidate(IFWL_Widget *pWidget, CFX_WideString &wsText); +}; +class CXFA_FFPasswordEdit : public CXFA_FFTextEdit +{ +public: + CXFA_FFPasswordEdit(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc); + virtual ~CXFA_FFPasswordEdit(); + virtual FX_BOOL LoadWidget(); + virtual void UpdateWidgetProperty(); +protected: +}; +enum XFA_DATETIMETYPE { + XFA_DATETIMETYPE_Date = 0, + XFA_DATETIMETYPE_Time, + XFA_DATETIMETYPE_DateAndTime +}; +class CXFA_FFDateTimeEdit : public CXFA_FFTextEdit +{ +public: + CXFA_FFDateTimeEdit(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc); + virtual ~CXFA_FFDateTimeEdit(); + + virtual FX_BOOL GetBBox(CFX_RectF &rtBox, FX_DWORD dwStatus, FX_BOOL bDrawFocus = FALSE); + virtual FX_BOOL LoadWidget(); + virtual void UpdateWidgetProperty(); + + + virtual FX_BOOL CanUndo(); + virtual FX_BOOL CanRedo(); + virtual FX_BOOL Undo(); + virtual FX_BOOL Redo(); + + virtual FX_BOOL CanCopy(); + virtual FX_BOOL CanCut(); + virtual FX_BOOL CanPaste(); + virtual FX_BOOL CanSelectAll(); + virtual FX_BOOL Copy(CFX_WideString &wsCopy); + virtual FX_BOOL Cut(CFX_WideString &wsCut); + virtual FX_BOOL Paste(const CFX_WideString &wsPaste); + virtual FX_BOOL SelectAll(); + virtual FX_BOOL Delete(); + virtual FX_BOOL DeSelect(); + +protected: + FX_DWORD GetAlignment(); + + virtual FX_BOOL PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL CommitData(); + virtual FX_BOOL UpdateFWLData(); + virtual FX_BOOL IsDataChanged(); +public: + void OnSelectChanged(IFWL_Widget *pWidget, FX_INT32 iYear, FX_INT32 iMonth, FX_INT32 iDay); + virtual FWL_ERR OnProcessEvent(CFWL_Event *pEvent); +}; +#endif diff --git a/xfa/src/fxfa/src/app/xfa_ffwidget.cpp b/xfa/src/fxfa/src/app/xfa_ffwidget.cpp new file mode 100644 index 0000000000..46e1d94662 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffwidget.cpp @@ -0,0 +1,1876 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_common.h" +#include "xfa_ffapp.h" +#include "xfa_ffdoc.h" +#include "xfa_ffdocview.h" +#include "xfa_ffwidget.h" +#include "xfa_ffpageview.h" +#include "xfa_textlayout.h" +CXFA_FFWidget::CXFA_FFWidget(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc) + : CXFA_ContentLayoutItemImpl(pDataAcc->GetNode()) + , m_pPageView(pPageView) + , m_pDataAcc(pDataAcc) +{ + m_rtWidget.Set(0, 0, 0, 0); +} +CXFA_FFWidget::~CXFA_FFWidget() +{ +} +IXFA_PageView* CXFA_FFWidget::GetPageView() +{ + return m_pPageView; +} +void CXFA_FFWidget::SetPageView(IXFA_PageView* pPageView) +{ + m_pPageView = (CXFA_FFPageView*)pPageView; +} +void CXFA_FFWidget::GetWidgetRect(CFX_RectF &rtWidget) +{ + if ((m_dwStatus & XFA_WIDGETSTATUS_RectCached) == 0) { + m_dwStatus |= XFA_WIDGETSTATUS_RectCached; + this->GetLayoutItem()->GetRect(m_rtWidget); + } + rtWidget = m_rtWidget; +} +CFX_RectF CXFA_FFWidget::ReCacheWidgetRect() +{ + m_dwStatus |= XFA_WIDGETSTATUS_RectCached; + this->GetLayoutItem()->GetRect(m_rtWidget); + return m_rtWidget; +} +void CXFA_FFWidget::GetRectWithoutRotate(CFX_RectF &rtWidget) +{ + GetWidgetRect(rtWidget); + FX_FLOAT fValue = 0; + switch (m_pDataAcc->GetRotate()) { + case 90: + rtWidget.top = rtWidget.bottom(); + fValue = rtWidget.width; + rtWidget.width = rtWidget.height; + rtWidget.height = fValue; + break; + case 180: + rtWidget.left = rtWidget.right(); + rtWidget.top = rtWidget.bottom(); + break; + case 270: + rtWidget.left = rtWidget.right(); + fValue = rtWidget.width; + rtWidget.width = rtWidget.height; + rtWidget.height = fValue; + break; + } +} +FX_DWORD CXFA_FFWidget::GetStatus() +{ + return m_dwStatus; +} +void CXFA_FFWidget::ModifyStatus(FX_DWORD dwAdded, FX_DWORD dwRemoved) +{ + m_dwStatus = (m_dwStatus & ~dwRemoved) | dwAdded; +} +FX_BOOL CXFA_FFWidget::GetBBox(CFX_RectF &rtBox, FX_DWORD dwStatus, FX_BOOL bDrawFocus) +{ + if (bDrawFocus) { + return FALSE; + } +#ifndef _XFA_EMB + if(m_pPageView) { + m_pPageView->GetPageViewRect(rtBox); + } + return TRUE; +#endif + GetWidgetRect(rtBox); + return TRUE; +} +CXFA_WidgetAcc* CXFA_FFWidget::GetDataAcc() +{ + return m_pDataAcc; +} +FX_BOOL CXFA_FFWidget::GetToolTip(CFX_WideString &wsToolTip) +{ + if (CXFA_Assist assist = m_pDataAcc->GetAssist()) { + if (CXFA_ToolTip toolTip = assist.GetToolTip()) { + return toolTip.GetTip(wsToolTip); + } + } + return GetCaptionText(wsToolTip); +} +void CXFA_FFWidget::RenderWidget(CFX_Graphics* pGS, CFX_Matrix* pMatrix , FX_DWORD dwStatus , FX_INT32 iRotate ) +{ + if (!IsMatchVisibleStatus(dwStatus)) { + return; + } + CXFA_Border border = m_pDataAcc->GetBorder(); + if (border) { + CFX_RectF rtBorder; + GetRectWithoutRotate(rtBorder); + CXFA_Margin margin = border.GetMargin(); + if (margin.IsExistInXML()) { + XFA_RectWidthoutMargin(rtBorder, margin); + } + rtBorder.Normalize(); + DrawBorder(pGS, border, rtBorder, pMatrix); + } +} +FX_BOOL CXFA_FFWidget::IsLoaded() +{ + return m_pPageView != NULL; +} +FX_BOOL CXFA_FFWidget::LoadWidget() +{ + LayoutWidget();; + return TRUE; +} +void CXFA_FFWidget::UnloadWidget() +{ +} +FX_BOOL CXFA_FFWidget::LayoutWidget() +{ + ReCacheWidgetRect(); + return TRUE; +} +FX_BOOL CXFA_FFWidget::UpdateFWLData() +{ + return FALSE; +} +void CXFA_FFWidget::UpdateWidgetProperty() +{ +} +void CXFA_FFWidget::DrawBorder(CFX_Graphics* pGS, CXFA_Box box, const CFX_RectF& rtBorder, CFX_Matrix* pMatrix, FX_DWORD dwFlags) +{ + XFA_DrawBox(box, pGS, rtBorder, pMatrix, dwFlags); +} +void CXFA_FFWidget::InvalidateWidget(const CFX_RectF* pRect ) +{ + if (!pRect) { + CFX_RectF rtWidget; + GetBBox(rtWidget, XFA_WIDGETSTATUS_Focused); + rtWidget.Inflate(2, 2); + GetDoc()->GetDocProvider()->InvalidateRect(m_pPageView, rtWidget, XFA_INVALIDATE_CurrentPage); + } else { + GetDoc()->GetDocProvider()->InvalidateRect(m_pPageView, *pRect, XFA_INVALIDATE_CurrentPage); + } +} +void CXFA_FFWidget::AddInvalidateRect(const CFX_RectF* pRect ) +{ + CFX_RectF rtWidget; + if (pRect) { + rtWidget = *pRect; + } else { + GetBBox(rtWidget, XFA_WIDGETSTATUS_Focused); + rtWidget.Inflate(2, 2); + } + m_pDocView->AddInvalidateRect(m_pPageView, rtWidget); +} +FX_BOOL CXFA_FFWidget::GetCaptionText(CFX_WideString &wsCap) +{ + CXFA_TextLayout* pCapTextlayout = m_pDataAcc->GetCaptionTextLayout(); + if (!pCapTextlayout) { + return FALSE; + } + pCapTextlayout->GetText(wsCap); + return TRUE; +} +FX_BOOL CXFA_FFWidget::IsFocused() +{ + return m_dwStatus & XFA_WIDGETSTATUS_Focused; +} +FX_BOOL CXFA_FFWidget::OnMouseEnter() +{ + return FALSE; +} +FX_BOOL CXFA_FFWidget::OnMouseExit() +{ + return FALSE; +} +FX_BOOL CXFA_FFWidget::OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + return FALSE; +} +FX_BOOL CXFA_FFWidget::OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + return FALSE; +} +FX_BOOL CXFA_FFWidget::OnLButtonDblClk(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + return FALSE; +} +FX_BOOL CXFA_FFWidget::OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + return FALSE; +} +FX_BOOL CXFA_FFWidget::OnMouseWheel(FX_DWORD dwFlags, FX_SHORT zDelta, FX_FLOAT fx, FX_FLOAT fy) +{ + return FALSE; +} +FX_BOOL CXFA_FFWidget::OnRButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + return FALSE; +} +FX_BOOL CXFA_FFWidget::OnRButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + return FALSE; +} +FX_BOOL CXFA_FFWidget::OnRButtonDblClk(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + return FALSE; +} + +FX_BOOL CXFA_FFWidget::OnSetFocus(CXFA_FFWidget* pOldWidget) +{ + CXFA_FFWidget* pParent = GetParent(); + if (pParent != NULL && !pParent->IsAncestorOf(pOldWidget)) { + pParent->OnSetFocus(pOldWidget); + } + m_dwStatus |= XFA_WIDGETSTATUS_Focused; + CXFA_EventParam eParam; + eParam.m_eType = XFA_EVENT_Enter; + eParam.m_pTarget = m_pDataAcc; + m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Enter, &eParam); + return TRUE; +} +FX_BOOL CXFA_FFWidget::OnKillFocus(CXFA_FFWidget* pNewWidget) +{ + m_dwStatus &= ~XFA_WIDGETSTATUS_Focused; + EventKillFocus(); + if (pNewWidget != NULL) { + CXFA_FFWidget* pParent = GetParent(); + if (pParent != NULL && !pParent->IsAncestorOf(pNewWidget)) { + pParent->OnKillFocus(pNewWidget); + } + } + return TRUE; +} +FX_BOOL CXFA_FFWidget::OnKeyDown(FX_DWORD dwKeyCode, FX_DWORD dwFlags) +{ + return FALSE; +} +FX_BOOL CXFA_FFWidget::OnKeyUp(FX_DWORD dwKeyCode, FX_DWORD dwFlags) +{ + return FALSE; +} +FX_BOOL CXFA_FFWidget::OnChar(FX_DWORD dwChar, FX_DWORD dwFlags) +{ + return FALSE; +} +FX_DWORD CXFA_FFWidget::OnHitTest(FX_FLOAT fx, FX_FLOAT fy) +{ + return FALSE; +} +FX_BOOL CXFA_FFWidget::OnSetCursor(FX_FLOAT fx, FX_FLOAT fy) +{ + return FALSE; +} +void CXFA_FFWidget::Rotate2Normal(FX_FLOAT &fx, FX_FLOAT &fy) +{ + CFX_Matrix mt; + GetRotateMatrix(mt); + if (mt.IsIdentity()) { + return; + } + CFX_Matrix mtReverse; + mtReverse.SetReverse(mt); + mtReverse.TransformPoint(fx, fy); +} +static void XFA_GetMatrix(CFX_Matrix &m, FX_INT32 iRotate, FX_INT32 at, const CFX_RectF& rt) +{ + if (!iRotate) { + return; + } + FX_FLOAT fAnchorX, fAnchorY; + switch (at) { + case XFA_ATTRIBUTEENUM_TopLeft: + fAnchorX = rt.left, fAnchorY = rt.top; + break; + case XFA_ATTRIBUTEENUM_TopCenter: + fAnchorX = (rt.left + rt.right()) / 2, fAnchorY = rt.top; + break; + case XFA_ATTRIBUTEENUM_TopRight: + fAnchorX = rt.right(), fAnchorY = rt.top; + break; + case XFA_ATTRIBUTEENUM_MiddleLeft: + fAnchorX = rt.left, fAnchorY = (rt.top + rt.bottom()) / 2; + break; + case XFA_ATTRIBUTEENUM_MiddleCenter: + fAnchorX = (rt.left + rt.right()) / 2, fAnchorY = (rt.top + rt.bottom()) / 2; + break; + case XFA_ATTRIBUTEENUM_MiddleRight: + fAnchorX = rt.right(), fAnchorY = (rt.top + rt.bottom()) / 2; + break; + case XFA_ATTRIBUTEENUM_BottomLeft: + fAnchorX = rt.left, fAnchorY = rt.bottom(); + break; + case XFA_ATTRIBUTEENUM_BottomCenter: + fAnchorX = (rt.left + rt.right()) / 2, fAnchorY = rt.bottom(); + break; + case XFA_ATTRIBUTEENUM_BottomRight: + fAnchorX = rt.right(), fAnchorY = rt.bottom(); + break; + } + switch (iRotate) { + case 90: + m.a = 0, m.b = -1, m.c = 1, m.d = 0, m.e = fAnchorX - fAnchorY, m.f = fAnchorX + fAnchorY; + break; + case 180: + m.a = -1, m.b = 0, m.c = 0, m.d = -1, m.e = fAnchorX * 2, m.f = fAnchorY * 2; + break; + case 270: + m.a = 0, m.b = 1, m.c = -1, m.d = 0, m.e = fAnchorX + fAnchorY, m.f = fAnchorY - fAnchorX; + break; + } +} +void CXFA_FFWidget::GetRotateMatrix(CFX_Matrix &mt) +{ + mt.Set(1, 0, 0, 1, 0, 0); + FX_INT32 iRotate = m_pDataAcc->GetRotate(); + if (!iRotate) { + return; + } + CFX_RectF rcWidget; + GetRectWithoutRotate(rcWidget); + XFA_ATTRIBUTEENUM at = XFA_ATTRIBUTEENUM_TopLeft; + XFA_GetMatrix(mt, iRotate, at, rcWidget); +} +FX_BOOL CXFA_FFWidget::IsLayoutRectEmpty() +{ + CFX_RectF rtLayout; + GetRectWithoutRotate(rtLayout); + return rtLayout.width < 0.1f && rtLayout.height < 0.1f; +} +CXFA_FFWidget* CXFA_FFWidget::GetParent() +{ + CXFA_Node* pParentNode = m_pDataAcc->GetNode()->GetNodeItem(XFA_NODEITEM_Parent); + if (pParentNode != NULL) { + CXFA_WidgetAcc* pParentWidgetAcc = (CXFA_WidgetAcc*)pParentNode->GetWidgetData(); + if (pParentWidgetAcc != NULL) { + return pParentWidgetAcc->GetNextWidget(NULL); + } + } + return NULL; +} +FX_BOOL CXFA_FFWidget::IsAncestorOf(CXFA_FFWidget* pWidget) +{ + if (!pWidget) { + return FALSE; + } + CXFA_Node* pNode = m_pDataAcc->GetNode(); + CXFA_Node* pChildNode = pWidget->GetDataAcc()->GetNode(); + while (pChildNode) { + if (pChildNode == pNode) { + return TRUE; + } + pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_Parent); + } + return FALSE; +} +FX_BOOL CXFA_FFWidget::PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy) +{ + CFX_RectF rtWidget; + GetWidgetRect(rtWidget); + if (rtWidget.Contains(fx, fy)) { + return TRUE; + } + return FALSE; +} +CXFA_FFDocView* CXFA_FFWidget::GetDocView() +{ + return m_pDocView; +} +CXFA_FFDoc* CXFA_FFWidget::GetDoc() +{ + return (CXFA_FFDoc*)m_pDocView->GetDoc(); +} +CXFA_FFApp* CXFA_FFWidget::GetApp() +{ + return GetDoc()->GetApp(); +} +IXFA_AppProvider* CXFA_FFWidget::GetAppProvider() +{ + return GetApp()->GetAppProvider(); +} +void CXFA_FFWidget::GetMinMaxWidth(FX_FLOAT fMinWidth, FX_FLOAT fMaxWidth) +{ + fMinWidth = fMaxWidth = 0; + FX_FLOAT fWidth = 0; + if (m_pDataAcc->GetWidth(fWidth)) { + fMinWidth = fMaxWidth = fWidth; + } else { + m_pDataAcc->GetMinWidth(fMinWidth); + m_pDataAcc->GetMaxWidth(fMaxWidth); + } +} +void CXFA_FFWidget::GetMinMaxHeight(FX_FLOAT fMinHeight, FX_FLOAT fMaxHeight) +{ + fMinHeight = fMaxHeight = 0; + FX_FLOAT fHeight = 0; + if (m_pDataAcc->GetHeight(fHeight)) { + fMinHeight = fMaxHeight = fHeight; + } else { + m_pDataAcc->GetMinHeight(fMinHeight); + m_pDataAcc->GetMaxHeight(fMaxHeight); + } +} +FX_BOOL CXFA_FFWidget::IsMatchVisibleStatus(FX_DWORD dwStatus) +{ + return m_dwStatus & XFA_WIDGETSTATUS_Visible; +} +void CXFA_FFWidget::EventKillFocus() +{ + if (m_dwStatus & XFA_WIDGETSTATUS_Access) { + m_dwStatus &= ~XFA_WIDGETSTATUS_Access; + return; + } + CXFA_EventParam eParam; + eParam.m_eType = XFA_EVENT_Exit; + eParam.m_pTarget = m_pDataAcc; + m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Exit, &eParam); +} +FX_BOOL CXFA_FFWidget::IsButtonDown() +{ + return (m_dwStatus & XFA_WIDGETSTATUS_ButtonDown) != 0; +} +void CXFA_FFWidget::SetButtonDown(FX_BOOL bSet) +{ + bSet ? m_dwStatus |= XFA_WIDGETSTATUS_ButtonDown : m_dwStatus &= ~XFA_WIDGETSTATUS_ButtonDown; +} +FX_INT32 XFA_StrokeTypeSetLineDash(CFX_Graphics* pGraphics, FX_INT32 iStrokeType, FX_INT32 iCapType) +{ + switch(iStrokeType) { + case XFA_ATTRIBUTEENUM_DashDot: { + FX_FLOAT dashArray[] = {4, 1, 2, 1}; + if (iCapType != XFA_ATTRIBUTEENUM_Butt) { + dashArray[1] = 2; + dashArray[3] = 2; + } + pGraphics->SetLineDash(0, dashArray, 4); + return FX_DASHSTYLE_DashDot; + } + case XFA_ATTRIBUTEENUM_DashDotDot: { + FX_FLOAT dashArray[] = {4, 1, 2, 1, 2, 1}; + if (iCapType != XFA_ATTRIBUTEENUM_Butt) { + dashArray[1] = 2; + dashArray[3] = 2; + dashArray[5] = 2; + } + pGraphics->SetLineDash(0, dashArray, 6); + return FX_DASHSTYLE_DashDotDot; + } + case XFA_ATTRIBUTEENUM_Dashed: { + FX_FLOAT dashArray[] = {5, 1}; + if (iCapType != XFA_ATTRIBUTEENUM_Butt) { + dashArray[1] = 2; + } + pGraphics->SetLineDash(0, dashArray, 2); + return FX_DASHSTYLE_Dash; + } + case XFA_ATTRIBUTEENUM_Dotted: { + FX_FLOAT dashArray[] = {2, 1}; + if (iCapType != XFA_ATTRIBUTEENUM_Butt) { + dashArray[1] = 2; + } + pGraphics->SetLineDash(0, dashArray, 2); + return FX_DASHSTYLE_Dot; + } + default: + break; + } + pGraphics->SetLineDash(FX_DASHSTYLE_Solid); + return FX_DASHSTYLE_Solid; +} +CFX_GraphStateData::LineCap XFA_LineCapToFXGE(FX_INT32 iLineCap) +{ + switch(iLineCap) { + case XFA_ATTRIBUTEENUM_Round: + return CFX_GraphStateData::LineCapRound; + case XFA_ATTRIBUTEENUM_Butt: + return CFX_GraphStateData::LineCapButt; + default: + break; + } + return CFX_GraphStateData::LineCapSquare; +} +class CXFA_ImageRenderer +{ +public: + CXFA_ImageRenderer(); + ~CXFA_ImageRenderer(); + FX_BOOL Start(CFX_RenderDevice* pDevice, CFX_DIBSource* pDIBSource, FX_ARGB bitmap_argb, + int bitmap_alpha, const CFX_AffineMatrix* pImage2Device, FX_DWORD flags, int blendType = FXDIB_BLEND_NORMAL); + FX_BOOL Continue(IFX_Pause* pPause); +protected: + CFX_RenderDevice* m_pDevice; + int m_Status; + CFX_AffineMatrix m_ImageMatrix; + CFX_DIBSource* m_pDIBSource; + CFX_DIBitmap* m_pCloneConvert; + int m_BitmapAlpha; + FX_ARGB m_FillArgb; + FX_DWORD m_Flags; + CFX_ImageTransformer* m_pTransformer; + FX_LPVOID m_DeviceHandle; + FX_INT32 m_BlendType; + FX_BOOL m_Result; + FX_BOOL m_bPrint; + FX_BOOL StartDIBSource(); + void CompositeDIBitmap(CFX_DIBitmap* pDIBitmap, int left, int top, FX_ARGB mask_argb, + int bitmap_alpha, int blend_mode, int Transparency); +}; +CXFA_ImageRenderer::CXFA_ImageRenderer() +{ + m_pDevice = NULL; + m_Status = 0; + m_pDIBSource = NULL; + m_pCloneConvert = NULL; + m_BitmapAlpha = 255; + m_FillArgb = 0; + m_Flags = 0; + m_pTransformer = NULL; + m_DeviceHandle = NULL; + m_BlendType = FXDIB_BLEND_NORMAL; + m_Result = TRUE; + m_bPrint = FALSE; +} +CXFA_ImageRenderer::~CXFA_ImageRenderer() +{ + if (m_pCloneConvert) { + delete m_pCloneConvert; + } + if (m_pTransformer) { + delete m_pTransformer; + } + if (m_DeviceHandle) { + m_pDevice->CancelDIBits(m_DeviceHandle); + } +} +FX_BOOL CXFA_ImageRenderer::Start(CFX_RenderDevice* pDevice, CFX_DIBSource* pDIBSource, FX_ARGB bitmap_argb, + int bitmap_alpha, const CFX_AffineMatrix* pImage2Device, FX_DWORD flags, int blendType) +{ + m_pDevice = pDevice; + m_pDIBSource = pDIBSource; + m_FillArgb = bitmap_argb; + m_BitmapAlpha = bitmap_alpha; + m_ImageMatrix = *pImage2Device; + m_Flags = flags; + m_BlendType = blendType; + return StartDIBSource(); +} +FX_BOOL CXFA_ImageRenderer::StartDIBSource() +{ + if (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; + } + 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_bPrint && !(m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) { + m_Result = FALSE; + return FALSE; + } + CFX_DIBSource* pDib = m_pDIBSource; + if (m_pDIBSource->HasAlpha() && !(m_pDevice->GetRenderCaps() & FXRC_ALPHA_IMAGE) && !(m_pDevice->GetRenderCaps() & FXRC_GET_BITS)) { + m_pCloneConvert = m_pDIBSource->CloneConvert(FXDIB_Rgb); + if (!m_pCloneConvert) { + m_Result = FALSE; + return FALSE; + } + pDib = m_pCloneConvert; + } + FX_RECT clip_box = m_pDevice->GetClipBox(); + clip_box.Intersect(image_rect); + m_Status = 2; + m_pTransformer = FX_NEW CFX_ImageTransformer; + m_pTransformer->Start(pDib, &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_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_pDevice->StretchBitMask(m_pDIBSource, dest_left, dest_top, dest_width, dest_height, m_FillArgb, m_Flags)) { + return FALSE; + } + } + if (m_bPrint && !(m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) { + m_Result = FALSE; + return TRUE; + } + FX_RECT clip_box = 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) { + CompositeDIBitmap(pStretched, dest_rect.left, dest_rect.top, m_FillArgb, m_BitmapAlpha, m_BlendType, FALSE); + delete pStretched; + pStretched = NULL; + } + return FALSE; +} +FX_BOOL CXFA_ImageRenderer::Continue(IFX_Pause* pPause) +{ + 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->IsAlphaMask()) { + if (m_BitmapAlpha != 255) { + m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha); + } + m_Result = 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_pDevice->SetDIBits(pBitmap, + m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop, m_BlendType); + } + delete pBitmap; + return FALSE; + } else if (m_Status == 3) { + return m_pDevice->ContinueDIBits(m_DeviceHandle, pPause); + } + return FALSE; +} +void CXFA_ImageRenderer::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 = (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; + 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; + } + if (pDIBitmap->HasAlpha() && !(m_pDevice->GetRenderCaps() & FXRC_ALPHA_IMAGE)) { + CFX_DIBitmap* pCloneConvert = pDIBitmap->CloneConvert(FXDIB_Rgb); + if (!pCloneConvert) { + return; + } + CXFA_ImageRenderer imageRender; + FX_BOOL bRet = imageRender.Start(m_pDevice, pCloneConvert, m_FillArgb, m_BitmapAlpha, &m_ImageMatrix, m_Flags); + while (bRet) { + bRet = imageRender.Continue(NULL); + } + delete pCloneConvert; + return; + } +} +void XFA_DrawImage(CFX_Graphics* pGS, const CFX_RectF &rtImage, CFX_Matrix* pMatrix, CFX_DIBitmap* pDIBitmap, FX_INT32 iAspect, FX_INT32 iImageXDpi, FX_INT32 iImageYDpi, FX_INT32 iHorzAlign, FX_INT32 iVertAlign) +{ + if (rtImage.IsEmpty()) { + return; + } + if (!pDIBitmap || !pDIBitmap->GetBuffer()) { + return; + } + FX_FLOAT fWidth = XFA_UnitPx2Pt((FX_FLOAT)pDIBitmap->GetWidth(), (FX_FLOAT)iImageXDpi); + FX_FLOAT fHeight = XFA_UnitPx2Pt((FX_FLOAT)pDIBitmap->GetHeight(), (FX_FLOAT)iImageYDpi); + CFX_RectF rtFit; + rtFit.Set(rtImage.left, rtImage.top, fWidth, fHeight); + switch (iAspect) { + case XFA_ATTRIBUTEENUM_Fit: { + FX_FLOAT f1 = rtImage.height / rtFit.height; + FX_FLOAT f2 = rtImage.width / rtFit.width; + f1 = FX_MIN(f1, f2); + rtFit.height = rtFit.height * f1; + rtFit.width = rtFit.width * f1; + } + break; + case XFA_ATTRIBUTEENUM_Actual: + break; + case XFA_ATTRIBUTEENUM_Height: { + FX_FLOAT f1 = rtImage.height / rtFit.height; + rtFit.height = rtImage.height; + rtFit.width = f1 * rtFit.width; + } + break; + case XFA_ATTRIBUTEENUM_None: + rtFit.height = rtImage.height; + rtFit.width = rtImage.width; + break; + case XFA_ATTRIBUTEENUM_Width: { + FX_FLOAT f1 = rtImage.width / rtFit.width; + rtFit.width = rtImage.width; + rtFit.height = rtFit.height * f1; + } + break; + } + if (iHorzAlign == XFA_ATTRIBUTEENUM_Center) { + rtFit.left += (rtImage.width - rtFit.width) / 2; + } else if (iHorzAlign == XFA_ATTRIBUTEENUM_Right) { + rtFit.left = rtImage.right() - rtFit.width; + } + if (iVertAlign == XFA_ATTRIBUTEENUM_Middle) { + rtFit.top += (rtImage.height - rtFit.height) / 2; + } else if (iVertAlign == XFA_ATTRIBUTEENUM_Bottom) { + rtFit.top = rtImage.bottom() - rtImage.height; + } + CFX_RenderDevice* pRenderDevice = pGS->GetRenderDevice(); + pRenderDevice->SaveState(); + CFX_PathData path; + path.AppendRect(rtImage.left, rtImage.bottom(), rtImage.right(), rtImage.top); + pRenderDevice->SetClip_PathFill(&path, pMatrix, FXFILL_WINDING); + CFX_Matrix mtImage(1, 0, 0, -1, 0, 1); + mtImage.Concat(rtFit.width, 0, 0, rtFit.height, rtFit.left, rtFit.top); + mtImage.Concat(*pMatrix); + CXFA_ImageRenderer imageRender; + FX_BOOL bRet = imageRender.Start(pRenderDevice, pDIBitmap, 0, 255, &mtImage, FXDIB_INTERPOL); + while (bRet) { + bRet = imageRender.Continue(NULL); + } + pRenderDevice->RestoreState(); +} +const static FX_BYTE g_inv_base64[128] = { + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 62, 255, 255, 255, 63, + 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 255, 255, 255, 255, 255, 255, + 255, 0, 1, 2, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 255, 255, 255, 255, 255, + 255, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 255, 255, 255, 255, 255, +}; +static FX_LPBYTE XFA_RemoveBase64Whitespace(FX_LPCBYTE pStr, FX_INT32 iLen) +{ + FX_LPBYTE pCP; + FX_INT32 i = 0, j = 0; + if (iLen == 0) { + iLen = FXSYS_strlen((FX_CHAR*)pStr); + } + pCP = (FX_LPBYTE)FDE_Alloc(iLen + 1); + for (; i < iLen; i++) { + if ((pStr[i] & 128) == 0) { + if (g_inv_base64[pStr[i]] != 0xFF || pStr[i] == '=') { + pCP[j++] = pStr[i]; + } + } + } + pCP[j] = '\0'; + return pCP; +} +static FX_INT32 XFA_Base64Decode(FX_LPCSTR pStr, FX_LPBYTE pOutBuffer) +{ + if (pStr == NULL) { + return 0; + } + FX_LPBYTE pBuffer = XFA_RemoveBase64Whitespace((FX_LPBYTE)pStr, FXSYS_strlen((FX_CHAR*)pStr)); + if (pBuffer == NULL) { + return 0; + } + FX_INT32 iLen = FXSYS_strlen((FX_CHAR*)pBuffer); + FX_INT32 i = 0, j = 0; + FX_DWORD dwLimb = 0; + for (; i + 3 < iLen; i += 4) { + if (pBuffer[i] == '=' || pBuffer[i + 1] == '=' + || pBuffer[i + 2] == '=' || pBuffer[i + 3] == '=') { + if (pBuffer[i] == '=' || pBuffer[i + 1] == '=') { + break; + } + if (pBuffer[i + 2] == '=') { + dwLimb = ((FX_DWORD)g_inv_base64[pBuffer[i]] << 6) + | ((FX_DWORD)g_inv_base64[pBuffer[i + 1]]); + pOutBuffer[j] = (FX_BYTE)(dwLimb >> 4) & 0xFF; + j++; + } else { + dwLimb = ((FX_DWORD)g_inv_base64[pBuffer[i]] << 12) | + ((FX_DWORD)g_inv_base64[pBuffer[i + 1]] << 6) | + ((FX_DWORD)g_inv_base64[pBuffer[i + 2]]); + pOutBuffer[j] = (FX_BYTE)(dwLimb >> 10) & 0xFF; + pOutBuffer[j + 1] = (FX_BYTE)(dwLimb >> 2) & 0xFF; + j += 2; + } + } else { + dwLimb = ((FX_DWORD)g_inv_base64[pBuffer[i]] << 18) | + ((FX_DWORD)g_inv_base64[pBuffer[i + 1]] << 12) | + ((FX_DWORD)g_inv_base64[pBuffer[i + 2]] << 6) | + ((FX_DWORD)g_inv_base64[pBuffer[i + 3]]); + pOutBuffer[j] = (FX_BYTE)(dwLimb >> 16) & 0xff; + pOutBuffer[j + 1] = (FX_BYTE)(dwLimb >> 8) & 0xff; + pOutBuffer[j + 2] = (FX_BYTE)(dwLimb) & 0xff; + j += 3; + } + } + FDE_Free(pBuffer); + return j; +} +static FX_CHAR g_base64_chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +FX_LPSTR XFA_Base64Encode(FX_LPCBYTE buf, FX_INT32 buf_len) +{ + FX_LPSTR out = NULL; + int i, j; + FX_DWORD limb; + out = (FX_LPSTR)FX_Alloc(FX_CHAR, ((buf_len * 8 + 5) / 6) + 5); + for (i = 0, j = 0, limb = 0; i + 2 < buf_len; i += 3, j += 4) { + limb = + ((FX_DWORD)buf[i] << 16) | + ((FX_DWORD)buf[i + 1] << 8) | + ((FX_DWORD)buf[i + 2]); + out[j] = g_base64_chars[(limb >> 18) & 63]; + out[j + 1] = g_base64_chars[(limb >> 12) & 63]; + out[j + 2] = g_base64_chars[(limb >> 6) & 63]; + out[j + 3] = g_base64_chars[(limb) & 63]; + } + switch (buf_len - i) { + case 0: + break; + case 1: + limb = ((FX_DWORD)buf[i]); + out[j++] = g_base64_chars[(limb >> 2) & 63]; + out[j++] = g_base64_chars[(limb << 4) & 63]; + out[j++] = '='; + out[j++] = '='; + break; + case 2: + limb = ((FX_DWORD)buf[i] << 8) | ((FX_DWORD)buf[i + 1]); + out[j++] = g_base64_chars[(limb >> 10) & 63]; + out[j++] = g_base64_chars[(limb >> 4) & 63]; + out[j++] = g_base64_chars[(limb << 2) & 63]; + out[j++] = '='; + break; + default: + break; + } + out[j] = '\0'; + return out; +} +FXCODEC_IMAGE_TYPE XFA_GetImageType(FX_WSTR wsType) +{ + CFX_WideString wsContentType(wsType); + wsContentType.MakeLower(); + if (wsContentType == FX_WSTRC(L"image/jpg")) { + return FXCODEC_IMAGE_JPG; + } + if (wsContentType == FX_WSTRC(L"image/png")) { + return FXCODEC_IMAGE_PNG; + } + if (wsContentType == FX_WSTRC(L"image/gif")) { + return FXCODEC_IMAGE_GIF; + } + if (wsContentType == FX_WSTRC(L"image/bmp")) { + return FXCODEC_IMAGE_BMP; + } + if (wsContentType == FX_WSTRC(L"image/tif")) { + return FXCODEC_IMAGE_TIF; + } + return FXCODEC_IMAGE_UNKNOWN; +} +CFX_DIBitmap* XFA_LoadImageData(CXFA_FFDoc *pDoc, CXFA_Image *pImage, FX_BOOL &bNameImage, FX_INT32 &iImageXDpi, FX_INT32 &iImageYDpi) +{ + CFX_WideString wsHref; + pImage->GetHref(wsHref); + CFX_WideString wsImage; + pImage->GetContent(wsImage); + if (wsHref.IsEmpty() && wsImage.IsEmpty()) { + return NULL; + } + CFX_WideString wsContentType; + pImage->GetContentType(wsContentType); + FXCODEC_IMAGE_TYPE type = XFA_GetImageType(wsContentType); + CFX_ByteString bsContent; + FX_LPBYTE pImageBuffer = NULL; + IFX_FileRead* pImageFileRead = NULL; + if (wsImage.GetLength() > 0) { + XFA_ATTRIBUTEENUM iEncoding = (XFA_ATTRIBUTEENUM)pImage->GetTransferEncoding(); + if (iEncoding == XFA_ATTRIBUTEENUM_Base64) { + CFX_ByteString bsData = wsImage.UTF8Encode(); + FX_INT32 iLength = bsData.GetLength(); + pImageBuffer = FDE_Alloc(iLength); + FX_INT32 iRead = XFA_Base64Decode((FX_LPCSTR)bsData, pImageBuffer); + if (iRead > 0) { + pImageFileRead = FX_CreateMemoryStream(pImageBuffer, iRead); + } + } else { + bsContent = CFX_ByteString::FromUnicode(wsImage); + pImageFileRead = FX_CreateMemoryStream((FX_LPBYTE)(FX_LPCBYTE)bsContent, bsContent.GetLength()); + } + } else { + CFX_WideString wsURL = wsHref; + if (wsURL.Left(7) != FX_WSTRC(L"http://") && wsURL.Left(6) != FX_WSTRC(L"ftp://")) { + CFX_DIBitmap *pBitmap = pDoc->GetPDFNamedImage(wsURL, iImageXDpi, iImageYDpi); + if (pBitmap != NULL) { + bNameImage = TRUE; + return pBitmap; + } + } + pImageFileRead = pDoc->GetDocProvider()->OpenLinkedFile((XFA_HDOC)pDoc, wsURL); + } + if (!pImageFileRead) { + if (pImageBuffer) { + FDE_Free(pImageBuffer); + } + return NULL; + } + bNameImage = FALSE; + CFX_DIBitmap* pBitmap = XFA_LoadImageFromBuffer(pImageFileRead, type, iImageXDpi, iImageYDpi); + if (pImageBuffer) { + FDE_Free(pImageBuffer); + } + pImageFileRead->Release(); + return pBitmap; +} +static FXDIB_Format XFA_GetDIBFormat(FXCODEC_IMAGE_TYPE type, FX_INT32 iComponents, FX_INT32 iBitsPerComponent) +{ + FXDIB_Format dibFormat = FXDIB_Argb; + switch (type) { + case FXCODEC_IMAGE_BMP: + case FXCODEC_IMAGE_JPG: + case FXCODEC_IMAGE_TIF: { + dibFormat = FXDIB_Rgb32; + FX_INT32 bpp = iComponents * iBitsPerComponent; + if (bpp <= 24) { + dibFormat = FXDIB_Rgb; + } + } + break; + case FXCODEC_IMAGE_PNG: + default: + break; + } + return dibFormat; +} +CFX_DIBitmap* XFA_LoadImageFromBuffer(IFX_FileRead* pImageFileRead, FXCODEC_IMAGE_TYPE type, FX_INT32 &iImageXDpi, FX_INT32 &iImageYDpi) +{ + CFX_GEModule* pGeModule = CFX_GEModule::Get(); + if (!pGeModule) { + return NULL; + } + CCodec_ModuleMgr* pCodecMgr = pGeModule->GetCodecModule(); + if (!pCodecMgr) { + return NULL; + } + CFX_DIBAttribute dibAttr; + CFX_DIBitmap* pBitmap = NULL; + ICodec_ProgressiveDecoder* pProgressiveDecoder = pCodecMgr->CreateProgressiveDecoder(); + FXCODEC_STATUS status = pProgressiveDecoder->LoadImageInfo(pImageFileRead, type, &dibAttr); + switch (dibAttr.m_wDPIUnit) { + case FXCODEC_RESUNIT_CENTIMETER: + dibAttr.m_nXDPI = (FX_INT32)(dibAttr.m_nXDPI * 2.54f); + dibAttr.m_nYDPI = (FX_INT32)(dibAttr.m_nYDPI * 2.54f); + break; + case FXCODEC_RESUNIT_METER: + dibAttr.m_nXDPI = (FX_INT32)(dibAttr.m_nXDPI / (FX_FLOAT)100 * 2.54f); + dibAttr.m_nYDPI = (FX_INT32)(dibAttr.m_nYDPI / (FX_FLOAT)100 * 2.54f); + break;; + default: + break; + } + iImageXDpi = dibAttr.m_nXDPI > 1 ? dibAttr.m_nXDPI : (96); + iImageYDpi = dibAttr.m_nYDPI > 1 ? dibAttr.m_nYDPI : (96); + if (pProgressiveDecoder->GetWidth() > 0 && pProgressiveDecoder->GetHeight() > 0) { + type = pProgressiveDecoder->GetType(); + FX_INT32 iComponents = pProgressiveDecoder->GetNumComponents(); + FX_INT32 iBpc = pProgressiveDecoder->GetBPC(); + FXDIB_Format dibFormat = XFA_GetDIBFormat(type, iComponents, iBpc); + pBitmap = FX_NEW CFX_DIBitmap(); + pBitmap->Create(pProgressiveDecoder->GetWidth(), pProgressiveDecoder->GetHeight(), dibFormat); + pBitmap->Clear(0xffffffff); + FX_INT32 nFrames; + if ((pProgressiveDecoder->GetFrames(nFrames) == FXCODEC_STATUS_DECODE_READY) && (nFrames > 0)) { + pProgressiveDecoder->StartDecode(pBitmap, 0, 0, pBitmap->GetWidth(), pBitmap->GetHeight()); + pProgressiveDecoder->ContinueDecode(); + } + } + delete pProgressiveDecoder; + return pBitmap; +} +void XFA_RectWidthoutMargin(CFX_RectF &rt, const CXFA_Margin &mg, FX_BOOL bUI ) +{ + if (!mg) { + return; + } + FX_FLOAT fLeftInset, fTopInset, fRightInset, fBottomInset; + mg.GetLeftInset(fLeftInset); + mg.GetTopInset(fTopInset); + mg.GetRightInset(fRightInset); + mg.GetBottomInset(fBottomInset); + rt.Deflate(fLeftInset, fTopInset, fRightInset, fBottomInset); +} +CXFA_FFWidget* XFA_GetWidgetFromLayoutItem(CXFA_LayoutItem* pLayoutItem) +{ + XFA_ELEMENT iType = pLayoutItem->GetFormNode()->GetClassID(); + if (XFA_IsCreateWidget(iType)) { + return (CXFA_FFWidget*)(CXFA_ContentLayoutItemImpl*)pLayoutItem; + } + return NULL; +} +FX_BOOL XFA_IsCreateWidget(XFA_ELEMENT iType) +{ + return iType == XFA_ELEMENT_Field || iType == XFA_ELEMENT_Draw || iType == XFA_ELEMENT_Subform || iType == XFA_ELEMENT_ExclGroup; +} +static void XFA_BOX_GetPath_Arc(CXFA_Box box, CFX_RectF rtDraw, CFX_Path &fillPath, FX_DWORD dwFlags) +{ + FX_FLOAT a, b; + a = rtDraw.width / 2.0f; + b = rtDraw.height / 2.0f; + if (box.IsCircular() || (dwFlags & XFA_DRAWBOX_ForceRound) != 0) { + a = b = FX_MIN(a, b); + } + CFX_PointF center = rtDraw.Center(); + rtDraw.left = center.x - a; + rtDraw.top = center.y - b; + rtDraw.width = a + a; + rtDraw.height = b + b; + FX_FLOAT startAngle = 0, sweepAngle = 360; + FX_BOOL bStart = box.GetStartAngle(startAngle); + FX_BOOL bEnd = box.GetSweepAngle(sweepAngle); + if (!bStart && !bEnd) { + fillPath.AddEllipse(rtDraw); + return; + } + startAngle = -startAngle * FX_PI / 180.0f; + sweepAngle = -sweepAngle * FX_PI / 180.0f; + fillPath.AddArc(rtDraw.left, rtDraw.top, rtDraw.width, rtDraw.height, startAngle, sweepAngle); +} +static void XFA_BOX_GetPath(CXFA_Box box, const CXFA_StrokeArray &strokes, CFX_RectF rtWidget, CFX_Path &path, FX_INT32 nIndex, FX_BOOL bStart, FX_BOOL bCorner) +{ + FXSYS_assert(nIndex >= 0 && nIndex < 8); + FX_BOOL bInverted, bRound; + FX_FLOAT fRadius1, fRadius2, sx, sy, vx, vy, nx, ny, offsetY, offsetX, offsetEX, offsetEY; + CFX_PointF cpStart, cp, cp1, cp2; + CFX_RectF rtRadius; + FX_INT32 n = (nIndex & 1) ? nIndex - 1 : nIndex; + CXFA_Corner corner1 = (CXFA_Node*)strokes[n]; + CXFA_Corner corner2 = (CXFA_Node*)strokes[(n + 2) % 8]; + fRadius1 = bCorner ? corner1.GetRadius() : 0; + fRadius2 = bCorner ? corner2.GetRadius() : 0; + bInverted = corner1.IsInverted(); + offsetY = 0.0f; + offsetX = 0.0f; + bRound = corner1.GetJoinType() == XFA_ATTRIBUTEENUM_Round; + FX_FLOAT halfAfter = 0.0f; + FX_FLOAT halfBefore = 0.0f; + CXFA_Stroke stroke = strokes[nIndex]; + if(stroke.IsCorner()) { + CXFA_Stroke edgeBefore = strokes[(nIndex + 1 * 8 - 1) % 8]; + CXFA_Stroke edgeAfter = strokes[nIndex + 1]; + if( stroke.IsInverted()) { + if(!stroke.SameStyles(edgeBefore)) { + halfBefore = edgeBefore.GetThickness() / 2; + } + if(!stroke.SameStyles(edgeAfter)) { + halfAfter = edgeAfter.GetThickness() / 2; + } + } + } else { + CXFA_Stroke edgeBefore = strokes[(nIndex + 8 - 2) % 8]; + CXFA_Stroke edgeAfter = strokes[(nIndex + 2) % 8]; + if(!bRound && !bInverted) { + { + halfBefore = edgeBefore.GetThickness() / 2; + } + { + halfAfter = edgeAfter.GetThickness() / 2; + } + } + } + offsetEX = 0.0f; + offsetEY = 0.0f; + if (bRound) { + sy = FX_PI / 2; + } + switch (nIndex) { + case 0: + case 1: + cp1 = rtWidget.TopLeft(); + cp2 = rtWidget.TopRight(); + if (nIndex == 0) { + cpStart.x = cp1.x - halfBefore; + cpStart.y = cp1.y + fRadius1, offsetY = - halfAfter; + } else { + cpStart.x = cp1.x + fRadius1 - halfBefore, cpStart.y = cp1.y, offsetEX = halfAfter; + } + vx = 1, vy = 1; + nx = -1, ny = 0; + if (bRound) { + sx = bInverted ? FX_PI / 2 : FX_PI; + } else { + sx = 1, sy = 0; + } + break; + case 2: + case 3: + cp1 = rtWidget.TopRight(); + cp2 = rtWidget.BottomRight(); + if (nIndex == 2) { + cpStart.x = cp1.x - fRadius1, cpStart.y = cp1.y - halfBefore, offsetX = halfAfter; + } else { + cpStart.x = cp1.x, cpStart.y = cp1.y + fRadius1 - halfBefore, offsetEY = halfAfter; + } + vx = -1, vy = 1; + nx = 0, ny = -1; + if (bRound) { + sx = bInverted ? FX_PI : FX_PI * 3 / 2; + } else { + sx = 0, sy = 1; + } + break; + case 4: + case 5: + cp1 = rtWidget.BottomRight(); + cp2 = rtWidget.BottomLeft(); + if (nIndex == 4) { + cpStart.x = cp1.x + halfBefore , cpStart.y = cp1.y - fRadius1, offsetY = halfAfter; + } else { + cpStart.x = cp1.x - fRadius1 + halfBefore, cpStart.y = cp1.y, offsetEX = -halfAfter ; + } + vx = -1, vy = -1; + nx = 1, ny = 0; + if (bRound) { + sx = bInverted ? FX_PI * 3 / 2 : 0; + } else { + sx = -1, sy = 0; + } + break; + case 6: + case 7: + cp1 = rtWidget.BottomLeft(); + cp2 = rtWidget.TopLeft(); + if (nIndex == 6) { + cpStart.x = cp1.x + fRadius1, cpStart.y = cp1.y + halfBefore, offsetX = -halfAfter; + } else { + cpStart.x = cp1.x, cpStart.y = cp1.y - fRadius1 + halfBefore, offsetEY = -halfAfter; + } + vx = 1, vy = -1; + nx = 0, ny = 1; + if (bRound) { + sx = bInverted ? 0 : FX_PI / 2; + } else { + sx = 0, sy = -1; + } + break; + } + if (bStart) { + path.MoveTo(cpStart.x, cpStart.y); + } + if (nIndex & 1) { + path.LineTo(cp2.x + fRadius2 * nx + offsetEX, cp2.y + fRadius2 * ny + offsetEY); + return; + } + if (bRound) { + if (fRadius1 < 0) { + sx -= FX_PI; + } + if (bInverted) { + sy *= -1; + } + rtRadius.Set(cp1.x + offsetX * 2, cp1.y + offsetY * 2 , fRadius1 * 2 * vx - offsetX * 2, fRadius1 * 2 * vy - offsetY * 2); + rtRadius.Normalize(); + if (bInverted) { + rtRadius.Offset(-fRadius1 * vx, -fRadius1 * vy); + } + path.ArcTo(rtRadius.left, rtRadius.top, rtRadius.width, rtRadius.height, sx, sy); + } else { + if (bInverted) { + cp.x = cp1.x + fRadius1 * vx, cp.y = cp1.y + fRadius1 * vy; + } else { + cp = cp1; + } + path.LineTo(cp.x, cp.y); + path.LineTo(cp1.x + fRadius1 * sx + offsetX, cp1.y + fRadius1 * sy + offsetY); + } +} +static void XFA_BOX_GetFillPath(CXFA_Box box, const CXFA_StrokeArray &strokes, CFX_RectF rtWidget, CFX_Path &fillPath, FX_WORD dwFlags) +{ + if (box.IsArc() || (dwFlags & XFA_DRAWBOX_ForceRound) != 0) { + CXFA_Edge edge = box.GetEdge(0); + FX_FLOAT fThickness = edge.GetThickness(); + if (fThickness < 0) { + fThickness = 0; + } + FX_FLOAT fHalf = fThickness / 2; + FX_INT32 iHand = box.GetHand(); + if (iHand == XFA_ATTRIBUTEENUM_Left) { + rtWidget.Inflate(fHalf, fHalf); + } else if (iHand == XFA_ATTRIBUTEENUM_Right) { + rtWidget.Deflate(fHalf, fHalf); + } + XFA_BOX_GetPath_Arc(box, rtWidget, fillPath, dwFlags); + return; + } + FX_BOOL bSameStyles = TRUE; + FX_INT32 i; + CXFA_Stroke stroke1 = strokes[0]; + for (i = 1; i < 8; i ++) { + CXFA_Stroke stroke2 = strokes[i]; + if (!stroke1.SameStyles(stroke2)) { + bSameStyles = FALSE; + break; + } + stroke1 = stroke2; + } + if (bSameStyles) { + stroke1 = strokes[0]; + for (i = 2; i < 8; i += 2) { + CXFA_Stroke stroke2 = strokes[i]; + if (!stroke1.SameStyles(stroke2, XFA_STROKE_SAMESTYLE_NoPresence | XFA_STROKE_SAMESTYLE_Corner)) { + bSameStyles = FALSE; + break; + } + stroke1 = stroke2; + } + if (bSameStyles) { + stroke1 = strokes[0]; + if (stroke1.IsInverted()) { + bSameStyles = FALSE; + } + if (stroke1.GetJoinType() != XFA_ATTRIBUTEENUM_Square) { + bSameStyles = FALSE; + } + } + } + if (bSameStyles) { + fillPath.AddRectangle(rtWidget.left, rtWidget.top, rtWidget.width, rtWidget.height); + return; + } + FX_BOOL bInverted, bRound; + FX_FLOAT fRadius1, fRadius2, sx, sy, vx, vy, nx, ny; + CFX_PointF cp, cp1, cp2; + CFX_RectF rtRadius; + for (FX_INT32 i = 0; i < 8; i += 2) { + CXFA_Corner corner1 = (CXFA_Node*)strokes[i]; + CXFA_Corner corner2 = (CXFA_Node*)strokes[(i + 2) % 8]; + fRadius1 = corner1.GetRadius(); + fRadius2 = corner2.GetRadius(); + bInverted = corner1.IsInverted(); + bRound = corner1.GetJoinType() == XFA_ATTRIBUTEENUM_Round; + if (bRound) { + sy = FX_PI / 2; + } + switch (i) { + case 0: + cp1 = rtWidget.TopLeft(); + cp2 = rtWidget.TopRight(); + vx = 1, vy = 1; + nx = -1, ny = 0; + if (bRound) { + sx = bInverted ? FX_PI / 2 : FX_PI; + } else { + sx = 1, sy = 0; + } + break; + case 2: + cp1 = rtWidget.TopRight(); + cp2 = rtWidget.BottomRight(); + vx = -1, vy = 1; + nx = 0, ny = -1; + if (bRound) { + sx = bInverted ? FX_PI : FX_PI * 3 / 2; + } else { + sx = 0, sy = 1; + } + break; + case 4: + cp1 = rtWidget.BottomRight(); + cp2 = rtWidget.BottomLeft(); + vx = -1, vy = -1; + nx = 1, ny = 0; + if (bRound) { + sx = bInverted ? FX_PI * 3 / 2 : 0; + } else { + sx = -1, sy = 0; + } + break; + case 6: + cp1 = rtWidget.BottomLeft(); + cp2 = rtWidget.TopLeft(); + vx = 1, vy = -1; + nx = 0, ny = 1; + if (bRound) { + sx = bInverted ? 0 : FX_PI / 2; + } else { + sx = 0, sy = -1; + } + break; + } + if (i == 0) { + fillPath.MoveTo(cp1.x, cp1.y + fRadius1); + } + if (bRound) { + if (fRadius1 < 0) { + sx -= FX_PI; + } + if (bInverted) { + sy *= -1; + } + rtRadius.Set(cp1.x, cp1.y, fRadius1 * 2 * vx, fRadius1 * 2 * vy); + rtRadius.Normalize(); + if (bInverted) { + rtRadius.Offset(-fRadius1 * vx, -fRadius1 * vy); + } + fillPath.ArcTo(rtRadius.left, rtRadius.top, rtRadius.width, rtRadius.height, sx, sy); + } else { + if (bInverted) { + cp.x = cp1.x + fRadius1 * vx, cp.y = cp1.y + fRadius1 * vy; + } else { + cp = cp1; + } + fillPath.LineTo(cp.x, cp.y); + fillPath.LineTo(cp1.x + fRadius1 * sx, cp1.y + fRadius1 * sy); + } + fillPath.LineTo(cp2.x + fRadius2 * nx, cp2.y + fRadius2 * ny); + } +} +static void XFA_BOX_Fill_Radial(CXFA_Box box, CFX_Graphics* pGS, CFX_Path &fillPath, CFX_RectF rtFill, CFX_Matrix* pMatrix) +{ + CXFA_Fill fill = box.GetFill(); + FX_ARGB crStart, crEnd; + crStart = fill.GetColor(); + FX_INT32 iType = fill.GetRadial(crEnd); + CFX_Shading shading; + if (iType != XFA_ATTRIBUTEENUM_ToEdge) { + FX_ARGB temp = crEnd; + crEnd = crStart; + crStart = temp; + } + shading.CreateRadial(rtFill.Center(), rtFill.Center(), 0, FXSYS_sqrt(rtFill.Width()*rtFill.Width() + rtFill.Height()*rtFill.Height()) / 2, TRUE, TRUE, crStart, crEnd); + CFX_Color cr(&shading); + pGS->SetFillColor(&cr); + pGS->FillPath(&fillPath, FXFILL_WINDING, pMatrix); +} +static void XFA_BOX_Fill_Pattern(CXFA_Box box, CFX_Graphics* pGS, CFX_Path &fillPath, CFX_RectF rtFill, CFX_Matrix* pMatrix) +{ + CXFA_Fill fill = box.GetFill(); + FX_ARGB crStart, crEnd; + crStart = fill.GetColor(); + FX_INT32 iType = fill.GetPattern(crEnd); + FX_INT32 iHatch = FX_HATCHSTYLE_Cross; + switch(iType) { + case XFA_ATTRIBUTEENUM_CrossDiagonal: + iHatch = FX_HATCHSTYLE_DiagonalCross; + break; + case XFA_ATTRIBUTEENUM_DiagonalLeft: + iHatch = FX_HATCHSTYLE_ForwardDiagonal; + break; + case XFA_ATTRIBUTEENUM_DiagonalRight: + iHatch = FX_HATCHSTYLE_BackwardDiagonal; + break; + case XFA_ATTRIBUTEENUM_Horizontal: + iHatch = FX_HATCHSTYLE_Horizontal; + break; + case XFA_ATTRIBUTEENUM_Vertical: + iHatch = FX_HATCHSTYLE_Vertical; + break; + default: + break; + } + CFX_Pattern pattern; + pattern.Create(iHatch, crEnd, crStart); + CFX_Color cr(&pattern); + pGS->SetFillColor(&cr); + pGS->FillPath(&fillPath, FXFILL_WINDING, pMatrix); +} +static void XFA_BOX_Fill_Linear(CXFA_Box box, CFX_Graphics* pGS, CFX_Path &fillPath, CFX_RectF rtFill, CFX_Matrix* pMatrix) +{ + CXFA_Fill fill = box.GetFill(); + FX_ARGB crStart, crEnd; + crStart = fill.GetColor(); + FX_INT32 iType = fill.GetLinear(crEnd); + CFX_PointF ptStart, ptEnd; + switch(iType) { + case XFA_ATTRIBUTEENUM_ToRight: + ptStart.Set(rtFill.left, rtFill.top); + ptEnd.Set(rtFill.right(), rtFill.top); + break; + case XFA_ATTRIBUTEENUM_ToBottom: + ptStart.Set(rtFill.left, rtFill.top); + ptEnd.Set(rtFill.left, rtFill.bottom()); + break; + case XFA_ATTRIBUTEENUM_ToLeft: + ptStart.Set(rtFill.right(), rtFill.top); + ptEnd.Set(rtFill.left, rtFill.top); + break; + case XFA_ATTRIBUTEENUM_ToTop: + ptStart.Set(rtFill.left, rtFill.bottom()); + ptEnd.Set(rtFill.left, rtFill.top); + break; + default: + break; + } + CFX_Shading shading; + shading.CreateAxial(ptStart, ptEnd, FALSE, FALSE, crStart, crEnd); + CFX_Color cr(&shading); + pGS->SetFillColor(&cr); + pGS->FillPath(&fillPath, FXFILL_WINDING, pMatrix); +} +static void XFA_BOX_Fill(CXFA_Box box, const CXFA_StrokeArray &strokes, CFX_Graphics* pGS, const CFX_RectF &rtWidget, CFX_Matrix* pMatrix, FX_DWORD dwFlags) +{ + CXFA_Fill fill = box.GetFill(); + if (!fill.IsExistInXML() || fill.GetPresence() != XFA_ATTRIBUTEENUM_Visible) { + return; + } + pGS->SaveGraphState(); + CFX_Path fillPath; + fillPath.Create(); + XFA_BOX_GetFillPath(box, strokes, rtWidget, fillPath, (dwFlags & XFA_DRAWBOX_ForceRound) != 0); + fillPath.Close(); + FX_INT32 eType = fill.GetFillType(); + switch(eType) { + case XFA_ELEMENT_Radial: + XFA_BOX_Fill_Radial(box, pGS, fillPath, rtWidget, pMatrix); + break; + case XFA_ELEMENT_Pattern: + XFA_BOX_Fill_Pattern(box, pGS, fillPath, rtWidget, pMatrix); + break; + case XFA_ELEMENT_Linear: + XFA_BOX_Fill_Linear(box, pGS, fillPath, rtWidget, pMatrix); + break; + default: { + FX_ARGB cr; + if (eType == XFA_ELEMENT_Stipple) { + FX_INT32 iRate = fill.GetStipple(cr); + if (iRate == 0) { + iRate = 100; + } + FX_INT32 a = 0; + FX_COLORREF rgb; + ArgbDecode(cr, a, rgb); + cr = ArgbEncode(iRate * a / 100, rgb); + } else { + cr = fill.GetColor(); + } + CFX_Color fillColor(cr); + pGS->SetFillColor(&fillColor); + pGS->FillPath(&fillPath, FXFILL_WINDING, pMatrix); + } + break; + } + pGS->RestoreGraphState(); +} +static void XFA_BOX_StrokePath(CXFA_Stroke stroke, CFX_Path *pPath, CFX_Graphics* pGS, CFX_Matrix* pMatrix) +{ + if (!stroke.IsExistInXML() || !stroke.IsVisible()) { + return; + } + FX_FLOAT fThickness = stroke.GetThickness(); + if (fThickness < 0.001f) { + return; + } + pGS->SaveGraphState(); + if(stroke.IsCorner() && fThickness > 2 * stroke.GetRadius()) { + fThickness = 2 * stroke.GetRadius(); + } + pGS->SetLineWidth(fThickness, TRUE); + pGS->SetLineCap(CFX_GraphStateData::LineCapButt); + XFA_StrokeTypeSetLineDash(pGS, stroke.GetStrokeType(), XFA_ATTRIBUTEENUM_Butt); + CFX_Color fxColor(stroke.GetColor()); + pGS->SetStrokeColor(&fxColor); + pGS->StrokePath(pPath, pMatrix); + pGS->RestoreGraphState(); +} +static void XFA_BOX_StrokeArc(CXFA_Box box, CFX_Graphics* pGS, CFX_RectF rtWidget, CFX_Matrix* pMatrix, FX_DWORD dwFlags) +{ + CXFA_Edge edge = box.GetEdge(0); + if (!edge.IsExistInXML() || !edge.IsVisible()) { + return; + } + FX_BOOL bVisible = FALSE; + FX_FLOAT fThickness = 0; + FX_INT32 i3DType = box.Get3DStyle(bVisible, fThickness); + if (i3DType) { + if (bVisible && fThickness >= 0.001f) { + dwFlags |= XFA_DRAWBOX_Lowered3D; + } + } + FX_FLOAT fHalf = edge.GetThickness() / 2; + if (fHalf < 0) { + fHalf = 0; + } + FX_INT32 iHand = box.GetHand(); + if (iHand == XFA_ATTRIBUTEENUM_Left) { + rtWidget.Inflate(fHalf, fHalf); + } else if (iHand == XFA_ATTRIBUTEENUM_Right) { + rtWidget.Deflate(fHalf, fHalf); + } + if ((dwFlags & XFA_DRAWBOX_ForceRound) == 0 || (dwFlags & XFA_DRAWBOX_Lowered3D) == 0) { + if (fHalf < 0.001f) { + return; + } + CFX_Path arcPath; + arcPath.Create(); + XFA_BOX_GetPath_Arc(box, rtWidget, arcPath, dwFlags); + XFA_BOX_StrokePath(edge, &arcPath, pGS, pMatrix); + return; + } + pGS->SaveGraphState(); + pGS->SetLineWidth(fHalf); + FX_FLOAT a, b; + a = rtWidget.width / 2.0f; + b = rtWidget.height / 2.0f; + if (dwFlags & XFA_DRAWBOX_ForceRound) { + a = b = FX_MIN(a, b); + } + CFX_PointF center = rtWidget.Center(); + rtWidget.left = center.x - a; + rtWidget.top = center.y - b; + rtWidget.width = a + a; + rtWidget.height = b + b; + FX_FLOAT startAngle = 0, sweepAngle = 360; + startAngle = startAngle * FX_PI / 180.0f; + sweepAngle = -sweepAngle * FX_PI / 180.0f; + CFX_Path arcPath; + arcPath.Create(); + arcPath.AddArc(rtWidget.left, rtWidget.top, rtWidget.width, rtWidget.height, 3.0f * FX_PI / 4.0f, FX_PI); + CFX_Color cr(0xFF808080); + pGS->SetStrokeColor(&cr); + pGS->StrokePath(&arcPath, pMatrix); + arcPath.Clear(); + arcPath.AddArc(rtWidget.left, rtWidget.top, rtWidget.width, rtWidget.height, -1.0f * FX_PI / 4.0f, FX_PI); + cr.Set(0xFFFFFFFF); + pGS->SetStrokeColor(&cr); + pGS->StrokePath(&arcPath, pMatrix); + rtWidget.Deflate(fHalf, fHalf); + arcPath.Clear(); + arcPath.AddArc(rtWidget.left, rtWidget.top, rtWidget.width, rtWidget.height, 3.0f * FX_PI / 4.0f, FX_PI); + cr.Set(0xFF404040); + pGS->SetStrokeColor(&cr); + pGS->StrokePath(&arcPath, pMatrix); + arcPath.Clear(); + arcPath.AddArc(rtWidget.left, rtWidget.top, rtWidget.width, rtWidget.height, -1.0f * FX_PI / 4.0f, FX_PI); + cr.Set(0xFFC0C0C0); + pGS->SetStrokeColor(&cr); + pGS->StrokePath(&arcPath, pMatrix); + pGS->RestoreGraphState(); +} +static void XFA_Draw3DRect(CFX_Graphics* pGraphic, const CFX_RectF& rt, FX_FLOAT fLineWidth, CFX_Matrix* pMatrix, FX_ARGB argbTopLeft, FX_ARGB argbBottomRight) +{ + CFX_Color crLT(argbTopLeft); + pGraphic->SetFillColor(&crLT); + FX_FLOAT fBottom = rt.bottom(); + FX_FLOAT fRight = rt.right(); + CFX_Path pathLT; + pathLT.Create(); + pathLT.MoveTo(rt.left, fBottom); + pathLT.LineTo(rt.left, rt.top); + pathLT.LineTo(fRight, rt.top); + pathLT.LineTo(fRight - fLineWidth, rt.top + fLineWidth); + pathLT.LineTo(rt.left + fLineWidth, rt.top + fLineWidth); + pathLT.LineTo(rt.left + fLineWidth, fBottom - fLineWidth); + pathLT.LineTo(rt.left, fBottom); + pGraphic->FillPath(&pathLT, FXFILL_WINDING, pMatrix); + CFX_Color crRB(argbBottomRight); + pGraphic->SetFillColor(&crRB); + CFX_Path pathRB; + pathRB.Create(); + pathRB.MoveTo(fRight, rt.top); + pathRB.LineTo(fRight, fBottom); + pathRB.LineTo(rt.left, fBottom); + pathRB.LineTo(rt.left + fLineWidth, fBottom - fLineWidth); + pathRB.LineTo(fRight - fLineWidth, fBottom - fLineWidth); + pathRB.LineTo(fRight - fLineWidth, rt.top + fLineWidth); + pathRB.LineTo(fRight, rt.top); + pGraphic->FillPath(&pathRB, FXFILL_WINDING, pMatrix); +} +static void XFA_BOX_Stroke_3DRect_Lowered(CFX_Graphics* pGS, CFX_RectF rt, FX_FLOAT fThickness, CFX_Matrix* pMatrix) +{ + FX_FLOAT fHalfWidth = fThickness / 2.0f; + CFX_RectF rtInner(rt); + rtInner.Deflate(fHalfWidth, fHalfWidth); + CFX_Color cr(0xFF000000); + pGS->SetFillColor(&cr); + CFX_Path path; + path.Create(); + path.AddRectangle(rt.left, rt.top, rt.width, rt.height); + path.AddRectangle(rtInner.left, rtInner.top, rtInner.width, rtInner.height); + pGS->FillPath(&path, FXFILL_ALTERNATE, pMatrix); + XFA_Draw3DRect(pGS, rtInner, fHalfWidth, pMatrix, 0xFF808080, 0xFFC0C0C0); +} +static void XFA_BOX_Stroke_3DRect_Raised(CFX_Graphics* pGS, CFX_RectF rt, FX_FLOAT fThickness, CFX_Matrix* pMatrix) +{ + FX_FLOAT fHalfWidth = fThickness / 2.0f; + CFX_RectF rtInner(rt); + rtInner.Deflate(fHalfWidth, fHalfWidth); + CFX_Color cr(0xFF000000); + pGS->SetFillColor(&cr); + CFX_Path path; + path.Create(); + path.AddRectangle(rt.left, rt.top, rt.width, rt.height); + path.AddRectangle(rtInner.left, rtInner.top, rtInner.width, rtInner.height); + pGS->FillPath(&path, FXFILL_ALTERNATE, pMatrix); + XFA_Draw3DRect(pGS, rtInner, fHalfWidth, pMatrix, 0xFFFFFFFF, 0xFF808080); +} +static void XFA_BOX_Stroke_3DRect_Etched(CFX_Graphics* pGS, CFX_RectF rt, FX_FLOAT fThickness, CFX_Matrix* pMatrix) +{ + FX_FLOAT fHalfWidth = fThickness / 2.0f; + XFA_Draw3DRect(pGS, rt, fThickness, pMatrix, 0xFF808080, 0xFFFFFFFF); + CFX_RectF rtInner(rt); + rtInner.Deflate(fHalfWidth, fHalfWidth); + XFA_Draw3DRect(pGS, rtInner, fHalfWidth, pMatrix, 0xFFFFFFFF, 0xFF808080); +} +static void XFA_BOX_Stroke_3DRect_Embossed(CFX_Graphics* pGS, CFX_RectF rt, FX_FLOAT fThickness, CFX_Matrix* pMatrix) +{ + FX_FLOAT fHalfWidth = fThickness / 2.0f; + XFA_Draw3DRect(pGS, rt, fThickness, pMatrix, 0xFF808080, 0xFF000000); + CFX_RectF rtInner(rt); + rtInner.Deflate(fHalfWidth, fHalfWidth); + XFA_Draw3DRect(pGS, rtInner, fHalfWidth, pMatrix, 0xFF000000, 0xFF808080); +} +static void XFA_BOX_Stroke_Rect(CXFA_Box box, const CXFA_StrokeArray &strokes, CFX_Graphics* pGS, CFX_RectF rtWidget, CFX_Matrix* pMatrix) +{ + FX_BOOL bVisible = FALSE; + FX_FLOAT fThickness = 0; + FX_INT32 i3DType = box.Get3DStyle(bVisible, fThickness); + if (i3DType) { + if (!bVisible || fThickness < 0.001f) { + return; + } + switch (i3DType) { + case XFA_ATTRIBUTEENUM_Lowered: + XFA_BOX_Stroke_3DRect_Lowered(pGS, rtWidget, fThickness, pMatrix); + break; + case XFA_ATTRIBUTEENUM_Raised: + XFA_BOX_Stroke_3DRect_Raised(pGS, rtWidget, fThickness, pMatrix); + break; + case XFA_ATTRIBUTEENUM_Etched: + XFA_BOX_Stroke_3DRect_Etched(pGS, rtWidget, fThickness, pMatrix); + break; + case XFA_ATTRIBUTEENUM_Embossed: + XFA_BOX_Stroke_3DRect_Embossed(pGS, rtWidget, fThickness, pMatrix); + break; + } + return; + } + FX_BOOL bClose = FALSE; + FX_BOOL bSameStyles = TRUE; + FX_INT32 i; + CXFA_Stroke stroke1 = strokes[0]; + for (i = 1; i < 8; i ++) { + CXFA_Stroke stroke2 = strokes[i]; + if (!stroke1.SameStyles(stroke2)) { + bSameStyles = FALSE; + break; + } + stroke1 = stroke2; + } + if (bSameStyles) { + stroke1 = strokes[0]; + bClose = TRUE; + for (i = 2; i < 8; i += 2) { + CXFA_Stroke stroke2 = strokes[i]; + if (!stroke1.SameStyles(stroke2, XFA_STROKE_SAMESTYLE_NoPresence | XFA_STROKE_SAMESTYLE_Corner)) { + bSameStyles = FALSE; + break; + } + stroke1 = stroke2; + } + if (bSameStyles) { + stroke1 = strokes[0]; + if (stroke1.IsInverted()) { + bSameStyles = FALSE; + } + if (stroke1.GetJoinType() != XFA_ATTRIBUTEENUM_Square) { + bSameStyles = FALSE; + } + } + } + FX_BOOL bStart = TRUE; + CFX_Path path; + path.Create(); + for (i = 0; i < 8; i ++) { + CXFA_Stroke stroke1 = strokes[i]; + if ((i % 1) == 0 && stroke1.GetRadius() < 0) { + FX_BOOL bEmpty = path.IsEmpty(); + if (!bEmpty) { + XFA_BOX_StrokePath(stroke1, &path, pGS, pMatrix); + path.Clear(); + } + bStart = TRUE; + continue; + } + XFA_BOX_GetPath(box, strokes, rtWidget, path, i, bStart, !bSameStyles); + CXFA_Stroke stroke2 = strokes[(i + 1) % 8]; + bStart = !stroke1.SameStyles(stroke2); + if (bStart) { + XFA_BOX_StrokePath(stroke1, &path, pGS, pMatrix); + path.Clear(); + } + } + FX_BOOL bEmpty = path.IsEmpty(); + if (!bEmpty) { + if(bClose) { + path.Close(); + } + XFA_BOX_StrokePath(strokes[7], &path, pGS, pMatrix); + } +} +static void XFA_BOX_Stroke(CXFA_Box box, const CXFA_StrokeArray &strokes, CFX_Graphics* pGS, CFX_RectF rtWidget, CFX_Matrix* pMatrix, FX_DWORD dwFlags) +{ + if (box.IsArc() || (dwFlags & XFA_DRAWBOX_ForceRound) != 0) { + XFA_BOX_StrokeArc(box, pGS, rtWidget, pMatrix, dwFlags); + return; + } + FX_BOOL bVisible = FALSE; + for (FX_INT32 j = 0; j < 4; j ++) { + bVisible |= strokes[j * 2 + 1].IsVisible(); + if (bVisible) { + break; + } + } + if (!bVisible) { + return; + } + for (FX_INT32 i = 1; i < 8; i += 2) { + CXFA_Edge edge = (CXFA_Node*)strokes[i]; + FX_FLOAT fThickness = edge.GetThickness(); + if (fThickness < 0) { + fThickness = 0; + } + FX_FLOAT fHalf = fThickness / 2; + FX_INT32 iHand = box.GetHand(); + switch (i) { + case 1: + if (iHand == XFA_ATTRIBUTEENUM_Left) { + rtWidget.top -= fHalf; + rtWidget.height += fHalf; + } else if (iHand == XFA_ATTRIBUTEENUM_Right) { + rtWidget.top += fHalf; + rtWidget.height -= fHalf; + } + break; + case 3: + if (iHand == XFA_ATTRIBUTEENUM_Left) { + rtWidget.width += fHalf; + } else if (iHand == XFA_ATTRIBUTEENUM_Right) { + rtWidget.width -= fHalf; + } + break; + case 5: + if (iHand == XFA_ATTRIBUTEENUM_Left) { + rtWidget.height += fHalf; + } else if (iHand == XFA_ATTRIBUTEENUM_Right) { + rtWidget.height -= fHalf; + } + break; + case 7: + if (iHand == XFA_ATTRIBUTEENUM_Left) { + rtWidget.left -= fHalf; + rtWidget.width += fHalf; + } else if (iHand == XFA_ATTRIBUTEENUM_Right) { + rtWidget.left += fHalf; + rtWidget.width -= fHalf; + } + break; + } + } + XFA_BOX_Stroke_Rect(box, strokes, pGS, rtWidget, pMatrix); +} +void XFA_DrawBox(CXFA_Box box, CFX_Graphics* pGS, const CFX_RectF &rtWidget, CFX_Matrix* pMatrix, FX_DWORD dwFlags) +{ + if (!box || box.GetPresence() != XFA_ATTRIBUTEENUM_Visible) { + return; + } + FX_INT32 iType = box.GetClassID(); + if (iType != XFA_ELEMENT_Arc && iType != XFA_ELEMENT_Border && iType != XFA_ELEMENT_Rectangle) { + return; + } + CXFA_StrokeArray strokes; + if (!(dwFlags & XFA_DRAWBOX_ForceRound) && iType != XFA_ELEMENT_Arc) { + box.GetStrokes(strokes); + } + XFA_BOX_Fill(box, strokes, pGS, rtWidget, pMatrix, dwFlags); + XFA_BOX_Stroke(box, strokes, pGS, rtWidget, pMatrix, dwFlags); +} diff --git a/xfa/src/fxfa/src/app/xfa_ffwidget.h b/xfa/src/fxfa/src/app/xfa_ffwidget.h new file mode 100644 index 0000000000..bfac36e398 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffwidget.h @@ -0,0 +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 + +#ifndef _FXFA_FORMFILLER_WIDGET_IMP_H +#define _FXFA_FORMFILLER_WIDGET_IMP_H +class CXFA_FFPageView; +class CXFA_FFDocView; +class CXFA_FFDoc; +class CXFA_FFApp; +class CXFA_LayoutItem; +#define XFA_GOTO_POSITION_IF_FAIL(arg, pos) { if (!(arg)) goto pos; } +inline FX_FLOAT XFA_UnitPx2Pt(FX_FLOAT fPx, FX_FLOAT fDpi) +{ + return fPx * 72.0f / fDpi; +} +#define XFA_FLOAT_PERCISION 0.001f +enum XFA_WIDGETITEM { + XFA_WIDGETITEM_Parent, + XFA_WIDGETITEM_FirstChild, + XFA_WIDGETITEM_NextSibling, + XFA_WIDGETITEM_PrevSibling, +}; +class CXFA_CalcData : public CFX_Object +{ +public: + CXFA_CalcData() : m_iRefCount(0) {} + ~CXFA_CalcData() + { + m_Globals.RemoveAll(); + } + CFX_PtrArray m_Globals; + FX_INT32 m_iRefCount; +}; +class CXFA_FFWidget : public CFX_PrivateData, public CXFA_ContentLayoutItemImpl +{ +public: + CXFA_FFWidget(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc); + virtual ~CXFA_FFWidget(); + IXFA_PageView* GetPageView(); + void SetPageView(IXFA_PageView* pPageView); + void GetWidgetRect(CFX_RectF &rtWidget); + CFX_RectF ReCacheWidgetRect(); + FX_DWORD GetStatus(); + void ModifyStatus(FX_DWORD dwAdded, FX_DWORD dwRemoved); + virtual FX_BOOL GetBBox(CFX_RectF &rtBox, FX_DWORD dwStatus, FX_BOOL bDrawFocus = FALSE); + CXFA_WidgetAcc* GetDataAcc(); + FX_BOOL GetToolTip(CFX_WideString &wsToolTip); + virtual void RenderWidget(CFX_Graphics* pGS, CFX_Matrix* pMatrix = NULL, FX_DWORD dwStatus = 0, FX_INT32 iRotate = 0); + + virtual FX_BOOL IsLoaded(); + virtual FX_BOOL LoadWidget(); + virtual void UnloadWidget(); + virtual FX_BOOL LayoutWidget(); + virtual FX_BOOL UpdateFWLData(); + virtual void UpdateWidgetProperty(); + virtual FX_BOOL OnMouseEnter(); + virtual FX_BOOL OnMouseExit(); + virtual FX_BOOL OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnLButtonDblClk(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnMouseWheel(FX_DWORD dwFlags, FX_SHORT zDelta, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnRButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnRButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnRButtonDblClk(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + + virtual FX_BOOL OnSetFocus(CXFA_FFWidget* pOldWidget); + virtual FX_BOOL OnKillFocus(CXFA_FFWidget* pNewWidget); + virtual FX_BOOL OnKeyDown(FX_DWORD dwKeyCode, FX_DWORD dwFlags); + virtual FX_BOOL OnKeyUp(FX_DWORD dwKeyCode, FX_DWORD dwFlags); + virtual FX_BOOL OnChar(FX_DWORD dwChar, FX_DWORD dwFlags); + virtual FX_DWORD OnHitTest(FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnSetCursor(FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL CanUndo() + { + return FALSE; + } + virtual FX_BOOL CanRedo() + { + return FALSE; + } + virtual FX_BOOL Undo() + { + return FALSE; + } + virtual FX_BOOL Redo() + { + return FALSE; + } + virtual FX_BOOL CanCopy() + { + return FALSE; + } + virtual FX_BOOL CanCut() + { + return FALSE; + } + virtual FX_BOOL CanPaste() + { + return FALSE; + } + virtual FX_BOOL CanSelectAll() + { + return FALSE; + } + virtual FX_BOOL CanDelete() + { + return CanCut(); + } + virtual FX_BOOL CanDeSelect() + { + return CanCopy(); + } + virtual FX_BOOL Copy(CFX_WideString &wsCopy) + { + return FALSE; + } + virtual FX_BOOL Cut(CFX_WideString &wsCut) + { + return FALSE; + } + virtual FX_BOOL Paste(const CFX_WideString &wsPaste) + { + return FALSE; + } + virtual FX_BOOL SelectAll() + { + return FALSE; + } + virtual FX_BOOL Delete() + { + return FALSE; + } + virtual FX_BOOL DeSelect() + { + return FALSE; + } + virtual FX_BOOL GetSuggestWords(CFX_PointF pointf, CFX_ByteStringArray &sSuggest) + { + return FALSE; + } + virtual FX_BOOL ReplaceSpellCheckWord(CFX_PointF pointf, FX_BSTR bsReplace) + { + return FALSE; + } + CXFA_FFDocView* GetDocView(); + void SetDocView(CXFA_FFDocView* pDocView) + { + m_pDocView = pDocView; + } + CXFA_FFDoc* GetDoc(); + CXFA_FFApp* GetApp(); + IXFA_AppProvider* GetAppProvider(); + void InvalidateWidget(const CFX_RectF* pRect = NULL); + void AddInvalidateRect(const CFX_RectF* pRect = NULL); + FX_BOOL GetCaptionText(CFX_WideString &wsCap); + FX_BOOL IsFocused(); + CXFA_LayoutItem* GetLayoutItem() + { + return (CXFA_LayoutItem*)(CXFA_ContentLayoutItemImpl*)this; + } + void Rotate2Normal(FX_FLOAT &fx, FX_FLOAT &fy); + void GetRotateMatrix(CFX_Matrix &mt); + FX_BOOL IsLayoutRectEmpty(); + CXFA_FFWidget* GetParent(); + FX_BOOL IsAncestorOf(CXFA_FFWidget* pWidget); + +protected: + virtual FX_BOOL PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy); + void DrawBorder(CFX_Graphics* pGS, CXFA_Box box, const CFX_RectF& rtBorder, CFX_Matrix* pMatrix, FX_DWORD dwFlags = 0); + void GetMinMaxWidth(FX_FLOAT fMinWidth, FX_FLOAT fMaxWidth); + void GetMinMaxHeight(FX_FLOAT fMinHeight, FX_FLOAT fMaxHeight); + void GetRectWithoutRotate(CFX_RectF &rtWidget); + FX_BOOL IsMatchVisibleStatus(FX_DWORD dwStatus); + + void EventKillFocus(); + FX_BOOL IsButtonDown(); + void SetButtonDown(FX_BOOL bSet); + CXFA_FFDocView* m_pDocView; + CXFA_FFPageView* m_pPageView; + CXFA_WidgetAcc* m_pDataAcc; + CFX_RectF m_rtWidget; +}; +FX_INT32 XFA_StrokeTypeSetLineDash(CFX_Graphics* pGraphics, FX_INT32 iStrokeType, FX_INT32 iCapType); +CFX_GraphStateData::LineCap XFA_LineCapToFXGE(FX_INT32 iLineCap); +void XFA_DrawImage(CFX_Graphics* pGS, const CFX_RectF &rtImage, CFX_Matrix* pMatrix, CFX_DIBitmap* pDIBitmap, FX_INT32 iAspect, FX_INT32 iImageXDpi, FX_INT32 iImageYDpi, FX_INT32 iHorzAlign = XFA_ATTRIBUTEENUM_Left, FX_INT32 iVertAlign = XFA_ATTRIBUTEENUM_Top); +CFX_DIBitmap* XFA_LoadImageData(CXFA_FFDoc *pDoc, CXFA_Image *pImage, FX_BOOL &bNameImage, FX_INT32 &iImageXDpi, FX_INT32 &iImageYDpi); +CFX_DIBitmap* XFA_LoadImageFromBuffer(IFX_FileRead* pImageFileRead, FXCODEC_IMAGE_TYPE type, FX_INT32 &iImageXDpi, FX_INT32 &iImageYDpi); +FXCODEC_IMAGE_TYPE XFA_GetImageType(FX_WSTR wsType); +FX_LPSTR XFA_Base64Encode(FX_LPCBYTE buf, FX_INT32 buf_len); +void XFA_RectWidthoutMargin(CFX_RectF &rt, const CXFA_Margin &mg, FX_BOOL bUI = FALSE); +FX_FLOAT XFA_GetEdgeThickness(const CXFA_StrokeArray &strokes, FX_BOOL b3DStyle, FX_INT32 nIndex); +CXFA_FFWidget* XFA_GetWidgetFromLayoutItem(CXFA_LayoutItem* pLayoutItem); +FX_BOOL XFA_IsCreateWidget(XFA_ELEMENT iType); +#define XFA_DRAWBOX_ForceRound 1 +#define XFA_DRAWBOX_Lowered3D 2 +void XFA_DrawBox(CXFA_Box box, CFX_Graphics* pGS, const CFX_RectF &rtWidget, CFX_Matrix* pMatrix, FX_DWORD dwFlags = 0); +#endif diff --git a/xfa/src/fxfa/src/app/xfa_ffwidgetacc.cpp b/xfa/src/fxfa/src/app/xfa_ffwidgetacc.cpp new file mode 100644 index 0000000000..df9ad9f466 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffwidgetacc.cpp @@ -0,0 +1,1713 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_common.h" +#include "xfa_ffwidget.h" +#include "xfa_ffdoc.h" +#include "xfa_ffdocview.h" +#include "xfa_ffpageview.h" +#include "xfa_ffapp.h" +#include "xfa_textlayout.h" +#include "xfa_fwladapter.h" +#include "xfa_fffield.h" +#include "xfa_ffchoicelist.h" +#include "xfa_ffcheckbutton.h" +#include "xfa_ffwidgetacc.h" +#include "xfa_fontmgr.h" +static void XFA_FFDeleteCalcData(FX_LPVOID pData) +{ + if (pData) { + delete ((CXFA_CalcData*)pData); + } +} +static XFA_MAPDATABLOCKCALLBACKINFO gs_XFADeleteCalcData = {XFA_FFDeleteCalcData, NULL}; +class CXFA_WidgetLayoutData : public CFX_Object +{ +public: + CXFA_WidgetLayoutData() + : m_fWidgetHeight(-1) + { + } + virtual ~CXFA_WidgetLayoutData() {} + virtual void Release() + { + delete this; + } + FX_FLOAT m_fWidgetHeight; +}; +class CXFA_TextLayoutData : public CXFA_WidgetLayoutData +{ +public: + CXFA_TextLayoutData() + : m_pTextLayout(NULL) + , m_pTextProvider(NULL) + { + } + ~CXFA_TextLayoutData() + { + if (m_pTextLayout) { + delete m_pTextLayout; + } + m_pTextLayout = NULL; + if (m_pTextProvider) { + delete m_pTextProvider; + } + m_pTextProvider = NULL; + } + FX_BOOL LoadText(CXFA_WidgetAcc* pAcc) + { + if (m_pTextLayout) { + return TRUE; + } + m_pTextProvider = FX_NEW CXFA_TextProvider(pAcc, XFA_TEXTPROVIDERTYPE_Text); + m_pTextLayout = FX_NEW CXFA_TextLayout(m_pTextProvider); + return m_pTextLayout != NULL; + } + CXFA_TextLayout* m_pTextLayout; + CXFA_TextProvider *m_pTextProvider; +}; +class CXFA_ImageLayoutData : public CXFA_WidgetLayoutData +{ +public: + CXFA_ImageLayoutData() + : m_pDIBitmap(NULL) + , m_bNamedImage(FALSE) + , m_iImageXDpi(0) + , m_iImageYDpi(0) + { + } + + ~CXFA_ImageLayoutData() + { + if(m_pDIBitmap && !m_bNamedImage) { + delete m_pDIBitmap; + } + m_pDIBitmap = NULL; + } + + FX_BOOL LoadImageData(CXFA_WidgetAcc* pAcc) + { + if(m_pDIBitmap) { + return TRUE; + } + CXFA_Value value = pAcc->GetFormValue(); + if (!value) { + return FALSE; + } + CXFA_Image imageObj = value.GetImage(); + if (!imageObj) { + return FALSE; + } + CXFA_FFDoc *pFFDoc = pAcc->GetDoc(); + pAcc->SetImageImage(XFA_LoadImageData(pFFDoc, &imageObj, m_bNamedImage, m_iImageXDpi, m_iImageYDpi)); + return m_pDIBitmap != NULL; + } + + CFX_DIBitmap* m_pDIBitmap; + FX_BOOL m_bNamedImage; + FX_INT32 m_iImageXDpi; + FX_INT32 m_iImageYDpi; +}; +class CXFA_FieldLayoutData : public CXFA_WidgetLayoutData +{ +public: + CXFA_FieldLayoutData() + : m_pCapTextLayout(NULL) + , m_pCapTextProvider(NULL) + , m_pTextOut(NULL) + , m_pFieldSplitArray(NULL) + { + } + ~CXFA_FieldLayoutData() + { + if (m_pCapTextLayout) { + delete m_pCapTextLayout; + } + m_pCapTextLayout = NULL; + if (m_pCapTextProvider) { + delete m_pCapTextProvider; + } + m_pCapTextProvider = NULL; + if (m_pTextOut) { + m_pTextOut->Release(); + } + m_pTextOut = NULL; + if (m_pFieldSplitArray) { + m_pFieldSplitArray->RemoveAll(); + delete m_pFieldSplitArray; + m_pFieldSplitArray = NULL; + } + } + FX_BOOL LoadCaption(CXFA_WidgetAcc* pAcc) + { + if (m_pCapTextLayout) { + return TRUE; + } + CXFA_Caption caption = pAcc->GetCaption(); + if (caption.IsExistInXML() && caption.GetPresence() != XFA_ATTRIBUTEENUM_Hidden) { + m_pCapTextProvider = FX_NEW CXFA_TextProvider(pAcc, XFA_TEXTPROVIDERTYPE_Caption); + m_pCapTextLayout = FX_NEW CXFA_TextLayout(m_pCapTextProvider); + return m_pCapTextLayout != NULL; + } + return FALSE; + } + CXFA_TextLayout *m_pCapTextLayout; + CXFA_TextProvider *m_pCapTextProvider; + IFDE_TextOut *m_pTextOut; + CFX_FloatArray *m_pFieldSplitArray; +}; +class CXFA_TextEditData : public CXFA_FieldLayoutData +{ +public: +}; +class CXFA_ImageEditData : public CXFA_FieldLayoutData +{ +public: + CXFA_ImageEditData() + : m_pDIBitmap(NULL) + , m_bNamedImage(FALSE) + , m_iImageXDpi(0) + , m_iImageYDpi(0) + { + } + + ~CXFA_ImageEditData() + { + if(m_pDIBitmap && !m_bNamedImage) { + delete m_pDIBitmap; + } + m_pDIBitmap = NULL; + } + FX_BOOL LoadImageData(CXFA_WidgetAcc* pAcc) + { + if(m_pDIBitmap) { + return TRUE; + } + CXFA_Value value = pAcc->GetFormValue(); + if (!value) { + return FALSE; + } + CXFA_Image imageObj = value.GetImage(); + CXFA_FFDoc *pFFDoc = pAcc->GetDoc(); + pAcc->SetImageEditImage(XFA_LoadImageData(pFFDoc, &imageObj, m_bNamedImage, m_iImageXDpi, m_iImageYDpi)); + return m_pDIBitmap != NULL; + } + CFX_DIBitmap* m_pDIBitmap; + FX_BOOL m_bNamedImage; + FX_INT32 m_iImageXDpi; + FX_INT32 m_iImageYDpi; +}; +CXFA_WidgetAcc::CXFA_WidgetAcc(CXFA_FFDocView* pDocView, CXFA_Node* pNode) + : CXFA_WidgetData(pNode) + , m_pDocView(pDocView) + , m_pLayoutData(NULL) +{ +} +CXFA_WidgetAcc::~CXFA_WidgetAcc() +{ + if (m_pLayoutData) { + m_pLayoutData->Release(); + m_pLayoutData = NULL; + } +} +FX_BOOL CXFA_WidgetAcc::GetName(CFX_WideString &wsName, FX_INT32 iNameType ) +{ + if (iNameType == 0) { + m_pNode->TryCData(XFA_ATTRIBUTE_Name, wsName); + return !wsName.IsEmpty(); + } + m_pNode->GetSOMExpression(wsName); + if (iNameType == 2 && wsName.GetLength() >= 15) { + CFX_WideStringC wsPre = FX_WSTRC(L"xfa[0].form[0]."); + if (wsPre == CFX_WideStringC(wsName, wsPre.GetLength())) { + wsName.Delete(0, wsPre.GetLength()); + } + } + return TRUE; +} +CXFA_Node* CXFA_WidgetAcc::GetDatasets() +{ + return m_pNode->GetBindData(); +} +FX_BOOL CXFA_WidgetAcc::ProcessValueChanged() +{ + m_pDocView->AddValidateWidget(this); + m_pDocView->AddCalculateWidgetAcc(this); + m_pDocView->RunCalculateWidgets(); + m_pDocView->RunValidate(); + return TRUE; +} +void CXFA_WidgetAcc::ResetData() +{ + CFX_WideString wsValue; + XFA_ELEMENT eUIType = (XFA_ELEMENT)GetUIType(); + switch (eUIType) { + case XFA_ELEMENT_ImageEdit: { + CXFA_Value imageValue = GetDefaultValue(); + CXFA_Image image = imageValue.GetImage(); + CFX_WideString wsContentType, wsHref; + if (image) { + image.GetContent(wsValue); + image.GetContentType(wsContentType); + image.GetHref(wsHref); + } + SetImageEdit(wsContentType, wsHref, wsValue); + } + break; + case XFA_ELEMENT_ExclGroup: { + CXFA_Node* pNextChild = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild, XFA_OBJECTTYPE_ContainerNode); + while (pNextChild) { + CXFA_Node* pChild = pNextChild; + CXFA_WidgetAcc* pAcc = (CXFA_WidgetAcc*)pChild->GetWidgetData(); + if (!pAcc) { + continue; + } + CXFA_Value defValue(NULL); + if (wsValue.IsEmpty() && (defValue = pAcc->GetDefaultValue())) { + defValue.GetChildValueContent(wsValue); + this->SetValue(wsValue, XFA_VALUEPICTURE_Raw); + pAcc->SetValue(wsValue, XFA_VALUEPICTURE_Raw); + } else { + CXFA_Node* pItems = pChild->GetChild(0, XFA_ELEMENT_Items); + if (!pItems) { + continue; + } + CFX_WideString itemText; + if (pItems->CountChildren(XFA_ELEMENT_UNKNOWN) > 1) { + itemText = pItems->GetChild(1, XFA_ELEMENT_UNKNOWN)->GetContent(); + } + pAcc->SetValue(itemText, XFA_VALUEPICTURE_Raw); + } + pNextChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling, XFA_OBJECTTYPE_ContainerNode); + } + } + break; + case XFA_ELEMENT_ChoiceList: + ClearAllSelections(); + default: + if (CXFA_Value defValue = GetDefaultValue()) { + defValue.GetChildValueContent(wsValue); + } + SetValue(wsValue, XFA_VALUEPICTURE_Raw); + break; + } +} +void CXFA_WidgetAcc::SetImageEdit(FX_WSTR wsContentType, FX_WSTR wsHref, FX_WSTR wsData) +{ + CXFA_Image image = GetFormValue().GetImage(); + if (image) { + image.SetContentType(wsContentType); + image.SetHref(wsHref); + } + CFX_WideString wsFormatValue(wsData); + this->GetFormatDataValue(wsData, wsFormatValue); + m_pNode->SetContent(wsData, wsFormatValue, TRUE); + CXFA_Node* pBind = GetDatasets(); + if (!pBind) { + image.SetTransferEncoding(XFA_ATTRIBUTEENUM_Base64); + return; + } + pBind->SetCData(XFA_ATTRIBUTE_ContentType, wsContentType); + CXFA_Node *pHrefNode = pBind->GetNodeItem(XFA_NODEITEM_FirstChild); + if (pHrefNode) { + pHrefNode->SetCData(XFA_ATTRIBUTE_Value, wsHref); + } else { + IFDE_XMLNode *pXMLNode = pBind->GetXMLMappingNode(); + FXSYS_assert(pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element); + ((IFDE_XMLElement*)pXMLNode)->SetString(FX_WSTRC(L"href"), wsHref); + } +} + +CXFA_WidgetAcc* CXFA_WidgetAcc::GetExclGroup() +{ + CXFA_Node* pExcl = m_pNode->GetNodeItem(XFA_NODEITEM_Parent); + if (!pExcl || pExcl->GetClassID() != XFA_ELEMENT_ExclGroup) { + return NULL; + } + return (CXFA_WidgetAcc*)pExcl->GetWidgetData(); +} +CXFA_FFDocView* CXFA_WidgetAcc::GetDocView() +{ + return m_pDocView; +} +CXFA_FFDoc* CXFA_WidgetAcc::GetDoc() +{ + return (CXFA_FFDoc*)m_pDocView->GetDoc(); +} +CXFA_FFApp* CXFA_WidgetAcc::GetApp() +{ + return GetDoc()->GetApp(); +} +IXFA_AppProvider* CXFA_WidgetAcc::GetAppProvider() +{ + return GetApp()->GetAppProvider(); +} +FX_INT32 CXFA_WidgetAcc::ProcessEvent(FX_INT32 iActivity, CXFA_EventParam* pEventParam) +{ + if (this->GetClassID() == XFA_ELEMENT_Draw) { + return XFA_EVENTERROR_NotExist; + } + FX_INT32 iRet = XFA_EVENTERROR_NotExist; + CXFA_NodeArray eventArray; + FX_INT32 iCounts = GetEventByActivity(iActivity, eventArray, pEventParam->m_bIsFormReady); + for (FX_INT32 i = 0; i < iCounts; i++) { + CXFA_Event event(eventArray[i]); + FX_INT32 result = ProcessEvent(event, pEventParam); + if (i == 0) { + iRet = result; + } else if (result == XFA_EVENTERROR_Sucess) { + iRet = result; + } + } + return iRet; +} +FX_INT32 CXFA_WidgetAcc::ProcessEvent(CXFA_Event& event, CXFA_EventParam* pEventParam) +{ + if (!event) { + return XFA_EVENTERROR_NotExist; + } + switch(event.GetEventType()) { + case XFA_ELEMENT_Execute: + break; + case XFA_ELEMENT_Script: { + CXFA_Script script = event.GetScript(); + return ExecuteScript(script, pEventParam); + } + break; + case XFA_ELEMENT_SignData: + break; + case XFA_ELEMENT_Submit: { + CXFA_Submit submit = event.GetSubmit(); + return GetDoc()->GetDocProvider()->SubmitData((XFA_HDOC)GetDoc(), submit); + } + default: + break; + } + return XFA_EVENTERROR_NotExist; +} +FX_INT32 CXFA_WidgetAcc::ProcessCalculate() +{ + if (this->GetClassID() == XFA_ELEMENT_Draw) { + return XFA_EVENTERROR_NotExist; + } + CXFA_Calculate calc = this->GetCalculate(); + if (!calc) { + return XFA_EVENTERROR_NotExist; + } + if (this->GetNode()->HasFlag(XFA_NODEFLAG_UserInteractive)) { + return XFA_EVENTERROR_Disabled; + } + CXFA_EventParam EventParam; + EventParam.m_eType = XFA_EVENT_Calculate; + CXFA_Script script = calc.GetScript(); + FX_INT32 iRet = ExecuteScript(script, &EventParam); + if (iRet == XFA_EVENTERROR_Sucess) { + if (GetRawValue() != EventParam.m_wsResult) { + FX_BOOL bNotify = GetDoc()->GetDocType() == XFA_DOCTYPE_Static; + SetValue(EventParam.m_wsResult, XFA_VALUEPICTURE_Raw); + UpdateUIDisplay(); + if (bNotify) { + NotifyEvent(XFA_WIDGETEVENT_PostContentChanged, NULL, NULL, NULL); + } + iRet = XFA_EVENTERROR_Sucess; + } + } + return iRet; +} +void CXFA_WidgetAcc::ProcessScriptTestValidate(CXFA_Validate validate, FX_INT32 iRet, FXJSE_HVALUE pRetValue, FX_BOOL bVersionFlag) +{ + if (iRet == XFA_EVENTERROR_Sucess && pRetValue) { + if (FXJSE_Value_IsBoolean(pRetValue) && !FXJSE_Value_ToBoolean(pRetValue)) { + IXFA_AppProvider* pAppProvider = GetAppProvider(); + if (!pAppProvider) { + return; + } + CFX_WideString wsTitle; + pAppProvider->LoadString(XFA_IDS_AppName, wsTitle); + CFX_WideString wsScriptMsg; + validate.GetScriptMessageText(wsScriptMsg); + FX_INT32 eScriptTest = validate.GetScriptTest(); + if (eScriptTest == XFA_ATTRIBUTEENUM_Warning) { + if (this->GetNode()->HasFlag(XFA_NODEFLAG_UserInteractive)) { + return; + } + if (wsScriptMsg.IsEmpty()) { + GetValidateMessage(pAppProvider, wsScriptMsg, FALSE, bVersionFlag); + } + if (bVersionFlag) { + pAppProvider->MsgBox(wsScriptMsg, wsTitle, XFA_MBICON_Warning, XFA_MB_OK); + return; + } + if (pAppProvider->MsgBox(wsScriptMsg, wsTitle, XFA_MBICON_Warning, XFA_MB_YesNo) == XFA_IDYes) { + this->GetNode()->SetFlag(XFA_NODEFLAG_UserInteractive, TRUE, FALSE); + } + } else { + if (wsScriptMsg.IsEmpty()) { + GetValidateMessage(pAppProvider, wsScriptMsg, TRUE, bVersionFlag); + } + pAppProvider->MsgBox(wsScriptMsg, wsTitle, XFA_MBICON_Error, XFA_MB_OK); + } + } + } +} +FX_INT32 CXFA_WidgetAcc::ProcessFormatTestValidate(CXFA_Validate validate, FX_BOOL bVersionFlag) +{ + CFX_WideString wsRawValue = GetRawValue(); + if (!wsRawValue.IsEmpty()) { + CFX_WideString wsPicture; + validate.GetPicture(wsPicture); + if (wsPicture.IsEmpty()) { + return XFA_EVENTERROR_NotExist; + } + IFX_Locale* pLocale = GetLocal(); + if (!pLocale) { + return XFA_EVENTERROR_NotExist; + } + CXFA_LocaleValue lcValue = XFA_GetLocaleValue(this); + if (!lcValue.ValidateValue(lcValue.GetValue(), wsPicture, pLocale)) { + IXFA_AppProvider* pAppProvider = GetAppProvider(); + if (!pAppProvider) { + return XFA_EVENTERROR_NotExist; + } + CFX_WideString wsFormatMsg; + validate.GetFormatMessageText(wsFormatMsg); + CFX_WideString wsTitle; + pAppProvider->LoadString(XFA_IDS_AppName, wsTitle); + FX_INT32 eFormatTest = validate.GetFormatTest(); + if (eFormatTest == XFA_ATTRIBUTEENUM_Error) { + if (wsFormatMsg.IsEmpty()) { + GetValidateMessage(pAppProvider, wsFormatMsg, TRUE, bVersionFlag); + } + pAppProvider->MsgBox(wsFormatMsg, wsTitle, XFA_MBICON_Error, XFA_MB_OK); + return XFA_EVENTERROR_Sucess; + } + if (this->GetNode()->HasFlag(XFA_NODEFLAG_UserInteractive)) { + return XFA_EVENTERROR_NotExist; + } + if (wsFormatMsg.IsEmpty()) { + GetValidateMessage(pAppProvider, wsFormatMsg, FALSE, bVersionFlag); + } + if (bVersionFlag) { + pAppProvider->MsgBox(wsFormatMsg, wsTitle, XFA_MBICON_Warning, XFA_MB_OK); + return XFA_EVENTERROR_Sucess; + } + if (pAppProvider->MsgBox(wsFormatMsg, wsTitle, XFA_MBICON_Warning, XFA_MB_YesNo) == XFA_IDYes) { + this->GetNode()->SetFlag(XFA_NODEFLAG_UserInteractive, TRUE, FALSE); + } + return XFA_EVENTERROR_Sucess; + } + } + return XFA_EVENTERROR_NotExist; +} +FX_INT32 CXFA_WidgetAcc::ProcessNullTestValidate(CXFA_Validate validate, FX_INT32 iFlags, FX_BOOL bVersionFlag) +{ + CFX_WideString wsValue; + this->GetValue(wsValue, XFA_VALUEPICTURE_Raw); + if (!wsValue.IsEmpty()) { + return XFA_EVENTERROR_Sucess; + } + if (this->m_bIsNull && (this->m_bPreNull == this->m_bIsNull)) { + return XFA_EVENTERROR_Sucess; + } + FX_INT32 eNullTest = validate.GetNullTest(); + CFX_WideString wsNullMsg; + validate.GetNullMessageText(wsNullMsg); + if (iFlags & 0x01) { + FX_INT32 iRet = XFA_EVENTERROR_Sucess; + if (eNullTest != XFA_ATTRIBUTEENUM_Disabled) { + iRet = XFA_EVENTERROR_Error; + } + if (!wsNullMsg.IsEmpty()) { + if (eNullTest != XFA_ATTRIBUTEENUM_Disabled) { + m_pDocView->m_arrNullTestMsg.Add(wsNullMsg); + return XFA_EVENTERROR_Error; + } + return XFA_EVENTERROR_Sucess; + } + return iRet; + } + if (wsNullMsg.IsEmpty() && bVersionFlag && eNullTest != XFA_ATTRIBUTEENUM_Disabled) { + return XFA_EVENTERROR_Error; + } + IXFA_AppProvider* pAppProvider = GetAppProvider(); + if (!pAppProvider) { + return XFA_EVENTERROR_NotExist; + } + CFX_WideString wsCaptionName; + CFX_WideString wsTitle; + pAppProvider->LoadString(XFA_IDS_AppName, wsTitle); + switch (eNullTest) { + case XFA_ATTRIBUTEENUM_Error: { + if (wsNullMsg.IsEmpty()) { + GetValidateCaptionName(wsCaptionName, bVersionFlag); + CFX_WideString wsError; + pAppProvider->LoadString(XFA_IDS_ValidateNullError, wsError); + wsNullMsg.Format(wsError, (FX_LPCWSTR)wsCaptionName); + } + pAppProvider->MsgBox(wsNullMsg, wsTitle, XFA_MBICON_Status, XFA_MB_OK); + return XFA_EVENTERROR_Error; + } + case XFA_ATTRIBUTEENUM_Warning: { + if (this->GetNode()->HasFlag(XFA_NODEFLAG_UserInteractive)) { + return TRUE; + } + if (wsNullMsg.IsEmpty()) { + GetValidateCaptionName(wsCaptionName, bVersionFlag); + CFX_WideString wsWarning; + pAppProvider->LoadString(XFA_IDS_ValidateNullWarning, wsWarning); + wsNullMsg.Format(wsWarning, (FX_LPCWSTR)wsCaptionName, (FX_LPCWSTR)wsCaptionName); + } + if (pAppProvider->MsgBox(wsNullMsg, wsTitle, XFA_MBICON_Warning, XFA_MB_YesNo) == XFA_IDYes) { + this->GetNode()->SetFlag(XFA_NODEFLAG_UserInteractive, TRUE, FALSE); + } + return XFA_EVENTERROR_Error; + } + case XFA_ATTRIBUTEENUM_Disabled: + default: + break; + } + return XFA_EVENTERROR_Sucess; +} +void CXFA_WidgetAcc::GetValidateCaptionName(CFX_WideString& wsCaptionName, FX_BOOL bVersionFlag) +{ + if (!bVersionFlag) { + CXFA_Caption caption = GetCaption(); + if (caption) { + CXFA_Value capValue = caption.GetValue(); + if (capValue) { + CXFA_Text capText = capValue.GetText(); + if (capText) { + capText.GetContent(wsCaptionName); + } + } + } + } + if (wsCaptionName.IsEmpty()) { + GetName(wsCaptionName); + } +} +void CXFA_WidgetAcc::GetValidateMessage(IXFA_AppProvider* pAppProvider, CFX_WideString& wsMessage, FX_BOOL bError, FX_BOOL bVersionFlag) +{ + CFX_WideString wsCaptionName; + GetValidateCaptionName(wsCaptionName, bVersionFlag); + CFX_WideString wsError; + if (bVersionFlag) { + pAppProvider->LoadString(XFA_IDS_ValidateFailed, wsError); + wsMessage.Format(wsError, (FX_LPCWSTR)wsCaptionName); + return; + } + if (bError) { + pAppProvider->LoadString(XFA_IDS_ValidateError, wsError); + wsMessage.Format(wsError, (FX_LPCWSTR)wsCaptionName); + return; + } + CFX_WideString wsWarning; + pAppProvider->LoadString(XFA_IDS_ValidateWarning, wsWarning); + wsMessage.Format(wsWarning, (FX_LPCWSTR)wsCaptionName, (FX_LPCWSTR)wsCaptionName); +} +FX_INT32 CXFA_WidgetAcc::ProcessValidate(FX_INT32 iFlags) +{ + if (this->GetClassID() == XFA_ELEMENT_Draw) { + return XFA_EVENTERROR_NotExist; + } + CXFA_Validate validate = this->GetValidate(); + if (!validate) { + return XFA_EVENTERROR_NotExist; + } + FX_BOOL bInitDoc = ((CXFA_Node*)validate)->HasFlag(XFA_NODEFLAG_NeedsInitApp); + FX_BOOL bStatus = m_pDocView->GetLayoutStatus() < XFA_DOCVIEW_LAYOUTSTATUS_End; + FX_INT32 iFormat = 0; + FXJSE_HVALUE pRetValue = NULL; + FX_INT32 iRet = XFA_EVENTERROR_NotExist; + CXFA_Script script = validate.GetScript(); + if (script) { + CXFA_EventParam eParam; + eParam.m_eType = XFA_EVENT_Validate; + eParam.m_pTarget = this; + iRet = ExecuteScript(script, &eParam, ((bInitDoc || bStatus) && this->GetRawValue().IsEmpty()) ? NULL : &pRetValue); + } + XFA_VERSION version = GetDoc()->GetXFADoc()->GetCurVersionMode(); + FX_BOOL bVersionFlag = FALSE; + if (version < XFA_VERSION_208) { + bVersionFlag = TRUE; + } + if (bInitDoc) { + ((CXFA_Node*)validate)->SetFlag(XFA_NODEFLAG_NeedsInitApp, FALSE, FALSE); + } else { + iFormat = ProcessFormatTestValidate(validate, bVersionFlag); + if (!bVersionFlag) { + bVersionFlag = GetDoc()->GetXFADoc()->HasFlag(XFA_DOCFLAG_Scripting); + } + iRet |= ProcessNullTestValidate(validate, iFlags, bVersionFlag); + } + if (iFormat != XFA_EVENTERROR_Sucess) { + ProcessScriptTestValidate(validate, iRet, pRetValue, bVersionFlag); + } + if (pRetValue) { + FXJSE_Value_Release(pRetValue); + } + return iRet | iFormat; +} +FX_INT32 CXFA_WidgetAcc::ExecuteScript(CXFA_Script script, CXFA_EventParam* pEventParam, FXJSE_HVALUE* pRetValue) +{ + FXSYS_assert(pEventParam); + if (!script) { + return XFA_EVENTERROR_NotExist; + } + if(script.GetRunAt() == XFA_ATTRIBUTEENUM_Server) { + return XFA_EVENTERROR_Disabled; + } + CFX_WideString wsExpression; + script.GetExpression(wsExpression); + if (wsExpression.IsEmpty()) { + return XFA_EVENTERROR_NotExist; + } + XFA_SCRIPTTYPE eScriptType = script.GetContentType(); + if (eScriptType == XFA_SCRIPTTYPE_Unkown) { + return XFA_EVENTERROR_Sucess; + } + CXFA_FFDoc* pDoc = GetDoc(); + IXFA_ScriptContext* pContext = pDoc->GetXFADoc()->GetScriptContext(); + pContext->SetEventParam(pEventParam); + pContext->SetRunAtType((XFA_ATTRIBUTEENUM)script.GetRunAt()); + CXFA_NodeArray refNodes; + if (pEventParam->m_eType == XFA_EVENT_InitCalculate || pEventParam->m_eType == XFA_EVENT_Calculate) { + pContext->SetNodesOfRunScript(&refNodes); + } + FXJSE_HVALUE hRetValue = FXJSE_Value_Create(pContext->GetRuntime()); + FX_BOOL bRet = FALSE; + bRet = pContext->RunScript((XFA_SCRIPTLANGTYPE)eScriptType, wsExpression, hRetValue, m_pNode); + FX_INT32 iRet = XFA_EVENTERROR_Error; + if (bRet) { + iRet = XFA_EVENTERROR_Sucess; + if (pEventParam->m_eType == XFA_EVENT_Calculate || pEventParam->m_eType == XFA_EVENT_InitCalculate) { + if (!FXJSE_Value_IsUndefined(hRetValue)) { + if (!FXJSE_Value_IsNull(hRetValue)) { + CFX_ByteString bsString; + FXJSE_Value_ToUTF8String(hRetValue, bsString); + pEventParam->m_wsResult = CFX_WideString::FromUTF8(bsString, bsString.GetLength()); + } + iRet = XFA_EVENTERROR_Sucess; + } else { + iRet = XFA_EVENTERROR_Error; + } + if (pEventParam->m_eType == XFA_EVENT_InitCalculate) { + if ((iRet == XFA_EVENTERROR_Sucess) && (GetRawValue() != pEventParam->m_wsResult)) { + SetValue(pEventParam->m_wsResult, XFA_VALUEPICTURE_Raw); + m_pDocView->AddValidateWidget(this); + } + } + FX_INT32 iRefs = refNodes.GetSize(); + for (FX_INT32 r = 0; r < iRefs; r++) { + CXFA_WidgetAcc* pRefAcc = (CXFA_WidgetAcc*)refNodes[r]->GetWidgetData(); + if (pRefAcc && pRefAcc == this) { + continue; + } + CXFA_Node* pRefNode = refNodes[r]; + CXFA_CalcData* pGlobalData = (CXFA_CalcData*)pRefNode->GetUserData(XFA_CalcData); + if (!pGlobalData) { + pGlobalData = FX_NEW CXFA_CalcData; + pRefNode->SetUserData(XFA_CalcData, pGlobalData, &gs_XFADeleteCalcData); + } + if (pGlobalData->m_Globals.Find(this) < 0) { + pGlobalData->m_Globals.Add(this); + } + } + } + } + if (pRetValue) { + *pRetValue = hRetValue; + } else { + FXJSE_Value_Release(hRetValue); + } + pContext->SetNodesOfRunScript(NULL); + return iRet; +} +CXFA_FFWidget* CXFA_WidgetAcc::GetNextWidget(CXFA_FFWidget* pWidget) +{ + CXFA_LayoutItem* pLayout = NULL; + if (pWidget) { + pLayout = pWidget->GetLayoutItem()->GetNext(); + } else { + pLayout = m_pDocView->GetXFALayout()->GetLayoutItem(m_pNode); + } + return (CXFA_FFWidget*)(CXFA_ContentLayoutItemImpl*)pLayout; +} +void CXFA_WidgetAcc::UpdateUIDisplay(CXFA_FFWidget* pExcept ) +{ + CXFA_FFWidget* pWidget = NULL; + while ((pWidget = this->GetNextWidget(pWidget)) != NULL) { + if (pWidget == pExcept || !pWidget->IsLoaded() || (GetUIType() != XFA_ELEMENT_CheckButton && pWidget->IsFocused())) { + continue; + } + pWidget->UpdateFWLData(); + pWidget->AddInvalidateRect(); + } +} +void CXFA_WidgetAcc::NotifyEvent(FX_DWORD dwEvent, CXFA_FFWidget* pWidget , FX_LPVOID pParam , FX_LPVOID pAdditional ) +{ + IXFA_DocProvider* pDocProvider = GetDoc()->GetDocProvider(); + if (pWidget) { + pDocProvider->WidgetEvent((XFA_HWIDGET)pWidget, this, dwEvent, pParam, pAdditional); + } else { + pWidget = GetNextWidget(pWidget); + if (pWidget == NULL) { + pDocProvider->WidgetEvent(NULL, this, dwEvent, pParam, pAdditional); + return; + } + while (pWidget) { + pDocProvider->WidgetEvent((XFA_HWIDGET)pWidget, this, dwEvent, pParam, pAdditional); + pWidget = GetNextWidget(pWidget); + } + } +} +void CXFA_WidgetAcc::CalcCaptionSize(CFX_SizeF &szCap) +{ + CXFA_Caption caption = this->GetCaption(); + if (!caption.IsExistInXML() || caption.GetPresence() != XFA_ATTRIBUTEENUM_Visible) { + return; + } + LoadCaption(); + XFA_ELEMENT eUIType = (XFA_ELEMENT)GetUIType(); + FX_INT32 iCapPlacement = caption.GetPlacementType(); + FX_FLOAT fCapReserve = caption.GetReserve(); + FX_BOOL bVert = iCapPlacement == XFA_ATTRIBUTEENUM_Top || iCapPlacement == XFA_ATTRIBUTEENUM_Bottom; + FX_BOOL bReserveExit = fCapReserve > 0.01; + CXFA_TextLayout* pCapTextLayout = ((CXFA_FieldLayoutData*)m_pLayoutData)->m_pCapTextLayout; + if (pCapTextLayout) { + if (!bVert && eUIType != XFA_ELEMENT_Button) { + szCap.x = fCapReserve; + } + CFX_SizeF minSize; + minSize.Set(0, 0); + pCapTextLayout->CalcSize(minSize, szCap, szCap); + if (bReserveExit) { + bVert ? szCap.y = fCapReserve : szCap.x = fCapReserve; + } + } else { + FX_FLOAT fFontSize = 10.0f; + if (CXFA_Font font = caption.GetFont()) { + fFontSize = font.GetFontSize(); + } else if (CXFA_Font widgetfont = GetFont()) { + fFontSize = widgetfont.GetFontSize(); + } + if (bVert) { + szCap.y = fCapReserve > 0 ? fCapReserve : fFontSize; + } else { + szCap.x = fCapReserve > 0 ? fCapReserve : 0; + szCap.y = fFontSize; + } + } + if (CXFA_Margin mgCap = caption.GetMargin()) { + FX_FLOAT fLeftInset, fTopInset, fRightInset, fBottomInset; + mgCap.GetLeftInset(fLeftInset); + mgCap.GetTopInset(fTopInset); + mgCap.GetRightInset(fRightInset); + mgCap.GetBottomInset(fBottomInset); + if (bReserveExit) { + bVert ? (szCap.x += fLeftInset + fRightInset) : (szCap.y += fTopInset + fBottomInset); + } else { + szCap.x += fLeftInset + fRightInset; + szCap.y += fTopInset + fBottomInset; + } + } +} +FX_BOOL CXFA_WidgetAcc::CalculateFieldAutoSize(CFX_SizeF &size) +{ + CFX_SizeF szCap; + szCap.Set(0, 0); + CalcCaptionSize(szCap); + CFX_RectF rtUIMargin; + GetUIMargin(rtUIMargin); + size.x += rtUIMargin.left + rtUIMargin.width; + size.y += rtUIMargin.top + rtUIMargin.height; + if (szCap.x > 0 && szCap.y > 0) { + FX_INT32 iCapPlacement = this->GetCaption().GetPlacementType(); + switch(iCapPlacement) { + case XFA_ATTRIBUTEENUM_Left: + case XFA_ATTRIBUTEENUM_Right: + case XFA_ATTRIBUTEENUM_Inline: { + size.x += szCap.x; + size.y = FX_MAX(size.y, szCap.y); + } + break; + case XFA_ATTRIBUTEENUM_Top: + case XFA_ATTRIBUTEENUM_Bottom: { + size.y += szCap.y; + size.x = FX_MAX(size.x, szCap.x); + } + default: + break; + } + } + return CalculateWidgetAutoSize(size); +} +FX_BOOL CXFA_WidgetAcc::CalculateWidgetAutoSize(CFX_SizeF &size) +{ + CXFA_Margin mgWidget = this->GetMargin(); + if (mgWidget.IsExistInXML()) { + FX_FLOAT fLeftInset, fTopInset, fRightInset, fBottomInset; + mgWidget.GetLeftInset(fLeftInset); + mgWidget.GetTopInset(fTopInset); + mgWidget.GetRightInset(fRightInset); + mgWidget.GetBottomInset(fBottomInset); + size.x += fLeftInset + fRightInset; + size.y += fTopInset + fBottomInset; + } + CXFA_Para para = this->GetPara(); + if (para.IsExistInXML()) { + size.x += para.GetMarginLeft(); + size.x += para.GetTextIndent(); + } + FX_FLOAT fVal = 0, fMin = 0, fMax = 0; + if (this->GetWidth(fVal)) { + size.x = fVal; + } else { + if (this->GetMinWidth(fMin)) { + size.x = FX_MAX(size.x, fMin); + } + if (this->GetMaxWidth(fMax) && fMax > 0) { + size.x = FX_MIN(size.x, fMax); + } + } + fVal = 0, fMin = 0, fMax = 0; + if (this->GetHeight(fVal)) { + size.y = fVal; + } else { + if (this->GetMinHeight(fMin)) { + size.y = FX_MAX(size.y, fMin); + } + if (this->GetMaxHeight(fMax) && fMax > 0) { + size.y = FX_MIN(size.y, fMax); + } + } + return TRUE; +} +void CXFA_WidgetAcc::CalculateTextContentSize(CFX_SizeF &size) +{ + FX_FLOAT fFontSize = GetFontSize(); + CFX_WideString wsText; + this->GetValue(wsText, XFA_VALUEPICTURE_Display); + if (wsText.IsEmpty()) { + size.y += fFontSize; + return; + } + FX_WCHAR wcEnter = '\n'; + FX_WCHAR wsLast = wsText.GetAt(wsText.GetLength() - 1); + if(wsLast == wcEnter) { + wsText = wsText + wcEnter; + } + if (!((CXFA_FieldLayoutData*)m_pLayoutData)->m_pTextOut) { + ((CXFA_FieldLayoutData*)m_pLayoutData)->m_pTextOut = IFDE_TextOut::Create(); + IFDE_TextOut* pTextOut = ((CXFA_FieldLayoutData*)m_pLayoutData)->m_pTextOut; + pTextOut->SetFont(GetFDEFont()); + pTextOut->SetFontSize(fFontSize); + pTextOut->SetLineBreakTolerance(fFontSize * 0.2f); + pTextOut->SetLineSpace(GetLineHeight()); + FX_DWORD dwStyles = FDE_TTOSTYLE_LastLineHeight; + if (GetUIType() == XFA_ELEMENT_TextEdit && IsMultiLine()) { + dwStyles |= FDE_TTOSTYLE_LineWrap; + } + pTextOut->SetStyles(dwStyles); + } + ((CXFA_FieldLayoutData*)m_pLayoutData)->m_pTextOut->CalcLogicSize(wsText, wsText.GetLength(), size); +} +FX_BOOL CXFA_WidgetAcc::CalculateTextEditAutoSize(CFX_SizeF &size) +{ + if (size.x > 0) { + CFX_SizeF szOrz = size; + CFX_SizeF szCap; + szCap.Set(0, 0); + CalcCaptionSize(szCap); + FX_BOOL bCapExit = szCap.x > 0.01 && szCap.y > 0.01; + FX_INT32 iCapPlacement = XFA_ATTRIBUTEENUM_Unknown; + if (bCapExit) { + iCapPlacement = this->GetCaption().GetPlacementType(); + switch(iCapPlacement) { + case XFA_ATTRIBUTEENUM_Left: + case XFA_ATTRIBUTEENUM_Right: + case XFA_ATTRIBUTEENUM_Inline: { + size.x -= szCap.x; + } + default: + break; + } + } + CFX_RectF rtUIMargin; + GetUIMargin(rtUIMargin); + size.x -= rtUIMargin.left + rtUIMargin.width; + CXFA_Margin mgWidget = this->GetMargin(); + if (mgWidget.IsExistInXML()) { + FX_FLOAT fLeftInset, fRightInset; + mgWidget.GetLeftInset(fLeftInset); + mgWidget.GetRightInset(fRightInset); + size.x -= fLeftInset + fRightInset; + } + CalculateTextContentSize(size); + size.y += rtUIMargin.top + rtUIMargin.height; + if (bCapExit) { + switch(iCapPlacement) { + case XFA_ATTRIBUTEENUM_Left: + case XFA_ATTRIBUTEENUM_Right: + case XFA_ATTRIBUTEENUM_Inline: { + size.y = FX_MAX(size.y, szCap.y); + } + break; + case XFA_ATTRIBUTEENUM_Top: + case XFA_ATTRIBUTEENUM_Bottom: { + size.y += szCap.y; + } + default: + break; + } + } + size.x = szOrz.x; + return CalculateWidgetAutoSize(size); + } + CalculateTextContentSize(size); + return CalculateFieldAutoSize(size); +} +FX_BOOL CXFA_WidgetAcc::CalculateCheckButtonAutoSize(CFX_SizeF &size) +{ + FX_FLOAT fCheckSize = this->GetCheckButtonSize(); + size.x = size.y = fCheckSize; + return CalculateFieldAutoSize(size); +} +FX_BOOL CXFA_WidgetAcc::CalculatePushButtonAutoSize(CFX_SizeF &size) +{ + CalcCaptionSize(size); + return CalculateWidgetAutoSize(size); +} +FX_BOOL CXFA_WidgetAcc::CalculateImageAutoSize(CFX_SizeF &size) +{ + if (!GetImageImage()) { + LoadImageImage(); + } + size.Set(0, 0); + if (CFX_DIBitmap* pBitmap = GetImageImage()) { + CXFA_Image imageObj = GetFormValue().GetImage(); + CFX_RectF rtImage, rtFit; + rtImage.Set(0, 0, 0, 0); + rtFit.Set(0, 0, 0, 0); + FX_INT32 iImageXDpi = 0; + FX_INT32 iImageYDpi = 0; + GetImageDpi(iImageXDpi, iImageYDpi); + rtImage.width = XFA_UnitPx2Pt((FX_FLOAT)pBitmap->GetWidth(), (FX_FLOAT)iImageXDpi); + rtImage.height = XFA_UnitPx2Pt((FX_FLOAT)pBitmap->GetHeight(), (FX_FLOAT)iImageYDpi); + if(GetWidth(rtFit.width)) { + GetWidthWithoutMargin(rtFit.width); + } else { + rtFit.width = rtImage.width; + } + if(GetHeight(rtFit.height)) { + GetHeightWithoutMargin(rtFit.height); + } else { + rtFit.height = rtImage.height; + } + size.x = rtFit.width; + size.y = rtFit.height; + } + return CalculateWidgetAutoSize(size); +} +FX_BOOL CXFA_WidgetAcc::CalculateImageEditAutoSize(CFX_SizeF &size) +{ + if (!GetImageEditImage()) { + LoadImageEditImage(); + } + size.Set(0, 0); + if (CFX_DIBitmap* pBitmap = GetImageEditImage()) { + CFX_RectF rtImage, rtFit; + rtImage.Set(0, 0, 0, 0); + rtFit.Set(0, 0, 0, 0); + FX_INT32 iImageXDpi = 0; + FX_INT32 iImageYDpi = 0; + GetImageEditDpi(iImageXDpi, iImageYDpi); + rtImage.width = XFA_UnitPx2Pt((FX_FLOAT)pBitmap->GetWidth(), (FX_FLOAT)iImageXDpi); + rtImage.height = XFA_UnitPx2Pt((FX_FLOAT)pBitmap->GetHeight(), (FX_FLOAT)iImageYDpi); + if(GetWidth(rtFit.width)) { + GetWidthWithoutMargin(rtFit.width); + } else { + rtFit.width = rtImage.width; + } + if(GetHeight(rtFit.height)) { + GetHeightWithoutMargin(rtFit.height); + } else { + rtFit.height = rtImage.height; + } + size.x = rtFit.width; + size.y = rtFit.height; + } + return CalculateFieldAutoSize(size); +} +FX_BOOL CXFA_WidgetAcc::LoadImageImage() +{ + InitLayoutData(); + return ((CXFA_ImageLayoutData*)m_pLayoutData)->LoadImageData(this); +} +FX_BOOL CXFA_WidgetAcc::LoadImageEditImage() +{ + InitLayoutData(); + return ((CXFA_ImageEditData*)m_pLayoutData)->LoadImageData(this); +} +void CXFA_WidgetAcc::GetImageDpi(FX_INT32 &iImageXDpi, FX_INT32 &iImageYDpi) +{ + iImageXDpi = ((CXFA_ImageLayoutData*)m_pLayoutData)->m_iImageXDpi; + iImageYDpi = ((CXFA_ImageLayoutData*)m_pLayoutData)->m_iImageYDpi; +} +void CXFA_WidgetAcc::GetImageEditDpi(FX_INT32 &iImageXDpi, FX_INT32 &iImageYDpi) +{ + iImageXDpi = ((CXFA_ImageEditData*)m_pLayoutData)->m_iImageXDpi; + iImageYDpi = ((CXFA_ImageEditData*)m_pLayoutData)->m_iImageYDpi; +} +FX_BOOL CXFA_WidgetAcc::CalculateTextAutoSize(CFX_SizeF &size) +{ + if (!LoadText()) { + return FALSE; + } + CXFA_TextLayout* pTextLayout = ((CXFA_TextLayoutData*)m_pLayoutData)->m_pTextLayout; + if (pTextLayout) { + size.x = pTextLayout->StartLayout(size.x); + size.y = pTextLayout->GetLayoutHeight(); + } + return CalculateWidgetAutoSize(size); +} +FX_BOOL CXFA_WidgetAcc::LoadText() +{ + InitLayoutData(); + return ((CXFA_TextLayoutData*)m_pLayoutData)->LoadText(this); +} +FX_FLOAT CXFA_WidgetAcc::CalculateWidgetAutoWidth(FX_FLOAT fWidthCalc) +{ + CXFA_Margin mgWidget = this->GetMargin(); + if (mgWidget.IsExistInXML()) { + FX_FLOAT fLeftInset, fRightInset; + mgWidget.GetLeftInset(fLeftInset); + mgWidget.GetRightInset(fRightInset); + fWidthCalc += fLeftInset + fRightInset; + } + FX_FLOAT fMin = 0, fMax = 0; + if (this->GetMinWidth(fMin)) { + fWidthCalc = FX_MAX(fWidthCalc, fMin); + } + if (this->GetMaxWidth(fMax) && fMax > 0) { + fWidthCalc = FX_MIN(fWidthCalc, fMax); + } + return fWidthCalc; +} +FX_FLOAT CXFA_WidgetAcc::GetWidthWithoutMargin(FX_FLOAT fWidthCalc) +{ + CXFA_Margin mgWidget = this->GetMargin(); + if (mgWidget.IsExistInXML()) { + FX_FLOAT fLeftInset, fRightInset; + mgWidget.GetLeftInset(fLeftInset); + mgWidget.GetRightInset(fRightInset); + fWidthCalc -= fLeftInset + fRightInset; + } + return fWidthCalc; +} +FX_FLOAT CXFA_WidgetAcc::CalculateWidgetAutoHeight(FX_FLOAT fHeightCalc) +{ + CXFA_Margin mgWidget = this->GetMargin(); + if (mgWidget.IsExistInXML()) { + FX_FLOAT fTopInset, fBottomInset; + mgWidget.GetTopInset(fTopInset); + mgWidget.GetBottomInset(fBottomInset); + fHeightCalc += fTopInset + fBottomInset; + } + FX_FLOAT fMin = 0, fMax = 0; + if (this->GetMinHeight(fMin)) { + fHeightCalc = FX_MAX(fHeightCalc, fMin); + } + if (this->GetMaxHeight(fMax) && fMax > 0) { + fHeightCalc = FX_MIN(fHeightCalc, fMax); + } + return fHeightCalc; +} +FX_FLOAT CXFA_WidgetAcc::GetHeightWithoutMargin(FX_FLOAT fHeightCalc) +{ + CXFA_Margin mgWidget = this->GetMargin(); + if (mgWidget.IsExistInXML()) { + FX_FLOAT fTopInset, fBottomInset; + mgWidget.GetTopInset(fTopInset); + mgWidget.GetBottomInset(fBottomInset); + fHeightCalc -= fTopInset + fBottomInset; + } + return fHeightCalc; +} +void CXFA_WidgetAcc::StartWidgetLayout(FX_FLOAT &fCalcWidth, FX_FLOAT& fCalcHeight) +{ + InitLayoutData(); + XFA_ELEMENT eUIType = GetUIType(); + if (eUIType == XFA_ELEMENT_Text) { + m_pLayoutData->m_fWidgetHeight = -1; + GetHeight(m_pLayoutData->m_fWidgetHeight); + StartTextLayout(fCalcWidth, fCalcHeight); + return; + } + if (fCalcWidth > 0 && fCalcHeight > 0) { + return; + } + m_pLayoutData->m_fWidgetHeight = -1; + FX_FLOAT fWidth = 0; + if (fCalcWidth > 0 && fCalcHeight < 0) { + if (!GetHeight(fCalcHeight)) { + CalculateAccWidthAndHeight(eUIType, fCalcWidth, fCalcHeight); + } + m_pLayoutData->m_fWidgetHeight = fCalcHeight; + return; + } + if (fCalcWidth < 0 && fCalcHeight < 0) { + if (!GetWidth(fWidth) || !GetHeight(fCalcHeight)) { + CalculateAccWidthAndHeight(eUIType, fWidth, fCalcHeight); + } + fCalcWidth = fWidth; + } + m_pLayoutData->m_fWidgetHeight = fCalcHeight; +} +void CXFA_WidgetAcc::CalculateAccWidthAndHeight(XFA_ELEMENT eUIType, FX_FLOAT& fWidth, FX_FLOAT& fCalcHeight) +{ + CFX_SizeF sz; + sz.Set(fWidth, m_pLayoutData->m_fWidgetHeight); + switch(eUIType) { + case XFA_ELEMENT_Barcode: + case XFA_ELEMENT_ChoiceList: + case XFA_ELEMENT_Signature: + CalculateFieldAutoSize(sz); + break; + case XFA_ELEMENT_ImageEdit: + CalculateImageEditAutoSize(sz); + break; + case XFA_ELEMENT_Button: + CalculatePushButtonAutoSize(sz); + break; + case XFA_ELEMENT_CheckButton: + CalculateCheckButtonAutoSize(sz); + break; + case XFA_ELEMENT_DateTimeEdit: + case XFA_ELEMENT_NumericEdit: + case XFA_ELEMENT_PasswordEdit: + case XFA_ELEMENT_TextEdit: + CalculateTextEditAutoSize(sz); + break; + case XFA_ELEMENT_Image: + CalculateImageAutoSize(sz); + break; + case XFA_ELEMENT_Arc: + case XFA_ELEMENT_Line: + case XFA_ELEMENT_Rectangle: + case XFA_ELEMENT_Subform: + case XFA_ELEMENT_ExclGroup: + CalculateWidgetAutoSize(sz); + break; + default: + break; + } + fWidth = sz.x; + m_pLayoutData->m_fWidgetHeight = sz.y; + fCalcHeight = sz.y; +} +FX_BOOL CXFA_WidgetAcc::FindSplitPos(FX_INT32 iBlockIndex, FX_FLOAT &fCalcHeight) +{ + XFA_ELEMENT eUIType = (XFA_ELEMENT)GetUIType(); + if (eUIType == XFA_ELEMENT_Subform) { + return FALSE; + } + if (eUIType != XFA_ELEMENT_Text && eUIType != XFA_ELEMENT_TextEdit && eUIType != XFA_ELEMENT_NumericEdit && eUIType != XFA_ELEMENT_PasswordEdit) { + fCalcHeight = 0; + return TRUE; + } + FX_FLOAT fTopInset = 0; + FX_FLOAT fBottomInset = 0; + if (iBlockIndex == 0) { + CXFA_Margin mgWidget = this->GetMargin(); + if (mgWidget.IsExistInXML()) { + mgWidget.GetTopInset(fTopInset); + mgWidget.GetBottomInset(fBottomInset); + } + CFX_RectF rtUIMargin; + this->GetUIMargin(rtUIMargin); + fTopInset += rtUIMargin.top; + fBottomInset += rtUIMargin.width; + } + if (eUIType == XFA_ELEMENT_Text) { + FX_FLOAT fHeight = fCalcHeight; + if (iBlockIndex == 0) { + fCalcHeight = fCalcHeight - fTopInset; + if (fCalcHeight < 0) { + fCalcHeight = 0; + } + } + CXFA_TextLayout* pTextLayout = ((CXFA_TextLayoutData*)m_pLayoutData)->m_pTextLayout; + pTextLayout->DoLayout(iBlockIndex, fCalcHeight, fCalcHeight, m_pLayoutData->m_fWidgetHeight - fTopInset); + if (fCalcHeight != 0) { + if (iBlockIndex == 0) { + fCalcHeight = fCalcHeight + fTopInset; + } + if (fabs(fHeight - fCalcHeight) < XFA_FLOAT_PERCISION) { + return FALSE; + } + } + return TRUE; + } + XFA_ATTRIBUTEENUM iCapPlacement = XFA_ATTRIBUTEENUM_Unknown; + FX_FLOAT fCapReserve = 0; + if (iBlockIndex == 0) { + CXFA_Caption caption = GetCaption(); + if (caption.IsExistInXML() && caption.GetPresence() != XFA_ATTRIBUTEENUM_Hidden) { + iCapPlacement = (XFA_ATTRIBUTEENUM)caption.GetPlacementType(); + fCapReserve = caption.GetReserve(); + } + if (iCapPlacement == XFA_ATTRIBUTEENUM_Top && fCalcHeight < fCapReserve + fTopInset) { + fCalcHeight = 0; + return TRUE; + } + if (iCapPlacement == XFA_ATTRIBUTEENUM_Bottom && m_pLayoutData->m_fWidgetHeight - fCapReserve - fBottomInset) { + fCalcHeight = 0; + return TRUE; + } + if (iCapPlacement != XFA_ATTRIBUTEENUM_Top) { + fCapReserve = 0; + } + } + FX_INT32 iLinesCount = 0; + FX_FLOAT fHeight = m_pLayoutData->m_fWidgetHeight; + CFX_WideString wsText; + this->GetValue(wsText, XFA_VALUEPICTURE_Display); + if (wsText.IsEmpty()) { + iLinesCount = 1; + } else { + if (!((CXFA_FieldLayoutData*)m_pLayoutData)->m_pTextOut) { + FX_FLOAT fWidth = 0; + GetWidth(fWidth); + CalculateAccWidthAndHeight(eUIType, fWidth, fHeight); + } + iLinesCount = ((CXFA_FieldLayoutData*)m_pLayoutData)->m_pTextOut->GetTotalLines(); + } + if (!((CXFA_FieldLayoutData*)m_pLayoutData)->m_pFieldSplitArray) { + ((CXFA_FieldLayoutData*)m_pLayoutData)->m_pFieldSplitArray = FX_NEW CFX_FloatArray; + } + CFX_FloatArray* pFieldArray = ((CXFA_FieldLayoutData*)m_pLayoutData)->m_pFieldSplitArray; + FX_INT32 iFieldSplitCount = pFieldArray->GetSize(); + for (FX_INT32 i = 0; i < iBlockIndex * 3; i += 3) { + iLinesCount -= (FX_INT32)pFieldArray->GetAt(i + 1); + fHeight -= pFieldArray->GetAt(i + 2); + } + if (iLinesCount == 0) { + return FALSE; + } + FX_FLOAT fLineHeight = GetLineHeight(); + FX_FLOAT fFontSize = GetFontSize(); + FX_FLOAT fTextHeight = iLinesCount * fLineHeight - fLineHeight + fFontSize; + FX_FLOAT fSpaceAbove = 0; + FX_FLOAT fStartOffset = 0; + if (fHeight > 0.1f && iBlockIndex == 0) { + fStartOffset = fTopInset; + fHeight -= (fTopInset + fBottomInset); + if (CXFA_Para para = this->GetPara()) { + fSpaceAbove = para.GetSpaceAbove(); + FX_FLOAT fSpaceBelow = para.GetSpaceBelow(); + fHeight -= (fSpaceAbove + fSpaceBelow); + switch (para.GetVerticalAlign()) { + case XFA_ATTRIBUTEENUM_Top: + fStartOffset += fSpaceAbove; + break; + case XFA_ATTRIBUTEENUM_Middle: + fStartOffset += ((fHeight - fTextHeight) / 2 + fSpaceAbove); + break; + case XFA_ATTRIBUTEENUM_Bottom: + fStartOffset += (fHeight - fTextHeight + fSpaceAbove); + break; + } + } + if (fStartOffset < 0.1f) { + fStartOffset = 0; + } + } + for (FX_INT32 i = iBlockIndex - 1; iBlockIndex > 0 && i < iBlockIndex; i++) { + fStartOffset = pFieldArray->GetAt(i * 3) - pFieldArray->GetAt(i * 3 + 2); + if (fStartOffset < 0.1f) { + fStartOffset = 0; + } + } + if (iFieldSplitCount / 3 == (iBlockIndex + 1)) { + pFieldArray->SetAt(0, fStartOffset); + } else { + pFieldArray->Add(fStartOffset); + } + XFA_VERSION version = GetDoc()->GetXFADoc()->GetCurVersionMode(); + FX_BOOL bCanSplitNoContent = FALSE; + XFA_ATTRIBUTEENUM eLayoutMode; + this->GetNode()->GetNodeItem(XFA_NODEITEM_Parent)->TryEnum(XFA_ATTRIBUTE_Layout, eLayoutMode, TRUE); + if ((eLayoutMode == XFA_ATTRIBUTEENUM_Position || eLayoutMode == XFA_ATTRIBUTEENUM_Tb || eLayoutMode == XFA_ATTRIBUTEENUM_Row || eLayoutMode == XFA_ATTRIBUTEENUM_Table) && version > XFA_VERSION_208) { + bCanSplitNoContent = TRUE; + } + if ((eLayoutMode == XFA_ATTRIBUTEENUM_Tb || eLayoutMode == XFA_ATTRIBUTEENUM_Row || eLayoutMode == XFA_ATTRIBUTEENUM_Table) && version <= XFA_VERSION_208) { + if (fStartOffset < fCalcHeight) { + bCanSplitNoContent = TRUE; + } else { + fCalcHeight = 0; + return TRUE; + } + } + if (bCanSplitNoContent) { + if ((fCalcHeight - fTopInset - fSpaceAbove < fLineHeight)) { + fCalcHeight = 0; + return TRUE; + } + if (fStartOffset + XFA_FLOAT_PERCISION >= fCalcHeight) { + if (iFieldSplitCount / 3 == (iBlockIndex + 1)) { + pFieldArray->SetAt(iBlockIndex * 3 + 1, 0); + pFieldArray->SetAt(iBlockIndex * 3 + 2, fCalcHeight); + } else { + pFieldArray->Add(0); + pFieldArray->Add(fCalcHeight); + } + return FALSE; + } + if (fCalcHeight - fStartOffset < fLineHeight) { + fCalcHeight = fStartOffset; + if (iFieldSplitCount / 3 == (iBlockIndex + 1)) { + pFieldArray->SetAt(iBlockIndex * 3 + 1, 0); + pFieldArray->SetAt(iBlockIndex * 3 + 2, fCalcHeight); + } else { + pFieldArray->Add(0); + pFieldArray->Add(fCalcHeight); + } + return TRUE; + } + FX_FLOAT fTextNum = fCalcHeight + XFA_FLOAT_PERCISION - fCapReserve - fStartOffset; + FX_INT32 iLineNum = (FX_INT32)((fTextNum + (fLineHeight - fFontSize)) / fLineHeight); + if (iLineNum >= iLinesCount) { + if (fCalcHeight - fStartOffset - fTextHeight >= fFontSize) { + if (iFieldSplitCount / 3 == (iBlockIndex + 1)) { + pFieldArray->SetAt(iBlockIndex * 3 + 1, (FX_FLOAT)iLinesCount); + pFieldArray->SetAt(iBlockIndex * 3 + 2, fCalcHeight); + } else { + pFieldArray->Add((FX_FLOAT)iLinesCount); + pFieldArray->Add(fCalcHeight); + } + return FALSE; + } + if (fHeight - fStartOffset - fTextHeight < fFontSize) { + iLineNum -= 1; + if (iLineNum == 0) { + fCalcHeight = 0; + return TRUE; + } + } else { + iLineNum = (FX_INT32)(fTextNum / fLineHeight); + } + } + if (iLineNum > 0) { + FX_FLOAT fSplitHeight = iLineNum * fLineHeight + fCapReserve + fStartOffset; + if (iFieldSplitCount / 3 == (iBlockIndex + 1)) { + pFieldArray->SetAt(iBlockIndex * 3 + 1, (FX_FLOAT)iLineNum); + pFieldArray->SetAt(iBlockIndex * 3 + 2, fSplitHeight); + } else { + pFieldArray->Add((FX_FLOAT)iLineNum); + pFieldArray->Add(fSplitHeight); + } + if (fabs(fSplitHeight - fCalcHeight) < XFA_FLOAT_PERCISION) { + return FALSE; + } + fCalcHeight = fSplitHeight; + return TRUE; + } + } + fCalcHeight = 0; + return TRUE; +} +void CXFA_WidgetAcc::InitLayoutData() +{ + if (m_pLayoutData) { + return; + } + switch (GetUIType()) { + case XFA_ELEMENT_Text: + m_pLayoutData = FX_NEW CXFA_TextLayoutData; + return; + case XFA_ELEMENT_TextEdit: + m_pLayoutData = FX_NEW CXFA_TextEditData; + return; + case XFA_ELEMENT_Image: + m_pLayoutData = FX_NEW CXFA_ImageLayoutData; + return; + case XFA_ELEMENT_ImageEdit: + m_pLayoutData = FX_NEW CXFA_ImageEditData; + return; + default: + break; + } + if (GetClassID() == XFA_ELEMENT_Field) { + m_pLayoutData = FX_NEW CXFA_FieldLayoutData; + } else { + m_pLayoutData = FX_NEW CXFA_WidgetLayoutData; + } +} +void CXFA_WidgetAcc::StartTextLayout(FX_FLOAT& fCalcWidth, FX_FLOAT& fCalcHeight) +{ + LoadText(); + CXFA_TextLayout* pTextLayout = ((CXFA_TextLayoutData*)m_pLayoutData)->m_pTextLayout; + FX_FLOAT fTextHeight = 0; + if (fCalcWidth > 0 && fCalcHeight > 0) { + FX_FLOAT fWidth = GetWidthWithoutMargin(fCalcWidth); + pTextLayout->StartLayout(fWidth); + fTextHeight = fCalcHeight; + fTextHeight = GetHeightWithoutMargin(fTextHeight); + pTextLayout->DoLayout(0, fTextHeight, -1, fTextHeight); + return; + } + if (fCalcWidth > 0 && fCalcHeight < 0) { + FX_FLOAT fWidth = GetWidthWithoutMargin(fCalcWidth); + pTextLayout->StartLayout(fWidth); + } + if (fCalcWidth < 0 && fCalcHeight < 0) { + FX_FLOAT fMaxWidth = -1; + FX_BOOL bRet = GetWidth(fMaxWidth); + if (bRet) { + FX_FLOAT fWidth = GetWidthWithoutMargin(fMaxWidth); + pTextLayout->StartLayout(fWidth); + } else { + FX_FLOAT fWidth = pTextLayout->StartLayout(fMaxWidth); + fMaxWidth = CalculateWidgetAutoWidth(fWidth); + fWidth = GetWidthWithoutMargin(fMaxWidth); + pTextLayout->StartLayout(fWidth); + } + fCalcWidth = fMaxWidth; + } + if (m_pLayoutData->m_fWidgetHeight < 0) { + m_pLayoutData->m_fWidgetHeight = pTextLayout->GetLayoutHeight(); + m_pLayoutData->m_fWidgetHeight = CalculateWidgetAutoHeight(m_pLayoutData->m_fWidgetHeight); + } + fTextHeight = m_pLayoutData->m_fWidgetHeight; + fTextHeight = GetHeightWithoutMargin(fTextHeight); + pTextLayout->DoLayout(0, fTextHeight, -1, fTextHeight); + fCalcHeight = m_pLayoutData->m_fWidgetHeight; +} +FX_BOOL CXFA_WidgetAcc::LoadCaption() +{ + InitLayoutData(); + return ((CXFA_FieldLayoutData*)m_pLayoutData)->LoadCaption(this); +} +CXFA_TextLayout* CXFA_WidgetAcc::GetCaptionTextLayout() +{ + return m_pLayoutData ? ((CXFA_FieldLayoutData*)m_pLayoutData)->m_pCapTextLayout : NULL; +} +CXFA_TextLayout* CXFA_WidgetAcc::GetTextLayout() +{ + return m_pLayoutData ? ((CXFA_TextLayoutData*)m_pLayoutData)->m_pTextLayout : NULL; +} +CFX_DIBitmap* CXFA_WidgetAcc::GetImageImage() +{ + return m_pLayoutData ? ((CXFA_ImageLayoutData*)m_pLayoutData)->m_pDIBitmap : NULL; +} +CFX_DIBitmap* CXFA_WidgetAcc::GetImageEditImage() +{ + return m_pLayoutData ? ((CXFA_ImageEditData*)m_pLayoutData)->m_pDIBitmap : NULL; +} +void CXFA_WidgetAcc::SetImageImage(CFX_DIBitmap* newImage) +{ + if(((CXFA_ImageLayoutData*)m_pLayoutData)->m_pDIBitmap == newImage) { + return; + } + if(((CXFA_ImageLayoutData*)m_pLayoutData)->m_pDIBitmap && !((CXFA_ImageLayoutData*)m_pLayoutData)->m_bNamedImage) { + delete ((CXFA_ImageLayoutData*)m_pLayoutData)->m_pDIBitmap; + ((CXFA_ImageLayoutData*)m_pLayoutData)->m_pDIBitmap = NULL; + } + ((CXFA_ImageLayoutData*)m_pLayoutData)->m_pDIBitmap = newImage; +} +void CXFA_WidgetAcc::SetImageEditImage(CFX_DIBitmap* newImage) +{ + if(((CXFA_ImageEditData*)m_pLayoutData)->m_pDIBitmap == newImage) { + return; + } + if(((CXFA_ImageEditData*)m_pLayoutData)->m_pDIBitmap && !((CXFA_ImageEditData*)m_pLayoutData)->m_bNamedImage) { + delete ((CXFA_ImageEditData*)m_pLayoutData)->m_pDIBitmap; + ((CXFA_ImageEditData*)m_pLayoutData)->m_pDIBitmap = NULL; + } + ((CXFA_ImageEditData*)m_pLayoutData)->m_pDIBitmap = newImage; +} +CXFA_WidgetLayoutData* CXFA_WidgetAcc::GetWidgetLayoutData() +{ + return m_pLayoutData; +} +IFX_Font* CXFA_WidgetAcc::GetFDEFont() +{ + CFX_WideStringC wsFontName = FX_WSTRC(L"Courier"); + FX_DWORD dwFontStyle = 0; + if (CXFA_Font font = this->GetFont()) { + if (font.IsBold()) { + dwFontStyle |= FX_FONTSTYLE_Bold; + } + if (font.IsItalic()) { + dwFontStyle |= FX_FONTSTYLE_Italic; + } + font.GetTypeface(wsFontName); + } + CXFA_FFDoc* pDoc = GetDoc(); + return pDoc->GetApp()->GetXFAFontMgr()->GetFont((XFA_HDOC)pDoc, wsFontName, dwFontStyle); +} +FX_FLOAT CXFA_WidgetAcc::GetFontSize() +{ + FX_FLOAT fFontSize = 10.0f; + if (CXFA_Font font = this->GetFont()) { + fFontSize = font.GetFontSize(); + } + return fFontSize < 0.1f ? 10.0f : fFontSize; +} +FX_FLOAT CXFA_WidgetAcc::GetLineHeight() +{ + FX_FLOAT fLineHeight = 0; + if (CXFA_Para para = this->GetPara()) { + fLineHeight = para.GetLineHeight(); + } + if (fLineHeight < 1) { + fLineHeight = GetFontSize() * 1.2f; + } + return fLineHeight; +} +FX_ARGB CXFA_WidgetAcc::GetTextColor() +{ + if (CXFA_Font font = this->GetFont()) { + return font.GetColor(); + } + return 0xFF000000; +} +CXFA_Node* CXFA_TextProvider::GetTextNode(FX_BOOL &bRichText) +{ + bRichText = FALSE; + if (m_pTextNode) { + if (m_pTextNode->GetClassID() == XFA_ELEMENT_ExData) { + CFX_WideString wsContentType; + m_pTextNode->GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType, FALSE); + if (wsContentType.Equal(FX_WSTRC(L"text/html"))) { + bRichText = TRUE; + } + } + return m_pTextNode; + } + if (m_eType == XFA_TEXTPROVIDERTYPE_Text) { + CXFA_Node* pElementNode = m_pWidgetAcc->GetNode(); + CXFA_Node *pValueNode = pElementNode->GetChild(0, XFA_ELEMENT_Value); + if (!pValueNode) { + return NULL; + } + CXFA_Node *pChildNode = pValueNode->GetNodeItem(XFA_NODEITEM_FirstChild); + if (pChildNode && pChildNode->GetClassID() == XFA_ELEMENT_ExData) { + CFX_WideString wsContentType; + pChildNode->GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType, FALSE); + if (wsContentType.Equal(FX_WSTRC(L"text/html"))) { + bRichText = TRUE; + } + } + return pChildNode; + } else if (m_eType == XFA_TEXTPROVIDERTYPE_Datasets) { + CXFA_Node* pBind = m_pWidgetAcc->GetDatasets(); + IFDE_XMLNode *pXMLNode = pBind->GetXMLMappingNode(); + FXSYS_assert(pXMLNode); + for(IFDE_XMLNode *pXMLChild = pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild); pXMLChild; pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) { + if (pXMLChild->GetType() == FDE_XMLNODE_Element) { + IFDE_XMLElement *pElement = (IFDE_XMLElement *)pXMLChild; + if(XFA_RecognizeRichText(pElement)) { + bRichText = TRUE; + } + } + } + return pBind; + } else if (m_eType == XFA_TEXTPROVIDERTYPE_Caption) { + CXFA_Node *pCaptionNode = m_pWidgetAcc->GetNode()->GetChild(0, XFA_ELEMENT_Caption); + if (pCaptionNode == NULL) { + return NULL; + } + CXFA_Node *pValueNode = pCaptionNode->GetChild(0, XFA_ELEMENT_Value); + if (pValueNode == NULL) { + return NULL; + } + CXFA_Node *pChildNode = pValueNode->GetNodeItem(XFA_NODEITEM_FirstChild); + if (pChildNode && pChildNode->GetClassID() == XFA_ELEMENT_ExData) { + CFX_WideString wsContentType; + pChildNode->GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType, FALSE); + if (wsContentType.Equal(FX_WSTRC(L"text/html"))) { + bRichText = TRUE; + } + } + return pChildNode; + } + CXFA_Node *pItemNode = m_pWidgetAcc->GetNode()->GetChild(0, XFA_ELEMENT_Items); + if (pItemNode == NULL) { + return NULL; + } + CXFA_Node* pNode = pItemNode->GetNodeItem(XFA_NODEITEM_FirstChild); + while(pNode) { + CFX_WideStringC wsName; + pNode->TryCData(XFA_ATTRIBUTE_Name, wsName); + if (m_eType == XFA_TEXTPROVIDERTYPE_Rollover && wsName == FX_WSTRC(L"rollover")) { + return pNode; + } + if (m_eType == XFA_TEXTPROVIDERTYPE_Down && wsName == FX_WSTRC(L"down")) { + return pNode; + } + pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling); + } + return NULL; +} +CXFA_Para CXFA_TextProvider::GetParaNode() +{ + if (m_eType == XFA_TEXTPROVIDERTYPE_Text) { + return m_pWidgetAcc->GetPara(); + } + CXFA_Node *pNode = m_pWidgetAcc->GetNode()->GetChild(0, XFA_ELEMENT_Caption); + return pNode->GetChild(0, XFA_ELEMENT_Para); +} +CXFA_Font CXFA_TextProvider::GetFontNode() +{ + if (m_eType == XFA_TEXTPROVIDERTYPE_Text) { + return m_pWidgetAcc->GetFont(); + } + CXFA_Node *pNode = m_pWidgetAcc->GetNode()->GetChild(0, XFA_ELEMENT_Caption); + pNode = pNode->GetChild(0, XFA_ELEMENT_Font); + if (pNode) { + return pNode; + } + return m_pWidgetAcc->GetFont(); +} +FX_BOOL CXFA_TextProvider::IsCheckButtonAndAutoWidth() +{ + XFA_ELEMENT eType = m_pWidgetAcc->GetUIType(); + if (eType == XFA_ELEMENT_CheckButton) { + FX_FLOAT fWidth = 0; + return !m_pWidgetAcc->GetWidth(fWidth); + } + return FALSE; +} +FX_BOOL CXFA_TextProvider::GetEmbbedObj(FX_BOOL bURI, FX_BOOL bRaw, const CFX_WideString &wsAttr, CFX_WideString &wsValue) +{ + if (m_eType != XFA_TEXTPROVIDERTYPE_Text) { + return FALSE; + } + if (bURI) { + CXFA_Node* pWidgetNode = m_pWidgetAcc->GetNode(); + CXFA_Node* pParent = pWidgetNode->GetNodeItem(XFA_NODEITEM_Parent); + CXFA_Document* pDocument = pWidgetNode->GetDocument(); + CXFA_Node* pIDNode = NULL; + CXFA_WidgetAcc* pEmbAcc = NULL; + if (pParent) { + pIDNode = pDocument->GetNodeByID(pParent, wsAttr); + } + if (!pIDNode) { + pIDNode = pDocument->GetNodeByID((CXFA_Node*)pDocument->GetXFANode(XFA_HASHCODE_Form), wsAttr); + } + if (pIDNode) { + pEmbAcc = (CXFA_WidgetAcc*)pIDNode->GetWidgetData(); + } + if (pEmbAcc) { + pEmbAcc->GetValue(wsValue, XFA_VALUEPICTURE_Display); + return TRUE; + } + } + return FALSE; +} diff --git a/xfa/src/fxfa/src/app/xfa_ffwidgetacc.h b/xfa/src/fxfa/src/app/xfa_ffwidgetacc.h new file mode 100644 index 0000000000..38f9678140 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffwidgetacc.h @@ -0,0 +1,40 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FXFA_FORMFILLER_WIDGETACC_IMP_H +#define _FXFA_FORMFILLER_WIDGETACC_IMP_H +#include "xfa_textlayout.h" +enum XFA_TEXTPROVIDERTYPE { + XFA_TEXTPROVIDERTYPE_Text, + XFA_TEXTPROVIDERTYPE_Datasets, + XFA_TEXTPROVIDERTYPE_Caption, + XFA_TEXTPROVIDERTYPE_Rollover, + XFA_TEXTPROVIDERTYPE_Down, +}; +class CXFA_TextProvider : public IXFA_TextProvider, public CFX_Object +{ +public: + CXFA_TextProvider(CXFA_WidgetAcc *pWidgetAcc, XFA_TEXTPROVIDERTYPE eType, CXFA_Node* pTextNode = NULL) + : m_pWidgetAcc(pWidgetAcc), m_eType(eType), m_pTextNode(pTextNode) + { + FXSYS_assert(m_pWidgetAcc != NULL); + } + virtual ~CXFA_TextProvider() {} + virtual CXFA_Node* GetTextNode(FX_BOOL &bRichText); + virtual CXFA_Para GetParaNode(); + virtual CXFA_Font GetFontNode(); + virtual FX_BOOL IsCheckButtonAndAutoWidth(); + virtual CXFA_FFDoc* GetDocNode() + { + return m_pWidgetAcc->GetDoc(); + } + virtual FX_BOOL GetEmbbedObj(FX_BOOL bURI, FX_BOOL bRaw, const CFX_WideString &wsAttr, CFX_WideString &wsValue); +protected: + CXFA_WidgetAcc *m_pWidgetAcc; + XFA_TEXTPROVIDERTYPE m_eType; + CXFA_Node* m_pTextNode; +}; +#endif diff --git a/xfa/src/fxfa/src/app/xfa_ffwidgethandler.cpp b/xfa/src/fxfa/src/app/xfa_ffwidgethandler.cpp new file mode 100644 index 0000000000..12df3a096a --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffwidgethandler.cpp @@ -0,0 +1,591 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_common.h" +#include "xfa_fwladapter.h" +#include "xfa_ffwidgethandler.h" +#include "xfa_ffwidget.h" +#include "xfa_fffield.h" +#include "xfa_ffchoicelist.h" +#include "xfa_ffdoc.h" +#include "xfa_ffdocview.h" +CXFA_FFWidgetHandler::CXFA_FFWidgetHandler(CXFA_FFDocView* pDocView) + : m_pDocView(pDocView) +{ +} +CXFA_FFWidgetHandler::~CXFA_FFWidgetHandler() +{ +} +IXFA_PageView* CXFA_FFWidgetHandler::GetPageView(XFA_HWIDGET hWidget) +{ + return ((CXFA_FFWidget*)hWidget)->GetPageView(); +} +void CXFA_FFWidgetHandler::GetRect(XFA_HWIDGET hWidget, CFX_RectF &rt) +{ + ((CXFA_FFWidget*)hWidget)->GetWidgetRect(rt); +} +FX_DWORD CXFA_FFWidgetHandler::GetStatus(XFA_HWIDGET hWidget) +{ + return ((CXFA_FFWidget*)hWidget)->GetStatus(); +} +FX_BOOL CXFA_FFWidgetHandler::GetBBox(XFA_HWIDGET hWidget, CFX_RectF &rtBox, FX_DWORD dwStatus, FX_BOOL bDrawFocus) +{ + return ((CXFA_FFWidget*)hWidget)->GetBBox(rtBox, dwStatus, bDrawFocus); +} +CXFA_WidgetAcc* CXFA_FFWidgetHandler::GetDataAcc(XFA_HWIDGET hWidget) +{ + return ((CXFA_FFWidget*)hWidget)->GetDataAcc(); +} +void CXFA_FFWidgetHandler::GetName(XFA_HWIDGET hWidget, CFX_WideString &wsName, FX_INT32 iNameType ) +{ + ((CXFA_FFWidget*)hWidget)->GetDataAcc()->GetName(wsName, iNameType); +} +FX_BOOL CXFA_FFWidgetHandler::GetToolTip(XFA_HWIDGET hWidget, CFX_WideString &wsToolTip) +{ + return ((CXFA_FFWidget*)hWidget)->GetToolTip(wsToolTip); +} +void CXFA_FFWidgetHandler::SetPrivateData(XFA_HWIDGET hWidget, FX_LPVOID module_id, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback) +{ + ((CXFA_FFWidget*)hWidget)->SetPrivateData(module_id, pData, callback); +} +FX_LPVOID CXFA_FFWidgetHandler::GetPrivateData(XFA_HWIDGET hWidget, FX_LPVOID module_id) +{ + return ((CXFA_FFWidget*)hWidget)->GetPrivateData(module_id); +} +FX_BOOL CXFA_FFWidgetHandler::OnMouseEnter(XFA_HWIDGET hWidget) +{ + m_pDocView->LockUpdate(); + FX_BOOL bRet = ((CXFA_FFWidget*)hWidget)->OnMouseEnter(); + m_pDocView->UnlockUpdate(); + m_pDocView->UpdateDocView(); + return bRet; +} +FX_BOOL CXFA_FFWidgetHandler::OnMouseExit(XFA_HWIDGET hWidget) +{ + m_pDocView->LockUpdate(); + FX_BOOL bRet = ((CXFA_FFWidget*)hWidget)->OnMouseExit(); + m_pDocView->UnlockUpdate(); + m_pDocView->UpdateDocView(); + return bRet; +} +FX_BOOL CXFA_FFWidgetHandler::OnLButtonDown(XFA_HWIDGET hWidget, FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + m_pDocView->LockUpdate(); + ((CXFA_FFWidget*)hWidget)->Rotate2Normal(fx, fy); + FX_BOOL bRet = ((CXFA_FFWidget*)hWidget)->OnLButtonDown(dwFlags, fx, fy); + if (bRet && m_pDocView->SetFocus(hWidget)) { + ((CXFA_FFDoc*)m_pDocView->GetDoc())->GetDocProvider()->SetFocusWidget((XFA_HDOC)m_pDocView->GetDoc(), (XFA_HWIDGET)hWidget); + } + m_pDocView->UnlockUpdate(); + m_pDocView->UpdateDocView(); + return bRet; +} +FX_BOOL CXFA_FFWidgetHandler::OnLButtonUp(XFA_HWIDGET hWidget, FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + m_pDocView->LockUpdate(); + ((CXFA_FFWidget*)hWidget)->Rotate2Normal(fx, fy); + m_pDocView->m_bLayoutEvent = TRUE; + FX_BOOL bRet = ((CXFA_FFWidget*)hWidget)->OnLButtonUp(dwFlags, fx, fy); + m_pDocView->UnlockUpdate(); + m_pDocView->UpdateDocView(); + return bRet; +} +FX_BOOL CXFA_FFWidgetHandler::OnLButtonDblClk(XFA_HWIDGET hWidget, FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + ((CXFA_FFWidget*)hWidget)->Rotate2Normal(fx, fy); + FX_BOOL bRet = ((CXFA_FFWidget*)hWidget)->OnLButtonDblClk(dwFlags, fx, fy); + m_pDocView->RunInvalidate(); + return bRet; +} +FX_BOOL CXFA_FFWidgetHandler::OnMouseMove(XFA_HWIDGET hWidget, FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + ((CXFA_FFWidget*)hWidget)->Rotate2Normal(fx, fy); + FX_BOOL bRet = ((CXFA_FFWidget*)hWidget)->OnMouseMove(dwFlags, fx, fy); + m_pDocView->RunInvalidate(); + return bRet; +} +FX_BOOL CXFA_FFWidgetHandler::OnMouseWheel(XFA_HWIDGET hWidget, FX_DWORD dwFlags, FX_SHORT zDelta, FX_FLOAT fx, FX_FLOAT fy) +{ + ((CXFA_FFWidget*)hWidget)->Rotate2Normal(fx, fy); + FX_BOOL bRet = ((CXFA_FFWidget*)hWidget)->OnMouseWheel(dwFlags, zDelta, fx, fy); + m_pDocView->RunInvalidate(); + return bRet; +} +FX_BOOL CXFA_FFWidgetHandler::OnRButtonDown(XFA_HWIDGET hWidget, FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + ((CXFA_FFWidget*)hWidget)->Rotate2Normal(fx, fy); + FX_BOOL bRet = ((CXFA_FFWidget*)hWidget)->OnRButtonDown(dwFlags, fx, fy); + if (bRet && m_pDocView->SetFocus(hWidget)) { + ((CXFA_FFDoc*)m_pDocView->GetDoc())->GetDocProvider()->SetFocusWidget((XFA_HDOC)m_pDocView->GetDoc(), (XFA_HWIDGET)hWidget); + } + m_pDocView->RunInvalidate(); + return bRet; +} +FX_BOOL CXFA_FFWidgetHandler::OnRButtonUp(XFA_HWIDGET hWidget, FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + ((CXFA_FFWidget*)hWidget)->Rotate2Normal(fx, fy); + FX_BOOL bRet = ((CXFA_FFWidget*)hWidget)->OnRButtonUp(dwFlags, fx, fy); + m_pDocView->RunInvalidate(); + return bRet; +} +FX_BOOL CXFA_FFWidgetHandler::OnRButtonDblClk(XFA_HWIDGET hWidget, FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) +{ + ((CXFA_FFWidget*)hWidget)->Rotate2Normal(fx, fy); + FX_BOOL bRet = ((CXFA_FFWidget*)hWidget)->OnRButtonDblClk(dwFlags, fx, fy); + m_pDocView->RunInvalidate(); + return bRet; +} +FX_BOOL CXFA_FFWidgetHandler::OnKeyDown(XFA_HWIDGET hWidget, FX_DWORD dwKeyCode, FX_DWORD dwFlags) +{ + FX_BOOL bRet = ((CXFA_FFWidget*)hWidget)->OnKeyDown(dwKeyCode, dwFlags); + m_pDocView->RunInvalidate(); + m_pDocView->UpdateDocView(); + return bRet; +} +FX_BOOL CXFA_FFWidgetHandler::OnKeyUp(XFA_HWIDGET hWidget, FX_DWORD dwKeyCode, FX_DWORD dwFlags) +{ + FX_BOOL bRet = ((CXFA_FFWidget*)hWidget)->OnKeyUp(dwKeyCode, dwFlags); + m_pDocView->RunInvalidate(); + return bRet; +} +FX_BOOL CXFA_FFWidgetHandler::OnChar(XFA_HWIDGET hWidget, FX_DWORD dwChar, FX_DWORD dwFlags) +{ + FX_BOOL bRet = ((CXFA_FFWidget*)hWidget)->OnChar(dwChar, dwFlags); + m_pDocView->RunInvalidate(); + return bRet; +} +FX_DWORD CXFA_FFWidgetHandler::OnHitTest(XFA_HWIDGET hWidget, FX_FLOAT fx, FX_FLOAT fy) +{ + if (!(((CXFA_FFWidget*)hWidget)->GetStatus() & XFA_WIDGETSTATUS_Visible)) { + return FWL_WGTHITTEST_Unknown; + } + ((CXFA_FFWidget*)hWidget)->Rotate2Normal(fx, fy); + return ((CXFA_FFWidget*)hWidget)->OnHitTest(fx, fy); +} +FX_BOOL CXFA_FFWidgetHandler::OnSetCursor(XFA_HWIDGET hWidget, FX_FLOAT fx, FX_FLOAT fy) +{ + ((CXFA_FFWidget*)hWidget)->Rotate2Normal(fx, fy); + return ((CXFA_FFWidget*)hWidget)->OnSetCursor(fx, fy); +} +void CXFA_FFWidgetHandler::RenderWidget(XFA_HWIDGET hWidget, CFX_Graphics* pGS, CFX_Matrix* pMatrix , FX_BOOL bHighlight) +{ + ((CXFA_FFWidget*)hWidget)->RenderWidget(pGS, pMatrix, bHighlight ? XFA_WIDGETSTATUS_Highlight : 0, 0); +} +FX_BOOL CXFA_FFWidgetHandler::HasEvent(CXFA_WidgetAcc* pWidgetAcc, XFA_EVENTTYPE eEventType) +{ + if (!pWidgetAcc || eEventType == XFA_EVENT_Unknown) { + return FALSE; + } + if (pWidgetAcc->GetClassID() == XFA_ELEMENT_Draw) { + return FALSE; + } + switch (eEventType) { + case XFA_EVENT_Calculate: { + CXFA_Calculate calc = pWidgetAcc->GetCalculate(); + if (!calc) { + return FALSE; + } + if (CXFA_Script script = calc.GetScript()) { + return TRUE; + } + return FALSE; + } + case XFA_EVENT_Validate: { + CXFA_Validate val = pWidgetAcc->GetValidate(); + if (!val) { + return FALSE; + } + if (val.GetScript()) { + return TRUE; + } + return FALSE; + } + default: + break; + } + CXFA_NodeArray eventArray; + return pWidgetAcc->GetEventByActivity(gs_EventActivity[eEventType], eventArray); +} +FX_INT32 CXFA_FFWidgetHandler::ProcessEvent(CXFA_WidgetAcc* pWidgetAcc, CXFA_EventParam* pParam) +{ + if (!pParam || pParam->m_eType == XFA_EVENT_Unknown) { + return XFA_EVENTERROR_NotExist; + } + if (!pWidgetAcc || pWidgetAcc->GetClassID() == XFA_ELEMENT_Draw) { + return XFA_EVENTERROR_NotExist; + } + switch (pParam->m_eType) { + case XFA_EVENT_Calculate: + return pWidgetAcc->ProcessCalculate(); + case XFA_EVENT_Validate: + if (((CXFA_FFDoc*)m_pDocView->GetDoc())->GetDocProvider()->IsValidationsEnabled(m_pDocView->GetDoc())) { + return pWidgetAcc->ProcessValidate(); + } + return XFA_EVENTERROR_Disabled; + case XFA_EVENT_InitCalculate: { + CXFA_Calculate calc = pWidgetAcc->GetCalculate(); + if (!calc) { + return XFA_EVENTERROR_NotExist; + } + if (pWidgetAcc->GetNode()->HasFlag(XFA_NODEFLAG_UserInteractive)) { + return XFA_EVENTERROR_Disabled; + } + CXFA_Script script = calc.GetScript(); + return pWidgetAcc->ExecuteScript(script, pParam); + } + default: + break; + } + FX_INT32 iRet = pWidgetAcc->ProcessEvent(gs_EventActivity[pParam->m_eType], pParam); + return iRet; +} +XFA_HWIDGET CXFA_FFWidgetHandler::CreateWidget(XFA_HWIDGET hParent, XFA_WIDGETTYPE eType, XFA_HWIDGET hBefore ) +{ + CXFA_Node* pParentFormItem = hParent ? ((CXFA_FFWidget*)hParent)->GetDataAcc()->GetNode() : NULL; + CXFA_Node* pBeforeFormItem = hBefore ? ((CXFA_FFWidget*)hBefore)->GetDataAcc()->GetNode() : NULL; + CXFA_Node* pNewFormItem = CreateWidgetFormItem(eType, pParentFormItem, pBeforeFormItem); + if (pNewFormItem == NULL) { + return NULL; + } + pNewFormItem->GetTemplateNode()->SetFlag(XFA_NODEFLAG_Initialized); + pNewFormItem->SetFlag(XFA_NODEFLAG_Initialized); + m_pDocView->RunLayout(); + CXFA_LayoutItem* pLayout = m_pDocView->GetXFALayout()->GetLayoutItem(pNewFormItem); + return (XFA_HWIDGET)pLayout; +} +CXFA_Node* CXFA_FFWidgetHandler::CreateWidgetFormItem(XFA_WIDGETTYPE eType, CXFA_Node* pParent, CXFA_Node* pBefore) const +{ + switch (eType) { + case XFA_WIDGETTYPE_Barcode: + return NULL; + case XFA_WIDGETTYPE_PushButton: + return CreatePushButton(pParent, pBefore); + case XFA_WIDGETTYPE_CheckButton: + return CreateCheckButton(pParent, pBefore); + case XFA_WIDGETTYPE_ExcludeGroup: + return CreateExclGroup(pParent, pBefore); + case XFA_WIDGETTYPE_RadioButton: + return CreateRadioButton(pParent, pBefore); + case XFA_WIDGETTYPE_Arc: + return CreateArc(pParent, pBefore); + case XFA_WIDGETTYPE_Rectangle: + return CreateRectangle(pParent, pBefore); + case XFA_WIDGETTYPE_Image: + return CreateImage(pParent, pBefore); + case XFA_WIDGETTYPE_Line: + return CreateLine(pParent, pBefore); + case XFA_WIDGETTYPE_Text: + return CreateText(pParent, pBefore); + case XFA_WIDGETTYPE_DatetimeEdit: + return CreateDatetimeEdit(pParent, pBefore); + case XFA_WIDGETTYPE_DecimalField: + return CreateDecimalField(pParent, pBefore); + case XFA_WIDGETTYPE_NumericField: + return CreateNumericField(pParent, pBefore); + case XFA_WIDGETTYPE_Signature: + return CreateSignature(pParent, pBefore); + case XFA_WIDGETTYPE_TextEdit: + return CreateTextEdit(pParent, pBefore); + case XFA_WIDGETTYPE_DropdownList: + return CreateDropdownList(pParent, pBefore); + case XFA_WIDGETTYPE_ListBox: + return CreateListBox(pParent, pBefore); + case XFA_WIDGETTYPE_ImageField: + return CreateImageField(pParent, pBefore); + case XFA_WIDGETTYPE_PasswordEdit: + return CreatePasswordEdit(pParent, pBefore); + case XFA_WIDGETTYPE_Subform: + return CreateSubform(pParent, pBefore); + default: + break; + } + return NULL; +} +CXFA_Node* CXFA_FFWidgetHandler::CreatePushButton(CXFA_Node* pParent, CXFA_Node* pBefore) const +{ + CXFA_Node* pField = CreateField(XFA_ELEMENT_Button, pParent, pBefore); + CXFA_Node* pCaption = CreateCopyNode(XFA_ELEMENT_Caption, pField); + CXFA_Node* pValue = CreateCopyNode(XFA_ELEMENT_Value, pCaption); + CXFA_Node* pText = CreateCopyNode(XFA_ELEMENT_Text, pValue); + pText->SetContent(FX_WSTRC(L"Button"), FX_WSTRC(L"Button"), FALSE); + CXFA_Node* pPara = CreateCopyNode(XFA_ELEMENT_Para, pCaption); + pPara->SetEnum(XFA_ATTRIBUTE_VAlign, XFA_ATTRIBUTEENUM_Middle, FALSE); + pPara->SetEnum(XFA_ATTRIBUTE_HAlign, XFA_ATTRIBUTEENUM_Center, FALSE); + CreateFontNode(pCaption); + CXFA_Node* pBorder = CreateCopyNode(XFA_ELEMENT_Border, pField); + pBorder->SetEnum(XFA_ATTRIBUTE_Hand, XFA_ATTRIBUTEENUM_Right, FALSE); + CXFA_Node* pEdge = CreateCopyNode(XFA_ELEMENT_Edge, pBorder); + pEdge->SetEnum(XFA_ATTRIBUTE_Stroke, XFA_ATTRIBUTEENUM_Raised, FALSE); + CXFA_Node* pFill = CreateCopyNode(XFA_ELEMENT_Fill, pBorder); + CXFA_Node* pColor = CreateCopyNode(XFA_ELEMENT_Color, pFill); + pColor->SetCData(XFA_ATTRIBUTE_Value, FX_WSTRC(L"212, 208, 200"), FALSE); + CXFA_Node* pBind = CreateCopyNode(XFA_ELEMENT_Bind, pField); + pBind->SetEnum(XFA_ATTRIBUTE_Match, XFA_ATTRIBUTEENUM_None); + return pField; +} +CXFA_Node* CXFA_FFWidgetHandler::CreateCheckButton(CXFA_Node* pParent, CXFA_Node* pBefore) const +{ + CXFA_Node* pField = CreateField(XFA_ELEMENT_CheckButton, pParent, pBefore); + return pField; +} +CXFA_Node* CXFA_FFWidgetHandler::CreateExclGroup(CXFA_Node* pParent, CXFA_Node* pBefore) const +{ + return CreateFormItem(XFA_ELEMENT_ExclGroup, pParent, pBefore); +} +CXFA_Node* CXFA_FFWidgetHandler::CreateRadioButton(CXFA_Node* pParent, CXFA_Node* pBefore) const +{ + CXFA_Node* pField = CreateField(XFA_ELEMENT_CheckButton, pParent, pBefore); + CXFA_Node* pUi = pField->GetFirstChildByClass(XFA_ELEMENT_Ui); + CXFA_Node* pWidget = pUi->GetFirstChildByClass(XFA_ELEMENT_CheckButton); + pWidget->SetEnum(XFA_ATTRIBUTE_Shape, XFA_ATTRIBUTEENUM_Round); + return pField; +} +CXFA_Node* CXFA_FFWidgetHandler::CreateDatetimeEdit(CXFA_Node* pParent, CXFA_Node* pBefore) const +{ + CXFA_Node* pField = CreateField(XFA_ELEMENT_DateTimeEdit, pParent, pBefore); + CreateValueNode(XFA_ELEMENT_Date, pField); + return pField; +} +CXFA_Node* CXFA_FFWidgetHandler::CreateDecimalField(CXFA_Node* pParent, CXFA_Node* pBefore) const +{ + CXFA_Node* pField = CreateNumericField(pParent, pBefore); + CreateValueNode(XFA_ELEMENT_Decimal, pField); + return pField; +} +CXFA_Node* CXFA_FFWidgetHandler::CreateNumericField(CXFA_Node* pParent, CXFA_Node* pBefore) const +{ + CXFA_Node* pField = CreateField(XFA_ELEMENT_NumericEdit, pParent, pBefore); + return pField; +} +CXFA_Node* CXFA_FFWidgetHandler::CreateSignature(CXFA_Node* pParent, CXFA_Node* pBefore) const +{ + CXFA_Node* pField = CreateField(XFA_ELEMENT_Signature, pParent, pBefore); + return pField; +} +CXFA_Node* CXFA_FFWidgetHandler::CreateTextEdit(CXFA_Node* pParent, CXFA_Node* pBefore) const +{ + CXFA_Node* pField = CreateField(XFA_ELEMENT_TextEdit, pParent, pBefore); + return pField; +} +CXFA_Node* CXFA_FFWidgetHandler::CreateDropdownList(CXFA_Node* pParent, CXFA_Node* pBefore) const +{ + CXFA_Node* pField = CreateField(XFA_ELEMENT_ChoiceList, pParent, pBefore); + return pField; +} +CXFA_Node* CXFA_FFWidgetHandler::CreateListBox(CXFA_Node* pParent, CXFA_Node* pBefore) const +{ + CXFA_Node* pField = CreateDropdownList(pParent, pBefore); + CXFA_Node* pUi = pField->GetNodeItem(XFA_NODEITEM_FirstChild); + CXFA_Node* pListBox = pUi->GetNodeItem(XFA_NODEITEM_FirstChild); + pListBox->SetEnum(XFA_ATTRIBUTE_Open, XFA_ATTRIBUTEENUM_Always); + pListBox->SetEnum(XFA_ATTRIBUTE_CommitOn, XFA_ATTRIBUTEENUM_Exit); + return pField; +} +CXFA_Node* CXFA_FFWidgetHandler::CreateImageField(CXFA_Node* pParent, CXFA_Node* pBefore) const +{ + CXFA_Node* pField = CreateField(XFA_ELEMENT_ImageEdit, pParent, pBefore); + return pField; +} +CXFA_Node* CXFA_FFWidgetHandler::CreatePasswordEdit(CXFA_Node* pParent, CXFA_Node* pBefore) const +{ + CXFA_Node* pField = CreateField(XFA_ELEMENT_PasswordEdit, pParent, pBefore); + CXFA_Node* pBind = CreateCopyNode(XFA_ELEMENT_Bind, pField); + pBind->SetEnum(XFA_ATTRIBUTE_Match, XFA_ATTRIBUTEENUM_None, FALSE); + return pField; +} +CXFA_Node* CXFA_FFWidgetHandler::CreateField(XFA_ELEMENT eElement, CXFA_Node* pParent, CXFA_Node* pBefore) const +{ + CXFA_Node* pField = CreateFormItem(XFA_ELEMENT_Field, pParent, pBefore); + CXFA_Node* pUi = CreateCopyNode(XFA_ELEMENT_Ui, pField); + CXFA_Node* pCheckButton = CreateCopyNode(eElement, pUi); + CreateFontNode(pField); + return pField; +} +CXFA_Node* CXFA_FFWidgetHandler::CreateArc(CXFA_Node* pParent, CXFA_Node* pBefore) const +{ + CXFA_Node* pField = CreateDraw(XFA_ELEMENT_Arc, pParent, pBefore); + return pField; +} +CXFA_Node* CXFA_FFWidgetHandler::CreateRectangle(CXFA_Node* pParent, CXFA_Node* pBefore) const +{ + CXFA_Node* pField = CreateDraw(XFA_ELEMENT_Rectangle, pParent, pBefore); + return pField; +} +CXFA_Node* CXFA_FFWidgetHandler::CreateImage(CXFA_Node* pParent, CXFA_Node* pBefore) const +{ + CXFA_Node* pField = CreateDraw(XFA_ELEMENT_Image, pParent, pBefore); + CXFA_Node* pUi = CreateCopyNode(XFA_ELEMENT_Ui, pField); + CXFA_Node* pImage = CreateCopyNode(XFA_ELEMENT_ImageEdit, pUi); + return pField; +} +CXFA_Node* CXFA_FFWidgetHandler::CreateLine(CXFA_Node* pParent, CXFA_Node* pBefore) const +{ + CXFA_Node* pField = CreateDraw(XFA_ELEMENT_Line, pParent, pBefore); + return pField; +} +CXFA_Node* CXFA_FFWidgetHandler::CreateText(CXFA_Node* pParent, CXFA_Node* pBefore) const +{ + CXFA_Node* pField = CreateDraw(XFA_ELEMENT_Text, pParent, pBefore); + CXFA_Node* pUi = CreateCopyNode(XFA_ELEMENT_Ui, pField); + CXFA_Node* pTextEdit = CreateCopyNode(XFA_ELEMENT_TextEdit, pUi); + CreateFontNode(pField); + return pField; +} +CXFA_Node* CXFA_FFWidgetHandler::CreateDraw(XFA_ELEMENT eElement, CXFA_Node* pParent, CXFA_Node* pBefore) const +{ + CXFA_Node* pDraw = CreateFormItem(XFA_ELEMENT_Draw, pParent, pBefore); + CreateValueNode(eElement, pDraw); + return pDraw; +} +CXFA_Node* CXFA_FFWidgetHandler::CreateSubform(CXFA_Node* pParent, CXFA_Node* pBefore) const +{ + CXFA_Node* pSubform = CreateFormItem(XFA_ELEMENT_Subform, pParent, pBefore); + return pSubform; +} +CXFA_Node* CXFA_FFWidgetHandler::CreateFormItem(XFA_ELEMENT eElement, CXFA_Node* pParent, CXFA_Node* pBefore) const +{ + CXFA_Node* pTemplateParent = pParent != NULL ? pParent->GetTemplateNode() : NULL; + CXFA_Node* pNewFormItem = pTemplateParent->CloneTemplateToForm(FALSE); + if (pParent != NULL) { + pParent->InsertChild(pNewFormItem, pBefore); + } + return pNewFormItem; +} +CXFA_Node* CXFA_FFWidgetHandler::CreateCopyNode(XFA_ELEMENT eElement, CXFA_Node* pParent, CXFA_Node* pBefore) const +{ + CXFA_Node* pTemplateParent = pParent != NULL ? pParent->GetTemplateNode() : NULL; + CXFA_Node* pNewNode = CreateTemplateNode(eElement, pTemplateParent, pBefore ? pBefore->GetTemplateNode() : NULL)->Clone(FALSE); + if (pParent != NULL) { + pParent->InsertChild(pNewNode, pBefore); + } + return pNewNode; +} +CXFA_Node* CXFA_FFWidgetHandler::CreateTemplateNode(XFA_ELEMENT eElement, CXFA_Node* pParent, CXFA_Node* pBefore) const +{ + CXFA_Document* pXFADoc = GetXFADoc(); + CXFA_Node* pNewTemplateNode = pXFADoc->GetParser()->GetFactory()->CreateNode(XFA_XDPPACKET_Template, eElement); + if (pParent != NULL) { + pParent->InsertChild(pNewTemplateNode, pBefore); + } + return pNewTemplateNode; +} +CXFA_Node* CXFA_FFWidgetHandler::CreateFontNode(CXFA_Node* pParent) const +{ + CXFA_Node* pFont = CreateCopyNode(XFA_ELEMENT_Font, pParent); + pFont->SetCData(XFA_ATTRIBUTE_Typeface, FX_WSTRC(L"Myriad Pro"), FALSE); + return pFont; +} +CXFA_Node* CXFA_FFWidgetHandler::CreateMarginNode(CXFA_Node* pParent, FX_DWORD dwFlags, FX_FLOAT fInsets[4]) const +{ + CXFA_Node* pMargin = CreateCopyNode(XFA_ELEMENT_Margin, pParent); + if (dwFlags & 0x01) { + pMargin->SetMeasure(XFA_ATTRIBUTE_LeftInset, CXFA_Measurement(fInsets[0], XFA_UNIT_Pt), FALSE); + } + if (dwFlags & 0x02) { + pMargin->SetMeasure(XFA_ATTRIBUTE_TopInset, CXFA_Measurement(fInsets[1], XFA_UNIT_Pt), FALSE); + } + if (dwFlags & 0x04) { + pMargin->SetMeasure(XFA_ATTRIBUTE_RightInset, CXFA_Measurement(fInsets[2], XFA_UNIT_Pt), FALSE); + } + if (dwFlags & 0x08) { + pMargin->SetMeasure(XFA_ATTRIBUTE_BottomInset, CXFA_Measurement(fInsets[3], XFA_UNIT_Pt), FALSE); + } + return pMargin; +} +CXFA_Node* CXFA_FFWidgetHandler::CreateValueNode(XFA_ELEMENT eValue, CXFA_Node* pParent) const +{ + CXFA_Node* pValue = CreateCopyNode(XFA_ELEMENT_Value, pParent); + CXFA_Node* pDate = CreateCopyNode(eValue, pValue); + return pValue; +} +IXFA_ObjFactory* CXFA_FFWidgetHandler::GetObjFactory() const +{ + return GetXFADoc()->GetParser()->GetFactory(); +} +CXFA_Document* CXFA_FFWidgetHandler::GetXFADoc() const +{ + return ((CXFA_FFDoc*)(m_pDocView->GetDoc()))->GetXFADoc(); +} +CXFA_FFMenuHandler::CXFA_FFMenuHandler() +{ +} +CXFA_FFMenuHandler::~CXFA_FFMenuHandler() +{ +} +FX_BOOL CXFA_FFMenuHandler::CanCopy(XFA_HWIDGET hWidget) +{ + return ((CXFA_FFWidget*)hWidget)->CanCopy(); +} +FX_BOOL CXFA_FFMenuHandler::CanCut(XFA_HWIDGET hWidget) +{ + return ((CXFA_FFWidget*)hWidget)->CanCut(); +} +FX_BOOL CXFA_FFMenuHandler::CanPaste(XFA_HWIDGET hWidget) +{ + return ((CXFA_FFWidget*)hWidget)->CanPaste(); +} +FX_BOOL CXFA_FFMenuHandler::CanSelectAll(XFA_HWIDGET hWidget) +{ + return ((CXFA_FFWidget*)hWidget)->CanSelectAll(); +} +FX_BOOL CXFA_FFMenuHandler::CanDelete(XFA_HWIDGET hWidget) +{ + return ((CXFA_FFWidget*)hWidget)->CanDelete(); +} +FX_BOOL CXFA_FFMenuHandler::CanDeSelect(XFA_HWIDGET hWidget) +{ + return ((CXFA_FFWidget*)hWidget)->CanDeSelect(); +} +FX_BOOL CXFA_FFMenuHandler::Copy(XFA_HWIDGET hWidget, CFX_WideString &wsText) +{ + return ((CXFA_FFWidget*)hWidget)->Copy(wsText); +} +FX_BOOL CXFA_FFMenuHandler::Cut(XFA_HWIDGET hWidget, CFX_WideString &wsText) +{ + return ((CXFA_FFWidget*)hWidget)->Cut(wsText); +} +FX_BOOL CXFA_FFMenuHandler::Paste(XFA_HWIDGET hWidget, const CFX_WideString &wsText) +{ + return ((CXFA_FFWidget*)hWidget)->Paste(wsText); +} +FX_BOOL CXFA_FFMenuHandler::SelectAll(XFA_HWIDGET hWidget) +{ + return ((CXFA_FFWidget*)hWidget)->SelectAll(); +} +FX_BOOL CXFA_FFMenuHandler::Delete(XFA_HWIDGET hWidget) +{ + return ((CXFA_FFWidget*)hWidget)->Delete(); +} +FX_BOOL CXFA_FFMenuHandler::DeSelect(XFA_HWIDGET hWidget) +{ + return ((CXFA_FFWidget*)hWidget)->DeSelect(); +} +FX_BOOL CXFA_FFMenuHandler::CanUndo(XFA_HWIDGET hWidget) +{ + return ((CXFA_FFWidget*)hWidget)->CanUndo(); +} +FX_BOOL CXFA_FFMenuHandler::CanRedo(XFA_HWIDGET hWidget) +{ + return ((CXFA_FFWidget*)hWidget)->CanRedo(); +} +FX_BOOL CXFA_FFMenuHandler::Undo(XFA_HWIDGET hWidget) +{ + return ((CXFA_FFWidget*)hWidget)->Undo(); +} +FX_BOOL CXFA_FFMenuHandler::Redo(XFA_HWIDGET hWidget) +{ + return ((CXFA_FFWidget*)hWidget)->Redo(); +} +#define FX_EDIT_ISLATINWORD(u) (u == 0x2D || (u <= 0x005A && u >= 0x0041) || (u <= 0x007A && u >= 0x0061) || (u <= 0x02AF && u >= 0x00C0) || u == 0x0027) +FX_BOOL CXFA_FFMenuHandler::GetSuggestWords(XFA_HWIDGET hWidget, CFX_PointF pointf, CFX_ByteStringArray &sSuggest) +{ + return ((CXFA_FFWidget*)hWidget)->GetSuggestWords(pointf, sSuggest); +} +FX_BOOL CXFA_FFMenuHandler::ReplaceSpellCheckWord(XFA_HWIDGET hWidget, CFX_PointF pointf, FX_BSTR bsReplace) +{ + return ((CXFA_FFWidget*)hWidget)->ReplaceSpellCheckWord(pointf, bsReplace); +} diff --git a/xfa/src/fxfa/src/app/xfa_ffwidgethandler.h b/xfa/src/fxfa/src/app/xfa_ffwidgethandler.h new file mode 100644 index 0000000000..1d58790a02 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_ffwidgethandler.h @@ -0,0 +1,104 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FXFA_FORMFILLER_ANNOTHANDLER_IMP_H +#define _FXFA_FORMFILLER_ANNOTHANDLER_IMP_H +class CXFA_FFDocView; +class CXFA_FFWidgetHandler : public IXFA_WidgetHandler, public CFX_Object +{ +public: + CXFA_FFWidgetHandler(CXFA_FFDocView* pDocView); + ~CXFA_FFWidgetHandler(); + virtual XFA_HWIDGET CreateWidget(XFA_HWIDGET hParent, XFA_WIDGETTYPE eType, XFA_HWIDGET hBefore = NULL); + virtual IXFA_PageView* GetPageView(XFA_HWIDGET hWidget); + virtual void GetRect(XFA_HWIDGET hWidget, CFX_RectF &rt); + virtual FX_DWORD GetStatus(XFA_HWIDGET hWidget); + virtual FX_BOOL GetBBox(XFA_HWIDGET hWidget, CFX_RectF &rtBox, FX_DWORD dwStatus, FX_BOOL bDrawFocus = FALSE); + virtual CXFA_WidgetAcc* GetDataAcc(XFA_HWIDGET hWidget); + virtual void GetName(XFA_HWIDGET hWidget, CFX_WideString &wsName, FX_INT32 iNameType = 0); + virtual FX_BOOL GetToolTip(XFA_HWIDGET hWidget, CFX_WideString &wsToolTip); + virtual void SetPrivateData(XFA_HWIDGET hWidget, FX_LPVOID module_id, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback); + virtual FX_LPVOID GetPrivateData(XFA_HWIDGET hWidget, FX_LPVOID module_id); + virtual FX_BOOL OnMouseEnter(XFA_HWIDGET hWidget); + virtual FX_BOOL OnMouseExit(XFA_HWIDGET hWidget); + virtual FX_BOOL OnLButtonDown(XFA_HWIDGET hWidget, FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnLButtonUp(XFA_HWIDGET hWidget, FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnLButtonDblClk(XFA_HWIDGET hWidget, FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnMouseMove(XFA_HWIDGET hWidget, FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnMouseWheel(XFA_HWIDGET hWidget, FX_DWORD dwFlags, FX_SHORT zDelta, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnRButtonDown(XFA_HWIDGET hWidget, FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnRButtonUp(XFA_HWIDGET hWidget, FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnRButtonDblClk(XFA_HWIDGET hWidget, FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); + + virtual FX_BOOL OnKeyDown(XFA_HWIDGET hWidget, FX_DWORD dwKeyCode, FX_DWORD dwFlags); + virtual FX_BOOL OnKeyUp(XFA_HWIDGET hWidget, FX_DWORD dwKeyCode, FX_DWORD dwFlags); + virtual FX_BOOL OnChar(XFA_HWIDGET hWidget, FX_DWORD dwChar, FX_DWORD dwFlags); + virtual FX_DWORD OnHitTest(XFA_HWIDGET hWidget, FX_FLOAT fx, FX_FLOAT fy); + virtual FX_BOOL OnSetCursor(XFA_HWIDGET hWidget, FX_FLOAT fx, FX_FLOAT fy); + virtual void RenderWidget(XFA_HWIDGET hWidget, CFX_Graphics* pGS, CFX_Matrix* pMatrix = NULL, FX_BOOL bHighlight = FALSE); + virtual FX_BOOL HasEvent(CXFA_WidgetAcc* pWidgetAcc, XFA_EVENTTYPE eEventType); + virtual FX_INT32 ProcessEvent(CXFA_WidgetAcc* pWidgetAcc, CXFA_EventParam* pParam); +protected: + CXFA_Node* CreateWidgetFormItem(XFA_WIDGETTYPE eType, CXFA_Node* pParent, CXFA_Node* pBefore) const; + + CXFA_Node* CreatePushButton(CXFA_Node* pParent, CXFA_Node* pBefore) const; + CXFA_Node* CreateCheckButton(CXFA_Node* pParent, CXFA_Node* pBefore) const; + CXFA_Node* CreateExclGroup(CXFA_Node* pParent, CXFA_Node* pBefore) const; + CXFA_Node* CreateRadioButton(CXFA_Node* pParent, CXFA_Node* pBefore) const; + CXFA_Node* CreateDatetimeEdit(CXFA_Node* pParent, CXFA_Node* pBefore) const; + CXFA_Node* CreateDecimalField(CXFA_Node* pParent, CXFA_Node* pBefore) const; + CXFA_Node* CreateNumericField(CXFA_Node* pParent, CXFA_Node* pBefore) const; + CXFA_Node* CreateSignature(CXFA_Node* pParent, CXFA_Node* pBefore) const; + CXFA_Node* CreateTextEdit(CXFA_Node* pParent, CXFA_Node* pBefore) const; + CXFA_Node* CreateDropdownList(CXFA_Node* pParent, CXFA_Node* pBefore) const; + CXFA_Node* CreateListBox(CXFA_Node* pParent, CXFA_Node* pBefore) const; + CXFA_Node* CreateImageField(CXFA_Node* pParent, CXFA_Node* pBefore) const; + CXFA_Node* CreatePasswordEdit(CXFA_Node* pParent, CXFA_Node* pBefore) const; + CXFA_Node* CreateField(XFA_ELEMENT eElement, CXFA_Node* pParent, CXFA_Node* pBefore) const; + CXFA_Node* CreateArc(CXFA_Node* pParent, CXFA_Node* pBefore) const; + CXFA_Node* CreateRectangle(CXFA_Node* pParent, CXFA_Node* pBefore) const; + CXFA_Node* CreateImage(CXFA_Node* pParent, CXFA_Node* pBefore) const; + CXFA_Node* CreateLine(CXFA_Node* pParent, CXFA_Node* pBefore) const; + CXFA_Node* CreateText(CXFA_Node* pParent, CXFA_Node* pBefore) const; + CXFA_Node* CreateDraw(XFA_ELEMENT eElement, CXFA_Node* pParent, CXFA_Node* pBefore) const; + + CXFA_Node* CreateSubform(CXFA_Node* pParent, CXFA_Node* pBefore) const; + CXFA_Node* CreateFormItem(XFA_ELEMENT eElement, CXFA_Node* pParent, CXFA_Node* pBefore) const; + CXFA_Node* CreateCopyNode(XFA_ELEMENT eElement, CXFA_Node* pParent, CXFA_Node* pBefore = NULL) const; + CXFA_Node* CreateTemplateNode(XFA_ELEMENT eElement, CXFA_Node* pParent, CXFA_Node* pBefore) const; + CXFA_Node* CreateFontNode(CXFA_Node* pParent) const; + CXFA_Node* CreateMarginNode(CXFA_Node* pParent, FX_DWORD dwFlags, FX_FLOAT fInsets[4]) const; + CXFA_Node* CreateValueNode(XFA_ELEMENT eValue, CXFA_Node* pParent) const; + IXFA_ObjFactory* GetObjFactory() const; + CXFA_Document* GetXFADoc() const; + + CXFA_FFDocView* m_pDocView; +}; +class CXFA_FFMenuHandler : public IXFA_MenuHandler, public CFX_Object +{ +public: + CXFA_FFMenuHandler(); + ~CXFA_FFMenuHandler(); + virtual FX_BOOL CanCopy(XFA_HWIDGET hWidget); + virtual FX_BOOL CanCut(XFA_HWIDGET hWidget); + virtual FX_BOOL CanPaste(XFA_HWIDGET hWidget); + virtual FX_BOOL CanSelectAll(XFA_HWIDGET hWidget); + virtual FX_BOOL CanDelete(XFA_HWIDGET hWidget); + virtual FX_BOOL CanDeSelect(XFA_HWIDGET hWidget); + virtual FX_BOOL Copy(XFA_HWIDGET hWidget, CFX_WideString &wsText); + virtual FX_BOOL Cut(XFA_HWIDGET hWidget, CFX_WideString &wsText); + virtual FX_BOOL Paste(XFA_HWIDGET hWidget, const CFX_WideString &wsText); + virtual FX_BOOL SelectAll(XFA_HWIDGET hWidget); + virtual FX_BOOL Delete(XFA_HWIDGET hWidget); + virtual FX_BOOL DeSelect(XFA_HWIDGET hWidget); + virtual FX_BOOL CanUndo(XFA_HWIDGET hWidget); + virtual FX_BOOL CanRedo(XFA_HWIDGET hWidget); + virtual FX_BOOL Undo(XFA_HWIDGET hWidget); + virtual FX_BOOL Redo(XFA_HWIDGET hWidget); + virtual FX_BOOL GetSuggestWords(XFA_HWIDGET hWidget, CFX_PointF pointf, CFX_ByteStringArray &sSuggest); + virtual FX_BOOL ReplaceSpellCheckWord(XFA_HWIDGET hWidget, CFX_PointF pointf, FX_BSTR bsReplace); +}; +#endif diff --git a/xfa/src/fxfa/src/app/xfa_fontmgr.cpp b/xfa/src/fxfa/src/app/xfa_fontmgr.cpp new file mode 100644 index 0000000000..f3e4fff810 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_fontmgr.cpp @@ -0,0 +1,1379 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_common.h" +#include "xfa_fontmgr.h" +#include "xfa_ffdoc.h" +#include "xfa_ffConfigAcc.h" +#include "xfa_ffapp.h" +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ +static const XFA_FONTINFO g_XFAFontsMap[] = { + {0x01d5d33e, (FX_LPCWSTR)L"SimSun", (FX_LPCWSTR)L"Arial", 0, 936}, + {0x01e4f102, (FX_LPCWSTR)L"YouYuan", (FX_LPCWSTR)L"Arial", 1, 936}, + {0x030549dc, (FX_LPCWSTR)L"LiSu", (FX_LPCWSTR)L"Arial", 1, 936}, + {0x032edd44, (FX_LPCWSTR)L"Simhei", (FX_LPCWSTR)L"Arial", 1, 936}, + {0x03eac6fc, (FX_LPCWSTR)L"PoorRichard-Regular", (FX_LPCWSTR)L"Arial", 2, 1252}, + {0x03ed90e6, (FX_LPCWSTR)L"Nina", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x077b56b3, (FX_LPCWSTR)L"KingsoftPhoneticPlain", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x078ed524, (FX_LPCWSTR)L"MicrosoftSansSerif", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x089b18a9, (FX_LPCWSTR)L"Arial", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x0b2cad72, (FX_LPCWSTR)L"MonotypeCorsiva", (FX_LPCWSTR)L"Arial", 8, 1252}, + {0x0bb003e7, (FX_LPCWSTR)L"Kartika", (FX_LPCWSTR)L"Arial", 2, 1252}, + {0x0bb469df, (FX_LPCWSTR)L"VinerHandITC", (FX_LPCWSTR)L"Arial", 8, 1252}, + {0x0bc1a851, (FX_LPCWSTR)L"SegoeUI", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x0c112ebd, (FX_LPCWSTR)L"KozukaGothicPro-VIM", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x0cfcb9c1, (FX_LPCWSTR)L"AdobeThai", (FX_LPCWSTR)L"Kokila,Arial Narrow", 0, 847}, + {0x0e7de0f9, (FX_LPCWSTR)L"Playbill", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x0eff47c3, (FX_LPCWSTR)L"STHupo", (FX_LPCWSTR)L"Arial", 0, 936}, + {0x107ad374, (FX_LPCWSTR)L"Constantia", (FX_LPCWSTR)L"Arial", 2, 1252}, + {0x12194c2d, (FX_LPCWSTR)L"KunstlerScript", (FX_LPCWSTR)L"Arial", 8, 1252}, + {0x135ef6a1, (FX_LPCWSTR)L"MinionProSmBd", (FX_LPCWSTR)L"Bell MT,Corbel,Times New Roman,Cambria,Berlin Sans FB", 0, 1252}, + {0x158c4049, (FX_LPCWSTR)L"Garamond", (FX_LPCWSTR)L"Arial", 2, 1252}, + {0x160ecb24, (FX_LPCWSTR)L"STZhongsong", (FX_LPCWSTR)L"Arial", 0, 936}, + {0x161ed07e, (FX_LPCWSTR)L"MSGothic", (FX_LPCWSTR)L"Arial", 1, 1252}, + {0x171d1ed1, (FX_LPCWSTR)L"SnapITC-Regular", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x18d1188f, (FX_LPCWSTR)L"Cambria", (FX_LPCWSTR)L"Arial", 2, 1252}, + {0x18eaf350, (FX_LPCWSTR)L"ArialUnicodeMS", (FX_LPCWSTR)L"Arial", 0, 936}, + {0x1a92d115, (FX_LPCWSTR)L"MingLiU", (FX_LPCWSTR)L"Arial", 1, 1252}, + {0x1cc217c6, (FX_LPCWSTR)L"TrebuchetMS", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x1d649596, (FX_LPCWSTR)L"BasemicTimes", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x1e34ee60, (FX_LPCWSTR)L"BellMT", (FX_LPCWSTR)L"Arial", 2, 1252}, + {0x1eb36945, (FX_LPCWSTR)L"CooperBlack", (FX_LPCWSTR)L"Arial", 2, 1252}, + {0x1ef7787d, (FX_LPCWSTR)L"BatangChe", (FX_LPCWSTR)L"Arial", 1, 1252}, + {0x20b3bd3a, (FX_LPCWSTR)L"BrushScriptMT", (FX_LPCWSTR)L"Arial", 8, 1252}, + {0x220877aa, (FX_LPCWSTR)L"Candara", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x22135007, (FX_LPCWSTR)L"FreestyleScript-Regular", (FX_LPCWSTR)L"Arial", 8, 1252}, + {0x251059c3, (FX_LPCWSTR)L"Chiller", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x25bed6dd, (FX_LPCWSTR)L"MSReferenceSansSerif", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x28154c81, (FX_LPCWSTR)L"Parchment-Regular", (FX_LPCWSTR)L"Arial", 8, 1252}, + {0x29711eb9, (FX_LPCWSTR)L"STLiti", (FX_LPCWSTR)L"Arial", 0, 936}, + {0x2b1993b4, (FX_LPCWSTR)L"Basemic", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x2b316339, (FX_LPCWSTR)L"NiagaraSolid-Reg", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x2c147529, (FX_LPCWSTR)L"FootlightMTLight", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x2c198928, (FX_LPCWSTR)L"HarlowSolid", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x2c6ac6b2, (FX_LPCWSTR)L"LucidaBright", (FX_LPCWSTR)L"Arial", 2, 1252}, + {0x2c9f38e2, (FX_LPCWSTR)L"KozukaMinchoPro-VIR", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x2d5a47b0, (FX_LPCWSTR)L"STCaiyun", (FX_LPCWSTR)L"Arial", 0, 936}, + {0x2def26bf, (FX_LPCWSTR)L"BernardMT-Condensed", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x2fd8930b, (FX_LPCWSTR)L"KozukaMinchoPr6NR", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x3115525a, (FX_LPCWSTR)L"FangSong_GB2312", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x31327817, (FX_LPCWSTR)L"MyriadPro", (FX_LPCWSTR)L"Calibri,Corbel,Candara,Cambria Math,Franklin Gothic Medium,Arial Narrow,Times New Roman", 0, 1252}, + {0x32244975, (FX_LPCWSTR)L"Helvetica", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x32ac995c, (FX_LPCWSTR)L"Terminal", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x338d648a, (FX_LPCWSTR)L"NiagaraEngraved-Reg", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x33bb65f2, (FX_LPCWSTR)L"Sylfaen", (FX_LPCWSTR)L"Arial", 2, 1252}, + {0x3402c30e, (FX_LPCWSTR)L"MSPMincho", (FX_LPCWSTR)L"Arial", 2, 1252}, + {0x3412bf31, (FX_LPCWSTR)L"SimSun-PUA", (FX_LPCWSTR)L"Arial", 0, 936}, + {0x36eb39b9, (FX_LPCWSTR)L"BerlinSansFB", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x36f42055, (FX_LPCWSTR)L"UniversATT", (FX_LPCWSTR)L"Microsoft Sans Serif", 0, 1252}, + {0x3864c4f6, (FX_LPCWSTR)L"HighTowerText", (FX_LPCWSTR)L"Arial", 2, 1252}, + {0x3a257d03, (FX_LPCWSTR)L"FangSong_GB2312", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x3cdae668, (FX_LPCWSTR)L"FreestyleScript", (FX_LPCWSTR)L"Arial", 8, 1252}, + {0x3d55aed7, (FX_LPCWSTR)L"Jokerman", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x3d5b4385, (FX_LPCWSTR)L"PMingLiU", (FX_LPCWSTR)L"Arial", 2, 1252}, + {0x3d9b7669, (FX_LPCWSTR)L"EstrangeloEdessa", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x3e532d74, (FX_LPCWSTR)L"FranklinGothicMedium", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x3e6aa32d, (FX_LPCWSTR)L"NSimSun", (FX_LPCWSTR)L"Arial", 1, 936}, + {0x3f6c36a8, (FX_LPCWSTR)L"Gautami", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x3ff32662, (FX_LPCWSTR)L"Chiller-Regular", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x409de312, (FX_LPCWSTR)L"ModernNo.20", (FX_LPCWSTR)L"Arial", 2, 1252}, + {0x41443c5e, (FX_LPCWSTR)L"Georgia", (FX_LPCWSTR)L"Arial", 2, 1252}, + {0x4160ade5, (FX_LPCWSTR)L"BellGothicStdBlack", (FX_LPCWSTR)L"Arial,Arial Unicode MS,Book Antiqua,Dotum,Georgia", 0, 1252}, + {0x421976c4, (FX_LPCWSTR)L"Modern-Regular", (FX_LPCWSTR)L"Arial", 2, 1252}, + {0x422a7252, (FX_LPCWSTR)L"Stencil", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x42c8554f, (FX_LPCWSTR)L"Fixedsys", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x435cb41d, (FX_LPCWSTR)L"Roman", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x47882383, (FX_LPCWSTR)L"CourierNew", (FX_LPCWSTR)L"Arial", 1, 1252}, + {0x480a2338, (FX_LPCWSTR)L"BerlinSansFBDemi", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x480bf7a4, (FX_LPCWSTR)L"CourierStd", (FX_LPCWSTR)L"Courier New,Verdana", 0, 1252}, + {0x481ad6ed, (FX_LPCWSTR)L"VladimirScript", (FX_LPCWSTR)L"Arial", 8, 1252}, + {0x4911577a, (FX_LPCWSTR)L"YouYuan", (FX_LPCWSTR)L"Arial", 1, 936}, + {0x4a788d72, (FX_LPCWSTR)L"STXingkai", (FX_LPCWSTR)L"Arial", 0, 936}, + {0x4bf88566, (FX_LPCWSTR)L"SegoeCondensed", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x4ccf51a4, (FX_LPCWSTR)L"BerlinSansFB-Reg", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x4ea967ce, (FX_LPCWSTR)L"GulimChe", (FX_LPCWSTR)L"Arial", 1, 1252}, + {0x4f68bd79, (FX_LPCWSTR)L"LetterGothicStd", (FX_LPCWSTR)L"Courier New,Verdana", 0, 1252}, + {0x51a0d0e6, (FX_LPCWSTR)L"KozukaGothicPr6NM", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x531b3dea, (FX_LPCWSTR)L"BasemicSymbol", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x5333fd39, (FX_LPCWSTR)L"CalifornianFB-Reg", (FX_LPCWSTR)L"Arial", 2, 1252}, + {0x53561a54, (FX_LPCWSTR)L"FZYTK--GBK1-0", (FX_LPCWSTR)L"Arial", 0, 936}, + {0x55e0dde6, (FX_LPCWSTR)L"LucidaSansTypewriter", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x574d4d3d, (FX_LPCWSTR)L"AdobeArabic", (FX_LPCWSTR)L"Arial Narrow", 0, 1252}, + {0x5792e759, (FX_LPCWSTR)L"STKaiti", (FX_LPCWSTR)L"Arial", 0, 936}, + {0x5921978e, (FX_LPCWSTR)L"LucidaSansUnicode", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x594e2da4, (FX_LPCWSTR)L"Vrinda", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x59baa9a2, (FX_LPCWSTR)L"KaiTi_GB2312", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x5cfedf4f, (FX_LPCWSTR)L"BaskOldFace", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x5f97921c, (FX_LPCWSTR)L"AdobeMyungjoStdM", (FX_LPCWSTR)L"Batang,Bookman Old Style,Consolas,STZhongsong", 0, 936}, + {0x5fefbfad, (FX_LPCWSTR)L"Batang", (FX_LPCWSTR)L"Arial", 2, 1252}, + {0x605342b9, (FX_LPCWSTR)L"DotumChe", (FX_LPCWSTR)L"Arial", 1, 1252}, + {0x608c5f9a, (FX_LPCWSTR)L"KaiTi_GB2312", (FX_LPCWSTR)L"Arial", 0, 936}, + {0x61efd0d1, (FX_LPCWSTR)L"MaturaMTScriptCapitals", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x626608a9, (FX_LPCWSTR)L"MVBoli", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x630501a3, (FX_LPCWSTR)L"SmallFonts", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x65d0e2a9, (FX_LPCWSTR)L"FZYTK--GBK1-0", (FX_LPCWSTR)L"Arial", 0, 936}, + {0x669f29e1, (FX_LPCWSTR)L"FZSTK--GBK1-0", (FX_LPCWSTR)L"Arial", 0, 936}, + {0x673a9e5f, (FX_LPCWSTR)L"Tunga", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x691aa4ce, (FX_LPCWSTR)L"NiagaraSolid", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x696259b7, (FX_LPCWSTR)L"Corbel", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x696ee9be, (FX_LPCWSTR)L"STXihei", (FX_LPCWSTR)L"Arial", 0, 936}, + {0x6c59cf69, (FX_LPCWSTR)L"Dotum", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x707fa561, (FX_LPCWSTR)L"Gungsuh", (FX_LPCWSTR)L"Arial", 2, 1252}, + {0x71416bb2, (FX_LPCWSTR)L"ZWAdobeF", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x71b41801, (FX_LPCWSTR)L"Verdana", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x73f25e4c, (FX_LPCWSTR)L"PalatinoLinotype", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x73f4d19f, (FX_LPCWSTR)L"NiagaraEngraved", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x74001694, (FX_LPCWSTR)L"MyriadProBlack", (FX_LPCWSTR)L"Book Antiqua,Constantia,Dotum,Georgia", 0, 1252}, + {0x74b14d8f, (FX_LPCWSTR)L"Haettenschweiler", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x74cb44ee, (FX_LPCWSTR)L"NSimSun", (FX_LPCWSTR)L"Arial", 1, 936}, + {0x76b4d7ff, (FX_LPCWSTR)L"Shruti", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x788b3533, (FX_LPCWSTR)L"Webdings", (FX_LPCWSTR)L"Arial", 6, 42}, + {0x797dde99, (FX_LPCWSTR)L"MSSerif", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x7a0f9e9e, (FX_LPCWSTR)L"MSMincho", (FX_LPCWSTR)L"Arial", 1, 1252}, + {0x7b439caf, (FX_LPCWSTR)L"OldEnglishTextMT", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x8213a433, (FX_LPCWSTR)L"LucidaSans-Typewriter", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x82fec929, (FX_LPCWSTR)L"AdobeSongStdL", (FX_LPCWSTR)L"Centaur,Calibri,STSong,Bell MT,Garamond,Times New Roman", 0, 936}, + {0x83581825, (FX_LPCWSTR)L"Modern", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x835a2823, (FX_LPCWSTR)L"Algerian", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x83dab9f5, (FX_LPCWSTR)L"Script", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x847b56da, (FX_LPCWSTR)L"Tahoma", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x8a783cb2, (FX_LPCWSTR)L"SimSun-PUA", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x8b5cac0e, (FX_LPCWSTR)L"Onyx", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x8c6a499e, (FX_LPCWSTR)L"Gulim", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x8e0af790, (FX_LPCWSTR)L"JuiceITC", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x8e8d43b2, (FX_LPCWSTR)L"Centaur", (FX_LPCWSTR)L"Arial", 2, 1252}, + {0x8ee4dcca, (FX_LPCWSTR)L"BookshelfSymbol7", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x90794800, (FX_LPCWSTR)L"BellGothicStdLight", (FX_LPCWSTR)L"Bell MT,Calibri,Times New Roman", 0, 1252}, + {0x909b516a, (FX_LPCWSTR)L"Century", (FX_LPCWSTR)L"Arial", 2, 1252}, + {0x92ae370d, (FX_LPCWSTR)L"MSOutlook", (FX_LPCWSTR)L"Arial", 4, 42}, + {0x93c9fbf1, (FX_LPCWSTR)L"LucidaFax", (FX_LPCWSTR)L"Arial", 2, 1252}, + {0x9565085e, (FX_LPCWSTR)L"BookAntiqua", (FX_LPCWSTR)L"Arial", 2, 1252}, + {0x9856d95d, (FX_LPCWSTR)L"AdobeMingStdL", (FX_LPCWSTR)L"Arial,Arial Unicode MS,Cambria,BatangChe", 0, 949}, + {0x9bbadd6b, (FX_LPCWSTR)L"ColonnaMT", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x9cbd16a4, (FX_LPCWSTR)L"ShowcardGothic-Reg", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0x9d73008e, (FX_LPCWSTR)L"MSSansSerif", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xa0607db1, (FX_LPCWSTR)L"GungsuhChe", (FX_LPCWSTR)L"Arial", 1, 1252}, + {0xa0bcf6a1, (FX_LPCWSTR)L"LatinWide", (FX_LPCWSTR)L"Arial", 2, 1252}, + {0xa1429b36, (FX_LPCWSTR)L"Symbol", (FX_LPCWSTR)L"Arial", 6, 42}, + {0xa1fa5abc, (FX_LPCWSTR)L"Wingdings2", (FX_LPCWSTR)L"Arial", 6, 42}, + {0xa1fa5abd, (FX_LPCWSTR)L"Wingdings3", (FX_LPCWSTR)L"Arial", 6, 42}, + {0xa427bad4, (FX_LPCWSTR)L"InformalRoman-Regular", (FX_LPCWSTR)L"Arial", 8, 1252}, + {0xa8b92ece, (FX_LPCWSTR)L"FZSTK--GBK1-0", (FX_LPCWSTR)L"Arial", 0, 936}, + {0xa8d83ece, (FX_LPCWSTR)L"CalifornianFB", (FX_LPCWSTR)L"Arial", 2, 1252}, + {0xaa3e082c, (FX_LPCWSTR)L"Kingsoft-Phonetic", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xaa6bcabe, (FX_LPCWSTR)L"HarlowSolidItalic", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xade5337c, (FX_LPCWSTR)L"MSUIGothic", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xb08dd941, (FX_LPCWSTR)L"WideLatin", (FX_LPCWSTR)L"Arial", 2, 1252}, + {0xb207f05d, (FX_LPCWSTR)L"PoorRichard", (FX_LPCWSTR)L"Arial", 2, 1252}, + {0xb3bc492f, (FX_LPCWSTR)L"JuiceITC-Regular", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xb5545399, (FX_LPCWSTR)L"Marlett", (FX_LPCWSTR)L"Arial", 4, 42}, + {0xb5dd1ebb, (FX_LPCWSTR)L"BritannicBold", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xb699c1c5, (FX_LPCWSTR)L"LucidaCalligraphy-Italic", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xb725d629, (FX_LPCWSTR)L"TimesNewRoman", (FX_LPCWSTR)L"Arial", 2, 1252}, + {0xb7eaebeb, (FX_LPCWSTR)L"AdobeHeitiStdR", (FX_LPCWSTR)L"Batang,Century,Dotum", 0, 936}, + {0xbd29c486, (FX_LPCWSTR)L"BerlinSansFBDemi-Bold", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xbe8a8db4, (FX_LPCWSTR)L"BookshelfSymbolSeven", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xc16c0118, (FX_LPCWSTR)L"AdobeHebrew", (FX_LPCWSTR)L"Bell MT,Berlin Sans FB,Calibri", 0, 1252}, + {0xc318b0af, (FX_LPCWSTR)L"MyriadProLight", (FX_LPCWSTR)L"Calibri,STFangsong,Times New Roman", 0, 1252}, + {0xc65e5659, (FX_LPCWSTR)L"CambriaMath", (FX_LPCWSTR)L"Arial", 2, 1252}, + {0xc75c8f05, (FX_LPCWSTR)L"LucidaConsole", (FX_LPCWSTR)L"Arial", 1, 1252}, + {0xca7c35d6, (FX_LPCWSTR)L"Calibri", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xcb053f53, (FX_LPCWSTR)L"MicrosoftYaHei", (FX_LPCWSTR)L"Arial", 0, 936}, + {0xcb7190f9, (FX_LPCWSTR)L"Magneto-Bold", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xcca00cc5, (FX_LPCWSTR)L"System", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xccad6f76, (FX_LPCWSTR)L"Jokerman-Regular", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xccc5818c, (FX_LPCWSTR)L"EuroSign", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xcf3d7234, (FX_LPCWSTR)L"LucidaHandwriting-Italic", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xcf7b8fdb, (FX_LPCWSTR)L"MinionPro", (FX_LPCWSTR)L"Bell MT,Corbel,Times New Roman,Cambria,Berlin Sans FB", 0, 1252}, + {0xcfe5755f, (FX_LPCWSTR)L"Simhei", (FX_LPCWSTR)L"Arial", 1, 936}, + {0xd011f4ee, (FX_LPCWSTR)L"MSPGothic", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xd060e7ef, (FX_LPCWSTR)L"Vivaldi", (FX_LPCWSTR)L"Arial", 8, 1252}, + {0xd07edec1, (FX_LPCWSTR)L"FranklinGothic-Medium", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xd107243f, (FX_LPCWSTR)L"SimSun", (FX_LPCWSTR)L"Arial", 0, 936}, + {0xd1881562, (FX_LPCWSTR)L"ArialNarrow", (FX_LPCWSTR)L"Arial Narrow", 0, 1252}, + {0xd22b7dce, (FX_LPCWSTR)L"BodoniMTPosterCompressed", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xd22bfa60, (FX_LPCWSTR)L"ComicSansMS", (FX_LPCWSTR)L"Arial", 8, 1252}, + {0xd3bd0e35, (FX_LPCWSTR)L"Bauhaus93", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xd429ee7a, (FX_LPCWSTR)L"STFangsong", (FX_LPCWSTR)L"Arial", 0, 936}, + {0xd6679c12, (FX_LPCWSTR)L"BernardMTCondensed", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xd8e8a027, (FX_LPCWSTR)L"LucidaSans", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xd9fe7761, (FX_LPCWSTR)L"HighTowerText-Reg", (FX_LPCWSTR)L"Arial", 2, 1252}, + {0xda7e551e, (FX_LPCWSTR)L"STSong", (FX_LPCWSTR)L"Arial", 0, 936}, + {0xdaa6842d, (FX_LPCWSTR)L"STZhongsong", (FX_LPCWSTR)L"Arial", 0, 936}, + {0xdaaab93f, (FX_LPCWSTR)L"STFangsong", (FX_LPCWSTR)L"Arial", 0, 936}, + {0xdaeb0713, (FX_LPCWSTR)L"STSong", (FX_LPCWSTR)L"Arial", 0, 936}, + {0xdafedbef, (FX_LPCWSTR)L"STCaiyun", (FX_LPCWSTR)L"Arial", 0, 936}, + {0xdb00a3d9, (FX_LPCWSTR)L"Broadway", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xdb1f5ad4, (FX_LPCWSTR)L"STXinwei", (FX_LPCWSTR)L"Arial", 0, 936}, + {0xdb326e7f, (FX_LPCWSTR)L"STKaiti", (FX_LPCWSTR)L"Arial", 0, 936}, + {0xdb69595a, (FX_LPCWSTR)L"STHupo", (FX_LPCWSTR)L"Arial", 0, 936}, + {0xdba0082c, (FX_LPCWSTR)L"STXihei", (FX_LPCWSTR)L"Arial", 0, 936}, + {0xdbd0ab18, (FX_LPCWSTR)L"STXingkai", (FX_LPCWSTR)L"Arial", 0, 936}, + {0xdc1a7db1, (FX_LPCWSTR)L"STLiti", (FX_LPCWSTR)L"Arial", 0, 936}, + {0xdc33075f, (FX_LPCWSTR)L"KristenITC-Regular", (FX_LPCWSTR)L"Arial", 8, 1252}, + {0xdcc7009c, (FX_LPCWSTR)L"Harrington", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xdd712466, (FX_LPCWSTR)L"ArialBlack", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xdde87b3e, (FX_LPCWSTR)L"Impact", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xdf69fb32, (FX_LPCWSTR)L"SnapITC", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xdf8b25e8, (FX_LPCWSTR)L"CenturyGothic", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xe0f705c0, (FX_LPCWSTR)L"KristenITC", (FX_LPCWSTR)L"Arial", 8, 1252}, + {0xe1427573, (FX_LPCWSTR)L"Raavi", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xe2cea0cb, (FX_LPCWSTR)L"Magneto", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xe36a9e17, (FX_LPCWSTR)L"Ravie", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xe433f8e2, (FX_LPCWSTR)L"Parchment", (FX_LPCWSTR)L"Arial", 8, 1252}, + {0xe43dff4a, (FX_LPCWSTR)L"Wingdings", (FX_LPCWSTR)L"Arial", 4, 42}, + {0xe4e2c405, (FX_LPCWSTR)L"MTExtra", (FX_LPCWSTR)L"Arial", 6, 42}, + {0xe618cc35, (FX_LPCWSTR)L"InformalRoman", (FX_LPCWSTR)L"Arial", 8, 1252}, + {0xe6c27ffc, (FX_LPCWSTR)L"Mistral", (FX_LPCWSTR)L"Arial", 8, 1252}, + {0xe7ebf4b9, (FX_LPCWSTR)L"Courier", (FX_LPCWSTR)L"Courier New", 0, 1252}, + {0xe8bc4a9d, (FX_LPCWSTR)L"MSReferenceSpecialty", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xe90fb013, (FX_LPCWSTR)L"TempusSansITC", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xec637b42, (FX_LPCWSTR)L"Consolas", (FX_LPCWSTR)L"Verdana", 1, 1252}, + {0xed3a683b, (FX_LPCWSTR)L"STXinwei", (FX_LPCWSTR)L"Arial", 0, 936}, + {0xef264cd1, (FX_LPCWSTR)L"LucidaHandwriting", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xf086bca2, (FX_LPCWSTR)L"BaskervilleOldFace", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xf1028030, (FX_LPCWSTR)L"Mangal", (FX_LPCWSTR)L"Arial", 2, 1252}, + {0xf1da7eb9, (FX_LPCWSTR)L"ShowcardGothic", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xf210f06a, (FX_LPCWSTR)L"ArialMT", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xf477f16a, (FX_LPCWSTR)L"Latha", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xf616f3dd, (FX_LPCWSTR)L"LiSu", (FX_LPCWSTR)L"Arial", 1, 936}, + {0xfa479aa6, (FX_LPCWSTR)L"MicrosoftYaHei", (FX_LPCWSTR)L"Arial", 0, 936}, + {0xfcd19697, (FX_LPCWSTR)L"BookmanOldStyle", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xfe209a82, (FX_LPCWSTR)L"LucidaCalligraphy", (FX_LPCWSTR)L"Arial", 0, 1252}, + {0xfef135f8, (FX_LPCWSTR)L"AdobeHeitiStd-Regular", (FX_LPCWSTR)L"Batang,Century,Dotum", 0, 936}, +}; +#elif _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ +static const XFA_FONTINFO g_XFAFontsMap[] = { + {0x01d5d33e, (FX_LPCWSTR)L"SimSun", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW,AR PL UMing TW MBE,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 0, 936}, + {0x01e4f102, (FX_LPCWSTR)L"YouYuan", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW,AR PL UMing TW MBE,WenQuanYi Zen Hei Sharp,WenQuanYi Zen Hei,WenQuanYi Micro Hei", 1, 936}, + {0x030549dc, (FX_LPCWSTR)L"LiSu", (FX_LPCWSTR)L"WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Zen Hei Mono,WenQuanYi Micro Hei", 1, 936}, + {0x032edd44, (FX_LPCWSTR)L"Simhei", (FX_LPCWSTR)L"WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Zen Hei Mono,WenQuanYi Micro Hei", 1, 936}, + {0x03eac6fc, (FX_LPCWSTR)L"PoorRichard-Regular", (FX_LPCWSTR)L"FreeSerif", 2, 1252}, + {0x03ed90e6, (FX_LPCWSTR)L"Nina", (FX_LPCWSTR)L"FreeSerif", 0, 1252}, + {0x077b56b3, (FX_LPCWSTR)L"KingsoftPhoneticPlain", (FX_LPCWSTR)L"utkal,Kedage,Mallige,Kedage,AR PL UKai CN,AR PL UKai HK", 0, 1252}, + {0x078ed524, (FX_LPCWSTR)L"MicrosoftSansSerif", (FX_LPCWSTR)L"FreeSerif,WenQuanYi Micro Hei", 0, 1252}, + {0x089b18a9, (FX_LPCWSTR)L"Arial", (FX_LPCWSTR)L"DejaVu Sans Condensed,FreeSerif,WenQuanYi Micro Hei", 0, 1252}, + {0x0b2cad72, (FX_LPCWSTR)L"MonotypeCorsiva", (FX_LPCWSTR)L"FreeSerif", 8, 1252}, + {0x0bb003e7, (FX_LPCWSTR)L"Kartika", (FX_LPCWSTR)L"FreeSans,Liberation Sans,Nimbus Sans L,Garuda,FreeSerif,WenQuanYi Micro Hei", 2, 1252}, + {0x0bb469df, (FX_LPCWSTR)L"VinerHandITC", (FX_LPCWSTR)L"Ubuntu,Liberation Sans,Liberation Serif", 8, 1252}, + {0x0bc1a851, (FX_LPCWSTR)L"SegoeUI", (FX_LPCWSTR)L"DejaVu Sans", 0, 1252}, + {0x0c112ebd, (FX_LPCWSTR)L"KozukaGothicPro-VIM", (FX_LPCWSTR)L"FreeSerif", 0, 1252}, + {0x0cfcb9c1, (FX_LPCWSTR)L"AdobeThai", (FX_LPCWSTR)L" Waree", 0, 847}, + {0x0e7de0f9, (FX_LPCWSTR)L"Playbill", (FX_LPCWSTR)L"FreeSerif", 0, 1252}, + {0x0eff47c3, (FX_LPCWSTR)L"STHupo", (FX_LPCWSTR)L"AR PL UKai HK,AR PL UMing HK,AR PL UKai CN", 0, 936}, + {0x107ad374, (FX_LPCWSTR)L"Constantia", (FX_LPCWSTR)L"FreeSerif,WenQuanYi Micro Hei,Ubuntu", 2, 1252}, + {0x12194c2d, (FX_LPCWSTR)L"KunstlerScript", (FX_LPCWSTR)L"Liberation Serif", 8, 1252}, + {0x135ef6a1, (FX_LPCWSTR)L"MinionProSmBd", (FX_LPCWSTR)L"Liberation Serif", 0, 1252}, + {0x158c4049, (FX_LPCWSTR)L"Garamond", (FX_LPCWSTR)L"Liberation Serif,Ubuntu,FreeSerif", 2, 1252}, + {0x160ecb24, (FX_LPCWSTR)L"STZhongsong", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 0, 936}, + {0x161ed07e, (FX_LPCWSTR)L"MSGothic", (FX_LPCWSTR)L"WenQuanYi Micro Hei Mono,WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp", 1, 1252}, + {0x171d1ed1, (FX_LPCWSTR)L"SnapITC-Regular", (FX_LPCWSTR)L"Nimbus Sans L,DejaVu Sans", 0, 1252}, + {0x18d1188f, (FX_LPCWSTR)L"Cambria", (FX_LPCWSTR)L"FreeSerif,FreeMono", 2, 1252}, + {0x18eaf350, (FX_LPCWSTR)L"ArialUnicodeMS", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 0, 936}, + {0x1a92d115, (FX_LPCWSTR)L"MingLiU", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 1, 1252}, + {0x1cc217c6, (FX_LPCWSTR)L"TrebuchetMS", (FX_LPCWSTR)L"Liberation Serif,FreeSerif,Ubuntu", 0, 1252}, + {0x1d649596, (FX_LPCWSTR)L"BasemicTimes", (FX_LPCWSTR)L"Liberation Serif,FreeSerif,Ubuntu", 0, 1252}, + {0x1e34ee60, (FX_LPCWSTR)L"BellMT", (FX_LPCWSTR)L"Ubuntu,Liberation Serif", 2, 1252}, + {0x1eb36945, (FX_LPCWSTR)L"CooperBlack", (FX_LPCWSTR)L"FreeMono,Liberation Mono, WenQuanYi Micro Hei Mono", 2, 1252}, + {0x1ef7787d, (FX_LPCWSTR)L"BatangChe", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 1, 1252}, + {0x20b3bd3a, (FX_LPCWSTR)L"BrushScriptMT", (FX_LPCWSTR)L"URW Chancery L,Liberation Sans", 8, 1252}, + {0x220877aa, (FX_LPCWSTR)L"Candara", (FX_LPCWSTR)L"DejaVu Sans", 0, 1252}, + {0x22135007, (FX_LPCWSTR)L"FreestyleScript-Regular", (FX_LPCWSTR)L"Liberation Sans", 8, 1252}, + {0x251059c3, (FX_LPCWSTR)L"Chiller", (FX_LPCWSTR)L"Liberation Sans", 0, 1252}, + {0x25bed6dd, (FX_LPCWSTR)L"MSReferenceSansSerif", (FX_LPCWSTR)L"DejaVu Sans Condensed,AR PL UKai HK", 0, 1252}, + {0x28154c81, (FX_LPCWSTR)L"Parchment-Regular", (FX_LPCWSTR)L"Liberation Sans", 8, 1252}, + {0x29711eb9, (FX_LPCWSTR)L"STLiti", (FX_LPCWSTR)L"AR PL UKai HK", 0, 936}, + {0x2b1993b4, (FX_LPCWSTR)L"Basemic", (FX_LPCWSTR)L"Liberation Sans", 0, 1252}, + {0x2b316339, (FX_LPCWSTR)L"NiagaraSolid-Reg", (FX_LPCWSTR)L"Liberation Sans", 0, 1252}, + {0x2c147529, (FX_LPCWSTR)L"FootlightMTLight", (FX_LPCWSTR)L"Liberation Sans", 0, 1252}, + {0x2c198928, (FX_LPCWSTR)L"HarlowSolid", (FX_LPCWSTR)L"Liberation Sans", 0, 1252}, + {0x2c6ac6b2, (FX_LPCWSTR)L"LucidaBright", (FX_LPCWSTR)L"Liberation Sans", 2, 1252}, + {0x2c9f38e2, (FX_LPCWSTR)L"KozukaMinchoPro-VIR", (FX_LPCWSTR)L"DejaVu Sans", 0, 1252}, + {0x2d5a47b0, (FX_LPCWSTR)L"STCaiyun", (FX_LPCWSTR)L"AR PL UKai HK", 0, 936}, + {0x2def26bf, (FX_LPCWSTR)L"BernardMT-Condensed", (FX_LPCWSTR)L"DejaVu Serif", 0, 1252}, + {0x2fd8930b, (FX_LPCWSTR)L"KozukaMinchoPr6NR", (FX_LPCWSTR)L"DejaVu Serif", 0, 1252}, + {0x3115525a, (FX_LPCWSTR)L"FangSong_GB2312", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 0, 1252}, + {0x31327817, (FX_LPCWSTR)L"MyriadPro", (FX_LPCWSTR)L"FreeSerif", 0, 1252}, + {0x32244975, (FX_LPCWSTR)L"Helvetica", (FX_LPCWSTR)L"Ubuntu,DejaVu Sans Condensed,Liberation Sans", 0, 1252}, + {0x32ac995c, (FX_LPCWSTR)L"Terminal", (FX_LPCWSTR)L"DejaVu Serif", 0, 1252}, + {0x338d648a, (FX_LPCWSTR)L"NiagaraEngraved-Reg", (FX_LPCWSTR)L"DejaVu Serif", 0, 1252}, + {0x33bb65f2, (FX_LPCWSTR)L"Sylfaen", (FX_LPCWSTR)L"DejaVu Sans", 2, 1252}, + {0x3402c30e, (FX_LPCWSTR)L"MSPMincho", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 2, 1252}, + {0x3412bf31, (FX_LPCWSTR)L"SimSun-PUA", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 0, 936}, + {0x36eb39b9, (FX_LPCWSTR)L"BerlinSansFB", (FX_LPCWSTR)L"Liberation Serif,Ubuntu,FreeSerif", 0, 1252}, + {0x36f42055, (FX_LPCWSTR)L"UniversATT", (FX_LPCWSTR)L"Microsoft Sans Serif", 0, 1252}, + {0x3864c4f6, (FX_LPCWSTR)L"HighTowerText", (FX_LPCWSTR)L"DejaVu Serif", 2, 1252}, + {0x3a257d03, (FX_LPCWSTR)L"FangSong_GB2312", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 0, 1252}, + {0x3c7d1d07, (FX_LPCWSTR)L"Garamond3LTStd", (FX_LPCWSTR)L"Ubuntu Condensed,DejaVu Sans Condensed,Liberation Serif,Ubuntu,FreeSerif", 2, 1252}, + {0x3cdae668, (FX_LPCWSTR)L"FreestyleScript", (FX_LPCWSTR)L"DejaVu Sans", 8, 1252}, + {0x3d55aed7, (FX_LPCWSTR)L"Jokerman", (FX_LPCWSTR)L"DejaVu Sans", 0, 1252}, + {0x3d5b4385, (FX_LPCWSTR)L"PMingLiU", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 2, 1252}, + {0x3d9b7669, (FX_LPCWSTR)L"EstrangeloEdessa", (FX_LPCWSTR)L"DejaVu Sans", 0, 1252}, + {0x3e532d74, (FX_LPCWSTR)L"FranklinGothicMedium", (FX_LPCWSTR)L"Ubuntu", 0, 1252}, + {0x3e6aa32d, (FX_LPCWSTR)L"NSimSun", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 1, 936}, + {0x3f6c36a8, (FX_LPCWSTR)L"Gautami", (FX_LPCWSTR)L"FreeSans", 0, 1252}, + {0x3ff32662, (FX_LPCWSTR)L"Chiller-Regular", (FX_LPCWSTR)L"FreeSans", 0, 1252}, + {0x409de312, (FX_LPCWSTR)L"ModernNo.20", (FX_LPCWSTR)L"Nimbus Sans L,Nimbus Sans L,FreeSans", 2, 1252}, + {0x41443c5e, (FX_LPCWSTR)L"Georgia", (FX_LPCWSTR)L"FreeSans", 2, 1252}, + {0x4160ade5, (FX_LPCWSTR)L"BellGothicStdBlack", (FX_LPCWSTR)L"FreeSans", 0, 1252}, + {0x421976c4, (FX_LPCWSTR)L"Modern-Regular", (FX_LPCWSTR)L"FreeSans", 2, 1252}, + {0x422a7252, (FX_LPCWSTR)L"Stencil", (FX_LPCWSTR)L"FreeSans,Liberation Sans", 0, 1252}, + {0x42c8554f, (FX_LPCWSTR)L"Fixedsys", (FX_LPCWSTR)L"FreeSerif", 0, 1252}, + {0x435cb41d, (FX_LPCWSTR)L"Roman", (FX_LPCWSTR)L"FreeSerif", 0, 1252}, + {0x47882383, (FX_LPCWSTR)L"CourierNew", (FX_LPCWSTR)L"FreeMono,WenQuanYi Micro Hei Mono,AR PL UKai CN,AR PL UKai HK,AR PL UKai TW,AR PL UKai TW MBE,DejaVu Sans", 1, 1252}, + {0x480a2338, (FX_LPCWSTR)L"BerlinSansFBDemi", (FX_LPCWSTR)L" Liberation Serif", 0, 1252}, + {0x480bf7a4, (FX_LPCWSTR)L"CourierStd", (FX_LPCWSTR)L"DejaVu Sans", 0, 1252}, + {0x481ad6ed, (FX_LPCWSTR)L"VladimirScript", (FX_LPCWSTR)L"DejaVu Serif", 8, 1252}, + {0x4911577a, (FX_LPCWSTR)L"YouYuan", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 1, 936}, + {0x4a788d72, (FX_LPCWSTR)L"STXingkai", (FX_LPCWSTR)L"AR PL UKai HK,AR PL UMing HK,AR PL UKai CN", 0, 936}, + {0x4bf88566, (FX_LPCWSTR)L"SegoeCondensed", (FX_LPCWSTR)L"FreeSerif", 0, 1252}, + {0x4ccf51a4, (FX_LPCWSTR)L"BerlinSansFB-Reg", (FX_LPCWSTR)L"Liberation Serif", 0, 1252}, + {0x4ea967ce, (FX_LPCWSTR)L"GulimChe", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,AR PL UKai CN,AR PL UKai HK,AR PL UKai TW,AR PL UKai TW MBE,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 1, 1252}, + {0x4f68bd79, (FX_LPCWSTR)L"LetterGothicStd", (FX_LPCWSTR)L"FreeMono,Liberation Mono,WenQuanYi Micro Hei Mono,WenQuanYi Zen Hei Mono,AR PL UKai CN,AR PL UKai HK,AR PL UKai TW,AR PL UKai TW MBE", 0, 1252}, + {0x51a0d0e6, (FX_LPCWSTR)L"KozukaGothicPr6NM", (FX_LPCWSTR)L"FreeSerif", 0, 1252}, + {0x531b3dea, (FX_LPCWSTR)L"BasemicSymbol", (FX_LPCWSTR)L"FreeSerif", 0, 1252}, + {0x5333fd39, (FX_LPCWSTR)L"CalifornianFB-Reg", (FX_LPCWSTR)L"URW Chancery L,FreeSerif", 2, 1252}, + {0x53561a54, (FX_LPCWSTR)L"FZYTK--GBK1-0", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 0, 936}, + {0x55e0dde6, (FX_LPCWSTR)L"LucidaSansTypewriter", (FX_LPCWSTR)L"DejaVu Sans Mono,Nimbus Mono L,Liberation Mono,Courier 10 Pitch,FreeMono", 0, 1252}, + {0x574d4d3d, (FX_LPCWSTR)L"AdobeArabic", (FX_LPCWSTR)L"DejaVu Sans", 0, 1252}, + {0x5792e759, (FX_LPCWSTR)L"STKaiti", (FX_LPCWSTR)L"WenQuanYi Micro Hei Mono", 0, 936}, + {0x5921978e, (FX_LPCWSTR)L"LucidaSansUnicode", (FX_LPCWSTR)L"DejaVu Sans", 0, 1252}, + {0x594e2da4, (FX_LPCWSTR)L"Vrinda", (FX_LPCWSTR)L"FreeSans,FreeSerif", 0, 1252}, + {0x59baa9a2, (FX_LPCWSTR)L"KaiTi_GB2312", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 0, 1252}, + {0x5cfedf4f, (FX_LPCWSTR)L"BaskOldFace", (FX_LPCWSTR)L"Ubuntu,Liberation Serif", 0, 1252}, + {0x5e16ac91, (FX_LPCWSTR)L"TrajanPro", (FX_LPCWSTR)L"Nimbus Sans L,AR PL UMing HK,AR PL UKai HK,AR PL UMing TW,AR PL UMing TW MBE,DejaVu Sans,DejaVu Serif", 0, 1252}, + {0x5f388196, (FX_LPCWSTR)L"ITCLegacySansStdMedium", (FX_LPCWSTR)L"Liberation Serif,FreeSerif,FreeSans,Ubuntu", 0, 1252}, + {0x5f97921c, (FX_LPCWSTR)L"AdobeMyungjoStdM", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 0, 936}, + {0x5fefbfad, (FX_LPCWSTR)L"Batang", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 2, 1252}, + {0x605342b9, (FX_LPCWSTR)L"DotumChe", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,AR PL UKai CN,AR PL UKai HK,AR PL UKai TW,AR PL UKai TW MBE,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 1, 1252}, + {0x608c5f9a, (FX_LPCWSTR)L"KaiTi_GB2312", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 0, 936}, + {0x61efd0d1, (FX_LPCWSTR)L"MaturaMTScriptCapitals", (FX_LPCWSTR)L"DejaVu Serif,DejaVu Sans", 0, 1252}, + {0x626608a9, (FX_LPCWSTR)L"MVBoli", (FX_LPCWSTR)L"DejaVu Sans", 0, 1252}, + {0x630501a3, (FX_LPCWSTR)L"SmallFonts", (FX_LPCWSTR)L"DejaVu Serif", 0, 1252}, + {0x65d0e2a9, (FX_LPCWSTR)L"FZYTK--GBK1-0", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 0, 936}, + {0x669f29e1, (FX_LPCWSTR)L"FZSTK--GBK1-0", (FX_LPCWSTR)L"AR PL UMing CN,AR PL UKai CN, AR PL UMing HK", 0, 936}, + {0x673a9e5f, (FX_LPCWSTR)L"Tunga", (FX_LPCWSTR)L"DejaVu Serif", 0, 1252}, + {0x691aa4ce, (FX_LPCWSTR)L"NiagaraSolid", (FX_LPCWSTR)L"DejaVu Serif", 0, 1252}, + {0x696259b7, (FX_LPCWSTR)L"Corbel", (FX_LPCWSTR)L"DejaVu Sans", 0, 1252}, + {0x696ee9be, (FX_LPCWSTR)L"STXihei", (FX_LPCWSTR)L"WenQuanYi Micro Hei Mono", 0, 936}, + {0x6c59cf69, (FX_LPCWSTR)L"Dotum", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 0, 1252}, + {0x707fa561, (FX_LPCWSTR)L"Gungsuh", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 2, 1252}, + {0x71416bb2, (FX_LPCWSTR)L"ZWAdobeF", (FX_LPCWSTR)L"Dingbats,FreeSerif", 0, 1252}, + {0x71b41801, (FX_LPCWSTR)L"Verdana", (FX_LPCWSTR)L"DejaVu Sans Condensed,DejaVu Sans", 0, 1252}, + {0x73f25e4c, (FX_LPCWSTR)L"PalatinoLinotype", (FX_LPCWSTR)L"FreeSerif", 0, 1252}, + {0x73f4d19f, (FX_LPCWSTR)L"NiagaraEngraved", (FX_LPCWSTR)L"FreeSerif", 0, 1252}, + {0x74001694, (FX_LPCWSTR)L"MyriadProBlack", (FX_LPCWSTR)L"AR PL UKai HK", 0, 1252}, + {0x74b14d8f, (FX_LPCWSTR)L"Haettenschweiler", (FX_LPCWSTR)L"DejaVu Serif", 0, 1252}, + {0x74cb44ee, (FX_LPCWSTR)L"NSimSun", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 1, 936}, + {0x76b4d7ff, (FX_LPCWSTR)L"Shruti", (FX_LPCWSTR)L"FreeSans", 0, 1252}, + {0x788b3533, (FX_LPCWSTR)L"Webdings", (FX_LPCWSTR)L"FreeSans", 6, 42}, + {0x797dde99, (FX_LPCWSTR)L"MSSerif", (FX_LPCWSTR)L"FreeSans", 0, 1252}, + {0x7a0f9e9e, (FX_LPCWSTR)L"MSMincho", (FX_LPCWSTR)L"WenQuanYi Micro Hei Mono", 1, 1252}, + {0x7b439caf, (FX_LPCWSTR)L"OldEnglishTextMT", (FX_LPCWSTR)L"Liberation Sans,Ubuntu", 0, 1252}, + {0x8213a433, (FX_LPCWSTR)L"LucidaSans-Typewriter", (FX_LPCWSTR)L"Liberation Mono", 0, 1252}, + {0x82fec929, (FX_LPCWSTR)L"AdobeSongStdL", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 0, 936}, + {0x83581825, (FX_LPCWSTR)L"Modern", (FX_LPCWSTR)L"FreeSans", 0, 1252}, + {0x835a2823, (FX_LPCWSTR)L"Algerian", (FX_LPCWSTR)L"FreeSans,Liberation Sans,Ubuntu", 0, 1252}, + {0x83dab9f5, (FX_LPCWSTR)L"Script", (FX_LPCWSTR)L"FreeSans", 0, 1252}, + {0x847b56da, (FX_LPCWSTR)L"Tahoma", (FX_LPCWSTR)L"DejaVu Sans Condensed,FreeSerif", 0, 1252}, + {0x8a783cb2, (FX_LPCWSTR)L"SimSun-PUA", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 0, 1252}, + {0x8b5cac0e, (FX_LPCWSTR)L"Onyx", (FX_LPCWSTR)L"Liberation Sans", 0, 1252}, + {0x8c6a499e, (FX_LPCWSTR)L"Gulim", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 0, 1252}, + {0x8e0af790, (FX_LPCWSTR)L"JuiceITC", (FX_LPCWSTR)L"Liberation Sans", 0, 1252}, + {0x8e8d43b2, (FX_LPCWSTR)L"Centaur", (FX_LPCWSTR)L"Khmer OS,Khmer OS System", 2, 1252}, + {0x8ee4dcca, (FX_LPCWSTR)L"BookshelfSymbol7", (FX_LPCWSTR)L"Liberation Sans", 0, 1252}, + {0x90794800, (FX_LPCWSTR)L"BellGothicStdLight", (FX_LPCWSTR)L"Liberation Sans", 0, 1252}, + {0x909b516a, (FX_LPCWSTR)L"Century", (FX_LPCWSTR)L"Liberation Sans,Liberation Mono,Liberation Serif", 2, 1252}, + {0x92ae370d, (FX_LPCWSTR)L"MSOutlook", (FX_LPCWSTR)L"Liberation Sans", 4, 42}, + {0x93c9fbf1, (FX_LPCWSTR)L"LucidaFax", (FX_LPCWSTR)L"Liberation Sans", 2, 1252}, + {0x9565085e, (FX_LPCWSTR)L"BookAntiqua", (FX_LPCWSTR)L"Liberation Sans,Liberation Serif", 2, 1252}, + {0x9856d95d, (FX_LPCWSTR)L"AdobeMingStdL", (FX_LPCWSTR)L"AR PL UMing HK", 0, 949}, + {0x9bbadd6b, (FX_LPCWSTR)L"ColonnaMT", (FX_LPCWSTR)L"Khmer OS,Khmer OS System", 0, 1252}, + {0x9cbd16a4, (FX_LPCWSTR)L"ShowcardGothic-Reg", (FX_LPCWSTR)L"Liberation Sans,Ubuntu", 0, 1252}, + {0x9d73008e, (FX_LPCWSTR)L"MSSansSerif", (FX_LPCWSTR)L"FreeSerif", 0, 1252}, + {0xa0607db1, (FX_LPCWSTR)L"GungsuhChe", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 1, 1252}, + {0xa0bcf6a1, (FX_LPCWSTR)L"LatinWide", (FX_LPCWSTR)L"FreeSerif", 2, 1252}, + {0xa1429b36, (FX_LPCWSTR)L"Symbol", (FX_LPCWSTR)L"FreeSerif", 6, 42}, + {0xa1fa5abc, (FX_LPCWSTR)L"Wingdings2", (FX_LPCWSTR)L"FreeSerif", 6, 42}, + {0xa1fa5abd, (FX_LPCWSTR)L"Wingdings3", (FX_LPCWSTR)L"FreeSerif", 6, 42}, + {0xa427bad4, (FX_LPCWSTR)L"InformalRoman-Regular", (FX_LPCWSTR)L"FreeSerif", 8, 1252}, + {0xa8b92ece, (FX_LPCWSTR)L"FZSTK--GBK1-0", (FX_LPCWSTR)L"AR PL UMing CN", 0, 936}, + {0xa8d83ece, (FX_LPCWSTR)L"CalifornianFB", (FX_LPCWSTR)L"FreeSerif", 2, 1252}, + {0xaa3e082c, (FX_LPCWSTR)L"Kingsoft-Phonetic", (FX_LPCWSTR)L"utkal,Kedage,Mallige,AR PL UKai CN", 0, 1252}, + {0xaa6bcabe, (FX_LPCWSTR)L"HarlowSolidItalic", (FX_LPCWSTR)L"Liberation Serif", 0, 1252}, + {0xade5337c, (FX_LPCWSTR)L"MSUIGothic", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 0, 1252}, + {0xb08dd941, (FX_LPCWSTR)L"WideLatin", (FX_LPCWSTR)L"Liberation Serif", 2, 1252}, + {0xb12765e0, (FX_LPCWSTR)L"ITCLegacySansStdBook", (FX_LPCWSTR)L"AR PL UMing HK,AR PL UKai HK,FreeSerif,Ubuntu,FreeSans", 0, 1252}, + {0xb207f05d, (FX_LPCWSTR)L"PoorRichard", (FX_LPCWSTR)L"Liberation Serif", 2, 1252}, + {0xb3bc492f, (FX_LPCWSTR)L"JuiceITC-Regular", (FX_LPCWSTR)L"Liberation Serif", 0, 1252}, + {0xb5545399, (FX_LPCWSTR)L"Marlett", (FX_LPCWSTR)L"Liberation Serif", 4, 42}, + {0xb5dd1ebb, (FX_LPCWSTR)L"BritannicBold", (FX_LPCWSTR)L"Liberation Serif", 0, 1252}, + {0xb699c1c5, (FX_LPCWSTR)L"LucidaCalligraphy-Italic", (FX_LPCWSTR)L"DejaVu Serif", 0, 1252}, + {0xb725d629, (FX_LPCWSTR)L"TimesNewRoman", (FX_LPCWSTR)L"Liberation Sans", 2, 1252}, + {0xb7eaebeb, (FX_LPCWSTR)L"AdobeHeitiStdR", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 0, 936}, + {0xbd29c486, (FX_LPCWSTR)L"BerlinSansFBDemi-Bold", (FX_LPCWSTR)L"DejaVu Serif", 0, 1252}, + {0xbe8a8db4, (FX_LPCWSTR)L"BookshelfSymbolSeven", (FX_LPCWSTR)L"DejaVu Sans", 0, 1252}, + {0xc16c0118, (FX_LPCWSTR)L"AdobeHebrew", (FX_LPCWSTR)L"Ubuntu,Liberation Serif", 0, 1252}, + {0xc318b0af, (FX_LPCWSTR)L"MyriadProLight", (FX_LPCWSTR)L"AR PL UKai HK,AR PL UMing HK,AR PL UKai CN", 0, 1252}, + {0xc65e5659, (FX_LPCWSTR)L"CambriaMath", (FX_LPCWSTR)L"FreeSerif,FreeMono", 2, 1252}, + {0xc75c8f05, (FX_LPCWSTR)L"LucidaConsole", (FX_LPCWSTR)L"DejaVu Sans Mono,FreeMono,Liberation Mono,WenQuanYi Micro Hei Mono", 1, 1252}, + {0xca7c35d6, (FX_LPCWSTR)L"Calibri", (FX_LPCWSTR)L"DejaVu Sans", 0, 1252}, + {0xcb053f53, (FX_LPCWSTR)L"MicrosoftYaHei", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 0, 936}, + {0xcb7190f9, (FX_LPCWSTR)L"Magneto-Bold", (FX_LPCWSTR)L"DejaVu Serif", 0, 1252}, + {0xcca00cc5, (FX_LPCWSTR)L"System", (FX_LPCWSTR)L"DejaVu Sans", 0, 1252}, + {0xccad6f76, (FX_LPCWSTR)L"Jokerman-Regular", (FX_LPCWSTR)L"DejaVu Sans", 0, 1252}, + {0xccc5818c, (FX_LPCWSTR)L"EuroSign", (FX_LPCWSTR)L"DejaVu Serif", 0, 1252}, + {0xcf3d7234, (FX_LPCWSTR)L"LucidaHandwriting-Italic", (FX_LPCWSTR)L"Nimbus Sans L,DejaVu Serif", 0, 1252}, + {0xcf7b8fdb, (FX_LPCWSTR)L"MinionPro", (FX_LPCWSTR)L"DejaVu Sans", 0, 1252}, + {0xcfe5755f, (FX_LPCWSTR)L"Simhei", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 1, 936}, + {0xd011f4ee, (FX_LPCWSTR)L"MSPGothic", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 0, 1252}, + {0xd060e7ef, (FX_LPCWSTR)L"Vivaldi", (FX_LPCWSTR)L"Liberation Sans,Ubuntu", 8, 1252}, + {0xd07edec1, (FX_LPCWSTR)L"FranklinGothic-Medium", (FX_LPCWSTR)L"Ubuntu", 0, 1252}, + {0xd107243f, (FX_LPCWSTR)L"SimSun", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 0, 936}, + {0xd1881562, (FX_LPCWSTR)L"ArialNarrow", (FX_LPCWSTR)L"FreeSerif", 0, 1252}, + {0xd22b7dce, (FX_LPCWSTR)L"BodoniMTPosterCompressed", (FX_LPCWSTR)L"DejaVu Serif", 0, 1252}, + {0xd22bfa60, (FX_LPCWSTR)L"ComicSansMS", (FX_LPCWSTR)L"FreeMono,Liberation Mono", 8, 1252}, + {0xd3bd0e35, (FX_LPCWSTR)L"Bauhaus93", (FX_LPCWSTR)L"Liberation Sans,Ubuntu", 0, 1252}, + {0xd429ee7a, (FX_LPCWSTR)L"STFangsong", (FX_LPCWSTR)L"WenQuanYi Micro Hei Mono", 0, 936}, + {0xd6679c12, (FX_LPCWSTR)L"BernardMTCondensed", (FX_LPCWSTR)L"Nimbus Sans L,URW Chancery L,KacstOne,Liberation Sans", 0, 1252}, + {0xd8e8a027, (FX_LPCWSTR)L"LucidaSans", (FX_LPCWSTR)L"Nimbus Sans L,DejaVu Serif Condensed,Liberation Mono,Ubuntu", 0, 1252}, + {0xd9fe7761, (FX_LPCWSTR)L"HighTowerText-Reg", (FX_LPCWSTR)L"Ubuntu,Liberation Serif", 2, 1252}, + {0xda7e551e, (FX_LPCWSTR)L"STSong", (FX_LPCWSTR)L"WenQuanYi Micro Hei Mono", 0, 936}, + {0xdaa6842d, (FX_LPCWSTR)L"STZhongsong", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 0, 936}, + {0xdaaab93f, (FX_LPCWSTR)L"STFangsong", (FX_LPCWSTR)L"WenQuanYi Micro Hei Mono,WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp", 0, 936}, + {0xdaeb0713, (FX_LPCWSTR)L"STSong", (FX_LPCWSTR)L"WenQuanYi Micro Hei Mono,WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp", 0, 936}, + {0xdafedbef, (FX_LPCWSTR)L"STCaiyun", (FX_LPCWSTR)L"AR PL UKai HK,AR PL UMing HK,AR PL UKai CN", 0, 936}, + {0xdb00a3d9, (FX_LPCWSTR)L"Broadway", (FX_LPCWSTR)L"DejaVu Sans,FreeMono,Liberation Mono", 0, 1252}, + {0xdb1f5ad4, (FX_LPCWSTR)L"STXinwei", (FX_LPCWSTR)L"AR PL UKai HK,AR PL UMing HK,AR PL UKai CN", 0, 936}, + {0xdb326e7f, (FX_LPCWSTR)L"STKaiti", (FX_LPCWSTR)L"WenQuanYi Micro Hei Mono,WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp", 0, 936}, + {0xdb69595a, (FX_LPCWSTR)L"STHupo", (FX_LPCWSTR)L"WenQuanYi Micro Hei Mono,WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp", 0, 936}, + {0xdba0082c, (FX_LPCWSTR)L"STXihei", (FX_LPCWSTR)L" WenQuanYi Micro Hei Mono,WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp", 0, 936}, + {0xdbd0ab18, (FX_LPCWSTR)L"STXingkai", (FX_LPCWSTR)L"AR PL UKai HK,AR PL UMing HK,AR PL UKai CN", 0, 936}, + {0xdc1a7db1, (FX_LPCWSTR)L"STLiti", (FX_LPCWSTR)L"AR PL UKai HK,AR PL UMing HK,AR PL UKai CN", 0, 936}, + {0xdc33075f, (FX_LPCWSTR)L"KristenITC-Regular", (FX_LPCWSTR)L"DejaVu Sans Condensed,Ubuntu,Liberation Sans", 8, 1252}, + {0xdcc7009c, (FX_LPCWSTR)L"Harrington", (FX_LPCWSTR)L"Liberation Serif,FreeSerif,Ubuntu", 0, 1252}, + {0xdd712466, (FX_LPCWSTR)L"ArialBlack", (FX_LPCWSTR)L"DejaVu Sans,DejaVu Serif,FreeMono", 0, 1252}, + {0xdde87b3e, (FX_LPCWSTR)L"Impact", (FX_LPCWSTR)L"DejaVu Serif", 0, 1252}, + {0xdf69fb32, (FX_LPCWSTR)L"SnapITC", (FX_LPCWSTR)L"DejaVu Sans,DejaVu Serif,FreeMono", 0, 1252}, + {0xdf8b25e8, (FX_LPCWSTR)L"CenturyGothic", (FX_LPCWSTR)L"Liberation Mono,Liberation Sans,Liberation Serif", 0, 1252}, + {0xe0f705c0, (FX_LPCWSTR)L"KristenITC", (FX_LPCWSTR)L"DejaVu Sans Condensed,Ubuntu,Liberation Sans", 8, 1252}, + {0xe1427573, (FX_LPCWSTR)L"Raavi", (FX_LPCWSTR)L"FreeSerif,Liberation Serif,Khmer OS", 0, 1252}, + {0xe2cea0cb, (FX_LPCWSTR)L"Magneto", (FX_LPCWSTR)L"DejaVu Serif,DejaVu Serif Condensed,DejaVu Sans", 0, 1252}, + {0xe36a9e17, (FX_LPCWSTR)L"Ravie", (FX_LPCWSTR)L"DejaVu Serif,DejaVu Sans,FreeMono", 0, 1252}, + {0xe433f8e2, (FX_LPCWSTR)L"Parchment", (FX_LPCWSTR)L"DejaVu Serif", 8, 1252}, + {0xe43dff4a, (FX_LPCWSTR)L"Wingdings", (FX_LPCWSTR)L"DejaVu Serif", 4, 42}, + {0xe4e2c405, (FX_LPCWSTR)L"MTExtra", (FX_LPCWSTR)L"DejaVu Serif", 6, 42}, + {0xe618cc35, (FX_LPCWSTR)L"InformalRoman", (FX_LPCWSTR)L"Nimbus Sans L,DejaVu Sans Condensed,Ubuntu,Liberation Sans", 8, 1252}, + {0xe6c27ffc, (FX_LPCWSTR)L"Mistral", (FX_LPCWSTR)L"DejaVu Serif", 8, 1252}, + {0xe7ebf4b9, (FX_LPCWSTR)L"Courier", (FX_LPCWSTR)L"DejaVu Sans,DejaVu Sans Condensed,FreeSerif", 0, 1252}, + {0xe8bc4a9d, (FX_LPCWSTR)L"MSReferenceSpecialty", (FX_LPCWSTR)L"DejaVu Serif", 0, 1252}, + {0xe90fb013, (FX_LPCWSTR)L"TempusSansITC", (FX_LPCWSTR)L"Ubuntu,Liberation Serif,FreeSerif", 0, 1252}, + {0xec637b42, (FX_LPCWSTR)L"Consolas", (FX_LPCWSTR)L"DejaVu Sans Condensed,FreeSerif,FreeSans", 1, 1252}, + {0xed3a683b, (FX_LPCWSTR)L"STXinwei", (FX_LPCWSTR)L"AR PL UKai HK,AR PL UMing HK,AR PL UKai CN", 0, 936}, + {0xef264cd1, (FX_LPCWSTR)L"LucidaHandwriting", (FX_LPCWSTR)L"DejaVu Serif,DejaVu Sans,FreeMono,Liberation Mono", 0, 1252}, + {0xf086bca2, (FX_LPCWSTR)L"BaskervilleOldFace", (FX_LPCWSTR)L"Liberation Serif,Ubuntu,FreeSerif", 0, 1252}, + {0xf1028030, (FX_LPCWSTR)L"Mangal", (FX_LPCWSTR)L"FreeSans,Garuda,Liberation Sans,Nimbus Sans L,FreeSerif,WenQuanYi Micro Hei", 2, 1252}, + {0xf1da7eb9, (FX_LPCWSTR)L"ShowcardGothic", (FX_LPCWSTR)L"DejaVu Serif Condensed,DejaVu Sans Condensed,Liberation Sans,Ubuntu", 0, 1252}, + {0xf210f06a, (FX_LPCWSTR)L"ArialMT", (FX_LPCWSTR)L"Liberation Sans,FreeSans,Nimbus Sans L,Khmer OS System,Khmer OS", 0, 1252}, + {0xf477f16a, (FX_LPCWSTR)L"Latha", (FX_LPCWSTR)L"Nimbus Sans L,FreeSerif,Nimbus Sans L", 0, 1252}, + {0xf616f3dd, (FX_LPCWSTR)L"LiSu", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW,AR PL UMing TW MBE,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 1, 936}, + {0xfa479aa6, (FX_LPCWSTR)L"MicrosoftYaHei", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 0, 936}, + {0xfcd19697, (FX_LPCWSTR)L"BookmanOldStyle", (FX_LPCWSTR)L"Liberation Mono,Liberation Sans,Liberation Serif", 0, 1252}, + {0xfe209a82, (FX_LPCWSTR)L"LucidaCalligraphy", (FX_LPCWSTR)L"DejaVu Serif,DejaVu Sans,FreeMono", 0, 1252}, + {0xfef135f8, (FX_LPCWSTR)L"AdobeHeitiStd-Regular", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Micro Hei", 0, 936}, +}; +#elif _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ +static const XFA_FONTINFO g_XFAFontsMap[] = { + {0x01d5d33e, (FX_LPCWSTR)L"SimSun", (FX_LPCWSTR)L"STHeiti,Heiti TC,STFangsong", 0, 936}, + {0x01e4f102, (FX_LPCWSTR)L"YouYuan", (FX_LPCWSTR)L"STHeiti,Heiti TC,STFangsong", 1, 936}, + {0x030549dc, (FX_LPCWSTR)L"LiSu", (FX_LPCWSTR)L"STHeiti,Heiti TC,STFangsong", 1, 936}, + {0x032edd44, (FX_LPCWSTR)L"Simhei", (FX_LPCWSTR)L"STHeiti,Heiti TC,STFangsong", 1, 936}, + {0x03eac6fc, (FX_LPCWSTR)L"PoorRichard-Regular", (FX_LPCWSTR)L"Noteworthy,Avenir Next Condensed,Impact", 2, 1252}, + {0x03ed90e6, (FX_LPCWSTR)L"Nina", (FX_LPCWSTR)L"Microsoft Sans Serif", 0, 1252}, + {0x077b56b3, (FX_LPCWSTR)L"KingsoftPhoneticPlain", (FX_LPCWSTR)L"LastResort,Apple Chancery,STIXVariants,STIXSizeOneSym,STIXSizeOneSym,Apple Braille", 0, 1252}, + {0x078ed524, (FX_LPCWSTR)L"MicrosoftSansSerif", (FX_LPCWSTR)L"Songti SC,Apple Symbols", 0, 1252}, + {0x089b18a9, (FX_LPCWSTR)L"Arial", (FX_LPCWSTR)L"Arial Unicode MS,Microsoft Sans Serif,Apple Symbols", 0, 1252}, + {0x0b2cad72, (FX_LPCWSTR)L"MonotypeCorsiva", (FX_LPCWSTR)L"Arial Narrow,Impact", 8, 1252}, + {0x0bb003e7, (FX_LPCWSTR)L"Kartika", (FX_LPCWSTR)L"Arial Unicode MS,Microsoft Sans Serif,Arial Narrow,Damascus", 2, 1252}, + {0x0bb469df, (FX_LPCWSTR)L"VinerHandITC", (FX_LPCWSTR)L"Comic Sans MS,Songti SC,STSong", 8, 1252}, + {0x0bc1a851, (FX_LPCWSTR)L"SegoeUI", (FX_LPCWSTR)L"Apple Symbols", 0, 1252}, + {0x0c112ebd, (FX_LPCWSTR)L"KozukaGothicPro-VIM", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 0, 1252}, + {0x0cfcb9c1, (FX_LPCWSTR)L"AdobeThai", (FX_LPCWSTR)L"Avenir Next Condensed Ultra Light", 0, 847}, + {0x0e7de0f9, (FX_LPCWSTR)L"Playbill", (FX_LPCWSTR)L"STIXNonUnicode", 0, 1252}, + {0x0eff47c3, (FX_LPCWSTR)L"STHupo", (FX_LPCWSTR)L"Kaiti SC,Songti SC,STHeiti", 0, 936}, + {0x107ad374, (FX_LPCWSTR)L"Constantia", (FX_LPCWSTR)L"Arial Unicode MS,Palatino,Baskerville", 2, 1252}, + {0x12194c2d, (FX_LPCWSTR)L"KunstlerScript", (FX_LPCWSTR)L"Avenir Next Condensed Demi Bold,Arial Narrow", 8, 1252}, + {0x135ef6a1, (FX_LPCWSTR)L"MinionProSmBd", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 0, 1252}, + {0x158c4049, (FX_LPCWSTR)L"Garamond", (FX_LPCWSTR)L"Impact,Arial Narrow", 2, 1252}, + {0x160ecb24, (FX_LPCWSTR)L"STZhongsong", (FX_LPCWSTR)L"STFangsong,Songti SC", 0, 936}, + {0x161ed07e, (FX_LPCWSTR)L"MSGothic", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW,Microsoft Sans Serif,Apple Symbols", 1, 1252}, + {0x171d1ed1, (FX_LPCWSTR)L"SnapITC-Regular", (FX_LPCWSTR)L"STHeiti,Arial Black", 0, 1252}, + {0x18d1188f, (FX_LPCWSTR)L"Cambria", (FX_LPCWSTR)L"Arial Unicode MS", 2, 1252}, + {0x18eaf350, (FX_LPCWSTR)L"ArialUnicodeMS", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 0, 936}, + {0x1a92d115, (FX_LPCWSTR)L"MingLiU", (FX_LPCWSTR)L"Heiti SC,STHeiti", 1, 1252}, + {0x1cc217c6, (FX_LPCWSTR)L"TrebuchetMS", (FX_LPCWSTR)L"Damascus,Impact,Arial Narrow", 0, 1252}, + {0x1d649596, (FX_LPCWSTR)L"BasemicTimes", (FX_LPCWSTR)L"Liberation Serif,Impact,Arial Narrow", 0, 1252}, + {0x1e34ee60, (FX_LPCWSTR)L"BellMT", (FX_LPCWSTR)L"Papyrus,STIXNonUnicode,Microsoft Sans Serif,Avenir Light", 2, 1252}, + {0x1eb36945, (FX_LPCWSTR)L"CooperBlack", (FX_LPCWSTR)L"Marion,STIXNonUnicode,Arial Rounded MT Bold,Lucida Grande", 2, 1252}, + {0x1ef7787d, (FX_LPCWSTR)L"BatangChe", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,AR PL UMing CN,,AR PL UMing HK,AR PL UMing TW,AR PL UMing TW MBE,Arial Unicode MS,Heiti TC", 1, 1252}, + {0x20b3bd3a, (FX_LPCWSTR)L"BrushScriptMT", (FX_LPCWSTR)L"STIXNonUnicode,Damascus,Arial Narrow,Avenir Next Condensed,Cochin", 8, 1252}, + {0x220877aa, (FX_LPCWSTR)L"Candara", (FX_LPCWSTR)L"Cochin,Baskerville,Marion", 0, 1252}, + {0x22135007, (FX_LPCWSTR)L"FreestyleScript-Regular", (FX_LPCWSTR)L"STIXNonUnicode,Nadeem,Zapf Dingbats", 8, 1252}, + {0x251059c3, (FX_LPCWSTR)L"Chiller", (FX_LPCWSTR)L"Zapf Dingbats,Damascus,STIXNonUnicode,Papyrus,KufiStandardGK,Baghdad", 0, 1252}, + {0x25bed6dd, (FX_LPCWSTR)L"MSReferenceSansSerif", (FX_LPCWSTR)L"Tahoma,Apple Symbols,Apple LiGothic,Arial Unicode MS,Lucida Grande,Microsoft Sans Serif", 0, 1252}, + {0x28154c81, (FX_LPCWSTR)L"Parchment-Regular", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 8, 1252}, + {0x29711eb9, (FX_LPCWSTR)L"STLiti", (FX_LPCWSTR)L"Kaiti SC,Songti SC", 0, 936}, + {0x2b1993b4, (FX_LPCWSTR)L"Basemic", (FX_LPCWSTR)L"Impact,Arial Narrow", 0, 1252}, + {0x2b316339, (FX_LPCWSTR)L"NiagaraSolid-Reg", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 0, 1252}, + {0x2c147529, (FX_LPCWSTR)L"FootlightMTLight", (FX_LPCWSTR)L"STIXNonUnicode,Avenir Next Condensed Heavy,PT Sans,Noteworthy", 0, 1252}, + {0x2c198928, (FX_LPCWSTR)L"HarlowSolid", (FX_LPCWSTR)L"Avenir Medium,Avenir Next Medium,Arial Unicode MS", 0, 1252}, + {0x2c6ac6b2, (FX_LPCWSTR)L"LucidaBright", (FX_LPCWSTR)L"PT Sans Narrow,Papyrus,Damascus,STIXNonUnicode,Arial Rounded MT Bold,Comic Sans MS,Avenir Next", 2, 1252}, + {0x2c9f38e2, (FX_LPCWSTR)L"KozukaMinchoPro-VIR", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 0, 1252}, + {0x2d5a47b0, (FX_LPCWSTR)L"STCaiyun", (FX_LPCWSTR)L"Kaiti SC,Songti SC", 0, 936}, + {0x2def26bf, (FX_LPCWSTR)L"BernardMT-Condensed", (FX_LPCWSTR)L"Impact,Avenir Next Condensed Demi Bold,American Typewriter", 0, 1252}, + {0x2fd8930b, (FX_LPCWSTR)L"KozukaMinchoPr6NR", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 0, 1252}, + {0x3115525a, (FX_LPCWSTR)L"FangSong_GB2312", (FX_LPCWSTR)L"Hiragino Sans GB,STHeiti", 0, 1252}, + {0x31327817, (FX_LPCWSTR)L"MyriadPro", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 0, 1252}, + {0x32244975, (FX_LPCWSTR)L"Helvetica", (FX_LPCWSTR)L"Arial Narrow,Arial Unicode MS,Damascus,STIXNonUnicode,Liberation Sans,Nimbus Sans L,Avenir Next Medium", 0, 1252}, + {0x32ac995c, (FX_LPCWSTR)L"Terminal", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 0, 1252}, + {0x338d648a, (FX_LPCWSTR)L"NiagaraEngraved-Reg", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 0, 1252}, + {0x33bb65f2, (FX_LPCWSTR)L"Sylfaen", (FX_LPCWSTR)L"Arial Unicode MS,Marion", 2, 1252}, + {0x3402c30e, (FX_LPCWSTR)L"MSPMincho", (FX_LPCWSTR)L"Arial Unicode MS,Apple SD Gothic Neo", 2, 1252}, + {0x3412bf31, (FX_LPCWSTR)L"SimSun-PUA", (FX_LPCWSTR)L"STHeiti,Heiti TC,STFangsong", 0, 936}, + {0x36eb39b9, (FX_LPCWSTR)L"BerlinSansFB", (FX_LPCWSTR)L"American Typewriter,Impact", 0, 1252}, + {0x36f42055, (FX_LPCWSTR)L"UniversATT", (FX_LPCWSTR)L"Microsoft Sans Serif", 0, 1252}, + {0x3864c4f6, (FX_LPCWSTR)L"HighTowerText", (FX_LPCWSTR)L"STIXGeneral,.Helvetica Neue Desk UI", 2, 1252}, + {0x3a257d03, (FX_LPCWSTR)L"FangSong_GB2312", (FX_LPCWSTR)L"Hiragino Sans GB,STHeiti", 0, 1252}, + {0x3cdae668, (FX_LPCWSTR)L"FreestyleScript", (FX_LPCWSTR)L"Nadeem,Zapf Dingbats,STIXNonUnicode", 8, 1252}, + {0x3d55aed7, (FX_LPCWSTR)L"Jokerman", (FX_LPCWSTR)L"Papyrus,Lucida Grande,Heiti TC,American Typewriter", 0, 1252}, + {0x3d5b4385, (FX_LPCWSTR)L"PMingLiU", (FX_LPCWSTR)L"Heiti SC,STHeiti", 2, 1252}, + {0x3d9b7669, (FX_LPCWSTR)L"EstrangeloEdessa", (FX_LPCWSTR)L"American Typewriter,Marion", 0, 1252}, + {0x3e532d74, (FX_LPCWSTR)L"FranklinGothicMedium", (FX_LPCWSTR)L"Impact,Arial Narrow", 0, 1252}, + {0x3e6aa32d, (FX_LPCWSTR)L"NSimSun", (FX_LPCWSTR)L"STHeiti,STFangsong", 1, 936}, + {0x3f6c36a8, (FX_LPCWSTR)L"Gautami", (FX_LPCWSTR)L"Damascus,STIXNonUnicode,STIXGeneral,American Typewriter", 0, 1252}, + {0x3ff32662, (FX_LPCWSTR)L"Chiller-Regular", (FX_LPCWSTR)L"Papyrus,KufiStandardGK,Baghdad", 0, 1252}, + {0x409de312, (FX_LPCWSTR)L"ModernNo.20", (FX_LPCWSTR)L"Avenir Next Condensed,Impact", 2, 1252}, + {0x41443c5e, (FX_LPCWSTR)L"Georgia", (FX_LPCWSTR)L".Helvetica Neue Desk UI,Arial Unicode MS", 2, 1252}, + {0x4160ade5, (FX_LPCWSTR)L"BellGothicStdBlack", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 0, 1252}, + {0x421976c4, (FX_LPCWSTR)L"Modern-Regular", (FX_LPCWSTR)L"Impact", 2, 1252}, + {0x422a7252, (FX_LPCWSTR)L"Stencil", (FX_LPCWSTR)L"STIXNonUnicode,Songti SC,Georgia,Baskerville", 0, 1252}, + {0x42c8554f, (FX_LPCWSTR)L"Fixedsys", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 0, 1252}, + {0x435cb41d, (FX_LPCWSTR)L"Roman", (FX_LPCWSTR)L"Arial Narrow", 0, 1252}, + {0x47882383, (FX_LPCWSTR)L"CourierNew", (FX_LPCWSTR)L"PCMyungjo,Osaka,Arial Unicode MS,Songti SC", 1, 1252}, + {0x480a2338, (FX_LPCWSTR)L"BerlinSansFBDemi", (FX_LPCWSTR)L"STIXNonUnicode,American Typewriter,Avenir Next Condensed Heavy", 0, 1252}, + {0x480bf7a4, (FX_LPCWSTR)L"CourierStd", (FX_LPCWSTR)L"Courier New", 0, 1252}, + {0x481ad6ed, (FX_LPCWSTR)L"VladimirScript", (FX_LPCWSTR)L"STIXNonUnicode,Avenir Next Condensed,Impact", 8, 1252}, + {0x4911577a, (FX_LPCWSTR)L"YouYuan", (FX_LPCWSTR)L"STHeiti,Heiti TC", 1, 936}, + {0x4a788d72, (FX_LPCWSTR)L"STXingkai", (FX_LPCWSTR)L"Kaiti SC,Songti SC", 0, 936}, + {0x4bf88566, (FX_LPCWSTR)L"SegoeCondensed", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 0, 1252}, + {0x4ccf51a4, (FX_LPCWSTR)L"BerlinSansFB-Reg", (FX_LPCWSTR)L"STIXNonUnicode,American Typewriter,Impact", 0, 1252}, + {0x4ea967ce, (FX_LPCWSTR)L"GulimChe", (FX_LPCWSTR)L"Arial Unicode MS,Heiti TC,STFangsong", 1, 1252}, + {0x4f68bd79, (FX_LPCWSTR)L"LetterGothicStd", (FX_LPCWSTR)L"Courier New,Andale Mono,Ayuthaya,PCMyungjo,Osaka", 0, 1252}, + {0x51a0d0e6, (FX_LPCWSTR)L"KozukaGothicPr6NM", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 0, 1252}, + {0x531b3dea, (FX_LPCWSTR)L"BasemicSymbol", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 0, 1252}, + {0x5333fd39, (FX_LPCWSTR)L"CalifornianFB-Reg", (FX_LPCWSTR)L"American Typewriter,Avenir Next Condensed,Impact", 2, 1252}, + {0x53561a54, (FX_LPCWSTR)L"FZYTK--GBK1-0", (FX_LPCWSTR)L"STFangsong,Songti SC,STSong", 0, 936}, + {0x55e0dde6, (FX_LPCWSTR)L"LucidaSansTypewriter", (FX_LPCWSTR)L"Menlo,Courier New,Andale Mono", 0, 1252}, + {0x574d4d3d, (FX_LPCWSTR)L"AdobeArabic", (FX_LPCWSTR)L"Arial Narrow", 0, 1252}, + {0x5792e759, (FX_LPCWSTR)L"STKaiti", (FX_LPCWSTR)L"Songti SC,Arial Unicode MS", 0, 936}, + {0x5921978e, (FX_LPCWSTR)L"LucidaSansUnicode", (FX_LPCWSTR)L"Lucida Grande,Arial Unicode MS,Menlo", 0, 1252}, + {0x594e2da4, (FX_LPCWSTR)L"Vrinda", (FX_LPCWSTR)L"Geeza Pro,Damascus,STIXGeneral,Gill Sans", 0, 1252}, + {0x59baa9a2, (FX_LPCWSTR)L"KaiTi_GB2312", (FX_LPCWSTR)L"Hiragino Sans GB,STHeiti", 0, 1252}, + {0x5cfedf4f, (FX_LPCWSTR)L"BaskOldFace", (FX_LPCWSTR)L"Avenir Next Condensed Heavy,PT Sans,Avenir Next Condensed", 0, 1252}, + {0x5e16ac91, (FX_LPCWSTR)L"TrajanPro", (FX_LPCWSTR)L"Arial Narrow,PT Sans Narrow,Damascus", 0, 1252}, + {0x5f97921c, (FX_LPCWSTR)L"AdobeMyungjoStdM", (FX_LPCWSTR)L"AppleMyungjo,AppleGothic,Arial Unicode MS", 0, 936}, + {0x5fefbfad, (FX_LPCWSTR)L"Batang", (FX_LPCWSTR)L"Arial Unicode MS,Songti SC", 2, 1252}, + {0x605342b9, (FX_LPCWSTR)L"DotumChe", (FX_LPCWSTR)L"Arial Unicode MS,Heiti TC", 1, 1252}, + {0x608c5f9a, (FX_LPCWSTR)L"KaiTi_GB2312", (FX_LPCWSTR)L"Hiragino Sans GB,STHeiti,Heiti TC", 0, 936}, + {0x61efd0d1, (FX_LPCWSTR)L"MaturaMTScriptCapitals", (FX_LPCWSTR)L"Kokonor,Damascus,STIXNonUnicode,STHeiti,Arial Black,Avenir Next Heavy", 0, 1252}, + {0x626608a9, (FX_LPCWSTR)L"MVBoli", (FX_LPCWSTR)L"Apple Braille,Geeza Pro,Microsoft Sans Serif,Apple Symbols", 0, 1252}, + {0x630501a3, (FX_LPCWSTR)L"SmallFonts", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 0, 1252}, + {0x65d0e2a9, (FX_LPCWSTR)L"FZYTK--GBK1-0", (FX_LPCWSTR)L"STFangsong,Songti SC,STSong", 0, 936}, + {0x669f29e1, (FX_LPCWSTR)L"FZSTK--GBK1-0", (FX_LPCWSTR)L"STHeiti,Heiti TC", 0, 936}, + {0x673a9e5f, (FX_LPCWSTR)L"Tunga", (FX_LPCWSTR)L"Damascus,STIXNonUnicode,Avenir Next Condensed,Avenir Next Condensed Ultra Light,Futura", 0, 1252}, + {0x691aa4ce, (FX_LPCWSTR)L"NiagaraSolid", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 0, 1252}, + {0x696259b7, (FX_LPCWSTR)L"Corbel", (FX_LPCWSTR)L"Cochin,Baskerville,Marion", 0, 1252}, + {0x696ee9be, (FX_LPCWSTR)L"STXihei", (FX_LPCWSTR)L"STHeiti,Heiti TC,Songti SC,Arial Unicode MS", 0, 936}, + {0x6c59cf69, (FX_LPCWSTR)L"Dotum", (FX_LPCWSTR)L"Arial Unicode MS,Songti SC", 0, 1252}, + {0x707fa561, (FX_LPCWSTR)L"Gungsuh", (FX_LPCWSTR)L"Arial Unicode MS,Heiti TC", 2, 1252}, + {0x71416bb2, (FX_LPCWSTR)L"ZWAdobeF", (FX_LPCWSTR)L"STIXSizeFourSym,STIXSizeThreeSym,STIXSizeTwoSym,STIXSizeOneSym", 0, 1252}, + {0x71b41801, (FX_LPCWSTR)L"Verdana", (FX_LPCWSTR)L"Tahoma,Marion,Apple Symbols,.Helvetica Neue Desk UI,Lucida Grande,Courier New", 0, 1252}, + {0x73f25e4c, (FX_LPCWSTR)L"PalatinoLinotype", (FX_LPCWSTR)L"Palatino,Arial Unicode MS", 0, 1252}, + {0x73f4d19f, (FX_LPCWSTR)L"NiagaraEngraved", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 0, 1252}, + {0x74001694, (FX_LPCWSTR)L"MyriadProBlack", (FX_LPCWSTR)L"Palatino,Baskerville,Marion,Cochin", 0, 1252}, + {0x74b14d8f, (FX_LPCWSTR)L"Haettenschweiler", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 0, 1252}, + {0x74cb44ee, (FX_LPCWSTR)L"NSimSun", (FX_LPCWSTR)L"STHeiti,Heiti TC,STFangsong", 1, 936}, + {0x76b4d7ff, (FX_LPCWSTR)L"Shruti", (FX_LPCWSTR)L"Damascus,STIXNonUnicode,Arial Unicode MS,American Typewriter", 0, 1252}, + {0x788b3533, (FX_LPCWSTR)L"Webdings", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 6, 42}, + {0x797dde99, (FX_LPCWSTR)L"MSSerif", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 0, 1252}, + {0x7a0f9e9e, (FX_LPCWSTR)L"MSMincho", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW,AR PL UMing TW MBE,Arial Unicode MS,Apple SD Gothic Neo", 1, 1252}, + {0x7b439caf, (FX_LPCWSTR)L"OldEnglishTextMT", (FX_LPCWSTR)L"STIXNonUnicode,Arial Unicode MS,Baskerville,Avenir Next Medium", 0, 1252}, + {0x8213a433, (FX_LPCWSTR)L"LucidaSans-Typewriter", (FX_LPCWSTR)L"Comic Sans MS,Avenir Next,Arial Rounded MT Bold", 0, 1252}, + {0x82fec929, (FX_LPCWSTR)L"AdobeSongStdL", (FX_LPCWSTR)L"Heiti TC,STHeiti", 0, 936}, + {0x83581825, (FX_LPCWSTR)L"Modern", (FX_LPCWSTR)L"Avenir Next Condensed,Impact", 0, 1252}, + {0x835a2823, (FX_LPCWSTR)L"Algerian", (FX_LPCWSTR)L"STIXNonUnicode,Baskerville,Avenir Next Medium,American Typewriter", 0, 1252}, + {0x83dab9f5, (FX_LPCWSTR)L"Script", (FX_LPCWSTR)L"Arial Narrow", 0, 1252}, + {0x847b56da, (FX_LPCWSTR)L"Tahoma", (FX_LPCWSTR)L"Songti SC,Apple Symbols", 0, 1252}, + {0x8a783cb2, (FX_LPCWSTR)L"SimSun-PUA", (FX_LPCWSTR)L"STHeiti,Heiti TC,STFangsong", 0, 1252}, + {0x8b5cac0e, (FX_LPCWSTR)L"Onyx", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 0, 1252}, + {0x8c6a499e, (FX_LPCWSTR)L"Gulim", (FX_LPCWSTR)L"Arial Unicode MS,Songti SC", 0, 1252}, + {0x8e0af790, (FX_LPCWSTR)L"JuiceITC", (FX_LPCWSTR)L"Nadeem,Al Bayan", 0, 1252}, + {0x8e8d43b2, (FX_LPCWSTR)L"Centaur", (FX_LPCWSTR)L"Avenir Next Condensed,Noteworthy,Impact", 2, 1252}, + {0x8ee4dcca, (FX_LPCWSTR)L"BookshelfSymbol7", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 0, 1252}, + {0x90794800, (FX_LPCWSTR)L"BellGothicStdLight", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 0, 1252}, + {0x909b516a, (FX_LPCWSTR)L"Century", (FX_LPCWSTR)L"Damascus,Andale Mono,Songti SC,Arial Unicode MS", 2, 1252}, + {0x92ae370d, (FX_LPCWSTR)L"MSOutlook", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 4, 42}, + {0x93c9fbf1, (FX_LPCWSTR)L"LucidaFax", (FX_LPCWSTR)L"PT Sans Narrow,Papyrus,Kokonor,Geeza Pro,Arial Rounded MT Bold,Lucida Grande,Futura", 2, 1252}, + {0x9565085e, (FX_LPCWSTR)L"BookAntiqua", (FX_LPCWSTR)L"Palatino,Microsoft Sans Serif,Apple Symbols", 2, 1252}, + {0x9856d95d, (FX_LPCWSTR)L"AdobeMingStdL", (FX_LPCWSTR)L"AHiragino Sans GB,Heiti TC,STHeiti", 0, 949}, + {0x9bbadd6b, (FX_LPCWSTR)L"ColonnaMT", (FX_LPCWSTR)L"Noteworthy,Avenir Next Condensed,Impact", 0, 1252}, + {0x9cbd16a4, (FX_LPCWSTR)L"ShowcardGothic-Reg", (FX_LPCWSTR)L"Arial Unicode MS,Georgia,American Typewriter", 0, 1252}, + {0x9d73008e, (FX_LPCWSTR)L"MSSansSerif", (FX_LPCWSTR)L"Songti SC,Apple Symbols", 0, 1252}, + {0xa0607db1, (FX_LPCWSTR)L"GungsuhChe", (FX_LPCWSTR)L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW,AR PL UMing TW MBE,Arial Unicode MS,Heiti TC,STFangsong", 1, 1252}, + {0xa0bcf6a1, (FX_LPCWSTR)L"LatinWide", (FX_LPCWSTR)L"Zapfino,Arial Black,STHeiti", 2, 1252}, + {0xa1429b36, (FX_LPCWSTR)L"Symbol", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 6, 42}, + {0xa1fa5abc, (FX_LPCWSTR)L"Wingdings2", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 6, 42}, + {0xa1fa5abd, (FX_LPCWSTR)L"Wingdings3", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 6, 42}, + {0xa427bad4, (FX_LPCWSTR)L"InformalRoman-Regular", (FX_LPCWSTR)L"STIXNonUnicode,Arial Narrow,Avenir Next Condensed Demi Bold", 8, 1252}, + {0xa8b92ece, (FX_LPCWSTR)L"FZSTK--GBK1-0", (FX_LPCWSTR)L"STHeiti,Heiti TC,STFangsong", 0, 936}, + {0xa8d83ece, (FX_LPCWSTR)L"CalifornianFB", (FX_LPCWSTR)L"American Typewriter,Avenir Next Condensed,Impact", 2, 1252}, + {0xaa3e082c, (FX_LPCWSTR)L"Kingsoft-Phonetic", (FX_LPCWSTR)L"STIXVariants,STIXSizeOneSym,Apple Braille", 0, 1252}, + {0xaa6bcabe, (FX_LPCWSTR)L"HarlowSolidItalic", (FX_LPCWSTR)L"STIXNonUnicode,Avenir Medium,Avenir Next Medium,Arial Unicode MS", 0, 1252}, + {0xade5337c, (FX_LPCWSTR)L"MSUIGothic", (FX_LPCWSTR)L"Arial Unicode MS,Apple SD Gothic Neo", 0, 1252}, + {0xb08dd941, (FX_LPCWSTR)L"WideLatin", (FX_LPCWSTR)L"Marion,Papyrus,Nanum Pen Script,Zapf Dingbats,Damascus,Zapfino,Arial Black,STHeiti", 2, 1252}, + {0xb12765e0, (FX_LPCWSTR)L"ITCLegacySansStdBook", (FX_LPCWSTR)L"LastResort,.Helvetica Neue Desk UI,Arial Unicode MS,Palatino", 0, 1252}, + {0xb207f05d, (FX_LPCWSTR)L"PoorRichard", (FX_LPCWSTR)L"Noteworthy,Avenir Next Condensed,Impact", 2, 1252}, + {0xb3bc492f, (FX_LPCWSTR)L"JuiceITC-Regular", (FX_LPCWSTR)L"Nadeem,Al Bayan,STIXNonUnicode", 0, 1252}, + {0xb5545399, (FX_LPCWSTR)L"Marlett", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 4, 42}, + {0xb5dd1ebb, (FX_LPCWSTR)L"BritannicBold", (FX_LPCWSTR)L"Damascus,STIXNonUnicode,Avenir Next Condensed Heavy,PT Sans", 0, 1252}, + {0xb699c1c5, (FX_LPCWSTR)L"LucidaCalligraphy-Italic", (FX_LPCWSTR)L"STHeiti,Arial Black", 0, 1252}, + {0xb725d629, (FX_LPCWSTR)L"TimesNewRoman", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 2, 1252}, + {0xb7eaebeb, (FX_LPCWSTR)L"AdobeHeitiStdR", (FX_LPCWSTR)L"Heiti TC,STHeiti", 0, 936}, + {0xbd29c486, (FX_LPCWSTR)L"BerlinSansFBDemi-Bold", (FX_LPCWSTR)L"American Typewriter,Avenir Next Condensed Heavy", 0, 1252}, + {0xbe8a8db4, (FX_LPCWSTR)L"BookshelfSymbolSeven", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 0, 1252}, + {0xc16c0118, (FX_LPCWSTR)L"AdobeHebrew", (FX_LPCWSTR)L".Helvetica Neue Desk UI,Palatino,American Typewriter", 0, 1252}, + {0xc318b0af, (FX_LPCWSTR)L"MyriadProLight", (FX_LPCWSTR)L"Palatino,Baskerville,Marion", 0, 1252}, + {0xc65e5659, (FX_LPCWSTR)L"CambriaMath", (FX_LPCWSTR)L"Arial Unicode MS", 2, 1252}, + {0xc75c8f05, (FX_LPCWSTR)L"LucidaConsole", (FX_LPCWSTR)L"Courier New,Menlo,Andale Mono", 1, 1252}, + {0xca7c35d6, (FX_LPCWSTR)L"Calibri", (FX_LPCWSTR)L"Apple Symbols,HeadLineA", 0, 1252}, + {0xcb053f53, (FX_LPCWSTR)L"MicrosoftYaHei", (FX_LPCWSTR)L"Arial Unicode MS", 0, 936}, + {0xcb7190f9, (FX_LPCWSTR)L"Magneto-Bold", (FX_LPCWSTR)L"Lucida Grande", 0, 1252}, + {0xcca00cc5, (FX_LPCWSTR)L"System", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 0, 1252}, + {0xccad6f76, (FX_LPCWSTR)L"Jokerman-Regular", (FX_LPCWSTR)L"Lucida Grande", 0, 1252}, + {0xccc5818c, (FX_LPCWSTR)L"EuroSign", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 0, 1252}, + {0xcf3d7234, (FX_LPCWSTR)L"LucidaHandwriting-Italic", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 0, 1252}, + {0xcf7b8fdb, (FX_LPCWSTR)L"MinionPro", (FX_LPCWSTR)L"Bell MT,Corbel,Times New Roman,Cambria,Berlin Sans FB", 0, 1252}, + {0xcfe5755f, (FX_LPCWSTR)L"Simhei", (FX_LPCWSTR)L"STHeiti,Heiti TC,STFangsong", 1, 936}, + {0xd011f4ee, (FX_LPCWSTR)L"MSPGothic", (FX_LPCWSTR)L"Arial Unicode MS,Apple SD Gothic Neo", 0, 1252}, + {0xd060e7ef, (FX_LPCWSTR)L"Vivaldi", (FX_LPCWSTR)L"STIXNonUnicode,Arial Unicode MS,Avenir Medium,Avenir Next Medium", 8, 1252}, + {0xd07edec1, (FX_LPCWSTR)L"FranklinGothic-Medium", (FX_LPCWSTR)L"Impact,Arial Narrow", 0, 1252}, + {0xd107243f, (FX_LPCWSTR)L"SimSun", (FX_LPCWSTR)L"STHeiti,Heiti TC,STFangsong", 0, 936}, + {0xd1881562, (FX_LPCWSTR)L"ArialNarrow", (FX_LPCWSTR)L"PT Sans Narrow,Apple Symbols", 0, 1252}, + {0xd22b7dce, (FX_LPCWSTR)L"BodoniMTPosterCompressed", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 0, 1252}, + {0xd22bfa60, (FX_LPCWSTR)L"ComicSansMS", (FX_LPCWSTR)L"Damascus,Georgia,.Helvetica Neue Desk UI,Lucida Grande,Arial Unicode MS", 8, 1252}, + {0xd3bd0e35, (FX_LPCWSTR)L"Bauhaus93", (FX_LPCWSTR)L"STIXNonUnicode,Arial Unicode MS,Avenir Next,Avenir", 0, 1252}, + {0xd429ee7a, (FX_LPCWSTR)L"STFangsong", (FX_LPCWSTR)L"Songti SC,Arial Unicode MS", 0, 936}, + {0xd6679c12, (FX_LPCWSTR)L"BernardMTCondensed", (FX_LPCWSTR)L"Impact,Avenir Next Condensed Demi Bold", 0, 1252}, + {0xd8e8a027, (FX_LPCWSTR)L"LucidaSans", (FX_LPCWSTR)L"Arial Narrow,Khmer MN,Kokonor,Damascus,Microsoft Sans Serif,Apple Symbols", 0, 1252}, + {0xd9fe7761, (FX_LPCWSTR)L"HighTowerText-Reg", (FX_LPCWSTR)L"STIXGeneral,.Helvetica Neue Desk UI,Trebuchet MS", 2, 1252}, + {0xda7e551e, (FX_LPCWSTR)L"STSong", (FX_LPCWSTR)L"Arial Unicode MS", 0, 936}, + {0xdaa6842d, (FX_LPCWSTR)L"STZhongsong", (FX_LPCWSTR)L"STFangsong,Songti SC,STSong", 0, 936}, + {0xdaaab93f, (FX_LPCWSTR)L"STFangsong", (FX_LPCWSTR)L"Songti SC,Arial Unicode MS", 0, 936}, + {0xdaeb0713, (FX_LPCWSTR)L"STSong", (FX_LPCWSTR)L"Songti SC,Arial Unicode MS", 0, 936}, + {0xdafedbef, (FX_LPCWSTR)L"STCaiyun", (FX_LPCWSTR)L"Kaiti SC,Songti SC,STHeiti", 0, 936}, + {0xdb00a3d9, (FX_LPCWSTR)L"Broadway", (FX_LPCWSTR)L"Papyrus,STIXNonUnicode,Arial Black,Avenir Next Heavy,Heiti TC", 0, 1252}, + {0xdb1f5ad4, (FX_LPCWSTR)L"STXinwei", (FX_LPCWSTR)L"Kaiti SC,Songti SC,STHeiti", 0, 936}, + {0xdb326e7f, (FX_LPCWSTR)L"STKaiti", (FX_LPCWSTR)L"Songti SC,Arial Unicode MS", 0, 936}, + {0xdb69595a, (FX_LPCWSTR)L"STHupo", (FX_LPCWSTR)L"Kaiti SC,Songti SC,STHeiti", 0, 936}, + {0xdba0082c, (FX_LPCWSTR)L"STXihei", (FX_LPCWSTR)L"Songti SC,Arial Unicode MS", 0, 936}, + {0xdbd0ab18, (FX_LPCWSTR)L"STXingkai", (FX_LPCWSTR)L"Kaiti SC,Songti SC", 0, 936}, + {0xdc1a7db1, (FX_LPCWSTR)L"STLiti", (FX_LPCWSTR)L"Kaiti SC,Songti SC", 0, 936}, + {0xdc33075f, (FX_LPCWSTR)L"KristenITC-Regular", (FX_LPCWSTR)L"STIXNonUnicode,Damascus,Songti SC,STSong", 8, 1252}, + {0xdcc7009c, (FX_LPCWSTR)L"Harrington", (FX_LPCWSTR)L"STIXNonUnicode,Avenir Next Condensed Heavy,Noteworthy", 0, 1252}, + {0xdd712466, (FX_LPCWSTR)L"ArialBlack", (FX_LPCWSTR)L"Geeza Pro,Damascus,Songti SC,STSong", 0, 1252}, + {0xdde87b3e, (FX_LPCWSTR)L"Impact", (FX_LPCWSTR)L"Arial Narrow,Marion", 0, 1252}, + {0xdf69fb32, (FX_LPCWSTR)L"SnapITC", (FX_LPCWSTR)L"Arial Narrow,PT Sans Narrow,Marion,STHeiti,Arial Black", 0, 1252}, + {0xdf8b25e8, (FX_LPCWSTR)L"CenturyGothic", (FX_LPCWSTR)L"Damascus,Andale Mono,Songti SC,Arial Unicode MS", 0, 1252}, + {0xe0f705c0, (FX_LPCWSTR)L"KristenITC", (FX_LPCWSTR)L"Songti SC,STSong", 8, 1252}, + {0xe1427573, (FX_LPCWSTR)L"Raavi", (FX_LPCWSTR)L"Damascus,STIXNonUnicode,Marion,Papyrus,Avenir Next Condensed Heavy,American Typewriter", 0, 1252}, + {0xe2cea0cb, (FX_LPCWSTR)L"Magneto", (FX_LPCWSTR)L"STIXNonUnicode,Damascus,Geeza Pro,Lucida Grande,Georgia,Heiti TC", 0, 1252}, + {0xe36a9e17, (FX_LPCWSTR)L"Ravie", (FX_LPCWSTR)L"STHeiti,Arial Black", 0, 1252}, + {0xe433f8e2, (FX_LPCWSTR)L"Parchment", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 8, 1252}, + {0xe43dff4a, (FX_LPCWSTR)L"Wingdings", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 4, 42}, + {0xe4e2c405, (FX_LPCWSTR)L"MTExtra", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 6, 42}, + {0xe618cc35, (FX_LPCWSTR)L"InformalRoman", (FX_LPCWSTR)L"Arial Narrow", 8, 1252}, + {0xe6c27ffc, (FX_LPCWSTR)L"Mistral", (FX_LPCWSTR)L"Apple Symbols", 8, 1252}, + {0xe7ebf4b9, (FX_LPCWSTR)L"Courier", (FX_LPCWSTR)L"Courier New", 0, 1252}, + {0xe8bc4a9d, (FX_LPCWSTR)L"MSReferenceSpecialty", (FX_LPCWSTR)L"Microsoft Sans Serif,Apple Symbols", 0, 1252}, + {0xe90fb013, (FX_LPCWSTR)L"TempusSansITC", (FX_LPCWSTR)L"STIXNonUnicode,Microsoft Sans Serif,Avenir Light", 0, 1252}, + {0xec637b42, (FX_LPCWSTR)L"Consolas", (FX_LPCWSTR)L"AR PL UKai CN,AR PL UKai HK,AR PL UKai TW,AR PL UKai TW MBE,AR PL UMing CN,AR PL UMing HK,Microsoft Sans Serif,Tahoma", 1, 1252}, + {0xed3a683b, (FX_LPCWSTR)L"STXinwei", (FX_LPCWSTR)L"Kaiti SC,Songti SC,", 0, 936}, + {0xef264cd1, (FX_LPCWSTR)L"LucidaHandwriting", (FX_LPCWSTR)L"Arial Narrow,Avenir Next Condensed Demi Bold,Avenir Next Condensed,Avenir Next Condensed Medium,STHeiti,Arial Black", 0, 1252}, + {0xf086bca2, (FX_LPCWSTR)L"BaskervilleOldFace", (FX_LPCWSTR)L"STIXNonUnicode,Avenir Next Condensed Heavy,PT Sans", 0, 1252}, + {0xf1028030, (FX_LPCWSTR)L"Mangal", (FX_LPCWSTR)L"Arial Unicode MS,Microsoft Sans Serif,Arial Narrow,Tahoma", 2, 1252}, + {0xf1da7eb9, (FX_LPCWSTR)L"ShowcardGothic", (FX_LPCWSTR)L"Papyrus,Arial Unicode MS,Georgia,American Typewriter", 0, 1252}, + {0xf210f06a, (FX_LPCWSTR)L"ArialMT", (FX_LPCWSTR)L"Arial Unicode MS,Arial Narrow,STIXNonUnicode,Damascus,Avenir Next Condensed Demi Bold,Avenir Next Condensed Medium,Avenir Next Condensed", 0, 1252}, + {0xf477f16a, (FX_LPCWSTR)L"Latha", (FX_LPCWSTR)L"Arial Narrow,Damascus,STIXNonUnicode,American Typewriter", 0, 1252}, + {0xf616f3dd, (FX_LPCWSTR)L"LiSu", (FX_LPCWSTR)L"STHeiti,Heiti TC,STFangsong", 1, 936}, + {0xfa479aa6, (FX_LPCWSTR)L"MicrosoftYaHei", (FX_LPCWSTR)L"Arial Unicode MS", 0, 936}, + {0xfcd19697, (FX_LPCWSTR)L"BookmanOldStyle", (FX_LPCWSTR)L"Geeza Pro,Damascus,Andale Mono,Songti SC,Arial Unicode MS", 0, 1252}, + {0xfe209a82, (FX_LPCWSTR)L"LucidaCalligraphy", (FX_LPCWSTR)L"Kokonor,Damascus,STIXNonUnicode,STHeiti,Arial Black", 0, 1252}, + {0xfef135f8, (FX_LPCWSTR)L"AdobeHeitiStd-Regular", (FX_LPCWSTR)L"Heiti TC,STHeiti", 0, 936}, +}; +#elif _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_ +static const XFA_FONTINFO g_XFAFontsMap[] = { + {0x01d5d33e, (FX_LPCWSTR)L"SimSun", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0x01e4f102, (FX_LPCWSTR)L"YouYuan", (FX_LPCWSTR)L"Droid Sans Fallback", 1, 936}, + {0x030549dc, (FX_LPCWSTR)L"LiSu", (FX_LPCWSTR)L"Droid Sans Fallback", 1, 936}, + {0x032edd44, (FX_LPCWSTR)L"Simhei", (FX_LPCWSTR)L"Droid Sans Fallback", 1, 936}, + {0x03eac6fc, (FX_LPCWSTR)L"PoorRichard-Regular", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback,Droid Arabic Naskh,Droid Sans Ethiopic", 2, 1252}, + {0x03ed90e6, (FX_LPCWSTR)L"Nina", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x077b56b3, (FX_LPCWSTR)L"KingsoftPhoneticPlain", (FX_LPCWSTR)L"Droid Sans Thai,Droid Sans Armenian,Droid Arabic Naskh,Droid Sans Ethiopic,Droid Sans Fallback", 0, 1252}, + {0x078ed524, (FX_LPCWSTR)L"MicrosoftSansSerif", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 1252}, + {0x089b18a9, (FX_LPCWSTR)L"Arial", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 1252}, + {0x0b2cad72, (FX_LPCWSTR)L"MonotypeCorsiva", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 8, 1252}, + {0x0bb003e7, (FX_LPCWSTR)L"Kartika", (FX_LPCWSTR)L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif,Droid Sans Mono", 2, 1252}, + {0x0bb469df, (FX_LPCWSTR)L"VinerHandITC", (FX_LPCWSTR)L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 8, 1252}, + {0x0bc1a851, (FX_LPCWSTR)L"SegoeUI", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 1252}, + {0x0c112ebd, (FX_LPCWSTR)L"KozukaGothicPro-VIM", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x0cfcb9c1, (FX_LPCWSTR)L"AdobeThai", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 847}, + {0x0e7de0f9, (FX_LPCWSTR)L"Playbill", (FX_LPCWSTR)L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif,Droid Sans Mono", 0, 1252}, + {0x0eff47c3, (FX_LPCWSTR)L"STHupo", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0x107ad374, (FX_LPCWSTR)L"Constantia", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252}, + {0x12194c2d, (FX_LPCWSTR)L"KunstlerScript", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 8, 1252}, + {0x135ef6a1, (FX_LPCWSTR)L"MinionProSmBd", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x158c4049, (FX_LPCWSTR)L"Garamond", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252}, + {0x160ecb24, (FX_LPCWSTR)L"STZhongsong", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0x161ed07e, (FX_LPCWSTR)L"MSGothic", (FX_LPCWSTR)L"Droid Sans Fallback", 1, 1252}, + {0x171d1ed1, (FX_LPCWSTR)L"SnapITC-Regular", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x18d1188f, (FX_LPCWSTR)L"Cambria", (FX_LPCWSTR)L"Droid Sans Fallback", 2, 1252}, + {0x18eaf350, (FX_LPCWSTR)L"ArialUnicodeMS", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0x1a92d115, (FX_LPCWSTR)L"MingLiU", (FX_LPCWSTR)L"Droid Sans Fallback", 1, 1252}, + {0x1cc217c6, (FX_LPCWSTR)L"TrebuchetMS", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x1d649596, (FX_LPCWSTR)L"BasemicTimes", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x1e34ee60, (FX_LPCWSTR)L"BellMT", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252}, + {0x1eb36945, (FX_LPCWSTR)L"CooperBlack", (FX_LPCWSTR)L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 2, 1252}, + {0x1ef7787d, (FX_LPCWSTR)L"BatangChe", (FX_LPCWSTR)L"Droid Sans Fallback", 1, 1252}, + {0x20b3bd3a, (FX_LPCWSTR)L"BrushScriptMT", (FX_LPCWSTR)L"Droid Arabic Naskh,Droid Sans Ethiopic", 8, 1252}, + {0x220877aa, (FX_LPCWSTR)L"Candara", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x22135007, (FX_LPCWSTR)L"FreestyleScript-Regular", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 8, 1252}, + {0x251059c3, (FX_LPCWSTR)L"Chiller", (FX_LPCWSTR)L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif", 0, 1252}, + {0x25bed6dd, (FX_LPCWSTR)L"MSReferenceSansSerif", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 1252}, + {0x28154c81, (FX_LPCWSTR)L"Parchment-Regular", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 8, 1252}, + {0x29711eb9, (FX_LPCWSTR)L"STLiti", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0x2b1993b4, (FX_LPCWSTR)L"Basemic", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x2b316339, (FX_LPCWSTR)L"NiagaraSolid-Reg", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x2c147529, (FX_LPCWSTR)L"FootlightMTLight", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x2c198928, (FX_LPCWSTR)L"HarlowSolid", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x2c6ac6b2, (FX_LPCWSTR)L"LucidaBright", (FX_LPCWSTR)L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto", 2, 1252}, + {0x2c9f38e2, (FX_LPCWSTR)L"KozukaMinchoPro-VIR", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x2d5a47b0, (FX_LPCWSTR)L"STCaiyun", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0x2def26bf, (FX_LPCWSTR)L"BernardMT-Condensed", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x2fd8930b, (FX_LPCWSTR)L"KozukaMinchoPr6NR", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x3115525a, (FX_LPCWSTR)L"FangSong_GB2312", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 1252}, + {0x31327817, (FX_LPCWSTR)L"MyriadPro", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x32244975, (FX_LPCWSTR)L"Helvetica", (FX_LPCWSTR)L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto", 0, 1252}, + {0x32ac995c, (FX_LPCWSTR)L"Terminal", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x338d648a, (FX_LPCWSTR)L"NiagaraEngraved-Reg", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x33bb65f2, (FX_LPCWSTR)L"Sylfaen", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252}, + {0x3402c30e, (FX_LPCWSTR)L"MSPMincho", (FX_LPCWSTR)L"Droid Sans Fallback", 2, 1252}, + {0x3412bf31, (FX_LPCWSTR)L"SimSun-PUA", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0x36eb39b9, (FX_LPCWSTR)L"BerlinSansFB", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x36f42055, (FX_LPCWSTR)L"UniversATT", (FX_LPCWSTR)L"Microsoft Sans Serif", 0, 1252}, + {0x3864c4f6, (FX_LPCWSTR)L"HighTowerText", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252}, + {0x3a257d03, (FX_LPCWSTR)L"FangSong_GB2312", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 1252}, + {0x3cdae668, (FX_LPCWSTR)L"FreestyleScript", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 8, 1252}, + {0x3d55aed7, (FX_LPCWSTR)L"Jokerman", (FX_LPCWSTR)L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x3d5b4385, (FX_LPCWSTR)L"PMingLiU", (FX_LPCWSTR)L"Droid Sans Fallback", 2, 1252}, + {0x3d9b7669, (FX_LPCWSTR)L"EstrangeloEdessa", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x3e532d74, (FX_LPCWSTR)L"FranklinGothicMedium", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x3e6aa32d, (FX_LPCWSTR)L"NSimSun", (FX_LPCWSTR)L"Droid Sans Fallback", 1, 936}, + {0x3f6c36a8, (FX_LPCWSTR)L"Gautami", (FX_LPCWSTR)L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x3ff32662, (FX_LPCWSTR)L"Chiller-Regular", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x409de312, (FX_LPCWSTR)L"ModernNo.20", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252}, + {0x41443c5e, (FX_LPCWSTR)L"Georgia", (FX_LPCWSTR)L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 2, 1252}, + {0x4160ade5, (FX_LPCWSTR)L"BellGothicStdBlack", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x421976c4, (FX_LPCWSTR)L"Modern-Regular", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252}, + {0x422a7252, (FX_LPCWSTR)L"Stencil", (FX_LPCWSTR)L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x42c8554f, (FX_LPCWSTR)L"Fixedsys", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x435cb41d, (FX_LPCWSTR)L"Roman", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x47882383, (FX_LPCWSTR)L"CourierNew", (FX_LPCWSTR)L"Droid Sans Fallback", 1, 1252}, + {0x480a2338, (FX_LPCWSTR)L"BerlinSansFBDemi", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x480bf7a4, (FX_LPCWSTR)L"CourierStd", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 1252}, + {0x481ad6ed, (FX_LPCWSTR)L"VladimirScript", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 8, 1252}, + {0x4911577a, (FX_LPCWSTR)L"YouYuan", (FX_LPCWSTR)L"Droid Sans Fallback", 1, 936}, + {0x4a788d72, (FX_LPCWSTR)L"STXingkai", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0x4bf88566, (FX_LPCWSTR)L"SegoeCondensed", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x4ccf51a4, (FX_LPCWSTR)L"BerlinSansFB-Reg", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x4ea967ce, (FX_LPCWSTR)L"GulimChe", (FX_LPCWSTR)L"Droid Sans Fallback", 1, 1252}, + {0x4f68bd79, (FX_LPCWSTR)L"LetterGothicStd", (FX_LPCWSTR)L"Droid Sans Mono,Droid Arabic Naskh,Droid Sans Ethiopic,Droid Sans Mono,Droid Serif,Droid Sans Fallback", 0, 1252}, + {0x51a0d0e6, (FX_LPCWSTR)L"KozukaGothicPr6NM", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x531b3dea, (FX_LPCWSTR)L"BasemicSymbol", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x5333fd39, (FX_LPCWSTR)L"CalifornianFB-Reg", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252}, + {0x53561a54, (FX_LPCWSTR)L"FZYTK--GBK1-0", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0x55e0dde6, (FX_LPCWSTR)L"LucidaSansTypewriter", (FX_LPCWSTR)L"Droid Sans Mono,Droid Arabic Naskh,Droid Sans Ethiopic", 0, 1252}, + {0x574d4d3d, (FX_LPCWSTR)L"AdobeArabic", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x5792e759, (FX_LPCWSTR)L"STKaiti", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0x5921978e, (FX_LPCWSTR)L"LucidaSansUnicode", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 1252}, + {0x594e2da4, (FX_LPCWSTR)L"Vrinda", (FX_LPCWSTR)L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif,Droid Sans Mono", 0, 1252}, + {0x59baa9a2, (FX_LPCWSTR)L"KaiTi_GB2312", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 1252}, + {0x5cfedf4f, (FX_LPCWSTR)L"BaskOldFace", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x5f97921c, (FX_LPCWSTR)L"AdobeMyungjoStdM", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0x5fefbfad, (FX_LPCWSTR)L"Batang", (FX_LPCWSTR)L"Droid Sans Fallback", 2, 1252}, + {0x605342b9, (FX_LPCWSTR)L"DotumChe", (FX_LPCWSTR)L"Droid Sans Fallback", 1, 1252}, + {0x608c5f9a, (FX_LPCWSTR)L"KaiTi_GB2312", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0x61efd0d1, (FX_LPCWSTR)L"MaturaMTScriptCapitals", (FX_LPCWSTR)L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto,Droid Sans Mono", 0, 1252}, + {0x626608a9, (FX_LPCWSTR)L"MVBoli", (FX_LPCWSTR)L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto,Droid Sans Mono", 0, 1252}, + {0x630501a3, (FX_LPCWSTR)L"SmallFonts", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x65d0e2a9, (FX_LPCWSTR)L"FZYTK--GBK1-0", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0x669f29e1, (FX_LPCWSTR)L"FZSTK--GBK1-0", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0x673a9e5f, (FX_LPCWSTR)L"Tunga", (FX_LPCWSTR)L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x691aa4ce, (FX_LPCWSTR)L"NiagaraSolid", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x696259b7, (FX_LPCWSTR)L"Corbel", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x696ee9be, (FX_LPCWSTR)L"STXihei", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0x6c59cf69, (FX_LPCWSTR)L"Dotum", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 1252}, + {0x707fa561, (FX_LPCWSTR)L"Gungsuh", (FX_LPCWSTR)L"Droid Sans Fallback", 2, 1252}, + {0x71416bb2, (FX_LPCWSTR)L"ZWAdobeF", (FX_LPCWSTR)L"Droid Arabic Naskh,Droid Sans Armenian,Droid Sans Ethiopic,Droid Sans Georgian,Droid Sans Hebrew,Droid Sans Thai", 0, 1252}, + {0x71b41801, (FX_LPCWSTR)L"Verdana", (FX_LPCWSTR)L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x73f25e4c, (FX_LPCWSTR)L"PalatinoLinotype", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 1252}, + {0x73f4d19f, (FX_LPCWSTR)L"NiagaraEngraved", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x74001694, (FX_LPCWSTR)L"MyriadProBlack", (FX_LPCWSTR)L"Book Antiqua,Constantia,Dotum,Georgia", 0, 1252}, + {0x74b14d8f, (FX_LPCWSTR)L"Haettenschweiler", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x74cb44ee, (FX_LPCWSTR)L"NSimSun", (FX_LPCWSTR)L"Droid Sans Fallback", 1, 936}, + {0x76b4d7ff, (FX_LPCWSTR)L"Shruti", (FX_LPCWSTR)L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif,Droid Sans Mono", 0, 1252}, + {0x788b3533, (FX_LPCWSTR)L"Webdings", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 6, 42}, + {0x797dde99, (FX_LPCWSTR)L"MSSerif", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x7a0f9e9e, (FX_LPCWSTR)L"MSMincho", (FX_LPCWSTR)L"Droid Sans Fallback", 1, 1252}, + {0x7b439caf, (FX_LPCWSTR)L"OldEnglishTextMT", (FX_LPCWSTR)L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x8213a433, (FX_LPCWSTR)L"LucidaSans-Typewriter", (FX_LPCWSTR)L"Droid Sans Mono,Droid Serif,Roboto,Droid Sans Fallback", 0, 1252}, + {0x82fec929, (FX_LPCWSTR)L"AdobeSongStdL", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0x83581825, (FX_LPCWSTR)L"Modern", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x835a2823, (FX_LPCWSTR)L"Algerian", (FX_LPCWSTR)L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x83dab9f5, (FX_LPCWSTR)L"Script", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x847b56da, (FX_LPCWSTR)L"Tahoma", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 1252}, + {0x8a783cb2, (FX_LPCWSTR)L"SimSun-PUA", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 1252}, + {0x8b5cac0e, (FX_LPCWSTR)L"Onyx", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x8c6a499e, (FX_LPCWSTR)L"Gulim", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 1252}, + {0x8e0af790, (FX_LPCWSTR)L"JuiceITC", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x8e8d43b2, (FX_LPCWSTR)L"Centaur", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252}, + {0x8ee4dcca, (FX_LPCWSTR)L"BookshelfSymbol7", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x90794800, (FX_LPCWSTR)L"BellGothicStdLight", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x909b516a, (FX_LPCWSTR)L"Century", (FX_LPCWSTR)L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 2, 1252}, + {0x92ae370d, (FX_LPCWSTR)L"MSOutlook", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 4, 42}, + {0x93c9fbf1, (FX_LPCWSTR)L"LucidaFax", (FX_LPCWSTR)L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto,Droid Sans Mono", 2, 1252}, + {0x9565085e, (FX_LPCWSTR)L"BookAntiqua", (FX_LPCWSTR)L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 2, 1252}, + {0x9856d95d, (FX_LPCWSTR)L"AdobeMingStdL", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 949}, + {0x9bbadd6b, (FX_LPCWSTR)L"ColonnaMT", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0x9cbd16a4, (FX_LPCWSTR)L"ShowcardGothic-Reg", (FX_LPCWSTR)L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallbac", 0, 1252}, + {0x9d73008e, (FX_LPCWSTR)L"MSSansSerif", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0xa0607db1, (FX_LPCWSTR)L"GungsuhChe", (FX_LPCWSTR)L"Droid Sans Fallback", 1, 1252}, + {0xa0bcf6a1, (FX_LPCWSTR)L"LatinWide", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252}, + {0xa1429b36, (FX_LPCWSTR)L"Symbol", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 6, 42}, + {0xa1fa5abc, (FX_LPCWSTR)L"Wingdings2", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 6, 42}, + {0xa1fa5abd, (FX_LPCWSTR)L"Wingdings3", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 6, 42}, + {0xa427bad4, (FX_LPCWSTR)L"InformalRoman-Regular", (FX_LPCWSTR)L"Droid Arabic Naskh,Droid Sans Ethiopic", 8, 1252}, + {0xa8b92ece, (FX_LPCWSTR)L"FZSTK--GBK1-0", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0xa8d83ece, (FX_LPCWSTR)L"CalifornianFB", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252}, + {0xaa3e082c, (FX_LPCWSTR)L"Kingsoft-Phonetic", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0xaa6bcabe, (FX_LPCWSTR)L"HarlowSolidItalic", (FX_LPCWSTR)L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0xade5337c, (FX_LPCWSTR)L"MSUIGothic", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0xb08dd941, (FX_LPCWSTR)L"WideLatin", (FX_LPCWSTR)L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto,Droid Sans Mono", 2, 1252}, + {0xb207f05d, (FX_LPCWSTR)L"PoorRichard", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252}, + {0xb3bc492f, (FX_LPCWSTR)L"JuiceITC-Regular", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0xb5545399, (FX_LPCWSTR)L"Marlett", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 4, 42}, + {0xb5dd1ebb, (FX_LPCWSTR)L"BritannicBold", (FX_LPCWSTR)L"Droid Arabic Naskh,Droid Sans Ethiopic", 0, 1252}, + {0xb699c1c5, (FX_LPCWSTR)L"LucidaCalligraphy-Italic", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0xb725d629, (FX_LPCWSTR)L"TimesNewRoman", (FX_LPCWSTR)L"Droid Sans Fallback", 2, 1252}, + {0xb7eaebeb, (FX_LPCWSTR)L"AdobeHeitiStdR", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0xbd29c486, (FX_LPCWSTR)L"BerlinSansFBDemi-Bold", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0xbe8a8db4, (FX_LPCWSTR)L"BookshelfSymbolSeven", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0xc16c0118, (FX_LPCWSTR)L"AdobeHebrew", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback,Droid Arabic Naskh,Droid Sans Ethiopic", 0, 1252}, + {0xc318b0af, (FX_LPCWSTR)L"MyriadProLight", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0xc65e5659, (FX_LPCWSTR)L"CambriaMath", (FX_LPCWSTR)L"Droid Sans Fallback", 2, 1252}, + {0xc75c8f05, (FX_LPCWSTR)L"LucidaConsole", (FX_LPCWSTR)L"Droid Sans Mono,Droid Serif,Roboto,Droid Sans Fallback", 1, 1252}, + {0xca7c35d6, (FX_LPCWSTR)L"Calibri", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 1252}, + {0xcb053f53, (FX_LPCWSTR)L"MicrosoftYaHei", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0xcb7190f9, (FX_LPCWSTR)L"Magneto-Bold", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0xcca00cc5, (FX_LPCWSTR)L"System", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0xccad6f76, (FX_LPCWSTR)L"Jokerman-Regular", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0xccc5818c, (FX_LPCWSTR)L"EuroSign", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0xcf3d7234, (FX_LPCWSTR)L"LucidaHandwriting-Italic", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0xcf7b8fdb, (FX_LPCWSTR)L"MinionPro", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0xcfe5755f, (FX_LPCWSTR)L"Simhei", (FX_LPCWSTR)L"Droid Sans Fallback", 1, 936}, + {0xd011f4ee, (FX_LPCWSTR)L"MSPGothic", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 1252}, + {0xd060e7ef, (FX_LPCWSTR)L"Vivaldi", (FX_LPCWSTR)L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 8, 1252}, + {0xd07edec1, (FX_LPCWSTR)L"FranklinGothic-Medium", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0xd107243f, (FX_LPCWSTR)L"SimSun", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0xd1881562, (FX_LPCWSTR)L"ArialNarrow", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0xd22b7dce, (FX_LPCWSTR)L"BodoniMTPosterCompressed", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0xd22bfa60, (FX_LPCWSTR)L"ComicSansMS", (FX_LPCWSTR)L"Droid Serif,Roboto,Droid Sans Fallback", 8, 1252}, + {0xd3bd0e35, (FX_LPCWSTR)L"Bauhaus93", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0xd429ee7a, (FX_LPCWSTR)L"STFangsong", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0xd6679c12, (FX_LPCWSTR)L"BernardMTCondensed", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0xd8e8a027, (FX_LPCWSTR)L"LucidaSans", (FX_LPCWSTR)L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto", 0, 1252}, + {0xd9fe7761, (FX_LPCWSTR)L"HighTowerText-Reg", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252}, + {0xda7e551e, (FX_LPCWSTR)L"STSong", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0xdaa6842d, (FX_LPCWSTR)L"STZhongsong", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0xdaaab93f, (FX_LPCWSTR)L"STFangsong", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0xdaeb0713, (FX_LPCWSTR)L"STSong", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 936}, + {0xdafedbef, (FX_LPCWSTR)L"STCaiyun", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0xdb00a3d9, (FX_LPCWSTR)L"Broadway", (FX_LPCWSTR)L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0xdb1f5ad4, (FX_LPCWSTR)L"STXinwei", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0xdb326e7f, (FX_LPCWSTR)L"STKaiti", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0xdb69595a, (FX_LPCWSTR)L"STHupo", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0xdba0082c, (FX_LPCWSTR)L"STXihei", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0xdbd0ab18, (FX_LPCWSTR)L"STXingkai", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0xdc1a7db1, (FX_LPCWSTR)L"STLiti", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0xdc33075f, (FX_LPCWSTR)L"KristenITC-Regular", (FX_LPCWSTR)L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto", 8, 1252}, + {0xdcc7009c, (FX_LPCWSTR)L"Harrington", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0xdd712466, (FX_LPCWSTR)L"ArialBlack", (FX_LPCWSTR)L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0xdde87b3e, (FX_LPCWSTR)L"Impact", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0xdf69fb32, (FX_LPCWSTR)L"SnapITC", (FX_LPCWSTR)L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto,Droid Sans Mono", 0, 1252}, + {0xdf8b25e8, (FX_LPCWSTR)L"CenturyGothic", (FX_LPCWSTR)L"Droid Serif,Roboto,Droid Serif,Droid Sans Mono", 0, 1252}, + {0xe0f705c0, (FX_LPCWSTR)L"KristenITC", (FX_LPCWSTR)L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto", 8, 1252}, + {0xe1427573, (FX_LPCWSTR)L"Raavi", (FX_LPCWSTR)L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif,Droid Sans Mono", 0, 1252}, + {0xe2cea0cb, (FX_LPCWSTR)L"Magneto", (FX_LPCWSTR)L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto,Droid Sans Mono", 0, 1252}, + {0xe36a9e17, (FX_LPCWSTR)L"Ravie", (FX_LPCWSTR)L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif,Droid Sans Mono", 0, 1252}, + {0xe433f8e2, (FX_LPCWSTR)L"Parchment", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 8, 1252}, + {0xe43dff4a, (FX_LPCWSTR)L"Wingdings", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 4, 42}, + {0xe4e2c405, (FX_LPCWSTR)L"MTExtra", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 6, 42}, + {0xe618cc35, (FX_LPCWSTR)L"InformalRoman", (FX_LPCWSTR)L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif", 8, 1252}, + {0xe6c27ffc, (FX_LPCWSTR)L"Mistral", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 8, 1252}, + {0xe7ebf4b9, (FX_LPCWSTR)L"Courier", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 1252}, + {0xe8bc4a9d, (FX_LPCWSTR)L"MSReferenceSpecialty", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0xe90fb013, (FX_LPCWSTR)L"TempusSansITC", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0xec637b42, (FX_LPCWSTR)L"Consolas", (FX_LPCWSTR)L"Droid Sans Fallback", 1, 1252}, + {0xed3a683b, (FX_LPCWSTR)L"STXinwei", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0xef264cd1, (FX_LPCWSTR)L"LucidaHandwriting", (FX_LPCWSTR)L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto,Droid Sans Mono", 0, 1252}, + {0xf086bca2, (FX_LPCWSTR)L"BaskervilleOldFace", (FX_LPCWSTR)L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0xf1028030, (FX_LPCWSTR)L"Mangal", (FX_LPCWSTR)L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto,Droid Sans Mono", 2, 1252}, + {0xf1da7eb9, (FX_LPCWSTR)L"ShowcardGothic", (FX_LPCWSTR)L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallbac", 0, 1252}, + {0xf210f06a, (FX_LPCWSTR)L"ArialMT", (FX_LPCWSTR)L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif", 0, 1252}, + {0xf477f16a, (FX_LPCWSTR)L"Latha", (FX_LPCWSTR)L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif,Droid Sans Mono", 0, 1252}, + {0xf616f3dd, (FX_LPCWSTR)L"LiSu", (FX_LPCWSTR)L"Droid Sans Fallback", 1, 936}, + {0xfa479aa6, (FX_LPCWSTR)L"MicrosoftYaHei", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, + {0xfcd19697, (FX_LPCWSTR)L"BookmanOldStyle", (FX_LPCWSTR)L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, + {0xfe209a82, (FX_LPCWSTR)L"LucidaCalligraphy", (FX_LPCWSTR)L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto,Droid Sans Mono", 0, 1252}, + {0xfef135f8, (FX_LPCWSTR)L"AdobeHeitiStd-Regular", (FX_LPCWSTR)L"Droid Sans Fallback", 0, 936}, +}; +#endif +void XFA_LocalFontNameToEnglishName(FX_WSTR wsLocalName, CFX_WideString &wsEnglishName) +{ + wsEnglishName = wsLocalName; +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ || _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ || _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ || _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_ + FX_DWORD dwLocalNameHash = FX_HashCode_String_GetW(wsLocalName.GetPtr(), wsLocalName.GetLength(), TRUE); + FX_INT32 iStart = 0; + FX_INT32 iEnd = sizeof(g_XFAFontsMap) / sizeof(XFA_FONTINFO) - 1; + FX_INT32 iMid = 0; + do { + iMid = (iStart + iEnd) / 2; + FX_DWORD dwFontNameHash = g_XFAFontsMap[iMid].dwFontNameHash; + if (dwFontNameHash == dwLocalNameHash) { + wsEnglishName = g_XFAFontsMap[iMid].pPsName; + break; + } else if (dwFontNameHash < dwLocalNameHash) { + iStart = iMid + 1; + } else { + iEnd = iMid - 1; + } + } while (iEnd >= iStart); +#endif +} +const XFA_FONTINFO* XFA_GetFontINFOByFontName(FX_WSTR wsFontName) +{ +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ || _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ || _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ || _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_ + CFX_WideString wsFontNameTemp = wsFontName; + wsFontNameTemp.Remove(L' '); + FX_DWORD dwCurFontNameHash = FX_HashCode_String_GetW(wsFontNameTemp, wsFontNameTemp.GetLength(), TRUE); + FX_INT32 iStart = 0; + FX_INT32 iEnd = sizeof(g_XFAFontsMap) / sizeof(XFA_FONTINFO) - 1; + FX_INT32 iMid = 0; + const XFA_FONTINFO *pFontInfo = NULL; + do { + iMid = (iStart + iEnd) / 2; + FX_DWORD dwFontNameHash = g_XFAFontsMap[iMid].dwFontNameHash; + if (dwFontNameHash == dwCurFontNameHash) { + pFontInfo = &g_XFAFontsMap[iMid]; + break; + } else if (dwFontNameHash < dwCurFontNameHash) { + iStart = iMid + 1; + } else { + iEnd = iMid - 1; + } + } while (iEnd >= iStart); + return pFontInfo; +#else + return NULL; +#endif +} +IXFA_FontMgr* XFA_GetDefaultFontMgr() +{ + return FX_NEW CXFA_DefFontMgr; +} +CXFA_DefFontMgr::~CXFA_DefFontMgr() +{ + FX_INT32 iCounts = m_CacheFonts.GetSize(); + for (FX_INT32 i = 0; i < iCounts; i++) { + ((IFX_Font*)m_CacheFonts[i])->Release(); + } + m_CacheFonts.RemoveAll(); +} +#define _FXFA_USEGASFONTMGR_ +IFX_Font* CXFA_DefFontMgr::GetFont(XFA_HDOC hDoc, FX_WSTR wsFontFamily, FX_DWORD dwFontStyles, FX_WORD wCodePage ) +{ + CFX_WideString wsFontName = wsFontFamily; + IFX_FontMgr* pFDEFontMgr = ((CXFA_FFDoc*)hDoc)->GetApp()->GetFDEFontMgr(); +#ifdef _FXFA_USEGASFONTMGR_ + const XFA_FONTINFO *pCurFont = NULL; + FX_BOOL bGetFontInfo = TRUE; + IFX_Font* pFont = pFDEFontMgr->LoadFont((FX_LPCWSTR)wsFontName, dwFontStyles, wCodePage); +#else + const XFA_FONTINFO *pCurFont = XFA_GetFontINFOByFontName(wsFontName); + FX_BOOL bGetFontInfo = FALSE; + IFX_Font* pFont = IFX_Font::LoadFont((FX_LPCWSTR)wsFontName, dwFontStyles | FX_FONTSTYLE_ExactMatch, pCurFont ? pCurFont->wCodePage : wCodePage, pFDEFontMgr); +#endif + if (!pFont && hDoc) { + if (bGetFontInfo) { + pCurFont = XFA_GetFontINFOByFontName(wsFontName); + } + if (pCurFont != NULL && pCurFont->pReplaceFont != NULL) { + FX_DWORD dwStyle = 0; + if (dwFontStyles & FX_FONTSTYLE_Bold) { + dwStyle |= FX_FONTSTYLE_Bold; + } + if (dwFontStyles & FX_FONTSTYLE_Italic) { + dwStyle |= FX_FONTSTYLE_Italic; + } + FX_LPCWSTR pReplace = pCurFont->pReplaceFont; + FX_INT32 iLength = FXSYS_wcslen(pReplace); + while (iLength > 0) { + FX_LPCWSTR pNameText = pReplace; + while (*pNameText != L',' && iLength > 0) { + pNameText++; + iLength--; + } + CFX_WideString wsReplace = CFX_WideString(pReplace, pNameText - pReplace); +#ifdef _FXFA_USEGASFONTMGR_ + pFont = pFDEFontMgr->LoadFont(wsReplace, dwStyle, wCodePage); +#else + pFont = IFX_Font::LoadFont((FX_LPCWSTR)wsReplace, dwStyle | FX_FONTSTYLE_ExactMatch, pCurFont->wCodePage, pFDEFontMgr); +#endif + if (pFont != NULL) { + break; + } + iLength--; + pNameText++; + pReplace = pNameText; + } + } + } + if (pFont) { + m_CacheFonts.Add(pFont); + } + return pFont; +} +IFX_Font* CXFA_DefFontMgr::GetDefaultFont(XFA_HDOC hDoc, FX_WSTR wsFontFamily, FX_DWORD dwFontStyles, FX_WORD wCodePage) +{ + IFX_FontMgr* pFDEFontMgr = ((CXFA_FFDoc*)hDoc)->GetApp()->GetFDEFontMgr(); +#ifdef _FXFA_USEGASFONTMGR_ + IFX_Font* pFont = pFDEFontMgr->LoadFont((FX_LPCWSTR)L"Arial Narrow", dwFontStyles, wCodePage); +#else + const XFA_FONTINFO *pCurFont = XFA_GetFontINFOByFontName(wsFontFamily); + IFX_Font* pFont = IFX_Font::LoadFont((FX_LPCWSTR)L"Arial Narrow", dwFontStyles, pCurFont ? pCurFont->wCodePage : 1252, pFDEFontMgr); +#endif + if (!pFont) +#ifdef _FXFA_USEGASFONTMGR_ + pFont = pFDEFontMgr->LoadFont((FX_LPCWSTR)NULL, dwFontStyles, wCodePage); +#else + pFont = IFX_Font::LoadFont((FX_LPCWSTR)NULL, dwFontStyles, pCurFont ? pCurFont->wCodePage : 1252, pFDEFontMgr); +#endif + FXSYS_assert(pFont != NULL); + if (pFont) { + m_CacheFonts.Add(pFont); + } + return pFont; +} +struct XFA_PDFFONTNAME { + FX_LPCSTR lpPsName; + FX_LPCSTR lpNormal; + FX_LPCSTR lpBold; + FX_LPCSTR lpItalic; + FX_LPCSTR lpBoldItalic; +}; +const XFA_PDFFONTNAME g_XFAPDFFontName[] = { + {"Adobe PI Std", "AdobePIStd", "AdobePIStd", "AdobePIStd", "AdobePIStd"}, + {"Myriad Pro Light", "MyriadPro-Light", "MyriadPro-Semibold", "MyriadPro-LightIt", "MyriadPro-SemiboldIt"}, +}; +CXFA_PDFFontMgr::CXFA_PDFFontMgr(CXFA_FFDoc* pDoc) +{ + m_pDoc = pDoc; +} +CXFA_PDFFontMgr::~CXFA_PDFFontMgr() +{ + FX_POSITION ps = m_FDE2PDFFont.GetStartPosition(); + while (ps) { + IFX_Font* pFDEFont; + void* pPDFFont; + m_FDE2PDFFont.GetNextAssoc(ps, (void*&)pFDEFont, pPDFFont); + pFDEFont->SetFontProvider(NULL); + } + m_FDE2PDFFont.RemoveAll(); + ps = m_FontArray.GetStartPosition(); + while (ps) { + CFX_ByteString strKey; + IFX_Font* pFont = NULL; + m_FontArray.GetNextAssoc(ps, strKey, (void*&)pFont); + if (pFont != NULL) { + pFont->Release(); + } + } + m_FontArray.RemoveAll(); +} +IFX_Font* CXFA_PDFFontMgr::FindFont(CFX_ByteString strPsName, FX_BOOL bBold, FX_BOOL bItalic, CPDF_Font** pDstPDFFont, FX_BOOL bStrictMatch) +{ + CPDF_Document* pDoc = m_pDoc->GetPDFDoc(); + if (pDoc == NULL) { + return NULL; + } + CPDF_Dictionary* pFontSetDict = pDoc->GetRoot()->GetDict(FX_BSTRC("AcroForm"))->GetDict(FX_BSTRC("DR")); + if (!pFontSetDict) { + return NULL; + } + pFontSetDict = (CPDF_Dictionary*)pFontSetDict->GetDict(FX_BSTRC("Font")); + if (!pFontSetDict) { + return NULL; + } + strPsName.Remove(' '); + IFX_FontMgr* pFDEFontMgr = m_pDoc->GetApp()->GetFDEFontMgr(); + FX_POSITION pos = pFontSetDict->GetStartPos(); + while (pos) { + CFX_ByteString key; + CPDF_Object* pObj = pFontSetDict->GetNextElement(pos, key); + if (!PsNameMatchDRFontName(strPsName, bBold, bItalic, key, bStrictMatch)) { + continue; + } + CPDF_Object* pDirect = pObj->GetDirect(); + if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) { + return NULL; + } + CPDF_Dictionary* pFontDict = (CPDF_Dictionary*)pDirect; + if (pFontDict->GetString("Type") != FX_BSTRC("Font")) { + return NULL; + } + CPDF_Font* pPDFFont = pDoc->LoadFont(pFontDict); + if (!pPDFFont) { + return NULL; + } + if (!pPDFFont->IsEmbedded()) { + *pDstPDFFont = pPDFFont; + return NULL; + } + return IFX_Font::LoadFont(&pPDFFont->m_Font, pFDEFontMgr); + } + return NULL; +} +IFX_Font* CXFA_PDFFontMgr::GetFont(FX_WSTR wsFontFamily, FX_DWORD dwFontStyles, CPDF_Font** pPDFFont, FX_BOOL bStrictMatch ) +{ + FX_DWORD dwHashCode = FX_HashCode_String_GetW(wsFontFamily.GetPtr(), wsFontFamily.GetLength()); + CFX_ByteString strKey; + IFX_Font* pFont = NULL; + strKey.Format("%u%u", dwHashCode, dwFontStyles); + if (m_FontArray.Lookup(strKey, (void*&)pFont)) { + return pFont; + } + CFX_ByteString bsPsName; + bsPsName = CFX_ByteString::FromUnicode(wsFontFamily); + FX_BOOL bBold = (dwFontStyles & FX_FONTSTYLE_Bold) == FX_FONTSTYLE_Bold; + FX_BOOL bItalic = (dwFontStyles & FX_FONTSTYLE_Italic) == FX_FONTSTYLE_Italic; + CFX_ByteString strFontName = PsNameToFontName(bsPsName, bBold, bItalic); + pFont = FindFont(strFontName, bBold, bItalic, pPDFFont, bStrictMatch); + if (pFont) { + m_FontArray.SetAt(strKey, pFont); + } + return pFont; +} +CFX_ByteString CXFA_PDFFontMgr::PsNameToFontName(const CFX_ByteString& strPsName, + FX_BOOL bBold, FX_BOOL bItalic) +{ + FX_INT32 nCount = sizeof(g_XFAPDFFontName) / sizeof(XFA_PDFFONTNAME); + for (FX_INT32 i = 0; i < nCount; i++) { + if (strPsName == g_XFAPDFFontName[i].lpPsName) { + FX_INT32 index = 1 + ((bItalic << 1) | bBold); + return *(&g_XFAPDFFontName[i].lpPsName + index); + } + } + return strPsName; +} +FX_BOOL CXFA_PDFFontMgr::PsNameMatchDRFontName(FX_BSTR bsPsName, FX_BOOL bBold, FX_BOOL bItalic, const CFX_ByteString& bsDRFontName, FX_BOOL bStrictMatch) +{ + CFX_ByteString bsDRName = bsDRFontName; + bsDRName.Remove('-'); + FX_INT32 iPsLen = bsPsName.GetLength(); + FX_INT32 nIndex = bsDRName.Find(bsPsName); + if (nIndex != -1 && !bStrictMatch) { + return TRUE; + } + if (nIndex != 0) { + return FALSE; + } + FX_INT32 iDifferLength = bsDRName.GetLength() - iPsLen; + if (iDifferLength > 1 || (bBold || bItalic)) { + FX_INT32 iBoldIndex = bsDRName.Find(FX_BSTRC("Bold")); + FX_BOOL bBoldFont = iBoldIndex > 0; + if (bBold ^ bBoldFont) { + return FALSE; + } + if (bBoldFont) { + iDifferLength = FX_MIN(iDifferLength - 4, bsDRName.GetLength() - iBoldIndex - 4); + } + FX_BOOL bItalicFont = TRUE; + if (bsDRName.Find(FX_BSTRC("Italic")) > 0) { + iDifferLength -= 6; + } else if (bsDRName.Find(FX_BSTRC("It")) > 0) { + iDifferLength -= 2; + } else if (bsDRName.Find(FX_BSTRC("Oblique")) > 0) { + iDifferLength -= 7; + } else { + bItalicFont = FALSE; + } + if (bItalic ^ bItalicFont) { + return FALSE; + } + if (iDifferLength > 1) { + CFX_ByteString bsDRTailer = bsDRName.Right(iDifferLength); + if (bsDRTailer.Equal(FX_BSTRC("MT")) || bsDRTailer.Equal(FX_BSTRC("PSMT")) || bsDRTailer.Equal(FX_BSTRC("Regular")) || bsDRTailer.Equal(FX_BSTRC("Reg"))) { + return TRUE; + } + if (bBoldFont || bItalicFont) { + return FALSE; + } + FX_BOOL bMatch = FALSE; + switch (bsPsName.GetAt(iPsLen - 1)) { + case 'L': { + if (bsDRName.Right(5).Equal(FX_BSTRC("Light"))) { + bMatch = TRUE; + } + } + break; + case 'R': { + if ( bsDRName.Right(7).Equal(FX_BSTRC("Regular")) || bsDRName.Right(3).Equal(FX_BSTRC("Reg"))) { + bMatch = TRUE; + } + } + break; + case 'M': { + if (bsDRName.Right(5).Equal(FX_BSTRC("Medium"))) { + bMatch = TRUE; + } + } + break; + default: + break; + } + return bMatch; + } + } + return TRUE; +} +FX_BOOL CXFA_PDFFontMgr::GetCharWidth(IFX_Font* pFont, FX_WCHAR wUnicode, FX_INT32 &iWidth, FX_BOOL bCharCode) +{ + if (wUnicode != 0x20 || bCharCode) { + return FALSE; + } + CPDF_Font* pPDFFont = (CPDF_Font*)m_FDE2PDFFont.GetValueAt(pFont); + if (!pPDFFont) { + return FALSE; + } + wUnicode = (FX_WCHAR)pPDFFont->CharCodeFromUnicode(wUnicode); + iWidth = pPDFFont->GetCharWidthF(wUnicode); + return TRUE; +} +CXFA_FontMgr::CXFA_FontMgr() + : m_pDefFontMgr(NULL) +{ +} +CXFA_FontMgr::~CXFA_FontMgr() +{ + DelAllMgrMap(); +} +IFX_Font* CXFA_FontMgr::GetFont(XFA_HDOC hDoc, FX_WSTR wsFontFamily, FX_DWORD dwFontStyles, + FX_WORD wCodePage ) +{ + FX_DWORD dwHash = FX_HashCode_String_GetW(wsFontFamily.GetPtr(), wsFontFamily.GetLength(), FALSE); + CFX_ByteString bsKey; + bsKey.Format("%u%u%u", dwHash, dwFontStyles, wCodePage); + IFX_Font* pFont = NULL; + if (m_FontArray.Lookup(bsKey, (void*&)pFont)) { + return pFont; + } + CFX_WideString wsEnglishName; + XFA_LocalFontNameToEnglishName(wsFontFamily, wsEnglishName); + CXFA_PDFFontMgr* pMgr = (CXFA_PDFFontMgr*)m_PDFFontMgrArray.GetValueAt(hDoc); + CPDF_Font* pPDFFont = NULL; + if (pMgr != NULL) { + pFont = pMgr->GetFont(wsEnglishName, dwFontStyles, &pPDFFont); + if (pFont) { + return pFont; + } + } + if (pFont == NULL && m_pDefFontMgr != NULL) { + pFont = m_pDefFontMgr->GetFont(hDoc, wsFontFamily, dwFontStyles, wCodePage); + } + if (pFont == NULL && pMgr != NULL) { + pPDFFont = NULL; + pFont = pMgr->GetFont(wsEnglishName, dwFontStyles, &pPDFFont, FALSE); + if (pFont) { + return pFont; + } + } + if (pFont == NULL && m_pDefFontMgr != NULL) { + pFont = m_pDefFontMgr->GetDefaultFont(hDoc, wsFontFamily, dwFontStyles, wCodePage); + } + FXSYS_assert(pFont != NULL); + if (pFont) { + if (pPDFFont) { + pMgr->m_FDE2PDFFont.SetAt(pFont, pPDFFont); + pFont->SetFontProvider(pMgr); + } + m_FontArray.SetAt(bsKey, pFont); + } + return pFont; +} +void CXFA_FontMgr::LoadDocFonts(XFA_HDOC hDoc) +{ + if (!m_PDFFontMgrArray.GetValueAt(hDoc)) { + m_PDFFontMgrArray.SetAt(hDoc, FX_NEW CXFA_PDFFontMgr((CXFA_FFDoc*)hDoc)); + } +} +void CXFA_FontMgr::ReleaseDocFonts(XFA_HDOC hDoc) +{ + CXFA_PDFFontMgr* pMgr = NULL; + if (m_PDFFontMgrArray.Lookup(hDoc, (void*&)pMgr)) { + if (pMgr != NULL) { + delete pMgr; + } + m_PDFFontMgrArray.RemoveKey(hDoc); + } +} +void CXFA_FontMgr::DelAllMgrMap() +{ + FX_POSITION ps = m_PDFFontMgrArray.GetStartPosition(); + while (ps) { + XFA_HDOC hDoc = NULL; + CXFA_PDFFontMgr* pMgr = NULL; + m_PDFFontMgrArray.GetNextAssoc(ps, (void*&)hDoc, (void*&)pMgr); + if (pMgr != NULL) { + delete pMgr; + } + } + m_PDFFontMgrArray.RemoveAll(); + m_FontArray.RemoveAll(); +} +void CXFA_FontMgr::SetDefFontMgr(IXFA_FontMgr* pFontMgr) +{ + m_pDefFontMgr = pFontMgr; +} diff --git a/xfa/src/fxfa/src/app/xfa_fontmgr.h b/xfa/src/fxfa/src/app/xfa_fontmgr.h new file mode 100644 index 0000000000..b5781c4954 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_fontmgr.h @@ -0,0 +1,62 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FXFA_FORMFILLER_FONTMGR_IMP_H +#define _FXFA_FORMFILLER_FONTMGR_IMP_H +struct XFA_FONTINFO { + FX_DWORD dwFontNameHash; + FX_LPCWSTR pPsName; + FX_LPCWSTR pReplaceFont; + FX_WORD dwStyles; + FX_WORD wCodePage; +}; +class CXFA_DefFontMgr : public IXFA_FontMgr, public CFX_Object +{ +public: + CXFA_DefFontMgr() {} + virtual ~CXFA_DefFontMgr(); + virtual void Release() + { + delete this; + } + virtual IFX_Font* GetFont(XFA_HDOC hDoc, FX_WSTR wsFontFamily, FX_DWORD dwFontStyles, FX_WORD wCodePage = 0xFFFF); + virtual IFX_Font* GetDefaultFont(XFA_HDOC hDoc, FX_WSTR wsFontFamily, FX_DWORD dwFontStyles, FX_WORD wCodePage = 0xFFFF); +protected: + CFX_PtrArray m_CacheFonts; +}; +class CXFA_PDFFontMgr : public IFX_FontProvider, public CFX_Object +{ +public: + CXFA_PDFFontMgr(CXFA_FFDoc* pDoc); + ~CXFA_PDFFontMgr(); + IFX_Font* GetFont(FX_WSTR wsFontFamily, FX_DWORD dwFontStyles, CPDF_Font** pPDFFont, FX_BOOL bStrictMatch = TRUE); + FX_BOOL GetCharWidth(IFX_Font* pFont, FX_WCHAR wUnicode, FX_INT32 &iWidth, FX_BOOL bCharCode); + CFX_MapPtrToPtr m_FDE2PDFFont; +protected: + IFX_Font* FindFont(CFX_ByteString strFamilyName, FX_BOOL bBold, FX_BOOL bItalic, CPDF_Font** pPDFFont, FX_BOOL bStrictMatch = TRUE); + CFX_ByteString PsNameToFontName(const CFX_ByteString& strPsName, FX_BOOL bBold, FX_BOOL bItalic); + FX_BOOL PsNameMatchDRFontName(FX_BSTR bsPsName, FX_BOOL bBold, FX_BOOL bItalic, const CFX_ByteString& bsDRFontName, FX_BOOL bStrictMatch = TRUE); + CXFA_FFDoc* m_pDoc; + CFX_CMapByteStringToPtr m_FontArray; +}; +class CXFA_FontMgr : public CFX_Object +{ +public: + CXFA_FontMgr(); + ~CXFA_FontMgr(); + IFX_Font* GetFont(XFA_HDOC hDoc, FX_WSTR wsFontFamily, FX_DWORD dwFontStyles, + FX_WORD wCodePage = 0xFFFF); + void LoadDocFonts(XFA_HDOC hDoc); + void ReleaseDocFonts(XFA_HDOC hDoc); + + void SetDefFontMgr(IXFA_FontMgr* pFontMgr); +protected: + void DelAllMgrMap(); + CFX_MapPtrToPtr m_PDFFontMgrArray; + IXFA_FontMgr* m_pDefFontMgr; + CFX_CMapByteStringToPtr m_FontArray; +}; +#endif diff --git a/xfa/src/fxfa/src/app/xfa_fwladapter.cpp b/xfa/src/fxfa/src/app/xfa_fwladapter.cpp new file mode 100644 index 0000000000..035fa02310 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_fwladapter.cpp @@ -0,0 +1,80 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_common.h" +#include "xfa_fwladapter.h" +#include "xfa_ffwidget.h" +#include "xfa_fffield.h" +#include "xfa_ffdoc.h" +IFWL_AdapterNative * FWL_CreateFuelAdapterNative() +{ + return NULL; +} +void FWL_ReleaseFuelAdapterNative(IFWL_AdapterNative * native) +{ +} +void FWL_PostMessageToMainRoop(CFWL_Message *pMessage) +{ +} +IFWL_AdapterSemaphore * IFWL_AdapterSemaphore::Create() +{ + return NULL; +} +FX_BOOL FWL_ShowCaret(IFWL_Widget *pWidget, FX_BOOL bVisible, const CFX_RectF *pRtAnchor) +{ + CXFA_FFWidget* pXFAWidget = (CXFA_FFWidget*)pWidget->GetPrivateData(pWidget); + if (!pXFAWidget) { + return FALSE; + } + IXFA_DocProvider* pDocProvider = pXFAWidget->GetDoc()->GetDocProvider(); + if (!pDocProvider) { + return FALSE; + } + if (bVisible) { + CFX_Matrix mt; + pXFAWidget->GetRotateMatrix(mt); + CFX_RectF rt(*pRtAnchor); + mt.TransformRect(rt); + pDocProvider->DisplayCaret((XFA_HWIDGET)pXFAWidget, bVisible, &rt); + return TRUE; + } + pDocProvider->DisplayCaret((XFA_HWIDGET)pXFAWidget, bVisible, pRtAnchor); + return TRUE; +} +FWL_ERR CXFA_FWLAdapterWidgetMgr::RepaintWidget(IFWL_Widget *pWidget, const CFX_RectF *pRect) +{ + _FWL_RETURN_VALUE_IF_FAIL(pWidget, FWL_ERR_Indefinite); + CXFA_FFField *pField = (CXFA_FFField*)pWidget->GetPrivateData(pWidget); + _FWL_RETURN_VALUE_IF_FAIL(pField, FWL_ERR_Indefinite); +#ifdef _XFA_EMB + CFX_RectF rtInvalidate; + pWidget->GetWidgetRect(rtInvalidate); + if (pRect) { + rtInvalidate.left += pRect->left; + rtInvalidate.top += pRect->top; + rtInvalidate.width = pRect->width; + rtInvalidate.height = pRect->height; + } + CFX_Matrix mt; + pField->GetRotateMatrix(mt); + mt.TransformRect(rtInvalidate); + pField->AddInvalidateRect(&rtInvalidate); +#else + pField->AddInvalidateRect(NULL); +#endif + return FWL_ERR_Succeeded; +} +FX_BOOL CXFA_FWLAdapterWidgetMgr::GetPopupPos(IFWL_Widget* pWidget, FX_FLOAT fMinHeight, FX_FLOAT fMaxHeight, const CFX_RectF &rtAnchor, CFX_RectF &rtPopup) +{ + CXFA_FFWidget* pFFWidget = (CXFA_FFWidget*)(pWidget->GetPrivateData(pWidget)); + CFX_Matrix mt; + pFFWidget->GetRotateMatrix(mt); + CFX_RectF rtRotateAnchor(rtAnchor); + mt.TransformRect(rtRotateAnchor); + pFFWidget->GetDoc()->GetDocProvider()->GetPopupPos((XFA_HWIDGET)pFFWidget, fMinHeight, fMaxHeight, rtRotateAnchor, rtPopup); + return TRUE; +} diff --git a/xfa/src/fxfa/src/app/xfa_fwladapter.h b/xfa/src/fxfa/src/app/xfa_fwladapter.h new file mode 100644 index 0000000000..8e830142c4 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_fwladapter.h @@ -0,0 +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 + +#ifndef _XFA_FWL_ADAPTER_IMP_H +#define _XFA_FWL_ADAPTER_IMP_H +class CXFA_FWLAdapterWidgetMgr : public CFWL_SDAdapterWidgetMgr +{ +public: + virtual FWL_ERR RepaintWidget(IFWL_Widget *pWidget, const CFX_RectF *pRect); + virtual FX_BOOL GetPopupPos(IFWL_Widget* pWidget, FX_FLOAT fMinHeight, FX_FLOAT fMaxHeight, const CFX_RectF &rtAnchor, CFX_RectF &rtPopup); +}; +class IXFA_FWLEventHandler +{ +public: + virtual FX_BOOL GetPopupPos(IFWL_Widget *pWidget, FX_FLOAT fMinPopup, FX_FLOAT fMaxPopup, + const CFX_RectF &rtAnchor, CFX_RectF& rtPopup) + { + return FALSE; + } + virtual void OnPreOpen(IFWL_Widget *pWidget) {} + virtual void OnPostOpen(IFWL_Widget *pWidget) {} + virtual void OnSelectChanged(IFWL_Widget *pWidget, FX_INT32 iYear, FX_INT32 iMonth, FX_INT32 iDay) {} + virtual void OnTextChanged(IFWL_Widget *pWidget, const CFX_WideString &wsChanged) {} + virtual void OnTextFull(IFWL_Widget *pWidget) {} + virtual FX_BOOL OnValidate(IFWL_Widget *pWidget, CFX_WideString &wsText) + { + return FALSE; + } + virtual void OnSelectChanged(IFWL_Widget *pWidget, const CFX_Int32Array &arrSels) {} + virtual void OnAddDoRecord(IFWL_Widget *pWidget) {} + virtual CXFA_Edge GetComboSplitColor(IFWL_Widget *pWidget) + { + return CXFA_Edge(NULL); + } + virtual void GetUIMargin(CFX_RectF &rtMargin) {} + virtual FX_BOOL CheckWord(FX_BSTR sWord) + { + return TRUE; + } + virtual FX_BOOL GetSuggestWords(FX_BSTR sWord, CFX_ByteStringArray &sSuggest) + { + return FALSE; + } +}; +#endif diff --git a/xfa/src/fxfa/src/app/xfa_fwltheme.cpp b/xfa/src/fxfa/src/app/xfa_fwltheme.cpp new file mode 100644 index 0000000000..7456e892db --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_fwltheme.cpp @@ -0,0 +1,412 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_common.h" +#include "xfa_fwltheme.h" +#include "xfa_ffwidget.h" +#include "xfa_ffapp.h" +CXFA_FFWidget* XFA_ThemeGetOuterWidget(IFWL_Widget* pWidget) +{ + IFWL_Widget* pOuter = pWidget; + while (pOuter->GetOuter()) { + pOuter = pOuter->GetOuter(); + } + if (pOuter) { + return (CXFA_FFWidget*)pOuter->GetPrivateData(pOuter); + } + return NULL; +} +CXFA_FWLTheme::CXFA_FWLTheme(CXFA_FFApp *pApp) + : m_pApp(pApp) +{ + m_pTextOut = NULL; + m_dwCapacity = 0; + m_fCapacity = 0; + m_pCalendarFont = NULL; + m_Rect.Set(0, 0, 0, 0); + m_SizeAboveBelow.Set(0, 0); + m_pCheckBoxTP = FX_NEW CXFA_FWLCheckBoxTP; + m_pListBoxTP = FX_NEW CFWL_ListBoxTP; + m_pPictureBoxTP = FX_NEW CFWL_PictureBoxTP; + m_pSrollBarTP = FX_NEW CFWL_ScrollBarTP; + m_pEditTP = FX_NEW CXFA_FWLEditTP; + m_pComboBoxTP = FX_NEW CFWL_ComboBoxTP; + m_pMonthCalendarTP = FX_NEW CFWL_MonthCalendarTP; + m_pDateTimePickerTP = FX_NEW CFWL_DateTimePickerTP; + m_pPushButtonTP = FX_NEW CFWL_PushButtonTP; + m_pCaretTP = FX_NEW CFWL_CaretTP; + m_pBarcodeTP = FX_NEW CFWL_BarcodeTP; + Initialize(); +} +CXFA_FWLTheme::~CXFA_FWLTheme() +{ + Finalize(); + delete m_pCheckBoxTP; + delete m_pListBoxTP; + delete m_pPictureBoxTP; + delete m_pSrollBarTP; + delete m_pEditTP; + delete m_pComboBoxTP; + delete m_pMonthCalendarTP; + delete m_pDateTimePickerTP; + delete m_pPushButtonTP; + delete m_pCaretTP; + delete m_pBarcodeTP; +} +static FX_LPCWSTR g_FWLTheme_CalFonts[] = { + (FX_LPCWSTR)L"Arial", + (FX_LPCWSTR)L"Courier New", + (FX_LPCWSTR)L"DejaVu Sans", +}; +FWL_ERR CXFA_FWLTheme::Initialize() +{ + m_pTextOut = IFDE_TextOut::Create(); + for (FX_INT32 i = 0; NULL == m_pCalendarFont && i < sizeof(g_FWLTheme_CalFonts) / sizeof(FX_LPCWSTR); i++) { + m_pCalendarFont = IFX_Font::LoadFont(g_FWLTheme_CalFonts[i], 0, 0, m_pApp->GetFDEFontMgr()); + } + if (NULL == m_pCalendarFont) +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + m_pCalendarFont = m_pApp->GetFDEFontMgr()->GetDefFontByCodePage(FX_CODEPAGE_MSWin_WesternEuropean, 0, NULL); +#else + m_pCalendarFont = m_pApp->GetFDEFontMgr()->GetFontByCodePage(FX_CODEPAGE_MSWin_WesternEuropean, 0, NULL); +#endif + FXSYS_assert(NULL != m_pCalendarFont); + FWLTHEME_Init(); + return FWL_ERR_Succeeded; +} +FWL_ERR CXFA_FWLTheme::Finalize() +{ + if (m_pTextOut) { + m_pTextOut->Release(); + m_pTextOut = NULL; + } + if (m_pCalendarFont) { + m_pCalendarFont->Release(); + m_pCalendarFont = NULL; + } + FWLTHEME_Release(); + return FWL_ERR_Succeeded; +} +FX_BOOL CXFA_FWLTheme::IsValidWidget(IFWL_Widget *pWidget) +{ + return TRUE; +} +FX_DWORD CXFA_FWLTheme::GetThemeID(IFWL_Widget *pWidget) +{ + return 0; +} +FX_DWORD CXFA_FWLTheme::SetThemeID(IFWL_Widget *pWidget, FX_DWORD dwThemeID, FX_BOOL bChildren ) +{ + return 0; +} +FX_BOOL CXFA_FWLTheme::DrawBackground(CFWL_ThemeBackground *pParams) +{ + return GetTheme(pParams->m_pWidget)->DrawBackground(pParams); +} +FX_BOOL CXFA_FWLTheme::DrawText(CFWL_ThemeText *pParams) +{ + if (pParams->m_wsText.IsEmpty()) { + return FWL_ERR_Indefinite; + } + if (pParams->m_pWidget->GetClassID() == FWL_CLASSHASH_MonthCalendar) { + CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pParams->m_pWidget); + if (!pWidget) { + return FWL_ERR_Indefinite; + } + m_pTextOut->SetStyles(pParams->m_dwTTOStyles); + m_pTextOut->SetAlignment(pParams->m_iTTOAlign); + m_pTextOut->SetFont(m_pCalendarFont); + m_pTextOut->SetFontSize(FWLTHEME_CAPACITY_FontSize); + m_pTextOut->SetTextColor(FWLTHEME_CAPACITY_TextColor); + if ((pParams->m_iPart == FWL_PART_MCD_DatesIn) && !(pParams->m_dwStates & FWL_ITEMSTATE_MCD_Flag) && + (pParams->m_dwStates & (FWL_PARTSTATE_MCD_Hovered | FWL_PARTSTATE_MCD_Selected))) { + m_pTextOut->SetTextColor(0xFFFFFFFF); + } + if (pParams->m_iPart == FWL_PART_MCD_Caption) { + if (m_pMonthCalendarTP->GetThemeID(pParams->m_pWidget) == 0 ) { + m_pTextOut->SetTextColor(ArgbEncode(0xff, 0, 153, 255)); + } else { + m_pTextOut->SetTextColor(ArgbEncode(0xff, 128, 128, 0)); + } + } + CFX_Graphics *pGraphics = pParams->m_pGraphics; + CFX_RenderDevice *pRenderDevice = pGraphics->GetRenderDevice(); + _FWL_RETURN_VALUE_IF_FAIL(pRenderDevice, FALSE); + m_pTextOut->SetRenderDevice(pRenderDevice); + CFX_Matrix mtPart = pParams->m_matrix; + CFX_Matrix *pMatrix = pGraphics->GetMatrix(); + if (pMatrix) { + mtPart.Concat(*pMatrix); + } + m_pTextOut->SetMatrix(mtPart); + m_pTextOut->DrawLogicText(pParams->m_wsText, pParams->m_wsText.GetLength(), pParams->m_rtPart); + return TRUE; + } + CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pParams->m_pWidget); + if (!pWidget) { + return FWL_ERR_Indefinite; + } + CXFA_WidgetAcc* pAcc = pWidget->GetDataAcc(); + CFX_Graphics *pGraphics = pParams->m_pGraphics; + CFX_RenderDevice *pRenderDevice = pGraphics->GetRenderDevice(); + _FWL_RETURN_VALUE_IF_FAIL(pRenderDevice, FALSE); + m_pTextOut->SetRenderDevice(pRenderDevice); + m_pTextOut->SetStyles(pParams->m_dwTTOStyles); + m_pTextOut->SetAlignment(pParams->m_iTTOAlign); + m_pTextOut->SetFont(pAcc->GetFDEFont()); + m_pTextOut->SetFontSize(pAcc->GetFontSize()); + m_pTextOut->SetTextColor(pAcc->GetTextColor()); + CFX_Matrix mtPart = pParams->m_matrix; + CFX_Matrix *pMatrix = pGraphics->GetMatrix(); + if (pMatrix) { + mtPart.Concat(*pMatrix); + } + m_pTextOut->SetMatrix(mtPart); + m_pTextOut->DrawLogicText(pParams->m_wsText, pParams->m_wsText.GetLength(), pParams->m_rtPart); + return TRUE; +} +FX_LPVOID CXFA_FWLTheme::GetCapacity(CFWL_ThemePart *pThemePart, FX_DWORD dwCapacity) +{ + switch(dwCapacity) { + case FWL_WGTCAPACITY_Font: { + if (CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pThemePart->m_pWidget)) { + return pWidget->GetDataAcc()->GetFDEFont(); + } + } + break; + case FWL_WGTCAPACITY_FontSize: { + if (CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pThemePart->m_pWidget)) { + m_fCapacity = pWidget->GetDataAcc()->GetFontSize(); + return &m_fCapacity; + } + } + break; + case FWL_WGTCAPACITY_TextColor: { + if (CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pThemePart->m_pWidget)) { + m_dwCapacity = pWidget->GetDataAcc()->GetTextColor(); + return &m_dwCapacity; + } + } + break; + case FWL_WGTCAPACITY_LineHeight: { + if (CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pThemePart->m_pWidget)) { + m_fCapacity = pWidget->GetDataAcc()->GetLineHeight(); + return &m_fCapacity; + } + } + break; + case FWL_WGTCAPACITY_ScrollBarWidth: { + m_fCapacity = 9; + return &m_fCapacity; + } + break; + case FWL_WGTCAPACITY_UIMargin: { + CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pThemePart->m_pWidget); + if (pWidget) { + CXFA_LayoutItem* pItem = pWidget->GetLayoutItem(); + if (!pItem) { + return &m_Rect; + } + CXFA_WidgetAcc* pWidgetAcc = pWidget->GetDataAcc(); + pWidgetAcc->GetUIMargin(m_Rect); + if (CXFA_Para para = pWidgetAcc->GetPara()) { + m_Rect.left += para.GetMarginLeft(); + if (pWidgetAcc->IsMultiLine()) { + m_Rect.width += para.GetMarginRight(); + } + } + if (pItem->GetPrev() == NULL) { + if (pItem->GetNext() != NULL) { + m_Rect.height = 0; + } + } else if (pItem->GetNext() == NULL) { + m_Rect.top = 0; + } else { + m_Rect.top = 0; + m_Rect.height = 0; + } + } + return &m_Rect; + } + break; + case FWL_WGTCAPACITY_SpaceAboveBelow: { + CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pThemePart->m_pWidget); + if (pWidget) { + CXFA_WidgetAcc* pWidgetAcc = pWidget->GetDataAcc(); + if (CXFA_Para para = pWidgetAcc->GetPara()) { + m_SizeAboveBelow.x = para.GetSpaceAbove(); + m_SizeAboveBelow.y = para.GetSpaceBelow(); + } + } + return &m_SizeAboveBelow; + } + break; + default: + break; + } + if (pThemePart->m_pWidget->GetClassID() == FWL_CLASSHASH_MonthCalendar && dwCapacity >= FWL_MCCAPACITY_Sun && dwCapacity <= FWL_MCCAPACITY_Today) { + if (CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pThemePart->m_pWidget)) { + IXFA_AppProvider *pAppProvider = pWidget->GetAppProvider(); + m_wsResource.Empty(); + pAppProvider->LoadString(XFA_IDS_StringWeekDay_Sun + dwCapacity - FWL_WGTCAPACITY_MAX - 5, m_wsResource); + if (!m_wsResource.IsEmpty()) { + return &m_wsResource; + } + } + } + return GetTheme(pThemePart->m_pWidget)->GetCapacity(pThemePart, dwCapacity); +} +FX_BOOL CXFA_FWLTheme::IsCustomizedLayout(IFWL_Widget *pWidget) +{ + return GetTheme(pWidget)->IsCustomizedLayout(pWidget); +} +FWL_ERR CXFA_FWLTheme::GetPartRect(CFWL_ThemePart* pThemePart) +{ + CFX_RectF rect; + return GetTheme(pThemePart->m_pWidget)->GetPartRect(pThemePart, rect); +} +FX_BOOL CXFA_FWLTheme::IsInPart(CFWL_ThemePart* pThemePart, FX_FLOAT fx, FX_FLOAT fy) +{ + return GetTheme(pThemePart->m_pWidget)->IsInPart(pThemePart, fx, fy); +} +FX_BOOL CXFA_FWLTheme::CalcTextRect(CFWL_ThemeText *pParams, CFX_RectF &rect) +{ + if (pParams->m_pWidget->GetClassID() == FWL_CLASSHASH_MonthCalendar) { + CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pParams->m_pWidget); + if (!pWidget) { + return FWL_ERR_Indefinite; + } + _FWL_RETURN_VALUE_IF_FAIL(pParams, FALSE); + _FWL_RETURN_VALUE_IF_FAIL(m_pTextOut, FALSE); + m_pTextOut->SetFont(m_pCalendarFont); + m_pTextOut->SetFontSize(FWLTHEME_CAPACITY_FontSize); + m_pTextOut->SetTextColor(FWLTHEME_CAPACITY_TextColor); + m_pTextOut->SetAlignment(pParams->m_iTTOAlign); + m_pTextOut->SetStyles(pParams->m_dwTTOStyles); + m_pTextOut->CalcLogicSize(pParams->m_wsText, pParams->m_wsText.GetLength(), rect); + return TRUE; + } + CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pParams->m_pWidget); + if (!pWidget) { + return FWL_ERR_Indefinite; + } + CXFA_WidgetAcc* pAcc = pWidget->GetDataAcc(); + m_pTextOut->SetFont(pAcc->GetFDEFont()); + m_pTextOut->SetFontSize(pAcc->GetFontSize()); + m_pTextOut->SetTextColor(pAcc->GetTextColor()); + _FWL_RETURN_VALUE_IF_FAIL(pParams, FALSE); + _FWL_RETURN_VALUE_IF_FAIL(m_pTextOut, FALSE); + m_pTextOut->SetAlignment(pParams->m_iTTOAlign); + m_pTextOut->SetStyles(pParams->m_dwTTOStyles); + m_pTextOut->CalcLogicSize(pParams->m_wsText, pParams->m_wsText.GetLength(), rect); + return TRUE; +} +CFWL_WidgetTP* CXFA_FWLTheme::GetTheme(IFWL_Widget* pWidget) +{ + switch(pWidget->GetClassID()) { + case FWL_CLASSHASH_CheckBox: + case FWL_CLASSHASH_RadioButton: + return m_pCheckBoxTP; + case FWL_CLASSHASH_ListBox: + return m_pListBoxTP; + case FWL_CLASSHASH_PictureBox: + return m_pPictureBoxTP; + case FWL_CLASSHASH_ScrollBar: + return m_pSrollBarTP; + case FWL_CLASSHASH_Edit: + return m_pEditTP; + case FWL_CLASSHASH_ComboBox: + return m_pComboBoxTP; + case FWL_CLASSHASH_MonthCalendar: + return m_pMonthCalendarTP; + case FWL_CLASSHASH_DateTimePicker: + return m_pDateTimePickerTP; + case FWL_CLASSHASH_PushButton: + return m_pPushButtonTP; + case FWL_CLASSHASH_Caret: + return m_pCaretTP; + case FWL_CLASSHASH_Barcode: + return m_pBarcodeTP; + default: + break; + } + return NULL; +} +CXFA_FWLCheckBoxTP::CXFA_FWLCheckBoxTP() +{ +} +FX_BOOL CXFA_FWLCheckBoxTP::DrawBackground(CFWL_ThemeBackground *pParams) +{ + if (pParams->m_iPart != FWL_PART_CKB_CheckBox) { + return TRUE; + } + if (((pParams->m_dwStates & FWL_PARTSTATE_CKB_Mask2) == FWL_PARTSTATE_CKB_Checked) || ((pParams->m_dwStates & FWL_PARTSTATE_CKB_Mask2) == FWL_PARTSTATE_CKB_Neutral)) { + DrawCheckSign(pParams->m_pWidget, pParams->m_pGraphics, &pParams->m_rtPart, pParams->m_dwStates, &pParams->m_matrix); + } + return TRUE; +} +void CXFA_FWLCheckBoxTP::DrawCheckSign(IFWL_Widget *pWidget, CFX_Graphics *pGraphics, const CFX_RectF *pRtBox, FX_INT32 iState, CFX_Matrix* pMatrix) +{ + CFX_RectF rtSign(*pRtBox); + FX_DWORD dwColor = 0xFF000000; + if ((iState & FWL_PARTSTATE_CKB_Mask2) == FWL_PARTSTATE_CKB_Neutral) { + dwColor = 0xFFA9A9A9; + } + { + FX_DWORD dwStyle = pWidget->GetStylesEx(); + rtSign.Deflate(rtSign.width / 4, rtSign.height / 4); + switch(dwStyle & FWL_STYLEEXT_CKB_SignShapeMask) { + case FWL_STYLEEXT_CKB_SignShapeCheck: + DrawSignCheck(pGraphics, &rtSign, dwColor, pMatrix); + break; + case FWL_STYLEEXT_CKB_SignShapeCircle: + DrawSignCircle(pGraphics, &rtSign, dwColor, pMatrix); + break; + case FWL_STYLEEXT_CKB_SignShapeCross: + DrawSignCross(pGraphics, &rtSign, dwColor, pMatrix); + break; + case FWL_STYLEEXT_CKB_SignShapeDiamond: + DrawSignDiamond(pGraphics, &rtSign, dwColor, pMatrix); + break; + case FWL_STYLEEXT_CKB_SignShapeSquare: + DrawSignSquare(pGraphics, &rtSign, dwColor, pMatrix); + break; + case FWL_STYLEEXT_CKB_SignShapeStar: + DrawSignStar(pGraphics, &rtSign, dwColor, pMatrix); + break; + default: + break; + } + } +} +CXFA_FWLEditTP::CXFA_FWLEditTP() +{ +} +CXFA_FWLEditTP::~CXFA_FWLEditTP() +{ +} +FX_BOOL CXFA_FWLEditTP::DrawBackground(CFWL_ThemeBackground *pParams) +{ + if (FWL_PART_EDT_CombTextLine == pParams->m_iPart) { + CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pParams->m_pWidget); + FX_ARGB cr = 0xFF000000; + FX_FLOAT fWidth = 1.0f; + if (CXFA_Border borderUI = pWidget->GetDataAcc()->GetUIBorder()) { + CXFA_Edge edge = borderUI.GetEdge(0); + if (edge) { + cr = edge.GetColor(); + fWidth = edge.GetThickness(); + } + } + CFX_Color crLine(cr); + pParams->m_pGraphics->SetStrokeColor(&crLine); + pParams->m_pGraphics->SetLineWidth(fWidth); + pParams->m_pGraphics->StrokePath(pParams->m_pPath, &pParams->m_matrix); + return TRUE; + } + return CFWL_EditTP::DrawBackground(pParams); +} diff --git a/xfa/src/fxfa/src/app/xfa_fwltheme.h b/xfa/src/fxfa/src/app/xfa_fwltheme.h new file mode 100644 index 0000000000..beb5e6abf6 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_fwltheme.h @@ -0,0 +1,94 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _XFA_FWL_THEME_IMP_H +#define _XFA_FWL_THEME_IMP_H +class CXFA_FWLTheme : public IFWL_ThemeProvider, public CFX_Object +{ +public: + CXFA_FWLTheme(CXFA_FFApp *pApp); + virtual~CXFA_FWLTheme(); + virtual FWL_ERR Release() + { + delete this; + return FWL_ERR_Succeeded; + } + virtual IFWL_Target* Retain() + { + return NULL; + } + virtual FWL_ERR GetClassName(CFX_WideString &wsClass) const + { + return FWL_ERR_Succeeded; + } + virtual FX_DWORD GetHashCode() const + { + return 0; + } + virtual FWL_ERR Initialize(); + virtual FWL_ERR Finalize(); + virtual FX_BOOL IsValidWidget(IFWL_Widget *pWidget); + virtual FX_DWORD GetThemeID(IFWL_Widget *pWidget); + virtual FX_DWORD SetThemeID(IFWL_Widget *pWidget, FX_DWORD dwThemeID, FX_BOOL bChildren = TRUE); + virtual FX_BOOL DrawBackground(CFWL_ThemeBackground *pParams); + virtual FX_BOOL DrawText(CFWL_ThemeText *pParams); + virtual FX_LPVOID GetCapacity(CFWL_ThemePart *pThemePart, FX_DWORD dwCapacity); + virtual FX_BOOL IsCustomizedLayout(IFWL_Widget *pWidget); + virtual FWL_ERR GetPartRect(CFWL_ThemePart* pThemePart); + virtual FX_BOOL IsInPart(CFWL_ThemePart* pThemePart, FX_FLOAT fx, FX_FLOAT fy); + + virtual FX_BOOL CalcTextRect(CFWL_ThemeText *pParams, CFX_RectF &rect); + virtual FWL_ERR GetThemeMatrix(IFWL_Widget *pWidget, CFX_Matrix &matrix) + { + return FWL_ERR_Succeeded; + } + virtual FWL_ERR SetThemeMatrix(IFWL_Widget *pWidget, const CFX_Matrix &matrix) + { + return FWL_ERR_Succeeded; + } + virtual FWL_ERR GetPartRect(CFWL_ThemePart *pThemePart, CFX_RectF &rtPart) + { + return FWL_ERR_Succeeded; + } +protected: + CFWL_WidgetTP* GetTheme(IFWL_Widget* pWidget); + CFWL_CheckBoxTP* m_pCheckBoxTP; + CFWL_ListBoxTP* m_pListBoxTP; + CFWL_PictureBoxTP* m_pPictureBoxTP; + CFWL_ScrollBarTP* m_pSrollBarTP; + CFWL_EditTP* m_pEditTP; + CFWL_ComboBoxTP* m_pComboBoxTP; + CFWL_MonthCalendarTP* m_pMonthCalendarTP; + CFWL_DateTimePickerTP* m_pDateTimePickerTP; + CFWL_PushButtonTP* m_pPushButtonTP; + CFWL_CaretTP* m_pCaretTP; + CFWL_BarcodeTP* m_pBarcodeTP; + IFDE_TextOut* m_pTextOut; + FX_FLOAT m_fCapacity; + FX_DWORD m_dwCapacity; + IFX_Font* m_pCalendarFont; + CFX_WideString m_wsResource; + CXFA_FFApp* m_pApp; + CFX_RectF m_Rect; + CFX_SizeF m_SizeAboveBelow; +}; +class CXFA_FWLCheckBoxTP : public CFWL_CheckBoxTP +{ +public: + CXFA_FWLCheckBoxTP(); + virtual FX_BOOL DrawBackground(CFWL_ThemeBackground *pParams); +protected: + void DrawCheckSign(IFWL_Widget *pWidget, CFX_Graphics *pGraphics, const CFX_RectF *pRtBox, FX_INT32 iState, CFX_Matrix* pMatrix); +}; +class CXFA_FWLEditTP : public CFWL_EditTP +{ +public: + CXFA_FWLEditTP(); + virtual ~CXFA_FWLEditTP(); +public: + virtual FX_BOOL DrawBackground(CFWL_ThemeBackground *pParams); +}; +#endif diff --git a/xfa/src/fxfa/src/app/xfa_rendercontext.cpp b/xfa/src/fxfa/src/app/xfa_rendercontext.cpp new file mode 100644 index 0000000000..5447506b24 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_rendercontext.cpp @@ -0,0 +1,74 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_common.h" +#include "xfa_rendercontext.h" +#include "xfa_ffwidget.h" +#define XFA_RENDERCONTEXT_MaxCount 30 +IXFA_RenderContext* XFA_RenderContext_Create() +{ + return FX_NEW CXFA_RenderContext; +} +CXFA_RenderContext::CXFA_RenderContext() +{ + m_pWidgetIterator = NULL; + m_pWidget = NULL; + m_pPageView = NULL; + m_pGS = NULL; + m_dwStatus = 0; + m_matrix.Reset(); + m_rtClipRect.Reset(); +} +CXFA_RenderContext::~CXFA_RenderContext() +{ + StopRender(); +} +FX_INT32 CXFA_RenderContext::StartRender(IXFA_PageView* pPageView, CFX_Graphics* pGS, const CFX_Matrix& matrix, const CXFA_RenderOptions& options) +{ + m_pPageView = pPageView; + m_pGS = pGS; + m_matrix = matrix; + m_options = options; + CFX_RectF rtPage; + pGS->GetClipRect(rtPage); + CFX_Matrix mtRes; + mtRes.SetReverse(matrix); + m_rtClipRect.Set(rtPage.left, rtPage.top, rtPage.width, rtPage.height); + mtRes.TransformRect(m_rtClipRect); + m_dwStatus = m_options.m_bHighlight ? XFA_WIDGETSTATUS_Highlight : 0; + FX_DWORD dwFilterType = XFA_WIDGETFILTER_Visible | XFA_WIDGETFILTER_AllType | (m_options.m_bPrint ? XFA_WIDGETSTATUS_Printable : XFA_WIDGETSTATUS_Viewable); + m_pWidgetIterator = m_pPageView->CreateWidgetIterator(XFA_TRAVERSEWAY_Form, dwFilterType); + m_pWidget = m_pWidgetIterator->MoveToNext(); + return XFA_RENDERSTATUS_Ready; +} +FX_INT32 CXFA_RenderContext::DoRender(IFX_Pause* pPause) +{ + FX_INT32 iCount = 0; + while(m_pWidget) { + CXFA_FFWidget* pWidget = (CXFA_FFWidget*)m_pWidget; + CFX_RectF rtWidgetBox; + pWidget->GetBBox(rtWidgetBox, XFA_WIDGETSTATUS_Visible); + rtWidgetBox.width += 1; + rtWidgetBox.height += 1; + if (rtWidgetBox.IntersectWith(m_rtClipRect)) { + pWidget->RenderWidget(m_pGS, &m_matrix, m_dwStatus); + } + m_pWidget = m_pWidgetIterator->MoveToNext(); + iCount++; + if (iCount > XFA_RENDERCONTEXT_MaxCount && pPause && pPause->NeedToPauseNow()) { + return XFA_RENDERSTATUS_ToBeContinued; + } + } + return XFA_RENDERSTATUS_Done; +} +void CXFA_RenderContext::StopRender() +{ + if (m_pWidgetIterator) { + m_pWidgetIterator->Release(); + m_pWidgetIterator = NULL; + } +} diff --git a/xfa/src/fxfa/src/app/xfa_rendercontext.h b/xfa/src/fxfa/src/app/xfa_rendercontext.h new file mode 100644 index 0000000000..f50adddec1 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_rendercontext.h @@ -0,0 +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 + +#ifndef _FXFA_FORMFILLER_RENDERCONTEXT_IMP_H +#define _FXFA_FORMFILLER_RENDERCONTEXT_IMP_H +class CXFA_RenderContext : public IXFA_RenderContext, public CFX_Object +{ +public: + CXFA_RenderContext(); + virtual ~CXFA_RenderContext(); + virtual void Release() + { + delete this; + } + virtual FX_INT32 StartRender(IXFA_PageView* pPageView, CFX_Graphics* pGS, const CFX_Matrix& matrix, const CXFA_RenderOptions& options); + virtual FX_INT32 DoRender(IFX_Pause* pPause = NULL); + virtual void StopRender(); +protected: + IXFA_WidgetIterator* m_pWidgetIterator; + XFA_HWIDGET m_pWidget; + IXFA_PageView* m_pPageView; + CFX_Graphics* m_pGS; + CFX_Matrix m_matrix; + CXFA_RenderOptions m_options; + FX_DWORD m_dwStatus; + CFX_RectF m_rtClipRect; +}; +#endif diff --git a/xfa/src/fxfa/src/app/xfa_textlayout.cpp b/xfa/src/fxfa/src/app/xfa_textlayout.cpp new file mode 100644 index 0000000000..5a4eee48f5 --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_textlayout.cpp @@ -0,0 +1,1927 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_common.h" +#include "xfa_textlayout.h" +#include "xfa_ffapp.h" +#include "xfa_ffdoc.h" +#include "xfa_fontmgr.h" +CXFA_CSSTagProvider::~CXFA_CSSTagProvider() +{ + FX_POSITION pos = m_Attributes.GetStartPosition(); + while (pos) { + CFX_WideString* pName = NULL, *pValue = NULL; + m_Attributes.GetNextAssoc(pos, (void*&)pName, (void*&)pValue); + if (pName != NULL) { + delete pName; + } + if (pValue != NULL) { + delete pValue; + } + } +} +void CXFA_CSSTagProvider::GetNextAttribute(FX_POSITION &pos, CFX_WideStringC &wsAttr, CFX_WideStringC &wsValue) +{ + if (pos == NULL) { + return; + } + CFX_WideString *pName = NULL; + CFX_WideString *pValue = NULL; + m_Attributes.GetNextAssoc(pos, (void*&)pName, (void*&)pValue); + wsAttr = *pName; + wsValue = *pValue; +} +void CXFA_CSSTagProvider::SetAttribute(const CFX_WideString &wsAttr, const CFX_WideString &wsValue) +{ + CFX_WideString *pName = FX_NEW CFX_WideString(); + CFX_WideString *pValue = FX_NEW CFX_WideString(); + *pName = wsAttr; + *pValue = wsValue; + m_Attributes.SetAt(pName, pValue); +} +void CXFA_TextParseContext::SetDecls(const IFDE_CSSDeclaration **ppDeclArray, FX_INT32 iDeclCount) +{ + if (iDeclCount <= 0 || ppDeclArray == NULL) { + return; + } + m_dwMatchedDecls = iDeclCount; + FX_INT32 iBytes = iDeclCount * sizeof(IFDE_CSSDeclaration*); + m_ppMatchedDecls = (IFDE_CSSDeclaration**)FDE_Alloc(iBytes); + FX_memcpy(m_ppMatchedDecls, ppDeclArray, iBytes); +} +CXFA_TextParser::~CXFA_TextParser() +{ + if (m_pUASheet != NULL) { + m_pUASheet->Release(); + } + if (m_pSelector != NULL) { + m_pSelector->Release(); + } + if (m_pAllocator != NULL) { + m_pAllocator->Release(); + } + FX_POSITION ps = m_mapXMLNodeToParseContext.GetStartPosition(); + while (ps) { + IFDE_XMLNode *pXMLNode; + CXFA_TextParseContext *pParseContext; + m_mapXMLNodeToParseContext.GetNextAssoc(ps, pXMLNode, pParseContext); + if (pParseContext != NULL) { + FDE_DeleteWith(CXFA_TextParseContext, m_pAllocator, pParseContext); + } + } + m_mapXMLNodeToParseContext.RemoveAll(); +} +void CXFA_TextParser::Reset() +{ + FX_POSITION ps = m_mapXMLNodeToParseContext.GetStartPosition(); + while (ps) { + IFDE_XMLNode *pXMLNode; + CXFA_TextParseContext *pParseContext; + m_mapXMLNodeToParseContext.GetNextAssoc(ps, pXMLNode, pParseContext); + if (pParseContext != NULL) { + FDE_DeleteWith(CXFA_TextParseContext, m_pAllocator, pParseContext); + } + } + m_mapXMLNodeToParseContext.RemoveAll(); + if (m_pAllocator != NULL) { + m_pAllocator->Release(); + m_pAllocator = NULL; + } +} +void CXFA_TextParser::InitCSSData(IXFA_TextProvider *pTextProvider) +{ + if (pTextProvider == NULL) { + return; + } + if (m_pSelector == NULL) { + CXFA_FFDoc *pDoc = pTextProvider->GetDocNode(); + IFX_FontMgr *pFontMgr = pDoc->GetApp()->GetFDEFontMgr(); + FXSYS_assert(pFontMgr != NULL); + m_pSelector = IFDE_CSSStyleSelector::Create(); + m_pSelector->SetFontMgr(pFontMgr); + FX_FLOAT fFontSize = 10; + CXFA_Font font = pTextProvider->GetFontNode(); + if (font.IsExistInXML()) { + fFontSize = font.GetFontSize(); + } + m_pSelector->SetDefFontSize(fFontSize); + } + if (m_pUASheet == NULL) { + m_pUASheet = LoadDefaultSheetStyle(); + m_pSelector->SetStyleSheet(FDE_CSSSTYLESHEETGROUP_UserAgent, m_pUASheet); + m_pSelector->UpdateStyleIndex(FDE_CSSMEDIATYPE_ALL); + } +} +IFDE_CSSStyleSheet* CXFA_TextParser::LoadDefaultSheetStyle() +{ + static const FX_LPCWSTR s_pStyle = (FX_LPCWSTR)L"html,body,ol,p,ul{display:block}" + L"li{display:list-item}" + L"ol,ul{padding-left:33px}ol{list-style-type:decimal}ol,ul{margin-top:0;margin-bottom:0}ul,ol{margin:1.12em 0}" + L"a{color:#0000ff;text-decoration:underline}b{font-weight:bolder}i{font-style:italic}" + L"sup{vertical-align:+15em;font-size:.66em}sub{vertical-align:-15em;font-size:.66em}"; + return IFDE_CSSStyleSheet::LoadFromBuffer(CFX_WideString(), s_pStyle, FXSYS_wcslen(s_pStyle), FX_CODEPAGE_UTF8); +} +IFDE_CSSComputedStyle* CXFA_TextParser::CreateRootStyle(IXFA_TextProvider *pTextProvider) +{ + CXFA_Font font = pTextProvider->GetFontNode(); + CXFA_Para para = pTextProvider->GetParaNode(); + IFDE_CSSComputedStyle *pStyle = m_pSelector->CreateComputedStyle(NULL); + IFDE_CSSFontStyle *pFontStyle = pStyle->GetFontStyles(); + IFDE_CSSParagraphStyle *pParaStyle = pStyle->GetParagraphStyles(); + FX_FLOAT fLineHeight = 0, fFontSize = 10; + if (para.IsExistInXML()) { + fLineHeight = para.GetLineHeight(); + FDE_CSSLENGTH indent; + indent.Set(FDE_CSSLENGTHUNIT_Point, para.GetTextIndent()); + pParaStyle->SetTextIndent(indent); + FDE_CSSTEXTALIGN hAlgin = FDE_CSSTEXTALIGN_Left; + switch (para.GetHorizontalAlign()) { + case XFA_ATTRIBUTEENUM_Center: + hAlgin = FDE_CSSTEXTALIGN_Center; + break; + case XFA_ATTRIBUTEENUM_Right: + hAlgin = FDE_CSSTEXTALIGN_Right; + break; + case XFA_ATTRIBUTEENUM_Justify: + hAlgin = FDE_CSSTEXTALIGN_Justify; + break; + case XFA_ATTRIBUTEENUM_JustifyAll: + hAlgin = FDE_CSSTEXTALIGN_JustifyAll; + break; + } + pParaStyle->SetTextAlign(hAlgin); + FDE_CSSRECT rtMarginWidth; + rtMarginWidth.left.Set(FDE_CSSLENGTHUNIT_Point, para.GetMarginLeft()); + rtMarginWidth.top.Set(FDE_CSSLENGTHUNIT_Point, para.GetSpaceAbove()); + rtMarginWidth.right.Set(FDE_CSSLENGTHUNIT_Point, para.GetMarginRight()); + rtMarginWidth.bottom.Set(FDE_CSSLENGTHUNIT_Point, para.GetSpaceBelow()); + pStyle->GetBoundaryStyles()->SetMarginWidth(rtMarginWidth); + } + if (font.IsExistInXML()) { + pFontStyle->SetColor(font.GetColor()); + pFontStyle->SetFontStyle(font.IsItalic() ? FDE_CSSFONTSTYLE_Italic : FDE_CSSFONTSTYLE_Normal); + pFontStyle->SetFontWeight(font.IsBold() ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL); + pParaStyle->SetNumberVerticalAlign(-font.GetBaselineShift()); + fFontSize = font.GetFontSize(); + FDE_CSSLENGTH letterSpacing; + letterSpacing.Set(FDE_CSSLENGTHUNIT_Point, font.GetLetterSpacing()); + pParaStyle->SetLetterSpacing(letterSpacing); + FX_DWORD dwDecoration = 0; + if (font.GetLineThrough() > 0) { + dwDecoration |= FDE_CSSTEXTDECORATION_LineThrough; + } + if (font.GetUnderline() > 1) { + dwDecoration |= FDE_CSSTEXTDECORATION_Double; + } else if (font.GetUnderline() > 0) { + dwDecoration |= FDE_CSSTEXTDECORATION_Underline; + } + pParaStyle->SetTextDecoration(dwDecoration); + } + pParaStyle->SetLineHeight(fLineHeight); + pFontStyle->SetFontSize(fFontSize); + return pStyle; +} +IFDE_CSSComputedStyle* CXFA_TextParser::CreateStyle(IFDE_CSSComputedStyle *pParentStyle) +{ + IFDE_CSSComputedStyle *pNewStyle = m_pSelector->CreateComputedStyle(pParentStyle); + FXSYS_assert(pNewStyle != NULL); + if (pParentStyle) { + IFDE_CSSParagraphStyle *pParaStyle = pParentStyle->GetParagraphStyles(); + FX_DWORD dwDecoration = pParaStyle->GetTextDecoration(); + FX_FLOAT fBaseLine = 0; + if (pParaStyle->GetVerticalAlign() == FDE_CSSVERTICALALIGN_Number) { + fBaseLine = pParaStyle->GetNumberVerticalAlign(); + } + pParaStyle = pNewStyle->GetParagraphStyles(); + pParaStyle->SetTextDecoration(dwDecoration); + pParaStyle->SetNumberVerticalAlign(fBaseLine); + IFDE_CSSBoundaryStyle *pBoundarytyle = pParentStyle->GetBoundaryStyles(); + const FDE_CSSRECT *pRect = pBoundarytyle->GetMarginWidth(); + if (pRect != NULL) { + pBoundarytyle = pNewStyle->GetBoundaryStyles(); + pBoundarytyle->SetMarginWidth(*pRect); + } + } + return pNewStyle; +} +IFDE_CSSComputedStyle* CXFA_TextParser::ComputeStyle(IFDE_XMLNode *pXMLNode, IFDE_CSSComputedStyle *pParentStyle) +{ + CXFA_TextParseContext *pContext = (CXFA_TextParseContext*)m_mapXMLNodeToParseContext.GetValueAt(pXMLNode); + if (pContext == NULL) { + return NULL; + } + pContext->m_pParentStyle = pParentStyle; + CXFA_CSSTagProvider tagProvider; + ParseTagInfo(pXMLNode, tagProvider); + if (tagProvider.m_bContent) { + return NULL; + } + IFDE_CSSComputedStyle *pStyle = CreateStyle(pParentStyle); + IFDE_CSSAccelerator *pCSSAccel = m_pSelector->InitAccelerator(); + pCSSAccel->OnEnterTag(&tagProvider); + m_pSelector->ComputeStyle(&tagProvider, pContext->GetDecls(), pContext->CountDecls(), pStyle); + pCSSAccel->OnLeaveTag(&tagProvider); + return pStyle; +} +void CXFA_TextParser::DoParse(IFDE_XMLNode *pXMLContainer, IXFA_TextProvider *pTextProvider) +{ + if (pXMLContainer == NULL || pTextProvider == NULL || m_pAllocator != NULL) { + return; + } + m_pAllocator = FX_CreateAllocator(FX_ALLOCTYPE_Fixed, 32, sizeof(CXFA_CSSTagProvider)); + InitCSSData(pTextProvider); + IFDE_CSSComputedStyle *pRootStyle = CreateRootStyle(pTextProvider); + ParseRichText(pXMLContainer, pRootStyle); + pRootStyle->Release(); +} +void CXFA_TextParser::ParseRichText(IFDE_XMLNode *pXMLNode, IFDE_CSSComputedStyle *pParentStyle) +{ + if (pXMLNode == NULL) { + return; + } + CXFA_CSSTagProvider tagProvider; + ParseTagInfo(pXMLNode, tagProvider); + if (!tagProvider.m_bTagAviliable) { + return; + } + IFDE_CSSComputedStyle *pNewStyle = NULL; + if ((tagProvider.GetTagName() != FX_WSTRC(L"body")) || (tagProvider.GetTagName() != FX_WSTRC(L"html")) ) { + CXFA_TextParseContext *pTextContext = FDE_NewWith(m_pAllocator)CXFA_TextParseContext; + FDE_CSSDISPLAY eDisplay = FDE_CSSDISPLAY_Inline; + if (!tagProvider.m_bContent) { + pNewStyle = CreateStyle(pParentStyle); + IFDE_CSSAccelerator *pCSSAccel = m_pSelector->InitAccelerator(); + pCSSAccel->OnEnterTag(&tagProvider); + CFDE_CSSDeclarationArray DeclArray; + FX_INT32 iMatchedDecls = m_pSelector->MatchDeclarations(&tagProvider, DeclArray); + const IFDE_CSSDeclaration **ppMatchDecls = (const IFDE_CSSDeclaration **)DeclArray.GetData(); + m_pSelector->ComputeStyle(&tagProvider, ppMatchDecls, iMatchedDecls, pNewStyle); + pCSSAccel->OnLeaveTag(&tagProvider); + if (iMatchedDecls > 0) { + pTextContext->SetDecls(ppMatchDecls, iMatchedDecls); + } + eDisplay = pNewStyle->GetPositionStyles()->GetDisplay(); + } + pTextContext->SetDisplay(eDisplay); + m_mapXMLNodeToParseContext.SetAt(pXMLNode, pTextContext); + } + for(IFDE_XMLNode *pXMLChild = pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild); pXMLChild; pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) { + ParseRichText(pXMLChild, pNewStyle); + } + if (pNewStyle != NULL) { + pNewStyle->Release(); + } +} +void CXFA_TextParser::ParseTagInfo(IFDE_XMLNode *pXMLNode, CXFA_CSSTagProvider &tagProvider) +{ + static const FX_DWORD s_XFATagName[] = { + 0x61, + 0x62, + 0x69, + 0x70, + 0x0001f714, + 0x00022a55, + 0x000239bb, + 0x00025881, + 0x0bd37faa, + 0x0bd37fb8, + 0xa73e3af2, + 0xb182eaae, + 0xdb8ac455, + }; + CFX_WideString wsName; + if (pXMLNode->GetType() == FDE_XMLNODE_Element) { + IFDE_XMLElement *pXMLElement = (IFDE_XMLElement *)pXMLNode; + pXMLElement->GetLocalTagName(wsName); + tagProvider.SetTagNameObj(wsName); + FX_DWORD dwHashCode = FX_HashCode_String_GetW(wsName, wsName.GetLength(), TRUE); + static const FX_INT32 s_iCount = sizeof(s_XFATagName) / sizeof(FX_DWORD); + CFX_DSPATemplate lookup; + tagProvider.m_bTagAviliable = lookup.Lookup(dwHashCode, s_XFATagName, s_iCount) > -1; + CFX_WideString wsValue; + pXMLElement->GetString(FX_WSTRC(L"style").GetPtr(), wsValue); + if (!wsValue.IsEmpty()) { + tagProvider.SetAttribute(FX_WSTRC(L"style"), wsValue); + } + } else if (pXMLNode->GetType() == FDE_XMLNODE_Text) { + tagProvider.m_bTagAviliable = TRUE; + tagProvider.m_bContent = TRUE; + } +} +FX_INT32 CXFA_TextParser::GetVAlgin(IXFA_TextProvider *pTextProvider) const +{ + FX_INT32 iAlign = XFA_ATTRIBUTEENUM_Top; + CXFA_Para para = pTextProvider->GetParaNode(); + if (para.IsExistInXML()) { + iAlign = para.GetVerticalAlign(); + } + return iAlign; +} +FX_FLOAT CXFA_TextParser::GetTabInterval(IFDE_CSSComputedStyle *pStyle) const +{ + CFX_WideString wsValue; + if (pStyle && pStyle->GetCustomStyle(FX_WSTRC(L"tab-interval"), wsValue)) { + CXFA_Measurement ms(wsValue); + return ms.ToUnit(XFA_UNIT_Pt); + } + return 36; +} +FX_INT32 CXFA_TextParser::CountTabs(IFDE_CSSComputedStyle *pStyle) const +{ + CFX_WideString wsValue; + if (pStyle && pStyle->GetCustomStyle(FX_WSTRC(L"xfa-tab-count"), wsValue)) { + return wsValue.GetInteger(); + } + return 0; +} +FX_BOOL CXFA_TextParser::IsSpaceRun(IFDE_CSSComputedStyle *pStyle) const +{ + CFX_WideString wsValue; + if (pStyle && pStyle->GetCustomStyle(FX_WSTRC(L"xfa-spacerun"), wsValue)) { + wsValue.MakeLower(); + return wsValue == FX_WSTRC(L"yes"); + } + return FALSE; +} +IFX_Font* CXFA_TextParser::GetFont(IXFA_TextProvider *pTextProvider, IFDE_CSSComputedStyle *pStyle) const +{ + CFX_WideStringC wsFamily = FX_WSTRC(L"Courier"); + FX_DWORD dwStyle = 0; + CXFA_Font font = pTextProvider->GetFontNode(); + if (font.IsExistInXML()) { + font.GetTypeface(wsFamily); + if (font.IsBold()) { + dwStyle |= FX_FONTSTYLE_Bold; + } + if (font.IsItalic()) { + dwStyle |= FX_FONTSTYLE_Italic; + } + } + if (pStyle) { + IFDE_CSSFontStyle *pFontStyle = pStyle->GetFontStyles(); + FX_INT32 iCount = pFontStyle->CountFontFamilies(); + if (iCount > 0) { + wsFamily = pFontStyle->GetFontFamily(iCount - 1); + } + dwStyle = 0; + if (pFontStyle->GetFontWeight() > FXFONT_FW_NORMAL) { + dwStyle |= FX_FONTSTYLE_Bold; + } + if (pFontStyle->GetFontStyle() == FDE_CSSFONTSTYLE_Italic) { + dwStyle |= FX_FONTSTYLE_Italic; + } + } + CXFA_FFDoc *pDoc = pTextProvider->GetDocNode(); + FXSYS_assert(pDoc != NULL); + CXFA_FontMgr *pFontMgr = pDoc->GetApp()->GetXFAFontMgr(); + return pFontMgr->GetFont((XFA_HDOC)pDoc, wsFamily, dwStyle); +} +FX_FLOAT CXFA_TextParser::GetFontSize(IXFA_TextProvider *pTextProvider, IFDE_CSSComputedStyle *pStyle) const +{ + if (pStyle != NULL) { + return pStyle->GetFontStyles()->GetFontSize(); + } + CXFA_Font font = pTextProvider->GetFontNode(); + if (font.IsExistInXML()) { + return font.GetFontSize(); + } + return 10; +} +FX_INT32 CXFA_TextParser::GetHorScale(IXFA_TextProvider *pTextProvider, IFDE_CSSComputedStyle *pStyle, IFDE_XMLNode *pXMLNode) const +{ + if (pStyle != NULL) { + CFX_WideString wsValue; + if (pStyle->GetCustomStyle(FX_WSTRC(L"xfa-font-horizontal-scale"), wsValue)) { + return wsValue.GetInteger(); + } + while (pXMLNode) { + CXFA_TextParseContext *pContext = (CXFA_TextParseContext*)m_mapXMLNodeToParseContext.GetValueAt(pXMLNode); + if (pContext && pContext->m_pParentStyle && pContext->m_pParentStyle->GetCustomStyle(FX_WSTRC(L"xfa-font-horizontal-scale"), wsValue)) { + return wsValue.GetInteger(); + } + pXMLNode = pXMLNode->GetNodeItem(IFDE_XMLNode::Parent); + } + } + if (CXFA_Font font = pTextProvider->GetFontNode()) { + return (FX_INT32)font.GetHorizontalScale(); + } + return 100; +} +FX_INT32 CXFA_TextParser::GetVerScale(IXFA_TextProvider *pTextProvider, IFDE_CSSComputedStyle *pStyle) const +{ + if (pStyle != NULL) { + CFX_WideString wsValue; + if (pStyle->GetCustomStyle(FX_WSTRC(L"xfa-font-vertical-scale"), wsValue)) { + return wsValue.GetInteger(); + } + } + if (CXFA_Font font = pTextProvider->GetFontNode()) { + return (FX_INT32)font.GetVerticalScale(); + } + return 100; +} +void CXFA_TextParser::GetUnderline(IXFA_TextProvider *pTextProvider, IFDE_CSSComputedStyle *pStyle, FX_INT32 &iUnderline, FX_INT32 &iPeriod) const +{ + iUnderline = 0; + iPeriod = XFA_ATTRIBUTEENUM_All; + if (pStyle) { + FX_DWORD dwDecoration = pStyle->GetParagraphStyles()->GetTextDecoration(); + if (dwDecoration & FDE_CSSTEXTDECORATION_Double) { + iUnderline = 2; + } else if (dwDecoration & FDE_CSSTEXTDECORATION_Underline) { + iUnderline = 1; + } + CFX_WideString wsValue; + if (pStyle->GetCustomStyle(FX_WSTRC(L"underlinePeriod"), wsValue)) { + if (wsValue == FX_WSTRC(L"word")) { + iPeriod = XFA_ATTRIBUTEENUM_Word; + } + } else if (CXFA_Font font = pTextProvider->GetFontNode()) { + iPeriod = font.GetUnderlinePeriod(); + } + } else { + CXFA_Font font = pTextProvider->GetFontNode(); + if (font.IsExistInXML()) { + iUnderline = font.GetUnderline(); + iPeriod = font.GetUnderlinePeriod(); + } + } +} +void CXFA_TextParser::GetLinethrough(IXFA_TextProvider *pTextProvider, IFDE_CSSComputedStyle *pStyle, FX_INT32 &iLinethrough) const +{ + if (pStyle) { + FX_DWORD dwDecoration = pStyle->GetParagraphStyles()->GetTextDecoration(); + iLinethrough = (dwDecoration & FDE_CSSTEXTDECORATION_LineThrough) ? 1 : 0; + } else { + CXFA_Font font = pTextProvider->GetFontNode(); + if (font.IsExistInXML()) { + iLinethrough = font.GetLineThrough(); + } + } +} +FX_ARGB CXFA_TextParser::GetColor(IXFA_TextProvider *pTextProvider, IFDE_CSSComputedStyle *pStyle) const +{ + if (pStyle != NULL) { + return pStyle->GetFontStyles()->GetColor(); + } + if (CXFA_Font font = pTextProvider->GetFontNode()) { + return font.GetColor(); + } + return 0xFF000000; +} +FX_FLOAT CXFA_TextParser::GetBaseline(IXFA_TextProvider *pTextProvider, IFDE_CSSComputedStyle *pStyle) const +{ + if (pStyle != NULL) { + IFDE_CSSParagraphStyle *pParaStyle = pStyle->GetParagraphStyles(); + if (pParaStyle->GetVerticalAlign() == FDE_CSSVERTICALALIGN_Number) { + return pParaStyle->GetNumberVerticalAlign(); + } + } else if (CXFA_Font font = pTextProvider->GetFontNode()) { + return font.GetBaselineShift(); + } + return 0; +} +FX_FLOAT CXFA_TextParser::GetLineHeight(IXFA_TextProvider *pTextProvider, IFDE_CSSComputedStyle *pStyle, FX_BOOL bFirst, FX_FLOAT fVerScale) const +{ + FX_FLOAT fLineHeight = 0; + if (pStyle != NULL) { + fLineHeight = pStyle->GetParagraphStyles()->GetLineHeight(); + } else if (CXFA_Para para = pTextProvider->GetParaNode()) { + fLineHeight = para.GetLineHeight(); + } + if (bFirst) { + FX_FLOAT fFontSize = GetFontSize(pTextProvider, pStyle); + if (fLineHeight < 0.1f) { + fLineHeight = fFontSize; + } else { + fLineHeight = FX_MIN(fLineHeight, fFontSize); + } + } else if (fLineHeight < 0.1f) { + fLineHeight = GetFontSize(pTextProvider, pStyle) * 1.2f; + } + fLineHeight *= fVerScale; + return fLineHeight; +} +FX_BOOL CXFA_TextParser::GetEmbbedObj(IXFA_TextProvider *pTextProvider, IFDE_XMLNode *pXMLNode, CFX_WideString &wsValue) +{ + wsValue.Empty(); + if (pXMLNode == NULL) { + return FALSE; + } + FX_BOOL bRet = FALSE; + if (pXMLNode->GetType() == FDE_XMLNODE_Element) { + IFDE_XMLElement* pElement = (IFDE_XMLElement *)pXMLNode; + CFX_WideString wsAttr; + pElement->GetString(FX_WSTRC(L"xfa:embed").GetPtr(), wsAttr); + if (wsAttr.IsEmpty()) { + return FALSE; + } + if (wsAttr.GetAt(0) == FX_WSTRC(L"#")) { + wsAttr.Delete(0); + } + CFX_WideString ws; + pElement->GetString(FX_WSTRC(L"xfa:embedType").GetPtr(), ws); + if (ws.IsEmpty()) { + ws = L"som"; + } else { + ws.MakeLower(); + } + FX_BOOL bURI = (ws == FX_WSTRC(L"uri")); + if (!bURI && ws != FX_WSTRC(L"som")) { + return FALSE; + } + ws.Empty(); + pElement->GetString(FX_WSTRC(L"xfa:embedMode").GetPtr(), ws); + if (ws.IsEmpty()) { + ws = L"formatted"; + } else { + ws.MakeLower(); + } + FX_BOOL bRaw = (ws == FX_WSTRC(L"raw")); + if (!bRaw && ws != FX_WSTRC(L"formatted")) { + return FALSE; + } + bRet = pTextProvider->GetEmbbedObj(bURI, bRaw, wsAttr, wsValue); + } + return bRet; +} +CXFA_TextParseContext* CXFA_TextParser::GetParseContextFromMap(IFDE_XMLNode *pXMLNode) +{ + return (CXFA_TextParseContext*)m_mapXMLNodeToParseContext.GetValueAt(pXMLNode); +} +enum XFA_TABSTOPSSTATUS { + XFA_TABSTOPSSTATUS_Error, + XFA_TABSTOPSSTATUS_EOS, + XFA_TABSTOPSSTATUS_None, + XFA_TABSTOPSSTATUS_Alignment, + XFA_TABSTOPSSTATUS_StartLeader, + XFA_TABSTOPSSTATUS_Leader, + XFA_TABSTOPSSTATUS_Location, +}; +FX_BOOL CXFA_TextParser::GetTabstops(IFDE_CSSComputedStyle *pStyle, CXFA_TextTabstopsContext *pTabstopContext) +{ + if (pStyle == NULL || pTabstopContext == NULL) { + return FALSE; + } + CFX_WideString wsValue; + if (!pStyle->GetCustomStyle(FX_WSTRC(L"xfa-tab-stops"), wsValue) + && !pStyle->GetCustomStyle(FX_WSTRC(L"tab-stops"), wsValue)) { + return FALSE; + } + FX_INT32 iLength = wsValue.GetLength(); + FX_LPCWSTR pTabStops = wsValue; + FX_INT32 iCur = 0; + FX_INT32 iLast = 0; + CFX_WideString wsAlign; + XFA_TABSTOPSSTATUS eStatus = XFA_TABSTOPSSTATUS_None; + FX_WCHAR ch; + while (iCur < iLength) { + ch = pTabStops[iCur]; + switch (eStatus) { + case XFA_TABSTOPSSTATUS_None: + if (ch <= ' ') { + iCur++; + } else { + eStatus = XFA_TABSTOPSSTATUS_Alignment; + iLast = iCur; + } + break; + case XFA_TABSTOPSSTATUS_Alignment: + if (ch == ' ') { + wsAlign = CFX_WideStringC(pTabStops + iLast, iCur - iLast); + eStatus = XFA_TABSTOPSSTATUS_StartLeader; + iCur++; + while (iCur < iLength && pTabStops[iCur] <= ' ') { + iCur++; + } + iLast = iCur; + } else { + iCur++; + } + break; + case XFA_TABSTOPSSTATUS_StartLeader: + if (ch != 'l') { + eStatus = XFA_TABSTOPSSTATUS_Location; + } else { + FX_INT32 iCount = 0; + while (iCur < iLength) { + ch = pTabStops[iCur]; + iCur++; + if (ch == '(') { + iCount++; + } else if (ch == ')') { + iCount--; + if (iCount == 0) { + break; + } + } + } + while (iCur < iLength && pTabStops[iCur] <= ' ') { + iCur++; + } + iLast = iCur; + eStatus = XFA_TABSTOPSSTATUS_Location; + } + break; + case XFA_TABSTOPSSTATUS_Location: + if (ch == ' ') { + FX_DWORD dwHashCode = FX_HashCode_String_GetW(wsAlign, wsAlign.GetLength(), TRUE); + CXFA_Measurement ms(CFX_WideStringC(pTabStops + iLast, iCur - iLast)); + FX_FLOAT fPos = ms.ToUnit(XFA_UNIT_Pt); + pTabstopContext->Append(dwHashCode, fPos); + wsAlign.Empty(); + eStatus = XFA_TABSTOPSSTATUS_None; + } + iCur++; + break; + default: + break; + } + } + if (!wsAlign.IsEmpty()) { + FX_DWORD dwHashCode = FX_HashCode_String_GetW(wsAlign, wsAlign.GetLength(), TRUE); + CXFA_Measurement ms(CFX_WideStringC(pTabStops + iLast, iCur - iLast)); + FX_FLOAT fPos = ms.ToUnit(XFA_UNIT_Pt); + pTabstopContext->Append(dwHashCode, fPos); + } + return TRUE; +} +CXFA_TextLayout::CXFA_TextLayout(IXFA_TextProvider *pTextProvider) + : m_pTextProvider(pTextProvider) + , m_pTextDataNode(NULL) + , m_pAllocator(NULL) + , m_pBreak(NULL) + , m_dwTextData(0) + , m_pLoader(NULL) + , m_iLines(0) + , m_fMaxWidth(0) + , m_pTabstopContext(NULL) + , m_bBlockContinue(TRUE) + , m_bRichText(FALSE) + , m_bHasBlock(FALSE) +{ + FXSYS_assert(m_pTextProvider != NULL); +} +CXFA_TextLayout::~CXFA_TextLayout() +{ + m_textParser.Reset(); + if (m_pLoader != NULL) { + delete m_pLoader; + } + if (m_pTabstopContext != NULL) { + delete m_pTabstopContext; + } + Unload(); +} +void CXFA_TextLayout::Unload() +{ + FX_INT32 iCount = m_pieceLines.GetSize(); + for (FX_INT32 i = 0; i < iCount; i++) { + CXFA_PieceLine *pLine = m_pieceLines.GetAt(i); + FDE_DeleteWith(CXFA_PieceLine, m_pAllocator, pLine); + } + m_pieceLines.RemoveAll(); + if (m_pBreak != NULL) { + m_pBreak->Release(); + m_pBreak = NULL; + } + if (m_pAllocator != NULL) { + m_pAllocator->Release(); + m_pAllocator = NULL; + } +} +const CXFA_PieceLineArray* CXFA_TextLayout::GetPieceLines() +{ + return &m_pieceLines; +} +void CXFA_TextLayout::GetTextDataNode() +{ + if (m_pTextProvider == NULL) { + return; + } + CXFA_Node *pNode = m_pTextProvider->GetTextNode(m_bRichText); + if (pNode && m_bRichText) { + m_textParser.Reset(); + } + m_pTextDataNode = pNode; +} +IFDE_XMLNode* CXFA_TextLayout::GetXMLContainerNode() +{ + IFDE_XMLNode* pXMLContainer = NULL; + if (m_bRichText) { + IFDE_XMLNode *pXMLRoot = m_pTextDataNode->GetXMLMappingNode(); + if (!pXMLRoot) { + return pXMLContainer; + } + for (IFDE_XMLNode *pXMLChild = pXMLRoot->GetNodeItem(IFDE_XMLNode::FirstChild); pXMLChild; pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) { + if (pXMLChild->GetType() == FDE_XMLNODE_Element) { + IFDE_XMLElement *pXMLElement = (IFDE_XMLElement*)pXMLChild; + CFX_WideString wsTag; + pXMLElement->GetLocalTagName(wsTag); + if (wsTag.Equal(FX_WSTRC(L"body")) || wsTag.Equal(FX_WSTRC(L"html"))) { + pXMLContainer = pXMLChild; + break; + } + } + } + } + return pXMLContainer; +} +IFX_RTFBreak* CXFA_TextLayout::CreateBreak(FX_BOOL bDefault) +{ + FX_DWORD dwStyle = FX_RTFLAYOUTSTYLE_ExpandTab; + if (!bDefault) { + dwStyle |= FX_RTFLAYOUTSTYLE_Pagination; + } + IFX_RTFBreak *pBreak = IFX_RTFBreak::Create(0); + pBreak->SetLayoutStyles(dwStyle); + pBreak->SetLineBreakChar(L'\n'); + pBreak->SetLineBreakTolerance(1); + pBreak->SetFont(m_textParser.GetFont(m_pTextProvider, NULL)); + pBreak->SetFontSize(m_textParser.GetFontSize(m_pTextProvider, NULL)); + return pBreak; +} +void CXFA_TextLayout::InitBreak(FX_FLOAT fLineWidth) +{ + CXFA_Font font = m_pTextProvider->GetFontNode(); + CXFA_Para para = m_pTextProvider->GetParaNode(); + FX_FLOAT fStart = 0; + FX_FLOAT fStartPos = 0; + if (para.IsExistInXML()) { + FX_INT32 iAlign = FX_RTFLINEALIGNMENT_Left; + switch (para.GetHorizontalAlign()) { + case XFA_ATTRIBUTEENUM_Center: + iAlign = FX_RTFLINEALIGNMENT_Center; + break; + case XFA_ATTRIBUTEENUM_Right: + iAlign = FX_RTFLINEALIGNMENT_Right; + break; + case XFA_ATTRIBUTEENUM_Justify: + iAlign = FX_RTFLINEALIGNMENT_Justified; + break; + case XFA_ATTRIBUTEENUM_JustifyAll: + iAlign = FX_RTFLINEALIGNMENT_Distributed; + break; + } + m_pBreak->SetAlignment(iAlign); + fStart = para.GetMarginLeft(); + if (m_pTextProvider->IsCheckButtonAndAutoWidth()) { + if (iAlign != FX_RTFLINEALIGNMENT_Left) { + fLineWidth -= para.GetMarginRight(); + } + } else { + fLineWidth -= para.GetMarginRight(); + } + if (fLineWidth < 0) { + fLineWidth = fStart; + } + fStartPos = fStart; + FX_FLOAT fIndent = para.GetTextIndent(); + if (fIndent > 0) { + fStartPos += fIndent; + } + } + m_pBreak->SetLineWidth(fStart, fLineWidth); + m_pBreak->SetLinePos(fStartPos); + if (font.IsExistInXML()) { + m_pBreak->SetHorizontalScale((FX_INT32)font.GetHorizontalScale()); + m_pBreak->SetVerticalScale((FX_INT32)font.GetVerticalScale()); + m_pBreak->SetCharSpace(font.GetLetterSpacing()); + } + FX_FLOAT fFontSize = m_textParser.GetFontSize(m_pTextProvider, NULL); + m_pBreak->SetFontSize(fFontSize); + m_pBreak->SetFont(m_textParser.GetFont(m_pTextProvider, NULL)); + m_pBreak->SetLineBreakTolerance(fFontSize * 0.2f); +} +void CXFA_TextLayout::InitBreak(IFDE_CSSComputedStyle *pStyle, FDE_CSSDISPLAY eDisplay, FX_FLOAT fLineWidth, IFDE_XMLNode *pXMLNode, IFDE_CSSComputedStyle *pParentStyle) +{ + if (pStyle == NULL) { + InitBreak(fLineWidth); + return; + } + IFDE_CSSParagraphStyle *pParaStyle = pStyle->GetParagraphStyles(); + if (eDisplay == FDE_CSSDISPLAY_Block || eDisplay == FDE_CSSDISPLAY_ListItem) { + FX_INT32 iAlign = FX_RTFLINEALIGNMENT_Left; + switch (pParaStyle->GetTextAlign()) { + case FDE_CSSTEXTALIGN_Right: + iAlign = FX_RTFLINEALIGNMENT_Right; + break; + case FDE_CSSTEXTALIGN_Center: + iAlign = FX_RTFLINEALIGNMENT_Center; + break; + case FDE_CSSTEXTALIGN_Justify: + iAlign = FX_RTFLINEALIGNMENT_Justified; + break; + case FDE_CSSTEXTALIGN_JustifyAll: + iAlign = FX_RTFLINEALIGNMENT_Distributed; + break; + default: + break; + } + m_pBreak->SetAlignment(iAlign); + FX_FLOAT fStart = 0; + const FDE_CSSRECT *pRect = pStyle->GetBoundaryStyles()->GetMarginWidth(); + const FDE_CSSRECT *pPaddingRect = pStyle->GetBoundaryStyles()->GetPaddingWidth(); + if (pRect != NULL) { + fStart = pRect->left.GetValue(); + fLineWidth -= pRect->right.GetValue(); + if (pPaddingRect != NULL) { + fStart += pPaddingRect->left.GetValue(); + fLineWidth -= pPaddingRect->right.GetValue(); + } + if (eDisplay == FDE_CSSDISPLAY_ListItem) { + const FDE_CSSRECT *pParRect = pParentStyle->GetBoundaryStyles()->GetMarginWidth(); + const FDE_CSSRECT *pParPaddingRect = pParentStyle->GetBoundaryStyles()->GetPaddingWidth(); + if (pParRect != NULL) { + fStart += pParRect->left.GetValue(); + fLineWidth -= pParRect->right.GetValue(); + if (pParPaddingRect != NULL) { + fStart += pParPaddingRect->left.GetValue(); + fLineWidth -= pParPaddingRect->right.GetValue(); + } + } + FDE_CSSRECT pNewRect; + pNewRect.left.Set(FDE_CSSLENGTHUNIT_Point, fStart); + pNewRect.right.Set(FDE_CSSLENGTHUNIT_Point, pRect->right.GetValue()); + pNewRect.top.Set(FDE_CSSLENGTHUNIT_Point, pRect->top.GetValue()); + pNewRect.bottom.Set(FDE_CSSLENGTHUNIT_Point, pRect->bottom.GetValue()); + pStyle->GetBoundaryStyles()->SetMarginWidth(pNewRect); + } + } + m_pBreak->SetLineWidth(fStart, fLineWidth); + FX_FLOAT fIndent = pParaStyle->GetTextIndent().GetValue(); + if (fIndent > 0) { + fStart += fIndent; + } + m_pBreak->SetLinePos(fStart); + m_pBreak->SetTabWidth(m_textParser.GetTabInterval(pStyle)); + if (m_pTabstopContext == NULL) { + m_pTabstopContext = FX_NEW CXFA_TextTabstopsContext; + } + m_textParser.GetTabstops(pStyle, m_pTabstopContext); + for (FX_INT32 i = 0; i < m_pTabstopContext->m_iTabCount; i++) { + XFA_TABSTOPS *pTab = m_pTabstopContext->m_tabstops.GetDataPtr(i); + m_pBreak->AddPositionedTab(pTab->fTabstops); + } + } + FX_FLOAT fFontSize = m_textParser.GetFontSize(m_pTextProvider, pStyle); + m_pBreak->SetFontSize(fFontSize); + m_pBreak->SetLineBreakTolerance(fFontSize * 0.2f); + m_pBreak->SetFont(m_textParser.GetFont(m_pTextProvider, pStyle)); + m_pBreak->SetHorizontalScale(m_textParser.GetHorScale(m_pTextProvider, pStyle, pXMLNode)); + m_pBreak->SetVerticalScale(m_textParser.GetVerScale(m_pTextProvider, pStyle)); + m_pBreak->SetCharSpace(pParaStyle->GetLetterSpacing().GetValue()); +} +FX_INT32 CXFA_TextLayout::GetText(CFX_WideString &wsText) +{ + GetTextDataNode(); + wsText.Empty(); + if (m_bRichText) { + } else { + wsText = m_pTextDataNode->GetContent(); + } + return wsText.GetLength(); +} +FX_FLOAT CXFA_TextLayout::GetLayoutHeight() +{ + if (m_pLoader == NULL) { + return 0; + } + FX_INT32 iCount = m_pLoader->m_lineHeights.GetSize(); + if (iCount == 0 && m_pLoader->m_fWidth > 0) { + CFX_SizeF szMax, szDef; + szMax.Set(m_pLoader->m_fWidth, m_pLoader->m_fHeight); + szDef.Set(0, 0); + m_pLoader->m_bSaveLineHeight = TRUE; + m_pLoader->m_fLastPos = 0; + CalcSize(szMax, szMax, szDef); + m_pLoader->m_bSaveLineHeight = FALSE; + return szDef.y; + } + FX_FLOAT fHeight = m_pLoader->m_fHeight; + if (fHeight < 0.1f) { + fHeight = 0; + for (FX_INT32 i = 0; i < iCount; i++) { + fHeight += m_pLoader->m_lineHeights.ElementAt(i); + } + } + return fHeight; +} +FX_FLOAT CXFA_TextLayout::StartLayout(FX_FLOAT fWidth ) +{ + if (m_pLoader == NULL) { + m_pLoader = FX_NEW CXFA_LoaderContext; + } + if (fWidth < 0 || (m_pLoader->m_fWidth > -1 && FXSYS_fabs(fWidth - m_pLoader->m_fWidth) > 0)) { + m_pLoader->m_lineHeights.RemoveAll(); + m_Blocks.RemoveAll(); + Unload(); + m_pLoader->m_fStartLineOffset = 0; + } + m_pLoader->m_fWidth = fWidth; + if (fWidth < 0) { + CFX_SizeF szMax, szDef; + szMax.Set(0, 0); + szDef.Set(0, 0); + m_pLoader->m_bSaveLineHeight = TRUE; + m_pLoader->m_fLastPos = 0; + CalcSize(szMax, szMax, szDef); + m_pLoader->m_bSaveLineHeight = FALSE; + fWidth = szDef.x; + } + return fWidth; +} +FX_BOOL CXFA_TextLayout::DoLayout(FX_INT32 iBlockIndex, FX_FLOAT &fCalcHeight, FX_FLOAT fContentAreaHeight , FX_FLOAT fTextHeight ) +{ + if (m_pLoader == NULL) { + return FALSE; + } + FX_INT32 iBlockCount = m_Blocks.GetSize(); + FX_FLOAT fHeight = fTextHeight; + if (fHeight < 0) { + fHeight = GetLayoutHeight(); + } + m_pLoader->m_fHeight = fHeight; + if (fContentAreaHeight < 0) { + return FALSE; + } + m_bHasBlock = TRUE; + if (iBlockCount == 0 && fHeight > 0) { + fHeight = fTextHeight - GetLayoutHeight(); + if (fHeight > 0) { + FX_INT32 iAlign = m_textParser.GetVAlgin(m_pTextProvider); + if (iAlign == XFA_ATTRIBUTEENUM_Middle) { + fHeight /= 2.0f; + } else if (iAlign != XFA_ATTRIBUTEENUM_Bottom) { + fHeight = 0; + } + m_pLoader->m_fStartLineOffset = fHeight; + } + } + FX_FLOAT fLinePos = m_pLoader->m_fStartLineOffset; + FX_INT32 iLineIndex = 0; + if (iBlockCount > 1) { + if (iBlockCount >= (iBlockIndex + 1) * 2) { + iLineIndex = m_Blocks.ElementAt(iBlockIndex * 2); + } else { + iLineIndex = m_Blocks.ElementAt(iBlockCount - 1) + m_Blocks.ElementAt(iBlockCount - 2); + } + if (m_pLoader->m_BlocksHeight.GetSize() > 0) { + for (FX_INT32 i = 0; i < iBlockIndex; i++) { + fLinePos -= m_pLoader->m_BlocksHeight.ElementAt(i * 2 + 1); + } + } + } + FX_INT32 iCount = m_pLoader->m_lineHeights.GetSize(); + FX_INT32 i = 0; + for (i = iLineIndex; i < iCount; i++) { + FX_FLOAT fLineHeight = m_pLoader->m_lineHeights.ElementAt(i); + if ((i == iLineIndex) && (fLineHeight - fContentAreaHeight > 0.001)) { + fCalcHeight = 0; + return TRUE; + } + if (fLinePos + fLineHeight - fContentAreaHeight > 0.001) { + if (iBlockCount >= (iBlockIndex + 1) * 2) { + m_Blocks.SetAt(iBlockIndex * 2, iLineIndex); + m_Blocks.SetAt(iBlockIndex * 2 + 1, i - iLineIndex); + } else { + m_Blocks.Add(iLineIndex); + m_Blocks.Add(i - iLineIndex); + } + if (i == iLineIndex) { + if (fCalcHeight <= fLinePos) { + if (m_pLoader->m_BlocksHeight.GetSize() > iBlockIndex * 2 && (m_pLoader->m_BlocksHeight.GetAt(iBlockIndex * 2) == iBlockIndex)) { + m_pLoader->m_BlocksHeight.SetAt(iBlockIndex * 2 + 1, fCalcHeight); + } else { + m_pLoader->m_BlocksHeight.Add((FX_FLOAT)iBlockIndex); + m_pLoader->m_BlocksHeight.Add(fCalcHeight); + } + } + return TRUE; + } + fCalcHeight = fLinePos; + return TRUE; + } + fLinePos += fLineHeight; + } + return FALSE; +} +FX_INT32 CXFA_TextLayout::CountBlocks() const +{ + FX_INT32 iCount = m_Blocks.GetSize() / 2; + return iCount > 0 ? iCount : 1; +} +FX_BOOL CXFA_TextLayout::CalcSize(const CFX_SizeF &minSize, const CFX_SizeF &maxSize, CFX_SizeF &defaultSize) +{ + defaultSize.x = maxSize.x; + if (defaultSize.x < 1) { + defaultSize.x = 0xFFFF; + } + if (m_pBreak != NULL) { + m_pBreak->Release(); + } + m_pBreak = CreateBreak(FALSE); + FX_FLOAT fLinePos = 0; + m_iLines = 0; + m_fMaxWidth = 0; + Loader(defaultSize, fLinePos, FALSE); + if (fLinePos < 0.1f) { + fLinePos = m_textParser.GetFontSize(m_pTextProvider, NULL); + } + if (m_pTabstopContext) { + delete m_pTabstopContext; + m_pTabstopContext = NULL; + } + defaultSize.Set(m_fMaxWidth, fLinePos); + return TRUE; +} +FX_BOOL CXFA_TextLayout::Layout(const CFX_SizeF &size, FX_FLOAT* fHeight) +{ + if (size.x < 1) { + return FALSE; + } + Unload(); + m_pBreak = CreateBreak(TRUE); + if (m_pLoader != NULL) { + m_pLoader->m_iTotalLines = -1; + m_pLoader->m_iChar = 0; + } + m_iLines = 0; + FX_FLOAT fLinePos = 0; + Loader(size, fLinePos, TRUE); + UpdateAlign(size.y, fLinePos); + if (m_pTabstopContext) { + delete m_pTabstopContext; + m_pTabstopContext = NULL; + } + if (fHeight) { + *fHeight = fLinePos; + } + return TRUE; +} +FX_BOOL CXFA_TextLayout::Layout(FX_INT32 iBlock) +{ + if (m_pLoader == NULL || iBlock < 0 || iBlock >= CountBlocks()) { + return FALSE; + } + if (m_pLoader->m_fWidth < 1) { + return FALSE; + } + m_pLoader->m_iTotalLines = -1; + m_iLines = 0; + FX_FLOAT fLinePos = 0; + CXFA_Node *pNode = NULL; + CFX_SizeF szText; + szText.Set(m_pLoader->m_fWidth, m_pLoader->m_fHeight); + FX_INT32 iCount = m_Blocks.GetSize(); + FX_INT32 iBlocksHeightCount = m_pLoader->m_BlocksHeight.GetSize(); + iBlocksHeightCount /= 2; + if (iBlock < iBlocksHeightCount) { + return TRUE; + } + if (iBlock == iBlocksHeightCount) { + Unload(); + m_pBreak = CreateBreak(TRUE); + fLinePos = m_pLoader->m_fStartLineOffset; + for (FX_INT32 i = 0; i < iBlocksHeightCount; i++) { + fLinePos -= m_pLoader->m_BlocksHeight.ElementAt(i * 2 + 1); + } + m_pLoader->m_iChar = 0; + if (iCount > 1) { + m_pLoader->m_iTotalLines = m_Blocks.ElementAt(iBlock * 2 + 1); + } + Loader(szText, fLinePos, TRUE); + if (iCount == 0 && m_pLoader->m_fStartLineOffset < 0.1f) { + UpdateAlign(szText.y, fLinePos); + } + } else if (m_pTextDataNode != NULL) { + iBlock *= 2; + if (iBlock < iCount - 2) { + m_pLoader->m_iTotalLines = m_Blocks.ElementAt(iBlock + 1); + } + m_pBreak->Reset(); + if (m_bRichText) { + IFDE_XMLNode* pContainerNode = GetXMLContainerNode(); + if (!pContainerNode) { + return TRUE; + } + IFDE_XMLNode *pXMLNode = m_pLoader->m_pXMLNode; + if (pXMLNode == NULL) { + return TRUE; + } + IFDE_XMLNode* pSaveXMLNode = m_pLoader->m_pXMLNode; + for (; pXMLNode; pXMLNode = pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling)) { + FX_BOOL bFlag = LoadRichText(pXMLNode, szText, fLinePos, m_pLoader->m_pParentStyle, TRUE); + if (!bFlag) { + break; + } + } + while (pXMLNode == NULL) { + pXMLNode = pSaveXMLNode->GetNodeItem(IFDE_XMLNode::Parent); + if (pXMLNode == pContainerNode) { + break; + } + FX_BOOL bFlag = LoadRichText(pXMLNode, szText, fLinePos, m_pLoader->m_pParentStyle, TRUE, NULL , FALSE); + if (!bFlag) { + break; + } + pSaveXMLNode = pXMLNode; + pXMLNode = pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling); + if (!pXMLNode) { + continue; + } + for (; pXMLNode; pXMLNode = pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling)) { + FX_BOOL bFlag = LoadRichText(pXMLNode, szText, fLinePos, m_pLoader->m_pParentStyle, TRUE); + if (!bFlag) { + break; + } + } + } + } else { + pNode = m_pLoader->m_pNode; + if (pNode == NULL) { + return TRUE; + } + LoadText(pNode, szText, fLinePos, TRUE); + } + } + if (iBlock == iCount) { + if (m_pTabstopContext != NULL) { + delete m_pTabstopContext; + m_pTabstopContext = NULL; + } + if (m_pLoader != NULL) { + delete m_pLoader; + m_pLoader = NULL; + } + } + return TRUE; +} +void CXFA_TextLayout::ItemBlocks(const CFX_RectF& rtText, FX_INT32 iBlockIndex) +{ + if (!m_pLoader) { + return; + } + FX_INT32 iCountHeight = m_pLoader->m_lineHeights.GetSize(); + if (iCountHeight == 0) { + return; + } + FX_BOOL bEndItem = TRUE; + FX_INT32 iBlockCount = m_Blocks.GetSize(); + FX_FLOAT fLinePos = m_pLoader->m_fStartLineOffset; + FX_INT32 iLineIndex = 0; + if (iBlockIndex > 0) { + FX_INT32 iBlockHeightCount = m_pLoader->m_BlocksHeight.GetSize(); + iBlockHeightCount /= 2; + if (iBlockHeightCount >= iBlockIndex) { + for (FX_INT32 i = 0; i < iBlockIndex; i++) { + fLinePos -= m_pLoader->m_BlocksHeight.ElementAt(i * 2 + 1); + } + } else { + fLinePos = 0; + } + iLineIndex = m_Blocks.ElementAt(iBlockCount - 1) + m_Blocks.ElementAt(iBlockCount - 2); + } + FX_INT32 i = 0; + for (i = iLineIndex; i < iCountHeight; i++) { + FX_FLOAT fLineHeight = m_pLoader->m_lineHeights.ElementAt(i); + if (fLinePos + fLineHeight - rtText.height > 0.001) { + m_Blocks.Add(iLineIndex); + m_Blocks.Add(i - iLineIndex); + bEndItem = FALSE; + break; + } + fLinePos += fLineHeight; + } + if (iCountHeight > 0 && (i - iLineIndex) > 0 && bEndItem) { + m_Blocks.Add(iLineIndex); + m_Blocks.Add(i - iLineIndex); + } +} +FX_BOOL CXFA_TextLayout::DrawString(CFX_RenderDevice *pFxDevice, const CFX_Matrix &tmDoc2Device, const CFX_RectF &rtClip, FX_INT32 iBlock ) +{ + IFDE_RenderDevice *pDevice = IFDE_RenderDevice::Create(pFxDevice); + if (pDevice == NULL) { + return FALSE; + } + FDE_HDEVICESTATE state = pDevice->SaveState(); + pDevice->SetClipRect(rtClip); + IFDE_SolidBrush *pSolidBrush = (IFDE_SolidBrush*)IFDE_Brush::Create(FDE_BRUSHTYPE_Solid); + IFDE_Pen *pPen = IFDE_Pen::Create(); + FXSYS_assert(pDevice != NULL && pSolidBrush != NULL && pPen != NULL); + if (m_pieceLines.GetSize() == 0) { + FX_INT32 iBlockCount = CountBlocks(); + for (FX_INT32 i = 0; i < iBlockCount; i++) { + Layout(i); + } + } + FXTEXT_CHARPOS *pCharPos = NULL; + FX_INT32 iCharCount = 0; + FX_INT32 iLineStart = 0; + FX_INT32 iPieceLines = m_pieceLines.GetSize(); + FX_INT32 iCount = m_Blocks.GetSize(); + if (iCount > 0) { + iBlock *= 2; + if (iBlock < iCount) { + iLineStart = m_Blocks.ElementAt(iBlock); + iPieceLines = m_Blocks.ElementAt(iBlock + 1); + } else { + iPieceLines = 0; + } + } + for (FX_INT32 i = 0; i < iPieceLines; i++) { + if(i + iLineStart >= m_pieceLines.GetSize()) { + break; + } + CXFA_PieceLine *pPieceLine = m_pieceLines.GetAt(i + iLineStart); + FX_INT32 iPieces = pPieceLine->m_textPieces.GetSize(); + FX_INT32 j = 0; + for (j = 0; j < iPieces; j++) { + XFA_LPCTEXTPIECE pPiece = pPieceLine->m_textPieces.GetAt(j); + FX_INT32 iChars = pPiece->iChars; + if (iCharCount < iChars) { + if (pCharPos != NULL) { + FDE_Free(pCharPos); + } + pCharPos = (FXTEXT_CHARPOS*)FDE_Alloc(iChars * sizeof(FXTEXT_CHARPOS)); + iCharCount = iChars; + } + FXSYS_memset(pCharPos, 0, iCharCount * sizeof(FXTEXT_CHARPOS)); + RenderString(pDevice, pSolidBrush, pPieceLine, j, pCharPos, tmDoc2Device); + } + for (j = 0; j < iPieces; j++) { + RenderPath(pDevice, pPen, pPieceLine, j, pCharPos, tmDoc2Device); + } + } + pDevice->RestoreState(state); + if (pCharPos != NULL) { + FDE_Free(pCharPos); + } + pSolidBrush->Release(); + pPen->Release(); + pDevice->Release(); + return iPieceLines; +} +void CXFA_TextLayout::UpdateAlign(FX_FLOAT fHeight, FX_FLOAT fBottom) +{ + fHeight -= fBottom; + if (fHeight < 0.1f) { + return; + } + switch (m_textParser.GetVAlgin(m_pTextProvider)) { + case XFA_ATTRIBUTEENUM_Middle: + fHeight /= 2.0f; + break; + case XFA_ATTRIBUTEENUM_Bottom: + break; + default: + return; + } + FX_INT32 iCount = m_pieceLines.GetSize(); + for (FX_INT32 i = 0; i < iCount; i++) { + CXFA_PieceLine *pPieceLine = m_pieceLines.GetAt(i); + FX_INT32 iPieces = pPieceLine->m_textPieces.GetSize(); + for (FX_INT32 j = 0; j < iPieces; j++) { + XFA_LPTEXTPIECE pPiece = pPieceLine->m_textPieces.GetAt(j); + CFX_RectF &rect = pPiece->rtPiece; + rect.top += fHeight; + } + } +} +FX_BOOL CXFA_TextLayout::Loader(const CFX_SizeF &szText, FX_FLOAT &fLinePos, FX_BOOL bSavePieces ) +{ + if (m_pAllocator == NULL) { + m_pAllocator = FX_CreateAllocator(FX_ALLOCTYPE_Static, 256, 0); + } + GetTextDataNode(); + if (m_pTextDataNode == NULL) { + return TRUE; + } + if (m_bRichText) { + IFDE_XMLNode *pXMLContainer = GetXMLContainerNode(); + if (pXMLContainer) { + if (!m_textParser.IsParsed()) { + m_textParser.DoParse(pXMLContainer, m_pTextProvider); + } + IFDE_CSSComputedStyle *pRootStyle = m_textParser.CreateRootStyle(m_pTextProvider); + LoadRichText(pXMLContainer, szText, fLinePos, pRootStyle, bSavePieces); + pRootStyle->Release(); + } + } else { + LoadText(m_pTextDataNode, szText, fLinePos, bSavePieces); + } + return TRUE; +} +void CXFA_TextLayout::LoadText(CXFA_Node *pNode, const CFX_SizeF &szText, FX_FLOAT &fLinePos, FX_BOOL bSavePieces) +{ + InitBreak(szText.x); + CXFA_Para para = m_pTextProvider->GetParaNode(); + FX_FLOAT fSpaceAbove = 0; + if (para.IsExistInXML()) { + fSpaceAbove = para.GetSpaceAbove(); + if (fSpaceAbove < 0.1f) { + fSpaceAbove = 0; + } + FX_INT32 verAlign = para.GetVerticalAlign(); + switch (verAlign) { + case XFA_ATTRIBUTEENUM_Top: + case XFA_ATTRIBUTEENUM_Middle: + case XFA_ATTRIBUTEENUM_Bottom: { + fLinePos += fSpaceAbove; + break; + } + } + } + CFX_WideString wsText = pNode->GetContent(); + wsText.TrimRight(L" "); + FX_BOOL bRet = AppendChar(wsText, fLinePos, fSpaceAbove, bSavePieces); + if (bRet && m_pLoader != NULL) { + m_pLoader->m_pNode = pNode; + } else { + EndBreak(FX_RTFBREAK_ParagraphBreak, fLinePos, bSavePieces); + } +} +FX_BOOL CXFA_TextLayout::LoadRichText(IFDE_XMLNode *pXMLNode, const CFX_SizeF &szText, FX_FLOAT &fLinePos, IFDE_CSSComputedStyle *pParentStyle, FX_BOOL bSavePieces, CXFA_LinkUserData* pLinkData, FX_BOOL bEndBreak, FX_BOOL bIsOl, FX_INT32 iLiCount) +{ + if (pXMLNode == NULL) { + return FALSE; + } + CXFA_TextParseContext *pContext = m_textParser.GetParseContextFromMap(pXMLNode); + FDE_CSSDISPLAY eDisplay = FDE_CSSDISPLAY_None; + FX_BOOL bContentNode = FALSE; + FX_FLOAT fSpaceBelow = 0; + IFDE_CSSComputedStyle *pStyle = NULL; + CFX_WideString wsName; + if (bEndBreak) { + FX_BOOL bCurOl = FALSE; + FX_BOOL bCurLi = FALSE; + IFDE_XMLElement *pElement = NULL; + if (pContext != NULL) { + if(m_bBlockContinue || (m_pLoader && pXMLNode == m_pLoader->m_pXMLNode)) { + m_bBlockContinue = TRUE; + } + if(pXMLNode->GetType() == FDE_XMLNODE_Text) { + bContentNode = TRUE; + } else if (pXMLNode->GetType() == FDE_XMLNODE_Element) { + pElement = (IFDE_XMLElement *)pXMLNode; + pElement->GetLocalTagName(wsName); + } + if (wsName == FX_WSTRC(L"ol")) { + bIsOl = TRUE; + bCurOl = TRUE; + } + if(m_bBlockContinue || bContentNode == FALSE) { + eDisplay = pContext->GetDisplay(); + if (eDisplay != FDE_CSSDISPLAY_Block && eDisplay != FDE_CSSDISPLAY_Inline && eDisplay != FDE_CSSDISPLAY_ListItem) { + return TRUE; + } + pStyle = m_textParser.ComputeStyle(pXMLNode, pParentStyle); + InitBreak(bContentNode ? pParentStyle : pStyle, eDisplay, szText.x, pXMLNode, pParentStyle); + if ((eDisplay == FDE_CSSDISPLAY_Block || eDisplay == FDE_CSSDISPLAY_ListItem) && (pStyle != NULL) + && (wsName.IsEmpty() || (wsName != FX_WSTRC(L"body") && wsName != FX_WSTRC(L"html") && wsName != FX_WSTRC(L"ol") && wsName != FX_WSTRC(L"ul")))) { + const FDE_CSSRECT *pRect = pStyle->GetBoundaryStyles()->GetMarginWidth(); + if (pRect) { + fLinePos += pRect->top.GetValue(); + fSpaceBelow = pRect->bottom.GetValue(); + } + } + if (wsName == FX_WSTRC(L"a")) { + CFX_WideString wsLinkContent; + FXSYS_assert(pElement); + pElement->GetString(FX_WSTRC(L"href").GetPtr(), wsLinkContent); + if (!wsLinkContent.IsEmpty()) { + pLinkData = FDE_NewWith(m_pAllocator)CXFA_LinkUserData(m_pAllocator, wsLinkContent.GetBuffer(wsLinkContent.GetLength())); + wsLinkContent.ReleaseBuffer(wsLinkContent.GetLength()); + } + } + FX_INT32 iTabCount = m_textParser.CountTabs(bContentNode ? pParentStyle : pStyle); + FX_BOOL bSpaceRun = m_textParser.IsSpaceRun(bContentNode ? pParentStyle : pStyle); + CFX_WideString wsText; + if (bContentNode && iTabCount == 0) { + ((IFDE_XMLText *)pXMLNode)->GetText(wsText); + } else if (wsName == FX_WSTRC(L"br")) { + wsText = L'\n'; + } else if (wsName == FX_WSTRC(L"li")) { + bCurLi = TRUE; + if (bIsOl) { + wsText.Format(FX_LPCWSTR(L"%d. "), iLiCount); + } else { + wsText = 0x00B7 + FX_WSTRC(L" "); + } + } else if (!bContentNode) { + if (iTabCount > 0) + while (iTabCount-- > 0) { + wsText += L'\t'; + } + else { + m_textParser.GetEmbbedObj(m_pTextProvider, pXMLNode, wsText); + } + } + FX_INT32 iLength = wsText.GetLength(); + if (iLength > 0 && bContentNode && !bSpaceRun) { + ProcessText(wsText); + } + if (m_pLoader) { + if (wsText.GetLength() > 0 && (m_pLoader->m_dwFlags & XFA_LOADERCNTXTFLG_FILTERSPACE)) { + wsText.TrimLeft(0x20); + } + if (FDE_CSSDISPLAY_Block == eDisplay) { + m_pLoader->m_dwFlags |= XFA_LOADERCNTXTFLG_FILTERSPACE; + } else if (FDE_CSSDISPLAY_Inline == eDisplay && (m_pLoader->m_dwFlags & XFA_LOADERCNTXTFLG_FILTERSPACE)) { + m_pLoader->m_dwFlags &= ~XFA_LOADERCNTXTFLG_FILTERSPACE; + } else if (wsText.GetLength() > 0 && (0x20 == wsText.GetAt(wsText.GetLength() - 1))) { + m_pLoader->m_dwFlags |= XFA_LOADERCNTXTFLG_FILTERSPACE; + } else if (wsText.GetLength() == 0) + ; + else { + m_pLoader->m_dwFlags &= ~XFA_LOADERCNTXTFLG_FILTERSPACE; + } + } + if (wsText.GetLength() > 0) { + if (m_pLoader == NULL || m_pLoader->m_iChar == 0) { + if (pLinkData) { + pLinkData->AddRef(); + } + CXFA_TextUserData *pUserData = FDE_NewWith(m_pAllocator)CXFA_TextUserData(m_pAllocator, bContentNode ? pParentStyle : pStyle, pLinkData); + m_pBreak->SetUserData(pUserData); + } + if (AppendChar(wsText, fLinePos, 0, bSavePieces)) { + if ( m_pLoader) { + m_pLoader->m_dwFlags &= ~XFA_LOADERCNTXTFLG_FILTERSPACE; + } + if (IsEnd(bSavePieces)) { + if (m_pLoader && m_pLoader->m_iTotalLines > -1) { + m_pLoader->m_pXMLNode = pXMLNode; + m_pLoader->m_pParentStyle = pParentStyle; + } + if (pStyle != NULL) { + pStyle->Release(); + } + return FALSE; + } + return TRUE; + } + } + } + } + FX_BOOL ret = TRUE; + for (IFDE_XMLNode *pChildNode = pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild); pChildNode; pChildNode = pChildNode->GetNodeItem(IFDE_XMLNode::NextSibling)) { + if (bCurOl) { + iLiCount++; + } + ret = LoadRichText(pChildNode, szText, fLinePos, pContext ? pStyle : pParentStyle, bSavePieces, pLinkData, TRUE, bIsOl, iLiCount); + if(ret == FALSE) { + return FALSE; + } + } + if (m_pLoader) { + if (FDE_CSSDISPLAY_Block == eDisplay) { + m_pLoader->m_dwFlags |= XFA_LOADERCNTXTFLG_FILTERSPACE; + } + } + if (bCurLi) { + EndBreak(FX_RTFBREAK_LineBreak, fLinePos, bSavePieces); + } + } else { + if (pContext != NULL) { + eDisplay = pContext->GetDisplay(); + } + } + if(m_bBlockContinue) { + if (pContext != NULL && !bContentNode) { + FX_DWORD dwStatus = (eDisplay == FDE_CSSDISPLAY_Block) ? FX_RTFBREAK_ParagraphBreak : FX_RTFBREAK_PieceBreak; + EndBreak(dwStatus, fLinePos, bSavePieces); + if (eDisplay == FDE_CSSDISPLAY_Block) { + fLinePos += fSpaceBelow; + if (m_pTabstopContext) { + m_pTabstopContext->RemoveAll(); + } + } + if ( wsName == FX_WSTRC(L"a")) { + if (pLinkData != NULL) { + FX_DWORD dwRefCount = pLinkData->Release(); + pLinkData = NULL; + } + } + if (IsEnd(bSavePieces)) { + if (pStyle) { + pStyle->Release(); + } + if (m_pLoader && m_pLoader->m_iTotalLines > -1) { + m_pLoader->m_pXMLNode = pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling); + m_pLoader->m_pParentStyle = pParentStyle; + } + return FALSE; + } + } + } + if (pStyle != NULL) { + pStyle->Release(); + } + return TRUE; +} +FX_BOOL CXFA_TextLayout::AppendChar(const CFX_WideString &wsText, FX_FLOAT &fLinePos, FX_FLOAT fSpaceAbove, FX_BOOL bSavePieces) +{ + FX_DWORD dwStatus = 0; + FX_INT32 iChar = 0; + if (m_pLoader) { + iChar = m_pLoader->m_iChar; + } + FX_INT32 iLength = wsText.GetLength(); + for (FX_INT32 i = iChar; i < iLength; i++) { + FX_WCHAR wch = wsText.GetAt(i); + if (wch == 0xA0) { + wch = 0x20; + } + if ((dwStatus = m_pBreak->AppendChar(wch)) > FX_RTFBREAK_PieceBreak) { + AppendTextLine(dwStatus, fLinePos, bSavePieces); + if (IsEnd(bSavePieces)) { + if (m_pLoader != NULL) { + m_pLoader->m_iChar = i; + } + return TRUE; + } + if (dwStatus == FX_RTFBREAK_ParagraphBreak && m_bRichText) { + fLinePos += fSpaceAbove; + } + } + } + if(m_pLoader) { + m_pLoader->m_iChar = 0; + } + return FALSE; +} +FX_BOOL CXFA_TextLayout::IsEnd(FX_BOOL bSavePieces) +{ + if (!bSavePieces) { + return FALSE; + } + if (m_pLoader && m_pLoader->m_iTotalLines > 0) { + return m_iLines >= m_pLoader->m_iTotalLines; + } + return FALSE; +} +void CXFA_TextLayout::ProcessText(CFX_WideString &wsText) +{ + FX_INT32 iLen = wsText.GetLength(); + if (iLen == 0) { + return; + } + FX_LPWSTR psz = wsText.GetBuffer(iLen); + FX_INT32 iTrimLeft = 0; + FX_WCHAR wch = 0, wPrev = 0; + for (FX_INT32 i = 0; i < iLen; i++) { + wch = psz[i]; + if (wch < 0x20) { + wch = 0x20; + } + if (wch == 0x20 && wPrev == 0x20) { + continue; + } + wPrev = wch; + psz[iTrimLeft++] = wch; + } + wsText.ReleaseBuffer(iLen); + wsText = wsText.Left(iTrimLeft); +} +void CXFA_TextLayout::EndBreak(FX_DWORD dwStatus, FX_FLOAT &fLinePos, FX_BOOL bSavePieces) +{ + dwStatus = m_pBreak->EndBreak(dwStatus); + if (dwStatus > FX_RTFBREAK_PieceBreak) { + AppendTextLine(dwStatus, fLinePos, bSavePieces, TRUE); + } +} +void CXFA_TextLayout::DoTabstops(IFDE_CSSComputedStyle *pStyle, CXFA_PieceLine *pPieceLine) +{ + if (m_pTabstopContext == NULL || m_pTabstopContext->m_iTabCount == 0) { + return; + } + if (pStyle == NULL || pPieceLine == NULL) { + return; + } + FX_INT32 iPieces = pPieceLine->m_textPieces.GetSize(); + if (iPieces == 0) { + return; + } + XFA_LPTEXTPIECE pPiece = pPieceLine->m_textPieces.GetAt(iPieces - 1); + FX_INT32 &iTabstopsIndex = m_pTabstopContext->m_iTabIndex; + FX_INT32 iCount = m_textParser.CountTabs(pStyle); + if (iTabstopsIndex > m_pTabstopContext->m_iTabCount - 1) { + return; + } + if (iCount > 0) { + iTabstopsIndex++; + m_pTabstopContext->m_bTabstops = TRUE; + FX_FLOAT fRight = 0; + if (iPieces > 1) { + XFA_LPTEXTPIECE p = pPieceLine->m_textPieces.GetAt(iPieces - 2); + fRight = p->rtPiece.right(); + } + m_pTabstopContext->m_fTabWidth = pPiece->rtPiece.width + pPiece->rtPiece.left - fRight; + } else if (iTabstopsIndex > -1) { + FX_FLOAT fLeft = 0; + if (m_pTabstopContext->m_bTabstops) { + XFA_TABSTOPS *pTabstops = m_pTabstopContext->m_tabstops.GetDataPtr(iTabstopsIndex); + FX_DWORD dwAlgin = pTabstops->dwAlign; + if (dwAlgin == FX_HashCode_String_GetW((FX_LPCWSTR)L"center", 6)) { + fLeft = pPiece->rtPiece.width / 2.0f; + } else if (dwAlgin == FX_HashCode_String_GetW((FX_LPCWSTR)L"right", 5) + || dwAlgin == FX_HashCode_String_GetW((FX_LPCWSTR)L"before", 6)) { + fLeft = pPiece->rtPiece.width; + } else if (dwAlgin == FX_HashCode_String_GetW((FX_LPCWSTR)L"decimal", 7)) { + FX_INT32 iChars = pPiece->iChars; + for (FX_INT32 i = 0; i < iChars; i++) { + if (pPiece->pszText[i] == L'.') { + break; + } + fLeft += pPiece->pWidths[i] / 20000.0f; + } + } + m_pTabstopContext->m_fLeft = FX_MIN(fLeft, m_pTabstopContext->m_fTabWidth); + m_pTabstopContext->m_bTabstops = FALSE; + m_pTabstopContext->m_fTabWidth = 0; + } + pPiece->rtPiece.left -= m_pTabstopContext->m_fLeft; + } +} +void CXFA_TextLayout::AppendTextLine(FX_DWORD dwStatus, FX_FLOAT &fLinePos, FX_BOOL bSavePieces, FX_BOOL bEndBreak) +{ + FX_INT32 iPieces = m_pBreak->CountBreakPieces(); + if (iPieces < 1) { + return; + } + IFDE_CSSComputedStyle *pStyle = NULL; + if (bSavePieces) { + CXFA_PieceLine *pPieceLine = FDE_NewWith(m_pAllocator)CXFA_PieceLine; + m_pieceLines.Add(pPieceLine); + if (m_pTabstopContext) { + m_pTabstopContext->Reset(); + } + FX_FLOAT fLineStep = 0, fBaseLine = 0; + FX_INT32 i = 0; + for (i = 0; i < iPieces; i++) { + const CFX_RTFPiece *pPiece = m_pBreak->GetBreakPiece(i); + CXFA_TextUserData *pUserData = (CXFA_TextUserData*)pPiece->m_pUserData; + if (pUserData != NULL) { + pStyle = pUserData->m_pStyle; + } + FX_FLOAT fVerScale = pPiece->m_iVerticalScale / 100.0f; + XFA_LPTEXTPIECE pTP = (XFA_LPTEXTPIECE)m_pAllocator->Alloc(sizeof(XFA_TEXTPIECE)); + pTP->pszText = (FX_LPWSTR)m_pAllocator->Alloc(pPiece->m_iChars * sizeof(FX_WCHAR)); + pTP->pWidths = (FX_INT32*)m_pAllocator->Alloc(pPiece->m_iChars * sizeof(FX_INT32)); + pTP->iChars = pPiece->m_iChars; + pPiece->GetString(pTP->pszText); + pPiece->GetWidths(pTP->pWidths); + pTP->iBidiLevel = pPiece->m_iBidiLevel; + pTP->iHorScale = pPiece->m_iHorizontalScale; + pTP->iVerScale = pPiece->m_iVerticalScale; + m_textParser.GetUnderline(m_pTextProvider, pStyle, pTP->iUnderline, pTP->iPeriod); + m_textParser.GetLinethrough(m_pTextProvider, pStyle, pTP->iLineThrough); + pTP->dwColor = m_textParser.GetColor(m_pTextProvider, pStyle); + pTP->pFont = m_textParser.GetFont(m_pTextProvider, pStyle); + pTP->fFontSize = m_textParser.GetFontSize(m_pTextProvider, pStyle); + pTP->rtPiece.left = pPiece->m_iStartPos / 20000.0f; + pTP->rtPiece.width = pPiece->m_iWidth / 20000.0f; + pTP->rtPiece.height = (FX_FLOAT)pPiece->m_iFontSize * fVerScale / 20.0f; + FX_FLOAT fBaseLineTemp = m_textParser.GetBaseline(m_pTextProvider, pStyle); + pTP->rtPiece.top = fBaseLineTemp; + pPieceLine->m_textPieces.Add(pTP); + FX_FLOAT fLineHeight = m_textParser.GetLineHeight(m_pTextProvider, pStyle, m_iLines == 0, fVerScale); + if (fBaseLineTemp > 0) { + FX_FLOAT fLineHeightTmp = fBaseLineTemp + pTP->rtPiece.height; + if (fLineHeight < fLineHeightTmp) { + fLineHeight = fLineHeightTmp; + } else { + fBaseLineTemp = 0; + } + } else if (fBaseLine < -fBaseLineTemp) { + fBaseLine = -fBaseLineTemp; + } + fLineStep = FX_MAX(fLineStep, fLineHeight); + if ( pUserData != NULL && pUserData->m_pLinkData != NULL) { + pUserData->m_pLinkData->AddRef(); + pTP->pLinkData = pUserData->m_pLinkData; + } else { + pTP->pLinkData = NULL; + } + DoTabstops(pStyle, pPieceLine); + } + for (i = 0; i < iPieces; i++) { + XFA_LPTEXTPIECE pTP = pPieceLine->m_textPieces.GetAt(i); + FX_FLOAT &fTop = pTP->rtPiece.top; + FX_FLOAT fBaseLineTemp = fTop; + fTop = fLinePos + fLineStep - pTP->rtPiece.height - fBaseLineTemp; + fTop = FX_MAX(0, fTop); + } + fLinePos += fLineStep + fBaseLine; + } else { + FX_FLOAT fLineStep = 0; + FX_FLOAT fLineWidth = 0; + for (FX_INT32 i = 0; i < iPieces; i++) { + const CFX_RTFPiece *pPiece = m_pBreak->GetBreakPiece(i); + CXFA_TextUserData *pUserData = (CXFA_TextUserData*)pPiece->m_pUserData; + if (pUserData != NULL) { + pStyle = pUserData->m_pStyle; + } + FX_FLOAT fVerScale = pPiece->m_iVerticalScale / 100.0f; + FX_FLOAT fBaseLine = m_textParser.GetBaseline(m_pTextProvider, pStyle); + FX_FLOAT fLineHeight = m_textParser.GetLineHeight(m_pTextProvider, pStyle, m_iLines == 0, fVerScale); + if (fBaseLine > 0) { + FX_FLOAT fLineHeightTmp = fBaseLine + (FX_FLOAT)pPiece->m_iFontSize * fVerScale / 20.0f; + if (fLineHeight < fLineHeightTmp) { + fLineHeight = fLineHeightTmp; + } + } + fLineStep = FX_MAX(fLineStep, fLineHeight); + fLineWidth += pPiece->m_iWidth / 20000.0f; + } + fLinePos += fLineStep; + m_fMaxWidth = FX_MAX(m_fMaxWidth, fLineWidth); + if (m_pLoader && m_pLoader->m_bSaveLineHeight) { + FX_FLOAT fHeight = fLinePos - m_pLoader->m_fLastPos; + m_pLoader->m_fLastPos = fLinePos; + m_pLoader->m_lineHeights.Add(fHeight); + } + } + m_pBreak->ClearBreakPieces(); + if (dwStatus == FX_RTFBREAK_ParagraphBreak) { + m_pBreak->Reset(); + if (pStyle == NULL && bEndBreak) { + CXFA_Para para = m_pTextProvider->GetParaNode(); + if (para.IsExistInXML()) { + FX_FLOAT fStartPos = para.GetMarginLeft(); + FX_FLOAT fIndent = para.GetTextIndent(); + if (fIndent > 0) { + fStartPos += fIndent; + } + FX_FLOAT fSpaceBelow = para.GetSpaceBelow(); + if (fSpaceBelow < 0.1f) { + fSpaceBelow = 0; + } + m_pBreak->SetLinePos(fStartPos); + fLinePos += fSpaceBelow; + } + } + } + if (pStyle != NULL) { + FX_FLOAT fStart = 0; + const FDE_CSSRECT *pRect = pStyle->GetBoundaryStyles()->GetMarginWidth(); + if (pRect) { + fStart = pRect->left.GetValue(); + } + FX_FLOAT fTextIndent = pStyle->GetParagraphStyles()->GetTextIndent().GetValue(); + if (fTextIndent < 0) { + fStart -= fTextIndent; + } + m_pBreak->SetLinePos(fStart); + } + m_iLines++; +} +void CXFA_TextLayout::RenderString(IFDE_RenderDevice *pDevice, IFDE_SolidBrush *pBrush, CXFA_PieceLine *pPieceLine, FX_INT32 iPiece, FXTEXT_CHARPOS *pCharPos, const CFX_Matrix &tmDoc2Device) +{ + XFA_LPCTEXTPIECE pPiece = pPieceLine->m_textPieces.GetAt(iPiece); + FX_INT32 iCount = GetDisplayPos(pPiece, pCharPos); + if (iCount > 0) { + pBrush->SetColor(pPiece->dwColor); + pDevice->DrawString(pBrush, pPiece->pFont, pCharPos, iCount, pPiece->fFontSize, &tmDoc2Device); + } + pPieceLine->m_charCounts.Add(iCount); +} +void CXFA_TextLayout::RenderPath(IFDE_RenderDevice *pDevice, IFDE_Pen *pPen, CXFA_PieceLine *pPieceLine, FX_INT32 iPiece, FXTEXT_CHARPOS *pCharPos, const CFX_Matrix &tmDoc2Device) +{ + XFA_TEXTPIECE *pPiece = pPieceLine->m_textPieces.GetAt(iPiece); + FX_BOOL bNoUnderline = pPiece->iUnderline < 1 || pPiece->iUnderline > 2; + FX_BOOL bNoLineThrough = pPiece->iLineThrough < 1 || pPiece->iLineThrough > 2; + if (bNoUnderline && bNoLineThrough) { + return; + } + pPen->SetColor(pPiece->dwColor); + IFDE_Path *pPath = IFDE_Path::Create(); + FX_INT32 iChars = GetDisplayPos(pPiece, pCharPos); + if (iChars > 0) { + CFX_PointF pt1, pt2; + FX_FLOAT fEndY = pCharPos[0].m_OriginY + 1.05f; + FX_INT32 i = 0; + if (pPiece->iPeriod == XFA_ATTRIBUTEENUM_Word) { + for (FX_INT32 i = 0; i < pPiece->iUnderline; i++) { + for (FX_INT32 j = 0; j < iChars; j++) { + pt1.x = pCharPos[j].m_OriginX; + pt2.x = pt1.x + pCharPos[j].m_FontCharWidth * pPiece->fFontSize / 1000.0f; + pt1.y = pt2.y = fEndY; + pPath->AddLine(pt1, pt2); + } + fEndY += 2.0f; + } + } else { + pt1.x = pCharPos[0].m_OriginX; + pt2.x = pCharPos[iChars - 1].m_OriginX + pCharPos[iChars - 1].m_FontCharWidth * pPiece->fFontSize / 1000.0f; + for (FX_INT32 i = 0; i < pPiece->iUnderline; i++) { + pt1.y = pt2.y = fEndY; + pPath->AddLine(pt1, pt2); + fEndY += 2.0f; + } + } + fEndY = pCharPos[0].m_OriginY - pPiece->rtPiece.height * 0.25f; + pt1.x = pCharPos[0].m_OriginX; + pt2.x = pCharPos[iChars - 1].m_OriginX + pCharPos[iChars - 1].m_FontCharWidth * pPiece->fFontSize / 1000.0f; + for (i = 0; i < pPiece->iLineThrough; i++) { + pt1.y = pt2.y = fEndY; + pPath->AddLine(pt1, pt2); + fEndY += 2.0f; + } + } else { + if (bNoLineThrough && (bNoUnderline || pPiece->iPeriod != XFA_ATTRIBUTEENUM_All)) { + goto XFA_RenderPathRet; + } + FX_INT32 iCharsTmp = 0; + FX_INT32 iPiecePrev = iPiece, iPieceNext = iPiece; + while (iPiecePrev > 0) { + iPiecePrev--; + iCharsTmp = pPieceLine->m_charCounts.GetAt(iPiecePrev); + if (iCharsTmp > 0) { + break; + } + } + if (iCharsTmp == 0) { + goto XFA_RenderPathRet; + } + iCharsTmp = 0; + FX_INT32 iPieces = pPieceLine->m_textPieces.GetSize(); + while (iPieceNext < iPieces - 1) { + iPieceNext++; + iCharsTmp = pPieceLine->m_charCounts.GetAt(iPieceNext); + if (iCharsTmp > 0) { + break; + } + } + if (iCharsTmp == 0) { + goto XFA_RenderPathRet; + } + FX_FLOAT fOrgX = 0.0f, fEndX = 0.0f; + pPiece = pPieceLine->m_textPieces.GetAt(iPiecePrev); + iChars = GetDisplayPos(pPiece, pCharPos); + if (iChars < 1) { + goto XFA_RenderPathRet; + } + fOrgX = pCharPos[iChars - 1].m_OriginX + pCharPos[iChars - 1].m_FontCharWidth * pPiece->fFontSize / 1000.0f; + pPiece = pPieceLine->m_textPieces.GetAt(iPieceNext); + iChars = GetDisplayPos(pPiece, pCharPos); + if (iChars < 1) { + goto XFA_RenderPathRet; + } + fEndX = pCharPos[0].m_OriginX; + CFX_PointF pt1, pt2; + pt1.x = fOrgX, pt2.x = fEndX; + FX_FLOAT fEndY = pCharPos[0].m_OriginY + 1.05f; + FX_INT32 i = 0; + for (i = 0; i < pPiece->iUnderline; i++) { + pt1.y = pt2.y = fEndY; + pPath->AddLine(pt1, pt2); + fEndY += 2.0f; + } + fEndY = pCharPos[0].m_OriginY - pPiece->rtPiece.height * 0.25f; + for (i = 0; i < pPiece->iLineThrough; i++) { + pt1.y = pt2.y = fEndY; + pPath->AddLine(pt1, pt2); + fEndY += 2.0f; + } + } + pDevice->DrawPath(pPen, 1, pPath, &tmDoc2Device); +XFA_RenderPathRet: + pPath->Release(); +} +FX_INT32 CXFA_TextLayout::GetDisplayPos(XFA_LPCTEXTPIECE pPiece, FXTEXT_CHARPOS *pCharPos, FX_BOOL bCharCode ) +{ + if (pPiece == NULL) { + return 0; + } + FX_RTFTEXTOBJ tr; + if (!ToRun(pPiece, tr)) { + return 0; + } + return m_pBreak->GetDisplayPos(&tr, pCharPos, bCharCode); +} +FX_BOOL CXFA_TextLayout::ToRun(XFA_LPCTEXTPIECE pPiece, FX_RTFTEXTOBJ &tr) +{ + FX_INT32 iLength = pPiece->iChars; + if (iLength < 1) { + return FALSE; + } + tr.pStr = pPiece->pszText; + tr.pFont = pPiece->pFont; + tr.pRect = &pPiece->rtPiece; + tr.pWidths = pPiece->pWidths; + tr.iLength = iLength; + tr.fFontSize = pPiece->fFontSize; + tr.iBidiLevel = pPiece->iBidiLevel; + tr.iCharRotation = 0; + tr.wLineBreakChar = L'\n'; + tr.iVerticalScale = pPiece->iVerScale; + tr.dwLayoutStyles = FX_RTFLAYOUTSTYLE_ExpandTab; + tr.iHorizontalScale = pPiece->iHorScale; + return TRUE; +} diff --git a/xfa/src/fxfa/src/app/xfa_textlayout.h b/xfa/src/fxfa/src/app/xfa_textlayout.h new file mode 100644 index 0000000000..47b37720ed --- /dev/null +++ b/xfa/src/fxfa/src/app/xfa_textlayout.h @@ -0,0 +1,391 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FXFA_TEXTLAYOUT_H +#define _FXFA_TEXTLAYOUT_H +#define XFA_LOADERCNTXTFLG_FILTERSPACE 0x001 +class CXFA_TextTabstopsContext; +class IXFA_TextProvider +{ +public: + virtual CXFA_Node* GetTextNode(FX_BOOL &bRichText) = 0; + virtual CXFA_Para GetParaNode() = 0; + virtual CXFA_Font GetFontNode() = 0; + virtual FX_BOOL IsCheckButtonAndAutoWidth() = 0; + virtual CXFA_FFDoc* GetDocNode() = 0; + virtual FX_BOOL GetEmbbedObj(FX_BOOL bURI, FX_BOOL bRaw, const CFX_WideString &wsAttr, CFX_WideString &wsValue) = 0; +}; +class CXFA_CSSTagProvider : public IFDE_CSSTagProvider, public CFX_Object +{ +public: + CXFA_CSSTagProvider () + : m_bTagAviliable(FALSE), + m_bContent(FALSE) + {} + virtual ~CXFA_CSSTagProvider(); + virtual CFX_WideStringC GetTagName() + { + return m_wsTagName; + } + virtual FX_POSITION GetFirstAttribute() + { + return m_Attributes.GetStartPosition(); + } + virtual void GetNextAttribute(FX_POSITION &pos, CFX_WideStringC &wsAttr, CFX_WideStringC &wsValue); + void SetTagNameObj(const CFX_WideString &wsName) + { + m_wsTagName = wsName; + } + void SetAttribute(const CFX_WideString &wsAttr, const CFX_WideString &wsValue); + FX_BOOL m_bTagAviliable; + FX_BOOL m_bContent; +protected: + CFX_WideString m_wsTagName; + CFX_MapPtrToPtr m_Attributes; +}; +class CXFA_TextParseContext : public CFX_Target +{ +public: + CXFA_TextParseContext() : m_ppMatchedDecls(NULL), m_dwMatchedDecls(0), m_eDisplay(FDE_CSSDISPLAY_None), m_pParentStyle(NULL) {} + ~CXFA_TextParseContext() + { + if (m_ppMatchedDecls != NULL) { + FDE_Free(m_ppMatchedDecls); + } + } + void SetDisplay(FDE_CSSDISPLAY eDisplay) + { + m_eDisplay = eDisplay; + } + FDE_CSSDISPLAY GetDisplay() const + { + return m_eDisplay; + } + void SetDecls(const IFDE_CSSDeclaration **ppDeclArray, FX_INT32 iDeclCount); + const IFDE_CSSDeclaration** GetDecls() + { + return (const IFDE_CSSDeclaration**)m_ppMatchedDecls; + } + FX_DWORD CountDecls() const + { + return m_dwMatchedDecls; + } + IFDE_CSSComputedStyle * m_pParentStyle; +protected: + IFDE_CSSDeclaration **m_ppMatchedDecls; + FX_DWORD m_dwMatchedDecls : 28; + FDE_CSSDISPLAY m_eDisplay : 4; +}; +class CXFA_TextParser : public CFX_Object +{ +public: + CXFA_TextParser() : m_pAllocator(NULL), m_pSelector(NULL), m_pUASheet(NULL) {} + virtual ~CXFA_TextParser(); + void Reset(); + void DoParse(IFDE_XMLNode *pXMLContainer, IXFA_TextProvider *pTextProvider); + IFDE_CSSComputedStyle* CreateRootStyle(IXFA_TextProvider *pTextProvider); + IFDE_CSSComputedStyle* ComputeStyle(IFDE_XMLNode *pXMLNode, IFDE_CSSComputedStyle *pParentStyle); + FX_BOOL IsParsed() const + { + return m_pAllocator != NULL; + } + + FX_INT32 GetVAlgin(IXFA_TextProvider *pTextProvider) const; + FX_FLOAT GetTabInterval(IFDE_CSSComputedStyle *pStyle) const; + FX_INT32 CountTabs(IFDE_CSSComputedStyle *pStyle) const; + FX_BOOL IsSpaceRun(IFDE_CSSComputedStyle *pStyle) const; + FX_BOOL GetTabstops(IFDE_CSSComputedStyle *pStyle, CXFA_TextTabstopsContext *pTabstopContext); + IFX_Font* GetFont(IXFA_TextProvider *pTextProvider, IFDE_CSSComputedStyle *pStyle) const; + FX_FLOAT GetFontSize(IXFA_TextProvider *pTextProvider, IFDE_CSSComputedStyle *pStyle) const; + FX_INT32 GetHorScale(IXFA_TextProvider *pTextProvider, IFDE_CSSComputedStyle *pStyle, IFDE_XMLNode *pXMLNode) const; + FX_INT32 GetVerScale(IXFA_TextProvider *pTextProvider, IFDE_CSSComputedStyle *pStyle) const; + void GetUnderline(IXFA_TextProvider *pTextProvider, IFDE_CSSComputedStyle *pStyle, FX_INT32 &iUnderline, FX_INT32 &iPeriod) const; + void GetLinethrough(IXFA_TextProvider *pTextProvider, IFDE_CSSComputedStyle *pStyle, FX_INT32 &iLinethrough) const; + FX_ARGB GetColor(IXFA_TextProvider *pTextProvider, IFDE_CSSComputedStyle *pStyle) const; + FX_FLOAT GetBaseline(IXFA_TextProvider *pTextProvider, IFDE_CSSComputedStyle *pStyle) const; + FX_FLOAT GetLineHeight(IXFA_TextProvider *pTextProvider, IFDE_CSSComputedStyle *pStyle, FX_BOOL bFirst, FX_FLOAT fVerScale) const; + FX_BOOL GetEmbbedObj(IXFA_TextProvider *pTextProvider, IFDE_XMLNode *pXMLNode, CFX_WideString &wsValue); + CXFA_TextParseContext* GetParseContextFromMap(IFDE_XMLNode *pXMLNode); +private: + void InitCSSData(IXFA_TextProvider *pTextProvider); + void ParseRichText(IFDE_XMLNode *pXMLNode, IFDE_CSSComputedStyle *pParentStyle); + void ParseTagInfo(IFDE_XMLNode *pXMLNode, CXFA_CSSTagProvider &tagProvider); + IFDE_CSSStyleSheet* LoadDefaultSheetStyle(); + IFDE_CSSComputedStyle* CreateStyle(IFDE_CSSComputedStyle *pParentStyle); + IFX_MEMAllocator *m_pAllocator; + IFDE_CSSStyleSelector *m_pSelector; + IFDE_CSSStyleSheet *m_pUASheet; + CFX_MapPtrTemplate m_mapXMLNodeToParseContext; +}; +class CXFA_LoaderContext : public CFX_Object +{ +public: + CXFA_LoaderContext() : m_bSaveLineHeight(FALSE) + , m_fWidth(0) + , m_fHeight(0) + , m_fLastPos(0) + , m_fStartLineOffset(0) + , m_iChar(0) + , m_iTotalLines(-1) + , m_pXMLNode(NULL) + , m_pNode(NULL) + , m_pParentStyle(NULL) + , m_dwFlags(0) + {} + FX_BOOL m_bSaveLineHeight; + FX_FLOAT m_fWidth; + FX_FLOAT m_fHeight; + FX_FLOAT m_fLastPos; + FX_FLOAT m_fStartLineOffset; + FX_INT32 m_iChar; + FX_INT32 m_iLines; + FX_INT32 m_iTotalLines; + IFDE_XMLNode *m_pXMLNode; + CXFA_Node *m_pNode; + IFDE_CSSComputedStyle *m_pParentStyle; + CFX_ArrayTemplate m_lineHeights; + FX_DWORD m_dwFlags; + CFX_FloatArray m_BlocksHeight; +}; +class CXFA_LinkUserData : public IFX_Unknown, public CFX_Target +{ +public: + CXFA_LinkUserData(IFX_MEMAllocator *pAllocator, FX_LPWSTR pszText) + : m_pAllocator(pAllocator) + , m_dwRefCount(1) + { + m_pszURLContent = pszText; + } + ~CXFA_LinkUserData() { } + virtual FX_DWORD Release() + { + FX_DWORD dwRefCount = --m_dwRefCount; + if (dwRefCount <= 0) { + FDE_DeleteWith(CXFA_LinkUserData, m_pAllocator, this); + } + return dwRefCount; + } + virtual FX_DWORD AddRef() + { + return ++m_dwRefCount; + } +public: + FX_LPCWSTR GetLinkURL() + { + return m_pszURLContent; + }; +protected: + IFX_MEMAllocator *m_pAllocator; + FX_DWORD m_dwRefCount; + CFX_WideString m_pszURLContent; +}; +class CXFA_TextUserData : public IFX_Unknown, public CFX_Target +{ +public: + CXFA_TextUserData(IFX_MEMAllocator *pAllocator, IFDE_CSSComputedStyle *pStyle) + : m_pStyle(pStyle) + , m_pAllocator(pAllocator) + , m_dwRefCount(0) + , m_pLinkData(NULL) + { + FXSYS_assert(m_pAllocator != NULL); + if (m_pStyle != NULL) { + m_pStyle->AddRef(); + } + } + CXFA_TextUserData(IFX_MEMAllocator *pAllocator, IFDE_CSSComputedStyle *pStyle, CXFA_LinkUserData* pLinkData) + : m_pStyle(pStyle) + , m_pAllocator(pAllocator) + , m_dwRefCount(0) + , m_pLinkData(pLinkData) + { + FXSYS_assert(m_pAllocator != NULL); + if (m_pStyle != NULL) { + m_pStyle->AddRef(); + } + } + ~CXFA_TextUserData() + { + if (m_pStyle != NULL) { + m_pStyle->Release(); + } + if (m_pLinkData != NULL) { + m_pLinkData->Release(); + } + } + virtual FX_DWORD Release() + { + FX_DWORD dwRefCount = --m_dwRefCount; + if (dwRefCount == 0) { + FDE_DeleteWith(CXFA_TextUserData, m_pAllocator, this); + } + return dwRefCount; + } + virtual FX_DWORD AddRef() + { + return ++m_dwRefCount; + } + + IFDE_CSSComputedStyle *m_pStyle; + CXFA_LinkUserData *m_pLinkData; +protected: + IFX_MEMAllocator *m_pAllocator; + FX_DWORD m_dwRefCount; +}; +typedef struct _XFA_TEXTPIECE : public CFX_Target { + FX_LPWSTR pszText; + FX_INT32 iChars; + FX_INT32 *pWidths; + FX_INT32 iHorScale; + FX_INT32 iVerScale; + FX_INT32 iBidiLevel; + FX_INT32 iUnderline; + FX_INT32 iPeriod; + FX_INT32 iLineThrough; + IFX_Font *pFont; + FX_ARGB dwColor; + FX_FLOAT fFontSize; + CFX_RectF rtPiece; + CXFA_LinkUserData* pLinkData; + + _XFA_TEXTPIECE() : pszText(NULL), pFont(NULL), pLinkData(NULL) + { + pszText = NULL; + } + ~_XFA_TEXTPIECE() + { + pszText = NULL; + if (NULL != pLinkData) { + pLinkData->Release(); + pLinkData = NULL; + } + } +} XFA_TEXTPIECE, * XFA_LPTEXTPIECE; +typedef XFA_TEXTPIECE const * XFA_LPCTEXTPIECE; +typedef CFX_ArrayTemplate CXFA_PieceArray; +class CXFA_PieceLine : public CFX_Target +{ +public: + CXFA_PieceLine() {} + CXFA_PieceArray m_textPieces; + CFX_Int32Array m_charCounts; +}; +typedef CFX_ArrayTemplate CXFA_PieceLineArray; +struct XFA_TABSTOPS { + FX_DWORD dwAlign; + FX_FLOAT fTabstops; +}; +class CXFA_TextTabstopsContext : public CFX_Object +{ +public: + CXFA_TextTabstopsContext() : m_iTabCount(0), m_iTabIndex(-1), m_bTabstops(FALSE), m_fTabWidth(0), m_fLeft(0) {} + void Append(FX_DWORD dwAlign, FX_FLOAT fTabstops) + { + FX_INT32 i = 0; + for (i = 0; i < m_iTabCount; i++) { + XFA_TABSTOPS *pTabstop = m_tabstops.GetDataPtr(i); + if (fTabstops < pTabstop->fTabstops) { + break; + } + } + m_tabstops.InsertSpaceAt(i, 1); + XFA_TABSTOPS tabstop; + tabstop.dwAlign = dwAlign; + tabstop.fTabstops = fTabstops; + m_tabstops.SetAt(i, tabstop); + m_iTabCount++; + } + void RemoveAll() + { + m_tabstops.RemoveAll(); + m_iTabCount = 0; + } + void Reset() + { + m_iTabIndex = -1; + m_bTabstops = FALSE; + m_fTabWidth = 0; + m_fLeft = 0; + } + CFX_ArrayTemplate m_tabstops; + FX_INT32 m_iTabCount; + FX_INT32 m_iTabIndex; + FX_BOOL m_bTabstops; + FX_FLOAT m_fTabWidth; + FX_FLOAT m_fLeft; +}; +class CXFA_TextLayout : public CFX_Object +{ +public: + CXFA_TextLayout(IXFA_TextProvider *pTextProvider); + virtual ~CXFA_TextLayout(); + FX_INT32 GetText(CFX_WideString &wsText); + FX_FLOAT GetLayoutHeight(); + FX_FLOAT StartLayout(FX_FLOAT fWidth = -1); + FX_BOOL DoLayout(FX_INT32 iBlockIndex, FX_FLOAT &fCalcHeight, FX_FLOAT fContentAreaHeight = -1, FX_FLOAT fTextHeight = -1); + + FX_BOOL CalcSize(const CFX_SizeF &minSize, const CFX_SizeF &maxSize, CFX_SizeF &defaultSize); + FX_BOOL Layout(const CFX_SizeF &size, FX_FLOAT* fHeight = NULL); + void ItemBlocks(const CFX_RectF& rtText, FX_INT32 iBlockIndex); + FX_BOOL DrawString(CFX_RenderDevice *pFxDevice, const CFX_Matrix &tmDoc2Device, const CFX_RectF &rtClip, FX_INT32 iBlock = 0); + + FX_BOOL IsLoaded() const + { + return m_pieceLines.GetSize() > 0; + } + void Unload(); + const CXFA_PieceLineArray* GetPieceLines(); +private: + void GetTextDataNode(); + IFDE_XMLNode* GetXMLContainerNode(); + IFX_RTFBreak* CreateBreak(FX_BOOL bDefault); + void InitBreak(FX_FLOAT fLineWidth); + void InitBreak(IFDE_CSSComputedStyle *pStyle, FDE_CSSDISPLAY eDisplay, FX_FLOAT fLineWidth, IFDE_XMLNode *pXMLNode, IFDE_CSSComputedStyle *pParentStyle = NULL); + FX_BOOL Loader(const CFX_SizeF &szText, FX_FLOAT &fLinePos, FX_BOOL bSavePieces = TRUE); + + void LoadText(CXFA_Node *pNode, const CFX_SizeF &szText, FX_FLOAT &fLinePos, FX_BOOL bSavePieces); + FX_BOOL LoadRichText(IFDE_XMLNode *pXMLNode, const CFX_SizeF &szText, FX_FLOAT &fLinePos, IFDE_CSSComputedStyle *pParentStyle, FX_BOOL bSavePieces, CXFA_LinkUserData* pLinkData = NULL, FX_BOOL bEndBreak = TRUE, FX_BOOL bIsOl = FALSE, FX_INT32 iLiCount = 0); + + FX_BOOL AppendChar(const CFX_WideString &wsText, FX_FLOAT &fLinePos, FX_FLOAT fSpaceAbove, FX_BOOL bSavePieces); + + void AppendTextLine(FX_DWORD dwStatus, FX_FLOAT &fLinePos, FX_BOOL bSavePieces, FX_BOOL bEndBreak = FALSE); + void EndBreak(FX_DWORD dwStatus, FX_FLOAT &fLinePos, FX_BOOL bDefault); + FX_BOOL IsEnd(FX_BOOL bSavePieces); + + void ProcessText(CFX_WideString &wsText); + void UpdateAlign(FX_FLOAT fHeight, FX_FLOAT fBottom); + + void RenderString(IFDE_RenderDevice *pDevice, IFDE_SolidBrush *pBrush, CXFA_PieceLine *pPieceLine, + FX_INT32 iPiece, FXTEXT_CHARPOS *pCharPos, const CFX_Matrix &tmDoc2Device); + void RenderPath(IFDE_RenderDevice *pDevice, IFDE_Pen *pPen, CXFA_PieceLine *pPieceLine, FX_INT32 iPiece, + FXTEXT_CHARPOS *pCharPos, const CFX_Matrix &tmDoc2Device); + + FX_INT32 GetDisplayPos(XFA_LPCTEXTPIECE pPiece, FXTEXT_CHARPOS *pCharPos, FX_BOOL bCharCode = FALSE); + FX_BOOL ToRun(XFA_LPCTEXTPIECE pPiece, FX_RTFTEXTOBJ &tr); + + void DoTabstops(IFDE_CSSComputedStyle *pStyle, CXFA_PieceLine *pPieceLine); + FX_BOOL Layout(FX_INT32 iBlock); + FX_INT32 CountBlocks() const; + IXFA_TextProvider *m_pTextProvider; + CXFA_Node *m_pTextDataNode; + FX_BOOL m_bRichText; + IFX_MEMAllocator *m_pAllocator; + IFX_RTFBreak *m_pBreak; + FX_DWORD m_dwTextData; + + CXFA_LoaderContext *m_pLoader; + FX_INT32 m_iLines; + FX_FLOAT m_fMaxWidth; + + CXFA_TextParser m_textParser; + CXFA_PieceLineArray m_pieceLines; + CXFA_TextTabstopsContext *m_pTabstopContext; + FX_BOOL m_bBlockContinue; +public: + FX_BOOL m_bHasBlock; + CFX_Int32Array m_Blocks; +}; +#endif diff --git a/xfa/src/fxfa/src/common/fxfa_localevalue.h b/xfa/src/fxfa/src/common/fxfa_localevalue.h new file mode 100644 index 0000000000..7e4ceed134 --- /dev/null +++ b/xfa/src/fxfa/src/common/fxfa_localevalue.h @@ -0,0 +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 + +#ifndef _FXFA_WIDGETVALUE_H +#define _FXFA_WIDGETVALUE_H +class IFX_Locale; +class CFX_Unitime; +class CXFA_LocaleMgr; +#define XFA_VT_NULL 0 +#define XFA_VT_BOOLEAN 1 +#define XFA_VT_INTEGER 2 +#define XFA_VT_DECIMAL 4 +#define XFA_VT_FLOAT 8 +#define XFA_VT_TEXT 16 +#define XFA_VT_DATE 32 +#define XFA_VT_TIME 64 +#define XFA_VT_DATETIME 128 +class CXFA_LocaleValue : public CFX_Object +{ +public: + CXFA_LocaleValue(); + CXFA_LocaleValue(const CXFA_LocaleValue& value); + CXFA_LocaleValue(FX_DWORD dwType, CXFA_LocaleMgr* pLocaleMgr); + CXFA_LocaleValue(FX_DWORD dwType, const CFX_WideString& wsValue, CXFA_LocaleMgr* pLocaleMgr); + CXFA_LocaleValue(FX_DWORD dwType, const CFX_WideString& wsValue, + const CFX_WideString& wsFormat, IFX_Locale* pLocale, CXFA_LocaleMgr* pLocaleMgr); + ~CXFA_LocaleValue(); + CXFA_LocaleValue& operator = (const CXFA_LocaleValue& value); + + FX_BOOL ValidateValue(const CFX_WideString& wsValue, const CFX_WideString& wsPattern, IFX_Locale* pLocale, CFX_WideString* pMatchFormat = NULL); + FX_BOOL FormatPatterns(CFX_WideString& wsResult, const CFX_WideString& wsFormat, IFX_Locale* pLocale, XFA_VALUEPICTURE eValueType) const; + FX_BOOL FormatSinglePattern(CFX_WideString& wsResult, const CFX_WideString& wsFormat, IFX_Locale* pLocale, XFA_VALUEPICTURE eValueType) const; + FX_BOOL ValidateCanonicalValue(const CFX_WideString& wsValue, FX_DWORD dwVType); + FX_BOOL ValidateCanonicalDate(const CFX_WideString& wsDate, CFX_Unitime& unDate); + FX_BOOL ValidateCanonicalTime(const CFX_WideString& wsTime); + FX_BOOL ValidateCanonicalDateTime(const CFX_WideString& wsDateTime); + void GetNumbericFormat(CFX_WideString &wsFormat, FX_INT32 nIntLen, FX_INT32 nDecLen, FX_BOOL bSign = TRUE); + FX_BOOL ValidateNumericTemp(CFX_WideString& wsNumeric, CFX_WideString& wsFormat, IFX_Locale* pLocale = NULL, FX_INT32* pos = NULL); + + CFX_WideString GetValue() const; + FX_DWORD GetType() const; + void SetValue(const CFX_WideString& wsValue, FX_DWORD dwType); + CFX_WideString GetText() const; + FX_FLOAT GetNum() const; + FX_DOUBLE GetDoubleNum() const; + CFX_Unitime GetDate() const; + CFX_Unitime GetTime() const; + CFX_Unitime GetDateTime() const; + FX_BOOL SetText(const CFX_WideString& wsText); + FX_BOOL SetText(const CFX_WideString& wsText, const CFX_WideString& wsFormat, IFX_Locale* pLocale); + FX_BOOL SetNum(FX_FLOAT fNum); + FX_BOOL SetNum(const CFX_WideString& wsNum, const CFX_WideString& wsFormat, IFX_Locale* pLocale); + FX_BOOL SetDate(const CFX_Unitime& d); + FX_BOOL SetDate(const CFX_WideString& wsDate, const CFX_WideString& wsFormat, IFX_Locale* pLocale); + FX_BOOL SetTime(const CFX_Unitime& t); + FX_BOOL SetTime(const CFX_WideString& wsTime, const CFX_WideString& wsFormat, IFX_Locale* pLocale); + FX_BOOL SetDateTime(const CFX_Unitime& dt); + FX_BOOL SetDateTime(const CFX_WideString& wsDateTime, const CFX_WideString& wsFormat, IFX_Locale* pLocale); + inline FX_BOOL IsNull() const + { + return m_dwType == XFA_VT_NULL; + } + inline FX_BOOL IsEmpty() const + { + return m_wsValue.IsEmpty(); + } + inline FX_BOOL IsValid() const + { + return m_bValid; + } +protected: + FX_BOOL ParsePatternValue(const CFX_WideString& wsValue, const CFX_WideString& wsPattern, IFX_Locale* pLocale); + CXFA_LocaleMgr* m_pLocaleMgr; + CFX_WideString m_wsValue; + FX_DWORD m_dwType; + FX_BOOL m_bValid; +}; +#endif diff --git a/xfa/src/fxfa/src/common/xfa_common.h b/xfa/src/fxfa/src/common/xfa_common.h new file mode 100644 index 0000000000..b7bafa7505 --- /dev/null +++ b/xfa/src/fxfa/src/common/xfa_common.h @@ -0,0 +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 _XFA_COMMON_H_ +#define _XFA_COMMON_H_ +#include "xfa_utils.h" +#include "xfa_object.h" +#include "xfa_document.h" +#include "xfa_parser.h" +#include "xfa_script.h" +#include "xfa_docdata.h" +#include "xfa_doclayout.h" +#include "xfa_debug.h" +#include "xfa_localemgr.h" +#include "xfa_fm2jsapi.h" +#endif diff --git a/xfa/src/fxfa/src/common/xfa_debug.h b/xfa/src/fxfa/src/common/xfa_debug.h new file mode 100644 index 0000000000..dee70a688e --- /dev/null +++ b/xfa/src/fxfa/src/common/xfa_debug.h @@ -0,0 +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 + +#ifndef _XFA_COMMON_DEBUG_H_ +#define _XFA_COMMON_DEBUG_H_ +#endif diff --git a/xfa/src/fxfa/src/common/xfa_docdata.h b/xfa/src/fxfa/src/common/xfa_docdata.h new file mode 100644 index 0000000000..9e9c8d1a12 --- /dev/null +++ b/xfa/src/fxfa/src/common/xfa_docdata.h @@ -0,0 +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 + +#ifndef _XFA_DOCDATA_H +#define _XFA_DOCDATA_H +enum XFA_DATAFORMAT { + XFA_DATAFORMAT_XDP, +}; +class IXFA_PacketExport +{ +public: + static IXFA_PacketExport* Create(CXFA_Document *pDocument, XFA_DATAFORMAT eFormat = XFA_DATAFORMAT_XDP); + virtual void Release() = 0; + virtual FX_BOOL Export(IFX_FileWrite *pWrite) = 0; + virtual FX_BOOL Export(IFX_FileWrite *pWrite, CXFA_Node *pNode, FX_DWORD dwFlag = 0, FX_LPCSTR pChecksum = NULL) = 0; +}; +class IXFA_PacketImport +{ +public: + static IXFA_PacketImport* Create(CXFA_Document *pDstDoc); + virtual void Release() = 0; + virtual FX_BOOL ImportData(IFX_FileRead* pDataDocument) = 0; +}; +#endif diff --git a/xfa/src/fxfa/src/common/xfa_doclayout.h b/xfa/src/fxfa/src/common/xfa_doclayout.h new file mode 100644 index 0000000000..3d6df9f199 --- /dev/null +++ b/xfa/src/fxfa/src/common/xfa_doclayout.h @@ -0,0 +1,107 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _XFA_DOCLAYOUT_H_ +#define _XFA_DOCLAYOUT_H_ +#define _XFA_LAYOUTITEM_ProcessCACHE_ +class CXFA_LayoutItem; +class IXFA_LayoutPage; +class CXFA_LayoutItem +{ +public: + IXFA_LayoutPage* GetPage() const; + CXFA_Node* GetFormNode() const; + void GetRect(CFX_RectF &rtLayout, FX_BOOL bRelative = FALSE) const; + FX_INT32 GetIndex() const; + FX_INT32 GetCount() const; + CXFA_LayoutItem* GetParent() const; + CXFA_LayoutItem* GetFirst() const; + CXFA_LayoutItem* GetPrev() const; + CXFA_LayoutItem* GetNext() const; + CXFA_LayoutItem* GetLast() const; +}; +class CXFA_LayoutItemImpl : public CFX_Object +{ +public: + CXFA_LayoutItemImpl(CXFA_Node *pNode, FX_BOOL bIsContentLayoutItem); + virtual ~CXFA_LayoutItemImpl(); + FX_BOOL IsContentLayoutItem() + { + return m_bIsContentLayoutItem; + } + void AddChild(CXFA_LayoutItemImpl *pChildItem); + void AddHeadChild(CXFA_LayoutItemImpl *pChildItem); + void RemoveChild(CXFA_LayoutItemImpl *pChildItem); + void InsertChild(CXFA_LayoutItemImpl *pBeforeItem, CXFA_LayoutItemImpl *pChildItem); +public: + CXFA_Node* m_pFormNode; + CXFA_LayoutItemImpl* m_pParent; + CXFA_LayoutItemImpl* m_pNextSibling; + CXFA_LayoutItemImpl* m_pFirstChild; + FX_BOOL m_bIsContentLayoutItem; +}; +class CXFA_ContainerLayoutItemImpl : public CXFA_LayoutItemImpl +{ +public: + CXFA_ContainerLayoutItemImpl(CXFA_Node *pNode); +public: + CXFA_Node* m_pOldSubform; +}; +#define XFA_WIDGETSTATUS_Access 0x80000000 +#define XFA_WIDGETSTATUS_Disabled 0x40000000 +#define XFA_WIDGETSTATUS_RectCached 0x20000000 +#define XFA_WIDGETSTATUS_ButtonDown 0x10000000 +#define XFA_WIDGETSTATUS_Highlight 0x08000000 +#define XFA_WIDGETSTATUS_TextEditValueChanged 0x04000000 +class CXFA_ContentLayoutItemImpl : public CXFA_LayoutItemImpl +{ +public: + CXFA_ContentLayoutItemImpl(CXFA_Node *pNode); + virtual ~CXFA_ContentLayoutItemImpl(); +public: + CXFA_ContentLayoutItemImpl* m_pPrev; + CXFA_ContentLayoutItemImpl* m_pNext; + CFX_PointF m_sPos; + CFX_SizeF m_sSize; + FX_DWORD m_dwStatus; +}; +class CXFA_TraverseStrategy_LayoutItem +{ +public: + static inline CXFA_LayoutItem* GetFirstChild(CXFA_LayoutItem* pLayoutItem) + { + return (CXFA_LayoutItem*)((CXFA_LayoutItemImpl*)pLayoutItem)->m_pFirstChild; + } + static inline CXFA_LayoutItem* GetNextSibling(CXFA_LayoutItem* pLayoutItem) + { + return (CXFA_LayoutItem*)((CXFA_LayoutItemImpl*)pLayoutItem)->m_pNextSibling; + } + static inline CXFA_LayoutItem* GetParent(CXFA_LayoutItem* pLayoutItem) + { + return (CXFA_LayoutItem*)((CXFA_LayoutItemImpl*)pLayoutItem)->m_pParent; + } +}; +class IXFA_LayoutPage +{ +public: + IXFA_DocLayout* GetLayout() const; + FX_INT32 GetPageIndex() const; + void GetPageSize(CFX_SizeF &size); + CXFA_Node* GetMasterPage() const; +}; +class IXFA_DocLayout +{ +public: + virtual CXFA_Document* GetDocument() const = 0; + virtual FX_INT32 StartLayout(FX_BOOL bForceRestart = FALSE) = 0; + virtual FX_INT32 DoLayout(IFX_Pause *pPause = NULL) = 0; + virtual FX_BOOL IncrementLayout() = 0; + virtual FX_INT32 CountPages() const = 0; + virtual IXFA_LayoutPage* GetPage(FX_INT32 index) const = 0; + + virtual CXFA_LayoutItem* GetLayoutItem(CXFA_Node *pFormItem) = 0; +}; +#endif diff --git a/xfa/src/fxfa/src/common/xfa_document.h b/xfa/src/fxfa/src/common/xfa_document.h new file mode 100644 index 0000000000..502aa2591a --- /dev/null +++ b/xfa/src/fxfa/src/common/xfa_document.h @@ -0,0 +1,177 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _XFA_DOCUMENT_H +#define _XFA_DOCUMENT_H +class IXFA_DocParser; +class CXFA_LayoutProcessor; +class IXFA_DocLayout; +class IXFA_LayoutPage; +class CXFA_LayoutItem; +class IXFA_PageContent; +class IXFA_ScriptContext; +class CXFA_Node; +class IXFA_Notify; +class IXFA_ObjFactory; +class CXFA_Document; +enum XFA_VERSION { + XFA_VERSION_UNKNOWN = 0, + XFA_VERSION_200 = 200, + XFA_VERSION_202 = 202, + XFA_VERSION_204 = 204, + XFA_VERSION_205 = 205, + XFA_VERSION_206 = 206, + XFA_VERSION_207 = 207, + XFA_VERSION_208 = 208, + XFA_VERSION_300 = 300, + XFA_VERSION_301 = 301, + XFA_VERSION_303 = 303, + XFA_VERSION_306 = 306, + XFA_VERSION_DEFAULT = XFA_VERSION_303, + XFA_VERSION_MIN = 200, + XFA_VERSION_MAX = 400, +}; +#define XFA_LAYOUTSTATUS_Visible 0x0001 +#define XFA_LAYOUTSTATUS_Viewable 0x0010 +#define XFA_LAYOUTSTATUS_Printable 0x0020 +enum XFA_NODEEVENT { + XFA_NODEEVENT_Ready, + XFA_NODEEVENT_ValueChanging, + XFA_NODEEVENT_ValueChanged, + XFA_NODEEVENT_ChildAdded, + XFA_NODEEVENT_ChildRemoved, +}; +enum XFA_PAGEEVENT { + XFA_PAGEEVENT_PageAdded, + XFA_PAGEEVENT_PageRemoved, +}; +enum XFA_LAYOUTEVENT { + XFA_LAYOUTEVENT_ItemAdded, + XFA_LAYOUTEVENT_ItemRemoving, + XFA_LAYOUTEVENT_RectChanged, + XFA_LAYOUTEVENT_StatusChanged, +}; +enum XFA_LAYOUTRESULT { + XFA_LAYOUTRESULT_Continue, + XFA_LAYOUTRESULT_Done, + XFA_LAYOUTRESULT_NextContent, +}; +#define XFA_LAYOUTNOTIFY_StrictHeight 0x0001 +#define XFA_LAYOUTNOTIFY_NoParentBreak 0x0002 +class IXFA_Notify +{ +public: + virtual void OnPageEvent(IXFA_LayoutPage *pSender, XFA_PAGEEVENT eEvent, FX_LPVOID pParam = NULL) = 0; + + virtual void OnNodeEvent(CXFA_Node *pSender, XFA_NODEEVENT eEvent, FX_LPVOID pParam = NULL, FX_LPVOID pParam2 = NULL, FX_LPVOID pParam3 = NULL, FX_LPVOID pParam4 = NULL) = 0; + virtual void OnWidgetDataEvent(CXFA_WidgetData* pSender, FX_DWORD dwEvent, FX_LPVOID pParam = NULL, FX_LPVOID pAdditional = NULL, FX_LPVOID pAdditional2 = NULL) = 0; + + virtual CXFA_LayoutItem* OnCreateLayoutItem(CXFA_Node *pNode) = 0; + virtual void OnLayoutEvent(IXFA_DocLayout *pLayout, CXFA_LayoutItem *pSender, XFA_LAYOUTEVENT eEvent, FX_LPVOID pParam = NULL, FX_LPVOID pParam2 = NULL) = 0; + virtual void StartFieldDrawLayout(CXFA_Node *pItem, FX_FLOAT &fCalcWidth, FX_FLOAT &fCalcHeight) = 0; + virtual FX_BOOL FindSplitPos(CXFA_Node *pItem, FX_INT32 iBlockIndex, FX_FLOAT &fCalcHeightPos) = 0; + virtual FX_BOOL RunScript(CXFA_Node* pScript, CXFA_Node* pFormItem) = 0; + virtual FX_INT32 ExecEventByDeepFirst(CXFA_Node* pFormNode, XFA_EVENTTYPE eEventType, FX_BOOL bIsFormReady = FALSE, FX_BOOL bRecursive = TRUE, CXFA_WidgetAcc* pExclude = NULL) = 0; + virtual void AddCalcValidate(CXFA_Node* pNode) = 0; + virtual XFA_HDOC GetHDOC() = 0; + virtual IXFA_DocProvider* GetDocProvider() = 0; + virtual IXFA_AppProvider* GetAppProvider() = 0; + virtual IXFA_WidgetHandler* GetWidgetHandler() = 0; + virtual XFA_HWIDGET GetHWidget(CXFA_LayoutItem* pLayoutItem) = 0; + virtual void OpenDropDownList(XFA_HWIDGET hWidget) = 0; + virtual CFX_WideString GetCurrentDateTime() = 0; + virtual void ResetData(CXFA_WidgetData* pWidgetData = NULL) = 0; + virtual FX_INT32 GetLayoutStatus() = 0; + virtual void RunNodeInitialize(CXFA_Node* pNode) = 0; + virtual void RunSubformIndexChange(CXFA_Node* pSubformNode) = 0; + virtual CXFA_Node* GetFocusWidgetNode() = 0; + virtual void SetFocusWidgetNode(CXFA_Node* pNode) = 0; +}; +class IXFA_ObjFactory +{ +public: + virtual CXFA_Node* CreateNode(FX_DWORD dwPacket, XFA_ELEMENT eElement) = 0; + virtual CXFA_Node* CreateNode(XFA_LPCPACKETINFO pPacket, XFA_ELEMENT eElement) = 0; +}; +#define XFA_DOCFLAG_StrictScoping 0x0001 +#define XFA_DOCFLAG_HasInteractive 0x0002 +#define XFA_DOCFLAG_Interactive 0x0004 +#define XFA_DOCFLAG_Scripting 0x0008 +class CScript_DataWindow; +class CScript_EventPseudoModel; +class CScript_HostPseudoModel; +class CScript_LogPseudoModel; +class CScript_LayoutPseudoModel; +class CScript_SignaturePseudoModel; +class CXFA_Document : public IXFA_ObjFactory, public CFX_Object +{ +public: + CXFA_Document(IXFA_DocParser *pParser); + ~CXFA_Document(); + CXFA_Node* GetRoot() const + { + return m_pRootNode; + } + IXFA_DocParser* GetParser() const + { + return m_pParser; + } + IXFA_Notify* GetNotify() const; + void SetRoot(CXFA_Node* pNewRoot); + CXFA_Object* GetXFANode(FX_WSTR wsNodeName); + CXFA_Object* GetXFANode(FX_DWORD wsNodeNameHash); + void AddPurgeNode(CXFA_Node *pNode); + FX_BOOL RemovePurgeNode(CXFA_Node *pNode); + void PurgeNodes(); + FX_BOOL HasFlag(FX_DWORD dwFlag) + { + return (m_dwDocFlags & dwFlag) == dwFlag; + } + void SetFlag(FX_DWORD dwFlag, FX_BOOL bOn = TRUE); + FX_BOOL IsInteractive(); + XFA_VERSION GetCurVersionMode() + { + return m_eCurVersionMode; + } + XFA_VERSION RecognizeXFAVersionNumber(CFX_WideString& wsTemplateNS); + CXFA_LocaleMgr* GetLocalMgr(); + virtual CXFA_Node* CreateNode(FX_DWORD dwPacket, XFA_ELEMENT eElement); + virtual CXFA_Node* CreateNode(XFA_LPCPACKETINFO pPacket, XFA_ELEMENT eElement); + void DoProtoMerge(); + CXFA_Node* GetNodeByID(CXFA_Node* pRoot, FX_WSTR wsID); + + void DoDataMerge(); + void DoDataRemerge(FX_BOOL bDoDataMerge); + CXFA_Node* DataMerge_CopyContainer(CXFA_Node* pTemplateNode, CXFA_Node* pFormNode, CXFA_Node* pDataScope, FX_BOOL bOneInstance = FALSE, FX_BOOL bDataMerge = TRUE, FX_BOOL bUpLevel = TRUE); + void DataMerge_UpdateBindingRelations(CXFA_Node* pFormUpdateRoot); + CXFA_Node* GetNotBindNode(CXFA_ObjArray& arrayNodes); + CXFA_LayoutProcessor* GetLayoutProcessor(); + IXFA_DocLayout* GetDocLayout(); + IXFA_ScriptContext* InitScriptContext(FXJSE_HRUNTIME hRuntime); + IXFA_ScriptContext* GetScriptContext(); + void ClearLayoutData(); +public: + CFX_MapPtrTemplate m_rgGlobalBinding; + CXFA_NodeArray m_pPendingPageSet; +protected: + IXFA_DocParser* m_pParser; + IXFA_ScriptContext* m_pScriptContext; + CXFA_LayoutProcessor* m_pLayoutProcessor; + CXFA_Node* m_pRootNode; + + CXFA_LocaleMgr* m_pLocalMgr; + CScript_DataWindow* m_pScriptDataWindow; + CScript_EventPseudoModel* m_pScriptEvent; + CScript_HostPseudoModel* m_pScriptHost; + CScript_LogPseudoModel* m_pScriptLog; + CScript_LayoutPseudoModel* m_pScriptLayout; + CScript_SignaturePseudoModel* m_pScriptSignature; + CXFA_NodeSet m_rgPurgeNodes; + XFA_VERSION m_eCurVersionMode; + FX_DWORD m_dwDocFlags; + friend class CXFA_SimpleParser; +}; +#endif diff --git a/xfa/src/fxfa/src/common/xfa_fm2jsapi.h b/xfa/src/fxfa/src/common/xfa_fm2jsapi.h new file mode 100644 index 0000000000..499ceca4e3 --- /dev/null +++ b/xfa/src/fxfa/src/common/xfa_fm2jsapi.h @@ -0,0 +1,25 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _XFA_FM2JS_API_H +#define _XFA_FM2JS_API_H +#define FOXIT_XFA_FM2JS_FORMCALC_RUNTIME "foxit_xfa_formcalc_runtime" +#ifdef __cplusplus +extern "C" +{ +#endif +FX_DEFINEHANDLE(XFA_HFM2JSCONTEXT) +FX_INT32 XFA_FM2JS_Translate(FX_WSTR wsFormcalc, CFX_WideTextBuf& wsJavascript, CFX_WideString& wsError); +XFA_HFM2JSCONTEXT XFA_FM2JS_ContextCreate(); +void XFA_FM2JS_ContextInitialize(XFA_HFM2JSCONTEXT hFM2JSContext, FXJSE_HRUNTIME hScriptRuntime, + FXJSE_HCONTEXT hScriptContext, + CXFA_Document* pDocument); +void XFA_FM2JS_GlobalPropertyGetter(XFA_HFM2JSCONTEXT hFM2JSContext, FXJSE_HVALUE hValue); +void XFA_FM2JS_ContextRelease(XFA_HFM2JSCONTEXT hFM2JSContext); +#ifdef __cplusplus +} +#endif +#endif diff --git a/xfa/src/fxfa/src/common/xfa_localemgr.h b/xfa/src/fxfa/src/common/xfa_localemgr.h new file mode 100644 index 0000000000..f425a903fc --- /dev/null +++ b/xfa/src/fxfa/src/common/xfa_localemgr.h @@ -0,0 +1,69 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FXFA_LOCALEMGR_H +#define _FXFA_LOCALEMGR_H +class CXFA_Node; +class IFX_Locale; +class IFX_LocaleMgr; +class CXFA_LocaleMgr; +#define XFA_LANGID_zh_CN 0x0804 +#define XFA_LANGID_zh_TW 0x0404 +#define XFA_LANGID_zh_HK 0x0c04 +#define XFA_LANGID_ja_JP 0x0411 +#define XFA_LANGID_ko_KR 0x0412 +#define XFA_LANGID_en_US 0x0409 +#define XFA_LANGID_en_GB 0x0809 +#define XFA_LANGID_es_ES 0x0c0a +#define XFA_LANGID_es_LA 0x080a +#define XFA_LANGID_de_DE 0x0407 +#define XFA_LANGID_fr_FR 0x040c +#define XFA_LANGID_it_IT 0x0410 +#define XFA_LANGID_pt_BR 0x0416 +#define XFA_LANGID_nl_NL 0x0413 +#define XFA_LANGID_ru_RU 0x0419 +class CXFA_LocaleMgr : public IFX_LocaleMgr, public CFX_Object +{ +public: + CXFA_LocaleMgr(CXFA_Node* pLocaleSet, CFX_WideString wsDeflcid); + virtual void Release(); + virtual FX_WORD GetDefLocaleID(); + virtual IFX_Locale* GetDefLocale(); + virtual IFX_Locale* GetLocale(FX_WORD lcid); + virtual IFX_Locale* GetLocaleByName(FX_WSTR wsLocaleName); + ~CXFA_LocaleMgr(); + void SetDefLocale(IFX_Locale* pLocale); + CFX_WideStringC GetConfigLocaleName(CXFA_Node* pConfig); +protected: + CFX_PtrArray m_LocaleArray; + CFX_PtrArray m_XMLLocaleArray; + IFX_Locale* m_pDefLocale; + CFX_WideString m_wsConfigLocale; + FX_WORD m_dwDeflcid; + FX_WORD m_dwLocaleFlags; +}; +class IXFA_TimeZoneProvider +{ +public: + static IXFA_TimeZoneProvider* Create(); + static IXFA_TimeZoneProvider* Get(); + static void Destroy(); + + virtual void SetTimeZone(FX_TIMEZONE& tz) = 0; + + virtual void GetTimeZone(FX_TIMEZONE& tz) = 0; +}; +class CXFA_TimeZoneProvider : public IXFA_TimeZoneProvider, public CFX_Object +{ +public: + CXFA_TimeZoneProvider(); + ~CXFA_TimeZoneProvider(); + virtual void SetTimeZone(FX_TIMEZONE& tz); + virtual void GetTimeZone(FX_TIMEZONE& tz); +private: + FX_TIMEZONE m_tz; +}; +#endif diff --git a/xfa/src/fxfa/src/common/xfa_object.h b/xfa/src/fxfa/src/common/xfa_object.h new file mode 100644 index 0000000000..c285b9d902 --- /dev/null +++ b/xfa/src/fxfa/src/common/xfa_object.h @@ -0,0 +1,588 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _XFA_OBJECT_H_ +#define _XFA_OBJECT_H_ +class CXFA_Document; +class IXFA_ObjFactory; +class IXFA_Notify; +class CXFA_Object; +class CXFA_OrdinaryObject; +class CXFA_Node; +class CXFA_NodeList; +class CXFA_ArrayNodeList; +class CXFA_AttachNodeList; +enum XFA_OBJECTTYPE { + XFA_OBJECTTYPE_OrdinaryObject = 0x0, + XFA_OBJECTTYPE_OrdinaryList = 0x1, + XFA_OBJECTTYPE_NodeList = 0x2, + XFA_OBJECTTYPE_Node = 0x4, + XFA_OBJECTTYPE_NodeC = 0x5, + XFA_OBJECTTYPE_NodeV = 0x6, + XFA_OBJECTTYPE_ModelNode = 0x8, + XFA_OBJECTTYPE_TextNode = 0x9, + XFA_OBJECTTYPE_ContainerNode = 0xA, + XFA_OBJECTTYPE_ContentNode = 0xB, + XFA_OBJECTTYPE_VariablesThis = 0xC, + XFA_OBJECTTYPEMASK = 0xF, + XFA_NODEFLAG_Initialized = 0x00020, + XFA_NODEFLAG_HasRemoved = 0x00200, + XFA_NODEFLAG_NeedsInitApp = 0x00400, + XFA_NODEFLAG_BindFormItems = 0x00800, + XFA_NODEFLAG_UserInteractive = 0x01000, + XFA_NODEFLAG_SkipDataBinding = 0x02000, + XFA_NODEFLAG_OwnXMLNode = 0x04000, + XFA_NODEFLAG_UnusedNode = 0x08000, + XFA_NODEFLAG_LayoutGeneratedNode = 0x10000, +}; +class CXFA_Object : public CFX_Object +{ +public: + CXFA_Object(CXFA_Document* pDocument, FX_DWORD uFlags); + inline CXFA_Document* GetDocument() const + { + return m_pDocument; + } + inline FX_DWORD GetFlag() const + { + return m_uFlags; + } + inline XFA_OBJECTTYPE GetObjectType() const + { + return (XFA_OBJECTTYPE)(m_uFlags & XFA_OBJECTTYPEMASK); + } + inline FX_BOOL IsNode() const + { + return (m_uFlags & XFA_OBJECTTYPEMASK) >= XFA_OBJECTTYPE_Node; + } + inline FX_BOOL IsOrdinaryObject() const + { + return (m_uFlags & XFA_OBJECTTYPEMASK) == XFA_OBJECTTYPE_OrdinaryObject; + } + inline FX_BOOL IsNodeList() const + { + return (m_uFlags & XFA_OBJECTTYPEMASK) == XFA_OBJECTTYPE_NodeList; + } + inline FX_BOOL IsOrdinaryList() const + { + return (m_uFlags & XFA_OBJECTTYPEMASK) == XFA_OBJECTTYPE_OrdinaryList; + } + FX_BOOL IsContentNode() const + { + return (m_uFlags & XFA_OBJECTTYPEMASK) == XFA_OBJECTTYPE_ContentNode; + } + FX_BOOL IsContainerNode() const + { + return (m_uFlags & XFA_OBJECTTYPEMASK) == XFA_OBJECTTYPE_ContainerNode; + } + XFA_ELEMENT GetClassID() const; + void GetClassName(CFX_WideStringC &wsName) const; + FX_UINT32 GetClassHashCode() const; + void Script_ObjectClass_ClassName(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void ThrowScriptErrorMessage(FX_INT32 iStringID, ...); +protected: + CXFA_Document *m_pDocument; + FX_DWORD m_uFlags; +}; +#define XFA_NODEFILTER_Children 0x01 +#define XFA_NODEFILTER_Properties 0x02 +#define XFA_NODEFILTER_OneOfProperty 0x04 +#define XFA_CLONEFLAG_Content 0x01 +enum XFA_NODEITEM { + XFA_NODEITEM_Parent, + XFA_NODEITEM_FirstChild, + XFA_NODEITEM_NextSibling, + XFA_NODEITEM_PrevSibling, +}; +enum XFA_SOM_MESSAGETYPE { + XFA_SOM_ValidationMessage, + XFA_SOM_FormatMessage, + XFA_SOM_MandatoryMessage +}; +typedef CFX_StackTemplate CXFA_NodeStack; +typedef CXFA_PtrSetTemplate CXFA_NodeSet; +typedef void (*PD_CALLBACK_DUPLICATEDATA)(FX_LPVOID& pData); +typedef struct _XFA_MAPDATABLOCKCALLBACKINFO { + PD_CALLBACK_FREEDATA pFree; + PD_CALLBACK_DUPLICATEDATA pCopy; +} XFA_MAPDATABLOCKCALLBACKINFO; +typedef struct _XFA_MAPDATABLOCK : public CFX_Object { + FX_LPBYTE GetData() const + { + return (FX_LPBYTE)this + sizeof(_XFA_MAPDATABLOCK); + } + XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo; + FX_INT32 iBytes; +} XFA_MAPDATABLOCK, * XFA_LPMAPDATABLOCK; +typedef struct _XFA_MAPMODULEDATA : public CFX_Object { + CFX_MapPtrToPtr m_ValueMap; + CFX_MapPtrTemplate m_BufferMap; +} XFA_MAPMODULEDATA, * XFA_LPMAPMODULEDATA; +#define XFA_CalcRefCount (FX_LPVOID)(FX_UINTPTR)FXBSTR_ID('X', 'F', 'A', 'R') +#define XFA_CalcData (FX_LPVOID)(FX_UINTPTR)FXBSTR_ID('X', 'F', 'A', 'C') +#define XFA_LAYOUTITEMKEY (FX_LPVOID)(FX_UINTPTR)FXBSTR_ID('L', 'Y', 'I', 'M') +class CXFA_Node : public CXFA_Object +{ +public: + XFA_ELEMENT GetClassID() const + { + return (XFA_ELEMENT)m_eNodeClass; + } + FX_DWORD GetPacketID() const + { + return m_ePacket; + } + FX_BOOL HasFlag(FX_DWORD dwFlag) const; + void SetFlag(FX_DWORD dwFlag, FX_BOOL bOn = TRUE, FX_BOOL bNotify = TRUE); + FX_BOOL IsAttributeInXML(); + FX_BOOL IsFormContainer() + { + return m_ePacket == XFA_XDPPACKET_Form && IsContainerNode(); + } + void SetXMLMappingNode(IFDE_XMLNode* pXMLNode) + { + m_pXMLNode = pXMLNode; + } + IFDE_XMLNode* GetXMLMappingNode() const + { + return m_pXMLNode; + } + IFDE_XMLNode* CreateXMLMappingNode(); + FX_BOOL IsNeedSavingXMLNode(); + inline FX_DWORD GetNameHash() const + { + return m_dwNameHash; + } + inline FX_BOOL IsUnnamed() const + { + return m_dwNameHash == 0; + } + CXFA_Node* GetModelNode(); + void UpdateNameHash(); + FX_BOOL HasAttribute(XFA_ATTRIBUTE eAttr, FX_BOOL bCanInherit = FALSE); + FX_BOOL SetAttribute(XFA_ATTRIBUTE eAttr, FX_WSTR wsValue, FX_BOOL bNotify = FALSE); + FX_BOOL GetAttribute(XFA_ATTRIBUTE eAttr, CFX_WideString &wsValue, FX_BOOL bUseDefault = TRUE); + FX_BOOL SetAttribute(FX_WSTR wsAttr, FX_WSTR wsValue, FX_BOOL bNotify = FALSE); + FX_BOOL GetAttribute(FX_WSTR wsAttr, CFX_WideString &wsValue, FX_BOOL bUseDefault = TRUE); + FX_BOOL RemoveAttribute(FX_WSTR wsAttr); + FX_BOOL SetContent(const CFX_WideString& wsContent, const CFX_WideString& wsXMLValue, FX_BOOL bNotify = FALSE, FX_BOOL bScriptModify = FALSE, FX_BOOL bSyncData = TRUE); + FX_BOOL TryContent(CFX_WideString& wsContent, FX_BOOL bScriptModify = FALSE, FX_BOOL bProto = TRUE); + CFX_WideString GetContent(); + + FX_BOOL TryNamespace(CFX_WideString& wsNamespace); + + FX_BOOL SetBoolean(XFA_ATTRIBUTE eAttr, FX_BOOL bValue, FX_BOOL bNotify = FALSE) + { + return SetValue(eAttr, XFA_ATTRIBUTETYPE_Boolean, (FX_LPVOID)(FX_UINTPTR)bValue, bNotify); + } + FX_BOOL TryBoolean(XFA_ATTRIBUTE eAttr, FX_BOOL &bValue, FX_BOOL bUseDefault = TRUE); + FX_BOOL GetBoolean(XFA_ATTRIBUTE eAttr) + { + FX_BOOL bValue; + return TryBoolean(eAttr, bValue, TRUE) ? bValue : FALSE; + } + FX_BOOL SetInteger(XFA_ATTRIBUTE eAttr, FX_INT32 iValue, FX_BOOL bNotify = FALSE) + { + return SetValue(eAttr, XFA_ATTRIBUTETYPE_Integer, (FX_LPVOID)(FX_UINTPTR)iValue, bNotify); + } + FX_BOOL TryInteger(XFA_ATTRIBUTE eAttr, FX_INT32 &iValue, FX_BOOL bUseDefault = TRUE); + FX_INT32 GetInteger(XFA_ATTRIBUTE eAttr) + { + FX_INT32 iValue; + return TryInteger(eAttr, iValue, TRUE) ? iValue : 0; + } + FX_BOOL SetEnum(XFA_ATTRIBUTE eAttr, XFA_ATTRIBUTEENUM eValue, FX_BOOL bNotify = FALSE) + { + return SetValue(eAttr, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)(FX_UINTPTR)eValue, bNotify); + } + FX_BOOL TryEnum(XFA_ATTRIBUTE eAttr, XFA_ATTRIBUTEENUM &eValue, FX_BOOL bUseDefault = TRUE); + XFA_ATTRIBUTEENUM GetEnum(XFA_ATTRIBUTE eAttr) + { + XFA_ATTRIBUTEENUM eValue; + return TryEnum(eAttr, eValue, TRUE) ? eValue : XFA_ATTRIBUTEENUM_Unknown; + } + FX_BOOL SetCData(XFA_ATTRIBUTE eAttr, const CFX_WideString& wsValue, FX_BOOL bNotify = FALSE, FX_BOOL bScriptModify = FALSE); + FX_BOOL SetAttributeValue(const CFX_WideString& wsValue, const CFX_WideString& wsXMLValue, FX_BOOL bNotify = FALSE, FX_BOOL bScriptModify = FALSE); + FX_BOOL TryCData(XFA_ATTRIBUTE eAttr, CFX_WideString &wsValue, FX_BOOL bUseDefault = TRUE, FX_BOOL bProto = TRUE); + FX_BOOL TryCData(XFA_ATTRIBUTE eAttr, CFX_WideStringC &wsValue, FX_BOOL bUseDefault = TRUE, FX_BOOL bProto = TRUE); + CFX_WideStringC GetCData(XFA_ATTRIBUTE eAttr) + { + CFX_WideStringC wsValue; + return TryCData(eAttr, wsValue) ? wsValue : CFX_WideStringC(); + } + FX_BOOL SetMeasure(XFA_ATTRIBUTE eAttr, CXFA_Measurement mValue, FX_BOOL bNotify = FALSE); + FX_BOOL TryMeasure(XFA_ATTRIBUTE eAttr, CXFA_Measurement &mValue, FX_BOOL bUseDefault = TRUE); + CXFA_Measurement GetMeasure(XFA_ATTRIBUTE eAttr) + { + CXFA_Measurement mValue; + return TryMeasure(eAttr, mValue, TRUE) ? mValue : CXFA_Measurement(); + } + FX_BOOL SetObject(XFA_ATTRIBUTE eAttr, FX_LPVOID pData, XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo = NULL); + FX_BOOL TryObject(XFA_ATTRIBUTE eAttr, FX_LPVOID &pData); + FX_LPVOID GetObject(XFA_ATTRIBUTE eAttr) + { + FX_LPVOID pData; + return TryObject(eAttr, pData) ? pData : NULL; + } + FX_BOOL SetUserData(FX_LPVOID pKey, FX_LPVOID pData, XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo = NULL); + FX_BOOL TryUserData(FX_LPVOID pKey, FX_LPVOID &pData, FX_BOOL bProtoAlso = FALSE); + FX_LPVOID GetUserData(FX_LPVOID pKey, FX_BOOL bProtoAlso = FALSE) + { + FX_LPVOID pData; + return TryUserData(pKey, pData, bProtoAlso) ? pData : NULL; + } + CXFA_Node* GetProperty(FX_INT32 index, XFA_ELEMENT eProperty, FX_BOOL bCreateProperty = TRUE); + FX_INT32 CountChildren(XFA_ELEMENT eElement, FX_BOOL bOnlyChild = FALSE); + CXFA_Node* GetChild(FX_INT32 index, XFA_ELEMENT eElement, FX_BOOL bOnlyChild = FALSE); + FX_INT32 InsertChild(FX_INT32 index, CXFA_Node *pNode); + FX_BOOL InsertChild(CXFA_Node *pNode, CXFA_Node* pBeforeNode = NULL); + FX_BOOL RemoveChild(CXFA_Node *pNode, FX_BOOL bNotify = TRUE); + CXFA_Node* Clone(FX_BOOL bRecursive); + CXFA_Node* GetNodeItem(XFA_NODEITEM eItem) const; + CXFA_Node* GetNodeItem(XFA_NODEITEM eItem, XFA_OBJECTTYPE eType) const; + FX_INT32 GetNodeList(CXFA_NodeArray &nodes, FX_DWORD dwTypeFilter = XFA_NODEFILTER_Children | XFA_NODEFILTER_Properties, XFA_ELEMENT eElementFilter = XFA_ELEMENT_UNKNOWN, FX_INT32 iLevel = 1); + CXFA_Node* CreateSamePacketNode(XFA_ELEMENT eElement, FX_DWORD dwFlags = XFA_NODEFLAG_Initialized); + CXFA_Node* CloneTemplateToForm(FX_BOOL bRecursive); + CXFA_Node* GetTemplateNode(); + void SetTemplateNode(CXFA_Node* pTemplateNode); + CXFA_Node* GetDataDescriptionNode(); + void SetDataDescriptionNode(CXFA_Node* pDataDescriptionNode); + CXFA_Node* GetBindData(); + FX_INT32 GetBindItems(CXFA_NodeArray& formItems); + FX_INT32 AddBindItem(CXFA_Node* pFormNode); + FX_INT32 RemoveBindItem(CXFA_Node* pFormNode); + FX_BOOL HasBindItem(); + CXFA_WidgetData* GetWidgetData(); + CXFA_WidgetData* GetContainerWidgetData(); + FX_BOOL GetLocaleName(CFX_WideString& wsLocaleName); + XFA_ATTRIBUTEENUM GetIntact(); + CXFA_Node* GetFirstChildByName(FX_WSTR wsNodeName) const; + CXFA_Node* GetFirstChildByName(FX_DWORD dwNodeNameHash) const; + CXFA_Node* GetFirstChildByClass(XFA_ELEMENT eNodeClass) const; + CXFA_Node* GetNextSameNameSibling(FX_DWORD dwNodeNameHash) const; + CXFA_Node* GetNextSameNameSibling(FX_WSTR wsNodeName) const; + CXFA_Node* GetNextSameClassSibling(XFA_ELEMENT eNodeClass) const; + FX_INT32 GetNodeSameNameIndex() const; + FX_INT32 GetNodeSameClassIndex() const; + void GetSOMExpression(CFX_WideString& wsSOMExpression); + CXFA_Node* GetInstanceMgrOfSubform(); + + + CXFA_Node* GetOccurNode(); + void Script_TreeClass_ResolveNode(CFXJSE_Arguments* pArguments); + void Script_TreeClass_ResolveNodes(CFXJSE_Arguments* pArguments); + void Script_Som_ResolveNodeList(FXJSE_HVALUE hValue, CFX_WideString wsExpression, FX_DWORD dwFlag, CXFA_Node* refNode = NULL); + void Script_TreeClass_All(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_TreeClass_Nodes(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_TreeClass_ClassAll(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_TreeClass_Parent(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_TreeClass_Index(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_TreeClass_ClassIndex(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_TreeClass_SomExpression(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_NodeClass_ApplyXSL(CFXJSE_Arguments* pArguments); + void Script_NodeClass_AssignNode(CFXJSE_Arguments* pArguments); + void Script_NodeClass_Clone(CFXJSE_Arguments* pArguments); + void Script_NodeClass_GetAttribute(CFXJSE_Arguments* pArguments); + void Script_NodeClass_GetElement(CFXJSE_Arguments* pArguments); + void Script_NodeClass_IsPropertySpecified(CFXJSE_Arguments* pArguments); + void Script_NodeClass_LoadXML(CFXJSE_Arguments* pArguments); + void Script_NodeClass_SaveFilteredXML(CFXJSE_Arguments* pArguments); + void Script_NodeClass_SaveXML(CFXJSE_Arguments* pArguments); + void Script_NodeClass_SetAttribute(CFXJSE_Arguments* pArguments); + void Script_NodeClass_SetElement(CFXJSE_Arguments* pArguments); + void Script_NodeClass_Ns(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_NodeClass_Model(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_NodeClass_IsContainer(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_NodeClass_IsNull(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_NodeClass_OneOfChild(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_ContainerClass_GetDelta(CFXJSE_Arguments* pArguments); + void Script_ContainerClass_GetDeltas(CFXJSE_Arguments* pArguments); + void Script_ModelClass_ClearErrorList(CFXJSE_Arguments* pArguments); + void Script_ModelClass_CreateNode(CFXJSE_Arguments* pArguments); + void Script_ModelClass_IsCompatibleNS(CFXJSE_Arguments* pArguments); + void Script_ModelClass_Context(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_ModelClass_AliasNode(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_WsdlConnection_Execute(CFXJSE_Arguments* pArguments); + void Script_Delta_Restore(CFXJSE_Arguments* pArguments); + void Script_Delta_CurrentValue(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Delta_SavedValue(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Delta_Target(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Attribute_SendAttributeChangeMessage(FX_LPVOID eAttribute, FX_LPVOID eValue, FX_BOOL bScriptModify); + void Script_Attribute_Integer(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Attribute_IntegerRead(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Attribute_BOOL(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Attribute_BOOLRead(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Attribute_String(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Attribute_StringRead(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Som_ValidationMessage(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Field_Length(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Som_DefaultValue(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Som_DefaultValue_Read(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Boolean_Value(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Som_Message(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_SOM_MESSAGETYPE iMessageType); + void Script_Som_BorderColor(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Som_BorderWidth(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Som_FillColor(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Som_DataNode(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Som_FontColor(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Som_Mandatory(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Som_MandatoryMessage(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Som_InstanceIndex(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Draw_DefaultValue(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Field_DefaultValue(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Field_EditValue(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Field_FormatMessage(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Field_FormattedValue(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Field_ParentSubform(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Field_SelectedIndex(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Field_ClearItems(CFXJSE_Arguments* pArguments); + void Script_Field_ExecEvent(CFXJSE_Arguments* pArguments); + void Script_Field_ExecInitialize(CFXJSE_Arguments* pArguments); + void Script_Field_DeleteItem(CFXJSE_Arguments* pArguments); + void Script_Field_GetSaveItem(CFXJSE_Arguments* pArguments); + void Script_Field_BoundItem(CFXJSE_Arguments* pArguments); + void Script_Field_GetItemState(CFXJSE_Arguments* pArguments); + void Script_Field_ExecCalculate(CFXJSE_Arguments* pArguments); + void Script_Field_SetItems(CFXJSE_Arguments* pArguments); + void Script_Field_GetDisplayItem(CFXJSE_Arguments* pArguments); + void Script_Field_SetItemState(CFXJSE_Arguments* pArguments); + void Script_Field_AddItem(CFXJSE_Arguments* pArguments); + void Script_Field_ExecValidate(CFXJSE_Arguments* pArguments); + void Script_ExclGroup_DefaultAndRawValue(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_ExclGroup_ErrorText(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_ExclGroup_Transient(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_ExclGroup_ExecEvent(CFXJSE_Arguments* pArguments); + void Script_ExclGroup_SelectedMember(CFXJSE_Arguments* pArguments); + void Script_ExclGroup_ExecInitialize(CFXJSE_Arguments* pArguments); + void Script_ExclGroup_ExecCalculate(CFXJSE_Arguments* pArguments); + void Script_ExclGroup_ExecValidate(CFXJSE_Arguments* pArguments); + void Script_Subform_InstanceManager(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Subform_Locale(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Subform_ExecEvent(CFXJSE_Arguments* pArguments); + void Script_Subform_ExecInitialize(CFXJSE_Arguments* pArguments); + void Script_Subform_ExecCalculate(CFXJSE_Arguments* pArguments); + void Script_Subform_ExecValidate(CFXJSE_Arguments* pArguments); + void Script_Subform_GetInvalidObjects(CFXJSE_Arguments* pArguments); + + FX_INT32 Subform_and_SubformSet_InstanceIndex(); + void Script_Template_FormNodes(CFXJSE_Arguments* pArguments); + void Script_Template_Remerge(CFXJSE_Arguments* pArguments); + void Script_Template_ExecInitialize(CFXJSE_Arguments* pArguments); + void Script_Template_CreateNode(CFXJSE_Arguments* pArguments); + void Script_Template_Recalculate(CFXJSE_Arguments* pArguments); + void Script_Template_ExecCalculate(CFXJSE_Arguments* pArguments); + void Script_Template_ExecValidate(CFXJSE_Arguments* pArguments); + void Script_Manifest_Evaluate(CFXJSE_Arguments* pArguments); + void Script_InstanceManager_Count(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_InstanceManager_Max(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_InstanceManager_Min(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_InstanceManager_MoveInstance(CFXJSE_Arguments* pArguments); + void Script_InstanceManager_RemoveInstance(CFXJSE_Arguments* pArguments); + void Script_InstanceManager_SetInstances(CFXJSE_Arguments* pArguments); + void Script_InstanceManager_AddInstance(CFXJSE_Arguments* pArguments); + void Script_InstanceManager_InsertInstance(CFXJSE_Arguments* pArguments); + FX_INT32 InstanceManager_SetInstances(FX_INT32 iCount); + FX_INT32 InstanceManager_MoveInstance(FX_INT32 iTo, FX_INT32 iFrom); + void Script_Occur_Max(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Occur_Min(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Desc_Metadata(CFXJSE_Arguments* pArguments); + void Script_Form_FormNodes(CFXJSE_Arguments* pArguments); + void Script_Form_Remerge(CFXJSE_Arguments* pArguments); + void Script_Form_ExecInitialize(CFXJSE_Arguments* pArguments); + void Script_Form_Recalculate(CFXJSE_Arguments* pArguments); + void Script_Form_ExecCalculate(CFXJSE_Arguments* pArguments); + void Script_Form_ExecValidate(CFXJSE_Arguments* pArguments); + void Script_Form_Checksum(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Packet_GetAttribute(CFXJSE_Arguments* pArguments); + void Script_Packet_SetAttribute(CFXJSE_Arguments* pArguments); + void Script_Packet_RemoveAttribute(CFXJSE_Arguments* pArguments); + void Script_Packet_Content(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Source_Next(CFXJSE_Arguments* pArguments); + void Script_Source_CancelBatch(CFXJSE_Arguments* pArguments); + void Script_Source_First(CFXJSE_Arguments* pArguments); + void Script_Source_UpdateBatch(CFXJSE_Arguments* pArguments); + void Script_Source_Previous(CFXJSE_Arguments* pArguments); + void Script_Source_IsBOF(CFXJSE_Arguments* pArguments); + void Script_Source_IsEOF(CFXJSE_Arguments* pArguments); + void Script_Source_Cancel(CFXJSE_Arguments* pArguments); + void Script_Source_Update(CFXJSE_Arguments* pArguments); + void Script_Source_Open(CFXJSE_Arguments* pArguments); + void Script_Source_Delete(CFXJSE_Arguments* pArguments); + void Script_Source_AddNew(CFXJSE_Arguments* pArguments); + void Script_Source_Requery(CFXJSE_Arguments* pArguments); + void Script_Source_Resync(CFXJSE_Arguments* pArguments); + void Script_Source_Close(CFXJSE_Arguments* pArguments); + void Script_Source_Last(CFXJSE_Arguments* pArguments); + void Script_Source_HasDataChanged(CFXJSE_Arguments* pArguments); + void Script_Source_Db(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Xfa_This(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Handler_Version(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_SubmitFormat_Mode(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Extras_Type(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Encrypt_Format(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_Script_Stateless(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); +protected: + CXFA_Node(CXFA_Document *pDoc, FX_WORD ePacket, XFA_ELEMENT eElement); + ~CXFA_Node(); + friend class CXFA_Document; + CXFA_Node* Deprecated_GetPrevSibling(); + FX_BOOL SetValue(XFA_ATTRIBUTE eAttr, XFA_ATTRIBUTETYPE eType, FX_LPVOID pValue, FX_BOOL bNotify); + FX_BOOL GetValue(XFA_ATTRIBUTE eAttr, XFA_ATTRIBUTETYPE eType, FX_BOOL bUseDefault, FX_LPVOID &pValue); + void OnRemoved(CXFA_Node *pParent, CXFA_Node *pRemoved, FX_BOOL bNotify); + void OnChanging(XFA_ATTRIBUTE eAttr, FX_LPVOID pNewValue, FX_BOOL bNotify); + void OnChanged(XFA_ATTRIBUTE eAttr, FX_LPVOID pNewValue, FX_BOOL bNotify, FX_BOOL bScriptModify = FALSE); + FX_INT32 execSingleEventByName(FX_WSTR wsEventName, XFA_ELEMENT eElementType); + FX_BOOL SetScriptContent(const CFX_WideString& wsContent, const CFX_WideString& wsXMLValue, FX_BOOL bNotify = TRUE, FX_BOOL bScriptModify = FALSE, FX_BOOL bSyncData = TRUE); + CFX_WideString GetScriptContent(FX_BOOL bScriptModify = FALSE); + XFA_LPMAPMODULEDATA GetMapModuleData(FX_BOOL bCreateNew); + void SetMapModuleValue(FX_LPVOID pKey, FX_LPVOID pValue); + FX_BOOL GetMapModuleValue(FX_LPVOID pKey, FX_LPVOID &pValue); + void SetMapModuleString(FX_LPVOID pKey, FX_WSTR wsValue); + FX_BOOL GetMapModuleString(FX_LPVOID pKey, CFX_WideStringC &wsValue); + void SetMapModuleBuffer(FX_LPVOID pKey, FX_LPVOID pValue, FX_INT32 iBytes, XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo = NULL); + FX_BOOL GetMapModuleBuffer(FX_LPVOID pKey, FX_LPVOID &pValue, FX_INT32 &iBytes, FX_BOOL bProtoAlso = TRUE); + FX_BOOL HasMapModuleKey(FX_LPVOID pKey, FX_BOOL bProtoAlso = FALSE); + void RemoveMapModuleKey(FX_LPVOID pKey = NULL); + void MergeAllData(FX_LPVOID pDstModule, FX_BOOL bUseSrcAttr = TRUE); + void MoveBufferMapData(CXFA_Node* pDstModule, FX_LPVOID pKey); + void MoveBufferMapData(CXFA_Node* pSrcModule, CXFA_Node* pDstModule, FX_LPVOID pKey, FX_BOOL bRecursive = FALSE); +protected: + CXFA_Node *m_pNext; + CXFA_Node *m_pChild; + CXFA_Node *m_pLastChild; + CXFA_Node *m_pParent; + IFDE_XMLNode *m_pXMLNode; + XFA_ELEMENT m_eNodeClass; + FX_WORD m_ePacket; + FX_DWORD m_dwNameHash; + CXFA_Node *m_pAuxNode; + XFA_LPMAPMODULEDATA m_pMapModuleData; +}; +class CXFA_OrdinaryObject : public CXFA_Object +{ +public: + CXFA_OrdinaryObject(CXFA_Document* pDocument, XFA_ELEMENT eElement) : CXFA_Object(pDocument, XFA_OBJECTTYPE_OrdinaryObject), m_uScriptHash(0) + { + m_eNodeClass = eElement; + } + XFA_ELEMENT GetClassID() const + { + return (XFA_ELEMENT)m_eNodeClass; + } + FX_UINT32 GetScriptObjHash() + { + return m_uScriptHash; + } +protected: + XFA_ELEMENT m_eNodeClass; + FX_UINT32 m_uScriptHash; +}; +class CXFA_ThisProxy : public CXFA_Object +{ +public : + CXFA_ThisProxy(CXFA_Node* pThisNode, CXFA_Node* pScriptNode): CXFA_Object(pThisNode->GetDocument(), XFA_OBJECTTYPE_VariablesThis), m_pThisNode(NULL), m_pScriptNode(NULL) + { + m_pThisNode = pThisNode; + m_pScriptNode = pScriptNode; + } + virtual ~CXFA_ThisProxy() {} + CXFA_Node* GetThisNode() + { + return m_pThisNode; + } + CXFA_Node* GetScriptNode() + { + return m_pScriptNode; + } +private: + CXFA_Node* m_pThisNode; + CXFA_Node* m_pScriptNode; +}; +class CXFA_NodeList : public CXFA_Object +{ +public: + CXFA_NodeList(CXFA_Document* pDocument); + virtual ~CXFA_NodeList() {} + XFA_ELEMENT GetClassID() const + { + return XFA_ELEMENT_NodeList; + } + CXFA_Node* NamedItem(FX_WSTR wsName); + virtual FX_INT32 GetLength() = 0; + virtual FX_BOOL Append(CXFA_Node* pNode) = 0; + virtual FX_BOOL Insert(CXFA_Node* pNewNode, CXFA_Node* pBeforeNode) = 0; + virtual FX_BOOL Remove(CXFA_Node* pNode) = 0; + virtual CXFA_Node* Item(FX_INT32 iIndex) = 0; + + void Script_ListClass_Append(CFXJSE_Arguments* pArguments); + void Script_ListClass_Insert(CFXJSE_Arguments* pArguments); + void Script_ListClass_Remove(CFXJSE_Arguments* pArguments); + void Script_ListClass_Item(CFXJSE_Arguments* pArguments); + + void Script_TreelistClass_NamedItem(CFXJSE_Arguments* pArguments); + void Script_ListClass_Length(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); +}; +class CXFA_ArrayNodeList : public CXFA_NodeList +{ +public: + CXFA_ArrayNodeList(CXFA_Document* pDocument); + void SetArrayNodeList(const CXFA_NodeArray &srcArray); + virtual FX_INT32 GetLength(); + virtual FX_BOOL Append(CXFA_Node* pNode); + virtual FX_BOOL Insert(CXFA_Node* pNewNode, CXFA_Node* pBeforeNode); + virtual FX_BOOL Remove(CXFA_Node* pNode); + virtual CXFA_Node* Item(FX_INT32 iIndex); +protected: + CXFA_NodeArray m_array; +}; +class CXFA_AttachNodeList : public CXFA_NodeList +{ +public: + CXFA_AttachNodeList(CXFA_Document* pDocument, CXFA_Node* pAttachNode); + + virtual FX_INT32 GetLength(); + virtual FX_BOOL Append(CXFA_Node* pNode); + virtual FX_BOOL Insert(CXFA_Node* pNewNode, CXFA_Node* pBeforeNode); + virtual FX_BOOL Remove(CXFA_Node* pNode); + virtual CXFA_Node* Item(FX_INT32 iIndex); +protected: + CXFA_Node* m_pAttachNode; +}; +class CXFA_TraverseStrategy_XFAContainerNode +{ +public: + static CXFA_Node* GetFirstChild(CXFA_Node* pTemplateNode, FX_LPVOID pUserData = NULL) + { + return pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild, XFA_OBJECTTYPE_ContainerNode); + } + static CXFA_Node* GetNextSibling(CXFA_Node* pTemplateNode, FX_LPVOID pUserData = NULL) + { + return pTemplateNode->GetNodeItem(XFA_NODEITEM_NextSibling, XFA_OBJECTTYPE_ContainerNode); + } + static CXFA_Node* GetParent(CXFA_Node* pTemplateNode, FX_LPVOID pUserData = NULL) + { + return pTemplateNode->GetNodeItem(XFA_NODEITEM_Parent, XFA_OBJECTTYPE_ContainerNode); + } +}; +typedef CXFA_NodeIteratorTemplate CXFA_ContainerIterator; +class CXFA_TraverseStrategy_XFANode +{ +public: + static inline CXFA_Node* GetFirstChild(CXFA_Node* pTemplateNode) + { + return pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); + } + static inline CXFA_Node* GetNextSibling(CXFA_Node* pTemplateNode) + { + return pTemplateNode->GetNodeItem(XFA_NODEITEM_NextSibling); + } + static inline CXFA_Node* GetParent(CXFA_Node* pTemplateNode) + { + return pTemplateNode->GetNodeItem(XFA_NODEITEM_Parent); + } +}; +typedef CXFA_NodeIteratorTemplate CXFA_NodeIterator; +#endif diff --git a/xfa/src/fxfa/src/common/xfa_parser.h b/xfa/src/fxfa/src/common/xfa_parser.h new file mode 100644 index 0000000000..2b1f1e62a8 --- /dev/null +++ b/xfa/src/fxfa/src/common/xfa_parser.h @@ -0,0 +1,37 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _XFA_PARSER_H +#define _XFA_PARSER_H +class IFX_Stream; +class IXFA_Parser +{ +public: + static IXFA_Parser* Create(IXFA_ObjFactory *pFactory, FX_BOOL bDocumentParser = FALSE); + virtual void Release() = 0; + virtual FX_INT32 StartParse(IFX_FileRead *pStream, XFA_XDPPACKET ePacketID = XFA_XDPPACKET_XDP) = 0; + virtual FX_INT32 DoParse(IFX_Pause *pPause = NULL) = 0; + virtual FX_INT32 ParseXMLData(const CFX_WideString &wsXML, IFDE_XMLNode* &pXMLNode, IFX_Pause *pPause = NULL) = 0; + virtual void ConstructXFANode(CXFA_Node* pXFANode, IFDE_XMLNode* pXMLNode) = 0; + virtual IXFA_ObjFactory* GetFactory() const = 0; + virtual CXFA_Node* GetRootNode() const = 0; + virtual IFDE_XMLDoc* GetXMLDoc() const = 0; + virtual void CloseParser() = 0; +}; +class IXFA_DocParser : public IXFA_Parser +{ +public: + static IXFA_DocParser* Create(IXFA_Notify *pNotify); + virtual CXFA_Document* GetDocument() const = 0; + virtual IXFA_Notify* GetNotify() const = 0; +}; +class IXFA_DataLoaderOptionsProvider +{ +public: + static IXFA_DataLoaderOptionsProvider* Create(CXFA_Node* pConfigurationDOM); + virtual void Release() = 0; +}; +#endif diff --git a/xfa/src/fxfa/src/common/xfa_script.h b/xfa/src/fxfa/src/common/xfa_script.h new file mode 100644 index 0000000000..eb3b8472d4 --- /dev/null +++ b/xfa/src/fxfa/src/common/xfa_script.h @@ -0,0 +1,107 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FXFA_SCRIPT_H +#define _FXFA_SCRIPT_H +#define XFA_RESOLVENODE_Children 0x0001 +#define XFA_RESOLVENODE_Attributes 0x0004 +#define XFA_RESOLVENODE_Properties 0x0008 +#define XFA_RESOLVENODE_Siblings 0x0020 +#define XFA_RESOLVENODE_Parent 0x0040 +#define XFA_RESOLVENODE_AnyChild 0x0080 +#define XFA_RESOLVENODE_ALL 0x0100 +#define XFA_RESOLVENODE_CreateNode 0x0400 +#define XFA_RESOLVENODE_Bind 0x0800 +#define XFA_RESOLVENODE_BindNew 0x1000 +enum XFA_SCRIPTLANGTYPE { + XFA_SCRIPTLANGTYPE_Formcalc = XFA_SCRIPTTYPE_Formcalc, + XFA_SCRIPTLANGTYPE_Javascript = XFA_SCRIPTTYPE_Javascript, + XFA_SCRIPTLANGTYPE_Unkown = XFA_SCRIPTTYPE_Unkown, +}; +enum XFA_RESOVENODE_RSTYPE { + XFA_RESOVENODE_RSTYPE_Nodes, + XFA_RESOVENODE_RSTYPE_Attribute, + XFA_RESOLVENODE_RSTYPE_CreateNodeOne, + XFA_RESOLVENODE_RSTYPE_CreateNodeAll, + XFA_RESOLVENODE_RSTYPE_CreateNodeMidAll, + XFA_RESOVENODE_RSTYPE_ExistNodes, +}; +class CXFA_HVALUEArray : public CFX_ArrayTemplate +{ +public: + CXFA_HVALUEArray(FXJSE_HRUNTIME hRunTime) : m_hRunTime(hRunTime) {}; + ~CXFA_HVALUEArray() + { + for (FX_INT32 i = 0; i < GetSize(); i++) { + FXJSE_Value_Release(GetAt(i)); + } + } + void GetAttributeObject(CXFA_ObjArray& objArray) + { + for (FX_INT32 i = 0; i < GetSize(); i++) { + CXFA_Object* pObject = (CXFA_Object*)FXJSE_Value_ToObject(GetAt(i), NULL); + objArray.Add(pObject); + } + } + FXJSE_HRUNTIME m_hRunTime; +}; +typedef struct _XFA_RESOLVENODE_RS : public CFX_Object { + _XFA_RESOLVENODE_RS() : dwFlags(XFA_RESOVENODE_RSTYPE_Nodes), pScriptAttribute(NULL) { } + ~_XFA_RESOLVENODE_RS() + { + nodes.RemoveAll(); + } + FX_INT32 GetAttributeResult(CXFA_HVALUEArray& hValueArray) const + { + if (pScriptAttribute && pScriptAttribute->eValueType == XFA_SCRIPT_Object) { + FXJSE_HRUNTIME hRunTime = hValueArray.m_hRunTime; + for (FX_INT32 i = 0; i < nodes.GetSize(); i++) { + FXJSE_HVALUE hValue = FXJSE_Value_Create(hRunTime); + (nodes[i]->*(pScriptAttribute->lpfnCallback))(hValue, FALSE, (XFA_ATTRIBUTE)pScriptAttribute->eAttribute); + hValueArray.Add(hValue); + } + } + return hValueArray.GetSize(); + } + CXFA_ObjArray nodes; + XFA_LPCSCRIPTATTRIBUTEINFO pScriptAttribute; + XFA_RESOVENODE_RSTYPE dwFlags; +} XFA_RESOLVENODE_RS, * XFA_LPRESOLVENODE_RS; +typedef struct _XFA_JSBUILTININFO { + FX_UINT32 uUnicodeHash; + FX_LPCSTR pName; +} XFA_JSBUILTININFO, * XFA_LPJSBUILTININFO; +typedef XFA_JSBUILTININFO const * XFA_LPCJSBUILTININFO; +XFA_LPCJSBUILTININFO XFA_GetJSBuiltinByHash(FX_UINT32 uHashCode); +class IXFA_ScriptContext +{ +public: + virtual void Release() = 0; + virtual void Initialize(FXJSE_HRUNTIME hRuntime) = 0; + + virtual void SetEventParam(CXFA_EventParam* pEventParam) = 0; + virtual CXFA_EventParam* GetEventParam() = 0; + virtual FX_BOOL RunScript(XFA_SCRIPTLANGTYPE eScriptType, FX_WSTR wsScript, FXJSE_HVALUE hRetValue, CXFA_Object* pThisObject = NULL) = 0; + virtual FX_INT32 ResolveObjects(CXFA_Object* refNode, FX_WSTR wsExpression, XFA_RESOLVENODE_RS& resolveNodeRS, FX_DWORD dwStyles = XFA_RESOLVENODE_Children, CXFA_Node* bindNode = NULL) = 0; + virtual FXJSE_HVALUE GetJSValueFromMap(CXFA_Object* pObject) = 0; + virtual void CacheList(CXFA_NodeList* pList) = 0; + virtual CXFA_Object* GetThisObject() const = 0; + virtual FXJSE_HRUNTIME GetRuntime() const = 0; + virtual FX_INT32 GetIndexByName(CXFA_Node* refNode) = 0; + virtual FX_INT32 GetIndexByClassName(CXFA_Node* refNode) = 0; + virtual void GetSomExpression(CXFA_Node* refNode, CFX_WideString &wsExpression) = 0; + + virtual void SetNodesOfRunScript(CXFA_NodeArray *pArray) = 0; + virtual void AddNodesOfRunScript(const CXFA_NodeArray& nodes) = 0; + virtual void AddNodesOfRunScript(CXFA_Node* pNode) = 0; + virtual FXJSE_HCLASS GetJseNormalClass() = 0; + virtual XFA_SCRIPTLANGTYPE GetType() = 0; + virtual void AddJSBuiltinObject(XFA_LPCJSBUILTININFO pBuitinObject) = 0; + virtual void SetRunAtType(XFA_ATTRIBUTEENUM eRunAt) = 0; + virtual FX_BOOL IsRunAtClient() = 0; +}; +IXFA_ScriptContext* XFA_ScriptContext_Create(CXFA_Document* pDocument); +#endif diff --git a/xfa/src/fxfa/src/common/xfa_utils.h b/xfa/src/fxfa/src/common/xfa_utils.h new file mode 100644 index 0000000000..df51ff6baa --- /dev/null +++ b/xfa/src/fxfa/src/common/xfa_utils.h @@ -0,0 +1,237 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _XFA_UTILS_H_ +#define _XFA_UTILS_H_ +FX_BOOL XFA_FDEExtension_ResolveNamespaceQualifier(IFDE_XMLElement* pNode, FX_WSTR wsQualifier, CFX_WideString& wsNamespaceURI); +template +class CXFA_NodeIteratorTemplate : public CFX_Object +{ +public: + CXFA_NodeIteratorTemplate(NodeType* pRootNode = NULL) + : m_pRoot(pRootNode) + { + if(pRootNode) { + m_NodeStack.Push(pRootNode); + } + } + FX_BOOL Init(NodeType* pRootNode) + { + if(!pRootNode) { + return FALSE; + } + m_pRoot = pRootNode; + m_NodeStack.RemoveAll(); + m_NodeStack.Push(pRootNode); + return TRUE; + } + void Clear() + { + m_NodeStack.RemoveAll(); + } + void Reset() + { + Clear(); + if (m_pRoot) { + m_NodeStack.Push(m_pRoot); + } + } + FX_BOOL SetCurrent(NodeType* pCurNode) + { + m_NodeStack.RemoveAll(); + if(pCurNode) { + CFX_StackTemplate revStack; + NodeType* pNode; + for(pNode = pCurNode; pNode && pNode != m_pRoot; pNode = TraverseStrategy::GetParent(pNode)) { + revStack.Push(pNode); + } + if(!pNode) { + return FALSE; + } + revStack.Push(m_pRoot); + while(revStack.GetSize()) { + m_NodeStack.Push(*revStack.GetTopElement()); + revStack.Pop(); + } + } + return TRUE; + } + NodeType* GetCurrent() + { + return m_NodeStack.GetSize() ? *m_NodeStack.GetTopElement() : NULL; + } + NodeType* GetRoot() + { + return m_pRoot; + } + NodeType* MoveToPrev() + { + NodeType *pCurrent = GetCurrent(); + FX_INT32 nStackLength = m_NodeStack.GetSize(); + if(nStackLength == 1) { + return NULL; + } else if(nStackLength > 1) { + NodeType *pCurItem = *m_NodeStack.GetTopElement(); + m_NodeStack.Pop(); + NodeType *pParentItem = *m_NodeStack.GetTopElement(); + NodeType *pParentFirstChildItem = TraverseStrategy::GetFirstChild(pParentItem); + if(pCurItem == pParentFirstChildItem) { + return pParentItem; + } + NodeType *pPrevItem = pParentFirstChildItem, *pPrevItemNext = NULL; + for(; pPrevItem; pPrevItem = pPrevItemNext) { + pPrevItemNext = TraverseStrategy::GetNextSibling(pPrevItem); + if(!pPrevItemNext || pPrevItemNext == pCurItem) { + break; + } + } + m_NodeStack.Push(pPrevItem); + } else { + m_NodeStack.RemoveAll(); + if(m_pRoot) { + m_NodeStack.Push(m_pRoot); + } + } + if(m_NodeStack.GetSize() > 0) { + NodeType *pChildItem = *m_NodeStack.GetTopElement(); + while((pChildItem = TraverseStrategy::GetFirstChild(pChildItem)) != NULL) { + while(NodeType *pNextItem = TraverseStrategy::GetNextSibling(pChildItem)) { + pChildItem = pNextItem; + } + m_NodeStack.Push(pChildItem); + } + return *m_NodeStack.GetTopElement(); + } + return NULL; + } + NodeType* MoveToNext() + { + NodeType **ppNode = NULL; + NodeType *pCurrent = GetCurrent(); + while (m_NodeStack.GetSize() > 0) { + while ((ppNode = m_NodeStack.GetTopElement()) != NULL) { + if (pCurrent != *ppNode) { + return *ppNode; + } + NodeType *pChild = TraverseStrategy::GetFirstChild(*ppNode); + if (pChild == NULL) { + break; + } + m_NodeStack.Push(pChild); + } + while ((ppNode = m_NodeStack.GetTopElement()) != NULL) { + NodeType *pNext = TraverseStrategy::GetNextSibling(*ppNode); + m_NodeStack.Pop(); + if (m_NodeStack.GetSize() == 0) { + break; + } + if (pNext) { + m_NodeStack.Push(pNext); + break; + } + } + } + return NULL; + } + NodeType* SkipChildrenAndMoveToNext() + { + NodeType **ppNode = NULL; + while ((ppNode = m_NodeStack.GetTopElement()) != NULL) { + NodeType *pNext = TraverseStrategy::GetNextSibling(*ppNode); + m_NodeStack.Pop(); + if (m_NodeStack.GetSize() == 0) { + break; + } + if (pNext) { + m_NodeStack.Push(pNext); + break; + } + } + return GetCurrent(); + } +protected: + NodeType *m_pRoot; + CFX_StackTemplate m_NodeStack; +}; +template +class CXFA_PtrSetTemplate : private CFX_MapPtrToPtr +{ +public: + + CXFA_PtrSetTemplate() : CFX_MapPtrToPtr(10) {} + + int GetCount() const + { + return CFX_MapPtrToPtr::GetCount(); + } + + + FX_BOOL IsEmpty() const + { + return CFX_MapPtrToPtr::IsEmpty(); + } + + FX_BOOL Lookup(KeyType key) const + { + FX_LPVOID pValue = NULL; + return CFX_MapPtrToPtr::Lookup((void*)key, pValue); + } + + FX_BOOL operator[](KeyType key) + { + return Lookup(key); + } + + void Add(KeyType key) + { + CFX_MapPtrToPtr::SetAt((void*)key, (void*)key); + } + + FX_BOOL RemoveKey(KeyType key) + { + return CFX_MapPtrToPtr::RemoveKey((void*)key); + } + + void RemoveAll() + { + CFX_MapPtrToPtr::RemoveAll(); + } + + FX_POSITION GetStartPosition() const + { + return CFX_MapPtrToPtr::GetStartPosition(); + } + + void GetNextAssoc(FX_POSITION& rNextPosition, KeyType& rKey) const + { + void* pKey = NULL; + void* pValue = NULL; + CFX_MapPtrToPtr::GetNextAssoc(rNextPosition, pKey, pValue); + rKey = (KeyType)(FX_UINTPTR)pKey; + } +}; +class CXFA_Node; +class CXFA_WidgetData; +#include "fxfa_localevalue.h" +CXFA_Node* XFA_CreateUIChild(CXFA_Node* pNode, XFA_ELEMENT& eWidgetType); +CXFA_LocaleValue XFA_GetLocaleValue(CXFA_WidgetData* pWidgetData); +CFX_WideString XFA_NumericLimit(const CFX_WideString &wsValue, FX_INT32 iLead, FX_INT32 iTread); +FX_DOUBLE XFA_WideStringToDouble(const CFX_WideString &wsStringVal); +FX_DOUBLE XFA_ByteStringToDouble(FX_BSTR szStringVal); +#ifndef XFA_PARSE_HAS_LINEIDENTIFIER +#define XFA_PARSE_HAS_LINEIDENTIFIER +#endif +FX_BOOL XFA_RecognizeRichText(IFDE_XMLElement* pRichTextXMLNode); +void XFA_GetPlainTextFromRichText(IFDE_XMLNode *pXMLNode, CFX_WideString &wsPlainText); +FX_BOOL XFA_FieldIsMultiListBox(CXFA_Node* pFieldNode); +IFX_Stream* XFA_CreateWideTextRead(const CFX_WideString &wsBuffer); +FX_BOOL XFA_IsLayoutElement(XFA_ELEMENT eElement, FX_BOOL bLayoutContainer = FALSE); +FX_BOOL XFA_IsTakingupSpace(XFA_ATTRIBUTEENUM ePresence); +FX_BOOL XFA_IsFlowingLayout(XFA_ATTRIBUTEENUM eLayout); +FX_BOOL XFA_IsHorizontalFlow(XFA_ATTRIBUTEENUM eLayout); +void XFA_DataExporter_DealWithDataGroupNode(CXFA_Node *pDataNode); +void XFA_DataExporter_RegenerateFormFile(CXFA_Node* pNode, IFX_Stream* pStream, FX_LPCSTR pChecksum = NULL, FX_BOOL bSaveXML = FALSE); +#endif diff --git a/xfa/src/fxfa/src/fm2js/xfa_error.cpp b/xfa/src/fxfa/src/fm2js/xfa_error.cpp new file mode 100644 index 0000000000..6d5f253e5a --- /dev/null +++ b/xfa/src/fxfa/src/fm2js/xfa_error.cpp @@ -0,0 +1,25 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "xfa_fm2js.h" +static FX_LPCWSTR gs_lpStrErrorMsgInfo[] = { + (FX_LPCWSTR)(L"unsupported char '%c'"), + (FX_LPCWSTR)(L"bad suffix on number"), + (FX_LPCWSTR)(L"invalidate char '%c'"), + (FX_LPCWSTR)(L"expected identifier instead of '%s'"), + (FX_LPCWSTR)(L"expected '%s' instead of '%s'"), + (FX_LPCWSTR)(L"expected 'endif' instead of '%s'"), + (FX_LPCWSTR)(L"unexpected expression '%s'"), + (FX_LPCWSTR)(L"expected operator '%s' instead of '%s'"), +}; +FX_LPCWSTR XFA_FM_ErrorMsg(XFA_FM_ERRMSG msg) +{ + if(msg < FMERR_MAXIMUM) { + return gs_lpStrErrorMsgInfo[msg]; + } else { + return (FX_LPCWSTR)(L""); + } +} diff --git a/xfa/src/fxfa/src/fm2js/xfa_error.h b/xfa/src/fxfa/src/fm2js/xfa_error.h new file mode 100644 index 0000000000..8ec0250b22 --- /dev/null +++ b/xfa/src/fxfa/src/fm2js/xfa_error.h @@ -0,0 +1,29 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _XFA_FM_ERROR_H +#define _XFA_FM_ERROR_H +enum XFA_FM_ERRMSG { + FMERR_UNSUPPORTED_CHAR, + FMERR_BAD_SUFFIX_NUMBER, + FMERR_INVALIDATE_CHAR, + FMERR_EXPECTED_IDENTIFIER, + FMERR_EXPECTED_TOKEN, + FMERR_EXPECTED_IFEND, + FMERR_UNEXPECTED_EXPRESSION, + FMERR_EXPTECTED_OPERATOR, + FMERR_MAXIMUM +}; +class CXFA_FMErrorInfo : public CFX_Object +{ +public: + CXFA_FMErrorInfo() : linenum(0) {}; + ~CXFA_FMErrorInfo() {}; + FX_DWORD linenum; + CFX_WideString message; +}; +FX_LPCWSTR XFA_FM_ErrorMsg( XFA_FM_ERRMSG msg); +#endif diff --git a/xfa/src/fxfa/src/fm2js/xfa_expression.cpp b/xfa/src/fxfa/src/fm2js/xfa_expression.cpp new file mode 100644 index 0000000000..7b230de528 --- /dev/null +++ b/xfa/src/fxfa/src/fm2js/xfa_expression.cpp @@ -0,0 +1,715 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "xfa_fm2js.h" +static CFX_WideStringC RUNTIMEBLOCKTEMPARRAY = FX_WSTRC(L"foxit_xfa_formcalc_runtime_block_temp_array"); +static CFX_WideStringC RUNTIMEBLOCKTEMPARRAYINDEX = FX_WSTRC(L"foxit_xfa_formcalc_runtime_block_temp_array_index"); +CXFA_FMExpression::CXFA_FMExpression( FX_DWORD line ) + : m_line(line), m_type(XFA_FM_EXPTYPE_UNKNOWN) +{ +} +CXFA_FMExpression::CXFA_FMExpression(FX_DWORD line, XFA_FM_EXPTYPE type) + : m_line(line), m_type(type) +{ +} +void CXFA_FMExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{} +void CXFA_FMExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) +{} +CXFA_FMFunctionDefinition::CXFA_FMFunctionDefinition( FX_DWORD line, FX_BOOL isGlobal, FX_WSTR wsName, CFX_WideStringCArray *pArguments, CFX_PtrArray *pExpressions ) + : CXFA_FMExpression(line, XFA_FM_EXPTYPE_FUNC), + m_isGlobal(isGlobal), + m_wsName(wsName), + m_pArguments(pArguments), + m_pExpressions(pExpressions) +{ +} +CXFA_FMFunctionDefinition::~CXFA_FMFunctionDefinition() +{ + if (m_pArguments) { + m_pArguments->RemoveAll(); + delete m_pArguments; + m_pArguments = 0; + } + if (m_pExpressions) { + FX_INT32 expc = m_pExpressions->GetSize(); + FX_INT32 index = 0; + CXFA_FMExpression *e = 0; + while (index < expc) { + e = (CXFA_FMExpression *)m_pExpressions->GetAt(index); + delete e; + index++; + } + m_pExpressions->RemoveAll(); + delete m_pExpressions; + m_pExpressions = 0; + } +} +void CXFA_FMFunctionDefinition::ToJavaScript(CFX_WideTextBuf& javascript) +{ + if (m_isGlobal && (!m_pExpressions || m_pExpressions->GetSize() == 0)) { + javascript << FX_WSTRC(L"// comments only"); + return; + } + if(m_isGlobal) { + javascript << FX_WSTRC(L"(\n"); + } + javascript << FX_WSTRC(L"function "); + if (m_wsName.GetAt(0) == L'!') { + CFX_WideString tempName = EXCLAMATION_IN_IDENTIFIER + m_wsName.Mid(1); + javascript << tempName; + } else { + javascript << m_wsName; + } + javascript << FX_WSTRC(L"("); + if (m_pArguments != 0) { + FX_INT32 argc = m_pArguments->GetSize(); + FX_INT32 index = 0; + CFX_WideStringC identifier = 0; + while (index < argc) { + identifier = m_pArguments->GetAt(index); + if (identifier.GetAt(0) == L'!') { + CFX_WideString tempIdentifier = EXCLAMATION_IN_IDENTIFIER + identifier.Mid(1); + javascript << tempIdentifier; + } else { + javascript << identifier; + } + if (index + 1 < argc) { + javascript << FX_WSTRC(L", "); + } + index++; + } + } + javascript << FX_WSTRC(L")\n{\n"); + javascript << FX_WSTRC(L"var "); + javascript << RUNTIMEFUNCTIONRETURNVALUE; + javascript << FX_WSTRC(L" = null;\n"); + if (m_pExpressions) { + FX_INT32 expc = m_pExpressions->GetSize(); + FX_INT32 index = 0; + CXFA_FMExpression *e = 0; + while (index < expc) { + e = (CXFA_FMExpression *)m_pExpressions->GetAt(index); + if (index + 1 < expc) { + e->ToJavaScript(javascript); + } else { + e->ToImpliedReturnJS(javascript); + } + index++; + } + } + javascript << FX_WSTRC(L"return "); + if (m_isGlobal) { + javascript << XFA_FM_EXPTypeToString(GETFMVALUE); + javascript << FX_WSTRC(L"("); + javascript << RUNTIMEFUNCTIONRETURNVALUE; + javascript << FX_WSTRC(L")"); + } else { + javascript << RUNTIMEFUNCTIONRETURNVALUE; + } + javascript << FX_WSTRC(L";\n}\n"); + if(m_isGlobal) { + javascript << FX_WSTRC(L").call(this);\n"); + } +} +void CXFA_FMFunctionDefinition::ToImpliedReturnJS(CFX_WideTextBuf&) +{} +CXFA_FMVarExpression::CXFA_FMVarExpression( FX_DWORD line, FX_WSTR wsName, CXFA_FMExpression *pInit ) + : CXFA_FMExpression(line, XFA_FM_EXPTYPE_VAR), + m_wsName(wsName), + m_pInit(pInit) +{ +} +CXFA_FMVarExpression::~CXFA_FMVarExpression() +{ + if (m_pInit) { + delete m_pInit; + m_pInit = 0; + } +} +void CXFA_FMVarExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ + javascript << FX_WSTRC(L"var "); + CFX_WideString tempName = m_wsName; + if (m_wsName.GetAt(0) == L'!') { + tempName = EXCLAMATION_IN_IDENTIFIER + m_wsName.Mid(1); + } + javascript << tempName; + javascript << FX_WSTRC(L" = "); + if (m_pInit) { + m_pInit->ToJavaScript(javascript); + javascript << tempName; + javascript << FX_WSTRC(L" = "); + javascript << XFA_FM_EXPTypeToString(VARFILTER); + javascript << FX_WSTRC(L"("); + javascript << tempName; + javascript << FX_WSTRC(L");\n"); + } else { + javascript << FX_WSTRC(L"\"\";\n"); + } +} +void CXFA_FMVarExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) +{ + javascript << FX_WSTRC(L"var "); + CFX_WideString tempName = m_wsName; + if (m_wsName.GetAt(0) == L'!') { + tempName = EXCLAMATION_IN_IDENTIFIER + m_wsName.Mid(1); + } + javascript << tempName; + javascript << FX_WSTRC(L" = "); + if (m_pInit) { + m_pInit->ToJavaScript(javascript); + javascript << tempName; + javascript << FX_WSTRC(L" = "); + javascript << XFA_FM_EXPTypeToString(VARFILTER); + javascript << FX_WSTRC(L"("); + javascript << tempName; + javascript << FX_WSTRC(L");\n"); + } else { + javascript << FX_WSTRC(L"\"\";\n"); + } + javascript << RUNTIMEFUNCTIONRETURNVALUE; + javascript << FX_WSTRC(L" = "); + javascript << tempName; + javascript << FX_WSTRC(L";\n"); +} +CXFA_FMExpExpression::CXFA_FMExpExpression( FX_DWORD line, CXFA_FMSimpleExpression *pExpression ) + : CXFA_FMExpression(line, XFA_FM_EXPTYPE_EXP), m_pExpression(pExpression) +{ +} +CXFA_FMExpExpression::~CXFA_FMExpExpression() +{ + if (m_pExpression) { + delete m_pExpression; + m_pExpression = 0; + } +} +void CXFA_FMExpExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ + if (m_pExpression->GetOperatorToken() == TOKassign) { + m_pExpression->ToJavaScript(javascript); + } else { + m_pExpression->ToJavaScript(javascript); + javascript << FX_WSTRC(L";\n"); + } +} +void CXFA_FMExpExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) +{ + if (m_pExpression->GetOperatorToken() == TOKassign) { + m_pExpression->ToImpliedReturnJS(javascript); + } else { + if( m_pExpression->GetOperatorToken() == TOKstar || + m_pExpression->GetOperatorToken() == TOKdotstar || + m_pExpression->GetOperatorToken() == TOKdotscream || + m_pExpression->GetOperatorToken() == TOKdotdot || + m_pExpression->GetOperatorToken() == TOKdot + ) { + javascript << RUNTIMEFUNCTIONRETURNVALUE; + javascript << FX_WSTRC(L" = "); + javascript << XFA_FM_EXPTypeToString(GETFMVALUE); + javascript << FX_WSTRC(L"("); + m_pExpression->ToJavaScript(javascript); + javascript << FX_WSTRC(L");\n"); + } else { + javascript << RUNTIMEFUNCTIONRETURNVALUE; + javascript << FX_WSTRC(L" = "); + m_pExpression->ToJavaScript(javascript); + javascript << FX_WSTRC(L";\n"); + } + } +} +CXFA_FMBlockExpression::CXFA_FMBlockExpression(FX_DWORD line, CFX_PtrArray *pExpressionList ) + : CXFA_FMExpression(line, XFA_FM_EXPTYPE_BLOCK), + m_pExpressionList(pExpressionList) +{ +} +CXFA_FMBlockExpression::~CXFA_FMBlockExpression() +{ + if (m_pExpressionList) { + FX_INT32 expc = m_pExpressionList->GetSize(); + FX_INT32 index = 0; + CXFA_FMExpression *e = 0; + while (index < expc) { + e = (CXFA_FMExpression *)m_pExpressionList->GetAt(index); + delete e; + index++; + } + m_pExpressionList->RemoveAll(); + delete m_pExpressionList; + m_pExpressionList = 0; + } +} +void CXFA_FMBlockExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ + javascript << FX_WSTRC(L"{\n"); + if (m_pExpressionList) { + FX_INT32 expc = m_pExpressionList->GetSize(); + FX_INT32 index = 0; + CXFA_FMExpression *e = 0; + while (index < expc) { + e = (CXFA_FMExpression *)m_pExpressionList->GetAt(index); + e->ToJavaScript(javascript); + index++; + } + } + javascript << FX_WSTRC(L"}\n"); +} +void CXFA_FMBlockExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) +{ + javascript << FX_WSTRC(L"{\n"); + if (m_pExpressionList) { + FX_INT32 expc = m_pExpressionList->GetSize(); + FX_INT32 index = 0; + CXFA_FMExpression *e = 0; + while (index < expc) { + e = (CXFA_FMExpression *)m_pExpressionList->GetAt(index); + if (index + 1 == expc) { + e->ToImpliedReturnJS(javascript); + } else { + e->ToJavaScript(javascript); + } + index++; + } + } + javascript << FX_WSTRC(L"}\n"); +} +CXFA_FMDoExpression::CXFA_FMDoExpression( FX_DWORD line, CXFA_FMExpression *pList ) + : CXFA_FMExpression(line), + m_pList(pList) +{ +} +CXFA_FMDoExpression::~CXFA_FMDoExpression() +{ + if (m_pList) { + delete m_pList; + m_pList = 0; + } +} +void CXFA_FMDoExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ + m_pList->ToJavaScript(javascript); +} +void CXFA_FMDoExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) +{ + m_pList->ToImpliedReturnJS(javascript); +} +CXFA_FMIfExpression::CXFA_FMIfExpression( FX_DWORD line, CXFA_FMSimpleExpression *pExpression, CXFA_FMExpression *pIfExpression, CXFA_FMExpression *pElseExpression ) + : CXFA_FMExpression(line, XFA_FM_EXPTYPE_IF), + m_pExpression(pExpression), + m_pIfExpression(pIfExpression), + m_pElseExpression(pElseExpression) +{ +} +CXFA_FMIfExpression::~CXFA_FMIfExpression() +{ + if (m_pExpression) { + delete m_pExpression; + m_pExpression = 0; + } + if (m_pIfExpression) { + delete m_pIfExpression; + m_pIfExpression = 0; + } + if (m_pElseExpression) { + delete m_pElseExpression; + m_pElseExpression = 0; + } +} +void CXFA_FMIfExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ + javascript << FX_WSTRC(L"if ("); + if (m_pExpression) { + javascript << XFA_FM_EXPTypeToString(GETFMVALUE); + javascript << FX_WSTRC(L"("); + m_pExpression->ToJavaScript(javascript); + javascript << FX_WSTRC(L")"); + } + javascript << FX_WSTRC(L")\n"); + if (m_pIfExpression) { + m_pIfExpression->ToJavaScript(javascript); + } + if (m_pElseExpression) { + if (m_pElseExpression->GetExpType() == XFA_FM_EXPTYPE_IF) { + javascript << FX_WSTRC(L"else\n"); + javascript << FX_WSTRC(L"{\n"); + m_pElseExpression->ToJavaScript(javascript); + javascript << FX_WSTRC(L"}\n"); + } else { + javascript << FX_WSTRC(L"else\n"); + m_pElseExpression->ToJavaScript(javascript); + } + } +} +void CXFA_FMIfExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) +{ + javascript << RUNTIMEFUNCTIONRETURNVALUE; + javascript << FX_WSTRC(L" = 0;\n"); + javascript << FX_WSTRC(L"if ("); + if (m_pExpression) { + javascript << XFA_FM_EXPTypeToString(GETFMVALUE); + javascript << FX_WSTRC(L"("); + m_pExpression->ToJavaScript(javascript); + javascript << FX_WSTRC(L")"); + } + javascript << FX_WSTRC(L")\n"); + if (m_pIfExpression) { + m_pIfExpression->ToImpliedReturnJS(javascript); + } + if (m_pElseExpression) { + if (m_pElseExpression->GetExpType() == XFA_FM_EXPTYPE_IF) { + javascript << FX_WSTRC(L"else\n"); + javascript << FX_WSTRC(L"{\n"); + m_pElseExpression->ToImpliedReturnJS(javascript); + javascript << FX_WSTRC(L"}\n"); + } else { + javascript << FX_WSTRC(L"else\n"); + m_pElseExpression->ToImpliedReturnJS(javascript); + } + } +} +CXFA_FMLoopExpression::~CXFA_FMLoopExpression() +{ +} +void CXFA_FMLoopExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ +} +void CXFA_FMLoopExpression::ToImpliedReturnJS(CFX_WideTextBuf&) +{} +CXFA_FMWhileExpression::CXFA_FMWhileExpression( FX_DWORD line, CXFA_FMSimpleExpression *pCondition, CXFA_FMExpression *pExpression ) + : CXFA_FMLoopExpression(line), + m_pCondition(pCondition), + m_pExpression(pExpression) +{ +} +CXFA_FMWhileExpression::~CXFA_FMWhileExpression() +{ + if (m_pCondition) { + delete m_pCondition; + m_pCondition = 0; + } + if (m_pExpression) { + delete m_pExpression; + m_pExpression = 0; + } +} +void CXFA_FMWhileExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ + javascript << FX_WSTRC(L"while ("); + m_pCondition->ToJavaScript(javascript); + javascript << FX_WSTRC(L")\n"); + m_pExpression->ToJavaScript(javascript); +} +void CXFA_FMWhileExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) +{ + javascript << RUNTIMEFUNCTIONRETURNVALUE; + javascript << FX_WSTRC(L" = 0;\n"); + javascript << FX_WSTRC(L"while ("); + m_pCondition->ToJavaScript(javascript); + javascript << FX_WSTRC(L")\n"); + m_pExpression->ToImpliedReturnJS(javascript); +} +CXFA_FMBreakExpression::CXFA_FMBreakExpression(FX_DWORD line) + : CXFA_FMExpression(line, XFA_FM_EXPTYPE_BREAK), + m_pExpression(0) +{ +} +CXFA_FMBreakExpression::~CXFA_FMBreakExpression() +{ +} +void CXFA_FMBreakExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ + javascript << RUNTIMEFUNCTIONRETURNVALUE; + javascript << FX_WSTRC(L" = 0;\n"); + javascript << FX_WSTRC(L"break;\n"); +} +void CXFA_FMBreakExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) +{ + javascript << RUNTIMEFUNCTIONRETURNVALUE; + javascript << FX_WSTRC(L" = 0;\n"); + javascript << FX_WSTRC(L"break;\n"); +} +CXFA_FMContinueExpression::CXFA_FMContinueExpression( FX_DWORD line ) + : CXFA_FMExpression(line, XFA_FM_EXPTYPE_CONTINUE), + m_pExpression(0) +{ +} +CXFA_FMContinueExpression::~CXFA_FMContinueExpression() +{ +} +void CXFA_FMContinueExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ + javascript << RUNTIMEFUNCTIONRETURNVALUE; + javascript << FX_WSTRC(L" = 0;\n"); + javascript << FX_WSTRC(L"continue;\n"); +} +void CXFA_FMContinueExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) +{ + javascript << RUNTIMEFUNCTIONRETURNVALUE; + javascript << FX_WSTRC(L" = 0;\n"); + javascript << FX_WSTRC(L"continue;\n"); +} +CXFA_FMForExpression::CXFA_FMForExpression(FX_DWORD line, FX_WSTR wsVariant, CXFA_FMSimpleExpression *pAssignment, CXFA_FMSimpleExpression *pAccessor, FX_INT32 iDirection, CXFA_FMSimpleExpression *pStep, CXFA_FMExpression *pList) + : CXFA_FMLoopExpression(line), + m_wsVariant(wsVariant), + m_pAssignment(pAssignment), + m_pAccessor(pAccessor), + m_iDirection(iDirection), + m_pStep(pStep), + m_pList(pList) +{ +} +CXFA_FMForExpression::~CXFA_FMForExpression() +{ + if (m_pAssignment) { + delete m_pAssignment; + m_pAssignment = 0; + } + if (m_pAccessor) { + delete m_pAccessor; + m_pAccessor = 0; + } + if (m_pStep) { + delete m_pStep; + m_pStep = 0; + } + if (m_pList) { + delete m_pList; + m_pList = 0; + } +} +void CXFA_FMForExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ + javascript << FX_WSTRC(L"{\nvar "); + CFX_WideString tempVariant; + if (m_wsVariant.GetAt(0) == L'!') { + tempVariant = EXCLAMATION_IN_IDENTIFIER + m_wsVariant.Mid(1); + javascript << tempVariant; + } else { + tempVariant = m_wsVariant; + javascript << m_wsVariant; + } + javascript << FX_WSTRC(L" = null;\n"); + javascript << FX_WSTRC(L"for ("); + javascript << tempVariant; + javascript << FX_WSTRC(L" = "); + javascript << XFA_FM_EXPTypeToString(GETFMVALUE); + javascript << FX_WSTRC(L"("); + m_pAssignment->ToJavaScript(javascript); + javascript << FX_WSTRC(L"); "); + javascript << tempVariant; + if (m_iDirection == 1) { + javascript << FX_WSTRC(L" <= "); + javascript << XFA_FM_EXPTypeToString(GETFMVALUE); + javascript << FX_WSTRC(L"("); + m_pAccessor->ToJavaScript(javascript); + javascript << FX_WSTRC(L"); "); + javascript << tempVariant; + javascript << FX_WSTRC(L" += "); + } else { + javascript << FX_WSTRC(L" >= "); + javascript << XFA_FM_EXPTypeToString(GETFMVALUE); + javascript << FX_WSTRC(L"("); + m_pAccessor->ToJavaScript(javascript); + javascript << FX_WSTRC(L"); "); + javascript << tempVariant; + javascript << FX_WSTRC(L" -= "); + } + if (m_pStep) { + javascript << XFA_FM_EXPTypeToString(GETFMVALUE); + javascript << FX_WSTRC(L"("); + m_pStep->ToJavaScript(javascript); + javascript << FX_WSTRC(L")"); + } else { + javascript << FX_WSTRC(L"1"); + } + javascript << FX_WSTRC(L")\n"); + m_pList->ToJavaScript(javascript); + javascript << FX_WSTRC(L"}\n"); +} +void CXFA_FMForExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) +{ + javascript << RUNTIMEFUNCTIONRETURNVALUE; + javascript << FX_WSTRC(L" = 0;\n"); + javascript << FX_WSTRC(L"{\nvar "); + CFX_WideString tempVariant; + if (m_wsVariant.GetAt(0) == L'!') { + tempVariant = EXCLAMATION_IN_IDENTIFIER + m_wsVariant.Mid(1); + javascript << tempVariant; + } else { + tempVariant = m_wsVariant; + javascript << m_wsVariant; + } + javascript << FX_WSTRC(L" = null;\n"); + javascript << FX_WSTRC(L"for ("); + javascript << tempVariant; + javascript << FX_WSTRC(L" = "); + javascript << XFA_FM_EXPTypeToString(GETFMVALUE); + javascript << FX_WSTRC(L"("); + m_pAssignment->ToJavaScript(javascript); + javascript << FX_WSTRC(L"); "); + javascript << tempVariant; + if (m_iDirection == 1) { + javascript << FX_WSTRC(L" <= "); + javascript << XFA_FM_EXPTypeToString(GETFMVALUE); + javascript << FX_WSTRC(L"("); + m_pAccessor->ToJavaScript(javascript); + javascript << FX_WSTRC(L"); "); + javascript << tempVariant; + javascript << FX_WSTRC(L" += "); + } else { + javascript << FX_WSTRC(L" >= "); + javascript << XFA_FM_EXPTypeToString(GETFMVALUE); + javascript << FX_WSTRC(L"("); + m_pAccessor->ToJavaScript(javascript); + javascript << FX_WSTRC(L"); "); + javascript << tempVariant; + javascript << FX_WSTRC(L" -= "); + } + if (m_pStep) { + javascript << XFA_FM_EXPTypeToString(GETFMVALUE); + javascript << FX_WSTRC(L"("); + m_pStep->ToJavaScript(javascript); + javascript << FX_WSTRC(L")"); + } else { + javascript << FX_WSTRC(L"1"); + } + javascript << FX_WSTRC(L")\n"); + m_pList->ToImpliedReturnJS(javascript); + javascript << FX_WSTRC(L"}\n"); +} +CXFA_FMForeachExpression::CXFA_FMForeachExpression( FX_DWORD line, FX_WSTR wsIdentifier, CFX_PtrArray *pAccessors, CXFA_FMExpression *pList ) + : CXFA_FMLoopExpression(line), + m_wsIdentifier(wsIdentifier), + m_pAccessors(pAccessors), + m_pList(pList) +{ +} +CXFA_FMForeachExpression::~CXFA_FMForeachExpression() +{ + if (m_pList) { + delete m_pList; + m_pList = 0; + } + if (m_pAccessors) { + FX_INT32 size = m_pAccessors->GetSize(); + FX_INT32 index = 0; + CXFA_FMSimpleExpression *e = 0; + while (index < size) { + e = (CXFA_FMSimpleExpression *)m_pAccessors->GetAt(index); + delete e; + index++; + } + m_pAccessors->RemoveAll(); + delete m_pAccessors; + m_pAccessors = 0; + } +} +void CXFA_FMForeachExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ + javascript << FX_WSTRC(L"{\n"); + javascript << FX_WSTRC(L"var "); + if (m_wsIdentifier.GetAt(0) == L'!') { + CFX_WideString tempIdentifier = EXCLAMATION_IN_IDENTIFIER + m_wsIdentifier.Mid(1); + javascript << tempIdentifier; + } else { + javascript << m_wsIdentifier; + } + javascript << FX_WSTRC(L" = null;\n"); + javascript << FX_WSTRC(L"var "); + javascript << RUNTIMEBLOCKTEMPARRAY; + javascript << FX_WSTRC(L" = "); + javascript << XFA_FM_EXPTypeToString(CONCATFMOBJECT); + javascript << FX_WSTRC(L"("); + FX_INT32 iSize = m_pAccessors->GetSize(); + FX_INT32 index = 0; + CXFA_FMSimpleExpression *s = 0; + while(index < iSize) { + s = (CXFA_FMSimpleExpression *)m_pAccessors->GetAt(index); + s->ToJavaScript(javascript); + if (index + 1 < iSize) { + javascript << FX_WSTRC(L", "); + } + index++; + } + s = 0; + javascript << FX_WSTRC(L");\n"); + javascript << FX_WSTRC(L"var "); + javascript << RUNTIMEBLOCKTEMPARRAYINDEX; + javascript << FX_WSTRC(L" = 0;\n"); + javascript << FX_WSTRC(L"while("); + javascript << RUNTIMEBLOCKTEMPARRAYINDEX; + javascript << FX_WSTRC(L" < "); + javascript << RUNTIMEBLOCKTEMPARRAY; + javascript << FX_WSTRC(L".length)\n{\n"); + if (m_wsIdentifier.GetAt(0) == L'!') { + CFX_WideString tempIdentifier = EXCLAMATION_IN_IDENTIFIER + m_wsIdentifier.Mid(1); + javascript << tempIdentifier; + } else { + javascript << m_wsIdentifier; + } + javascript << FX_WSTRC(L" = "); + javascript << RUNTIMEBLOCKTEMPARRAY; + javascript << FX_WSTRC(L"["); + javascript << RUNTIMEBLOCKTEMPARRAYINDEX; + javascript << FX_WSTRC(L"++];\n"); + m_pList->ToJavaScript(javascript); + javascript << FX_WSTRC(L"}\n"); + javascript << FX_WSTRC(L"}\n"); +} +void CXFA_FMForeachExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) +{ + javascript << RUNTIMEFUNCTIONRETURNVALUE; + javascript << FX_WSTRC(L" = 0;\n"); + javascript << FX_WSTRC(L"{\n"); + javascript << FX_WSTRC(L"var "); + if (m_wsIdentifier.GetAt(0) == L'!') { + CFX_WideString tempIdentifier = EXCLAMATION_IN_IDENTIFIER + m_wsIdentifier.Mid(1); + javascript << tempIdentifier; + } else { + javascript << m_wsIdentifier; + } + javascript << FX_WSTRC(L" = null;\n"); + javascript << FX_WSTRC(L"var "); + javascript << RUNTIMEBLOCKTEMPARRAY; + javascript << FX_WSTRC(L" = "); + javascript << XFA_FM_EXPTypeToString(CONCATFMOBJECT); + javascript << FX_WSTRC(L"("); + FX_INT32 iSize = m_pAccessors->GetSize(); + FX_INT32 index = 0; + CXFA_FMSimpleExpression *s = 0; + while(index < iSize) { + s = (CXFA_FMSimpleExpression *)m_pAccessors->GetAt(index); + s->ToJavaScript(javascript); + if (index + 1 < iSize) { + javascript << FX_WSTRC(L", "); + } + index++; + } + s = 0; + javascript << FX_WSTRC(L");\n"); + javascript << FX_WSTRC(L"var "); + javascript << RUNTIMEBLOCKTEMPARRAYINDEX; + javascript << FX_WSTRC(L" = 0;\n"); + javascript << FX_WSTRC(L"while("); + javascript << RUNTIMEBLOCKTEMPARRAYINDEX; + javascript << FX_WSTRC(L" < "); + javascript << RUNTIMEBLOCKTEMPARRAY; + javascript << FX_WSTRC(L".length)\n{\n"); + if (m_wsIdentifier.GetAt(0) == L'!') { + CFX_WideString tempIdentifier = EXCLAMATION_IN_IDENTIFIER + m_wsIdentifier.Mid(1); + javascript << tempIdentifier; + } else { + javascript << m_wsIdentifier; + } + javascript << FX_WSTRC(L" = "); + javascript << RUNTIMEBLOCKTEMPARRAY; + javascript << FX_WSTRC(L"["); + javascript << RUNTIMEBLOCKTEMPARRAYINDEX; + javascript << FX_WSTRC(L"++];\n"); + m_pList->ToImpliedReturnJS(javascript); + javascript << FX_WSTRC(L"}\n"); + javascript << FX_WSTRC(L"}\n"); +} diff --git a/xfa/src/fxfa/src/fm2js/xfa_expression.h b/xfa/src/fxfa/src/fm2js/xfa_expression.h new file mode 100644 index 0000000000..ffd7cf2442 --- /dev/null +++ b/xfa/src/fxfa/src/fm2js/xfa_expression.h @@ -0,0 +1,172 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _XFA_FM_EXPRESSION_H +#define _XFA_FM_EXPRESSION_H +enum XFA_FM_EXPTYPE { + XFA_FM_EXPTYPE_UNKNOWN, + XFA_FM_EXPTYPE_FUNC, + XFA_FM_EXPTYPE_VAR, + XFA_FM_EXPTYPE_EXP, + XFA_FM_EXPTYPE_BLOCK, + XFA_FM_EXPTYPE_IF, + XFA_FM_EXPTYPE_BREAK, + XFA_FM_EXPTYPE_CONTINUE, +}; +class CXFA_FMExpression : public CFX_Object +{ +public: + CXFA_FMExpression(FX_DWORD line); + CXFA_FMExpression(FX_DWORD line, XFA_FM_EXPTYPE type); + virtual ~CXFA_FMExpression() {}; + virtual void ToJavaScript(CFX_WideTextBuf& javascript); + virtual void ToImpliedReturnJS(CFX_WideTextBuf&); + FX_DWORD GetLine() + { + return m_line; + } + XFA_FM_EXPTYPE GetExpType() const + { + return m_type; + } +protected: + XFA_FM_EXPTYPE m_type; + FX_DWORD m_line; +}; +class CXFA_FMFunctionDefinition : public CXFA_FMExpression +{ +public: + CXFA_FMFunctionDefinition(FX_DWORD line, FX_BOOL isGlobal, FX_WSTR wsName, CFX_WideStringCArray *pArguments, CFX_PtrArray *pExpressions); + virtual ~CXFA_FMFunctionDefinition(); + virtual void ToJavaScript(CFX_WideTextBuf& javascript); + virtual void ToImpliedReturnJS(CFX_WideTextBuf&); +private: + CFX_WideStringC m_wsName; + CFX_WideStringCArray *m_pArguments; + CFX_PtrArray *m_pExpressions; + FX_BOOL m_isGlobal; +}; +class CXFA_FMVarExpression : public CXFA_FMExpression +{ +public: + CXFA_FMVarExpression(FX_DWORD line, FX_WSTR wsName, CXFA_FMExpression *pInit); + virtual ~CXFA_FMVarExpression(); + virtual void ToJavaScript(CFX_WideTextBuf& javascript); + virtual void ToImpliedReturnJS(CFX_WideTextBuf&); +private: + CFX_WideStringC m_wsName; + CXFA_FMExpression *m_pInit; +}; +class CXFA_FMExpExpression : public CXFA_FMExpression +{ +public: + CXFA_FMExpExpression(FX_DWORD line, CXFA_FMSimpleExpression *pExpression); + virtual ~CXFA_FMExpExpression(); + virtual void ToJavaScript(CFX_WideTextBuf& javascript); + virtual void ToImpliedReturnJS(CFX_WideTextBuf&); +private: + CXFA_FMSimpleExpression *m_pExpression; +}; +class CXFA_FMBlockExpression : public CXFA_FMExpression +{ +public: + CXFA_FMBlockExpression(FX_DWORD line, CFX_PtrArray *pExpressionList); + virtual ~CXFA_FMBlockExpression(); + virtual void ToJavaScript(CFX_WideTextBuf& javascript); + virtual void ToImpliedReturnJS(CFX_WideTextBuf&); +private: + CFX_PtrArray *m_pExpressionList; +}; +class CXFA_FMDoExpression : public CXFA_FMExpression +{ +public: + CXFA_FMDoExpression(FX_DWORD line, CXFA_FMExpression *pList); + virtual ~CXFA_FMDoExpression(); + virtual void ToJavaScript(CFX_WideTextBuf& javascript); + virtual void ToImpliedReturnJS(CFX_WideTextBuf&); +private: + CXFA_FMExpression *m_pList; +}; +class CXFA_FMIfExpression : public CXFA_FMExpression +{ +public: + CXFA_FMIfExpression(FX_DWORD line, CXFA_FMSimpleExpression *pExpression, CXFA_FMExpression *pIfExpression, CXFA_FMExpression *pElseExpression); + virtual ~CXFA_FMIfExpression(); + virtual void ToJavaScript(CFX_WideTextBuf& javascript); + virtual void ToImpliedReturnJS(CFX_WideTextBuf&); +private: + CXFA_FMSimpleExpression *m_pExpression; + CXFA_FMExpression *m_pIfExpression; + CXFA_FMExpression *m_pElseExpression; +}; +class CXFA_FMLoopExpression : public CXFA_FMExpression +{ +public: + CXFA_FMLoopExpression(FX_DWORD line) : CXFA_FMExpression(line) {} + virtual ~CXFA_FMLoopExpression(); + virtual void ToJavaScript(CFX_WideTextBuf& javascript); + virtual void ToImpliedReturnJS(CFX_WideTextBuf&); +}; +class CXFA_FMWhileExpression : public CXFA_FMLoopExpression +{ +public: + CXFA_FMWhileExpression(FX_DWORD line, CXFA_FMSimpleExpression *pCodition, CXFA_FMExpression *pExpression); + virtual ~CXFA_FMWhileExpression(); + virtual void ToJavaScript(CFX_WideTextBuf& javascript); + virtual void ToImpliedReturnJS(CFX_WideTextBuf&); +private: + CXFA_FMSimpleExpression *m_pCondition; + CXFA_FMExpression *m_pExpression; +}; +class CXFA_FMBreakExpression : public CXFA_FMExpression +{ +public: + CXFA_FMBreakExpression(FX_DWORD line); + virtual ~CXFA_FMBreakExpression(); + virtual void ToJavaScript(CFX_WideTextBuf& javascript); + virtual void ToImpliedReturnJS(CFX_WideTextBuf&); +private: + CXFA_FMLoopExpression *m_pExpression; +}; +class CXFA_FMContinueExpression : public CXFA_FMExpression +{ +public: + CXFA_FMContinueExpression(FX_DWORD line); + virtual ~CXFA_FMContinueExpression(); + virtual void ToJavaScript(CFX_WideTextBuf& javascript); + virtual void ToImpliedReturnJS(CFX_WideTextBuf&); +private: + CXFA_FMLoopExpression *m_pExpression; +}; +class CXFA_FMForExpression : public CXFA_FMLoopExpression +{ +public: + CXFA_FMForExpression(FX_DWORD line, FX_WSTR wsVariant, CXFA_FMSimpleExpression *pAssignment, + CXFA_FMSimpleExpression *pAccessor, FX_INT32 iDirection, CXFA_FMSimpleExpression *pStep, CXFA_FMExpression *pList); + virtual ~CXFA_FMForExpression(); + virtual void ToJavaScript(CFX_WideTextBuf& javascript); + virtual void ToImpliedReturnJS(CFX_WideTextBuf&); +private: + CFX_WideStringC m_wsVariant; + CXFA_FMSimpleExpression * m_pAssignment; + CXFA_FMSimpleExpression *m_pAccessor; + FX_INT32 m_iDirection; + CXFA_FMSimpleExpression *m_pStep; + CXFA_FMExpression *m_pList; +}; +class CXFA_FMForeachExpression : public CXFA_FMLoopExpression +{ +public: + CXFA_FMForeachExpression(FX_DWORD line, FX_WSTR wsIdentifier, CFX_PtrArray *pAccessors, CXFA_FMExpression *pList); + virtual ~CXFA_FMForeachExpression(); + virtual void ToJavaScript(CFX_WideTextBuf& javascript); + virtual void ToImpliedReturnJS(CFX_WideTextBuf&); +private: + CFX_WideStringC m_wsIdentifier; + CFX_PtrArray *m_pAccessors; + CXFA_FMExpression *m_pList; +}; +#endif diff --git a/xfa/src/fxfa/src/fm2js/xfa_fm2js.cpp b/xfa/src/fxfa/src/fm2js/xfa_fm2js.cpp new file mode 100644 index 0000000000..3cf1330277 --- /dev/null +++ b/xfa/src/fxfa/src/fm2js/xfa_fm2js.cpp @@ -0,0 +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 "xfa_fm2js.h" diff --git a/xfa/src/fxfa/src/fm2js/xfa_fm2js.h b/xfa/src/fxfa/src/fm2js/xfa_fm2js.h new file mode 100644 index 0000000000..abbf491589 --- /dev/null +++ b/xfa/src/fxfa/src/fm2js/xfa_fm2js.h @@ -0,0 +1,30 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _XFA_FM2JS_H +#define _XFA_FM2JS_H +#include "../../../foxitlib.h" +#include "../common/xfa_utils.h" +#include "../common/xfa_object.h" +#include "../common/xfa_document.h" +#include "../common/xfa_parser.h" +#include "../common/xfa_script.h" +#include "../common/xfa_docdata.h" +#include "../common/xfa_doclayout.h" +#include "../common/xfa_debug.h" +#include "../common/xfa_localemgr.h" +#include "../common/xfa_fm2jsapi.h" +#define RUNTIMEFUNCTIONRETURNVALUE (FX_WSTRC(L"foxit_xfa_formcalc_runtime_func_return_value")) +#define EXCLAMATION_IN_IDENTIFIER (FX_WSTRC(L"foxit_xfa_formcalc__exclamation__")) +typedef CFX_ArrayTemplate CFX_WideStringCArray; +#include "xfa_error.h" +#include "xfa_lexer.h" +#include "xfa_simpleexpression.h" +#include "xfa_expression.h" +#include "xfa_fmparse.h" +#include "xfa_program.h" +#include "xfa_fm2jscontext.h" +#endif diff --git a/xfa/src/fxfa/src/fm2js/xfa_fm2jsapi.cpp b/xfa/src/fxfa/src/fm2js/xfa_fm2jsapi.cpp new file mode 100644 index 0000000000..8a1b1226f4 --- /dev/null +++ b/xfa/src/fxfa/src/fm2js/xfa_fm2jsapi.cpp @@ -0,0 +1,57 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "xfa_fm2js.h" +#ifdef __cplusplus +extern "C" +{ +#endif +FX_INT32 XFA_FM2JS_Translate(FX_WSTR wsFormcalc, CFX_WideTextBuf& wsJavascript, CFX_WideString& wsError) +{ + if (wsFormcalc.IsEmpty()) { + wsJavascript.Clear(); + wsError.Empty(); + return 0; + } + FX_INT32 status = 0; + CXFA_FMProgram program; + status = program.Init(wsFormcalc); + if(status) { + wsError = program.GetError().message; + return status; + } + status = program.ParseProgram(); + if(status) { + wsError = program.GetError().message; + return status; + } + program.TranslateProgram(wsJavascript); + return 0; +} +XFA_HFM2JSCONTEXT XFA_FM2JS_ContextCreate() +{ + return (XFA_HFM2JSCONTEXT)CXFA_FM2JSContext::Create(); +} +void XFA_FM2JS_ContextInitialize(XFA_HFM2JSCONTEXT hFM2JSContext, FXJSE_HRUNTIME hScriptRuntime, + FXJSE_HCONTEXT hScriptContext, + CXFA_Document* pDocument) +{ + CXFA_FM2JSContext *pContext = reinterpret_cast(hFM2JSContext); + pContext->Initialize(hScriptRuntime, hScriptContext, pDocument); +} +void XFA_FM2JS_GlobalPropertyGetter(XFA_HFM2JSCONTEXT hFM2JSContext, FXJSE_HVALUE hValue) +{ + CXFA_FM2JSContext *pContext = reinterpret_cast(hFM2JSContext); + pContext->GlobalPropertyGetter(hValue); +} +void XFA_FM2JS_ContextRelease(XFA_HFM2JSCONTEXT hFM2JSContext) +{ + CXFA_FM2JSContext *pContext = reinterpret_cast(hFM2JSContext); + pContext->Release(); +} +#ifdef __cplusplus +} +#endif diff --git a/xfa/src/fxfa/src/fm2js/xfa_fm2jscontext.cpp b/xfa/src/fxfa/src/fm2js/xfa_fm2jscontext.cpp new file mode 100644 index 0000000000..b43c900480 --- /dev/null +++ b/xfa/src/fxfa/src/fm2js/xfa_fm2jscontext.cpp @@ -0,0 +1,7185 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "xfa_fm2js.h" +#include +#define FINANCIAL_PRECISION 0.00000001 +struct XFA_FMHtmlReserveCode { + FX_UINT32 m_uCode; + FX_LPCWSTR m_htmlReserve; +}; +struct XFA_FMHtmlHashedReserveCode { + FX_UINT32 m_uHash; + FX_LPCWSTR m_htmlReserve; + FX_UINT32 m_uCode; +}; +static XFA_FMHtmlHashedReserveCode reservesForDecode [] = { + {0x00018b62, (FX_LPCWSTR)L"Mu", 924}, + {0x00019083, (FX_LPCWSTR)L"Nu", 925}, + {0x00019ab9, (FX_LPCWSTR)L"Pi", 928}, + {0x0001c3c1, (FX_LPCWSTR)L"Xi", 926}, + {0x000210ac, (FX_LPCWSTR)L"ge", 8805}, + {0x000210bb, (FX_LPCWSTR)L"gt", 62}, + {0x00022a51, (FX_LPCWSTR)L"le", 8804}, + {0x00022a60, (FX_LPCWSTR)L"lt", 60}, + {0x00022f82, (FX_LPCWSTR)L"mu", 956}, + {0x00023493, (FX_LPCWSTR)L"ne", 8800}, + {0x00023497, (FX_LPCWSTR)L"ni", 8715}, + {0x000234a3, (FX_LPCWSTR)L"nu", 957}, + {0x000239c1, (FX_LPCWSTR)L"or", 8744}, + {0x00023ed9, (FX_LPCWSTR)L"pi", 960}, + {0x000267e1, (FX_LPCWSTR)L"xi", 958}, + {0x00c41789, (FX_LPCWSTR)L"lceil", 8968}, + {0x00eef34f, (FX_LPCWSTR)L"thetasym", 977}, + {0x012d7ead, (FX_LPCWSTR)L"lcirc", 206}, + {0x01637b56, (FX_LPCWSTR)L"agrave", 224}, + {0x020856da, (FX_LPCWSTR)L"crarr", 8629}, + {0x022188c3, (FX_LPCWSTR)L"gamma", 947}, + {0x033586d3, (FX_LPCWSTR)L"nbsp", 160}, + {0x04f4c358, (FX_LPCWSTR)L"nsub", 8836}, + {0x0581466a, (FX_LPCWSTR)L"dagger", 8224}, + {0x06b1f790, (FX_LPCWSTR)L"oelig", 339}, + {0x06e490d4, (FX_LPCWSTR)L"Chi", 935}, + {0x0718c6a1, (FX_LPCWSTR)L"ETH", 208}, + {0x07196ada, (FX_LPCWSTR)L"Eta", 919}, + {0x07f667ca, (FX_LPCWSTR)L"Ugrave", 217}, + {0x083a8a21, (FX_LPCWSTR)L"Phi", 934}, + {0x083ac28c, (FX_LPCWSTR)L"Psi", 936}, + {0x086f26a9, (FX_LPCWSTR)L"Rho", 929}, + {0x089b5b51, (FX_LPCWSTR)L"aring", 229}, + {0x08a39f4a, (FX_LPCWSTR)L"Tau", 932}, + {0x08b6188b, (FX_LPCWSTR)L"THORN", 222}, + {0x09ce792a, (FX_LPCWSTR)L"icirc", 238}, + {0x09f9d61e, (FX_LPCWSTR)L"amp", 38}, + {0x09f9db33, (FX_LPCWSTR)L"and", 8743}, + {0x09f9db36, (FX_LPCWSTR)L"ang", 8736}, + {0x0a2e3514, (FX_LPCWSTR)L"cap", 8745}, + {0x0a2e58f4, (FX_LPCWSTR)L"chi", 967}, + {0x0a2e9ba8, (FX_LPCWSTR)L"cup", 8746}, + {0x0a4897d0, (FX_LPCWSTR)L"deg", 176}, + {0x0a6332fa, (FX_LPCWSTR)L"eta", 951}, + {0x0a633301, (FX_LPCWSTR)L"eth", 240}, + {0x0acc4d4b, (FX_LPCWSTR)L"int", 8747}, + {0x0b1b3d35, (FX_LPCWSTR)L"loz", 9674}, + {0x0b1b4c8b, (FX_LPCWSTR)L"lrm", 8206}, + {0x0b4fd9b1, (FX_LPCWSTR)L"not", 172}, + {0x0b845241, (FX_LPCWSTR)L"phi", 966}, + {0x0b84576f, (FX_LPCWSTR)L"piv", 982}, + {0x0b848aac, (FX_LPCWSTR)L"psi", 968}, + {0x0bb8df5e, (FX_LPCWSTR)L"reg", 174}, + {0x0bb8eec9, (FX_LPCWSTR)L"rho", 961}, + {0x0bb9034b, (FX_LPCWSTR)L"rlm", 8207}, + {0x0bd33d14, (FX_LPCWSTR)L"shy", 173}, + {0x0bd34229, (FX_LPCWSTR)L"sim", 8764}, + {0x0bd37faa, (FX_LPCWSTR)L"sub", 8834}, + {0x0bd37fb5, (FX_LPCWSTR)L"sum", 8721}, + {0x0bd37fb8, (FX_LPCWSTR)L"sup", 8835}, + {0x0bed676a, (FX_LPCWSTR)L"tau", 964}, + {0x0c07f32e, (FX_LPCWSTR)L"uml", 168}, + {0x0c71032c, (FX_LPCWSTR)L"yen", 165}, + {0x0c7f2889, (FX_LPCWSTR)L"szlig", 223}, + {0x0c8badbb, (FX_LPCWSTR)L"zwj", 8205}, + {0x10ba4dba, (FX_LPCWSTR)L"Egrave", 200}, + {0x10f1ea24, (FX_LPCWSTR)L"para", 182}, + {0x10f1ea37, (FX_LPCWSTR)L"part", 8706}, + {0x115b2337, (FX_LPCWSTR)L"perp", 8869}, + {0x12b10d15, (FX_LPCWSTR)L"prod", 8719}, + {0x12b10d21, (FX_LPCWSTR)L"prop", 8733}, + {0x12dfa9f4, (FX_LPCWSTR)L"rfloor", 8971}, + {0x12eb4736, (FX_LPCWSTR)L"Agrave", 192}, + {0x12fff2b7, (FX_LPCWSTR)L"pund", 163}, + {0x13fda9f2, (FX_LPCWSTR)L"tilde", 732}, + {0x1417fd62, (FX_LPCWSTR)L"times", 215}, + {0x154fc726, (FX_LPCWSTR)L"ecirc", 234}, + {0x165aa451, (FX_LPCWSTR)L"sigma", 963}, + {0x1709124a, (FX_LPCWSTR)L"Dagger", 8225}, + {0x192f78d5, (FX_LPCWSTR)L"iexcl", 161}, + {0x1b7ed8d7, (FX_LPCWSTR)L"rArr", 8658}, + {0x1ec88c68, (FX_LPCWSTR)L"rang", 9002}, + {0x1ec8a0f7, (FX_LPCWSTR)L"rarr", 8594}, + {0x1eda07f3, (FX_LPCWSTR)L"atilde", 227}, + {0x1f3182c4, (FX_LPCWSTR)L"real", 8476}, + {0x1fc34f8b, (FX_LPCWSTR)L"yacute", 253}, + {0x20d11522, (FX_LPCWSTR)L"acirc", 226}, + {0x21933a9b, (FX_LPCWSTR)L"rsaquo", 8250}, + {0x21f44907, (FX_LPCWSTR)L"uacute", 250}, + {0x220cca72, (FX_LPCWSTR)L"acute", 180}, + {0x242cded1, (FX_LPCWSTR)L"alefsym", 8501}, + {0x2655c66a, (FX_LPCWSTR)L"delta", 948}, + {0x269e4b4d, (FX_LPCWSTR)L"exist", 8707}, + {0x273379fa, (FX_LPCWSTR)L"micro", 181}, + {0x27a37440, (FX_LPCWSTR)L"forall", 8704}, + {0x2854e62c, (FX_LPCWSTR)L"minus", 8722}, + {0x28636f81, (FX_LPCWSTR)L"cedil", 184}, + {0x2887357b, (FX_LPCWSTR)L"iacute", 237}, + {0x2994d5ff, (FX_LPCWSTR)L"frac12", 189}, + {0x2994d601, (FX_LPCWSTR)L"frac14", 188}, + {0x2994e043, (FX_LPCWSTR)L"frac34", 190}, + {0x2a1feb41, (FX_LPCWSTR)L"lambda", 955}, + {0x2ab215f3, (FX_LPCWSTR)L"apos", 39}, + {0x2ab82ef7, (FX_LPCWSTR)L"eacute", 233}, + {0x2b3592ef, (FX_LPCWSTR)L"auml", 228}, + {0x2ce92873, (FX_LPCWSTR)L"aacute", 225}, + {0x2daff48a, (FX_LPCWSTR)L"oslash", 248}, + {0x2ef68882, (FX_LPCWSTR)L"aelig", 230}, + {0x3061d3d3, (FX_LPCWSTR)L"Atilde", 195}, + {0x314b1b6b, (FX_LPCWSTR)L"Yacute", 221}, + {0x337c14e7, (FX_LPCWSTR)L"Uacute", 218}, + {0x37676aca, (FX_LPCWSTR)L"cent", 162}, + {0x37d0b841, (FX_LPCWSTR)L"circ", 710}, + {0x386e7947, (FX_LPCWSTR)L"cong", 8773}, + {0x386e839b, (FX_LPCWSTR)L"copy", 169}, + {0x3a0e225a, (FX_LPCWSTR)L"Epsilon", 917}, + {0x3ba7b721, (FX_LPCWSTR)L"Lambda", 923}, + {0x3bd9abe6, (FX_LPCWSTR)L"Alpha", 913}, + {0x3c3ffad7, (FX_LPCWSTR)L"Eacute", 201}, + {0x3cfaf69f, (FX_LPCWSTR)L"brvbar", 166}, + {0x3d54a489, (FX_LPCWSTR)L"omega", 969}, + {0x3e70f453, (FX_LPCWSTR)L"Aacute", 193}, + {0x3f37c06a, (FX_LPCWSTR)L"Oslash", 216}, + {0x40e1b34e, (FX_LPCWSTR)L"diams", 9830}, + {0x416596df, (FX_LPCWSTR)L"plusmn", 177}, + {0x4354ff16, (FX_LPCWSTR)L"Ucirc", 219}, + {0x454fce6a, (FX_LPCWSTR)L"Upsilon", 933}, + {0x4610ad35, (FX_LPCWSTR)L"emsp", 8195}, + {0x462afb76, (FX_LPCWSTR)L"ensp", 8194}, + {0x46e30073, (FX_LPCWSTR)L"euml", 235}, + {0x46e31a1b, (FX_LPCWSTR)L"euro", 8364}, + {0x46f2eada, (FX_LPCWSTR)L"lowast", 8727}, + {0x4dca26cf, (FX_LPCWSTR)L"Auml", 196}, + {0x4e2d6083, (FX_LPCWSTR)L"image", 8465}, + {0x4f964ee8, (FX_LPCWSTR)L"notin", 8713}, + {0x50917a7a, (FX_LPCWSTR)L"epsilon", 949}, + {0x52f9a4cd, (FX_LPCWSTR)L"Kappa", 922}, + {0x5496f410, (FX_LPCWSTR)L"Ocirc", 212}, + {0x568cbf34, (FX_LPCWSTR)L"zeta", 950}, + {0x57badd20, (FX_LPCWSTR)L"ntilde", 241}, + {0x58662109, (FX_LPCWSTR)L"zwnj", 8204}, + {0x5b39870f, (FX_LPCWSTR)L"empty", 8709}, + {0x5bd3268a, (FX_LPCWSTR)L"upsilon", 965}, + {0x5e2bf8a3, (FX_LPCWSTR)L"Gamma", 915}, + {0x5f73c13a, (FX_LPCWSTR)L"rsquo", 8217}, + {0x61f2bc4d, (FX_LPCWSTR)L"iota", 953}, + {0x625bbcf3, (FX_LPCWSTR)L"isin", 8712}, + {0x62906df7, (FX_LPCWSTR)L"iuml", 239}, + {0x64a5cb31, (FX_LPCWSTR)L"Aring", 197}, + {0x66f25c4a, (FX_LPCWSTR)L"sbquo", 8218}, + {0x6851ab60, (FX_LPCWSTR)L"spades", 9824}, + {0x6942a900, (FX_LPCWSTR)L"Ntilde", 209}, + {0x69779453, (FX_LPCWSTR)L"Euml", 203}, + {0x6cda6e23, (FX_LPCWSTR)L"current", 164}, + {0x70b5b634, (FX_LPCWSTR)L"lsquo", 8216}, + {0x715a3706, (FX_LPCWSTR)L"Ecirc", 202}, + {0x71e8bf8d, (FX_LPCWSTR)L"tdquo", 8221}, + {0x72651431, (FX_LPCWSTR)L"Sigma", 931}, + {0x7569813b, (FX_LPCWSTR)L"iquest", 191}, + {0x776a436a, (FX_LPCWSTR)L"equiv", 8801}, + {0x79215314, (FX_LPCWSTR)L"Zeta", 918}, + {0x79b81224, (FX_LPCWSTR)L"ograve", 242}, + {0x7c2f8b23, (FX_LPCWSTR)L"macr", 175}, + {0x7cdb8502, (FX_LPCWSTR)L"Acirc", 194}, + {0x8185c62e, (FX_LPCWSTR)L"ndash", 8211}, + {0x8260364a, (FX_LPCWSTR)L"Delta", 916}, + {0x846619ad, (FX_LPCWSTR)L"mdash", 8212}, + {0x8550fb50, (FX_LPCWSTR)L"OElig", 338}, + {0x88eb5b85, (FX_LPCWSTR)L"ldquo", 8220}, + {0x8b3fde04, (FX_LPCWSTR)L"Ograve", 210}, + {0x8bc5794b, (FX_LPCWSTR)L"ordf", 170}, + {0x8bc57952, (FX_LPCWSTR)L"ordm", 186}, + {0x8c14923d, (FX_LPCWSTR)L"ouml", 246}, + {0x8c5a7cd6, (FX_LPCWSTR)L"theta", 952}, + {0x8d61812b, (FX_LPCWSTR)L"thorn", 254}, + {0x912b95aa, (FX_LPCWSTR)L"asymp", 8776}, + {0x947faf81, (FX_LPCWSTR)L"middot", 183}, + {0x9629202e, (FX_LPCWSTR)L"lfloor", 8970}, + {0x972e9ec1, (FX_LPCWSTR)L"otilde", 245}, + {0x9748f231, (FX_LPCWSTR)L"otimes", 8855}, + {0x995f1469, (FX_LPCWSTR)L"Omega", 937}, + {0x99eb5349, (FX_LPCWSTR)L"quot", 34}, + {0x9aeb639e, (FX_LPCWSTR)L"hellip", 8230}, + {0xa0ae2f86, (FX_LPCWSTR)L"Scaron", 352}, + {0xa4dcb0d5, (FX_LPCWSTR)L"lsaquo", 8249}, + {0xa53dbf41, (FX_LPCWSTR)L"oacute", 243}, + {0xa5ae9e7b, (FX_LPCWSTR)L"bdquo", 8222}, + {0xa602d7ba, (FX_LPCWSTR)L"sdot", 8901}, + {0xa61ce86f, (FX_LPCWSTR)L"sect", 167}, + {0xa6e4c3d7, (FX_LPCWSTR)L"sigmaf", 962}, + {0xa7c1c74f, (FX_LPCWSTR)L"sube", 8838}, + {0xa7c20ee9, (FX_LPCWSTR)L"sup1", 185}, + {0xa7c20eea, (FX_LPCWSTR)L"sup2", 178}, + {0xa7c20eeb, (FX_LPCWSTR)L"sup3", 179}, + {0xa7c20f1d, (FX_LPCWSTR)L"supe", 8839}, + {0xa8b66aa1, (FX_LPCWSTR)L"Otilde", 213}, + {0xad958c42, (FX_LPCWSTR)L"AElig", 198}, + {0xaea9261d, (FX_LPCWSTR)L"Ouml", 214}, + {0xb040eafa, (FX_LPCWSTR)L"uArr", 8657}, + {0xb07c2e1c, (FX_LPCWSTR)L"beta", 946}, + {0xb220e92f, (FX_LPCWSTR)L"bull", 8226}, + {0xb22750c4, (FX_LPCWSTR)L"ccedil", 231}, + {0xb38ab31a, (FX_LPCWSTR)L"uarr", 8593}, + {0xb598b683, (FX_LPCWSTR)L"uuml", 252}, + {0xb6c58b21, (FX_LPCWSTR)L"Oacute", 211}, + {0xb6d2a617, (FX_LPCWSTR)L"oline", 8254}, + {0xba9fd989, (FX_LPCWSTR)L"dArr", 8659}, + {0xbb5ccd41, (FX_LPCWSTR)L"lgrave", 204}, + {0xbd39b44c, (FX_LPCWSTR)L"weierp", 8472}, + {0xbde9a1a9, (FX_LPCWSTR)L"darr", 8595}, + {0xc027e329, (FX_LPCWSTR)L"permil", 8240}, + {0xc2451389, (FX_LPCWSTR)L"upsih", 978}, + {0xc3af1ca4, (FX_LPCWSTR)L"Ccedil", 199}, + {0xcd164249, (FX_LPCWSTR)L"fnof", 402}, + {0xcf6c8467, (FX_LPCWSTR)L"hearts", 9829}, + {0xd1228390, (FX_LPCWSTR)L"trade", 8482}, + {0xd1462407, (FX_LPCWSTR)L"yuml", 255}, + {0xd2cf2253, (FX_LPCWSTR)L"oplus", 8853}, + {0xd310c1fc, (FX_LPCWSTR)L"Beta", 914}, + {0xd59c4d74, (FX_LPCWSTR)L"infin", 8734}, + {0xd64d470d, (FX_LPCWSTR)L"hArr", 8660}, + {0xd67d9c75, (FX_LPCWSTR)L"divide", 247}, + {0xd698dd37, (FX_LPCWSTR)L"Omicron", 927}, + {0xd82d4a63, (FX_LPCWSTR)L"Uuml", 220}, + {0xd9970f2d, (FX_LPCWSTR)L"harr", 8596}, + {0xda91fd99, (FX_LPCWSTR)L"clubs", 9827}, + {0xdbe5bdcc, (FX_LPCWSTR)L"there4", 8756}, + {0xdd7671bd, (FX_LPCWSTR)L"prime", 8242}, + {0xdfcf3c06, (FX_LPCWSTR)L"alpha", 945}, + {0xe0213063, (FX_LPCWSTR)L"saron", 353}, + {0xe1911d83, (FX_LPCWSTR)L"radic", 8730}, + {0xe2e75468, (FX_LPCWSTR)L"raquo", 187}, + {0xe6e27a5e, (FX_LPCWSTR)L"lacute", 205}, + {0xe74a8f36, (FX_LPCWSTR)L"ucirc", 251}, + {0xe864ecb6, (FX_LPCWSTR)L"Theta", 920}, + {0xecddde5e, (FX_LPCWSTR)L"nabla", 8711}, + {0xed1c3557, (FX_LPCWSTR)L"omicron", 959}, + {0xef82228f, (FX_LPCWSTR)L"rceil", 8969}, + {0xf1fab491, (FX_LPCWSTR)L"lArr", 8656}, + {0xf3dab7e7, (FX_LPCWSTR)L"Yuml", 376}, + {0xf4294962, (FX_LPCWSTR)L"laquo", 171}, + {0xf5446822, (FX_LPCWSTR)L"lang", 9001}, + {0xf5447cb1, (FX_LPCWSTR)L"larr", 8592}, + {0xf66e9bea, (FX_LPCWSTR)L"ugrave", 249}, + {0xf6b4ce70, (FX_LPCWSTR)L"lota", 921}, + {0xf6ef34ed, (FX_LPCWSTR)L"kappa", 954}, + {0xf72a3a56, (FX_LPCWSTR)L"thinsp", 8201}, + {0xf752801a, (FX_LPCWSTR)L"luml", 207}, + {0xf88c8430, (FX_LPCWSTR)L"ocirc", 244}, + {0xf9676178, (FX_LPCWSTR)L"frasl", 8260}, + {0xfd01885e, (FX_LPCWSTR)L"igrave", 236}, + {0xff3281da, (FX_LPCWSTR)L"egrave", 232}, +}; +static XFA_FMHtmlReserveCode reservesForEncode [] = { + {34, (FX_LPCWSTR)(L"quot")}, + {38, (FX_LPCWSTR)(L"amp")}, + {39, (FX_LPCWSTR)(L"apos")}, + {60, (FX_LPCWSTR)(L"lt")}, + {62, (FX_LPCWSTR)(L"gt")}, + {160, (FX_LPCWSTR)(L"nbsp")}, + {161, (FX_LPCWSTR)(L"iexcl")}, + {162, (FX_LPCWSTR)(L"cent")}, + {163, (FX_LPCWSTR)(L"pund")}, + {164, (FX_LPCWSTR)(L"current")}, + {165, (FX_LPCWSTR)(L"yen")}, + {166, (FX_LPCWSTR)(L"brvbar")}, + {167, (FX_LPCWSTR)(L"sect")}, + {168, (FX_LPCWSTR)(L"uml")}, + {169, (FX_LPCWSTR)(L"copy")}, + {170, (FX_LPCWSTR)(L"ordf")}, + {171, (FX_LPCWSTR)(L"laquo")}, + {172, (FX_LPCWSTR)(L"not")}, + {173, (FX_LPCWSTR)(L"shy")}, + {174, (FX_LPCWSTR)(L"reg")}, + {175, (FX_LPCWSTR)(L"macr")}, + {176, (FX_LPCWSTR)(L"deg")}, + {177, (FX_LPCWSTR)(L"plusmn")}, + {178, (FX_LPCWSTR)(L"sup2")}, + {179, (FX_LPCWSTR)(L"sup3")}, + {180, (FX_LPCWSTR)(L"acute")}, + {181, (FX_LPCWSTR)(L"micro")}, + {182, (FX_LPCWSTR)(L"para")}, + {183, (FX_LPCWSTR)(L"middot")}, + {184, (FX_LPCWSTR)(L"cedil")}, + {185, (FX_LPCWSTR)(L"sup1")}, + {186, (FX_LPCWSTR)(L"ordm")}, + {187, (FX_LPCWSTR)(L"raquo")}, + {188, (FX_LPCWSTR)(L"frac14")}, + {189, (FX_LPCWSTR)(L"frac12")}, + {190, (FX_LPCWSTR)(L"frac34")}, + {191, (FX_LPCWSTR)(L"iquest")}, + {192, (FX_LPCWSTR)(L"Agrave")}, + {193, (FX_LPCWSTR)(L"Aacute")}, + {194, (FX_LPCWSTR)(L"Acirc")}, + {195, (FX_LPCWSTR)(L"Atilde")}, + {196, (FX_LPCWSTR)(L"Auml")}, + {197, (FX_LPCWSTR)(L"Aring")}, + {198, (FX_LPCWSTR)(L"AElig")}, + {199, (FX_LPCWSTR)(L"Ccedil")}, + {200, (FX_LPCWSTR)(L"Egrave")}, + {201, (FX_LPCWSTR)(L"Eacute")}, + {202, (FX_LPCWSTR)(L"Ecirc")}, + {203, (FX_LPCWSTR)(L"Euml")}, + {204, (FX_LPCWSTR)(L"lgrave")}, + {205, (FX_LPCWSTR)(L"lacute")}, + {206, (FX_LPCWSTR)(L"lcirc")}, + {207, (FX_LPCWSTR)(L"luml")}, + {208, (FX_LPCWSTR)(L"ETH")}, + {209, (FX_LPCWSTR)(L"Ntilde")}, + {210, (FX_LPCWSTR)(L"Ograve")}, + {211, (FX_LPCWSTR)(L"Oacute")}, + {212, (FX_LPCWSTR)(L"Ocirc")}, + {213, (FX_LPCWSTR)(L"Otilde")}, + {214, (FX_LPCWSTR)(L"Ouml")}, + {215, (FX_LPCWSTR)(L"times")}, + {216, (FX_LPCWSTR)(L"Oslash")}, + {217, (FX_LPCWSTR)(L"Ugrave")}, + {218, (FX_LPCWSTR)(L"Uacute")}, + {219, (FX_LPCWSTR)(L"Ucirc")}, + {220, (FX_LPCWSTR)(L"Uuml")}, + {221, (FX_LPCWSTR)(L"Yacute")}, + {222, (FX_LPCWSTR)(L"THORN")}, + {223, (FX_LPCWSTR)(L"szlig")}, + {224, (FX_LPCWSTR)(L"agrave")}, + {225, (FX_LPCWSTR)(L"aacute")}, + {226, (FX_LPCWSTR)(L"acirc")}, + {227, (FX_LPCWSTR)(L"atilde")}, + {228, (FX_LPCWSTR)(L"auml")}, + {229, (FX_LPCWSTR)(L"aring")}, + {230, (FX_LPCWSTR)(L"aelig") }, + {231, (FX_LPCWSTR)(L"ccedil") }, + {232, (FX_LPCWSTR)(L"egrave") }, + {233, (FX_LPCWSTR)(L"eacute") }, + {234, (FX_LPCWSTR)(L"ecirc") }, + {235, (FX_LPCWSTR)(L"euml") }, + {236, (FX_LPCWSTR)(L"igrave") }, + {237, (FX_LPCWSTR)(L"iacute") }, + {238, (FX_LPCWSTR)(L"icirc") }, + {239, (FX_LPCWSTR)(L"iuml") }, + {240, (FX_LPCWSTR)(L"eth") }, + {241, (FX_LPCWSTR)(L"ntilde") }, + {242, (FX_LPCWSTR)(L"ograve") }, + {243, (FX_LPCWSTR)(L"oacute") }, + {244, (FX_LPCWSTR)(L"ocirc") }, + {245, (FX_LPCWSTR)(L"otilde") }, + {246, (FX_LPCWSTR)(L"ouml") }, + {247, (FX_LPCWSTR)(L"divide") }, + {248, (FX_LPCWSTR)(L"oslash") }, + {249, (FX_LPCWSTR)(L"ugrave") }, + {250, (FX_LPCWSTR)(L"uacute") }, + {251, (FX_LPCWSTR)(L"ucirc") }, + {252, (FX_LPCWSTR)(L"uuml") }, + {253, (FX_LPCWSTR)(L"yacute") }, + {254, (FX_LPCWSTR)(L"thorn") }, + {255, (FX_LPCWSTR)(L"yuml") }, + {338, (FX_LPCWSTR)(L"OElig") }, + {339, (FX_LPCWSTR)(L"oelig") }, + {352, (FX_LPCWSTR)(L"Scaron") }, + {353, (FX_LPCWSTR)(L"saron") }, + {376, (FX_LPCWSTR)(L"Yuml") }, + {402, (FX_LPCWSTR)(L"fnof") }, + {710, (FX_LPCWSTR)(L"circ") }, + {732, (FX_LPCWSTR)(L"tilde") }, + {913, (FX_LPCWSTR)(L"Alpha") }, + {914, (FX_LPCWSTR)(L"Beta") }, + {915, (FX_LPCWSTR)(L"Gamma") }, + {916, (FX_LPCWSTR)(L"Delta") }, + {917, (FX_LPCWSTR)(L"Epsilon") }, + {918, (FX_LPCWSTR)(L"Zeta") }, + {919, (FX_LPCWSTR)(L"Eta") }, + {920, (FX_LPCWSTR)(L"Theta") }, + {921, (FX_LPCWSTR)(L"lota") }, + {922, (FX_LPCWSTR)(L"Kappa") }, + {923, (FX_LPCWSTR)(L"Lambda") }, + {924, (FX_LPCWSTR)(L"Mu") }, + {925, (FX_LPCWSTR)(L"Nu") }, + {926, (FX_LPCWSTR)(L"Xi") }, + {927, (FX_LPCWSTR)(L"Omicron") }, + {928, (FX_LPCWSTR)(L"Pi") }, + {929, (FX_LPCWSTR)(L"Rho") }, + {931, (FX_LPCWSTR)(L"Sigma") }, + {932, (FX_LPCWSTR)(L"Tau") }, + {933, (FX_LPCWSTR)(L"Upsilon") }, + {934, (FX_LPCWSTR)(L"Phi") }, + {935, (FX_LPCWSTR)(L"Chi") }, + {936, (FX_LPCWSTR)(L"Psi") }, + {937, (FX_LPCWSTR)(L"Omega") }, + {945, (FX_LPCWSTR)(L"alpha") }, + {946, (FX_LPCWSTR)(L"beta") }, + {947, (FX_LPCWSTR)(L"gamma") }, + {948, (FX_LPCWSTR)(L"delta") }, + {949, (FX_LPCWSTR)(L"epsilon") }, + {950, (FX_LPCWSTR)(L"zeta") }, + {951, (FX_LPCWSTR)(L"eta") }, + {952, (FX_LPCWSTR)(L"theta") }, + {953, (FX_LPCWSTR)(L"iota") }, + {954, (FX_LPCWSTR)(L"kappa") }, + {955, (FX_LPCWSTR)(L"lambda") }, + {956, (FX_LPCWSTR)(L"mu") }, + {957, (FX_LPCWSTR)(L"nu") }, + {958, (FX_LPCWSTR)(L"xi") }, + {959, (FX_LPCWSTR)(L"omicron") }, + {960, (FX_LPCWSTR)(L"pi") }, + {961, (FX_LPCWSTR)(L"rho") }, + {962, (FX_LPCWSTR)(L"sigmaf") }, + {963, (FX_LPCWSTR)(L"sigma") }, + {964, (FX_LPCWSTR)(L"tau") }, + {965, (FX_LPCWSTR)(L"upsilon") }, + {966, (FX_LPCWSTR)(L"phi") }, + {967, (FX_LPCWSTR)(L"chi") }, + {968, (FX_LPCWSTR)(L"psi") }, + {969, (FX_LPCWSTR)(L"omega") }, + {977, (FX_LPCWSTR)(L"thetasym") }, + {978, (FX_LPCWSTR)(L"upsih") }, + {982, (FX_LPCWSTR)(L"piv") }, + {8194, (FX_LPCWSTR)(L"ensp") }, + {8195, (FX_LPCWSTR)(L"emsp") }, + {8201, (FX_LPCWSTR)(L"thinsp") }, + {8204, (FX_LPCWSTR)(L"zwnj") }, + {8205, (FX_LPCWSTR)(L"zwj") }, + {8206, (FX_LPCWSTR)(L"lrm") }, + {8207, (FX_LPCWSTR)(L"rlm") }, + {8211, (FX_LPCWSTR)(L"ndash") }, + {8212, (FX_LPCWSTR)(L"mdash") }, + {8216, (FX_LPCWSTR)(L"lsquo") }, + {8217, (FX_LPCWSTR)(L"rsquo") }, + {8218, (FX_LPCWSTR)(L"sbquo") }, + {8220, (FX_LPCWSTR)(L"ldquo") }, + {8221, (FX_LPCWSTR)(L"tdquo") }, + {8222, (FX_LPCWSTR)(L"bdquo") }, + {8224, (FX_LPCWSTR)(L"dagger") }, + {8225, (FX_LPCWSTR)(L"Dagger") }, + {8226, (FX_LPCWSTR)(L"bull") }, + {8230, (FX_LPCWSTR)(L"hellip") }, + {8240, (FX_LPCWSTR)(L"permil") }, + {8242, (FX_LPCWSTR)(L"prime") }, + {8249, (FX_LPCWSTR)(L"lsaquo") }, + {8250, (FX_LPCWSTR)(L"rsaquo") }, + {8254, (FX_LPCWSTR)(L"oline") }, + {8260, (FX_LPCWSTR)(L"frasl") }, + {8364, (FX_LPCWSTR)(L"euro") }, + {8465, (FX_LPCWSTR)(L"image") }, + {8472, (FX_LPCWSTR)(L"weierp") }, + {8476, (FX_LPCWSTR)(L"real") }, + {8482, (FX_LPCWSTR)(L"trade") }, + {8501, (FX_LPCWSTR)(L"alefsym") }, + {8592, (FX_LPCWSTR)(L"larr") }, + {8593, (FX_LPCWSTR)(L"uarr") }, + {8594, (FX_LPCWSTR)(L"rarr") }, + {8595, (FX_LPCWSTR)(L"darr") }, + {8596, (FX_LPCWSTR)(L"harr") }, + {8629, (FX_LPCWSTR)(L"crarr") }, + {8656, (FX_LPCWSTR)(L"lArr") }, + {8657, (FX_LPCWSTR)(L"uArr") }, + {8658, (FX_LPCWSTR)(L"rArr") }, + {8659, (FX_LPCWSTR)(L"dArr") }, + {8660, (FX_LPCWSTR)(L"hArr") }, + {8704, (FX_LPCWSTR)(L"forall") }, + {8706, (FX_LPCWSTR)(L"part") }, + {8707, (FX_LPCWSTR)(L"exist") }, + {8709, (FX_LPCWSTR)(L"empty") }, + {8711, (FX_LPCWSTR)(L"nabla") }, + {8712, (FX_LPCWSTR)(L"isin") }, + {8713, (FX_LPCWSTR)(L"notin") }, + {8715, (FX_LPCWSTR)(L"ni") }, + {8719, (FX_LPCWSTR)(L"prod") }, + {8721, (FX_LPCWSTR)(L"sum") }, + {8722, (FX_LPCWSTR)(L"minus") }, + {8727, (FX_LPCWSTR)(L"lowast") }, + {8730, (FX_LPCWSTR)(L"radic") }, + {8733, (FX_LPCWSTR)(L"prop") }, + {8734, (FX_LPCWSTR)(L"infin") }, + {8736, (FX_LPCWSTR)(L"ang") }, + {8743, (FX_LPCWSTR)(L"and") }, + {8744, (FX_LPCWSTR)(L"or") }, + {8745, (FX_LPCWSTR)(L"cap") }, + {8746, (FX_LPCWSTR)(L"cup") }, + {8747, (FX_LPCWSTR)(L"int") }, + {8756, (FX_LPCWSTR)(L"there4") }, + {8764, (FX_LPCWSTR)(L"sim") }, + {8773, (FX_LPCWSTR)(L"cong") }, + {8776, (FX_LPCWSTR)(L"asymp") }, + {8800, (FX_LPCWSTR)(L"ne") }, + {8801, (FX_LPCWSTR)(L"equiv") }, + {8804, (FX_LPCWSTR)(L"le") }, + {8805, (FX_LPCWSTR)(L"ge") }, + {8834, (FX_LPCWSTR)(L"sub") }, + {8835, (FX_LPCWSTR)(L"sup") }, + {8836, (FX_LPCWSTR)(L"nsub") }, + {8838, (FX_LPCWSTR)(L"sube") }, + {8839, (FX_LPCWSTR)(L"supe") }, + {8853, (FX_LPCWSTR)(L"oplus") }, + {8855, (FX_LPCWSTR)(L"otimes") }, + {8869, (FX_LPCWSTR)(L"perp") }, + {8901, (FX_LPCWSTR)(L"sdot") }, + {8968, (FX_LPCWSTR)(L"lceil") }, + {8969, (FX_LPCWSTR)(L"rceil") }, + {8970, (FX_LPCWSTR)(L"lfloor") }, + {8971, (FX_LPCWSTR)(L"rfloor") }, + {9001, (FX_LPCWSTR)(L"lang") }, + {9002, (FX_LPCWSTR)(L"rang") }, + {9674, (FX_LPCWSTR)(L"loz") }, + {9824, (FX_LPCWSTR)(L"spades") }, + {9827, (FX_LPCWSTR)(L"clubs") }, + {9829, (FX_LPCWSTR)(L"hearts") }, + {9830, (FX_LPCWSTR)(L"diams") }, +}; +void CXFA_FM2JSContext::Abs(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + if(args.GetLength() == 1) { + FXJSE_HVALUE argOne = args.GetValue(0); + if(HValueIsNull(hThis, argOne)) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + FX_DOUBLE dValue = HValueToDouble(hThis, argOne); + if(dValue < 0) { + dValue = -dValue; + } + FXJSE_Value_SetDouble(args.GetReturnValue(), dValue); + } + FXJSE_Value_Release(argOne); + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Abs")); + } +} +void CXFA_FM2JSContext::Avg(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + FX_INT32 argc = args.GetLength(); + FX_UINT32 uCount = 0; + FX_DOUBLE dSum = 0.0; + if(argc >= 1) { + FXJSE_HVALUE argValue = 0; + for(FX_INT32 i = 0; i < argc; i++) { + argValue = args.GetValue(i); + if(FXJSE_Value_IsNull(argValue)) { + FXJSE_Value_Release(argValue); + continue; + } else if(FXJSE_Value_IsArray(argValue)) { + FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectProp(argValue, FX_BSTRC("length"), lengthValue); + FX_INT32 iLength = FXJSE_Value_ToInteger(lengthValue); + FXJSE_Value_Release(lengthValue); + if(iLength > 2) { + FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectPropByIdx(argValue, 1, propertyValue); + FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime); + if(FXJSE_Value_IsNull(propertyValue)) { + for(FX_INT32 j = 2; j < iLength; j++) { + FXJSE_Value_GetObjectPropByIdx(argValue, j, jsObjectValue); + FXJSE_HVALUE defaultPropValue = FXJSE_Value_Create(hruntime); + GetObjectDefaultValue(jsObjectValue, defaultPropValue); + if (!FXJSE_Value_IsNull(defaultPropValue)) { + dSum += HValueToDouble(hThis, defaultPropValue); + uCount++; + } + FXJSE_Value_Release(defaultPropValue); + } + } else { + CFX_ByteString propertyStr; + FXJSE_Value_ToUTF8String(propertyValue, propertyStr); + FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime); + for(FX_INT32 j = 2; j < iLength; j++) { + FXJSE_Value_GetObjectPropByIdx(argValue, j, jsObjectValue); + FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, newPropertyValue); + if (!FXJSE_Value_IsNull(newPropertyValue)) { + dSum += HValueToDouble(hThis, newPropertyValue); + uCount++; + } + } + FXJSE_Value_Release(newPropertyValue); + } + FXJSE_Value_Release(jsObjectValue); + FXJSE_Value_Release(propertyValue); + } + } else { + dSum += HValueToDouble(hThis, argValue); + uCount++; + } + FXJSE_Value_Release(argValue); + } + argValue = 0; + } + if(0 == uCount) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + FXJSE_Value_SetDouble(args.GetReturnValue(), dSum / uCount); + } +} +void CXFA_FM2JSContext::Ceil(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + if(args.GetLength() == 1) { + FXJSE_HVALUE argValue = GetSimpleHValue(hThis, args, 0); + if (HValueIsNull(hThis, argValue)) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + FXJSE_Value_SetFloat(args.GetReturnValue(), FXSYS_ceil(HValueToFloat(hThis, argValue))); + } + FXJSE_Value_Release(argValue); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Ceil")); + } +} +void CXFA_FM2JSContext::Count(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + FX_INT32 argc = args.GetLength(); + FX_UINT32 uCount = 0; + FXJSE_HVALUE argValue = 0; + for(FX_INT32 i = 0; i < argc; i++) { + argValue = args.GetValue(i); + if(FXJSE_Value_IsNull(argValue)) { + FXJSE_Value_Release(argValue); + continue; + } else if(FXJSE_Value_IsArray(argValue)) { + FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectProp(argValue, FX_BSTRC("length"), lengthValue); + FX_INT32 iLength = FXJSE_Value_ToInteger(lengthValue); + FXJSE_Value_Release(lengthValue); + if(iLength > 2) { + FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); + FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime); + FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectPropByIdx(argValue, 1, propertyValue); + FXJSE_Value_GetObjectPropByIdx(argValue, 2, jsObjectValue); + if(FXJSE_Value_IsNull(propertyValue)) { + for(FX_INT32 i = 2; i < iLength; i++) { + FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue); + GetObjectDefaultValue(jsObjectValue, newPropertyValue); + if (!FXJSE_Value_IsNull(newPropertyValue)) { + uCount++; + } + } + } else { + CFX_ByteString propertyStr; + FXJSE_Value_ToUTF8String(propertyValue, propertyStr); + for(FX_INT32 i = 2; i < iLength; i++) { + FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue); + FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, newPropertyValue); + uCount += (FXJSE_Value_IsNull(newPropertyValue) ? 0 : 1); + } + } + FXJSE_Value_Release(propertyValue); + FXJSE_Value_Release(jsObjectValue); + FXJSE_Value_Release(newPropertyValue); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); + } + } else if(FXJSE_Value_IsObject(argValue)) { + FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime); + GetObjectDefaultValue(argValue, newPropertyValue); + if (!FXJSE_Value_IsNull(newPropertyValue)) { + uCount++; + } + FXJSE_Value_Release(newPropertyValue); + } else { + uCount++; + } + FXJSE_Value_Release(argValue); + } + argValue = 0; + FXJSE_Value_SetInteger(args.GetReturnValue(), (FX_INT32)uCount); +} +void CXFA_FM2JSContext::Floor(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + if(args.GetLength() == 1) { + FXJSE_HVALUE argValue = GetSimpleHValue(hThis, args, 0); + if (HValueIsNull(hThis, argValue)) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + FXJSE_Value_SetFloat(args.GetReturnValue(), FXSYS_floor(HValueToFloat(hThis, argValue))); + } + FXJSE_Value_Release(argValue); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Floor")); + } +} +void CXFA_FM2JSContext::Max(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + FX_INT32 argc = args.GetLength(); + FX_UINT32 uCount = 0; + FX_DOUBLE dMaxValue = 0.0; + FXJSE_HVALUE argValue = 0; + for(FX_INT32 i = 0; i < argc; i++) { + argValue = args.GetValue(i); + if(FXJSE_Value_IsNull(argValue)) { + FXJSE_Value_Release(argValue); + continue; + } else if(FXJSE_Value_IsArray(argValue)) { + FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectProp(argValue, FX_BSTRC("length"), lengthValue); + FX_INT32 iLength = FXJSE_Value_ToInteger(lengthValue); + FXJSE_Value_Release(lengthValue); + if(iLength > 2) { + FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); + FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime); + FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectPropByIdx(argValue, 1, propertyValue); + FXJSE_Value_GetObjectPropByIdx(argValue, 2, jsObjectValue); + if(FXJSE_Value_IsNull(propertyValue)) { + for(FX_INT32 i = 2; i < iLength; i++) { + FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue); + GetObjectDefaultValue(jsObjectValue, newPropertyValue); + if(!FXJSE_Value_IsNull(newPropertyValue)) { + uCount++; + if(uCount == 1) { + dMaxValue = HValueToDouble(hThis, newPropertyValue); + } else { + FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue); + if(dMaxValue < dValue) { + dMaxValue = dValue; + } + } + } + } + } else { + CFX_ByteString propertyStr; + FXJSE_Value_ToUTF8String(propertyValue, propertyStr); + for(FX_INT32 i = 2; i < iLength; i++) { + FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue); + FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, newPropertyValue); + if(!FXJSE_Value_IsNull(newPropertyValue)) { + uCount++; + if(uCount == 1) { + dMaxValue = HValueToDouble(hThis, newPropertyValue); + } else { + FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue); + if(dMaxValue < dValue) { + dMaxValue = dValue; + } + } + } + } + } + FXJSE_Value_Release(propertyValue); + FXJSE_Value_Release(jsObjectValue); + FXJSE_Value_Release(newPropertyValue); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); + } + } else if(FXJSE_Value_IsObject(argValue)) { + FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime); + GetObjectDefaultValue(argValue, newPropertyValue); + if(!FXJSE_Value_IsNull(newPropertyValue)) { + uCount++; + if(uCount == 1) { + dMaxValue = HValueToDouble(hThis, newPropertyValue); + } else { + FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue); + if(dMaxValue < dValue) { + dMaxValue = dValue; + } + } + } + FXJSE_Value_Release(newPropertyValue); + } else { + uCount++; + if(uCount == 1) { + dMaxValue = HValueToDouble(hThis, argValue); + } else { + FX_DOUBLE dValue = HValueToDouble(hThis, argValue); + if(dMaxValue < dValue) { + dMaxValue = dValue; + } + } + } + FXJSE_Value_Release(argValue); + } + argValue = 0; + if(uCount) { + FXJSE_Value_SetDouble(args.GetReturnValue(), dMaxValue); + } else { + FXJSE_Value_SetNull(args.GetReturnValue()); + } +} +void CXFA_FM2JSContext::Min(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + FX_INT32 argc = args.GetLength(); + FX_UINT32 uCount = 0; + FX_DOUBLE dMinValue = 0.0; + FXJSE_HVALUE argValue = 0; + for(FX_INT32 i = 0; i < argc; i++) { + argValue = args.GetValue(i); + if(FXJSE_Value_IsNull(argValue)) { + FXJSE_Value_Release(argValue); + continue; + } else if(FXJSE_Value_IsArray(argValue)) { + FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectProp(argValue, FX_BSTRC("length"), lengthValue); + FX_INT32 iLength = FXJSE_Value_ToInteger(lengthValue); + FXJSE_Value_Release(lengthValue); + if(iLength > 2) { + FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); + FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime); + FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectPropByIdx(argValue, 1, propertyValue); + FXJSE_Value_GetObjectPropByIdx(argValue, 2, jsObjectValue); + if(FXJSE_Value_IsNull(propertyValue)) { + for(FX_INT32 i = 2; i < iLength; i++) { + FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue); + GetObjectDefaultValue(jsObjectValue, newPropertyValue); + if(!FXJSE_Value_IsNull(newPropertyValue)) { + uCount++; + if(uCount == 1) { + dMinValue = HValueToDouble(hThis, newPropertyValue); + } else { + FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue); + if(dMinValue > dValue) { + dMinValue = dValue; + } + } + } + } + } else { + CFX_ByteString propertyStr; + FXJSE_Value_ToUTF8String(propertyValue, propertyStr); + for(FX_INT32 i = 2; i < iLength; i++) { + FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue); + FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, newPropertyValue); + if(!FXJSE_Value_IsNull(newPropertyValue)) { + uCount++; + if(uCount == 1) { + dMinValue = HValueToDouble(hThis, newPropertyValue); + } else { + FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue); + if(dMinValue > dValue) { + dMinValue = dValue; + } + } + } + } + } + FXJSE_Value_Release(propertyValue); + FXJSE_Value_Release(jsObjectValue); + FXJSE_Value_Release(newPropertyValue); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); + } + } else if(FXJSE_Value_IsObject(argValue)) { + FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime); + GetObjectDefaultValue(argValue, newPropertyValue); + if(!FXJSE_Value_IsNull(newPropertyValue)) { + uCount++; + if(uCount == 1) { + dMinValue = HValueToDouble(hThis, newPropertyValue); + } else { + FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue); + if(dMinValue > dValue) { + dMinValue = dValue; + } + } + } + FXJSE_Value_Release(newPropertyValue); + } else { + uCount++; + if(uCount == 1) { + dMinValue = HValueToDouble(hThis, argValue); + } else { + FX_DOUBLE dValue = HValueToDouble(hThis, argValue); + if(dMinValue > dValue) { + dMinValue = dValue; + } + } + } + FXJSE_Value_Release(argValue); + } + argValue = 0; + if(uCount) { + FXJSE_Value_SetDouble(args.GetReturnValue(), dMinValue); + } else { + FXJSE_Value_SetNull(args.GetReturnValue()); + } +} +void CXFA_FM2JSContext::Mod(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + if(args.GetLength() == 2) { + FXJSE_HVALUE argOne = args.GetValue(0); + FXJSE_HVALUE argTwo = args.GetValue(1); + if(FXJSE_Value_IsNull(argOne) || FXJSE_Value_IsNull(argTwo)) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + FX_DOUBLE dDividend = 0.0; + FX_DOUBLE dDividor = 0.0; + if(FXJSE_Value_IsArray(argOne)) { + FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectProp(argOne, FX_BSTRC("length"), lengthValue); + FX_INT32 iLength = FXJSE_Value_ToInteger(lengthValue); + FXJSE_Value_Release(lengthValue); + if(iLength > 2) { + FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); + FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectPropByIdx(argOne, 1, propertyValue); + FXJSE_Value_GetObjectPropByIdx(argOne, 2, jsObjectValue); + if(FXJSE_Value_IsNull(propertyValue)) { + dDividend = HValueToDouble(hThis, jsObjectValue); + } else { + CFX_ByteString propertyStr; + FXJSE_Value_ToUTF8String(propertyValue, propertyStr); + FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, newPropertyValue); + dDividend = HValueToDouble(hThis, newPropertyValue); + FXJSE_Value_Release(newPropertyValue); + } + FXJSE_Value_Release(propertyValue); + FXJSE_Value_Release(jsObjectValue); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); + } + } else { + dDividend = HValueToDouble(hThis, argOne); + } + if(FXJSE_Value_IsArray(argTwo)) { + FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectProp(argTwo, FX_BSTRC("length"), lengthValue); + FX_INT32 iLength = FXJSE_Value_ToInteger(lengthValue); + FXJSE_Value_Release(lengthValue); + if(iLength > 2) { + FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); + FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectPropByIdx(argTwo, 1, propertyValue); + FXJSE_Value_GetObjectPropByIdx(argTwo, 2, jsObjectValue); + if(FXJSE_Value_IsNull(propertyValue)) { + dDividor = HValueToDouble(hThis, jsObjectValue); + } else { + CFX_ByteString propertyStr; + FXJSE_Value_ToUTF8String(propertyValue, propertyStr); + FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, newPropertyValue); + dDividor = HValueToDouble(hThis, newPropertyValue); + FXJSE_Value_Release(newPropertyValue); + } + FXJSE_Value_Release(propertyValue); + FXJSE_Value_Release(jsObjectValue); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); + } + } else { + dDividor = HValueToDouble(hThis, argTwo); + } + if(dDividor) { + FXJSE_Value_SetDouble(args.GetReturnValue(), dDividend - dDividor * (FX_INT32)(dDividend / dDividor)); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_DIVIDE_ZERO); + } + } + FXJSE_Value_Release(argOne); + FXJSE_Value_Release(argTwo); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Mod")); + } +} +void CXFA_FM2JSContext::Round(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + FX_INT32 argc = args.GetLength(); + FX_UINT8 uPrecision = 0; + if(argc == 1) { + FXJSE_HVALUE argOne = args.GetValue(0); + if(FXJSE_Value_IsNull(argOne)) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + FX_DOUBLE dValue = 0.0; + if(FXJSE_Value_IsArray(argOne)) { + FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); + FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectPropByIdx(argOne, 1, propertyValue); + FXJSE_Value_GetObjectPropByIdx(argOne, 2, jsObjectValue); + if(FXJSE_Value_IsNull(propertyValue)) { + dValue = HValueToDouble(hThis, jsObjectValue); + } else { + CFX_ByteString propertyStr; + FXJSE_Value_ToUTF8String(propertyValue, propertyStr); + FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, newPropertyValue); + dValue = HValueToDouble(hThis, newPropertyValue); + FXJSE_Value_Release(newPropertyValue); + } + FXJSE_Value_Release(propertyValue); + FXJSE_Value_Release(jsObjectValue); + } else { + dValue = HValueToDouble(hThis, argOne); + } + CFX_Decimal decimalValue((FX_FLOAT)dValue, uPrecision); + CFX_WideString wsValue = decimalValue; + FXJSE_Value_SetUTF8String(args.GetReturnValue(), wsValue.UTF8Encode()); + } + FXJSE_Value_Release(argOne); + } else if(argc == 2) { + FXJSE_HVALUE argOne = args.GetValue(0); + FXJSE_HVALUE argTwo = args.GetValue(1); + if(FXJSE_Value_IsNull(argOne) || FXJSE_Value_IsNull(argTwo)) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + FX_DOUBLE dValue = 0.0; + if(FXJSE_Value_IsArray(argOne)) { + FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); + FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectPropByIdx(argOne, 1, propertyValue); + FXJSE_Value_GetObjectPropByIdx(argOne, 2, jsObjectValue); + if(FXJSE_Value_IsNull(propertyValue)) { + dValue = HValueToDouble(hThis, jsObjectValue); + } else { + CFX_ByteString propertyStr; + FXJSE_Value_ToUTF8String(propertyValue, propertyStr); + FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, newPropertyValue); + dValue = HValueToDouble(hThis, newPropertyValue); + FXJSE_Value_Release(newPropertyValue); + } + FXJSE_Value_Release(propertyValue); + FXJSE_Value_Release(jsObjectValue); + } else { + dValue = HValueToDouble(hThis, argOne); + } + FX_DOUBLE dPrecision = 0.0; + if(FXJSE_Value_IsArray(argTwo)) { + FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); + FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectPropByIdx(argTwo, 1, propertyValue); + FXJSE_Value_GetObjectPropByIdx(argTwo, 2, jsObjectValue); + if(FXJSE_Value_IsNull(propertyValue)) { + dPrecision = HValueToDouble(hThis, jsObjectValue); + } else { + CFX_ByteString propertyStr; + FXJSE_Value_ToUTF8String(propertyValue, propertyStr); + FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, newPropertyValue); + dPrecision = HValueToDouble(hThis, newPropertyValue); + FXJSE_Value_Release(newPropertyValue); + } + FXJSE_Value_Release(propertyValue); + FXJSE_Value_Release(jsObjectValue); + } else { + dPrecision = HValueToDouble(hThis, argTwo); + } + if(dPrecision < 0) { + uPrecision = 0; + } else if(dPrecision > 12.0) { + uPrecision = 12; + } else { + uPrecision = (FX_UINT8)dPrecision; + } + CFX_Decimal decimalValue((FX_FLOAT)dValue, uPrecision); + CFX_WideString wsValue = decimalValue; + FXJSE_Value_SetUTF8String(args.GetReturnValue(), wsValue.UTF8Encode()); + } + FXJSE_Value_Release(argOne); + FXJSE_Value_Release(argTwo); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Round")); + } +} +void CXFA_FM2JSContext::Sum(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + FX_INT32 argc = args.GetLength(); + FX_UINT32 uCount = 0; + FX_DOUBLE dSum = 0.0; + if(argc) { + FXJSE_HVALUE argValue = 0; + for(FX_INT32 i = 0; i < argc; i++) { + argValue = args.GetValue(i); + if(FXJSE_Value_IsNull(argValue)) { + FXJSE_Value_Release(argValue); + continue; + } else if(FXJSE_Value_IsArray(argValue)) { + FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectProp(argValue, FX_BSTRC("length"), lengthValue); + FX_INT32 iLength = FXJSE_Value_ToInteger(lengthValue); + FXJSE_Value_Release(lengthValue); + if(iLength > 2) { + FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectPropByIdx(argValue, 1, propertyValue); + FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime); + FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime); + if(FXJSE_Value_IsNull(propertyValue)) { + for(FX_INT32 j = 2; j < iLength; j++) { + FXJSE_Value_GetObjectPropByIdx(argValue, j, jsObjectValue); + GetObjectDefaultValue(jsObjectValue, newPropertyValue); + if (!FXJSE_Value_IsNull(newPropertyValue)) { + dSum += HValueToDouble(hThis, jsObjectValue); + uCount++; + } + } + } else { + CFX_ByteString propertyStr; + FXJSE_Value_ToUTF8String(propertyValue, propertyStr); + for(FX_INT32 j = 2; j < iLength; j++) { + FXJSE_Value_GetObjectPropByIdx(argValue, j, jsObjectValue); + FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, newPropertyValue); + if (!FXJSE_Value_IsNull(newPropertyValue)) { + dSum += HValueToDouble(hThis, newPropertyValue); + uCount++; + } + } + } + FXJSE_Value_Release(newPropertyValue); + FXJSE_Value_Release(jsObjectValue); + FXJSE_Value_Release(propertyValue); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); + } + } else if (FXJSE_Value_IsObject(argValue)) { + FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime); + GetObjectDefaultValue(argValue, newPropertyValue); + if (!FXJSE_Value_IsNull(newPropertyValue)) { + dSum += HValueToDouble(hThis, argValue); + uCount++; + } + FXJSE_Value_Release(newPropertyValue); + } else { + dSum += HValueToDouble(hThis, argValue); + uCount++; + } + FXJSE_Value_Release(argValue); + } + argValue = 0; + } + if(uCount < 1) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + FXJSE_Value_SetDouble(args.GetReturnValue(), dSum); + } +} +void CXFA_FM2JSContext::Date(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + if (args.GetLength() == 0) { + struct tm *pTmStruct = 0; + time_t currentTime; + time(¤tTime); + pTmStruct = gmtime(¤tTime); + CFX_ByteString bufferYear; + CFX_ByteString bufferMon; + CFX_ByteString bufferDay; + bufferYear.Format("%d", pTmStruct->tm_year + 1900); + bufferMon.Format("%02d", pTmStruct->tm_mon + 1); + bufferDay.Format("%02d", pTmStruct->tm_mday); + CFX_ByteString bufferCurrent = bufferYear + bufferMon + bufferDay; + FX_INT32 dDays = DateString2Num(bufferCurrent); + FXJSE_Value_SetInteger(args.GetReturnValue(), dDays); + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Date")); + } +} +void CXFA_FM2JSContext::Date2Num(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + FX_INT32 argc = args.GetLength(); + if ((argc > 0) && (argc < 4)) { + FX_BOOL bFlags = FALSE; + CFX_ByteString dateString; + CFX_ByteString formatString; + CFX_ByteString localString; + FXJSE_HVALUE dateValue = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE formatValue = 0; + FXJSE_HVALUE localValue = 0; + if(HValueIsNull(hThis, dateValue)) { + bFlags = TRUE; + } else { + HValueToUTF8String(dateValue, dateString); + } + if(argc > 1) { + formatValue = GetSimpleHValue(hThis, args, 1); + if (HValueIsNull(hThis, formatValue)) { + bFlags = TRUE; + } else { + HValueToUTF8String(formatValue, formatString); + } + } + if (argc == 3) { + localValue = GetSimpleHValue(hThis, args, 2); + if (HValueIsNull(hThis, localValue)) { + bFlags = TRUE; + } else { + HValueToUTF8String(localValue, localString); + } + } + if (!bFlags) { + CFX_ByteString szIsoDateString; + FX_BOOL bRet = Local2IsoDate(hThis, dateString, formatString, localString, szIsoDateString); + if (bRet) { + FXJSE_Value_SetInteger(args.GetReturnValue(), DateString2Num(szIsoDateString)); + } else { + FXJSE_Value_SetInteger(args.GetReturnValue(), 0); + } + } else { + FXJSE_Value_SetNull(args.GetReturnValue()); + } + FXJSE_Value_Release(dateValue); + if (argc > 1) { + FXJSE_Value_Release(formatValue); + if (argc == 3) { + FXJSE_Value_Release(localValue); + } + } + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Date2Num")); + } +} +void CXFA_FM2JSContext::DateFmt(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + FX_INT32 argc = args.GetLength(); + if (argc < 3) { + FX_BOOL bFlags = FALSE; + FX_INT32 iStyle = 0; + CFX_ByteString szLocal; + FXJSE_HVALUE argStyle = 0; + FXJSE_HVALUE argLocal = 0; + if (argc > 0) { + argStyle = GetSimpleHValue(hThis, args, 0); + if (FXJSE_Value_IsNull(argStyle)) { + bFlags = TRUE; + } + iStyle = (FX_INT32)HValueToFloat(hThis, argStyle); + if (iStyle > 4 || iStyle < 0) { + iStyle = 0; + } + } + if (argc == 2) { + argLocal = GetSimpleHValue(hThis, args, 1); + if (FXJSE_Value_IsNull(argLocal)) { + bFlags = TRUE; + } else { + HValueToUTF8String(argLocal, szLocal); + } + } + if (!bFlags) { + CFX_ByteString formatStr; + GetStandardDateFormat(hThis, iStyle, szLocal, formatStr); + if (formatStr.IsEmpty()) { + formatStr = FX_BSTRC(""); + } + FXJSE_Value_SetUTF8String(args.GetReturnValue(), formatStr); + } else { + FXJSE_Value_SetNull(args.GetReturnValue()); + } + if (argc > 0) { + FXJSE_Value_Release(argStyle); + if (argc == 2) { + FXJSE_Value_Release(argLocal); + } + } + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Date2Num")); + } +} +void CXFA_FM2JSContext::IsoDate2Num(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + if(args.GetLength() == 1) { + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + if(FXJSE_Value_IsNull(argOne)) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + CFX_ByteString szArgString; + HValueToUTF8String(argOne, szArgString); + FX_INT32 dDays = DateString2Num(szArgString); + FXJSE_Value_SetInteger(args.GetReturnValue(), (FX_INT32)dDays); + } + FXJSE_Value_Release(argOne); + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"IsoDate2Num")); + } +} +void CXFA_FM2JSContext::IsoTime2Num(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + if(args.GetLength() == 1) { + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + if(HValueIsNull(hThis, argOne)) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + CXFA_Document *pDoc = pContext->GetDocument(); + FXSYS_assert(pDoc); + IFX_LocaleMgr *pMgr = (IFX_LocaleMgr *)pDoc->GetLocalMgr(); + CFX_ByteString szArgString; + HValueToUTF8String(argOne, szArgString); + szArgString = szArgString.Mid(szArgString.Find('T', 0) + 1); + if (szArgString.IsEmpty()) { + FXJSE_Value_SetInteger(args.GetReturnValue(), 0); + FXJSE_Value_Release(argOne); + return; + } + CXFA_LocaleValue timeValue(XFA_VT_TIME, CFX_WideString::FromUTF8(szArgString, szArgString.GetLength()), (CXFA_LocaleMgr*)pMgr); + if (timeValue.IsValid()) { + CFX_Unitime uniTime = timeValue.GetTime(); + FX_INT32 hour = uniTime.GetHour(); + FX_INT32 min = uniTime.GetMinute(); + FX_INT32 second = uniTime.GetSecond(); + FX_INT32 milSecond = uniTime.GetMillisecond(); + IFX_Locale* pDefLocale = pMgr->GetDefLocale(); + FXSYS_assert(pDefLocale); + FX_TIMEZONE tzLocale; + pDefLocale->GetTimeZone(tzLocale); + FX_INT32 mins = hour * 60 + min; + mins -= (tzLocale.tzHour * 60); + while (mins > 1440) { + mins -= 1440; + } + while (mins < 0) { + mins += 1440; + } + hour = mins / 60; + min = mins % 60; + FX_INT32 iResult = hour * 3600000 + min * 60000 + second * 1000 + milSecond + 1; + FXJSE_Value_SetInteger(args.GetReturnValue(), iResult); + } else { + FXJSE_Value_SetInteger(args.GetReturnValue(), 0); + } + } + FXJSE_Value_Release(argOne); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"IsoTime2Num")); + } +} +void CXFA_FM2JSContext::LocalDateFmt(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + FX_INT32 argc = args.GetLength(); + if (argc < 3) { + FX_BOOL bFlags = FALSE; + FX_INT32 iStyle = 0; + CFX_ByteString szLocal; + FXJSE_HVALUE argStyle = 0; + FXJSE_HVALUE argLocal = 0; + if (argc > 0) { + argStyle = GetSimpleHValue(hThis, args, 0); + if (FXJSE_Value_IsNull(argStyle)) { + bFlags = TRUE; + } + iStyle = (FX_INT32)HValueToFloat(hThis, argStyle); + if (iStyle > 4 || iStyle < 0) { + iStyle = 0; + } + } + if (argc == 2) { + argLocal = GetSimpleHValue(hThis, args, 1); + if (FXJSE_Value_IsNull(argLocal)) { + bFlags = TRUE; + } else { + HValueToUTF8String(argLocal, szLocal); + } + } + if (!bFlags) { + CFX_ByteString formatStr; + GetLocalDateFormat(hThis, iStyle, szLocal, formatStr, FALSE); + if (formatStr.IsEmpty()) { + formatStr = FX_BSTRC(""); + } + FXJSE_Value_SetUTF8String(args.GetReturnValue(), formatStr); + } else { + FXJSE_Value_SetNull(args.GetReturnValue()); + } + if (argc > 0) { + FXJSE_Value_Release(argStyle); + if (argc == 2) { + FXJSE_Value_Release(argLocal); + } + } + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"LocalDateFmt")); + } +} +void CXFA_FM2JSContext::LocalTimeFmt(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + FX_INT32 argc = args.GetLength(); + if (argc < 3) { + FX_BOOL bFlags = FALSE; + FX_INT32 iStyle = 0; + CFX_ByteString szLocal; + FXJSE_HVALUE argStyle = 0; + FXJSE_HVALUE argLocal = 0; + if (argc > 0) { + argStyle = GetSimpleHValue(hThis, args, 0); + if (FXJSE_Value_IsNull(argStyle)) { + bFlags = TRUE; + } + iStyle = (FX_INT32)HValueToFloat(hThis, argStyle); + if (iStyle > 4 || iStyle < 0) { + iStyle = 0; + } + } + if (argc == 2) { + argLocal = GetSimpleHValue(hThis, args, 1); + if (FXJSE_Value_IsNull(argLocal)) { + bFlags = TRUE; + } else { + HValueToUTF8String(argLocal, szLocal); + } + } + if (!bFlags) { + CFX_ByteString formatStr; + GetLocalTimeFormat(hThis, iStyle, szLocal, formatStr, FALSE); + if (formatStr.IsEmpty()) { + formatStr = FX_BSTRC(""); + } + FXJSE_Value_SetUTF8String(args.GetReturnValue(), formatStr); + } else { + FXJSE_Value_SetNull(args.GetReturnValue()); + } + if (argc > 0) { + FXJSE_Value_Release(argStyle); + if (argc == 2) { + FXJSE_Value_Release(argLocal); + } + } + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"LocalTimeFmt")); + } +} +void CXFA_FM2JSContext::Num2Date(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + FX_INT32 argc = args.GetLength(); + if ((argc > 0) && (argc < 4)) { + FX_BOOL bFlags = FALSE; + FX_INT32 dDate; + CFX_ByteString formatString; + CFX_ByteString localString; + FXJSE_HVALUE dateValue = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE formatValue = 0; + FXJSE_HVALUE localValue = 0; + if(HValueIsNull(hThis, dateValue)) { + bFlags = TRUE; + } else { + dDate = (FX_INT32)HValueToFloat(hThis, dateValue); + bFlags = dDate < 1; + } + if(argc > 1) { + formatValue = GetSimpleHValue(hThis, args, 1); + if (HValueIsNull(hThis, formatValue)) { + bFlags = TRUE; + } else { + HValueToUTF8String(formatValue, formatString); + } + } + if (argc == 3) { + localValue = GetSimpleHValue(hThis, args, 2); + if (HValueIsNull(hThis, localValue)) { + bFlags = TRUE; + } else { + HValueToUTF8String(localValue, localString); + } + } + if (!bFlags) { + FX_INT32 iYear = 1900; + FX_INT32 iMonth = 1; + FX_INT32 iDay = 1; + FX_INT32 i = 0; + while (dDate > 0) { + if (iMonth == 2) { + if ((!((iYear + i) % 4) && ((iYear + i) % 100)) || !((iYear + i) % 400)) { + if (dDate > 29) { + ++iMonth; + if (iMonth > 12) { + iMonth = 1; + ++i; + } + iDay = 1; + dDate -= 29; + } else { + iDay += static_cast(dDate) - 1; + dDate = 0; + } + } else { + if (dDate > 28) { + ++iMonth; + if (iMonth > 12) { + iMonth = 1; + ++i; + } + iDay = 1; + dDate -= 28; + } else { + iDay += static_cast(dDate) - 1; + dDate = 0; + } + } + } else if (iMonth < 8) { + if ((iMonth % 2 == 0)) { + if (dDate > 30) { + ++iMonth; + if (iMonth > 12) { + iMonth = 1; + ++i; + } + iDay = 1; + dDate -= 30; + } else { + iDay += static_cast(dDate) - 1; + dDate = 0; + } + } else { + if (dDate > 31) { + ++iMonth; + if (iMonth > 12) { + iMonth = 1; + ++i; + } + iDay = 1; + dDate -= 31; + } else { + iDay += static_cast(dDate) - 1; + dDate = 0; + } + } + } else { + if (iMonth % 2 != 0) { + if (dDate > 30) { + ++iMonth; + if (iMonth > 12) { + iMonth = 1; + ++i; + } + iDay = 1; + dDate -= 30; + } else { + iDay += static_cast(dDate) - 1; + dDate = 0; + } + } else { + if (dDate > 31) { + ++iMonth; + if (iMonth > 12) { + iMonth = 1; + ++i; + } + iDay = 1; + dDate -= 31; + } else { + iDay += static_cast(dDate) - 1; + dDate = 0; + } + } + } + } + CFX_ByteString szIsoDateString; + szIsoDateString.Format("%d%02d%02d", iYear + i, iMonth, iDay); + CFX_ByteString szLocalDateString; + FX_BOOL bRet = IsoDate2Local(hThis, szIsoDateString, formatString, localString, szLocalDateString); + if (szLocalDateString.IsEmpty()) { + szLocalDateString = FX_BSTRC(""); + } + FXJSE_Value_SetUTF8String(args.GetReturnValue(), szLocalDateString); + } else { + FXJSE_Value_SetNull(args.GetReturnValue()); + } + FXJSE_Value_Release(dateValue); + if (argc > 1) { + FXJSE_Value_Release(formatValue); + if (argc == 3) { + FXJSE_Value_Release(localValue); + } + } + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Num2Date")); + } +} +void CXFA_FM2JSContext::Num2GMTime(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + FX_INT32 argc = args.GetLength(); + if ((argc > 0) && (argc < 4)) { + FX_BOOL bFlags = FALSE; + FX_INT32 iTime; + CFX_ByteString formatString; + CFX_ByteString localString; + FXJSE_HVALUE timeValue = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE formatValue = 0; + FXJSE_HVALUE localValue = 0; + if(FXJSE_Value_IsNull(timeValue)) { + bFlags = TRUE; + } else { + iTime = (FX_INT32)HValueToFloat(hThis, timeValue); + if (FXSYS_abs(iTime) < 1.0) { + bFlags = TRUE; + } + } + if(argc > 1) { + formatValue = GetSimpleHValue(hThis, args, 1); + if (FXJSE_Value_IsNull(formatValue)) { + bFlags = TRUE; + } else { + HValueToUTF8String(formatValue, formatString); + } + } + if (argc == 3) { + localValue = GetSimpleHValue(hThis, args, 2); + if (FXJSE_Value_IsNull(localValue)) { + bFlags = TRUE; + } else { + HValueToUTF8String(localValue, localString); + } + } + if (!bFlags) { + CFX_ByteString szGMTTimeString; + Num2AllTime(hThis, iTime, formatString, localString, TRUE, szGMTTimeString); + if (szGMTTimeString.IsEmpty()) { + szGMTTimeString = FX_BSTRC(""); + } + FXJSE_Value_SetUTF8String(args.GetReturnValue(), szGMTTimeString); + } else { + FXJSE_Value_SetNull(args.GetReturnValue()); + } + FXJSE_Value_Release(timeValue); + if (argc > 1) { + FXJSE_Value_Release(formatValue); + if (argc == 3) { + FXJSE_Value_Release(localValue); + } + } + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Num2GMTime")); + } +} +void CXFA_FM2JSContext::Num2Time(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + FX_INT32 argc = args.GetLength(); + if ((argc > 0) && (argc < 4)) { + FX_BOOL bFlags = FALSE; + FX_FLOAT fTime; + CFX_ByteString formatString; + CFX_ByteString localString; + FXJSE_HVALUE timeValue = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE formatValue = 0; + FXJSE_HVALUE localValue = 0; + if(FXJSE_Value_IsNull(timeValue)) { + bFlags = TRUE; + } else { + fTime = HValueToFloat(hThis, timeValue); + if (FXSYS_fabs(fTime) < 1.0) { + bFlags = TRUE; + } + } + if(argc > 1) { + formatValue = GetSimpleHValue(hThis, args, 1); + if (FXJSE_Value_IsNull(formatValue)) { + bFlags = TRUE; + } else { + HValueToUTF8String(formatValue, formatString); + } + } + if (argc == 3) { + localValue = GetSimpleHValue(hThis, args, 2); + if (FXJSE_Value_IsNull(localValue)) { + bFlags = TRUE; + } else { + HValueToUTF8String(localValue, localString); + } + } + if (!bFlags) { + CFX_ByteString szLocalTimeString; + Num2AllTime(hThis, (FX_INT32)fTime, formatString, localString, FALSE, szLocalTimeString); + if (szLocalTimeString.IsEmpty()) { + szLocalTimeString = FX_BSTRC(""); + } + FXJSE_Value_SetUTF8String(args.GetReturnValue(), szLocalTimeString); + } else { + FXJSE_Value_SetNull(args.GetReturnValue()); + } + FXJSE_Value_Release(timeValue); + if (argc > 1) { + FXJSE_Value_Release(formatValue); + if (argc == 3) { + FXJSE_Value_Release(localValue); + } + } + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Num2Time")); + } +} +void CXFA_FM2JSContext::Time(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + if (args.GetLength() == 0) { + time_t now; + time(&now); + struct tm *pGmt = gmtime(&now); + FX_INT32 iGMHour = pGmt->tm_hour; + FX_INT32 iGMMin = pGmt->tm_min; + FX_INT32 iGMSec = pGmt->tm_sec; + FXJSE_Value_SetInteger(args.GetReturnValue(), ((iGMHour * 3600 + iGMMin * 60 + iGMSec) * 1000)); + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Time")); + } +} +void CXFA_FM2JSContext::Time2Num(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + FX_INT32 argc = args.GetLength(); + if ((argc > 0) && (argc < 4)) { + FX_BOOL bFlags = FALSE; + CFX_ByteString timeString; + CFX_ByteString formatString; + CFX_ByteString localString; + FXJSE_HVALUE timeValue = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE formatValue = 0; + FXJSE_HVALUE localValue = 0; + if(HValueIsNull(hThis, timeValue)) { + bFlags = TRUE; + } else { + HValueToUTF8String(timeValue, timeString); + } + if(argc > 1) { + formatValue = GetSimpleHValue(hThis, args, 1); + if (HValueIsNull(hThis, formatValue)) { + bFlags = TRUE; + } else { + HValueToUTF8String(formatValue, formatString); + } + } + if (argc == 3) { + localValue = GetSimpleHValue(hThis, args, 2); + if (HValueIsNull(hThis, localValue)) { + bFlags = TRUE; + } else { + HValueToUTF8String(localValue, localString); + } + } + if (!bFlags) { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + CXFA_Document *pDoc = pContext->GetDocument(); + IFX_LocaleMgr *pMgr = (IFX_LocaleMgr *)pDoc->GetLocalMgr(); + IFX_Locale *pLocale = NULL; + if (localString.IsEmpty()) { + CXFA_Object * pThisNode = pDoc->GetScriptContext()->GetThisObject(); + FXSYS_assert(pThisNode->IsNode()); + CXFA_WidgetData widgetData((CXFA_Node *)pThisNode); + pLocale = widgetData.GetLocal(); + } else { + pLocale = pMgr->GetLocaleByName(CFX_WideString::FromUTF8(localString, localString.GetLength())); + } + CFX_WideString wsFormat; + if (formatString.IsEmpty()) { + pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat); + } else { + wsFormat = CFX_WideString::FromUTF8(formatString, formatString.GetLength()); + } + wsFormat = FX_WSTRC(L"time{") + wsFormat; + wsFormat += FX_WSTRC(L"}"); + CXFA_LocaleValue timeValue(XFA_VT_TIME, CFX_WideString::FromUTF8(timeString, timeString.GetLength()), + wsFormat, pLocale, (CXFA_LocaleMgr*)pMgr); + if (timeValue.IsValid()) { + CFX_Unitime uniTime = timeValue.GetTime(); + FX_INT32 hour = uniTime.GetHour(); + FX_INT32 min = uniTime.GetMinute(); + FX_INT32 second = uniTime.GetSecond(); + FX_INT32 milSecond = uniTime.GetMillisecond(); + FX_INT32 mins = hour * 60 + min; + IXFA_TimeZoneProvider* pProvider = IXFA_TimeZoneProvider::Get(); + if (pProvider != NULL) { + FX_TIMEZONE tz; + pProvider->GetTimeZone(tz); + mins -= (tz.tzHour * 60); + while (mins > 1440) { + mins -= 1440; + } + while (mins < 0) { + mins += 1440; + } + hour = mins / 60; + min = mins % 60; + } + FX_INT32 iResult = hour * 3600000 + min * 60000 + second * 1000 + milSecond + 1; + FXJSE_Value_SetInteger(args.GetReturnValue(), iResult); + } else { + FXJSE_Value_SetInteger(args.GetReturnValue(), 0); + } + } else { + FXJSE_Value_SetNull(args.GetReturnValue()); + } + FXJSE_Value_Release(timeValue); + if (argc > 1) { + FXJSE_Value_Release(formatValue); + if (argc == 3) { + FXJSE_Value_Release(localValue); + } + } + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Time2Num")); + } +} +void CXFA_FM2JSContext::TimeFmt(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + FX_INT32 argc = args.GetLength(); + if (argc < 3) { + FX_BOOL bFlags = FALSE; + FX_INT32 iStyle = 0; + CFX_ByteString szLocal; + FXJSE_HVALUE argStyle = 0; + FXJSE_HVALUE argLocal = 0; + if (argc > 0) { + argStyle = GetSimpleHValue(hThis, args, 0); + if (FXJSE_Value_IsNull(argStyle)) { + bFlags = TRUE; + } + iStyle = (FX_INT32)HValueToFloat(hThis, argStyle); + if (iStyle > 4 || iStyle < 0) { + iStyle = 0; + } + } + if (argc == 2) { + argLocal = GetSimpleHValue(hThis, args, 1); + if (FXJSE_Value_IsNull(argLocal)) { + bFlags = TRUE; + } else { + HValueToUTF8String(argLocal, szLocal); + } + } + if (!bFlags) { + CFX_ByteString formatStr; + GetStandardTimeFormat(hThis, iStyle, szLocal, formatStr); + if (formatStr.IsEmpty()) { + formatStr = FX_BSTRC(""); + } + FXJSE_Value_SetUTF8String(args.GetReturnValue(), formatStr); + } else { + FXJSE_Value_SetNull(args.GetReturnValue()); + } + if (argc > 0) { + FXJSE_Value_Release(argStyle); + if (argc == 2) { + FXJSE_Value_Release(argLocal); + } + } + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"TimeFmt")); + } +} +FX_BOOL CXFA_FM2JSContext::IsIsoDateFormat(FX_LPCSTR pData, FX_INT32 iLength, FX_INT32 &iStyle, FX_INT32 &iYear, FX_INT32 &iMonth, FX_INT32 &iDay) +{ + iYear = 0; + iMonth = 1; + iDay = 1; + FX_BOOL iRet = FALSE; + if (iLength < 4) { + return iRet; + } + FX_CHAR strYear[5]; + strYear[4] = '\0'; + for (FX_INT32 i = 0; i < 4; ++i) { + if (*(pData + i) <= '9' && *(pData + i) >= '0') { + strYear[i] = *(pData + i); + } else { + return iRet; + } + } + iYear = FXSYS_atoi(strYear); + iStyle = 0; + if (iLength > 4) { + if (*(pData + 4) == '-') { + iStyle = 1; + } else { + iStyle = 0; + } + } else { + iRet = TRUE; + return iRet; + } + FX_CHAR strTemp[3]; + strTemp[2] = '\0'; + FX_INT32 iPosOff = 0; + if (iStyle == 0) { + iPosOff = 4; + if (iLength == 4) { + iRet = TRUE; + return iRet; + } + } else { + iPosOff = 5; + if (iLength == 4) { + iRet = TRUE; + return iRet; + } + } + if ((*(pData + iPosOff) > '9' || *(pData + iPosOff) < '0') || (*(pData + iPosOff + 1) > '9' || *(pData + iPosOff + 1) < '0')) { + return iRet; + } + strTemp[0] = *(pData + iPosOff); + strTemp[1] = *(pData + iPosOff + 1); + iMonth = FXSYS_atoi(strTemp); + if (iMonth > 12 || iMonth < 1) { + return iRet; + } + if (iStyle == 0) { + iPosOff += 2; + if (iLength == 6) { + iRet = 1; + return iRet; + } + } else { + iPosOff += 3; + if (iLength == 7) { + iRet = 1; + return iRet; + } + } + if ((*(pData + iPosOff) > '9' || *(pData + iPosOff) < '0') || (*(pData + iPosOff + 1) > '9' || *(pData + iPosOff + 1) < '0')) { + return iRet; + } + strTemp[0] = *(pData + iPosOff); + strTemp[1] = *(pData + iPosOff + 1); + iDay = FXSYS_atoi(strTemp); + if (iPosOff + 2 < iLength) { + return iRet; + } + if ((!(iYear % 4) && (iYear % 100)) || !(iYear % 400)) { + if (iMonth == 2) { + if (iDay > 29) { + return iRet; + } + } else { + if (iMonth < 8) { + if (iDay > (iMonth % 2 == 0 ? 30 : 31)) { + return iRet; + } + } else { + if (iDay > (iMonth % 2 == 0 ? 31 : 30)) { + return iRet; + } + } + } + } else { + if (iMonth == 2) { + if (iDay > 28) { + return iRet; + } + } else { + if (iMonth < 8) { + if (iDay > (iMonth % 2 == 0 ? 30 : 31)) { + return iRet; + } + } else { + if (iDay > (iMonth % 2 == 0 ? 31 : 30)) { + return iRet; + } + } + } + } + iRet = TRUE; + return iRet; +} +FX_BOOL CXFA_FM2JSContext::IsIsoTimeFormat(FX_LPCSTR pData, FX_INT32 iLength, FX_INT32 &iHour, FX_INT32 &iMinute, FX_INT32 &iSecond, FX_INT32 &iMilliSecond, FX_INT32 &iZoneHour, FX_INT32 &iZoneMinute) +{ + iHour = 0; + iMinute = 0; + iSecond = 0; + iMilliSecond = 0; + iZoneHour = 0; + iZoneMinute = 0; + if (!pData) { + return FALSE; + } + FX_INT32 iRet = FALSE; + FX_CHAR strTemp[3]; + strTemp[2] = '\0'; + FX_INT32 iIndex = 0; + FX_INT32 iZone = 0; + FX_INT32 i = iIndex; + while (i < iLength) { + if ((*(pData + i) > '9' || *(pData + i) < '0') && *(pData + i) != ':' ) { + iZone = i; + break; + } + ++i; + } + if (i == iLength) { + iZone = iLength; + } + FX_INT32 iPos = 0; + while (iIndex < iZone) { + if (iIndex >= iZone) { + break; + } + if (*(pData + iIndex) > '9' || *(pData + iIndex) < '0') { + return iRet; + } + strTemp[0] = *(pData + iIndex); + if (*(pData + iIndex + 1) > '9' || *(pData + iIndex + 1) < '0') { + return iRet; + } + strTemp[1] = *(pData + iIndex + 1); + if (FXSYS_atoi(strTemp) > 60) { + return iRet; + } + if (*(pData + 2) == ':') { + if (iPos == 0) { + iHour = FXSYS_atoi(strTemp); + ++iPos; + } else if (iPos == 1) { + iMinute = FXSYS_atoi(strTemp); + ++iPos; + } else { + iSecond = FXSYS_atoi(strTemp); + } + iIndex += 3; + } else { + if (iPos == 0) { + iHour = FXSYS_atoi(strTemp); + ++iPos; + } else if (iPos == 1) { + iMinute = FXSYS_atoi(strTemp); + ++iPos; + } else if (iPos == 2) { + iSecond = FXSYS_atoi(strTemp); + ++iPos; + } + iIndex += 2; + } + } + if (*(pData + iIndex) == '.') { + ++iIndex; + FX_CHAR strTemp[4]; + strTemp[3] = '\0'; + if (*(pData + iIndex) > '9' || *(pData + iIndex) < '0') { + return iRet; + } + strTemp[0] = *(pData + iIndex); + if (*(pData + iIndex + 1) > '9' || *(pData + iIndex + 1) < '0') { + return iRet; + } + strTemp[1] = *(pData + iIndex + 1); + if (*(pData + iIndex + 2) > '9' || *(pData + iIndex + 2) < '0') { + return iRet; + } + strTemp[2] = *(pData + iIndex + 2); + iMilliSecond = FXSYS_atoi(strTemp); + if (iMilliSecond > 100) { + iMilliSecond = 0; + return iRet; + } + iIndex += 3; + } + FX_INT32 iSign = 1; + if (*(pData + iIndex) == 'z' || *(pData + iIndex) == 'Z') { + iRet = 1; + return iRet; + } else if (*(pData + iIndex) == '+') { + ++iIndex; + } else if (*(pData + iIndex) == '-') { + iSign = -1; + ++iIndex; + } + iPos = 0; + while (iIndex < iLength) { + if (iIndex >= iLength) { + return iRet; + } + if (*(pData + iIndex) > '9' || *(pData + iIndex) < '0') { + return iRet; + } + strTemp[0] = *(pData + iIndex); + if (*(pData + iIndex + 1) > '9' || *(pData + iIndex + 1) < '0') { + return iRet; + } + strTemp[1] = *(pData + iIndex + 1); + if (FXSYS_atoi(strTemp) > 60) { + return iRet; + } + if (*(pData + 2) == ':') { + if (iPos == 0) { + iZoneHour = FXSYS_atoi(strTemp); + } else if (iPos == 1) { + iZoneMinute = FXSYS_atoi(strTemp); + } + iIndex += 3; + } else { + if (!iPos) { + iZoneHour = FXSYS_atoi(strTemp); + ++iPos; + } else if (iPos == 1) { + iZoneMinute = FXSYS_atoi(strTemp); + ++iPos; + } + iIndex += 2; + } + } + if (iIndex < iLength) { + return iRet; + } + iZoneHour *= iSign; + iRet = TRUE; + return iRet; +} +FX_BOOL CXFA_FM2JSContext::IsIsoDateTimeFormat(FX_LPCSTR pData, FX_INT32 iLength, FX_INT32 &iYear, FX_INT32 &iMonth, FX_INT32 &iDay, FX_INT32 &iHour, FX_INT32 &iMinute, FX_INT32 &iSecond, FX_INT32 &iMillionSecond, FX_INT32 &iZoneHour, FX_INT32 &iZoneMinute) +{ + iYear = 0; + iMonth = 0; + iDay = 0; + iHour = 0; + iMinute = 0; + iSecond = 0; + if (!pData) { + return FALSE; + } + FX_INT32 iRet = FALSE; + FX_INT32 iIndex = 0; + while (*(pData + iIndex) != 'T' && *(pData + iIndex) != 't') { + if (iIndex >= iLength) { + return iRet; + } + ++iIndex; + } + if (iIndex != 8 && iIndex != 10) { + return iRet; + } + FX_INT32 iStyle = -1; + iRet = IsIsoDateFormat(pData, iIndex , iStyle, iYear, iMonth, iDay); + if (!iRet) { + return iRet; + } + if (*(pData + iIndex) != 'T' && *(pData + iIndex) != 't') { + return iRet; + } + ++iIndex; + if (((iLength - iIndex > 13) && (iLength - iIndex < 6)) && (iLength - iIndex != 15)) { + return iRet; + } + iRet = IsIsoTimeFormat(pData + iIndex, iLength - iIndex, iHour, iMinute, iSecond, iMillionSecond, iZoneHour, iZoneMinute); + if (!iRet) { + return iRet; + } + iRet = TRUE; + return iRet; +} +FX_BOOL CXFA_FM2JSContext::Local2IsoDate(FXJSE_HOBJECT hThis, FX_BSTR szDate, FX_BSTR szFormat, FX_BSTR szLocale, CFX_ByteString &strIsoDate) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + CXFA_Document *pDoc = pContext->GetDocument(); + if(!pDoc) { + return FALSE; + } + IFX_LocaleMgr *pMgr = (IFX_LocaleMgr *)pDoc->GetLocalMgr(); + IFX_Locale *pLocale = NULL; + if (szLocale.IsEmpty()) { + CXFA_Object * pThisNode = pDoc->GetScriptContext()->GetThisObject(); + FXSYS_assert(pThisNode->IsNode()); + CXFA_WidgetData widgetData((CXFA_Node *)pThisNode); + pLocale = widgetData.GetLocal(); + } else { + pLocale = pMgr->GetLocaleByName(CFX_WideString::FromUTF8(szLocale.GetCStr(), szLocale.GetLength())); + } + if (!pLocale) { + return FALSE; + } + CFX_WideString wsFormat; + if (szFormat.IsEmpty()) { + pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat); + } else { + wsFormat = CFX_WideString::FromUTF8(szFormat.GetCStr(), szFormat.GetLength()); + } + CXFA_LocaleValue widgetValue(XFA_VT_DATE, CFX_WideString::FromUTF8(szDate.GetCStr(), szDate.GetLength()), + wsFormat, pLocale, (CXFA_LocaleMgr*)pMgr); + CFX_Unitime dt = widgetValue.GetDate(); + strIsoDate.Format("%4d-%02d-%02d", dt.GetYear(), dt.GetMonth(), dt.GetDay()); + return TRUE; +} +FX_BOOL CXFA_FM2JSContext::Local2IsoTime(FXJSE_HOBJECT hThis, FX_BSTR szTime, FX_BSTR szFormat, FX_BSTR szLocale, CFX_ByteString &strIsoTime) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + CXFA_Document *pDoc = pContext->GetDocument(); + if(!pDoc) { + return FALSE; + } + IFX_LocaleMgr *pMgr = (IFX_LocaleMgr *)pDoc->GetLocalMgr(); + IFX_Locale *pLocale = NULL; + if (szLocale.IsEmpty()) { + CXFA_Object * pThisNode = pDoc->GetScriptContext()->GetThisObject(); + FXSYS_assert(pThisNode->IsNode()); + CXFA_WidgetData widgetData((CXFA_Node *)pThisNode); + pLocale = widgetData.GetLocal(); + } else { + pLocale = pMgr->GetLocaleByName(CFX_WideString::FromUTF8(szLocale.GetCStr(), szLocale.GetLength())); + } + if (!pLocale) { + return FALSE; + } + CFX_WideString wsFormat; + if (szFormat.IsEmpty()) { + pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat); + } else { + wsFormat = CFX_WideString::FromUTF8(szFormat.GetCStr(), szFormat.GetLength()); + } + wsFormat = FX_WSTRC(L"time{") + wsFormat; + wsFormat += FX_WSTRC(L"}"); + CXFA_LocaleValue widgetValue(XFA_VT_TIME, CFX_WideString::FromUTF8(szTime.GetCStr(), szTime.GetLength()), + wsFormat, pLocale, (CXFA_LocaleMgr*)pMgr); + CFX_Unitime utime = widgetValue.GetTime(); + strIsoTime.Format("%02d:%02d:%02d.%03d", utime.GetHour(), utime.GetMinute(), utime.GetSecond(), utime.GetMillisecond()); + return TRUE; +} +FX_BOOL CXFA_FM2JSContext::IsoDate2Local(FXJSE_HOBJECT hThis, FX_BSTR szDate, FX_BSTR szFormat, FX_BSTR szLocale, CFX_ByteString &strLocalDate) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + CXFA_Document *pDoc = pContext->GetDocument(); + if(!pDoc) { + return FALSE; + } + IFX_LocaleMgr *pMgr = (IFX_LocaleMgr *)pDoc->GetLocalMgr(); + IFX_Locale *pLocale = NULL; + if (szLocale.IsEmpty()) { + CXFA_Object * pThisNode = pDoc->GetScriptContext()->GetThisObject(); + FXSYS_assert(pThisNode->IsNode()); + CXFA_WidgetData widgetData((CXFA_Node *)pThisNode); + pLocale = widgetData.GetLocal(); + } else { + pLocale = pMgr->GetLocaleByName(CFX_WideString::FromUTF8(szLocale.GetCStr(), szLocale.GetLength())); + } + if (!pLocale) { + return FALSE; + } + CFX_WideString wsFormat; + if (szFormat.IsEmpty()) { + pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat); + } else { + wsFormat = CFX_WideString::FromUTF8(szFormat.GetCStr(), szFormat.GetLength()); + } + CXFA_LocaleValue widgetValue(XFA_VT_DATE, CFX_WideString::FromUTF8(szDate.GetCStr(), szDate.GetLength()), (CXFA_LocaleMgr*)pMgr); + CFX_WideString wsRet; + widgetValue.FormatPatterns(wsRet, wsFormat, pLocale, XFA_VALUEPICTURE_Display); + strLocalDate = FX_UTF8Encode(wsRet, wsRet.GetLength()); + return TRUE; +} +FX_BOOL CXFA_FM2JSContext::IsoTime2Local(FXJSE_HOBJECT hThis, FX_BSTR szTime, FX_BSTR szFormat, FX_BSTR szLocale, CFX_ByteString &strLocalTime) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + CXFA_Document *pDoc = pContext->GetDocument(); + if(!pDoc) { + return FALSE; + } + IFX_LocaleMgr *pMgr = (IFX_LocaleMgr *)pDoc->GetLocalMgr(); + IFX_Locale *pLocale = NULL; + if (szLocale.IsEmpty()) { + CXFA_Object * pThisNode = pDoc->GetScriptContext()->GetThisObject(); + FXSYS_assert(pThisNode->IsNode()); + CXFA_WidgetData widgetData((CXFA_Node *)pThisNode); + pLocale = widgetData.GetLocal(); + } else { + pLocale = pMgr->GetLocaleByName(CFX_WideString::FromUTF8(szLocale.GetCStr(), szLocale.GetLength())); + } + if (!pLocale) { + return FALSE; + } + CFX_WideString wsFormat; + if (szFormat.IsEmpty()) { + pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat); + } else { + wsFormat = CFX_WideString::FromUTF8(szFormat.GetCStr(), szFormat.GetLength()); + } + wsFormat = FX_WSTRC(L"time{") + wsFormat; + wsFormat += FX_WSTRC(L"}"); + CXFA_LocaleValue widgetValue(XFA_VT_TIME, CFX_WideString::FromUTF8(szTime.GetCStr(), szTime.GetLength()), (CXFA_LocaleMgr*)pMgr); + CFX_WideString wsRet; + widgetValue.FormatPatterns(wsRet, wsFormat, pLocale, XFA_VALUEPICTURE_Display); + strLocalTime = FX_UTF8Encode(wsRet, wsRet.GetLength()); + return TRUE; +} +FX_BOOL CXFA_FM2JSContext::GetGMTTime(FXJSE_HOBJECT hThis, FX_BSTR szTime, FX_BSTR szFormat, FX_BSTR szLocale, CFX_ByteString &strGMTTime) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + CXFA_Document *pDoc = pContext->GetDocument(); + if(!pDoc) { + return FALSE; + } + IFX_LocaleMgr *pMgr = (IFX_LocaleMgr *)pDoc->GetLocalMgr(); + IFX_Locale *pLocale = NULL; + if (szLocale.IsEmpty()) { + CXFA_Object * pThisNode = pDoc->GetScriptContext()->GetThisObject(); + FXSYS_assert(pThisNode->IsNode()); + CXFA_WidgetData widgetData((CXFA_Node *)pThisNode); + pLocale = widgetData.GetLocal(); + } else { + pLocale = pMgr->GetLocaleByName(CFX_WideString::FromUTF8(szLocale.GetCStr(), szLocale.GetLength())); + } + if (!pLocale) { + return FALSE; + } + CFX_WideString wsFormat; + if (szFormat.IsEmpty()) { + pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat); + } else { + wsFormat = CFX_WideString::FromUTF8(szFormat.GetCStr(), szFormat.GetLength()); + } + wsFormat = FX_WSTRC(L"time{") + wsFormat; + wsFormat += FX_WSTRC(L"}"); + CXFA_LocaleValue widgetValue(XFA_VT_TIME, CFX_WideString::FromUTF8(szTime.GetCStr(), szTime.GetLength()), (CXFA_LocaleMgr*)pMgr); + CFX_WideString wsRet; + widgetValue.FormatPatterns(wsRet, wsFormat, pLocale, XFA_VALUEPICTURE_Display); + strGMTTime = FX_UTF8Encode(wsRet, wsRet.GetLength()); + return TRUE; +} +FX_INT32 CXFA_FM2JSContext::DateString2Num(FX_BSTR szDateString) +{ + FX_BOOL bFlags = FALSE; + FX_INT32 iLength = szDateString.GetLength(); + FX_BOOL iRet = FALSE; + FX_INT32 iStyle = -1; + FX_INT32 iYear = 0; + FX_INT32 iMonth = 0; + FX_INT32 iDay = 0; + FX_INT32 iHour = 0; + FX_INT32 iMinute = 0; + FX_INT32 iSecond = 0; + FX_INT32 iMillionSecond = 0; + FX_INT32 iZoneHour = 0; + FX_INT32 iZoneMinute = 0; + if (iLength <= 10) { + iRet = IsIsoDateFormat(szDateString.GetCStr(), iLength, iStyle, iYear, iMonth, iDay); + } else { + iRet = IsIsoDateTimeFormat(szDateString.GetCStr(), iLength, iYear, iMonth, iDay, iHour, iMinute, iSecond, iMillionSecond, iZoneHour, iZoneMinute); + } + if (!iRet) { + bFlags = TRUE; + } + FX_FLOAT dDays = 0; + FX_INT32 i = 1; + if (iYear < 1900) { + bFlags = TRUE; + } + if(!bFlags) { + while (iYear - i >= 1900) { + if ((!((iYear - i) % 4) && ((iYear - i) % 100)) || !((iYear - i) % 400)) { + dDays += 366; + } else { + dDays += 365; + } + ++i; + } + i = 1; + while (i < iMonth) { + if (i == 2) { + if ((!(iYear % 4) && (iYear % 100)) || !(iYear % 400)) { + dDays += 29; + } else { + dDays += 28; + } + } else if (i <= 7) { + if (i % 2 == 0) { + dDays += 30; + } else { + dDays += 31; + } + } else { + if (i % 2 == 0) { + dDays += 31; + } else { + dDays += 30; + } + } + ++i; + } + i = 0; + while (iDay - i > 0) { + dDays += 1; + ++i; + } + } else { + dDays = 0; + } + return (FX_INT32)dDays; +} +#define XFA_N 19 +static FX_BYTE g_sAltTable_Date[] = { + XFA_N, XFA_N, XFA_N, 3, 9, XFA_N, XFA_N, XFA_N, + XFA_N, XFA_N, XFA_N, XFA_N, 2, XFA_N, XFA_N, XFA_N, + XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, + 1, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, + XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, + XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, + XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, + XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, +}; +static FX_BYTE g_sAltTable_Time[] = { + 14, XFA_N, XFA_N, 3, 9, XFA_N, XFA_N, 15, + XFA_N, XFA_N, XFA_N, XFA_N, 6, XFA_N, XFA_N, XFA_N, + XFA_N, XFA_N, 7, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, + 1, 17, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, + XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, 15, + XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, + XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, + XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, +}; +static void XFA_FM_AlternateDateTimeSymbols(CFX_WideString &wsPattern, const CFX_WideString &wsAltSymbols, FX_BYTE *pAltTable) +{ + FX_INT32 nLength = wsPattern.GetLength(); + FX_BOOL bInConstRange = FALSE; + FX_BOOL bEscape = FALSE; + FX_INT32 i = 0, n = 0; + while (i < nLength) { + FX_WCHAR wc = wsPattern[i]; + if (wc == L'\'') { + bInConstRange = !bInConstRange; + if (bEscape) { + i ++; + } else { + wsPattern.Delete(i); + nLength --; + } + bEscape = !bEscape; + continue; + } + if (!bInConstRange && (n = wc - L'A') >= 0 && n <= (L'a' - L'A')) { + FX_INT32 nAlt = (FX_INT32)pAltTable[n]; + if (nAlt != XFA_N) { + wsPattern.SetAt(i, wsAltSymbols[nAlt]); + } + } + i ++; + bEscape = FALSE; + } +} +#undef XFA_N +void CXFA_FM2JSContext::GetLocalDateFormat(FXJSE_HOBJECT hThis, FX_INT32 iStyle, FX_BSTR szLocalStr, CFX_ByteString &strFormat, FX_BOOL bStandard) +{ + FX_LOCALEDATETIMESUBCATEGORY strStyle; + switch (iStyle) { + case 0: + strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium; + break; + case 1: + strStyle = FX_LOCALEDATETIMESUBCATEGORY_Short; + break; + case 2: + strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium; + break; + case 3: + strStyle = FX_LOCALEDATETIMESUBCATEGORY_Long; + break; + case 4: + strStyle = FX_LOCALEDATETIMESUBCATEGORY_Full; + break; + default: + strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium; + break; + } + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + CXFA_Document *pDoc = pContext->GetDocument(); + if(!pDoc) { + return; + } + IFX_LocaleMgr *pMgr = (IFX_LocaleMgr *)pDoc->GetLocalMgr(); + IFX_Locale *pLocale = NULL; + if (szLocalStr.IsEmpty()) { + CXFA_Object* pThisNode = pDoc->GetScriptContext()->GetThisObject(); + FXSYS_assert(pThisNode->IsNode()); + CXFA_WidgetData widgetData((CXFA_Node*)pThisNode); + pLocale = widgetData.GetLocal(); + } else { + pLocale = pMgr->GetLocaleByName(CFX_WideString::FromUTF8(szLocalStr.GetCStr(), szLocalStr.GetLength())); + } + if (!pLocale) { + return; + } + CFX_WideString strRet; + pLocale->GetDatePattern(strStyle, strRet); + if (!bStandard) { + CFX_WideString wsSymbols; + pLocale->GetDateTimeSymbols(wsSymbols); + XFA_FM_AlternateDateTimeSymbols(strRet, wsSymbols, g_sAltTable_Date); + } + strFormat = FX_UTF8Encode(strRet, strRet.GetLength()); +} +void CXFA_FM2JSContext::GetLocalTimeFormat(FXJSE_HOBJECT hThis, FX_INT32 iStyle, FX_BSTR szLocalStr, CFX_ByteString &strFormat, FX_BOOL bStandard) +{ + FX_LOCALEDATETIMESUBCATEGORY strStyle; + switch (iStyle) { + case 0: + strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium; + break; + case 1: + strStyle = FX_LOCALEDATETIMESUBCATEGORY_Short; + break; + case 2: + strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium; + break; + case 3: + strStyle = FX_LOCALEDATETIMESUBCATEGORY_Long; + break; + case 4: + strStyle = FX_LOCALEDATETIMESUBCATEGORY_Full; + break; + default: + strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium; + break; + } + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + CXFA_Document *pDoc = pContext->GetDocument(); + if(!pDoc) { + return; + } + IFX_LocaleMgr *pMgr = (IFX_LocaleMgr *)pDoc->GetLocalMgr(); + IFX_Locale *pLocale = NULL; + if (szLocalStr.IsEmpty()) { + CXFA_Object *pThisObject = pDoc->GetScriptContext()->GetThisObject(); + FXSYS_assert(pThisObject->IsNode()); + CXFA_Node* pThisNode = (CXFA_Node *)pThisObject; + CXFA_WidgetData widgetData(pThisNode); + pLocale = widgetData.GetLocal(); + } else { + pLocale = pMgr->GetLocaleByName(CFX_WideString::FromUTF8(szLocalStr.GetCStr(), szLocalStr.GetLength())); + } + if (!pLocale) { + return; + } + CFX_WideString strRet; + pLocale->GetTimePattern(strStyle, strRet); + if (!bStandard) { + CFX_WideString wsSymbols; + pLocale->GetDateTimeSymbols(wsSymbols); + XFA_FM_AlternateDateTimeSymbols(strRet, wsSymbols, g_sAltTable_Time); + } + strFormat = FX_UTF8Encode(strRet, strRet.GetLength()); +} +void CXFA_FM2JSContext::GetStandardDateFormat(FXJSE_HOBJECT hThis, FX_INT32 iStyle, FX_BSTR szLocalStr, CFX_ByteString &strFormat) +{ + GetLocalDateFormat(hThis, iStyle, szLocalStr, strFormat, TRUE); +} +void CXFA_FM2JSContext::GetStandardTimeFormat(FXJSE_HOBJECT hThis, FX_INT32 iStyle, FX_BSTR szLocalStr, CFX_ByteString &strFormat) +{ + GetLocalTimeFormat(hThis, iStyle, szLocalStr, strFormat, TRUE); +} +void CXFA_FM2JSContext::Num2AllTime(FXJSE_HOBJECT hThis, FX_INT32 iTime, FX_BSTR szFormat, FX_BSTR szLocale, FX_BOOL bGM, CFX_ByteString &strTime) +{ + FX_INT32 iHour = 0; + FX_INT32 iMin = 0; + FX_INT32 iSec = 0; + FX_INT32 iZoneHour = 0; + FX_INT32 iZoneMin = 0; + FX_INT32 iZoneSec = 0; + iHour = static_cast(iTime) / 3600000; + iMin = (static_cast(iTime) - iHour * 3600000) / 60000; + iSec = (static_cast(iTime) - iHour * 3600000 - iMin * 60000) / 1000; + if (!bGM) { + GetLocalTimeZone(iZoneHour, iZoneMin, iZoneSec); + iHour += iZoneHour; + iMin += iZoneMin; + iSec += iZoneSec; + } + FX_INT32 iRet = 0; + CFX_ByteString strIsoTime; + strIsoTime.Format("%02d:%02d:%02d", iHour, iMin, iSec); + if (bGM) { + iRet = GetGMTTime(hThis, strIsoTime, szFormat, szLocale, strTime); + } else { + iRet = IsoTime2Local(hThis, strIsoTime, szFormat, szLocale, strTime); + } + if (!iRet) { + strTime = FX_BSTRC(""); + } + return; +} +void CXFA_FM2JSContext::GetLocalTimeZone(FX_INT32 &iHour, FX_INT32 &iMin, FX_INT32 &iSec) +{ + time_t now; + time(&now); + struct tm *pGmt = gmtime(&now); + FX_INT32 iGMHour = pGmt->tm_hour; + FX_INT32 iGMMin = pGmt->tm_min; + FX_INT32 iGMSec = pGmt->tm_sec; + struct tm *pLocal = localtime(&now); + FX_INT32 iLocalHour = pLocal->tm_hour; + FX_INT32 iLocalMin = pLocal->tm_min; + FX_INT32 iLocalSec = pLocal->tm_sec; + iHour = iLocalHour - iGMHour; + iMin = iLocalMin - iGMMin; + iSec = iLocalSec - iGMSec; +} +void CXFA_FM2JSContext::Apr(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + if(args.GetLength() == 3) { + FX_BOOL bFlags = FALSE; + FX_DOUBLE nPrincipal = 0; + FX_DOUBLE nPayment = 0; + FX_DOUBLE nPeriods = 0; + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); + FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2); + bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) || HValueIsNull(hThis, argThree)); + if(bFlags) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + nPrincipal = HValueToDouble(hThis, argOne); + nPayment = HValueToDouble(hThis, argTwo); + nPeriods = HValueToDouble(hThis, argThree); + bFlags = ((nPrincipal <= 0) || (nPayment <= 0) || (nPeriods <= 0)); + if(bFlags) { + pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); + } else { + FX_DOUBLE r = 2 * (nPeriods * nPayment - nPrincipal) / (nPeriods * nPrincipal); + FX_DOUBLE nTemp = 1; + for (FX_INT32 i = 0; i < nPeriods; ++i) { + nTemp *= (1 + r); + } + FX_DOUBLE nRet = r * nTemp / (nTemp - 1) - nPayment / nPrincipal; + while ( (nRet > FINANCIAL_PRECISION || nRet < -FINANCIAL_PRECISION) && (!bFlags) ) { + FX_DOUBLE nDerivative = 0; + nDerivative = ((nTemp + r * nPeriods * (nTemp / (1 + r))) * (nTemp - 1) - (r * nTemp * nPeriods * (nTemp / (1 + r)))) / ((nTemp - 1) * (nTemp - 1)); + if (nDerivative == 0) { + bFlags = TRUE; + continue; + } + r = r - nRet / nDerivative; + nTemp = 1; + for (FX_INT32 i = 0; i < nPeriods; ++i) { + nTemp *= (1 + r); + } + nRet = r * nTemp / (nTemp - 1) - nPayment / nPrincipal; + } + if(bFlags) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + r = r * 12; + FXJSE_Value_SetDouble(args.GetReturnValue(), r); + } + } + } + FXJSE_Value_Release(argOne); + FXJSE_Value_Release(argTwo); + FXJSE_Value_Release(argThree); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Apr")); + } +} +void CXFA_FM2JSContext::CTerm(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + if(args.GetLength() == 3) { + FX_BOOL bFlags = FALSE; + FX_FLOAT nRate = 0; + FX_FLOAT nFutureValue = 0; + FX_FLOAT nInitAmount = 0; + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); + FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2); + bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) || HValueIsNull(hThis, argThree)); + if(bFlags) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + nRate = HValueToFloat(hThis, argOne); + nFutureValue = HValueToFloat(hThis, argTwo); + nInitAmount = HValueToFloat(hThis, argThree); + bFlags = ((nRate <= 0) || (nFutureValue <= 0) || (nInitAmount <= 0)); + if(bFlags) { + pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); + } else { + FXJSE_Value_SetFloat(args.GetReturnValue(), FXSYS_log((FX_FLOAT)(nFutureValue / nInitAmount)) / FXSYS_log((FX_FLOAT)(1 + nRate)) ); + } + } + FXJSE_Value_Release(argOne); + FXJSE_Value_Release(argTwo); + FXJSE_Value_Release(argThree); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"CTerm")); + } +} +void CXFA_FM2JSContext::FV(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + if(args.GetLength() == 3) { + FX_BOOL bFlags = FALSE; + FX_DOUBLE nAmount = 0; + FX_DOUBLE nRate = 0; + FX_DOUBLE nPeriod = 0; + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); + FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2); + bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) || HValueIsNull(hThis, argThree)); + if(bFlags) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + nAmount = HValueToDouble(hThis, argOne); + nRate = HValueToDouble(hThis, argTwo); + nPeriod = HValueToDouble(hThis, argThree); + bFlags = ((nRate < 0) || (nPeriod <= 0) || (nAmount <= 0)); + if(bFlags) { + pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); + } else { + FX_DOUBLE dResult = 0; + if (!nRate) { + dResult = nAmount * nPeriod; + } else { + FX_DOUBLE nTemp = 1; + for (int i = 0; i < nPeriod; ++i) { + nTemp *= 1 + nRate; + } + dResult = nAmount * (nTemp - 1) / nRate; + } + FXJSE_Value_SetDouble(args.GetReturnValue(), dResult); + } + } + FXJSE_Value_Release(argOne); + FXJSE_Value_Release(argTwo); + FXJSE_Value_Release(argThree); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"FV")); + } +} +void CXFA_FM2JSContext::IPmt(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + if(args.GetLength() == 5) { + FX_BOOL bFlags = FALSE; + FX_FLOAT nPrincpalAmount = 0; + FX_FLOAT nRate = 0; + FX_FLOAT nPayment = 0; + FX_FLOAT nFirstMonth = 0; + FX_FLOAT nNumberOfMonths = 0; + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); + FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2); + FXJSE_HVALUE argFour = GetSimpleHValue(hThis, args, 3); + FXJSE_HVALUE argFive = GetSimpleHValue(hThis, args, 4); + bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) || HValueIsNull(hThis, argThree) || + HValueIsNull(hThis, argFour) || HValueIsNull(hThis, argFive)); + if(bFlags) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + nPrincpalAmount = HValueToFloat(hThis, argOne); + nRate = HValueToFloat(hThis, argTwo); + nPayment = HValueToFloat(hThis, argThree); + nFirstMonth = HValueToFloat(hThis, argFour); + nNumberOfMonths = HValueToFloat(hThis, argFive); + bFlags = ((nPrincpalAmount <= 0) || (nRate <= 0) || (nPayment <= 0) || (nFirstMonth < 0) || (nNumberOfMonths < 0)); + if(bFlags) { + pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); + } else { + FX_FLOAT fResult = 0; + FX_FLOAT nRateOfMonth = nRate / 12; + FX_INT32 iNums = (FX_INT32)((FXSYS_log10((FX_FLOAT)(nPayment / nPrincpalAmount)) - FXSYS_log10((FX_FLOAT)(nPayment / nPrincpalAmount - nRateOfMonth))) / FXSYS_log10((FX_FLOAT)(1 + nRateOfMonth))); + FX_INT32 iEnd = (FX_INT32)(nFirstMonth + nNumberOfMonths - 1); + if (iEnd > iNums) { + iEnd = iNums; + } + FX_FLOAT nSum = 0; + if (nPayment < nPrincpalAmount * nRateOfMonth) { + bFlags = TRUE; + fResult = 0; + } + if(!bFlags) { + FX_INT32 i = 0; + for (i = 0; i < nFirstMonth - 1; ++i) { + nPrincpalAmount -= nPayment - nPrincpalAmount * nRateOfMonth; + } + for (; i < iEnd; ++i) { + nSum += nPrincpalAmount * nRateOfMonth; + nPrincpalAmount -= nPayment - nPrincpalAmount * nRateOfMonth; + } + fResult = nSum; + } + FXJSE_Value_SetFloat(args.GetReturnValue(), fResult); + } + } + FXJSE_Value_Release(argOne); + FXJSE_Value_Release(argTwo); + FXJSE_Value_Release(argThree); + FXJSE_Value_Release(argFour); + FXJSE_Value_Release(argFive); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"IPmt")); + } +} +void CXFA_FM2JSContext::NPV(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FX_INT32 argc = args.GetLength(); + if (argc > 2) { + FX_BOOL bFlags = FALSE; + FXJSE_HVALUE *argValues = FX_Alloc(FXJSE_HVALUE, argc); + for (FX_INT32 i = 0; i < argc; i++) { + argValues[i] = GetSimpleHValue(hThis, args, i); + if (HValueIsNull(hThis, argValues[i])) { + bFlags = TRUE; + } + } + if (!bFlags) { + FX_DOUBLE nRate = 0; + nRate = HValueToDouble(hThis, argValues[0]); + if (nRate <= 0) { + pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); + } else { + FX_DOUBLE *pData = FX_Alloc(FX_DOUBLE, argc - 1); + for (FX_INT32 i = 1; i < argc; i++) { + pData[i - 1] = HValueToDouble(hThis, argValues[i]); + } + FX_DOUBLE nSum = 0; + FX_INT32 iIndex = 0; + for (FX_INT32 i = 0; i < argc - 1; i++) { + FX_DOUBLE nTemp = 1; + for (FX_INT32 j = 0; j <= i; j++) { + nTemp *= 1 + nRate; + } + FX_DOUBLE nNum = *(pData + iIndex++); + nSum += nNum / nTemp; + } + FXJSE_Value_SetDouble(args.GetReturnValue(), nSum); + FX_Free(pData); + pData = 0; + } + } else { + FXJSE_Value_SetNull(args.GetReturnValue()); + } + for (FX_INT32 i = 0; i < argc; i++) { + FXJSE_Value_Release(argValues[i]); + } + FX_Free(argValues); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"NPV")); + } +} +void CXFA_FM2JSContext::Pmt(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + if(args.GetLength() == 3) { + FX_BOOL bFlags = FALSE; + FX_FLOAT nPrincipal = 0; + FX_FLOAT nRate = 0; + FX_FLOAT nPeriods = 0; + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); + FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2); + bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) || HValueIsNull(hThis, argThree)); + if(bFlags) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + nPrincipal = HValueToFloat(hThis, argOne); + nRate = HValueToFloat(hThis, argTwo); + nPeriods = HValueToFloat(hThis, argThree); + bFlags = ((nPrincipal <= 0) || (nRate <= 0) || (nPeriods <= 0)); + if(bFlags) { + pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); + } else { + FX_FLOAT nSum = 0; + FX_FLOAT nTmp = 1 + nRate; + nSum = nTmp; + for (FX_INT32 i = 0; i < nPeriods - 1; ++i) { + nSum *= nTmp; + } + FXJSE_Value_SetFloat(args.GetReturnValue(), (nPrincipal * nRate * nSum) / (nSum - 1)); + } + } + FXJSE_Value_Release(argOne); + FXJSE_Value_Release(argTwo); + FXJSE_Value_Release(argThree); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Pmt")); + } +} +void CXFA_FM2JSContext::PPmt(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + if(args.GetLength() == 5) { + FX_BOOL bFlags = FALSE; + FX_FLOAT nPrincpalAmount = 0; + FX_FLOAT nRate = 0; + FX_FLOAT nPayment = 0; + FX_FLOAT nFirstMonth = 0; + FX_FLOAT nNumberOfMonths = 0; + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); + FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2); + FXJSE_HVALUE argFour = GetSimpleHValue(hThis, args, 3); + FXJSE_HVALUE argFive = GetSimpleHValue(hThis, args, 4); + bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) || HValueIsNull(hThis, argThree) || + HValueIsNull(hThis, argFour) || HValueIsNull(hThis, argFive)); + if(bFlags) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + nPrincpalAmount = HValueToFloat(hThis, argOne); + nRate = HValueToFloat(hThis, argTwo); + nPayment = HValueToFloat(hThis, argThree); + nFirstMonth = HValueToFloat(hThis, argFour); + nNumberOfMonths = HValueToFloat(hThis, argFive); + bFlags = ((nPrincpalAmount <= 0) || (nRate <= 0) || (nPayment <= 0) || (nFirstMonth < 0) || (nNumberOfMonths < 0)); + if(bFlags) { + pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); + } else { + FX_INT32 iEnd = (FX_INT32)(nFirstMonth + nNumberOfMonths - 1); + FX_FLOAT nSum = 0; + FX_FLOAT nRateOfMonth = nRate / 12; + FX_INT32 iNums = (FX_INT32)((FXSYS_log10((FX_FLOAT)(nPayment / nPrincpalAmount)) - FXSYS_log10((FX_FLOAT)(nPayment / nPrincpalAmount - nRateOfMonth))) / FXSYS_log10((FX_FLOAT)(1 + nRateOfMonth))); + if (iEnd > iNums) { + iEnd = iNums; + } + if (nPayment < nPrincpalAmount * nRateOfMonth) { + bFlags = TRUE; + } + if(!bFlags) { + FX_INT32 i = 0; + for (i = 0; i < nFirstMonth - 1; ++i) { + nPrincpalAmount -= nPayment - nPrincpalAmount * nRateOfMonth; + } + FX_FLOAT nTemp = 0; + for (; i < iEnd; ++i) { + nTemp = nPayment - nPrincpalAmount * nRateOfMonth; + nSum += nTemp; + nPrincpalAmount -= nTemp; + } + FXJSE_Value_SetFloat(args.GetReturnValue(), nSum); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); + } + } + } + FXJSE_Value_Release(argOne); + FXJSE_Value_Release(argTwo); + FXJSE_Value_Release(argThree); + FXJSE_Value_Release(argFour); + FXJSE_Value_Release(argFive); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"PPmt")); + } +} +void CXFA_FM2JSContext::PV(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + if(args.GetLength() == 3) { + FX_BOOL bFlags = FALSE; + FX_DOUBLE nAmount = 0; + FX_DOUBLE nRate = 0; + FX_DOUBLE nPeriod = 0; + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); + FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2); + bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) || HValueIsNull(hThis, argThree)); + if(bFlags) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + nAmount = HValueToDouble(hThis, argOne); + nRate = HValueToDouble(hThis, argTwo); + nPeriod = HValueToDouble(hThis, argThree); + bFlags = ((nAmount <= 0) || (nRate < 0) || (nPeriod <= 0)); + if(bFlags) { + pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); + } else { + FX_DOUBLE nTemp = 1; + for (FX_INT32 i = 0; i < nPeriod; ++i) { + nTemp *= 1 + nRate; + } + nTemp = 1 / nTemp; + FXJSE_Value_SetDouble(args.GetReturnValue(), nAmount * ((1 - nTemp) / nRate)); + } + } + FXJSE_Value_Release(argOne); + FXJSE_Value_Release(argTwo); + FXJSE_Value_Release(argThree); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"PV")); + } +} +void CXFA_FM2JSContext::Rate(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + if(args.GetLength() == 3) { + FX_BOOL bFlags = FALSE; + FX_FLOAT nFuture = 0; + FX_FLOAT nPresent = 0; + FX_FLOAT nTotalNumber = 0; + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); + FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2); + bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) || HValueIsNull(hThis, argThree)); + if(bFlags) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + nFuture = HValueToFloat(hThis, argOne); + nPresent = HValueToFloat(hThis, argTwo); + nTotalNumber = HValueToFloat(hThis, argThree); + bFlags = ((nFuture <= 0) || (nPresent < 0) || (nTotalNumber <= 0)); + if(bFlags) { + pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); + } else { + FXJSE_Value_SetFloat(args.GetReturnValue(), (FXSYS_pow((FX_FLOAT)(nFuture / nPresent) , (FX_FLOAT)(1 / nTotalNumber)) - 1)); + } + } + FXJSE_Value_Release(argOne); + FXJSE_Value_Release(argTwo); + FXJSE_Value_Release(argThree); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Rate")); + } +} +void CXFA_FM2JSContext::Term(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + if(args.GetLength() == 3) { + FX_BOOL bFlags = FALSE; + FX_FLOAT nMount = 0; + FX_FLOAT nRate = 0; + FX_FLOAT nFuture = 0; + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); + FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2); + bFlags = (FXJSE_Value_IsNull(argOne) || FXJSE_Value_IsNull(argTwo) || FXJSE_Value_IsNull(argThree)); + if(bFlags) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + nMount = HValueToFloat(hThis, argOne); + nRate = HValueToFloat(hThis, argTwo); + nFuture = HValueToFloat(hThis, argThree); + bFlags = ((nMount <= 0) || (nRate <= 0) || (nFuture <= 0)); + if(bFlags) { + pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); + } else { + FXJSE_Value_SetFloat(args.GetReturnValue(), (FXSYS_log((FX_FLOAT)(nFuture / nMount * nRate) + 1) / FXSYS_log((FX_FLOAT)(1 + nRate)))); + } + } + FXJSE_Value_Release(argOne); + FXJSE_Value_Release(argTwo); + FXJSE_Value_Release(argThree); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Term")); + } +} +void CXFA_FM2JSContext::Choose(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + FX_INT32 argc = args.GetLength(); + if (argc > 1) { + FXJSE_HVALUE argOne = args.GetValue(0); + FX_BOOL argOneIsNull = FALSE; + FX_INT32 iIndex = 0; + argOneIsNull = HValueIsNull(hThis, argOne); + if (!argOneIsNull) { + iIndex = (FX_INT32)HValueToFloat(hThis, argOne); + } + FXJSE_Value_Release(argOne); + if (argOneIsNull) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else if (iIndex < 1) { + FXJSE_Value_SetUTF8String(args.GetReturnValue(), FX_BSTRC("")); + } else { + FX_BOOL bFound = FALSE; + FX_BOOL bStopCounterFlags = FALSE; + FX_INT32 iArgIndex = 1; + FX_INT32 iValueIndex = 0; + while(!bFound && !bStopCounterFlags && (iArgIndex < argc)) { + FXJSE_HVALUE argIndexValue = args.GetValue(iArgIndex); + if (FXJSE_Value_IsArray(argIndexValue)) { + FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectProp(argIndexValue, FX_BSTRC("length"), lengthValue); + FX_INT32 iLength = FXJSE_Value_ToInteger(lengthValue); + FXJSE_Value_Release(lengthValue); + if (iLength > 3) { + bStopCounterFlags = TRUE; + } + iValueIndex += (iLength - 2); + if (iValueIndex >= iIndex) { + FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); + FXJSE_HVALUE jsobjectValue = FXJSE_Value_Create(hruntime); + FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectPropByIdx(argIndexValue, 1, propertyValue); + FXJSE_Value_GetObjectPropByIdx(argIndexValue, ((iLength - 1) - (iValueIndex - iIndex)), jsobjectValue); + if (FXJSE_Value_IsNull(propertyValue)) { + GetObjectDefaultValue(jsobjectValue, newProperty); + } else { + CFX_ByteString propStr; + FXJSE_Value_ToUTF8String(propertyValue, propStr); + FXJSE_Value_GetObjectProp(jsobjectValue, propStr, newProperty); + } + CFX_ByteString bsChoosed; + HValueToUTF8String(newProperty, bsChoosed); + FXJSE_Value_SetUTF8String(args.GetReturnValue(), bsChoosed); + FXJSE_Value_Release(newProperty); + FXJSE_Value_Release(jsobjectValue); + FXJSE_Value_Release(propertyValue); + bFound = TRUE; + } + } else { + iValueIndex ++; + if (iValueIndex == iIndex) { + CFX_ByteString bsChoosed; + HValueToUTF8String(argIndexValue, bsChoosed); + FXJSE_Value_SetUTF8String(args.GetReturnValue(), bsChoosed); + bFound = TRUE; + } + } + FXJSE_Value_Release(argIndexValue); + iArgIndex++; + } + if (!bFound) { + FXJSE_Value_SetUTF8String(args.GetReturnValue(), FX_BSTRC("")); + } + } + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Choose")); + } +} +void CXFA_FM2JSContext::Exists(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + if (args.GetLength() == 1) { + FXJSE_HVALUE argOne = args.GetValue(0); + FXJSE_Value_SetInteger(args.GetReturnValue(), FXJSE_Value_IsObject(argOne)); + FXJSE_Value_Release(argOne); + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Exists")); + } +} +void CXFA_FM2JSContext::HasValue(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + if (args.GetLength() == 1) { + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + if (FXJSE_Value_IsUTF8String(argOne)) { + CFX_ByteString valueStr; + FXJSE_Value_ToUTF8String(argOne, valueStr); + valueStr.TrimLeft(); + FXJSE_Value_SetInteger(args.GetReturnValue(), (!valueStr.IsEmpty())); + } else if (FXJSE_Value_IsNumber(argOne) || FXJSE_Value_IsBoolean(argOne)) { + FXJSE_Value_SetInteger(args.GetReturnValue(), TRUE); + } else { + FXJSE_Value_SetInteger(args.GetReturnValue(), FALSE); + } + FXJSE_Value_Release(argOne); + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"HasValue")); + } +} +void CXFA_FM2JSContext::Oneof(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + FX_INT32 argc = args.GetLength(); + if(argc > 1) { + FX_BOOL bFlags = FALSE; + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE *parametersValue = 0; + FX_INT32 iCount = 0; + unfoldArgs(hThis, args, parametersValue, iCount, 1); + for(FX_INT32 i = 0; i < iCount; i++) { + if(simpleValueCompare(hThis, argOne, parametersValue[i])) { + bFlags = TRUE; + break; + } + } + FXJSE_Value_SetInteger(args.GetReturnValue(), bFlags); + FXJSE_Value_Release(argOne); + for (FX_INT32 i = 0; i < iCount; i++) { + FXJSE_Value_Release(parametersValue[i]); + } + FX_Free(parametersValue); + parametersValue = 0; + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Oneof")); + } +} +void CXFA_FM2JSContext::Within(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + FX_INT32 argc = args.GetLength(); + if(argc == 3) { + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + if(FXJSE_Value_IsNull(argOne)) { + FXJSE_Value_SetUndefined(args.GetReturnValue()); + } else { + FXJSE_HVALUE argLow = GetSimpleHValue(hThis, args, 1); + FXJSE_HVALUE argHeight = GetSimpleHValue(hThis, args, 2); + if(FXJSE_Value_IsNumber(argOne)) { + FX_FLOAT oneNumber = HValueToFloat(hThis, argOne); + FX_FLOAT lowNumber = HValueToFloat(hThis, argLow); + FX_FLOAT heightNumber = HValueToFloat(hThis, argHeight); + FXJSE_Value_SetInteger(args.GetReturnValue(), ((oneNumber >= lowNumber) && (oneNumber <= heightNumber)) ); + } else { + CFX_ByteString oneString; + CFX_ByteString lowString; + CFX_ByteString heightString; + HValueToUTF8String(argOne, oneString); + HValueToUTF8String(argLow, lowString); + HValueToUTF8String(argHeight, heightString); + FXJSE_Value_SetInteger(args.GetReturnValue(), ((oneString.Compare(lowString) >= 0) && (oneString.Compare(heightString) <= 0))); + } + FXJSE_Value_Release(argLow); + FXJSE_Value_Release(argHeight); + } + FXJSE_Value_Release(argOne); + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Within")); + } +} +void CXFA_FM2JSContext::If(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + FX_INT32 argc = args.GetLength(); + if (args.GetLength() == 3) { + FXJSE_HVALUE argCondition = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE argFirstValue = GetSimpleHValue(hThis, args, 1); + FXJSE_HVALUE argSecondValue = GetSimpleHValue(hThis, args, 2); + FX_BOOL bCondition = FXJSE_Value_ToBoolean(argCondition); + FXJSE_Value_Set(args.GetReturnValue(), bCondition ? argFirstValue : argSecondValue); + FXJSE_Value_Release(argSecondValue); + FXJSE_Value_Release(argFirstValue); + FXJSE_Value_Release(argCondition); + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"If")); + } +} +void CXFA_FM2JSContext::Eval(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + if (args.GetLength() == 1) { + FXJSE_HVALUE scriptValue = GetSimpleHValue(hThis, args, 0); + CFX_ByteString utf8ScriptString; + HValueToUTF8String(scriptValue, utf8ScriptString); + if (utf8ScriptString.IsEmpty()) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + CFX_WideTextBuf wsJavaScriptBuf; + CFX_WideString javaScript; + CFX_WideString wsError; + XFA_FM2JS_Translate(CFX_WideString::FromUTF8(utf8ScriptString, utf8ScriptString.GetLength()), wsJavaScriptBuf, wsError); + FXJSE_HCONTEXT hContext = FXJSE_Context_Create(hruntime); + FXJSE_HVALUE returnValue = FXJSE_Value_Create(hruntime); + javaScript = wsJavaScriptBuf.GetWideString(); + FXJSE_ExecuteScript(hContext, FX_UTF8Encode(javaScript, javaScript.GetLength()), returnValue); + FXJSE_Value_Set(args.GetReturnValue(), returnValue); + FXJSE_Value_Release(returnValue); + FXJSE_Context_Release(hContext); + } + FXJSE_Value_Release(scriptValue); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Eval")); + } +} +void CXFA_FM2JSContext::Ref(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + if (args.GetLength() == 1) { + FXJSE_HVALUE argOne = args.GetValue(0); + if (FXJSE_Value_IsNull(argOne)) { + FXJSE_HVALUE rgValues[3]; + for (FX_INT32 i = 0; i < 3; i++) { + rgValues[i] = FXJSE_Value_Create(hruntime); + } + FXJSE_Value_SetInteger(rgValues[0], 4); + FXJSE_Value_SetNull(rgValues[1]); + FXJSE_Value_SetNull(rgValues[2]); + FXJSE_Value_SetArray(args.GetReturnValue(), 3, rgValues); + for (FX_INT32 i = 0; i < 3; i++) { + FXJSE_Value_Release(rgValues[i]); + } + } else if (FXJSE_Value_IsArray(argOne)) { + FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectProp(argOne, FX_BSTRC("length"), lengthValue); + FX_INT32 iLength = FXJSE_Value_ToInteger(lengthValue); + FXJSE_Value_Release(lengthValue); + FXSYS_assert(iLength >= 3); + FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); + FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectPropByIdx(argOne, 1, propertyValue); + FXJSE_Value_GetObjectPropByIdx(argOne, 2, jsObjectValue); + if(FXJSE_Value_IsNull(jsObjectValue)) { + pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); + } else if(FXJSE_Value_IsNull(propertyValue) && (!FXJSE_Value_IsNull(jsObjectValue))) { + FXJSE_HVALUE rgValues[3]; + for (FX_INT32 i = 0; i < 3; i++) { + rgValues[i] = FXJSE_Value_Create(hruntime); + } + FXJSE_Value_SetInteger(rgValues[0], 3); + FXJSE_Value_SetNull(rgValues[1]); + FXJSE_Value_Set(rgValues[2], jsObjectValue); + FXJSE_Value_SetArray(args.GetReturnValue(), 3, rgValues); + for (FX_INT32 i = 0; i < 3; i++) { + FXJSE_Value_Release(rgValues[i]); + } + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); + } + FXJSE_Value_Release(jsObjectValue); + FXJSE_Value_Release(propertyValue); + } else if(FXJSE_Value_IsObject(argOne)) { + FXJSE_HVALUE rgValues[3]; + for (FX_INT32 i = 0; i < 3; i++) { + rgValues[i] = FXJSE_Value_Create(hruntime); + } + FXJSE_Value_SetInteger(rgValues[0], 3); + FXJSE_Value_SetNull(rgValues[1]); + FXJSE_Value_Set(rgValues[2], argOne); + FXJSE_Value_SetArray(args.GetReturnValue(), 3, rgValues); + for (FX_INT32 i = 0; i < 3; i++) { + FXJSE_Value_Release(rgValues[i]); + } + } else if(FXJSE_Value_IsBoolean(argOne) || FXJSE_Value_IsUTF8String(argOne) || FXJSE_Value_IsNumber(argOne)) { + FXJSE_Value_Set(args.GetReturnValue(), argOne); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); + } + FXJSE_Value_Release(argOne); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Ref")); + } +} +void CXFA_FM2JSContext::UnitType(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + if (args.GetLength() == 1) { + FXJSE_HVALUE unitspanValue = GetSimpleHValue(hThis, args, 0); + if (FXJSE_Value_IsNull(unitspanValue)) { + FXJSE_Value_SetNull(args.GetReturnValue()); + FXJSE_Value_Release(unitspanValue); + return; + } + CFX_ByteString unitspanString; + HValueToUTF8String(unitspanValue, unitspanString); + if (unitspanString.IsEmpty()) { + FXJSE_Value_SetUTF8String(args.GetReturnValue(), FX_BSTRC("in")); + } else { + enum XFA_FM2JS_VALUETYPE_ParserStatus { + VALUETYPE_START, + VALUETYPE_HAVEINVALIDCHAR, + VALUETYPE_HAVEDIGIT, + VALUETYPE_HAVEDIGITWHITE, + VALUETYPE_ISCM, + VALUETYPE_ISMM, + VALUETYPE_ISPT, + VALUETYPE_ISMP, + VALUETYPE_ISIN, + }; + unitspanString.MakeLower(); + CFX_WideString wsTypeString = CFX_WideString::FromUTF8(unitspanString, unitspanString.GetLength()); + FX_LPCWSTR pData = wsTypeString; + FX_INT32 u = 0; + FX_INT32 uLen = wsTypeString.GetLength(); + while (*(pData + u) == 0x20 || *(pData + u) == 0x09 || *(pData + u) == 0x0B || *(pData + u) == 0x0C || *(pData + u) == 0x0A || *(pData + u) == 0x0D) { + u++; + } + XFA_FM2JS_VALUETYPE_ParserStatus eParserStatus = VALUETYPE_START; + FX_WCHAR typeChar; + while (u < uLen) { + typeChar = *(pData + u); + if (typeChar == 0x20 || typeChar == 0x09 || typeChar == 0x0B || typeChar == 0x0C || typeChar == 0x0A || typeChar == 0x0D) { + if(eParserStatus == VALUETYPE_HAVEDIGIT || eParserStatus == VALUETYPE_HAVEDIGITWHITE) { + eParserStatus = VALUETYPE_HAVEDIGITWHITE; + } else { + eParserStatus = VALUETYPE_ISIN; + break; + } + } else if ((typeChar >= '0' && typeChar <= '9') || typeChar == '-' || typeChar == '.') { + if (eParserStatus == VALUETYPE_HAVEDIGITWHITE) { + eParserStatus = VALUETYPE_ISIN; + break; + } else { + eParserStatus = VALUETYPE_HAVEDIGIT; + } + } else if ((typeChar == 'c' || typeChar == 'p') && (u + 1 < uLen)) { + FX_WCHAR nextChar = *(pData + u + 1); + if ((eParserStatus == VALUETYPE_START || eParserStatus == VALUETYPE_HAVEDIGIT || eParserStatus == VALUETYPE_HAVEDIGITWHITE) && + (nextChar > '9' || nextChar < '0') && nextChar != '.' && nextChar != '-' ) { + eParserStatus = (typeChar == 'c') ? VALUETYPE_ISCM : VALUETYPE_ISPT; + break; + } else { + eParserStatus = VALUETYPE_HAVEINVALIDCHAR; + } + } else if (typeChar == 'm' && (u + 1 < uLen)) { + FX_WCHAR nextChar = *(pData + u + 1); + if ((eParserStatus == VALUETYPE_START || eParserStatus == VALUETYPE_HAVEDIGIT || eParserStatus == VALUETYPE_HAVEDIGITWHITE) && + (nextChar > '9' || nextChar < '0') && nextChar != '.' && nextChar != '-' ) { + eParserStatus = VALUETYPE_ISMM; + if (nextChar == 'p' || + ((u + 5 < uLen) && *(pData + u + 1) == 'i' && *(pData + u + 2) == 'l' && *(pData + u + 3) == 'l' && *(pData + u + 4) == 'i' && *(pData + u + 5) == 'p') + ) { + eParserStatus = VALUETYPE_ISMP; + } + break; + } + } else { + eParserStatus = VALUETYPE_HAVEINVALIDCHAR; + } + u++; + } + switch (eParserStatus) { + case VALUETYPE_ISCM: + FXJSE_Value_SetUTF8String(args.GetReturnValue(), FX_BSTRC("cm")); + break; + case VALUETYPE_ISMM: + FXJSE_Value_SetUTF8String(args.GetReturnValue(), FX_BSTRC("mm")); + break; + case VALUETYPE_ISPT: + FXJSE_Value_SetUTF8String(args.GetReturnValue(), FX_BSTRC("pt")); + break; + case VALUETYPE_ISMP: + FXJSE_Value_SetUTF8String(args.GetReturnValue(), FX_BSTRC("mp")); + break; + default: + FXJSE_Value_SetUTF8String(args.GetReturnValue(), FX_BSTRC("in")); + break; + } + } + FXJSE_Value_Release(unitspanValue); + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"UnitType")); + } +} +void CXFA_FM2JSContext::UnitValue(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + FX_INT32 argc = args.GetLength(); + if ((argc == 1) || (argc == 2)) { + FXJSE_HVALUE unitspanValue = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE unitValue = 0; + CFX_ByteString unitspanString; + FX_DOUBLE dFirstNumber = 0; + CFX_ByteString strFirstUnit; + CFX_ByteString strUnit; + if (FXJSE_Value_IsNull(unitspanValue)) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + HValueToUTF8String(unitspanValue, unitspanString); + FX_LPCSTR pData = unitspanString; + if (pData) { + FX_INT32 u = 0; + while (*(pData + u) == 0x20 || *(pData + u) == 0x09 || *(pData + u) == 0x0B || *(pData + u) == 0x0C || *(pData + u) == 0x0A || *(pData + u) == 0x0D) { + FX_CHAR ch = *(pData + u); + ++u; + } + FX_INT32 uStart = u; + while (u < unitspanString.GetLength()) { + if ((*(pData + u) > '9' || *(pData + u) < '0') && *(pData + u) != '.' && *(pData + u) != '-') { + break; + } + ++u; + } + FX_CHAR * pTemp = NULL; + dFirstNumber = strtod(pData, &pTemp); + while (*(pData + u) == ' ' || *(pData + u) == 0x09 || *(pData + u) == 0x0B || *(pData + u) == 0x0C || *(pData + u) == 0x0A || *(pData + u) == 0x0D) { + ++u; + } + FX_INT32 uLen = unitspanString.GetLength(); + while (u < uLen) { + if (*(pData + u) == ' ') { + break; + } + strFirstUnit += (*(pData + u)); + ++u; + } + strFirstUnit.MakeLower(); + if (argc == 2) { + unitValue = GetSimpleHValue(hThis, args, 1); + CFX_ByteString unitTempString; + HValueToUTF8String(unitValue, unitTempString); + FX_LPCSTR pData = unitTempString; + FX_INT32 u = 0; + while (*(pData + u) == ' ' || *(pData + u) == 0x09 || *(pData + u) == 0x0B || *(pData + u) == 0x0C || *(pData + u) == 0x0A || *(pData + u) == 0x0D) { + ++u; + } + while (u < unitTempString.GetLength()) { + if ((*(pData + u) > '9' || *(pData + u) < '0') && *(pData + u) != '.') { + break; + } + ++u; + } + while (*(pData + u) == ' ' || *(pData + u) == 0x09 || *(pData + u) == 0x0B || *(pData + u) == 0x0C || *(pData + u) == 0x0A || *(pData + u) == 0x0D) { + ++u; + } + FX_INT32 uLen = unitTempString.GetLength(); + while (u < uLen) { + if (*(pData + u) == ' ') { + break; + } + strUnit += (*(pData + u)); + ++u; + } + strUnit.MakeLower(); + } else { + strUnit = strFirstUnit; + } + FX_DOUBLE dResult = 0; + if (strFirstUnit.Equal("in") || strFirstUnit.Equal("inches")) { + if (strUnit.Equal("mm") || strUnit.Equal("millimeters")) { + dResult = dFirstNumber * 25.4; + } else if (strUnit.Equal("cm") || strUnit.Equal("centimeters")) { + dResult = dFirstNumber * 2.54; + } else if (strUnit.Equal("pt") || strUnit.Equal("points")) { + dResult = dFirstNumber / 72; + } else if (strUnit.Equal("mp") || strUnit.Equal("millipoints")) { + dResult = dFirstNumber / 72000; + } else { + dResult = dFirstNumber; + } + } else if (strFirstUnit.Equal("mm") || strFirstUnit.Equal("millimeters")) { + if (strUnit.Equal("mm") || strUnit.Equal("millimeters")) { + dResult = dFirstNumber; + } else if (strUnit.Equal("cm") || strUnit.Equal("centimeters")) { + dResult = dFirstNumber / 10; + } else if (strUnit.Equal("pt") || strUnit.Equal("points")) { + dResult = dFirstNumber / 25.4 / 72; + } else if (strUnit.Equal("mp") || strUnit.Equal("millipoints")) { + dResult = dFirstNumber / 25.4 / 72000; + } else { + dResult = dFirstNumber / 25.4; + } + } else if (strFirstUnit.Equal("cm") || strFirstUnit.Equal("centimeters")) { + if (strUnit.Equal("mm") || strUnit.Equal("millimeters")) { + dResult = dFirstNumber * 10; + } else if (strUnit.Equal("cm") || strUnit.Equal("centimeters")) { + dResult = dFirstNumber; + } else if (strUnit.Equal("pt") || strUnit.Equal("points")) { + dResult = dFirstNumber / 2.54 / 72; + } else if (strUnit.Equal("mp") || strUnit.Equal("millipoints")) { + dResult = dFirstNumber / 2.54 / 72000; + } else { + dResult = dFirstNumber / 2.54; + } + } else if (strFirstUnit.Equal("pt") || strFirstUnit.Equal("points")) { + if (strUnit.Equal("mm") || strUnit.Equal("millimeters")) { + dResult = dFirstNumber / 72 * 25.4; + } else if (strUnit.Equal("cm") || strUnit.Equal("centimeters")) { + dResult = dFirstNumber / 72 * 2.54; + } else if (strUnit.Equal("pt") || strUnit.Equal("points")) { + dResult = dFirstNumber; + } else if (strUnit.Equal("mp") || strUnit.Equal("millipoints")) { + dResult = dFirstNumber * 1000; + } else { + dResult = dFirstNumber / 72; + } + } else if (strFirstUnit.Equal("mp") || strFirstUnit.Equal("millipoints")) { + if (strUnit.Equal("mm") || strUnit.Equal("millimeters")) { + dResult = dFirstNumber / 72000 * 25.4; + } else if (strUnit.Equal("cm") || strUnit.Equal("centimeters")) { + dResult = dFirstNumber / 72000 * 2.54; + } else if (strUnit.Equal("pt") || strUnit.Equal("points")) { + dResult = dFirstNumber / 1000; + } else if (strUnit.Equal("mp") || strUnit.Equal("millipoints")) { + dResult = dFirstNumber; + } else { + dResult = dFirstNumber / 72000; + } + } + FXJSE_Value_SetDouble(args.GetReturnValue(), dResult); + } else { + FXJSE_Value_SetInteger(args.GetReturnValue(), 0); + } + } + FXJSE_Value_Release(unitspanValue); + if (argc == 2) { + FXJSE_Value_Release(unitValue); + } + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"UnitValue")); + } +} +void CXFA_FM2JSContext::At(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + if (args.GetLength() == 2) { + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); + if (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo)) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + CFX_ByteString stringTwo; + HValueToUTF8String(argTwo, stringTwo); + if (stringTwo.IsEmpty()) { + FXJSE_Value_SetInteger(args.GetReturnValue(), 1); + } else { + CFX_ByteString stringOne; + HValueToUTF8String(argOne, stringOne); + FX_STRSIZE iPosition = stringOne.Find(stringTwo); + FXJSE_Value_SetInteger(args.GetReturnValue(), iPosition + 1); + } + } + FXJSE_Value_Release(argOne); + FXJSE_Value_Release(argTwo); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"At")); + } +} +void CXFA_FM2JSContext::Concat(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + FX_INT32 argc = args.GetLength(); + if (argc >= 1) { + CFX_ByteString resultString; + FX_BOOL bAllNull = TRUE; + FXJSE_HVALUE *argValues = FX_Alloc(FXJSE_HVALUE, argc); + for (FX_INT32 i = 0; i < argc; i++) { + argValues[i] = GetSimpleHValue(hThis, args, i); + if(!HValueIsNull(hThis, argValues[i])) { + CFX_ByteString valueStr; + HValueToUTF8String(argValues[i], valueStr); + resultString += valueStr; + bAllNull = FALSE; + } + } + for(FX_INT32 i = 0; i < argc; i++) { + FXJSE_Value_Release(argValues[i]); + } + FX_Free(argValues); + if (bAllNull) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + FXJSE_Value_SetUTF8String(args.GetReturnValue(), resultString); + } + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Concat")); + } +} +void CXFA_FM2JSContext::Decode(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + FX_INT32 argc = args.GetLength(); + if(argc == 1) { + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + if (HValueIsNull(hThis, argOne)) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + CFX_ByteString toDecodeString; + HValueToUTF8String(argOne, toDecodeString); + CFX_ByteTextBuf resultBuf; + DecodeURL(toDecodeString, resultBuf); + FXJSE_Value_SetUTF8String(args.GetReturnValue(), resultBuf.GetByteString()); + } + FXJSE_Value_Release(argOne); + } else if (argc == 2) { + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); + if (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo)) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + CFX_ByteString toDecodeString; + HValueToUTF8String(argOne, toDecodeString); + CFX_ByteString identifyString; + HValueToUTF8String(argTwo, identifyString); + CFX_ByteTextBuf resultBuf; + if (identifyString.EqualNoCase(FX_BSTRC("html"))) { + DecodeHTML(toDecodeString, resultBuf); + } else if (identifyString.EqualNoCase(FX_BSTRC("xml"))) { + DecodeXML(toDecodeString, resultBuf); + } else { + DecodeURL(toDecodeString, resultBuf); + } + FXJSE_Value_SetUTF8String(args.GetReturnValue(), resultBuf.GetByteString()); + } + FXJSE_Value_Release(argOne); + FXJSE_Value_Release(argTwo); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Decode")); + } +} +void CXFA_FM2JSContext::DecodeURL (FX_BSTR szURLString, CFX_ByteTextBuf &szResultString) +{ + CFX_WideString wsURLString = CFX_WideString::FromUTF8(szURLString.GetCStr(), szURLString.GetLength()); + FX_LPCWSTR pData = wsURLString; + FX_INT32 iLen = wsURLString.GetLength(); + FX_INT32 i = 0; + FX_WCHAR ch = 0; + FX_WCHAR chTemp = 0; + CFX_WideTextBuf wsResultBuf; + while (i < iLen) { + ch = *(pData + i); + if ('%' == ch) { + chTemp = 0; + FX_INT32 iCount = 0; + while (iCount < 2) { + ++i; + ch = *(pData + i); + if (ch <= '9' && ch >= '0') { + if (!iCount) { + chTemp += (ch - '0') * 16; + } else { + chTemp += (ch - '0'); + } + } else { + if (ch <= 'F' && ch >= 'A') { + if (!iCount) { + chTemp += (ch - 'A' + 10) * 16; + } else { + chTemp += (ch - 'A' + 10); + } + } else if (ch <= 'f' && ch >= 'a') { + if (!iCount) { + chTemp += (ch - 'a' + 10) * 16; + } else { + chTemp += (ch - 'a' + 10); + } + } else { + wsResultBuf.Clear(); + return; + } + } + ++iCount; + } + wsResultBuf.AppendChar(chTemp); + } else { + wsResultBuf.AppendChar(ch); + } + ++i; + } + wsResultBuf.AppendChar(0); + szResultString = FX_UTF8Encode(wsResultBuf.GetBuffer(), wsResultBuf.GetLength()); +} +void CXFA_FM2JSContext::DecodeHTML(FX_BSTR szHTMLString, CFX_ByteTextBuf &szResultString) +{ + CFX_WideString wsHTMLString = CFX_WideString::FromUTF8(szHTMLString.GetCStr(), szHTMLString.GetLength()); + FX_WCHAR strString[9]; + FX_INT32 iStrIndex = 0; + FX_INT32 iLen = wsHTMLString.GetLength(); + FX_INT32 i = 0; + FX_INT32 iCode = 0; + FX_WCHAR ch = 0; + FX_LPCWSTR pData = wsHTMLString; + CFX_WideTextBuf wsResultBuf; + while (i < iLen) { + ch = *(pData + i); + if (ch == '&') { + ++i; + ch = *(pData + i); + if (ch == '#') { + ++i; + ch = *(pData + i); + if (ch == 'x' || ch == 'X') { + ++i; + ch = *(pData + i); + if ((ch >= '0' && ch <= '9') || (ch <= 'f' && ch >= 'a') || (ch <= 'F' && ch >= 'A')) { + while (ch != ';' && i < iLen) { + if (ch >= '0' && ch <= '9') { + iCode += ch - '0'; + } else if (ch <= 'f' && ch >= 'a') { + iCode += ch - 'a' + 10; + } else if (ch <= 'F' && ch >= 'A') { + iCode += ch - 'A' + 10; + } else { + wsResultBuf.Clear(); + return; + } + ++i; + iCode *= 16; + ch = *(pData + i); + } + iCode /= 16; + } + } else { + wsResultBuf.Clear(); + return; + } + } else { + while (ch != ';' && i < iLen) { + strString[iStrIndex++] = ch; + ++i; + ch = *(pData + i); + } + strString[iStrIndex] = 0; + } + } else { + wsResultBuf.AppendChar(ch); + ++i; + continue; + } + FX_UINT32 iData = 0; + if (HTMLSTR2Code(strString, iData)) { + wsResultBuf.AppendChar((FX_WCHAR)iData); + } else { + wsResultBuf.AppendChar(iCode); + } + iStrIndex = 0; + strString[iStrIndex] = 0; + ++i; + } + wsResultBuf.AppendChar(0); + szResultString = FX_UTF8Encode(wsResultBuf.GetBuffer(), wsResultBuf.GetLength()); +} +void CXFA_FM2JSContext::DecodeXML (FX_BSTR szXMLString, CFX_ByteTextBuf &szResultString) +{ + CFX_WideString wsXMLString = CFX_WideString::FromUTF8(szXMLString.GetCStr(), szXMLString.GetLength()); + FX_WCHAR strString[9]; + FX_INT32 iStrIndex = 0; + FX_INT32 iLen = wsXMLString.GetLength(); + FX_INT32 i = 0; + FX_INT32 iCode = 0; + FX_WCHAR ch = 0; + FX_LPCWSTR pData = wsXMLString; + CFX_WideTextBuf wsXMLBuf; + while (i < iLen) { + ch = *(pData + i); + if (ch == '&') { + ++i; + ch = *(pData + i); + if (ch == '#') { + ++i; + ch = *(pData + i); + if (ch == 'x' || ch == 'X') { + ++i; + ch = *(pData + i); + if ((ch >= '0' && ch <= '9') || (ch <= 'f' && ch >= 'a') || (ch <= 'F' && ch >= 'A')) { + while (ch != ';') { + if (ch >= '0' && ch <= '9') { + iCode += ch - '0'; + } else if (ch <= 'f' && ch >= 'a') { + iCode += ch - 'a' + 10; + } else if (ch <= 'F' && ch >= 'A') { + iCode += ch - 'A' + 10; + } else { + wsXMLBuf.Clear(); + return; + } + ++i; + iCode *= 16; + ch = *(pData + i); + } + iCode /= 16; + } + } else { + wsXMLBuf.Clear(); + return; + } + } else { + while (ch != ';' && i < iLen) { + strString[iStrIndex++] = ch; + ++i; + ch = *(pData + i); + } + strString[iStrIndex] = 0; + } + } else { + wsXMLBuf.AppendChar(ch); + ++i; + continue; + } + FX_WCHAR *strName[] = { + (FX_WCHAR *)L"quot", + (FX_WCHAR *)L"amp", + (FX_WCHAR *)L"apos", + (FX_WCHAR *)L"lt", + (FX_WCHAR *)L"gt" + }; + FX_INT32 iIndex = 0; + while (iIndex < 5) { + if (FXSYS_memcmp(strString, strName[iIndex], FXSYS_wcslen(strName[iIndex])) == 0) { + break; + } + ++iIndex; + } + switch (iIndex) { + case 0: + wsXMLBuf.AppendChar('"'); + break; + case 1: + wsXMLBuf.AppendChar('&'); + break; + case 2: + wsXMLBuf.AppendChar('\''); + break; + case 3: + wsXMLBuf.AppendChar('<'); + break; + case 4: + wsXMLBuf.AppendChar('>'); + break; + default: + wsXMLBuf.AppendChar(iCode); + break; + } + iStrIndex = 0; + strString[iStrIndex] = 0; + ++i; + iCode = 0; + } + wsXMLBuf.AppendChar(0); + szResultString = FX_UTF8Encode(wsXMLBuf.GetBuffer(), wsXMLBuf.GetLength()); +} +void CXFA_FM2JSContext::Encode(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + FX_INT32 argc = args.GetLength(); + if(argc == 1) { + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + if (HValueIsNull(hThis, argOne)) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + CFX_ByteString toEncodeString; + HValueToUTF8String(argOne, toEncodeString); + CFX_ByteTextBuf resultBuf; + EncodeURL(toEncodeString, resultBuf); + FXJSE_Value_SetUTF8String(args.GetReturnValue(), resultBuf.GetByteString()); + } + FXJSE_Value_Release(argOne); + } else if (argc == 2) { + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); + if (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo)) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + CFX_ByteString toEncodeString; + HValueToUTF8String(argOne, toEncodeString); + CFX_ByteString identifyString; + HValueToUTF8String(argTwo, identifyString); + CFX_ByteTextBuf resultBuf; + if (identifyString.EqualNoCase(FX_BSTRC("html"))) { + EncodeHTML(toEncodeString, resultBuf); + } else if (identifyString.EqualNoCase(FX_BSTRC("xml"))) { + EncodeXML(toEncodeString, resultBuf); + } else { + EncodeURL(toEncodeString, resultBuf); + } + FXJSE_Value_SetUTF8String(args.GetReturnValue(), resultBuf.GetByteString()); + } + FXJSE_Value_Release(argOne); + FXJSE_Value_Release(argTwo); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Encode")); + } +} +void CXFA_FM2JSContext::EncodeURL (FX_BSTR szURLString, CFX_ByteTextBuf &szResultBuf) +{ + CFX_WideString wsURLString = CFX_WideString::FromUTF8(szURLString.GetCStr(), szURLString.GetLength()); + CFX_WideTextBuf wsResultBuf; + FX_WCHAR ch = 0; + FX_INT32 iLength = wsURLString.GetLength(); + FX_WCHAR strEncode[4]; + strEncode[0] = '%'; + strEncode[3] = 0; + FX_WCHAR strUnsafe[] = { ' ', '<', '>', '"', '#', '%', '{', '}', '|', '\\', '^', '~', '[', ']', '`' }; + FX_WCHAR strReserved[] = {';', '/', '?', ':', '@', '=', '&'}; + FX_WCHAR strSpecial[] = {'$', '-', '+', '!', '*', '\'', '(', ')', ','}; + FX_WCHAR* strCode = (FX_WCHAR *)L"0123456789abcdef"; + for (FX_INT32 u = 0; u < iLength; ++u) { + ch = wsURLString.GetAt(u); + FX_INT32 i = 0; + FX_INT32 iCount = sizeof(strUnsafe) / sizeof(strUnsafe[0]); + while (i < iCount) { + if (ch == strUnsafe[i]) { + FX_INT32 iIndex = ch / 16; + strEncode[1] = strCode[iIndex]; + strEncode[2] = strCode[ch - iIndex * 16]; + wsResultBuf << FX_WSTRC(strEncode); + break; + } + ++i; + } + if (i < iCount) { + continue; + } + i = 0; + iCount = sizeof(strReserved) / sizeof(strReserved[0]); + while (i < iCount) { + if (ch == strReserved[i]) { + FX_INT32 iIndex = ch / 16; + strEncode[1] = strCode[iIndex]; + strEncode[2] = strCode[ch - iIndex * 16]; + wsResultBuf << FX_WSTRC(strEncode); + break; + } + ++i; + } + if (i < iCount) { + continue; + } + i = 0; + iCount = sizeof(strSpecial) / sizeof(strSpecial[0]); + while (i < iCount) { + if (ch == strSpecial[i]) { + wsResultBuf.AppendChar(ch); + break; + } + ++i; + } + if (i < iCount) { + continue; + } + if (ch >= 0x80 && ch <= 0xff) { + FX_INT32 iIndex = ch / 16; + strEncode[1] = strCode[iIndex]; + strEncode[2] = strCode[ch - iIndex * 16]; + wsResultBuf << FX_WSTRC(strEncode); + } else if ((ch >= 0x0 && ch <= 0x1f) || ch == 0x7f) { + FX_INT32 iIndex = ch / 16; + strEncode[1] = strCode[iIndex]; + strEncode[2] = strCode[ch - iIndex * 16]; + wsResultBuf << FX_WSTRC(strEncode); + } else if (ch >= 0x20 && ch <= 0x7e) { + wsResultBuf.AppendChar(ch); + } else { + FX_INT32 iRadix = 16; + CFX_WideString strTmp; + while (ch >= iRadix) { + FX_WCHAR tmp = strCode[ch % iRadix]; + ch /= iRadix; + strTmp += tmp; + } + strTmp += strCode[ch]; + FX_INT32 iLen = strTmp.GetLength(); + if (iLen < 2) { + break; + } + FX_INT32 iIndex = 0; + if (iLen % 2 != 0) { + strEncode[1] = '0'; + strEncode[2] = strTmp.GetAt(iLen - 1); + iIndex = iLen - 2; + } else { + strEncode[1] = strTmp.GetAt(iLen - 1); + strEncode[2] = strTmp.GetAt(iLen - 2); + iIndex = iLen - 3; + } + wsResultBuf << FX_WSTRC(strEncode); + while (iIndex > 0) { + strEncode[1] = strTmp.GetAt(iIndex); + strEncode[2] = strTmp.GetAt(iIndex - 1); + iIndex -= 2; + wsResultBuf << FX_WSTRC(strEncode); + } + } + } + wsResultBuf.AppendChar(0); + szResultBuf = FX_UTF8Encode(wsResultBuf.GetBuffer(), wsResultBuf.GetLength()); +} +void CXFA_FM2JSContext::EncodeHTML(FX_BSTR szHTMLString, CFX_ByteTextBuf &szResultBuf) +{ + CFX_ByteString str = szHTMLString.GetCStr(); + CFX_WideString wsHTMLString = CFX_WideString::FromUTF8(str, str.GetLength()); + FX_LPCWSTR strCode = (FX_LPCWSTR)L"0123456789abcdef"; + FX_WCHAR strEncode[9]; + strEncode[0] = '&'; + strEncode[1] = '#'; + strEncode[2] = 'x'; + strEncode[5] = ';'; + strEncode[6] = 0; + strEncode[7] = ';'; + strEncode[8] = 0; + CFX_WideTextBuf wsResultBuf; + FX_UINT32 ch = 0; + FX_INT32 iLen = wsHTMLString.GetLength(); + FX_INT32 i = 0; + FX_LPCWSTR pData = wsHTMLString; + FX_INT32 iIndex = 0; + CFX_WideString htmlReserve; + while (i < iLen) { + ch = *(pData + i); + htmlReserve.Empty(); + if (HTMLCode2STR(ch, htmlReserve)) { + wsResultBuf.AppendChar(L'&'); + wsResultBuf << htmlReserve; + wsResultBuf.AppendChar(L';'); + } else { + if (ch >= 32 && ch <= 126) { + wsResultBuf.AppendChar((FX_WCHAR)ch); + } else if (ch < 256) { + iIndex = ch / 16; + strEncode[3] = strCode[iIndex]; + strEncode[4] = strCode[ch - iIndex * 16]; + strEncode[5] = ';'; + strEncode[6] = 0; + wsResultBuf << FX_WSTRC(strEncode); + } else { + FX_INT32 iBigByte = ch / 256; + FX_INT32 iLittleByte = ch % 256; + strEncode[3] = strCode[iBigByte / 16]; + strEncode[4] = strCode[iBigByte % 16]; + strEncode[5] = strCode[iLittleByte / 16]; + strEncode[6] = strCode[iLittleByte % 16]; + wsResultBuf << FX_WSTRC(strEncode); + } + } + ++i; + } + wsResultBuf.AppendChar(0); + szResultBuf = FX_UTF8Encode(wsResultBuf.GetBuffer(), wsResultBuf.GetLength()); +} +void CXFA_FM2JSContext::EncodeXML (FX_BSTR szXMLString, CFX_ByteTextBuf &szResultBuf) +{ + CFX_WideString wsXMLString = CFX_WideString::FromUTF8(szXMLString.GetCStr(), szXMLString.GetLength()); + CFX_WideTextBuf wsResultBuf; + enum { + QUOT, + AMP, + APOS, + LT, + GT, + }; + FX_WCHAR strEncode[9]; + strEncode[0] = '&'; + strEncode[1] = '#'; + strEncode[2] = 'x'; + strEncode[5] = ';'; + strEncode[6] = 0; + strEncode[7] = ';'; + strEncode[8] = 0; + FX_WCHAR *strName[] = { + (FX_WCHAR *)L"quot", + (FX_WCHAR *)L"amp", + (FX_WCHAR *)L"apos", + (FX_WCHAR *)L"lt", + (FX_WCHAR *)L"gt" + }; + FX_WCHAR* strCode = (FX_WCHAR *)L"0123456789abcdef"; + FX_WCHAR ch = 0; + FX_INT32 iLength = wsXMLString.GetLength(); + FX_INT32 iIndex = 0; + FX_INT32 u = 0; + FX_LPCWSTR pData = wsXMLString; + for (u = 0; u < iLength; ++u) { + ch = *(pData + u); + switch (ch) { + case '"': + wsResultBuf.AppendChar('&'); + wsResultBuf << FX_WSTRC(strName[QUOT]); + wsResultBuf.AppendChar(';'); + break; + case '&': + wsResultBuf.AppendChar('&'); + wsResultBuf << FX_WSTRC(strName[AMP]); + wsResultBuf.AppendChar(';'); + break; + case '\'': + wsResultBuf.AppendChar('&'); + wsResultBuf << FX_WSTRC(strName[APOS]); + wsResultBuf.AppendChar(';'); + break; + case '<': + wsResultBuf.AppendChar('&'); + wsResultBuf << FX_WSTRC(strName[LT]); + wsResultBuf.AppendChar(';'); + break; + case '>': + wsResultBuf.AppendChar('&'); + wsResultBuf << FX_WSTRC(strName[GT]); + wsResultBuf.AppendChar(';'); + break; + default: { + if (ch >= 32 && ch <= 126) { + wsResultBuf.AppendChar(ch); + } else if (ch < 256) { + iIndex = ch / 16; + strEncode[3] = strCode[iIndex]; + strEncode[4] = strCode[ch - iIndex * 16]; + strEncode[5] = ';'; + strEncode[6] = 0; + wsResultBuf << FX_WSTRC(strEncode); + } else { + FX_INT32 iBigByte = ch / 256; + FX_INT32 iLittleByte = ch % 256; + strEncode[3] = strCode[iBigByte / 16]; + strEncode[4] = strCode[iBigByte % 16]; + strEncode[5] = strCode[iLittleByte / 16]; + strEncode[6] = strCode[iLittleByte % 16]; + wsResultBuf << FX_WSTRC(strEncode); + } + } + break; + } + } + wsResultBuf.AppendChar(0); + szResultBuf = FX_UTF8Encode(wsResultBuf.GetBuffer(), wsResultBuf.GetLength()); +} +FX_BOOL CXFA_FM2JSContext::HTMLSTR2Code(FX_WSTR pData, FX_UINT32 &iCode) +{ + FX_INT32 iLength = pData.GetLength(); + FX_UINT32 uHash = FX_HashCode_String_GetW(pData.GetPtr(), iLength); + XFA_FMHtmlHashedReserveCode htmlhashedreservecode; + FX_INT32 iStart = 0, iEnd = (sizeof(reservesForDecode) / sizeof(reservesForDecode[0])) - 1; + FX_INT32 iMid = (iStart + iEnd) / 2; + do { + iMid = (iStart + iEnd) / 2; + htmlhashedreservecode = reservesForDecode[iMid]; + if (uHash == htmlhashedreservecode.m_uHash) { + iCode = htmlhashedreservecode.m_uCode; + return TRUE; + } else if (uHash < htmlhashedreservecode.m_uHash) { + iEnd = iMid - 1; + } else { + iStart = iMid + 1; + } + } while (iStart <= iEnd); + return FALSE; +} +FX_BOOL CXFA_FM2JSContext::HTMLCode2STR(FX_UINT32 iCode, CFX_WideString &wsHTMLReserve) +{ + XFA_FMHtmlReserveCode htmlreservecode; + FX_INT32 iStart = 0, iEnd = (sizeof(reservesForEncode) / sizeof(reservesForEncode[0])) - 1; + FX_INT32 iMid = (iStart + iEnd) / 2; + do { + iMid = (iStart + iEnd) / 2; + htmlreservecode = reservesForEncode[iMid]; + if (iCode == htmlreservecode.m_uCode) { + wsHTMLReserve = htmlreservecode.m_htmlReserve; + return TRUE; + } else if (iCode < htmlreservecode.m_uCode) { + iEnd = iMid - 1; + } else { + iStart = iMid + 1; + } + } while (iStart <= iEnd); + return FALSE; +} +static FX_BOOL XFA_PATTERN_STRING_Type(FX_BSTR szPattern, FX_DWORD& patternType) +{ + CFX_WideString wsPattern = CFX_WideString::FromUTF8(szPattern.GetCStr(), szPattern.GetLength()); + if (FX_WSTRC(L"datetime") == wsPattern.Left(8)) { + patternType = XFA_VT_DATETIME; + return TRUE; + } else if (FX_WSTRC(L"date") == wsPattern.Left(4)) { + patternType = wsPattern.Find(L"time") > 0 ? XFA_VT_DATETIME : XFA_VT_DATE; + return TRUE; + } else if (FX_WSTRC(L"time") == wsPattern.Left(4)) { + patternType = XFA_VT_TIME; + return TRUE; + } else if (FX_WSTRC(L"text") == wsPattern.Left(4)) { + patternType = XFA_VT_TEXT; + return TRUE; + } else if (FX_WSTRC(L"num") == wsPattern.Left(3)) { + if (FX_WSTRC(L"integer") == wsPattern.Mid(4, 7)) { + patternType = XFA_VT_INTEGER; + } else if (FX_WSTRC(L"decimal") == wsPattern.Mid(4, 7)) { + patternType = XFA_VT_DECIMAL; + } else if (FX_WSTRC(L"currency") == wsPattern.Mid(4, 8)) { + patternType = XFA_VT_FLOAT; + } else if (FX_WSTRC(L"percent") == wsPattern.Mid(4, 7)) { + patternType = XFA_VT_FLOAT; + } else { + patternType = XFA_VT_FLOAT; + } + return TRUE; + } + patternType = XFA_VT_NULL; + wsPattern.MakeLower(); + FX_LPCWSTR pData = wsPattern; + FX_INT32 iLength = wsPattern.GetLength(); + FX_INT32 iIndex = 0; + FX_BOOL bSingleQuotation = FALSE; + FX_WCHAR patternChar; + while (iIndex < iLength) { + patternChar = *(pData + iIndex); + if (patternChar == 0x27) { + bSingleQuotation = !bSingleQuotation; + } else if (!bSingleQuotation && (patternChar == 'y' || patternChar == 'j')) { + patternType = XFA_VT_DATE; + iIndex++; + FX_WCHAR timePatternChar; + while (iIndex < iLength) { + timePatternChar = *(pData + iIndex); + if (timePatternChar == 0x27) { + bSingleQuotation = !bSingleQuotation; + } else if (!bSingleQuotation && timePatternChar == 't') { + patternType = XFA_VT_DATETIME; + break; + } + iIndex++; + } + break; + } else if (!bSingleQuotation && (patternChar == 'h' || patternChar == 'k')) { + patternType = XFA_VT_TIME; + break; + } else if (!bSingleQuotation && (patternChar == 'a' || patternChar == 'x' || patternChar == 'o' || patternChar == '0')) { + patternType = XFA_VT_TEXT; + if (patternChar == 'x' || patternChar == 'o' || patternChar == '0') { + break; + } + } else if (!bSingleQuotation && (patternChar == 'z' || patternChar == 's' || patternChar == 'e' || + patternChar == 'v' || patternChar == '8' || patternChar == ',' || patternChar == '.' || patternChar == '$')) { + patternType = XFA_VT_FLOAT; + if (patternChar == 'v' || patternChar == '8' || patternChar == '$' ) { + break; + } + } + iIndex++; + } + if (patternType == XFA_VT_NULL) { + patternType = XFA_VT_TEXT | XFA_VT_FLOAT; + } + return FALSE; +} +void CXFA_FM2JSContext::Format(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FX_INT32 argc = args.GetLength(); + if (argc >= 2) { + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); + CFX_ByteString szPattern; + HValueToUTF8String(argOne, szPattern); + CFX_ByteString szValue; + HValueToUTF8String(argTwo, szValue); + CXFA_Document *pDoc = pContext->GetDocument(); + IFX_LocaleMgr *pMgr = (IFX_LocaleMgr *)pDoc->GetLocalMgr(); + CXFA_Object* pThisNode = pDoc->GetScriptContext()->GetThisObject(); + FXSYS_assert(pThisNode->IsNode()); + CXFA_WidgetData widgetData((CXFA_Node*)pThisNode); + IFX_Locale *pLocale = widgetData.GetLocal(); + FX_DWORD patternType; + FX_BOOL bCompelte = XFA_PATTERN_STRING_Type(szPattern, patternType); + CFX_WideString wsPattern = CFX_WideString::FromUTF8(szPattern, szPattern.GetLength()); + CFX_WideString wsValue = CFX_WideString::FromUTF8(szValue, szValue.GetLength()); + if (!bCompelte) { + switch (patternType) { + case XFA_VT_DATETIME: { + FX_STRSIZE iTChar = wsPattern.Find(L'T'); + CFX_WideString wsDatePattern = FX_WSTRC(L"date{"); + wsDatePattern += wsPattern.Left(iTChar); + wsDatePattern += FX_WSTRC(L"} "); + CFX_WideString wsTimePattern = FX_WSTRC(L"time{"); + wsTimePattern += wsPattern.Mid(iTChar + 1); + wsTimePattern += FX_WSTRC(L"}"); + wsPattern = wsDatePattern + wsTimePattern; + } + break; + case XFA_VT_DATE: { + wsPattern = FX_WSTRC(L"date{") + wsPattern; + wsPattern += FX_WSTRC(L"}"); + } + break; + case XFA_VT_TIME: { + wsPattern = FX_WSTRC(L"time{") + wsPattern; + wsPattern += FX_WSTRC(L"}"); + } + break; + case XFA_VT_TEXT: { + wsPattern = FX_WSTRC(L"text{") + wsPattern; + wsPattern += FX_WSTRC(L"}"); + } + break; + case XFA_VT_FLOAT: { + wsPattern = FX_WSTRC(L"num{") + wsPattern; + wsPattern += FX_WSTRC(L"}"); + } + break; + default: { + CFX_WideString wsTestPattern; + wsTestPattern = FX_WSTRC(L"num{") + wsPattern; + wsTestPattern += FX_WSTRC(L"}"); + CXFA_LocaleValue tempLocaleValue(XFA_VT_FLOAT, wsValue, wsTestPattern, pLocale, (CXFA_LocaleMgr *)pMgr); + if (tempLocaleValue.IsValid()) { + wsPattern = wsTestPattern; + patternType = XFA_VT_FLOAT; + } else { + wsTestPattern = FX_WSTRC(L"text{") + wsPattern; + wsTestPattern += FX_WSTRC(L"}"); + wsPattern = wsTestPattern; + patternType = XFA_VT_TEXT; + } + } + break; + } + } + CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern, pLocale, (CXFA_LocaleMgr *)pMgr); + CFX_WideString wsRet; + if (localeValue.FormatPatterns(wsRet, wsPattern, pLocale, XFA_VALUEPICTURE_Display)) { + FXJSE_Value_SetUTF8String(args.GetReturnValue(), FX_UTF8Encode(wsRet, wsRet.GetLength())); + } else { + FXJSE_Value_SetUTF8String(args.GetReturnValue(), FX_BSTRC("")); + } + FXJSE_Value_Release(argOne); + FXJSE_Value_Release(argTwo); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Format")); + } +} +void CXFA_FM2JSContext::Left(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + if (args.GetLength() == 2) { + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); + FX_BOOL argIsNull = FALSE; + if ((HValueIsNull(hThis, argOne)) || (HValueIsNull(hThis, argTwo))) { + argIsNull = TRUE; + } + if (argIsNull) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + CFX_ByteString sourceString; + HValueToUTF8String(argOne, sourceString); + FX_INT32 count = HValueToInteger(hThis, argTwo); + if (count < 0) { + count = 0; + } + FXJSE_Value_SetUTF8String(args.GetReturnValue(), sourceString.Left(count)); + } + FXJSE_Value_Release(argOne); + FXJSE_Value_Release(argTwo); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Left")); + } +} +void CXFA_FM2JSContext::Len(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + if (args.GetLength() == 1) { + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + if (HValueIsNull(hThis, argOne)) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + CFX_ByteString sourceString; + HValueToUTF8String(argOne, sourceString); + FXJSE_Value_SetInteger(args.GetReturnValue(), sourceString.GetLength()); + } + FXJSE_Value_Release(argOne); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Len")); + } +} +void CXFA_FM2JSContext::Lower(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + FX_INT32 argc = args.GetLength(); + if ((argc > 0) && (argc < 3)) { + CFX_ByteString argString; + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE localeValue = 0; + if(HValueIsNull(hThis, argOne)) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + if(argc == 2) { + localeValue = GetSimpleHValue(hThis, args, 1); + } + HValueToUTF8String(argOne, argString); + CFX_WideTextBuf lowStringBuf; + CFX_WideString wsArgString = CFX_WideString::FromUTF8(argString, argString.GetLength()); + FX_LPCWSTR pData = wsArgString; + FX_INT32 iLen = argString.GetLength(); + FX_INT32 i = 0; + FX_INT32 ch = 0; + while (i < iLen) { + ch = *(pData + i); + if (ch >= 0x41 && ch <= 0x5A) { + ch += 32; + } else if (ch >= 0xC0 && ch <= 0xDE) { + ch += 32; + } else if (ch == 0x100 || ch == 0x102 || ch == 0x104) { + ch += 1; + } + lowStringBuf.AppendChar(ch); + ++i; + } + lowStringBuf.AppendChar(0); + FXJSE_Value_SetUTF8String(args.GetReturnValue(), FX_UTF8Encode(lowStringBuf.GetBuffer(), lowStringBuf.GetLength())); + if(argc == 2) { + FXJSE_Value_Release(localeValue); + } + } + FXJSE_Value_Release(argOne); + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Lower")); + } +} +void CXFA_FM2JSContext::Ltrim(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + if (args.GetLength() == 1) { + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + if (HValueIsNull(hThis, argOne)) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + CFX_ByteString sourceString; + HValueToUTF8String(argOne, sourceString); + sourceString.TrimLeft(); + FXJSE_Value_SetUTF8String(args.GetReturnValue(), sourceString); + } + FXJSE_Value_Release(argOne); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Ltrim")); + } +} +void CXFA_FM2JSContext::Parse(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + if (args.GetLength() == 2) { + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); + if (HValueIsNull(hThis, argTwo)) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + CFX_ByteString szPattern; + HValueToUTF8String(argOne, szPattern); + CFX_ByteString szValue; + HValueToUTF8String(argTwo, szValue); + CXFA_Document *pDoc = pContext->GetDocument(); + IFX_LocaleMgr *pMgr = (IFX_LocaleMgr *)pDoc->GetLocalMgr(); + CXFA_Object* pThisNode = pDoc->GetScriptContext()->GetThisObject(); + FXSYS_assert(pThisNode->IsNode()); + CXFA_WidgetData widgetData((CXFA_Node*)pThisNode); + IFX_Locale *pLocale = widgetData.GetLocal(); + FX_DWORD patternType; + FX_BOOL bCompletePattern = XFA_PATTERN_STRING_Type(szPattern, patternType); + CFX_WideString wsPattern = CFX_WideString::FromUTF8(szPattern, szPattern.GetLength()); + CFX_WideString wsValue = CFX_WideString::FromUTF8(szValue, szValue.GetLength()); + CFX_ByteString szParsedValue; + if (bCompletePattern) { + CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern, pLocale, (CXFA_LocaleMgr *)pMgr); + if (localeValue.IsValid()) { + szParsedValue = FX_UTF8Encode(localeValue.GetValue()); + FXJSE_Value_SetUTF8String(args.GetReturnValue(), szParsedValue); + } else { + FXJSE_Value_SetUTF8String(args.GetReturnValue(), FX_BSTRC("")); + } + } else { + switch (patternType) { + case XFA_VT_DATETIME: { + FX_STRSIZE iTChar = wsPattern.Find(L'T'); + CFX_WideString wsDatePattern = FX_WSTRC(L"date{"); + wsDatePattern += wsPattern.Left(iTChar); + wsDatePattern += FX_WSTRC(L"} "); + CFX_WideString wsTimePattern = FX_WSTRC(L"time{"); + wsTimePattern += wsPattern.Mid(iTChar + 1); + wsTimePattern += FX_WSTRC(L"}"); + wsPattern = wsDatePattern + wsTimePattern; + CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern, pLocale, (CXFA_LocaleMgr *)pMgr); + if (localeValue.IsValid()) { + szParsedValue = FX_UTF8Encode(localeValue.GetValue()); + FXJSE_Value_SetUTF8String(args.GetReturnValue(), szParsedValue); + } else { + FXJSE_Value_SetUTF8String(args.GetReturnValue(), FX_BSTRC("")); + } + } + break; + case XFA_VT_DATE: { + wsPattern = FX_WSTRC(L"date{") + wsPattern; + wsPattern += FX_WSTRC(L"}"); + CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern, pLocale, (CXFA_LocaleMgr *)pMgr); + if (localeValue.IsValid()) { + szParsedValue = FX_UTF8Encode(localeValue.GetValue()); + FXJSE_Value_SetUTF8String(args.GetReturnValue(), szParsedValue); + } else { + FXJSE_Value_SetUTF8String(args.GetReturnValue(), FX_BSTRC("")); + } + } + break; + case XFA_VT_TIME: { + wsPattern = FX_WSTRC(L"time{") + wsPattern; + wsPattern += FX_WSTRC(L"}"); + CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern, pLocale, (CXFA_LocaleMgr *)pMgr); + if (localeValue.IsValid()) { + szParsedValue = FX_UTF8Encode(localeValue.GetValue()); + FXJSE_Value_SetUTF8String(args.GetReturnValue(), szParsedValue); + } else { + FXJSE_Value_SetUTF8String(args.GetReturnValue(), FX_BSTRC("")); + } + } + break; + case XFA_VT_TEXT: { + wsPattern = FX_WSTRC(L"text{") + wsPattern; + wsPattern += FX_WSTRC(L"}"); + CXFA_LocaleValue localeValue(XFA_VT_TEXT, wsValue, wsPattern, pLocale, (CXFA_LocaleMgr *)pMgr); + if (localeValue.IsValid()) { + szParsedValue = FX_UTF8Encode(localeValue.GetValue()); + FXJSE_Value_SetUTF8String(args.GetReturnValue(), szParsedValue); + } else { + FXJSE_Value_SetUTF8String(args.GetReturnValue(), FX_BSTRC("")); + } + } + break; + case XFA_VT_FLOAT: { + wsPattern = FX_WSTRC(L"num{") + wsPattern; + wsPattern += FX_WSTRC(L"}"); + CXFA_LocaleValue localeValue(XFA_VT_FLOAT, wsValue, wsPattern, pLocale, (CXFA_LocaleMgr *)pMgr); + if (localeValue.IsValid()) { + FXJSE_Value_SetDouble(args.GetReturnValue(), localeValue.GetDoubleNum()); + } else { + FXJSE_Value_SetUTF8String(args.GetReturnValue(), FX_BSTRC("")); + } + } + break; + default: { + CFX_WideString wsTestPattern; + wsTestPattern = FX_WSTRC(L"num{") + wsPattern; + wsTestPattern += FX_WSTRC(L"}"); + CXFA_LocaleValue localeValue(XFA_VT_FLOAT, wsValue, wsTestPattern, pLocale, (CXFA_LocaleMgr *)pMgr); + if (localeValue.IsValid()) { + FXJSE_Value_SetDouble(args.GetReturnValue(), localeValue.GetDoubleNum()); + } else { + wsTestPattern = FX_WSTRC(L"text{") + wsPattern; + wsTestPattern += FX_WSTRC(L"}"); + CXFA_LocaleValue localeValue(XFA_VT_TEXT, wsValue, wsTestPattern, pLocale, (CXFA_LocaleMgr *)pMgr); + if (localeValue.IsValid()) { + szParsedValue = FX_UTF8Encode(localeValue.GetValue()); + FXJSE_Value_SetUTF8String(args.GetReturnValue(), szParsedValue); + } else { + FXJSE_Value_SetUTF8String(args.GetReturnValue(), FX_BSTRC("")); + } + } + } + break; + } + } + } + FXJSE_Value_Release(argOne); + FXJSE_Value_Release(argTwo); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Parse")); + } +} +void CXFA_FM2JSContext::Replace(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + FX_INT32 argc = args.GetLength(); + if ((argc == 2) || (argc == 3)) { + FX_BOOL bFlags = FALSE; + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); + FXJSE_HVALUE argThree = 0; + CFX_ByteString oneString; + CFX_ByteString twoString; + CFX_ByteString threeString; + if ((HValueIsNull(hThis, argOne)) || (HValueIsNull(hThis, argTwo))) { + bFlags = TRUE; + } else { + HValueToUTF8String(argOne, oneString); + HValueToUTF8String(argTwo, twoString); + } + if (argc == 3) { + argThree = GetSimpleHValue(hThis, args, 2); + HValueToUTF8String(argThree, threeString); + } + FX_INT32 iSrcLen = oneString.GetLength(); + FX_INT32 iFindLen = twoString.GetLength(); + CFX_ByteTextBuf resultString; + FX_INT32 iFindIndex = 0; + FX_BYTE ch = 0; + for (FX_INT32 u = 0; u < iSrcLen; ++u) { + ch = oneString.GetAt(u); + if (ch == twoString.GetAt(iFindIndex)) { + FX_INT32 iTemp = u + 1; + ++iFindIndex; + FX_BYTE chTemp = 0; + while (iFindIndex < iFindLen) { + chTemp = oneString.GetAt(iTemp); + if (chTemp == twoString.GetAt(iFindIndex)) { + ++iTemp; + ++iFindIndex; + } else { + iFindIndex = 0; + break; + } + } + if (iFindIndex == iFindLen) { + resultString << threeString; + u += iFindLen - 1; + iFindIndex = 0; + } else { + resultString.AppendChar(ch); + } + } else { + resultString.AppendChar(ch); + } + } + resultString.AppendChar(0); + FXJSE_Value_SetUTF8String(args.GetReturnValue(), resultString.GetByteString()); + FXJSE_Value_Release(argOne); + FXJSE_Value_Release(argTwo); + if(argc == 3) { + FXJSE_Value_Release(argThree); + } + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Replace")); + } +} +void CXFA_FM2JSContext::Right(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + if (args.GetLength() == 2) { + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); + FX_BOOL argIsNull = FALSE; + if ((HValueIsNull(hThis, argOne)) || (HValueIsNull(hThis, argTwo))) { + argIsNull = TRUE; + } + if (argIsNull) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + CFX_ByteString sourceString; + HValueToUTF8String(argOne, sourceString); + FX_INT32 count = HValueToInteger(hThis, argTwo); + if (count < 0) { + count = 0; + } + FXJSE_Value_SetUTF8String(args.GetReturnValue(), sourceString.Right(count)); + } + FXJSE_Value_Release(argOne); + FXJSE_Value_Release(argTwo); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Right")); + } +} +void CXFA_FM2JSContext::Rtrim(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + if (args.GetLength() == 1) { + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + if (HValueIsNull(hThis, argOne)) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + CFX_ByteString sourceString; + HValueToUTF8String(argOne, sourceString); + sourceString.TrimRight(); + FXJSE_Value_SetUTF8String(args.GetReturnValue(), sourceString); + } + FXJSE_Value_Release(argOne); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Rtrim")); + } +} +void CXFA_FM2JSContext::Space(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + if (args.GetLength() == 1) { + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + if (FXJSE_Value_IsNull(argOne)) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + FX_INT32 count = 0; + count = HValueToInteger(hThis, argOne); + count = (count < 0) ? 0 : count; + CFX_ByteTextBuf spaceString; + FX_INT32 index = 0; + while (index < count) { + spaceString.AppendByte(' '); + index++; + } + spaceString.AppendByte(0); + FXJSE_Value_SetUTF8String(args.GetReturnValue(), spaceString.GetByteString()); + } + FXJSE_Value_Release(argOne); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Space")); + } +} +void CXFA_FM2JSContext::Str(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + FX_INT32 argc = args.GetLength(); + if ((argc > 0) && (argc < 4)) { + FX_BOOL bFlags = FALSE; + FX_FLOAT fNumber; + FX_INT32 iWidth = 10; + FX_INT32 iPrecision = 0; + FXJSE_HVALUE numberValue = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE widthValue = 0; + FXJSE_HVALUE precisionValue = 0; + if(FXJSE_Value_IsNull(numberValue)) { + bFlags = TRUE; + } else { + fNumber = HValueToFloat(hThis, numberValue); + } + if(argc > 1) { + widthValue = GetSimpleHValue(hThis, args, 1); + iWidth = (FX_INT32)HValueToFloat(hThis, widthValue); + } + if (argc == 3) { + precisionValue = GetSimpleHValue(hThis, args, 2); + iPrecision = (FX_INT32)HValueToFloat(hThis, precisionValue); + if (iPrecision < 0) { + iPrecision = 0; + } + } + if (!bFlags) { + CFX_ByteString numberString; + CFX_ByteString formatStr = "%"; + if (iPrecision) { + formatStr += "."; + formatStr += CFX_ByteString::FormatInteger(iPrecision); + } + formatStr += "f"; + numberString.Format(formatStr, fNumber); + FX_LPCSTR pData = numberString; + FX_INT32 iLength = numberString.GetLength(); + FX_INT32 u = 0; + while (u < iLength) { + if (*(pData + u) == '.') { + break; + } + ++u; + } + CFX_ByteTextBuf resultBuf; + if (u > iWidth || (iPrecision + u) >= iWidth) { + FX_INT32 i = 0; + while (i < iWidth) { + resultBuf.AppendChar('*'); + ++i; + } + resultBuf.AppendChar(0); + } else { + if (u == iLength) { + if (iLength > iWidth) { + FX_INT32 i = 0; + while (i < iWidth) { + resultBuf.AppendChar('*'); + ++i; + } + } else { + FX_INT32 i = 0; + FX_INT32 iSpace = iWidth - iLength; + while (i < iSpace) { + resultBuf.AppendChar(' '); + ++i; + } + resultBuf << pData; + } + } else { + FX_INT32 iLeavingSpace = 0; + if (iPrecision == 0) { + iLeavingSpace = iWidth - (u + iPrecision); + } else { + iLeavingSpace = iWidth - (u + iPrecision + 1); + } + FX_INT32 i = 0; + while (i < iLeavingSpace) { + resultBuf.AppendChar(' '); + ++i; + } + i = 0; + while (i < u) { + resultBuf.AppendChar(*(pData + i)); + ++i; + } + if (iPrecision != 0) { + resultBuf.AppendChar('.'); + } + u++; + i = 0; + while (u < iLength) { + if (i >= iPrecision) { + break; + } + resultBuf.AppendChar(*(pData + u)); + ++i; + ++u; + } + while (i < iPrecision) { + resultBuf.AppendChar('0'); + ++i; + } + resultBuf.AppendChar(0); + } + } + FXJSE_Value_SetUTF8String(args.GetReturnValue(), resultBuf.GetByteString()); + } else { + FXJSE_Value_SetNull(args.GetReturnValue()); + } + FXJSE_Value_Release(numberValue); + if (argc > 1) { + FXJSE_Value_Release(widthValue); + if (argc == 3) { + FXJSE_Value_Release(precisionValue); + } + } + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Str")); + } +} +void CXFA_FM2JSContext::Stuff(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + FX_INT32 argc = args.GetLength(); + if ((argc == 3) || (argc == 4)) { + FX_BOOL bFlags = FALSE; + CFX_ByteString sourceString; + CFX_ByteString insertString; + FX_INT32 iLength = 0; + FX_INT32 iStart = 0; + FX_INT32 iDelete = 0; + FXJSE_HVALUE sourceValue = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE startValue = GetSimpleHValue(hThis, args, 1); + FXJSE_HVALUE deleteValue = GetSimpleHValue(hThis, args, 2); + FXJSE_HVALUE insertValue = 0; + if ((FXJSE_Value_IsNull(sourceValue)) || (FXJSE_Value_IsNull(startValue)) || (FXJSE_Value_IsNull(deleteValue))) { + bFlags = TRUE; + } else { + HValueToUTF8String(sourceValue, sourceString); + iLength = sourceString.GetLength(); + iStart = (FX_INT32)HValueToFloat(hThis, startValue); + if (iStart < 1) { + iStart = 1; + } + if (iStart > iLength) { + iStart = iLength; + } + iDelete = (FX_INT32)HValueToFloat(hThis, deleteValue); + if (iDelete <= 0) { + iDelete = 0; + } + } + if (argc == 4) { + insertValue = GetSimpleHValue(hThis, args, 3); + HValueToUTF8String(insertValue, insertString); + } + iStart -= 1; + CFX_ByteTextBuf resultString; + FX_INT32 i = 0; + while (i < iStart) { + resultString.AppendChar(sourceString.GetAt(i)); + ++i; + } + resultString << insertString; + i = iStart + iDelete; + while (i < iLength) { + resultString.AppendChar(sourceString.GetAt(i)); + ++i; + } + resultString.AppendChar(0); + FXJSE_Value_SetUTF8String(args.GetReturnValue(), resultString.GetByteString()); + FXJSE_Value_Release(sourceValue); + FXJSE_Value_Release(startValue); + FXJSE_Value_Release(deleteValue); + if (argc == 4) { + FXJSE_Value_Release(insertValue); + } + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Stuff")); + } +} +void CXFA_FM2JSContext::Substr(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + FX_INT32 argc = args.GetLength(); + if(argc == 3) { + FXJSE_HVALUE stringValue = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE startValue = GetSimpleHValue(hThis, args, 1); + FXJSE_HVALUE endValue = GetSimpleHValue(hThis, args, 2); + if (HValueIsNull(hThis, stringValue) || (HValueIsNull(hThis, startValue)) || (HValueIsNull(hThis, endValue))) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + CFX_ByteString szSourceStr; + FX_INT32 iStart = 0; + FX_INT32 iCount = 0; + HValueToUTF8String(stringValue, szSourceStr); + FX_INT32 iLength = szSourceStr.GetLength(); + if (iLength == 0) { + FXJSE_Value_SetUTF8String(args.GetReturnValue(), FX_BSTRC("")); + } else { + iStart = (FX_INT32)HValueToFloat(hThis, startValue); + iCount = (FX_INT32)HValueToFloat(hThis, endValue); + if (iStart < 1) { + iStart = 1; + } + if (iStart > iLength) { + iStart = iLength; + } + if (iCount <= 0) { + iCount = 0; + } + iStart -= 1; + FXJSE_Value_SetUTF8String(args.GetReturnValue(), szSourceStr.Mid(iStart, iCount)); + } + } + FXJSE_Value_Release(stringValue); + FXJSE_Value_Release(startValue); + FXJSE_Value_Release(endValue); + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Substr")); + } +} +void CXFA_FM2JSContext::Uuid(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + FX_INT32 argc = args.GetLength(); + if((argc == 0) || (argc == 1)) { + FX_INT32 iNum = 0; + FXJSE_HVALUE argOne = 0; + if(argc == 1) { + argOne = GetSimpleHValue(hThis, args, 0); + iNum = (FX_INT32)HValueToFloat(hThis, argOne); + } + FX_GUID guid; + FX_GUID_CreateV4(&guid); + CFX_ByteString bsUId; + FX_GUID_ToString(&guid, bsUId, iNum); + FXJSE_Value_SetUTF8String(args.GetReturnValue(), bsUId); + if(argc == 1) { + FXJSE_Value_Release(argOne); + } + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Uuid")); + } +} +void CXFA_FM2JSContext::Upper(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + FX_INT32 argc = args.GetLength(); + if ((argc > 0) && (argc < 3)) { + CFX_ByteString argString; + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE localeValue = 0; + if(HValueIsNull(hThis, argOne)) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + if(argc == 2) { + localeValue = GetSimpleHValue(hThis, args, 1); + } + HValueToUTF8String(argOne, argString); + CFX_WideTextBuf upperStringBuf; + CFX_WideString wsArgString = CFX_WideString::FromUTF8(argString, argString.GetLength()); + FX_LPCWSTR pData = wsArgString; + FX_INT32 iLen = wsArgString.GetLength(); + FX_INT32 i = 0; + FX_INT32 ch = 0; + while (i < iLen) { + ch = *(pData + i); + if (ch >= 0x61 && ch <= 0x7A) { + ch -= 32; + } else if (ch >= 0xE0 && ch <= 0xFE) { + ch -= 32; + } else if (ch == 0x101 || ch == 0x103 || ch == 0x105) { + ch -= 1; + } + upperStringBuf.AppendChar(ch); + ++i; + } + upperStringBuf.AppendChar(0); + FXJSE_Value_SetUTF8String(args.GetReturnValue(), FX_UTF8Encode(upperStringBuf.GetBuffer(), upperStringBuf.GetLength())); + if(argc == 2) { + FXJSE_Value_Release(localeValue); + } + } + FXJSE_Value_Release(argOne); + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Upper")); + } +} +void CXFA_FM2JSContext::WordNum(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + FX_INT32 argc = args.GetLength(); + if ((argc > 0) && (argc < 4)) { + FX_BOOL bFlags = FALSE; + FX_FLOAT fNumber; + FX_INT32 iIdentifier = 0; + CFX_ByteString localeString; + FXJSE_HVALUE numberValue = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE identifierValue = 0; + FXJSE_HVALUE localeValue = 0; + if(FXJSE_Value_IsNull(numberValue)) { + bFlags = TRUE; + } else { + fNumber = HValueToFloat(hThis, numberValue); + } + if(argc > 1) { + identifierValue = GetSimpleHValue(hThis, args, 1); + if (FXJSE_Value_IsNull(identifierValue)) { + bFlags = TRUE; + } else { + iIdentifier = (FX_INT32)HValueToFloat(hThis, identifierValue); + } + } + if (argc == 3) { + localeValue = GetSimpleHValue(hThis, args, 2); + if (FXJSE_Value_IsNull(localeValue)) { + bFlags = TRUE; + } else { + HValueToUTF8String(localeValue, localeString); + } + } + if (!bFlags) { + if ((fNumber < 0) || (fNumber > 922337203685477550)) { + FXJSE_Value_SetUTF8String(args.GetReturnValue(), FX_BSTRC("*")); + } else { + CFX_ByteTextBuf resultBuf; + CFX_ByteString numberString; + numberString.Format("%.2f", fNumber); + WordUS(numberString, iIdentifier, resultBuf); + FXJSE_Value_SetUTF8String(args.GetReturnValue(), resultBuf.GetByteString()); + } + } else { + FXJSE_Value_SetNull(args.GetReturnValue()); + } + FXJSE_Value_Release(numberValue); + if (argc > 1) { + FXJSE_Value_Release(identifierValue); + if (argc == 3) { + FXJSE_Value_Release(localeValue); + } + } + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"WordNum")); + } +} +void CXFA_FM2JSContext::TrillionUS(FX_BSTR szData, CFX_ByteTextBuf &strBuf) +{ + CFX_ByteStringC pUnits[] = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"}; + CFX_ByteStringC pCapUnits[] = { "Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"}; + CFX_ByteStringC pTens[] = {"Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"}; + CFX_ByteStringC pLastTens[] = {"Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"}; + CFX_ByteStringC pComm[] = {" Hundred ", " Thousand ", " Million ", " Billion ", "Trillion"}; + FX_INT32 iComm = 0; + FX_LPCSTR pData = szData.GetCStr(); + FX_INT32 iLength = szData.GetLength(); + if (iLength > 12) { + iComm = 4; + } else if (iLength > 9) { + iComm = 3; + } else if (iLength > 6) { + iComm = 2; + } else if (iLength > 3) { + iComm = 1; + } + FX_INT32 iIndex = 0; + FX_INT32 iFirstCount = iLength % 3; + if (iFirstCount == 0) { + iFirstCount = 3; + } + if (iFirstCount == 3) { + if (*(pData + iIndex) != '0') { + strBuf << pCapUnits[*(pData + iIndex) - '0']; + strBuf << pComm[0]; + } + if (*(pData + iIndex + 1) == '0') { + strBuf << pCapUnits[*(pData + iIndex + 2) - '0']; + } else { + if (*(pData + iIndex + 1) > '1') { + strBuf << pLastTens[*(pData + iIndex + 1) - '2']; + strBuf << FX_BSTRC("-"); + strBuf << pUnits[*(pData + iIndex + 2) - '0']; + } else if (*(pData + iIndex + 1) == '1') { + strBuf << pTens[*(pData + iIndex + 2) - '0']; + } else if (*(pData + iIndex + 1) == '0') { + strBuf << pCapUnits[*(pData + iIndex + 2) - '0']; + } + } + iIndex += 3; + } else if (iFirstCount == 2) { + if (*(pData + iIndex) == '0') { + strBuf << pCapUnits[*(pData + iIndex + 1) - '0']; + } else { + if (*(pData + iIndex) > '1') { + strBuf << pLastTens[*(pData + iIndex) - '2']; + strBuf << FX_BSTRC("-"); + strBuf << pUnits[*(pData + iIndex + 1) - '0']; + } else if (*(pData + iIndex) == '1') { + strBuf << pTens[*(pData + iIndex + 1) - '0']; + } else if (*(pData + iIndex) == '0') { + strBuf << pCapUnits[*(pData + iIndex + 1) - '0']; + } + } + iIndex += 2; + } else if (iFirstCount == 1) { + strBuf << pCapUnits[*(pData + iIndex) - '0']; + iIndex += 1; + } + if (iLength > 3 && iFirstCount > 0) { + strBuf << pComm[iComm]; + --iComm; + } + while (iIndex < iLength) { + if (*(pData + iIndex) != '0') { + strBuf << pCapUnits[*(pData + iIndex) - '0']; + strBuf << pComm[0]; + } + if (*(pData + iIndex + 1) == '0') { + strBuf << pCapUnits[*(pData + iIndex + 2) - '0']; + } else { + if (*(pData + iIndex + 1) > '1') { + strBuf << pLastTens[*(pData + iIndex + 1) - '2']; + strBuf << FX_BSTRC("-"); + strBuf << pUnits[*(pData + iIndex + 2) - '0']; + } else if (*(pData + iIndex + 1) == '1') { + strBuf << pTens[*(pData + iIndex + 2) - '0']; + } else if (*(pData + iIndex + 1) == '0') { + strBuf << pCapUnits[*(pData + iIndex + 2) - '0']; + } + } + if (iIndex < iLength - 3) { + strBuf << pComm[iComm]; + --iComm; + } + iIndex += 3; + } +} +void CXFA_FM2JSContext::WordUS(FX_BSTR szData, FX_INT32 iStyle, CFX_ByteTextBuf &strBuf) +{ + FX_LPCSTR pData = szData.GetCStr(); + FX_INT32 iLength = szData.GetLength(); + switch (iStyle) { + case 0: { + FX_INT32 iIndex = 0; + while (iIndex < iLength) { + if (*(pData + iIndex) == '.') { + break; + } + ++iIndex; + } + iLength = iIndex; + iIndex = 0; + FX_INT32 iCount = 0; + while (iIndex < iLength) { + iCount = (iLength - iIndex) % 12; + if (!iCount && iLength - iIndex > 0) { + iCount = 12; + } + TrillionUS(CFX_ByteStringC(pData + iIndex, iCount), strBuf); + iIndex += iCount; + if (iIndex < iLength) { + strBuf << FX_BSTRC(" Trillion "); + } + } + } + break; + case 1: { + FX_INT32 iIndex = 0; + while (iIndex < iLength) { + if (*(pData + iIndex) == '.') { + break; + } + ++iIndex; + } + iLength = iIndex; + iIndex = 0; + FX_INT32 iCount = 0; + while (iIndex < iLength) { + iCount = (iLength - iIndex) % 12; + if (!iCount && iLength - iIndex > 0) { + iCount = 12; + } + TrillionUS(CFX_ByteStringC(pData + iIndex, iCount), strBuf); + iIndex += iCount; + if (iIndex < iLength) { + strBuf << FX_BSTRC(" Trillion "); + } + } + strBuf << FX_BSTRC(" Dollars"); + } + break; + case 2: { + FX_INT32 iIndex = 0; + while (iIndex < iLength) { + if (*(pData + iIndex) == '.') { + break; + } + ++iIndex; + } + FX_INT32 iInteger = iIndex; + iIndex = 0; + FX_INT32 iCount = 0; + while (iIndex < iInteger) { + iCount = (iInteger - iIndex) % 12; + if (!iCount && iLength - iIndex > 0) { + iCount = 12; + } + TrillionUS(CFX_ByteStringC(pData + iIndex, iCount), strBuf); + iIndex += iCount; + if (iIndex < iInteger) { + strBuf << FX_BSTRC(" Trillion "); + } + } + strBuf << FX_BSTRC(" Dollars"); + if (iInteger < iLength) { + strBuf << FX_BSTRC(" And "); + iIndex = iInteger + 1; + FX_INT32 iCount = 0; + while (iIndex < iLength) { + iCount = (iLength - iIndex) % 12; + if (!iCount && iLength - iIndex > 0) { + iCount = 12; + } + TrillionUS(CFX_ByteStringC(pData + iIndex, iCount), strBuf); + iIndex += iCount; + if (iIndex < iLength) { + strBuf << FX_BSTRC(" Trillion "); + } + } + strBuf << FX_BSTRC(" Cents"); + } + } + break; + default: + break; + } +} +void CXFA_FM2JSContext::Get(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FX_INT32 argc = args.GetLength(); + if (argc == 1) { + CXFA_Document *pDoc = pContext->GetDocument(); + if(!pDoc) { + return; + } + IXFA_AppProvider* pAppProvider = pDoc->GetParser()->GetNotify()->GetAppProvider(); + if(!pAppProvider) { + return; + } + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + CFX_ByteString urlString; + HValueToUTF8String(argOne, urlString); + IFX_FileRead* pFile = pAppProvider->DownloadURL(CFX_WideString::FromUTF8(urlString, urlString.GetLength())); + if (pFile) { + FX_INT32 size = pFile->GetSize(); + FX_LPBYTE pData = FX_Alloc(FX_BYTE, size); + if(pData) { + pFile->ReadBlock(pData, size); + FXJSE_Value_SetUTF8String(args.GetReturnValue(), CFX_ByteStringC(pData, size)); + FX_Free(pData); + } + pFile->Release(); + } + FXJSE_Value_Release(argOne); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Get")); + } +} +void CXFA_FM2JSContext::Post(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FX_INT32 argc = args.GetLength(); + if((argc >= 2) && (argc <= 5)) { + CXFA_Document *pDoc = pContext->GetDocument(); + if(!pDoc) { + return; + } + IXFA_AppProvider* pAppProvider = pDoc->GetParser()->GetNotify()->GetAppProvider(); + if(!pAppProvider) { + return; + } + CFX_ByteString bsURL; + CFX_ByteString bsData; + CFX_ByteString bsContentType; + CFX_ByteString bsEncode; + CFX_ByteString bsHeader; + FXJSE_HVALUE argOne; + FXJSE_HVALUE argTwo; + FXJSE_HVALUE argThree; + FXJSE_HVALUE argFour; + FXJSE_HVALUE argFive; + argOne = GetSimpleHValue(hThis, args, 0); + HValueToUTF8String(argOne, bsURL); + argTwo = GetSimpleHValue(hThis, args, 1); + HValueToUTF8String(argTwo, bsData); + if(argc > 2) { + argThree = GetSimpleHValue(hThis, args, 2); + HValueToUTF8String(argThree, bsContentType); + } + if(argc > 3) { + argFour = GetSimpleHValue(hThis, args, 3); + HValueToUTF8String(argFour, bsEncode); + } + if(argc > 4) { + argFive = GetSimpleHValue(hThis, args, 4); + HValueToUTF8String(argFive, bsHeader); + } + CFX_WideString decodedResponse; + FX_BOOL bFlags = pAppProvider->PostRequestURL(CFX_WideString::FromUTF8(bsURL, bsURL.GetLength()), CFX_WideString::FromUTF8(bsData, bsData.GetLength()), + CFX_WideString::FromUTF8(bsContentType, bsContentType.GetLength()), CFX_WideString::FromUTF8(bsEncode, bsEncode.GetLength()), + CFX_WideString::FromUTF8(bsHeader, bsHeader.GetLength()), decodedResponse); + FXJSE_Value_Release(argOne); + FXJSE_Value_Release(argTwo); + if(argc > 2) { + FXJSE_Value_Release(argThree); + } + if(argc > 3) { + FXJSE_Value_Release(argFour); + } + if(argc > 4) { + FXJSE_Value_Release(argFive); + } + if(bFlags) { + FXJSE_Value_SetUTF8String(args.GetReturnValue(), FX_UTF8Encode(decodedResponse, decodedResponse.GetLength())); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_SERVER_DENY); + } + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Post")); + } +} +void CXFA_FM2JSContext::Put(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FX_INT32 argc = args.GetLength(); + if((argc == 2) || (argc == 3)) { + CXFA_Document *pDoc = pContext->GetDocument(); + if(!pDoc) { + return; + } + IXFA_AppProvider* pAppProvider = pDoc->GetParser()->GetNotify()->GetAppProvider(); + if(!pAppProvider) { + return; + } + CFX_ByteString bsURL; + CFX_ByteString bsData; + CFX_ByteString bsEncode; + FXJSE_HVALUE argOne; + FXJSE_HVALUE argTwo; + FXJSE_HVALUE argThree; + argOne = GetSimpleHValue(hThis, args, 0); + HValueToUTF8String(argOne, bsURL); + argTwo = GetSimpleHValue(hThis, args, 1); + HValueToUTF8String(argTwo, bsData); + if(argc > 2) { + argThree = GetSimpleHValue(hThis, args, 2); + HValueToUTF8String(argThree, bsEncode); + } + FX_BOOL bFlags = pAppProvider->PutRequestURL(CFX_WideString::FromUTF8(bsURL, bsURL.GetLength()), CFX_WideString::FromUTF8(bsData, bsData.GetLength()), + CFX_WideString::FromUTF8(bsEncode, bsEncode.GetLength())); + FXJSE_Value_Release(argOne); + FXJSE_Value_Release(argTwo); + if(argc > 2) { + FXJSE_Value_Release(argThree); + } + if(bFlags) { + FXJSE_Value_SetUTF8String(args.GetReturnValue(), FX_BSTRC("")); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_SERVER_DENY); + } + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Put")); + } +} +void CXFA_FM2JSContext::assign_value_operator(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + if(args.GetLength() == 2 ) { + FXJSE_HVALUE lValue = args.GetValue(0); + FXJSE_HVALUE rValue = GetSimpleHValue(hThis, args, 1); + FX_BOOL bSetStatus = TRUE; + if (FXJSE_Value_IsArray(lValue)) { + FXJSE_HVALUE leftLengthValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectProp(lValue, FX_BSTRC("length"), leftLengthValue); + FX_INT32 iLeftLength = FXJSE_Value_ToInteger(leftLengthValue); + FXJSE_Value_Release(leftLengthValue); + FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime); + FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectPropByIdx(lValue, 1, propertyValue); + if (FXJSE_Value_IsNull(propertyValue)) { + for (FX_INT32 i = 2; i < iLeftLength; i++) { + FXJSE_Value_GetObjectPropByIdx(lValue, i, jsObjectValue); + bSetStatus = SetObjectDefaultValue(jsObjectValue, rValue); + if (!bSetStatus) { + pContext->ThrowScriptErrorMessage(XFA_IDS_NOT_DEFAUL_VALUE); + break; + } + } + } else { + CFX_ByteString propertyStr; + FXJSE_Value_ToUTF8String(propertyValue, propertyStr); + for (FX_INT32 i = 2; i < iLeftLength; i++) { + FXJSE_Value_GetObjectPropByIdx(lValue, i, jsObjectValue); + FXJSE_Value_SetObjectProp(jsObjectValue, propertyStr, rValue); + } + } + FXJSE_Value_Release(jsObjectValue); + FXJSE_Value_Release(propertyValue); + } else if (FXJSE_Value_IsObject(lValue)) { + bSetStatus = SetObjectDefaultValue(lValue, rValue); + if (!bSetStatus) { + pContext->ThrowScriptErrorMessage(XFA_IDS_NOT_DEFAUL_VALUE); + } + } + FXJSE_Value_Set(args.GetReturnValue(), rValue); + FXJSE_Value_Release(lValue); + FXJSE_Value_Release(rValue); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); + } +} +void CXFA_FM2JSContext::logical_or_operator(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + if (args.GetLength() == 2) { + FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1); + if (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + FX_FLOAT first = HValueToFloat(hThis, argFirst); + FX_FLOAT second = HValueToFloat(hThis, argSecond); + FXJSE_Value_SetInteger(args.GetReturnValue(), (first || second) ? 1 : 0); + } + FXJSE_Value_Release(argFirst); + FXJSE_Value_Release(argSecond); + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); + } +} +void CXFA_FM2JSContext::logical_and_operator(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + if (args.GetLength() == 2) { + FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1); + if (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + FX_FLOAT first = HValueToFloat(hThis, argFirst); + FX_FLOAT second = HValueToFloat(hThis, argSecond); + FXJSE_Value_SetInteger(args.GetReturnValue(), (first && second) ? 1 : 0); + } + FXJSE_Value_Release(argFirst); + FXJSE_Value_Release(argSecond); + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); + } +} +void CXFA_FM2JSContext::equality_operator(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + if (args.GetLength() == 2) { + if (fm_ref_equal(hThis, args)) { + FXJSE_Value_SetInteger(args.GetReturnValue(), 1); + } else { + FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1); + if (FXJSE_Value_IsNull(argFirst) || FXJSE_Value_IsNull(argSecond)) { + FXJSE_Value_SetInteger(args.GetReturnValue(), (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) ? 1 : 0); + } else if (FXJSE_Value_IsUTF8String(argFirst) && FXJSE_Value_IsUTF8String(argSecond)) { + CFX_ByteString firstOutput; + CFX_ByteString secondOutput; + FXJSE_Value_ToUTF8String(argFirst, firstOutput); + FXJSE_Value_ToUTF8String(argSecond, secondOutput); + FXJSE_Value_SetInteger(args.GetReturnValue(), firstOutput.Equal(secondOutput) ? 1 : 0); + } else { + FX_DOUBLE first = HValueToDouble(hThis, argFirst); + FX_DOUBLE second = HValueToDouble(hThis, argSecond); + FXJSE_Value_SetInteger(args.GetReturnValue(), (first == second) ? 1 : 0); + } + FXJSE_Value_Release(argFirst); + FXJSE_Value_Release(argSecond); + } + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); + } +} +void CXFA_FM2JSContext::notequality_operator(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + if (args.GetLength() == 2) { + if (fm_ref_equal(hThis, args)) { + FXJSE_Value_SetInteger(args.GetReturnValue(), 0); + } else { + FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1); + if (FXJSE_Value_IsNull(argFirst) || FXJSE_Value_IsNull(argSecond)) { + FXJSE_Value_SetInteger(args.GetReturnValue(), (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) ? 0 : 1); + } else if (FXJSE_Value_IsUTF8String(argFirst) && FXJSE_Value_IsUTF8String(argSecond)) { + CFX_ByteString firstOutput; + CFX_ByteString secondOutput; + FXJSE_Value_ToUTF8String(argFirst, firstOutput); + FXJSE_Value_ToUTF8String(argSecond, secondOutput); + FXJSE_Value_SetInteger(args.GetReturnValue(), firstOutput.Equal(secondOutput) ? 0 : 1); + } else { + FX_DOUBLE first = HValueToDouble(hThis, argFirst); + FX_DOUBLE second = HValueToDouble(hThis, argSecond); + FXJSE_Value_SetInteger(args.GetReturnValue(), (first == second) ? 0 : 1); + } + FXJSE_Value_Release(argFirst); + FXJSE_Value_Release(argSecond); + } + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); + } +} +FX_BOOL CXFA_FM2JSContext::fm_ref_equal(FXJSE_HOBJECT hThis, CFXJSE_Arguments &args) +{ + FX_BOOL bRet = FALSE; + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + FXJSE_HVALUE argFirst = args.GetValue(0); + FXJSE_HVALUE argSecond = args.GetValue(0); + if (FXJSE_Value_IsArray(argFirst) && FXJSE_Value_IsArray(argSecond)) { + FXJSE_HVALUE firstFlagValue = FXJSE_Value_Create(hruntime); + FXJSE_HVALUE secondFlagValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectPropByIdx(argFirst, 0, firstFlagValue); + FXJSE_Value_GetObjectPropByIdx(argSecond, 0, secondFlagValue); + if ((FXJSE_Value_ToInteger(firstFlagValue) == 3) && (FXJSE_Value_ToInteger(secondFlagValue) == 3)) { + FXJSE_HVALUE firstJSObject = FXJSE_Value_Create(hruntime); + FXJSE_HVALUE secondJSObject = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectPropByIdx(argFirst, 2, firstJSObject); + FXJSE_Value_GetObjectPropByIdx(argSecond, 2, secondJSObject); + if (!FXJSE_Value_IsNull(firstJSObject) && !FXJSE_Value_IsNull(secondJSObject)) { + bRet = (FXJSE_Value_ToObject(firstJSObject, NULL) == FXJSE_Value_ToObject(secondJSObject, NULL)); + } + FXJSE_Value_Release(firstJSObject); + FXJSE_Value_Release(secondJSObject); + } + FXJSE_Value_Release(firstFlagValue); + FXJSE_Value_Release(secondFlagValue); + } + FXJSE_Value_Release(argFirst); + FXJSE_Value_Release(argSecond); + return bRet; +} +void CXFA_FM2JSContext::less_operator(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + if (args.GetLength() == 2) { + FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1); + if (FXJSE_Value_IsNull(argFirst) || FXJSE_Value_IsNull(argSecond)) { + FXJSE_Value_SetInteger(args.GetReturnValue(), 0); + } else if (FXJSE_Value_IsUTF8String(argFirst) && FXJSE_Value_IsUTF8String(argSecond)) { + CFX_ByteString firstOutput; + CFX_ByteString secondOutput; + FXJSE_Value_ToUTF8String(argFirst, firstOutput); + FXJSE_Value_ToUTF8String(argSecond, secondOutput); + FXJSE_Value_SetInteger(args.GetReturnValue(), (firstOutput.Compare(secondOutput) == -1) ? 1 : 0); + } else { + FX_DOUBLE first = HValueToDouble(hThis, argFirst); + FX_DOUBLE second = HValueToDouble(hThis, argSecond); + FXJSE_Value_SetInteger(args.GetReturnValue(), (first < second) ? 1 : 0); + } + FXJSE_Value_Release(argFirst); + FXJSE_Value_Release(argSecond); + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); + } +} +void CXFA_FM2JSContext::lessequal_operator(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + if (args.GetLength() == 2) { + FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1); + if (FXJSE_Value_IsNull(argFirst) || FXJSE_Value_IsNull(argSecond)) { + FXJSE_Value_SetInteger(args.GetReturnValue(), (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) ? 1 : 0); + } else if (FXJSE_Value_IsUTF8String(argFirst) && FXJSE_Value_IsUTF8String(argSecond)) { + CFX_ByteString firstOutput; + CFX_ByteString secondOutput; + FXJSE_Value_ToUTF8String(argFirst, firstOutput); + FXJSE_Value_ToUTF8String(argSecond, secondOutput); + FXJSE_Value_SetInteger(args.GetReturnValue(), (firstOutput.Compare(secondOutput) != 1) ? 1 : 0); + } else { + FX_DOUBLE first = HValueToDouble(hThis, argFirst); + FX_DOUBLE second = HValueToDouble(hThis, argSecond); + FXJSE_Value_SetInteger(args.GetReturnValue(), (first <= second) ? 1 : 0); + } + FXJSE_Value_Release(argFirst); + FXJSE_Value_Release(argSecond); + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); + } +} +void CXFA_FM2JSContext::greater_operator(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + if (args.GetLength() == 2) { + FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1); + if (FXJSE_Value_IsNull(argFirst) || FXJSE_Value_IsNull(argSecond)) { + FXJSE_Value_SetInteger(args.GetReturnValue(), 0); + } else if (FXJSE_Value_IsUTF8String(argFirst) && FXJSE_Value_IsUTF8String(argSecond)) { + CFX_ByteString firstOutput; + CFX_ByteString secondOutput; + FXJSE_Value_ToUTF8String(argFirst, firstOutput); + FXJSE_Value_ToUTF8String(argSecond, secondOutput); + FXJSE_Value_SetInteger(args.GetReturnValue(), (firstOutput.Compare(secondOutput) == 1) ? 1 : 0); + } else { + FX_DOUBLE first = HValueToDouble(hThis, argFirst); + FX_DOUBLE second = HValueToDouble(hThis, argSecond); + FXJSE_Value_SetInteger(args.GetReturnValue(), (first > second) ? 1 : 0); + } + FXJSE_Value_Release(argFirst); + FXJSE_Value_Release(argSecond); + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); + } +} +void CXFA_FM2JSContext::greaterequal_operator(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + if (args.GetLength() == 2) { + FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1); + if (FXJSE_Value_IsNull(argFirst) || FXJSE_Value_IsNull(argSecond)) { + FXJSE_Value_SetInteger(args.GetReturnValue(), (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) ? 1 : 0); + } else if (FXJSE_Value_IsUTF8String(argFirst) && FXJSE_Value_IsUTF8String(argSecond)) { + CFX_ByteString firstOutput; + CFX_ByteString secondOutput; + FXJSE_Value_ToUTF8String(argFirst, firstOutput); + FXJSE_Value_ToUTF8String(argSecond, secondOutput); + FXJSE_Value_SetInteger(args.GetReturnValue(), (firstOutput.Compare(secondOutput) != -1) ? 1 : 0); + } else { + FX_DOUBLE first = HValueToDouble(hThis, argFirst); + FX_DOUBLE second = HValueToDouble(hThis, argSecond); + FXJSE_Value_SetInteger(args.GetReturnValue(), (first >= second) ? 1 : 0); + } + FXJSE_Value_Release(argFirst); + FXJSE_Value_Release(argSecond); + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); + } +} +void CXFA_FM2JSContext::plus_operator(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + if (args.GetLength() == 2) { + FXJSE_HVALUE argFirst = args.GetValue(0); + FXJSE_HVALUE argSecond = args.GetValue(1); + if (HValueIsNull(hThis, argFirst) && HValueIsNull(hThis, argSecond)) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + FX_DOUBLE first = HValueToDouble(hThis, argFirst); + FX_DOUBLE second = HValueToDouble(hThis, argSecond); + FXJSE_Value_SetDouble(args.GetReturnValue(), first + second); + } + FXJSE_Value_Release(argFirst); + FXJSE_Value_Release(argSecond); + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); + } +} +void CXFA_FM2JSContext::minus_operator(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + if (args.GetLength() == 2) { + FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1); + if (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + FX_DOUBLE first = HValueToDouble(hThis, argFirst); + FX_DOUBLE second = HValueToDouble(hThis, argSecond); + FXJSE_Value_SetDouble(args.GetReturnValue(), first - second); + } + FXJSE_Value_Release(argFirst); + FXJSE_Value_Release(argSecond); + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); + } +} +void CXFA_FM2JSContext::multiple_operator(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + if (args.GetLength() == 2) { + FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1); + if (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + FX_DOUBLE first = HValueToDouble(hThis, argFirst); + FX_DOUBLE second = HValueToDouble(hThis, argSecond); + FXJSE_Value_SetDouble(args.GetReturnValue(), first * second); + } + FXJSE_Value_Release(argFirst); + FXJSE_Value_Release(argSecond); + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); + } +} +void CXFA_FM2JSContext::divide_operator(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + if (args.GetLength() == 2) { + FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0); + FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1); + if (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + FX_DOUBLE first = HValueToDouble(hThis, argFirst); + FX_DOUBLE second = HValueToDouble(hThis, argSecond); + if (second == 0.0) { + pContext->ThrowScriptErrorMessage(XFA_IDS_DIVIDE_ZERO); + } else { + FXJSE_Value_SetDouble(args.GetReturnValue(), first / second); + } + } + FXJSE_Value_Release(argFirst); + FXJSE_Value_Release(argSecond); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); + } +} +void CXFA_FM2JSContext::positive_operator(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + FX_INT32 iLength = args.GetLength(); + if (iLength == 1) { + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + if (FXJSE_Value_IsNull(argOne)) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + FXJSE_Value_SetDouble(args.GetReturnValue(), 0.0 + HValueToDouble(hThis, argOne)); + } + FXJSE_Value_Release(argOne); + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); + } +} +void CXFA_FM2JSContext::negative_operator(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + FX_INT32 iLength = args.GetLength(); + if (iLength == 1) { + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + if (FXJSE_Value_IsNull(argOne)) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + FXJSE_Value_SetDouble(args.GetReturnValue(), 0.0 - HValueToDouble(hThis, argOne)); + } + FXJSE_Value_Release(argOne); + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); + } +} +void CXFA_FM2JSContext::logical_not_operator(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + FX_INT32 iLength = args.GetLength(); + if (iLength == 1) { + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + if (FXJSE_Value_IsNull(argOne)) { + FXJSE_Value_SetNull(args.GetReturnValue()); + } else { + FX_DOUBLE first = HValueToDouble(hThis, argOne); + FXJSE_Value_SetInteger(args.GetReturnValue(), (first == 0.0) ? 1 : 0); + } + FXJSE_Value_Release(argOne); + } else { + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); + } +} +void CXFA_FM2JSContext::dot_accessor(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + FX_INT32 argc = args.GetLength(); + if((argc == 4) || (argc == 5)) { + FX_BOOL bIsStar = TRUE; + FXJSE_HVALUE argAccessor = args.GetValue(0); + CFX_ByteString bsAccessorName = args.GetUTF8String(1); + CFX_ByteString szName = args.GetUTF8String(2); + FX_INT32 iIndexFlags = args.GetInt32(3); + FX_INT32 iIndexValue = 0; + FXJSE_HVALUE argIndex = NULL; + if(argc == 5) { + bIsStar = FALSE; + argIndex = args.GetValue(4); + iIndexValue = HValueToInteger(hThis, argIndex); + } + CFX_ByteString szSomExp; + GenerateSomExpression(szName, iIndexFlags, iIndexValue, bIsStar, szSomExp); + if(FXJSE_Value_IsArray(argAccessor)) { + FXJSE_HVALUE hLengthValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectProp(argAccessor, FX_BSTRC("length"), hLengthValue); + FX_INT32 iLength = FXJSE_Value_ToInteger(hLengthValue); + FXJSE_Value_Release(hLengthValue); + FX_INT32 iCounter = 0; + FXJSE_HVALUE **hResolveValues = FX_Alloc(FXJSE_HVALUE*, iLength - 2); + FX_INT32 *iSizes = FX_Alloc(FX_INT32, iLength - 2); + for (FX_INT32 i = 0; i < (iLength - 2); i++) { + iSizes[i] = 0; + } + FXJSE_HVALUE hJSObjValue = FXJSE_Value_Create(hruntime); + FX_BOOL bAttribute = FALSE; + for(FX_INT32 i = 2; i < iLength; i++) { + FXJSE_Value_GetObjectPropByIdx(argAccessor, i, hJSObjValue); + XFA_RESOLVENODE_RS resoveNodeRS; + FX_INT32 iRet = ResolveObjects(hThis, hJSObjValue, szSomExp, resoveNodeRS, TRUE, szName.IsEmpty()); + if(iRet > 0) { + ParseResolveResult(hThis, resoveNodeRS, hJSObjValue, hResolveValues[i - 2], iSizes[i - 2], bAttribute); + iCounter += iSizes[i - 2]; + } + } + FXJSE_Value_Release(hJSObjValue); + if (iCounter > 0) { + FXJSE_HVALUE *rgValues = FX_Alloc(FXJSE_HVALUE, iCounter + 2); + for(FX_INT32 i = 0; i < (iCounter + 2); i++) { + rgValues[i] = FXJSE_Value_Create(hruntime); + } + FXJSE_Value_SetInteger(rgValues[0], 1); + if (bAttribute) { + FXJSE_Value_SetUTF8String(rgValues[1], szName); + } else { + FXJSE_Value_SetNull(rgValues[1]); + } + FX_INT32 iIndex = 2; + for(FX_INT32 i = 0; i < iLength - 2; i++) { + for(FX_INT32 j = 0; j < iSizes[i]; j++) { + FXJSE_Value_Set(rgValues[iIndex], hResolveValues[i][j]); + iIndex++; + } + } + FXJSE_Value_SetArray(args.GetReturnValue(), (iCounter + 2), rgValues); + for(FX_INT32 i = 0; i < (iCounter + 2); i++) { + FXJSE_Value_Release(rgValues[i]); + } + FX_Free(rgValues); + } else { + CFX_WideString wsPropertyName = CFX_WideString::FromUTF8(szName, szName.GetLength()); + CFX_WideString wsSomExpression = CFX_WideString::FromUTF8(szSomExp, szSomExp.GetLength()); + pContext->ThrowScriptErrorMessage(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT, (FX_LPCWSTR)wsPropertyName, (FX_LPCWSTR)wsSomExpression); + } + for(FX_INT32 i = 0; i < iLength - 2; i++) { + for(FX_INT32 j = 0; j < iSizes[i]; j++) { + FXJSE_Value_Release(hResolveValues[i][j]); + } + if (iSizes[i] > 0) { + FX_Free(hResolveValues[i]); + } + } + FX_Free(hResolveValues); + FX_Free(iSizes); + } else { + XFA_RESOLVENODE_RS resoveNodeRS; + FX_INT32 iRet = 0; + if (FXJSE_Value_IsObject(argAccessor) || (FXJSE_Value_IsNull(argAccessor) && bsAccessorName.IsEmpty())) { + iRet = ResolveObjects(hThis, argAccessor, szSomExp, resoveNodeRS, TRUE, szName.IsEmpty()); + } else if (!FXJSE_Value_IsObject(argAccessor) && !bsAccessorName.IsEmpty()) { + FX_BOOL bGetObject = GetObjectByName(hThis, argAccessor, bsAccessorName); + if (bGetObject) { + iRet = ResolveObjects(hThis, argAccessor, szSomExp, resoveNodeRS, TRUE, szName.IsEmpty()); + } + } + if(iRet > 0) { + FXJSE_HVALUE *hResolveValues; + FX_INT32 iSize = 0; + FX_BOOL bAttribute = FALSE; + ParseResolveResult(hThis, resoveNodeRS, argAccessor, hResolveValues, iSize, bAttribute); + FXJSE_HVALUE *rgValues = FX_Alloc(FXJSE_HVALUE, iSize + 2); + for(FX_INT32 i = 0; i < (iSize + 2); i++) { + rgValues[i] = FXJSE_Value_Create(hruntime); + } + FXJSE_Value_SetInteger(rgValues[0], 1); + if (bAttribute) { + FXJSE_Value_SetUTF8String(rgValues[1], szName); + } else { + FXJSE_Value_SetNull(rgValues[1]); + } + for(FX_INT32 i = 0; i < iSize; i++) { + FXJSE_Value_Set(rgValues[i + 2], hResolveValues[i]); + } + FXJSE_Value_SetArray(args.GetReturnValue(), (iSize + 2), rgValues); + for(FX_INT32 i = 0; i < (iSize + 2); i++) { + FXJSE_Value_Release(rgValues[i]); + } + FX_Free(rgValues); + for(FX_INT32 i = 0; i < iSize; i++) { + FXJSE_Value_Release(hResolveValues[i]); + } + FX_Free(hResolveValues); + } else { + CFX_WideString wsPropertyName = CFX_WideString::FromUTF8(szName, szName.GetLength()); + CFX_WideString wsSomExpression = CFX_WideString::FromUTF8(szSomExp, szSomExp.GetLength()); + pContext->ThrowScriptErrorMessage(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT, (FX_LPCWSTR)wsPropertyName, (FX_LPCWSTR)wsSomExpression); + } + } + if(argc == 5) { + FXJSE_Value_Release(argIndex); + } + FXJSE_Value_Release(argAccessor); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); + } +} +void CXFA_FM2JSContext::dotdot_accessor(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + FX_INT32 argc = args.GetLength(); + if((argc == 4) || (argc == 5)) { + FX_BOOL bIsStar = TRUE; + FXJSE_HVALUE argAccessor = args.GetValue(0); + CFX_ByteString bsAccessorName = args.GetUTF8String(1); + CFX_ByteString szName = args.GetUTF8String(2); + FX_INT32 iIndexFlags = args.GetInt32(3); + FX_INT32 iIndexValue = 0; + FXJSE_HVALUE argIndex = NULL; + if(argc == 5) { + bIsStar = FALSE; + argIndex = args.GetValue(4); + iIndexValue = HValueToInteger(hThis, argIndex); + } + CFX_ByteString szSomExp; + GenerateSomExpression(szName, iIndexFlags, iIndexValue, bIsStar, szSomExp); + if(FXJSE_Value_IsArray(argAccessor)) { + FXJSE_HVALUE hLengthValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectProp(argAccessor, FX_BSTRC("length"), hLengthValue); + FX_INT32 iLength = FXJSE_Value_ToInteger(hLengthValue); + FX_INT32 iCounter = 0; + FXJSE_HVALUE **hResolveValues = FX_Alloc(FXJSE_HVALUE*, iLength - 2); + FX_INT32 *iSizes = FX_Alloc(FX_INT32, iLength - 2); + FXJSE_HVALUE hJSObjValue = FXJSE_Value_Create(hruntime); + FX_BOOL bAttribute = FALSE; + for(FX_INT32 i = 2; i < iLength; i++) { + FXJSE_Value_GetObjectPropByIdx(argAccessor, i, hJSObjValue); + XFA_RESOLVENODE_RS resoveNodeRS; + FX_INT32 iRet = ResolveObjects(hThis, hJSObjValue, szSomExp, resoveNodeRS, FALSE); + if(iRet > 0) { + ParseResolveResult(hThis, resoveNodeRS, hJSObjValue, hResolveValues[i - 2], iSizes[i - 2], bAttribute); + iCounter += iSizes[i - 2]; + } + } + FXJSE_Value_Release(hJSObjValue); + if (iCounter > 0) { + FXJSE_HVALUE *rgValues = FX_Alloc(FXJSE_HVALUE, iCounter + 2); + for(FX_INT32 i = 0; i < (iCounter + 2); i++) { + rgValues[i] = FXJSE_Value_Create(hruntime); + } + FXJSE_Value_SetInteger(rgValues[0], 1); + if (bAttribute) { + FXJSE_Value_SetUTF8String(rgValues[1], szName); + } else { + FXJSE_Value_SetNull(rgValues[1]); + } + FX_INT32 iIndex = 2; + for(FX_INT32 i = 0; i < iLength - 2; i++) { + for(FX_INT32 j = 0; j < iSizes[i]; j++) { + FXJSE_Value_Set(rgValues[iIndex], hResolveValues[i][j]); + iIndex++; + } + } + FXJSE_Value_SetArray(args.GetReturnValue(), (iCounter + 2), rgValues); + for(FX_INT32 i = 0; i < (iCounter + 2); i++) { + FXJSE_Value_Release(rgValues[i]); + } + FX_Free(rgValues); + } else { + CFX_WideString wsPropertyName = CFX_WideString::FromUTF8(szName, szName.GetLength()); + CFX_WideString wsSomExpression = CFX_WideString::FromUTF8(szSomExp, szSomExp.GetLength()); + pContext->ThrowScriptErrorMessage(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT, (FX_LPCWSTR)wsPropertyName, (FX_LPCWSTR)wsSomExpression); + } + for(FX_INT32 i = 0; i < iLength - 2; i++) { + for(FX_INT32 j = 0; j < iSizes[i]; j++) { + FXJSE_Value_Release(hResolveValues[i][j]); + } + FX_Free(hResolveValues[i]); + } + FX_Free(hResolveValues); + FX_Free(iSizes); + FXJSE_Value_Release(hLengthValue); + } else { + XFA_RESOLVENODE_RS resoveNodeRS; + FX_INT32 iRet = 0; + if (FXJSE_Value_IsObject(argAccessor) || (FXJSE_Value_IsNull(argAccessor) && bsAccessorName.IsEmpty())) { + iRet = ResolveObjects(hThis, argAccessor, szSomExp, resoveNodeRS, FALSE); + } else if (!FXJSE_Value_IsObject(argAccessor) && !bsAccessorName.IsEmpty()) { + FX_BOOL bGetObject = GetObjectByName(hThis, argAccessor, bsAccessorName); + if (bGetObject) { + iRet = ResolveObjects(hThis, argAccessor, szSomExp, resoveNodeRS, FALSE); + } + } + if(iRet > 0) { + FXJSE_HVALUE *hResolveValues; + FX_INT32 iSize = 0; + FX_BOOL bAttribute = FALSE; + ParseResolveResult(hThis, resoveNodeRS, argAccessor, hResolveValues, iSize, bAttribute); + FXJSE_HVALUE *rgValues = FX_Alloc(FXJSE_HVALUE, iSize + 2); + for(FX_INT32 i = 0; i < (iSize + 2); i++) { + rgValues[i] = FXJSE_Value_Create(hruntime); + } + FXJSE_Value_SetInteger(rgValues[0], 1); + if (bAttribute) { + FXJSE_Value_SetUTF8String(rgValues[1], szName); + } else { + FXJSE_Value_SetNull(rgValues[1]); + } + for(FX_INT32 i = 0; i < iSize; i++) { + FXJSE_Value_Set(rgValues[i + 2], hResolveValues[i]); + } + FXJSE_Value_SetArray(args.GetReturnValue(), (iSize + 2), rgValues); + for(FX_INT32 i = 0; i < (iSize + 2); i++) { + FXJSE_Value_Release(rgValues[i]); + } + FX_Free(rgValues); + for(FX_INT32 i = 0; i < iSize; i++) { + FXJSE_Value_Release(hResolveValues[i]); + } + FX_Free(hResolveValues); + } else { + CFX_WideString wsPropertyName = CFX_WideString::FromUTF8(szName, szName.GetLength()); + CFX_WideString wsSomExpression = CFX_WideString::FromUTF8(szSomExp, szSomExp.GetLength()); + pContext->ThrowScriptErrorMessage(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT, (FX_LPCWSTR)wsPropertyName, (FX_LPCWSTR)wsSomExpression); + } + } + if(argc == 5) { + FXJSE_Value_Release(argIndex); + } + FXJSE_Value_Release(argAccessor); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); + } +} +void CXFA_FM2JSContext::eval_translation (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + FX_INT32 argc = args.GetLength(); + if (argc == 1) { + FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); + CFX_ByteString argString; + HValueToUTF8String(argOne, argString); + if (argString.IsEmpty()) { + pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); + } else { + CFX_WideString scriptString = CFX_WideString::FromUTF8(argString, argString.GetLength()); + CFX_WideTextBuf wsJavaScriptBuf; + CFX_WideString wsError; + XFA_FM2JS_Translate(scriptString, wsJavaScriptBuf, wsError); + if (wsError.IsEmpty()) { + CFX_WideString javaScript = wsJavaScriptBuf.GetWideString(); + FXJSE_Value_SetUTF8String(args.GetReturnValue(), FX_UTF8Encode(javaScript, javaScript.GetLength())); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); + } + } + FXJSE_Value_Release(argOne); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Eval")); + } +} +void CXFA_FM2JSContext::is_fm_object(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + FX_INT32 iLength = args.GetLength(); + if (iLength == 1) { + FXJSE_HVALUE argOne = args.GetValue(0); + FXJSE_Value_SetBoolean(args.GetReturnValue(), FXJSE_Value_IsObject(argOne)); + FXJSE_Value_Release(argOne); + } else { + FXJSE_Value_SetBoolean(args.GetReturnValue(), FALSE); + } +} +void CXFA_FM2JSContext::is_fm_array(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + FX_INT32 iLength = args.GetLength(); + if (iLength == 1) { + FXJSE_HVALUE argOne = args.GetValue(0); + FX_BOOL bIsArray = FXJSE_Value_IsArray(argOne); + FXJSE_Value_SetBoolean(args.GetReturnValue(), bIsArray); + FXJSE_Value_Release(argOne); + } else { + FXJSE_Value_SetBoolean(args.GetReturnValue(), FALSE); + } +} +void CXFA_FM2JSContext::get_fm_value(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + FX_INT32 iLength = args.GetLength(); + if (iLength == 1) { + FXJSE_HVALUE argOne = args.GetValue(0); + if(FXJSE_Value_IsArray(argOne)) { + FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); + FXJSE_HVALUE jsobjectValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectPropByIdx(argOne, 1, propertyValue); + FXJSE_Value_GetObjectPropByIdx(argOne, 2, jsobjectValue); + if(FXJSE_Value_IsNull(propertyValue)) { + GetObjectDefaultValue(jsobjectValue, args.GetReturnValue()); + } else { + CFX_ByteString propertyStr; + FXJSE_Value_ToUTF8String(propertyValue, propertyStr); + FXJSE_Value_GetObjectProp(jsobjectValue, propertyStr, args.GetReturnValue()); + } + FXJSE_Value_Release(propertyValue); + FXJSE_Value_Release(jsobjectValue); + } else if(FXJSE_Value_IsObject(argOne)) { + GetObjectDefaultValue(argOne, args.GetReturnValue()); + } else { + FXJSE_Value_Set(args.GetReturnValue(), argOne); + } + FXJSE_Value_Release(argOne); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); + } +} +void CXFA_FM2JSContext::get_fm_jsobj(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + FX_INT32 argc = args.GetLength(); + if (argc == 1) { + FXJSE_HVALUE argOne = args.GetValue(0); + if(FXJSE_Value_IsArray(argOne)) { + FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectProp(argOne, FX_BSTRC("length"), lengthValue); + FX_INT32 iLength = FXJSE_Value_ToInteger(lengthValue); + FXSYS_assert(iLength >= 3); + FXJSE_Value_Release(lengthValue); + FXJSE_Value_GetObjectPropByIdx(argOne, 2, args.GetReturnValue()); + } else { + FXJSE_Value_Set(args.GetReturnValue(), argOne); + } + FXJSE_Value_Release(argOne); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); + } +} +void CXFA_FM2JSContext::fm_var_filter(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + FX_INT32 argc = args.GetLength(); + if (argc == 1) { + FXJSE_HVALUE argOne = args.GetValue(0); + if(FXJSE_Value_IsArray(argOne)) { + FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectProp(argOne, FX_BSTRC("length"), lengthValue); + FX_INT32 iLength = FXJSE_Value_ToInteger(lengthValue); + FXSYS_assert(iLength >= 3); + FXJSE_Value_Release(lengthValue); + FXJSE_HVALUE flagsValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectPropByIdx(argOne, 0, flagsValue); + FX_INT32 iFlags = FXJSE_Value_ToInteger(flagsValue); + FXJSE_Value_Release(flagsValue); + if(iFlags == 4) { + FXJSE_HVALUE rgValues[3]; + for(FX_INT32 i = 0; i < 3; i++) { + rgValues[i] = FXJSE_Value_Create(hruntime); + } + FXJSE_Value_SetInteger(rgValues[0], 3); + FXJSE_Value_SetNull(rgValues[1]); + FXJSE_Value_SetNull(rgValues[2]); + FXJSE_Value_SetArray(args.GetReturnValue(), 3, rgValues); + for(FX_INT32 i = 0; i < 3; i++) { + FXJSE_Value_Release(rgValues[i]); + } + } else if(iFlags == 3) { + FXJSE_HVALUE objectValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectPropByIdx(argOne, 2, objectValue); + if(!FXJSE_Value_IsNull(objectValue)) { + FXJSE_Value_Set(args.GetReturnValue(), argOne); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); + } + FXJSE_Value_Release(objectValue); + } else { + FXJSE_HVALUE simpleValue = GetSimpleHValue(hThis, args, 0); + FXJSE_Value_Set(args.GetReturnValue(), simpleValue); + FXJSE_Value_Release(simpleValue); + } + } else { + FXJSE_HVALUE simpleValue = GetSimpleHValue(hThis, args, 0); + FXJSE_Value_Set(args.GetReturnValue(), simpleValue); + FXJSE_Value_Release(simpleValue); + } + FXJSE_Value_Release(argOne); + } else { + pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); + } +} +void CXFA_FM2JSContext::concat_fm_object(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + FX_UINT32 iLength = 0; + FX_INT32 argCount = args.GetLength(); + FXJSE_HVALUE *argValues = FX_Alloc(FXJSE_HVALUE, argCount); + for(FX_INT32 i = 0; i < argCount; i++) { + argValues[i] = args.GetValue(i); + if(FXJSE_Value_IsArray(argValues[i])) { + FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectProp(argValues[i], FX_BSTRC("length"), lengthValue); + FX_INT32 length = FXJSE_Value_ToInteger(lengthValue); + iLength = iLength + ((length > 2) ? (length - 2) : 0); + FXJSE_Value_Release(lengthValue); + } + iLength += 1; + } + FXJSE_HVALUE *returnValues = FX_Alloc(FXJSE_HVALUE, iLength); + for(FX_INT32 i = 0; i < (FX_INT32)iLength; i++) { + returnValues[i] = FXJSE_Value_Create(hruntime); + } + FX_INT32 index = 0; + for(FX_INT32 i = 0; i < argCount; i++) { + if(FXJSE_Value_IsArray(argValues[i])) { + FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectProp(argValues[i], FX_BSTRC("length"), lengthValue); + FX_INT32 length = FXJSE_Value_ToInteger(lengthValue); + for(FX_INT32 j = 2; j < length; j++) { + FXJSE_Value_GetObjectPropByIdx(argValues[i], j, returnValues[index]); + index++; + } + FXJSE_Value_Release(lengthValue); + } + FXJSE_Value_Set(returnValues[index], argValues[i]); + index++; + } + FXJSE_Value_SetArray(args.GetReturnValue(), iLength, returnValues); + for(FX_INT32 i = 0; i < argCount; i++) { + FXJSE_Value_Release(argValues[i]); + } + FX_Free(argValues); + for(FX_INT32 i = 0; i < (FX_INT32)iLength; i++) { + FXJSE_Value_Release(returnValues[i]); + } + FX_Free(returnValues); +} +FXJSE_HVALUE CXFA_FM2JSContext::GetSimpleHValue(FXJSE_HOBJECT hThis, CFXJSE_Arguments &args, FX_UINT32 index) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + FXSYS_assert(index < (FX_UINT32)args.GetLength()); + FXJSE_HVALUE argIndex = args.GetValue(index); + if (FXJSE_Value_IsArray(argIndex)) { + FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectProp(argIndex, FX_BSTRC("length"), lengthValue); + FX_INT32 iLength = FXJSE_Value_ToInteger(lengthValue); + FXJSE_Value_Release(lengthValue); + FXJSE_HVALUE simpleValue = FXJSE_Value_Create(hruntime); + if (iLength > 2) { + FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); + FXJSE_HVALUE jsobjectValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectPropByIdx(argIndex, 1, propertyValue); + FXJSE_Value_GetObjectPropByIdx(argIndex, 2, jsobjectValue); + if (FXJSE_Value_IsNull(propertyValue)) { + GetObjectDefaultValue(jsobjectValue, simpleValue); + } else { + CFX_ByteString propertyStr; + FXJSE_Value_ToUTF8String(propertyValue, propertyStr); + FXJSE_Value_GetObjectProp(jsobjectValue, propertyStr, simpleValue); + } + FXJSE_Value_Release(propertyValue); + FXJSE_Value_Release(jsobjectValue); + } else { + FXJSE_Value_SetUndefined(simpleValue); + } + FXJSE_Value_Release(argIndex); + return simpleValue; + } else if (FXJSE_Value_IsObject(argIndex)) { + FXJSE_HVALUE defaultValue = FXJSE_Value_Create(hruntime); + GetObjectDefaultValue(argIndex, defaultValue); + FXJSE_Value_Release(argIndex); + return defaultValue; + } else { + return argIndex; + } +} +FX_BOOL CXFA_FM2JSContext::HValueIsNull(FXJSE_HOBJECT hThis, FXJSE_HVALUE arg) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + FX_BOOL isNull = FALSE; + if (FXJSE_Value_IsNull(arg)) { + isNull = TRUE; + } else if (FXJSE_Value_IsArray(arg)) { + FX_INT32 iLength = hvalue_get_array_length(hThis, arg); + if (iLength > 2) { + FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); + FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectPropByIdx(arg, 1, propertyValue); + FXJSE_Value_GetObjectPropByIdx(arg, 2, jsObjectValue); + if (FXJSE_Value_IsNull(propertyValue)) { + FXJSE_HVALUE defaultValue = FXJSE_Value_Create(hruntime); + GetObjectDefaultValue(jsObjectValue, defaultValue); + if (FXJSE_Value_IsNull(defaultValue)) { + isNull = TRUE; + } + FXJSE_Value_Release(defaultValue); + } else { + CFX_ByteString propertyStr; + FXJSE_Value_ToUTF8String(propertyValue, propertyStr); + FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, newPropertyValue); + if (FXJSE_Value_IsNull(newPropertyValue)) { + isNull = TRUE; + } + FXJSE_Value_Release(newPropertyValue); + } + FXJSE_Value_Release(propertyValue); + FXJSE_Value_Release(jsObjectValue); + } else { + isNull = TRUE; + } + } else if (FXJSE_Value_IsObject(arg)) { + FXJSE_HVALUE defaultValue = FXJSE_Value_Create(hruntime); + GetObjectDefaultValue(arg, defaultValue); + if (FXJSE_Value_IsNull(defaultValue)) { + isNull = TRUE; + } + FXJSE_Value_Release(defaultValue); + } + return isNull; +} +FX_INT32 CXFA_FM2JSContext::hvalue_get_array_length(FXJSE_HOBJECT hThis, FXJSE_HVALUE arg) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + FX_INT32 iLength = 0; + if (FXJSE_Value_IsArray(arg)) { + FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectProp(arg, FX_BSTRC("length"), lengthValue); + iLength = FXJSE_Value_ToInteger(lengthValue); + FXJSE_Value_Release(lengthValue); + } + return iLength; +} +FX_BOOL CXFA_FM2JSContext::simpleValueCompare(FXJSE_HOBJECT hThis, FXJSE_HVALUE firstValue, FXJSE_HVALUE secondValue) +{ + FX_BOOL bReturn = FALSE; + if(FXJSE_Value_IsUTF8String(firstValue)) { + CFX_ByteString firstString, secondString; + HValueToUTF8String(firstValue, firstString); + HValueToUTF8String(secondValue, secondString); + bReturn = firstString.Equal(secondString); + } else if (FXJSE_Value_IsNumber(firstValue)) { + FX_FLOAT first = HValueToFloat(hThis, firstValue); + FX_FLOAT second = HValueToFloat(hThis, secondValue); + bReturn = (first == second); + } else if (FXJSE_Value_IsBoolean(firstValue)) { + bReturn = (FXJSE_Value_ToBoolean(firstValue) == FXJSE_Value_ToBoolean(secondValue)); + } else if (FXJSE_Value_IsNull(firstValue) && FXJSE_Value_IsNull(secondValue)) { + bReturn = TRUE; + } + return bReturn; +} +void CXFA_FM2JSContext::unfoldArgs(FXJSE_HOBJECT hThis, CFXJSE_Arguments &args, FXJSE_HVALUE *&resultValues, FX_INT32 &iCount, FX_INT32 iStart) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + iCount = 0; + FX_INT32 argc = args.GetLength(); + FXJSE_HVALUE *argsValue = FX_Alloc(FXJSE_HVALUE, argc); + for (FX_INT32 i = iStart; i < argc; i++) { + argsValue[i] = args.GetValue(i); + if (FXJSE_Value_IsArray(argsValue[i])) { + FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectProp(argsValue[i], FX_BSTRC("length"), lengthValue); + FX_INT32 iLength = FXJSE_Value_ToInteger(lengthValue); + FXJSE_Value_Release(lengthValue); + iCount += ((iLength > 2) ? (iLength - 2) : 0); + } else { + iCount += 1; + } + } + resultValues = FX_Alloc(FXJSE_HVALUE, iCount); + for (FX_INT32 i = 0; i < iCount; i++) { + resultValues[i] = FXJSE_Value_Create(hruntime); + } + FX_INT32 index = 0; + for (FX_INT32 i = iStart; i < argc; i++) { + if (FXJSE_Value_IsArray(argsValue[i])) { + FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectProp(argsValue[i], FX_BSTRC("length"), lengthValue); + FX_INT32 iLength = FXJSE_Value_ToInteger(lengthValue); + FXJSE_Value_Release(lengthValue); + if (iLength > 2) { + FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); + FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectPropByIdx(argsValue[i], 1, propertyValue); + if (FXJSE_Value_IsNull(propertyValue)) { + for (FX_INT32 j = 2; j < iLength; j++) { + FXJSE_Value_GetObjectPropByIdx(argsValue[i], j, jsObjectValue); + GetObjectDefaultValue(jsObjectValue, resultValues[index]); + index++; + } + } else { + CFX_ByteString propertyString; + FXJSE_Value_ToUTF8String(propertyValue, propertyString); + for (FX_INT32 j = 2; j < iLength; j++) { + FXJSE_Value_GetObjectPropByIdx(argsValue[i], j, jsObjectValue); + FXJSE_Value_GetObjectProp(jsObjectValue, propertyString, resultValues[index]); + index++; + } + } + FXJSE_Value_Release(propertyValue); + FXJSE_Value_Release(jsObjectValue); + } + } else if(FXJSE_Value_IsObject(argsValue[i])) { + GetObjectDefaultValue(argsValue[i], resultValues[index]); + index++; + } else { + FXJSE_Value_Set(resultValues[index], argsValue[i]); + index++; + } + } + for (FX_INT32 i = iStart; i < argc; i++) { + FXJSE_Value_Release(argsValue[i]); + } + FX_Free(argsValue); +} +void CXFA_FM2JSContext::GetObjectDefaultValue(FXJSE_HVALUE hObjectValue, FXJSE_HVALUE hDefaultValue) +{ + CXFA_Object* pNode = (CXFA_Object*)FXJSE_Value_ToObject(hObjectValue, NULL); + if (pNode && pNode->IsNode()) { + ((CXFA_Node*)pNode)->Script_Som_DefaultValue(hDefaultValue, FALSE, (XFA_ATTRIBUTE) - 1); + } else { + FXJSE_Value_SetNull(hDefaultValue); + } +} +FX_BOOL CXFA_FM2JSContext::SetObjectDefaultValue(FXJSE_HVALUE hObjectValue, FXJSE_HVALUE hNewValue) +{ + FX_BOOL bSuccess = FALSE; + CXFA_Object* pNode = (CXFA_Object*)FXJSE_Value_ToObject(hObjectValue, NULL); + if (pNode && pNode->IsNode()) { + ((CXFA_Node*)pNode)->Script_Som_DefaultValue(hNewValue, TRUE, (XFA_ATTRIBUTE) - 1); + bSuccess = TRUE; + } + return bSuccess; +} +void CXFA_FM2JSContext::GenerateSomExpression(FX_BSTR szName, FX_INT32 iIndexFlags, FX_INT32 iIndexValue, FX_BOOL bIsStar, CFX_ByteString& szSomExp) +{ + if(bIsStar) { + szSomExp = szName + FX_BSTRC("[*]"); + return; + } + if(iIndexFlags == 0) { + szSomExp = szName; + return; + } + if(iIndexFlags == 1 || iIndexValue == 0) { + szSomExp = szName + FX_BSTRC("[") + CFX_ByteString::FormatInteger(iIndexValue, FXFORMAT_SIGNED) + FX_BSTRC("]"); + } else if(iIndexFlags == 2) { + szSomExp = (iIndexValue < 0) ? (szName + FX_BSTRC("[-")) : (szName + FX_BSTRC("[+")); + iIndexValue = (iIndexValue < 0) ? (0 - iIndexValue) : iIndexValue; + szSomExp += CFX_ByteString::FormatInteger(iIndexValue); + szSomExp += FX_BSTRC("]"); + } else { + szSomExp = (iIndexValue < 0) ? (szName + FX_BSTRC("[")) : (szName + FX_BSTRC("[-")); + iIndexValue = (iIndexValue < 0) ? (0 - iIndexValue) : iIndexValue; + szSomExp += CFX_ByteString::FormatInteger(iIndexValue); + szSomExp += FX_BSTRC("]"); + } +} +FX_BOOL CXFA_FM2JSContext::GetObjectByName(FXJSE_HOBJECT hThis, FXJSE_HVALUE accessorValue, FX_BSTR szAccessorName) +{ + FX_BOOL bFlags = FALSE; + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + CXFA_Document *pDoc = pContext->GetDocument(); + if(!pDoc) { + return bFlags; + } + IXFA_ScriptContext* pScriptContext = pDoc->GetScriptContext(); + XFA_RESOLVENODE_RS resoveNodeRS; + FX_DWORD dwFlags = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent; + FX_INT32 iRet = pScriptContext->ResolveObjects(pScriptContext->GetThisObject(), CFX_WideString::FromUTF8(szAccessorName.GetCStr(), szAccessorName.GetLength()), resoveNodeRS, dwFlags); + if (iRet >= 1 && resoveNodeRS.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) { + FXJSE_Value_Set(accessorValue, pScriptContext->GetJSValueFromMap(resoveNodeRS.nodes.GetAt(0))); + bFlags = TRUE; + } + return bFlags; +} +FX_INT32 CXFA_FM2JSContext::ResolveObjects(FXJSE_HOBJECT hThis, FXJSE_HVALUE hRefValue, FX_BSTR bsSomExp, XFA_RESOLVENODE_RS &resoveNodeRS, FX_BOOL bdotAccessor , FX_BOOL bHasNoResolveName ) +{ + CFX_WideString wsSomExpression = CFX_WideString::FromUTF8(bsSomExp.GetCStr(), bsSomExp.GetLength()); + FX_INT32 iRet = -1; + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + CXFA_Document *pDoc = pContext->GetDocument(); + if(!pDoc) { + return iRet; + } + IXFA_ScriptContext* pScriptContext = pDoc->GetScriptContext(); + CXFA_Object *pNode = NULL; + FX_DWORD dFlags = 0UL; + if (bdotAccessor) { + if (FXJSE_Value_IsNull(hRefValue)) { + pNode = pScriptContext->GetThisObject(); + dFlags = XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent; + } else { + pNode = (CXFA_Object *)FXJSE_Value_ToObject(hRefValue, NULL); + FXSYS_assert(pNode); + if (bHasNoResolveName) { + CFX_WideString wsName; + if (pNode->IsNode()) { + CXFA_Node* pXFANode = (CXFA_Node*)pNode; + pXFANode->GetAttribute(XFA_ATTRIBUTE_Name, wsName, FALSE); + } + if (wsName.IsEmpty()) { + CFX_WideStringC className; + pNode->GetClassName(className); + wsName = FX_WSTRC(L"#") + className; + } + wsSomExpression = wsName + wsSomExpression; + dFlags = XFA_RESOLVENODE_Siblings; + } else { + dFlags = (bsSomExp == "*") ? (XFA_RESOLVENODE_Children) : (XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Attributes | XFA_RESOLVENODE_Properties); + } + } + } else { + pNode = (CXFA_Object *)FXJSE_Value_ToObject(hRefValue, NULL); + dFlags = XFA_RESOLVENODE_AnyChild; + } + iRet = pScriptContext->ResolveObjects(pNode, wsSomExpression, resoveNodeRS, dFlags); + return iRet; +} +void CXFA_FM2JSContext::ParseResolveResult(FXJSE_HOBJECT hThis, const XFA_RESOLVENODE_RS &resoveNodeRS, FXJSE_HVALUE hParentValue, FXJSE_HVALUE *&resultValues, FX_INT32 &iSize, FX_BOOL &bAttribute) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hRuntime = pContext->GetScriptRuntime(); + iSize = 0; + resultValues = NULL; + if (resoveNodeRS.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) { + bAttribute = FALSE; + iSize = resoveNodeRS.nodes.GetSize(); + resultValues = FX_Alloc(FXJSE_HVALUE, iSize); + for (FX_INT32 i = 0; i < iSize; i++) { + resultValues[i] = FXJSE_Value_Create(hRuntime); + FXJSE_Value_Set(resultValues[i], pContext->GetDocument()->GetScriptContext()->GetJSValueFromMap(resoveNodeRS.nodes.GetAt(i))); + } + } else { + CXFA_HVALUEArray objectProperties(hRuntime); + FX_INT32 iRet = resoveNodeRS.GetAttributeResult(objectProperties); + bAttribute = (iRet == 0); + if (bAttribute) { + if (FXJSE_Value_IsObject(hParentValue)) { + iSize = 1; + resultValues = FX_Alloc(FXJSE_HVALUE, 1); + resultValues[0] = FXJSE_Value_Create(hRuntime); + FXJSE_Value_Set(resultValues[0], hParentValue); + } + } else { + iSize = iRet; + resultValues = FX_Alloc(FXJSE_HVALUE, iSize); + for (FX_INT32 i = 0; i < iSize; i++) { + resultValues[i] = FXJSE_Value_Create(hRuntime); + FXJSE_Value_Set(resultValues[i], objectProperties[i]); + } + } + } +} +FX_INT32 CXFA_FM2JSContext::HValueToInteger(FXJSE_HOBJECT hThis, FXJSE_HVALUE hValue) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + FX_INT32 iValue = 0; + if(FXJSE_Value_IsArray(hValue)) { + FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); + FXJSE_HVALUE jsobjectValue = FXJSE_Value_Create(hruntime); + FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectPropByIdx(hValue, 1, propertyValue); + FXJSE_Value_GetObjectPropByIdx(hValue, 2, jsobjectValue); + if (FXJSE_Value_IsNull(propertyValue)) { + GetObjectDefaultValue(jsobjectValue, newProperty); + } else { + CFX_ByteString propertyStr; + FXJSE_Value_ToUTF8String(propertyValue, propertyStr); + FXJSE_Value_GetObjectProp(jsobjectValue, propertyStr, newProperty); + } + iValue = HValueToInteger(hThis, newProperty); + FXJSE_Value_Release(newProperty); + FXJSE_Value_Release(jsobjectValue); + FXJSE_Value_Release(propertyValue); + return iValue; + } else if(FXJSE_Value_IsObject(hValue)) { + FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime); + GetObjectDefaultValue(hValue, newProperty); + iValue = HValueToInteger(hThis, newProperty); + FXJSE_Value_Release(newProperty); + return iValue; + } else if(FXJSE_Value_IsUTF8String(hValue)) { + CFX_ByteString szValue; + FXJSE_Value_ToUTF8String(hValue, szValue); + iValue = FXSYS_atoi(szValue); + } else { + iValue = FXJSE_Value_ToInteger(hValue); + } + return iValue; +} +FX_DOUBLE CXFA_FM2JSContext::StringToDouble(FX_BSTR szStringVal) +{ + return XFA_ByteStringToDouble(szStringVal); +} +FX_FLOAT CXFA_FM2JSContext::HValueToFloat(FXJSE_HOBJECT hThis, FXJSE_HVALUE arg) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + FX_FLOAT fRet = 0.0f; + if (FXJSE_Value_IsArray(arg)) { + FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); + FXJSE_HVALUE jsobjectValue = FXJSE_Value_Create(hruntime); + FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectPropByIdx(arg, 1, propertyValue); + FXJSE_Value_GetObjectPropByIdx(arg, 2, jsobjectValue); + if (FXJSE_Value_IsNull(propertyValue)) { + GetObjectDefaultValue(jsobjectValue, newProperty); + } else { + CFX_ByteString propertyStr; + FXJSE_Value_ToUTF8String(propertyValue, propertyStr); + FXJSE_Value_GetObjectProp(jsobjectValue, propertyStr, newProperty); + } + fRet = HValueToFloat(hThis, newProperty); + FXJSE_Value_Release(newProperty); + FXJSE_Value_Release(jsobjectValue); + FXJSE_Value_Release(propertyValue); + } else if (FXJSE_Value_IsObject(arg)) { + FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime); + GetObjectDefaultValue(arg, newProperty); + fRet = HValueToFloat(hThis, newProperty); + FXJSE_Value_Release(newProperty); + } else if (FXJSE_Value_IsUTF8String(arg)) { + CFX_ByteString bsOutput; + FXJSE_Value_ToUTF8String(arg, bsOutput); + fRet = (FX_FLOAT)StringToDouble(bsOutput); + } else if (FXJSE_Value_IsUndefined(arg)) { + fRet = 0; + } else { + fRet = FXJSE_Value_ToFloat(arg); + } + return fRet; +} +FX_DOUBLE CXFA_FM2JSContext::HValueToDouble(FXJSE_HOBJECT hThis, FXJSE_HVALUE arg) +{ + CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); + FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); + FX_DOUBLE dRet = 0; + if (FXJSE_Value_IsArray(arg)) { + FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); + FXJSE_HVALUE jsobjectValue = FXJSE_Value_Create(hruntime); + FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime); + FXJSE_Value_GetObjectPropByIdx(arg, 1, propertyValue); + FXJSE_Value_GetObjectPropByIdx(arg, 2, jsobjectValue); + if (FXJSE_Value_IsNull(propertyValue)) { + GetObjectDefaultValue(jsobjectValue, newProperty); + } else { + CFX_ByteString propertyStr; + FXJSE_Value_ToUTF8String(propertyValue, propertyStr); + FXJSE_Value_GetObjectProp(jsobjectValue, propertyStr, newProperty); + } + dRet = HValueToDouble(hThis, newProperty); + FXJSE_Value_Release(newProperty); + FXJSE_Value_Release(jsobjectValue); + FXJSE_Value_Release(propertyValue); + } else if (FXJSE_Value_IsObject(arg)) { + FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime); + GetObjectDefaultValue(arg, newProperty); + dRet = HValueToDouble(hThis, newProperty); + FXJSE_Value_Release(newProperty); + } else if (FXJSE_Value_IsUTF8String(arg)) { + CFX_ByteString bsOutput; + FXJSE_Value_ToUTF8String(arg, bsOutput); + dRet = StringToDouble(bsOutput); + } else if (FXJSE_Value_IsUndefined(arg)) { + dRet = 0; + } else { + dRet = FXJSE_Value_ToDouble(arg); + } + return dRet; +} +void CXFA_FM2JSContext::HValueToUTF8String(FXJSE_HVALUE arg, CFX_ByteString& szOutputString) +{ + if(FXJSE_Value_IsNull(arg) || FXJSE_Value_IsUndefined(arg)) { + szOutputString = ""; + } else if(FXJSE_Value_IsBoolean(arg)) { + szOutputString = FXJSE_Value_ToBoolean(arg) ? "1" : "0"; + } else { + szOutputString = ""; + FXJSE_Value_ToUTF8String(arg, szOutputString); + } +} +static FXJSE_FUNCTION formcalc_fm2js_functions[] = { + { + "Abs", + CXFA_FM2JSContext::Abs + }, + { + "Avg", + CXFA_FM2JSContext::Avg + }, + { + "Ceil", + CXFA_FM2JSContext::Ceil + }, + { + "Count", + CXFA_FM2JSContext::Count + }, + { + "Floor", + CXFA_FM2JSContext::Floor + }, + { + "Max", + CXFA_FM2JSContext::Max + }, + { + "Min", + CXFA_FM2JSContext::Min + }, + { + "Mod", + CXFA_FM2JSContext::Mod + }, + { + "Round", + CXFA_FM2JSContext::Round + }, + { + "Sum", + CXFA_FM2JSContext::Sum + }, + { + "Date", + CXFA_FM2JSContext::Date + }, + { + "Date2Num", + CXFA_FM2JSContext::Date2Num + }, + { + "DateFmt", + CXFA_FM2JSContext::DateFmt + }, + { + "IsoDate2Num", + CXFA_FM2JSContext::IsoDate2Num + }, + { + "IsoTime2Num", + CXFA_FM2JSContext::IsoTime2Num + }, + { + "LocalDateFmt", + CXFA_FM2JSContext::LocalDateFmt + }, + { + "LocalTimeFmt", + CXFA_FM2JSContext::LocalTimeFmt + }, + { + "Num2Date", + CXFA_FM2JSContext::Num2Date + }, + { + "Num2GMTime", + CXFA_FM2JSContext::Num2GMTime + }, + { + "Num2Time", + CXFA_FM2JSContext::Num2Time + }, + { + "Time", + CXFA_FM2JSContext::Time + }, + { + "Time2Num", + CXFA_FM2JSContext::Time2Num + }, + { + "TimeFmt", + CXFA_FM2JSContext::TimeFmt + }, + { + "Apr", + CXFA_FM2JSContext::Apr + }, + { + "Cterm", + CXFA_FM2JSContext::CTerm + }, + { + "FV", + CXFA_FM2JSContext::FV + }, + { + "Ipmt", + CXFA_FM2JSContext::IPmt + }, + { + "NPV", + CXFA_FM2JSContext::NPV + }, + { + "Pmt", + CXFA_FM2JSContext::Pmt + }, + { + "PPmt", + CXFA_FM2JSContext::PPmt + }, + { + "PV", + CXFA_FM2JSContext::PV + }, + { + "Rate", + CXFA_FM2JSContext::Rate + }, + { + "Term", + CXFA_FM2JSContext::Term + }, + { + "Choose", + CXFA_FM2JSContext::Choose + }, + { + "Exists", + CXFA_FM2JSContext::Exists + }, + { + "HasValue", + CXFA_FM2JSContext::HasValue + }, + { + "Oneof", + CXFA_FM2JSContext::Oneof + }, + { + "Within", + CXFA_FM2JSContext::Within + }, + { + "If", + CXFA_FM2JSContext::If + }, + { + "Eval", + CXFA_FM2JSContext::Eval + }, + { + "Translate", + CXFA_FM2JSContext::eval_translation + }, + { + "Ref", + CXFA_FM2JSContext::Ref + }, + { + "UnitType", + CXFA_FM2JSContext::UnitType + }, + { + "UnitValue", + CXFA_FM2JSContext::UnitValue + }, + { + "At", + CXFA_FM2JSContext::At + }, + { + "Concat", + CXFA_FM2JSContext::Concat + }, + { + "Decode", + CXFA_FM2JSContext::Decode + }, + { + "Encode", + CXFA_FM2JSContext::Encode + }, + { + "Format", + CXFA_FM2JSContext::Format + }, + { + "Left", + CXFA_FM2JSContext::Left + }, + { + "Len", + CXFA_FM2JSContext::Len + }, + { + "Lower", + CXFA_FM2JSContext::Lower + }, + { + "Ltrim", + CXFA_FM2JSContext::Ltrim + }, + { + "Parse", + CXFA_FM2JSContext::Parse + }, + { + "Replace", + CXFA_FM2JSContext::Replace + }, + { + "Right", + CXFA_FM2JSContext::Right + }, + { + "Rtrim", + CXFA_FM2JSContext::Rtrim + }, + { + "Space", + CXFA_FM2JSContext::Space + }, + { + "Str", + CXFA_FM2JSContext::Str + }, + { + "Stuff", + CXFA_FM2JSContext::Stuff + }, + { + "Substr", + CXFA_FM2JSContext::Substr + }, + { + "Uuid", + CXFA_FM2JSContext::Uuid + }, + { + "Upper", + CXFA_FM2JSContext::Upper + }, + { + "WordNum", + CXFA_FM2JSContext::WordNum + }, + { + "Get", + CXFA_FM2JSContext::Get + }, + { + "Post", + CXFA_FM2JSContext::Post + }, + { + "Put", + CXFA_FM2JSContext::Put + }, + { + "positive_operator", + CXFA_FM2JSContext::positive_operator + }, + { + "negative_operator", + CXFA_FM2JSContext::negative_operator + }, + { + "logical_or_operator", + CXFA_FM2JSContext::logical_or_operator + }, + { + "logical_and_operator", + CXFA_FM2JSContext::logical_and_operator + }, + { + "logical_not_operator", + CXFA_FM2JSContext::logical_not_operator + }, + { + "equality_operator", + CXFA_FM2JSContext::equality_operator + }, + { + "notequality_operator", + CXFA_FM2JSContext::notequality_operator + }, + { + "less_operator", + CXFA_FM2JSContext::less_operator + }, + { + "lessequal_operator", + CXFA_FM2JSContext::lessequal_operator + }, + { + "greater_operator", + CXFA_FM2JSContext::greater_operator + }, + { + "greaterequal_operator", + CXFA_FM2JSContext::greaterequal_operator + }, + { + "plus_operator", + CXFA_FM2JSContext::plus_operator + }, + { + "minus_operator", + CXFA_FM2JSContext::minus_operator + }, + { + "multiple_operator", + CXFA_FM2JSContext::multiple_operator + }, + { + "divide_operator", + CXFA_FM2JSContext::divide_operator + }, + { + "assign_value_operator", + CXFA_FM2JSContext::assign_value_operator + }, + { + "dot_accessor", + CXFA_FM2JSContext::dot_accessor + }, + { + "dotdot_accessor", + CXFA_FM2JSContext::dotdot_accessor + }, + { + "concat_fm_object", + CXFA_FM2JSContext::concat_fm_object + }, + { + "is_fm_object", + CXFA_FM2JSContext::is_fm_object + }, + { + "is_fm_array", + CXFA_FM2JSContext::is_fm_array + }, + { + "get_fm_value", + CXFA_FM2JSContext::get_fm_value + }, + { + "get_fm_jsobj", + CXFA_FM2JSContext::get_fm_jsobj + }, + { + "fm_var_filter", + CXFA_FM2JSContext::fm_var_filter + }, +}; +CXFA_FM2JSContext::CXFA_FM2JSContext() : + m_pDocument(NULL), + m_hFMClass(NULL) +{ + FX_memset(&m_fmClass, 0, sizeof(FXJSE_CLASS)); +} +CXFA_FM2JSContext::~CXFA_FM2JSContext() +{ + m_pDocument = NULL; + if(m_hValue) { + FXJSE_Value_Release(m_hValue); + m_hValue = NULL; + } + m_hScriptRuntime = NULL; +} +CXFA_FM2JSContext* CXFA_FM2JSContext::Create() +{ + return FX_NEW CXFA_FM2JSContext; +} +void CXFA_FM2JSContext::Initialize(FXJSE_HRUNTIME hScriptRuntime, FXJSE_HCONTEXT hScriptContext, CXFA_Document* pDoc) +{ + m_pDocument = pDoc; + m_hScriptRuntime = hScriptRuntime; + m_fmClass.name = "XFA_FM2JS_FormCalcClass"; + m_fmClass.constructor = NULL; + m_fmClass.properties = NULL; + m_fmClass.methods = formcalc_fm2js_functions; + m_fmClass.propNum = 0; + m_fmClass.methNum = sizeof(formcalc_fm2js_functions) / sizeof(formcalc_fm2js_functions[0]); + m_hFMClass = FXJSE_DefineClass(hScriptContext, &m_fmClass); + m_hValue = FXJSE_Value_Create(hScriptRuntime); + FXJSE_Value_SetNull(m_hValue); + FXJSE_Value_SetObject(m_hValue, this, m_hFMClass); +} +void CXFA_FM2JSContext::GlobalPropertyGetter(FXJSE_HVALUE hValue) +{ + FXJSE_Value_Set(hValue, m_hValue); +} +void CXFA_FM2JSContext::Release() +{ + delete this; +} +void CXFA_FM2JSContext::ThrowScriptErrorMessage(FX_INT32 iStringID, ...) +{ + IXFA_AppProvider* pAppProvider = m_pDocument->GetNotify()->GetAppProvider(); + FXSYS_assert(pAppProvider); + CFX_WideString wsFormat; + pAppProvider->LoadString(iStringID, wsFormat); + CFX_WideString wsMessage; + va_list arg_ptr; + va_start(arg_ptr, iStringID); + wsMessage.FormatV((FX_LPCWSTR)wsFormat, arg_ptr); + va_end(arg_ptr); + FXJSE_ThrowMessage(FX_BSTRC(""), FX_UTF8Encode(wsMessage, wsMessage.GetLength())); +} diff --git a/xfa/src/fxfa/src/fm2js/xfa_fm2jscontext.h b/xfa/src/fxfa/src/fm2js/xfa_fm2jscontext.h new file mode 100644 index 0000000000..95451bbd7b --- /dev/null +++ b/xfa/src/fxfa/src/fm2js/xfa_fm2jscontext.h @@ -0,0 +1,174 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _XFA_FM2JS_CONTEXT_H +#define _XFA_FM2JS_CONTEXT_H +class CXFA_FM2JSContext : public CFX_Object +{ +public: + static void Abs (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Avg (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Ceil (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Count (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Floor (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Max (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Min (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Mod (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Round (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Sum (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Date (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Date2Num (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void DateFmt (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void IsoDate2Num (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void IsoTime2Num (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void LocalDateFmt (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void LocalTimeFmt (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Num2Date (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Num2GMTime (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Num2Time (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Time (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Time2Num (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void TimeFmt (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + + static FX_BOOL IsIsoDateFormat (FX_LPCSTR pData, FX_INT32 iLength, FX_INT32 &iStyle, FX_INT32 &iYear, FX_INT32 &iMonth, FX_INT32 &iDay); + static FX_BOOL IsIsoTimeFormat (FX_LPCSTR pData, FX_INT32 iLength, FX_INT32 &iHour, FX_INT32 &iMinute, FX_INT32 &iSecond, FX_INT32 &iMilliSecond, FX_INT32 &iZoneHour, FX_INT32 &iZoneMinute); + static FX_BOOL IsIsoDateTimeFormat (FX_LPCSTR pData, FX_INT32 iLength, FX_INT32 &iYear, FX_INT32 &iMonth, FX_INT32 &iDay, FX_INT32 &iHour, FX_INT32 &iMinute, FX_INT32 &iSecond, FX_INT32 &iMillionSecond, FX_INT32 &iZoneHour, FX_INT32 &iZoneMinute); + static FX_BOOL Local2IsoDate (FXJSE_HOBJECT hThis, FX_BSTR szDate, FX_BSTR szFormat, FX_BSTR szLocale, CFX_ByteString &strIsoDate); + static FX_BOOL Local2IsoTime (FXJSE_HOBJECT hThis, FX_BSTR szTime, FX_BSTR szFormat, FX_BSTR szLocale, CFX_ByteString &strIsoTime); + static FX_BOOL IsoDate2Local (FXJSE_HOBJECT hThis, FX_BSTR szDate, FX_BSTR szFormat, FX_BSTR szLocale, CFX_ByteString &strLocalDate); + static FX_BOOL IsoTime2Local (FXJSE_HOBJECT hThis, FX_BSTR szTime, FX_BSTR szFormat, FX_BSTR szLocale, CFX_ByteString &strLocalTime); + static FX_BOOL GetGMTTime (FXJSE_HOBJECT hThis, FX_BSTR szTime, FX_BSTR szFormat, FX_BSTR szLocale, CFX_ByteString &strGMTTime); + static FX_INT32 DateString2Num (FX_BSTR szDateString); + static void GetLocalDateFormat (FXJSE_HOBJECT hThis, FX_INT32 iStyle, FX_BSTR szLocalStr, CFX_ByteString &strFormat, FX_BOOL bStandard); + static void GetLocalTimeFormat (FXJSE_HOBJECT hThis, FX_INT32 iStyle, FX_BSTR szLocalStr, CFX_ByteString &strFormat, FX_BOOL bStandard); + static void GetStandardDateFormat (FXJSE_HOBJECT hThis, FX_INT32 iStyle, FX_BSTR szLocalStr, CFX_ByteString &strFormat); + static void GetStandardTimeFormat (FXJSE_HOBJECT hThis, FX_INT32 iStyle, FX_BSTR szLocalStr, CFX_ByteString &strFormat); + + static void Num2AllTime (FXJSE_HOBJECT hThis, FX_INT32 iTime, FX_BSTR szFormat, FX_BSTR szLocale, FX_BOOL bGM, CFX_ByteString &strTime); + static void GetLocalTimeZone (FX_INT32 &iHour, FX_INT32 &iMin, FX_INT32 &iSec); + + static void Apr (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void CTerm (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void FV (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void IPmt (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void NPV (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Pmt (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void PPmt (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void PV (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Rate (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Term (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Choose (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Exists (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void HasValue (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Oneof (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Within (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void If (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Eval (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Ref (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void UnitType (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void UnitValue (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + + static void At (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Concat (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Decode (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void DecodeURL (FX_BSTR szURLString, CFX_ByteTextBuf &szResultBuf); + static void DecodeHTML (FX_BSTR szHTMLString, CFX_ByteTextBuf &szResultBuf); + static void DecodeXML (FX_BSTR szXMLString, CFX_ByteTextBuf &szResultBuf); + static void Encode (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void EncodeURL (FX_BSTR szURLString, CFX_ByteTextBuf &szResultBuf); + static void EncodeHTML (FX_BSTR szHTMLString, CFX_ByteTextBuf &szResultBuf); + static void EncodeXML (FX_BSTR szXMLString, CFX_ByteTextBuf &szResultBuf); + static FX_BOOL HTMLSTR2Code (FX_WSTR pData, FX_UINT32 &iCode); + static FX_BOOL HTMLCode2STR (FX_UINT32 iCode, CFX_WideString &wsHTMLReserve); + static void Format (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Left (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Len (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Lower (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Ltrim (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Parse (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Replace (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Right (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Rtrim (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Space (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Str (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Stuff (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Substr (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Uuid (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Upper (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void WordNum (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void TrillionUS (FX_BSTR szData, CFX_ByteTextBuf &strBuf); + static void WordUS (FX_BSTR szData, FX_INT32 iStyle, CFX_ByteTextBuf &strBuf); + + static void Get (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Post (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void Put (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void assign_value_operator (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void logical_or_operator (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void logical_and_operator (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void equality_operator (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void notequality_operator (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static FX_BOOL fm_ref_equal (FXJSE_HOBJECT hThis, CFXJSE_Arguments &args); + static void less_operator (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void lessequal_operator (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void greater_operator (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void greaterequal_operator (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void plus_operator (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void minus_operator (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void multiple_operator (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void divide_operator (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void positive_operator (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void negative_operator (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void logical_not_operator (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void dot_accessor (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void dotdot_accessor (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void eval_translation (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void is_fm_object (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void is_fm_array (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void get_fm_value (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void get_fm_jsobj (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void fm_var_filter (FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static void concat_fm_object(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + + static FX_INT32 hvalue_get_array_length (FXJSE_HOBJECT hThis, FXJSE_HVALUE arg); + static FX_BOOL simpleValueCompare (FXJSE_HOBJECT hThis, FXJSE_HVALUE firstValue, FXJSE_HVALUE secondValue); + static void unfoldArgs (FXJSE_HOBJECT hThis, CFXJSE_Arguments &args, FXJSE_HVALUE *&resultValues, FX_INT32 &iCount, FX_INT32 iStart = 0); + static void GetObjectDefaultValue(FXJSE_HVALUE hObjectValue, FXJSE_HVALUE hDefaultValue); + static FX_BOOL SetObjectDefaultValue(FXJSE_HVALUE hObjectValue, FXJSE_HVALUE hNewValue); + static void GenerateSomExpression(FX_BSTR szName, FX_INT32 iIndexFlags, FX_INT32 iIndexValue, FX_BOOL bIsStar, CFX_ByteString& szSomExp); + static FX_BOOL GetObjectByName(FXJSE_HOBJECT hThis, FXJSE_HVALUE accessorValue, FX_BSTR szAccessorName); + static FX_INT32 ResolveObjects(FXJSE_HOBJECT hThis, FXJSE_HVALUE hParentValue, FX_BSTR bsSomExp, XFA_RESOLVENODE_RS &resoveNodeRS, FX_BOOL bdotAccessor = TRUE, FX_BOOL bHasNoResolveName = FALSE); + static void ParseResolveResult(FXJSE_HOBJECT hThis, const XFA_RESOLVENODE_RS& resoveNodeRS, FXJSE_HVALUE hParentValue, FXJSE_HVALUE *&resultValues, FX_INT32 &iSize, FX_BOOL &bAttribute); + + static FXJSE_HVALUE GetSimpleHValue (FXJSE_HOBJECT hThis, CFXJSE_Arguments &args, FX_UINT32 index); + static FX_BOOL HValueIsNull (FXJSE_HOBJECT hThis, FXJSE_HVALUE hValue); + static FX_INT32 HValueToInteger (FXJSE_HOBJECT hThis, FXJSE_HVALUE hValue); + static FX_DOUBLE StringToDouble(FX_BSTR szStringVal); + static FX_FLOAT HValueToFloat (FXJSE_HOBJECT hThis, FXJSE_HVALUE hValue); + static FX_DOUBLE HValueToDouble (FXJSE_HOBJECT hThis, FXJSE_HVALUE hValue); + static void HValueToUTF8String (FXJSE_HVALUE hValue, CFX_ByteString& outputValue); + CXFA_FM2JSContext(); + ~CXFA_FM2JSContext(); + static CXFA_FM2JSContext* Create(); + void Initialize(FXJSE_HRUNTIME hScriptRuntime, FXJSE_HCONTEXT hScriptContext, CXFA_Document* pDoc); + void GlobalPropertyGetter(FXJSE_HVALUE hValue); + void Release(); + FXJSE_HRUNTIME GetScriptRuntime() const + { + return m_hScriptRuntime; + } + CXFA_Document* GetDocument() const + { + return m_pDocument; + } + void ThrowScriptErrorMessage(FX_INT32 iStringID, ...); +private: + FXJSE_HRUNTIME m_hScriptRuntime; + FXJSE_CLASS m_fmClass; + FXJSE_HCLASS m_hFMClass; + FXJSE_HVALUE m_hValue; + CXFA_Document* m_pDocument; +}; +#endif diff --git a/xfa/src/fxfa/src/fm2js/xfa_fmparse.cpp b/xfa/src/fxfa/src/fm2js/xfa_fmparse.cpp new file mode 100644 index 0000000000..69de9f29da --- /dev/null +++ b/xfa/src/fxfa/src/fm2js/xfa_fmparse.cpp @@ -0,0 +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 "xfa_fm2js.h" +CXFA_FMParse::CXFA_FMParse() +{ + m_pScript = 0; + m_uLength = 0; + m_pErrorInfo = 0; + m_lexer = 0; + m_pToken = 0; +} +CXFA_FMParse::~CXFA_FMParse() +{ + if (m_lexer) { + delete m_lexer; + } + m_lexer = 0; + m_pErrorInfo = 0; + m_pScript = 0; + m_pToken = 0; +} +FX_INT32 CXFA_FMParse::Init(FX_WSTR wsFormcalc, CXFA_FMErrorInfo *pErrorInfo) +{ + m_pScript = wsFormcalc.GetPtr(); + m_uLength = wsFormcalc.GetLength(); + m_pErrorInfo = pErrorInfo; + m_lexer = FX_NEW CXFA_FMLexer(wsFormcalc, m_pErrorInfo); + if (m_lexer == 0) { + return -1; + } + return 0; +} +void CXFA_FMParse::NextToken() +{ + m_pToken = m_lexer->NextToken(); + while (m_pToken->m_type == TOKreserver) { + if (m_lexer->HasError()) { + break; + } + m_pToken = m_lexer->NextToken(); + } +} +void CXFA_FMParse::Check( XFA_FM_TOKEN op ) +{ + if (m_pToken->m_type != op) { + CFX_WideString ws_TempString = m_pToken->m_wstring; + Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN, XFA_FM_KeywordToString(op), FX_LPCWSTR(ws_TempString)); + } + NextToken(); +} +void CXFA_FMParse::Error(FX_DWORD lineNum, XFA_FM_ERRMSG msg, ...) +{ + m_pErrorInfo->linenum = lineNum; + FX_LPCWSTR lpMessageInfo = XFA_FM_ErrorMsg(msg); + va_list ap; + va_start(ap, msg); + m_pErrorInfo->message.FormatV(lpMessageInfo, ap); + va_end(ap); +} +CFX_PtrArray * CXFA_FMParse::ParseTopExpression() +{ + CXFA_FMExpression *e = 0; + CFX_PtrArray * expression = FX_NEW CFX_PtrArray(); + while (1) { + if (m_pToken->m_type == TOKeof) { + return expression; + } + if (m_pToken->m_type == TOKendfunc) { + return expression; + } + if (m_pToken->m_type == TOKendif) { + return expression; + } + if (m_pToken->m_type == TOKelseif) { + return expression; + } + if (m_pToken->m_type == TOKelse) { + return expression; + } + if (m_pToken->m_type == TOKfunc) { + e = ParseFunction(); + if (e) { + expression->Add(e); + } else { + break; + } + } else { + e = ParseExpression(); + if (e) { + expression->Add(e); + } else { + break; + } + } + } + return expression; +} +CXFA_FMExpression * CXFA_FMParse::ParseFunction() +{ + CXFA_FMExpression *e = 0; + CFX_WideStringC ident; + CFX_WideStringCArray * pArguments = 0; + CFX_PtrArray * pExpressions = 0; + FX_DWORD line = m_pToken->m_uLinenum; + NextToken(); + if (m_pToken->m_type != TOKidentifier) { + CFX_WideString ws_TempString = m_pToken->m_wstring; + Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IDENTIFIER, FX_LPCWSTR(ws_TempString)); + } else { + ident = m_pToken->m_wstring; + NextToken(); + } + Check(TOKlparen); + if (m_pToken->m_type == TOKrparen) { + NextToken(); + } else { + pArguments = FX_NEW CFX_WideStringCArray(); + CFX_WideStringC p; + while (1) { + if (m_pToken->m_type == TOKidentifier) { + p = m_pToken->m_wstring; + pArguments->Add(p); + NextToken(); + if (m_pToken->m_type == TOKcomma) { + NextToken(); + continue; + } else if (m_pToken->m_type == TOKrparen) { + NextToken(); + break; + } else { + Check(TOKrparen); + break; + } + } else { + CFX_WideString ws_TempString = m_pToken->m_wstring; + Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IDENTIFIER, FX_LPCWSTR(ws_TempString)); + NextToken(); + break; + } + } + } + Check(TOKdo); + if (m_pToken->m_type == TOKendfunc) { + NextToken(); + } else { + pExpressions = ParseTopExpression(); + Check(TOKendfunc); + } + if (m_pErrorInfo->message.IsEmpty()) { + e = FX_NEW CXFA_FMFunctionDefinition(line, 0, ident, pArguments, pExpressions); + } else { + FX_INT32 size = 0; + FX_INT32 index = 0; + if (pArguments) { + pArguments->RemoveAll(); + delete pArguments; + pArguments = 0; + } + index = 0; + if (pExpressions) { + CXFA_FMExpression *e1 = 0; + size = pExpressions->GetSize(); + while(index < size) { + e1 = (CXFA_FMExpression *)pExpressions->GetAt(index); + delete e1; + index++; + } + pExpressions->RemoveAll(); + delete pExpressions; + pExpressions = 0; + } + } + return e; +} +CXFA_FMExpression * CXFA_FMParse::ParseExpression() +{ + CXFA_FMExpression *e = 0; + FX_DWORD line = m_pToken->m_uLinenum; + switch (m_pToken->m_type) { + case TOKvar: + e = ParseVarExpression(); + break; + case TOKnull: + case TOKnumber: + case TOKstring: + case TOKplus: + case TOKminus: + case TOKksnot: + case TOKidentifier: + case TOKlparen: + e = ParseExpExpression(); + break; + case TOKif: + e = ParseIfExpression(); + break; + case TOKwhile: + e = ParseWhileExpression(); + break; + case TOKfor: + e = ParseForExpression(); + break; + case TOKforeach: + e = ParseForeachExpression(); + break; + case TOKdo: + e = ParseDoExpression(); + break; + case TOKbreak: + e = FX_NEW CXFA_FMBreakExpression(line); + NextToken(); + break; + case TOKcontinue: + e = FX_NEW CXFA_FMContinueExpression(line); + NextToken(); + break; + default: + CFX_WideString ws_TempString = m_pToken->m_wstring; + Error(m_pToken->m_uLinenum, FMERR_UNEXPECTED_EXPRESSION, FX_LPCWSTR(ws_TempString)); + NextToken(); + break; + } + return e; +} +CXFA_FMExpression * CXFA_FMParse::ParseVarExpression() +{ + CXFA_FMExpression * e = 0; + CFX_WideStringC ident; + FX_DWORD line = m_pToken->m_uLinenum; + NextToken(); + if (m_pToken->m_type != TOKidentifier) { + CFX_WideString ws_TempString = m_pToken->m_wstring; + Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IDENTIFIER, FX_LPCWSTR(ws_TempString)); + } else { + ident = m_pToken->m_wstring; + NextToken(); + } + if( m_pToken->m_type == TOKassign) { + NextToken(); + e = ParseExpExpression(); + } + if (m_pErrorInfo->message.IsEmpty()) { + e = FX_NEW CXFA_FMVarExpression(line, ident, e); + } else { + delete e; + e = 0; + } + return e; +} +CXFA_FMSimpleExpression * CXFA_FMParse::ParseSimpleExpression() +{ + FX_DWORD line = m_pToken->m_uLinenum; + CXFA_FMSimpleExpression *pExp1 = 0, *pExp2 = 0; + pExp1 = ParseLogicalOrExpression(); + while (m_pToken->m_type == TOKassign) { + NextToken(); + pExp2 = ParseLogicalOrExpression(); + if (m_pErrorInfo->message.IsEmpty()) { + pExp1 = FX_NEW CXFA_FMAssignExpression(line, TOKassign, pExp1, pExp2); + } else { + delete pExp1; + pExp1 = 0; + } + } + return pExp1; +} +CXFA_FMExpression * CXFA_FMParse::ParseExpExpression() +{ + CXFA_FMExpression *e = 0; + FX_DWORD line = m_pToken->m_uLinenum; + CXFA_FMSimpleExpression *pExp1 = 0 ; + pExp1 = ParseSimpleExpression(); + if (m_pErrorInfo->message.IsEmpty()) { + e = FX_NEW CXFA_FMExpExpression(line, pExp1); + } else { + delete pExp1; + e = 0; + } + return e; +} +CXFA_FMSimpleExpression * CXFA_FMParse::ParseLogicalOrExpression() +{ + CXFA_FMSimpleExpression *e1 = 0, *e2 = 0; + FX_DWORD line = m_pToken->m_uLinenum; + e1 = ParseLogicalAndExpression(); + for (;;) { + switch (m_pToken->m_type) { + case TOKor: + case TOKksor: + NextToken(); + e2 = ParseLogicalAndExpression(); + if (m_pErrorInfo->message.IsEmpty()) { + e1 = FX_NEW CXFA_FMLogicalOrExpression(line, TOKor, e1, e2); + } else { + delete e1; + e1 = 0; + } + continue; + default: + break; + } + break; + } + return e1; +} +CXFA_FMSimpleExpression * CXFA_FMParse::ParseLogicalAndExpression() +{ + CXFA_FMSimpleExpression *e1 = 0, *e2 = 0; + FX_DWORD line = m_pToken->m_uLinenum; + e1 = ParseEqualityExpression(); + for (;;) { + switch (m_pToken->m_type) { + case TOKand: + case TOKksand: + NextToken(); + e2 = ParseEqualityExpression(); + if (m_pErrorInfo->message.IsEmpty()) { + e1 = FX_NEW CXFA_FMLogicalAndExpression(line, TOKand, e1, e2); + } else { + delete e1; + e1 = 0; + } + continue; + default: + break; + } + break; + } + return e1; +} +CXFA_FMSimpleExpression * CXFA_FMParse::ParseEqualityExpression() +{ + CXFA_FMSimpleExpression *e1 = 0, *e2 = 0; + FX_DWORD line = m_pToken->m_uLinenum; + e1 = ParseRelationalExpression(); + for (;;) { + switch (m_pToken->m_type) { + case TOKeq: + case TOKkseq: + NextToken(); + e2 = ParseRelationalExpression(); + if (m_pErrorInfo->message.IsEmpty()) { + e1 = FX_NEW CXFA_FMEqualityExpression(line, TOKeq, e1, e2); + } else { + delete e1; + e1 = 0; + } + continue; + case TOKne: + case TOKksne: + NextToken(); + e2 = ParseRelationalExpression(); + if (m_pErrorInfo->message.IsEmpty()) { + e1 = FX_NEW CXFA_FMEqualityExpression(line, TOKne, e1, e2); + } else { + delete e1; + e1 = 0; + } + continue; + default: + break; + } + break; + } + return e1; +} +CXFA_FMSimpleExpression * CXFA_FMParse::ParseRelationalExpression() +{ + CXFA_FMSimpleExpression *e1 = 0, *e2 = 0; + FX_DWORD line = m_pToken->m_uLinenum; + e1 = ParseAddtiveExpression(); + for (;;) { + switch (m_pToken->m_type) { + case TOKlt: + case TOKkslt: + NextToken(); + e2 = ParseAddtiveExpression(); + if (m_pErrorInfo->message.IsEmpty()) { + e1 = FX_NEW CXFA_FMRelationalExpression(line, TOKlt, e1, e2); + } else { + delete e1; + e1 = 0; + } + continue; + case TOKgt: + case TOKksgt: + NextToken(); + e2 = ParseAddtiveExpression(); + if (m_pErrorInfo->message.IsEmpty()) { + e1 = FX_NEW CXFA_FMRelationalExpression(line, TOKgt, e1, e2); + } else { + delete e1; + e1 = 0; + } + continue; + case TOKle: + case TOKksle: + NextToken(); + e2 = ParseAddtiveExpression(); + if (m_pErrorInfo->message.IsEmpty()) { + e1 = FX_NEW CXFA_FMRelationalExpression(line, TOKle, e1, e2); + } else { + delete e1; + e1 = 0; + } + continue; + case TOKge: + case TOKksge: + NextToken(); + e2 = ParseAddtiveExpression(); + if (m_pErrorInfo->message.IsEmpty()) { + e1 = FX_NEW CXFA_FMRelationalExpression(line, TOKge, e1, e2); + } else { + delete e1; + e1 = 0; + } + continue; + default: + break; + } + break; + } + return e1; +} +CXFA_FMSimpleExpression * CXFA_FMParse::ParseAddtiveExpression() +{ + CXFA_FMSimpleExpression *e1 = 0, *e2 = 0; + FX_DWORD line = m_pToken->m_uLinenum; + e1 = ParseMultiplicativeExpression(); + for (;;) { + switch (m_pToken->m_type) { + case TOKplus: + NextToken(); + e2 = ParseMultiplicativeExpression(); + if (m_pErrorInfo->message.IsEmpty()) { + e1 = FX_NEW CXFA_FMAdditiveExpression(line, TOKplus, e1, e2); + } else { + delete e1; + e1 = 0; + } + continue; + case TOKminus: + NextToken(); + e2 = ParseMultiplicativeExpression(); + if (m_pErrorInfo->message.IsEmpty()) { + e1 = FX_NEW CXFA_FMAdditiveExpression(line, TOKminus, e1, e2); + } else { + delete e1; + e1 = 0; + } + continue; + default: + break; + } + break; + } + return e1; +} +CXFA_FMSimpleExpression * CXFA_FMParse::ParseMultiplicativeExpression() +{ + CXFA_FMSimpleExpression *e1 = 0, *e2 = 0; + FX_DWORD line = m_pToken->m_uLinenum; + e1 = ParseUnaryExpression(); + for (;;) { + switch (m_pToken->m_type) { + case TOKmul: + NextToken(); + e2 = ParseUnaryExpression(); + if (m_pErrorInfo->message.IsEmpty()) { + e1 = FX_NEW CXFA_FMMultiplicativeExpression(line, TOKmul, e1, e2); + } else { + delete e1; + e1 = 0; + } + continue; + case TOKdiv: + NextToken(); + e2 = ParseUnaryExpression(); + if (m_pErrorInfo->message.IsEmpty()) { + e1 = FX_NEW CXFA_FMMultiplicativeExpression(line, TOKdiv, e1, e2); + } else { + delete e1; + e1 = 0; + } + continue; + default: + break; + } + break; + } + return e1; +} +CXFA_FMSimpleExpression * CXFA_FMParse::ParseUnaryExpression() +{ + CXFA_FMSimpleExpression *e = 0; + FX_DWORD line = m_pToken->m_uLinenum; + switch (m_pToken->m_type) { + case TOKplus: + NextToken(); + e = ParseUnaryExpression(); + if (m_pErrorInfo->message.IsEmpty()) { + e = FX_NEW CXFA_FMPosExpression(line, e); + } else { + e = 0; + } + break; + case TOKminus: + NextToken(); + e = ParseUnaryExpression(); + if (m_pErrorInfo->message.IsEmpty()) { + e = FX_NEW CXFA_FMNegExpression(line, e); + } else { + e = 0; + } + break; + case TOKksnot: + NextToken(); + e = ParseUnaryExpression(); + if (m_pErrorInfo->message.IsEmpty()) { + e = FX_NEW CXFA_FMNotExpression(line, e); + } else { + e = 0; + } + break; + default: + e = ParsePrimaryExpression(); + break; + } + return e; +} +CXFA_FMSimpleExpression * CXFA_FMParse::ParsePrimaryExpression() +{ + CXFA_FMSimpleExpression *e = 0; + FX_DWORD line = m_pToken->m_uLinenum; + switch (m_pToken->m_type) { + case TOKnumber: + e = FX_NEW CXFA_FMNumberExpression(line, m_pToken->m_wstring); + NextToken(); + break; + case TOKstring: + e = FX_NEW CXFA_FMStringExpression(line, m_pToken->m_wstring); + NextToken(); + break; + case TOKidentifier: { + CFX_WideStringC wsIdentifier(m_pToken->m_wstring); + NextToken(); + if (m_pToken->m_type == TOKlbracket) { + CXFA_FMSimpleExpression *s = ParseIndexExpression(); + if(s) { + e = FX_NEW CXFA_FMDotAccessorExpression(line, NULL, TOKdot, wsIdentifier, s); + } + NextToken(); + } else { + e = FX_NEW CXFA_FMIdentifierExpressionn(line, wsIdentifier); + } + } + break; + case TOKif: + e = FX_NEW CXFA_FMIdentifierExpressionn(line, m_pToken->m_wstring); + NextToken(); + break; + case TOKnull: + e = FX_NEW CXFA_FMNullExpression(line); + NextToken(); + break; + case TOKlparen: + e = ParseParenExpression(); + break; + default: + CFX_WideString ws_TempString = m_pToken->m_wstring; + Error(m_pToken->m_uLinenum, FMERR_UNEXPECTED_EXPRESSION, FX_LPCWSTR(ws_TempString)); + NextToken(); + break; + } + e = ParsePostExpression(e); + if (!(m_pErrorInfo->message.IsEmpty())) { + delete e; + e = 0; + } + return e; +} +CXFA_FMSimpleExpression *CXFA_FMParse::ParsePostExpression(CXFA_FMSimpleExpression *e) +{ + FX_DWORD line = m_pToken->m_uLinenum; + while (1) { + switch (m_pToken->m_type) { + case TOKlparen: { + NextToken(); + CFX_PtrArray *pArray = 0; + if (m_pToken->m_type != TOKrparen) { + pArray = FX_NEW CFX_PtrArray(); + while (m_pToken->m_type != TOKrparen) { + CXFA_FMSimpleExpression *e = ParseSimpleExpression(); + if (e) { + pArray->Add(e); + } + if (m_pToken->m_type == TOKcomma) { + NextToken(); + } else if (m_pToken->m_type == TOKeof) { + break; + } + } + if (m_pToken->m_type != TOKrparen) { + CFX_WideString ws_TempString = m_pToken->m_wstring; + Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN, XFA_FM_KeywordToString(TOKrparen), FX_LPCWSTR(ws_TempString)); + } + } + if (m_pErrorInfo->message.IsEmpty()) { + e = FX_NEW CXFA_FMCallExpression(line, e, pArray, FALSE); + NextToken(); + if (m_pToken->m_type != TOKlbracket) { + continue; + } + CXFA_FMSimpleExpression *s = ParseIndexExpression(); + if(s) { + e = FX_NEW CXFA_FMDotAccessorExpression(line, e, TOKcall, FX_WSTRC(L""), s); + } else { + delete e; + e = 0; + } + } else { + FX_INT32 iSize = pArray->GetSize(); + for (FX_INT32 i = 0; i < iSize; ++i) { + CXFA_FMSimpleExpression *pTemp = (CXFA_FMSimpleExpression *)pArray->GetAt(i); + delete pTemp; + } + delete pArray; + delete e; + e = 0; + } + } + break; + case TOKdot: + NextToken(); + if (m_pToken->m_type == TOKidentifier) { + CFX_WideStringC tempStr = m_pToken->m_wstring; + FX_DWORD tempLine = m_pToken->m_uLinenum; + NextToken(); + if (m_pToken->m_type == TOKlparen) { + CXFA_FMSimpleExpression *pExpAccessor; + CXFA_FMSimpleExpression *pExpCall; + pExpAccessor = e; + NextToken(); + CFX_PtrArray *pArray = 0; + if (m_pToken->m_type != TOKrparen) { + pArray = FX_NEW CFX_PtrArray(); + while (m_pToken->m_type != TOKrparen) { + CXFA_FMSimpleExpression *exp = ParseSimpleExpression(); + pArray->Add(exp); + if (m_pToken->m_type == TOKcomma) { + NextToken(); + } else if (m_pToken->m_type == TOKeof) { + break; + } + } + if (m_pToken->m_type != TOKrparen) { + CFX_WideString ws_TempString = m_pToken->m_wstring; + Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN, XFA_FM_KeywordToString(TOKrparen), FX_LPCWSTR(ws_TempString)); + } + } + if (m_pErrorInfo->message.IsEmpty()) { + CXFA_FMSimpleExpression *pIdentifier = FX_NEW CXFA_FMIdentifierExpressionn(tempLine, tempStr); + pExpCall = FX_NEW CXFA_FMCallExpression(line, pIdentifier, pArray, TRUE); + e = FX_NEW CXFA_FMMethodCallExpression(line, pExpAccessor, pExpCall); + NextToken(); + if (m_pToken->m_type != TOKlbracket) { + continue; + } + CXFA_FMSimpleExpression *s = ParseIndexExpression(); + if(s) { + e = FX_NEW CXFA_FMDotAccessorExpression(line, e, TOKcall, FX_WSTRC(L""), s); + } else { + delete e; + e = 0; + } + } else { + FX_INT32 iSize = pArray->GetSize(); + for (FX_INT32 i = 0; i < iSize; ++i) { + CXFA_FMSimpleExpression *pTemp = (CXFA_FMSimpleExpression *)pArray->GetAt(i); + delete pTemp; + } + delete pArray; + delete e; + e = 0; + } + } else if (m_pToken->m_type == TOKlbracket) { + CXFA_FMSimpleExpression *s = ParseIndexExpression(); + if(!(m_pErrorInfo->message.IsEmpty())) { + if (s) { + delete s; + s = 0; + } + if (e) { + delete e; + e = 0; + } + return e; + } + e = FX_NEW CXFA_FMDotAccessorExpression(tempLine, e, TOKdot, tempStr, s); + } else { + CXFA_FMSimpleExpression *s = FX_NEW CXFA_FMIndexExpression(tempLine, ACCESSOR_NO_INDEX, NULL, FALSE); + e = FX_NEW CXFA_FMDotAccessorExpression(line, e, TOKdot, tempStr, s); + continue; + } + } else { + CFX_WideString ws_TempString = m_pToken->m_wstring; + Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IDENTIFIER, FX_LPCWSTR(ws_TempString)); + return e; + } + break; + case TOKdotdot: + NextToken(); + if (m_pToken->m_type == TOKidentifier) { + CFX_WideStringC tempStr = m_pToken->m_wstring; + FX_DWORD tempLine = m_pToken->m_uLinenum; + NextToken(); + if (m_pToken->m_type == TOKlbracket) { + CXFA_FMSimpleExpression *s = ParseIndexExpression(); + if(!(m_pErrorInfo->message.IsEmpty())) { + if (s) { + delete s; + s = 0; + } + if (e) { + delete e; + e = 0; + } + return e; + } + e = FX_NEW CXFA_FMDotDotAccessorExpression(tempLine, e, TOKdotdot, tempStr, s); + } else { + CXFA_FMSimpleExpression *s = FX_NEW CXFA_FMIndexExpression(tempLine, ACCESSOR_NO_INDEX, NULL, FALSE); + e = FX_NEW CXFA_FMDotDotAccessorExpression(line, e, TOKdotdot, tempStr, s); + continue; + } + } else { + CFX_WideString ws_TempString = m_pToken->m_wstring; + Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IDENTIFIER, FX_LPCWSTR(ws_TempString)); + return e; + } + break; + case TOKdotscream: + NextToken(); + if (m_pToken->m_type == TOKidentifier) { + CFX_WideStringC tempStr = m_pToken->m_wstring; + FX_DWORD tempLine = m_pToken->m_uLinenum; + NextToken(); + if (m_pToken->m_type == TOKlbracket) { + CXFA_FMSimpleExpression *s = ParseIndexExpression(); + if(!(m_pErrorInfo->message.IsEmpty())) { + if (s) { + delete s; + s = 0; + } + if (e) { + delete e; + e = 0; + } + return e; + } + e = FX_NEW CXFA_FMDotAccessorExpression(tempLine, e, TOKdotscream, tempStr, s); + } else { + CXFA_FMSimpleExpression *s = FX_NEW CXFA_FMIndexExpression(tempLine, ACCESSOR_NO_INDEX, NULL, FALSE); + e = FX_NEW CXFA_FMDotAccessorExpression(line, e, TOKdotscream, tempStr, s); + continue; + } + } else { + CFX_WideString ws_TempString = m_pToken->m_wstring; + Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IDENTIFIER, FX_LPCWSTR(ws_TempString)); + return e; + } + break; + case TOKdotstar: { + CXFA_FMSimpleExpression *s = FX_NEW CXFA_FMIndexExpression(line, ACCESSOR_NO_INDEX, NULL, FALSE); + e = FX_NEW CXFA_FMDotAccessorExpression(line, e, TOKdotstar, FX_WSTRC(L"*"), s); + } + break; + default: + return e; + } + NextToken(); + } + return e; +} +CXFA_FMSimpleExpression *CXFA_FMParse::ParseIndexExpression() +{ + CXFA_FMSimpleExpression *pExp = 0; + FX_DWORD line = m_pToken->m_uLinenum; + NextToken(); + CXFA_FMSimpleExpression *s = 0; + XFA_FM_AccessorIndex accessorIndex = ACCESSOR_NO_RELATIVEINDEX; + if (m_pToken->m_type == TOKmul) { + pExp = FX_NEW CXFA_FMIndexExpression(line, accessorIndex, s, TRUE); + NextToken(); + if (m_pToken->m_type != TOKrbracket) { + CFX_WideString ws_TempString = m_pToken->m_wstring; + Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN, XFA_FM_KeywordToString(TOKrparen), FX_LPCWSTR(ws_TempString)); + if (pExp) { + delete pExp; + pExp = 0; + } + } + return pExp; + } + if(m_pToken->m_type == TOKplus) { + accessorIndex = ACCESSOR_POSITIVE_INDEX; + NextToken(); + } else if(m_pToken->m_type == TOKminus) { + accessorIndex = ACCESSOR_NEGATIVE_INDEX; + NextToken(); + } + s = ParseSimpleExpression(); + if (m_pToken->m_type != TOKrbracket) { + CFX_WideString ws_TempString = m_pToken->m_wstring; + Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN, XFA_FM_KeywordToString(TOKrparen), FX_LPCWSTR(ws_TempString)); + if (s) { + delete s; + } + } else { + pExp = FX_NEW CXFA_FMIndexExpression(line, accessorIndex, s, FALSE); + } + return pExp; +} +CXFA_FMSimpleExpression * CXFA_FMParse::ParseParenExpression() +{ + CXFA_FMSimpleExpression *pExp1 = 0, *pExp2 = 0; + FX_DWORD line = m_pToken->m_uLinenum; + Check(TOKlparen); + if (m_pToken->m_type != TOKrparen) { + pExp1 = ParseLogicalOrExpression(); + while (m_pToken->m_type == TOKassign) { + NextToken(); + pExp2 = ParseLogicalOrExpression(); + if (m_pErrorInfo->message.IsEmpty()) { + pExp1 = FX_NEW CXFA_FMAssignExpression(line, TOKassign, pExp1, pExp2); + } else { + delete pExp1; + pExp1 = 0; + } + } + Check(TOKrparen); + } else { + NextToken(); + } + return pExp1; +} +CXFA_FMExpression * CXFA_FMParse::ParseBlockExpression() +{ + FX_DWORD line = m_pToken->m_uLinenum; + CXFA_FMExpression *e = 0; + CFX_PtrArray * expression = FX_NEW CFX_PtrArray(); + while (1) { + switch (m_pToken->m_type) { + case TOKeof: + case TOKendif: + case TOKelseif: + case TOKelse: + case TOKendwhile: + case TOKendfor: + case TOKend: + case TOKendfunc: + break; + case TOKfunc: + e = ParseFunction(); + if (e) { + expression->Add(e); + } + continue; + default: + e = ParseExpression(); + if (e) { + expression->Add(e); + } + continue; + } + break; + } + CXFA_FMBlockExpression *pExp = 0; + if (m_pErrorInfo->message.IsEmpty()) { + pExp = FX_NEW CXFA_FMBlockExpression(line, expression); + } else { + FX_INT32 size = expression->GetSize(); + FX_INT32 index = 0; + while(index < size) { + e = (CXFA_FMExpression *)expression->GetAt(index); + delete e; + index++; + } + expression->RemoveAll(); + delete expression; + expression = 0; + } + return pExp; +} +CXFA_FMExpression * CXFA_FMParse::ParseIfExpression() +{ + CXFA_FMSimpleExpression *pExpression = 0; + CXFA_FMExpression *pIfExpression = 0; + CXFA_FMExpression *pElseExpression = 0; + FX_DWORD line = m_pToken->m_uLinenum; + FX_LPCWSTR pStartPos = m_lexer->SavePos(); + NextToken(); + Check(TOKlparen); + while (m_pToken->m_type != TOKrparen) { + if (pExpression) { + delete pExpression; + } + pExpression = ParseSimpleExpression(); + if (m_pToken->m_type == TOKcomma) { + NextToken(); + } else { + break; + } + } + Check(TOKrparen); + if (m_pToken->m_type != TOKthen) { + if (pExpression) { + delete pExpression; + } + m_lexer->SetCurrentLine(line); + m_pToken = FX_NEW CXFA_FMToken(line); + m_pToken->m_type = TOKidentifier; + m_pToken->m_wstring = FX_WSTRC(L"if"); + m_lexer->SetToken(m_pToken); + m_lexer->RestorePos(pStartPos); + return ParseExpExpression(); + } + Check(TOKthen); + pIfExpression = ParseBlockExpression(); + switch (m_pToken->m_type) { + case TOKeof: + case TOKendif: + Check(TOKendif); + break; + case TOKif: + pElseExpression = ParseIfExpression(); + Check(TOKendif); + break; + case TOKelseif: + pElseExpression = ParseIfExpression(); + break; + case TOKelse: + NextToken(); + pElseExpression = ParseBlockExpression(); + Check(TOKendif); + break; + default: + CFX_WideString ws_TempString = m_pToken->m_wstring; + Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IFEND, FX_LPCWSTR(ws_TempString)); + NextToken(); + break; + } + CXFA_FMIfExpression *pExp = 0; + if (m_pErrorInfo->message.IsEmpty()) { + pExp = FX_NEW CXFA_FMIfExpression(line, pExpression, pIfExpression, pElseExpression); + } else { + if (pExpression) { + delete pExpression; + } + if (pIfExpression) { + delete pIfExpression; + } + if (pElseExpression) { + delete pElseExpression; + } + } + return pExp; +} +CXFA_FMExpression * CXFA_FMParse::ParseWhileExpression() +{ + CXFA_FMExpression *e = 0; + CXFA_FMSimpleExpression *pCondition = 0; + CXFA_FMExpression *pExpression = 0; + FX_DWORD line = m_pToken->m_uLinenum; + NextToken(); + pCondition = ParseParenExpression(); + Check(TOKdo); + pExpression = ParseBlockExpression(); + Check(TOKendwhile); + if (!m_pErrorInfo->message.IsEmpty()) { + if (pCondition) { + delete pCondition; + } + if (pExpression) { + delete pExpression; + } + delete e; + e = 0; + } else { + e = FX_NEW CXFA_FMWhileExpression(line, pCondition, pExpression); + } + return e; +} +CXFA_FMSimpleExpression * CXFA_FMParse::ParseSubassignmentInForExpression() +{ + CXFA_FMSimpleExpression *e = 0; + FX_DWORD line = m_pToken->m_uLinenum; + switch (m_pToken->m_type) { + case TOKidentifier: + e = ParseSimpleExpression(); + break; + default: + CFX_WideString ws_TempString = m_pToken->m_wstring; + Error(m_pToken->m_uLinenum, FMERR_UNEXPECTED_EXPRESSION, FX_LPCWSTR(ws_TempString)); + NextToken(); + break; + } + return e; +} +CXFA_FMExpression * CXFA_FMParse::ParseForExpression() +{ + CXFA_FMExpression *e = 0; + CFX_WideStringC wsVariant; + CXFA_FMSimpleExpression *pAssignment = 0; + CXFA_FMSimpleExpression *pAccessor = 0; + CXFA_FMSimpleExpression *pStep = 0; + CXFA_FMExpression *pList = 0; + FX_DWORD line = m_pToken->m_uLinenum; + NextToken(); + if (m_pToken->m_type != TOKidentifier) { + CFX_WideString ws_TempString = m_pToken->m_wstring; + Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN, XFA_FM_KeywordToString(m_pToken->m_type), FX_LPCWSTR(ws_TempString)); + } + wsVariant = m_pToken->m_wstring; + NextToken(); + if( m_pToken->m_type == TOKassign) { + NextToken(); + pAssignment = ParseSimpleExpression(); + } else { + CFX_WideString ws_TempString = m_pToken->m_wstring; + Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN, XFA_FM_KeywordToString(m_pToken->m_type), FX_LPCWSTR(ws_TempString)); + } + FX_INT32 iDirection = 0; + if (m_pToken->m_type == TOKupto) { + iDirection = 1; + } else if (m_pToken->m_type == TOKdownto) { + iDirection = -1; + } else { + CFX_WideString ws_TempString = m_pToken->m_wstring; + Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN, (FX_LPCWSTR)(L"upto or downto"), (FX_LPCWSTR)ws_TempString); + } + NextToken(); + pAccessor = ParseSimpleExpression(); + if (m_pToken->m_type == TOKstep) { + NextToken(); + pStep = ParseSimpleExpression(); + } + Check(TOKdo); + pList = ParseBlockExpression(); + Check(TOKendfor); + if (m_pErrorInfo->message.IsEmpty()) { + e = FX_NEW CXFA_FMForExpression(line, wsVariant, pAssignment, pAccessor, iDirection, pStep, pList); + } else { + if (pAssignment) { + delete pAssignment; + } + if (pAccessor) { + delete pAccessor; + } + if (pStep) { + delete pStep; + } + if (pList) { + delete pList; + } + } + return e; +} +CXFA_FMExpression * CXFA_FMParse::ParseForeachExpression() +{ + CXFA_FMExpression *e = 0; + CFX_WideStringC wsIdentifier; + CFX_PtrArray *pAccessors = 0; + CXFA_FMExpression *pList = 0; + FX_DWORD line = m_pToken->m_uLinenum; + NextToken(); + if (m_pToken->m_type != TOKidentifier) { + CFX_WideString ws_TempString = m_pToken->m_wstring; + Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN, XFA_FM_KeywordToString(m_pToken->m_type), FX_LPCWSTR(ws_TempString)); + } + wsIdentifier = m_pToken->m_wstring; + NextToken(); + Check(TOKin); + Check(TOKlparen); + if (m_pToken->m_type == TOKrparen) { + CFX_WideString ws_TempString = m_pToken->m_wstring; + Error(m_pToken->m_uLinenum, FMERR_UNEXPECTED_EXPRESSION, FX_LPCWSTR(ws_TempString)); + NextToken(); + } else { + pAccessors = FX_NEW CFX_PtrArray(); + while (m_pToken->m_type != TOKrparen) { + CXFA_FMSimpleExpression *s = ParseSimpleExpression(); + if (s) { + pAccessors->Add(s); + } + if (m_pToken->m_type == TOKcomma) { + NextToken(); + } else { + break; + } + } + Check(TOKrparen); + } + Check(TOKdo); + pList = ParseBlockExpression(); + Check(TOKendfor); + if (m_pErrorInfo->message.IsEmpty()) { + e = FX_NEW CXFA_FMForeachExpression(line, wsIdentifier, pAccessors, pList); + } else { + if (pAccessors) { + CXFA_FMSimpleExpression *s = 0; + FX_INT32 size = pAccessors->GetSize(); + FX_INT32 index = 0; + while(index < size) { + s = (CXFA_FMSimpleExpression *)pAccessors->GetAt(index); + delete s; + index++; + } + pAccessors->RemoveAll(); + delete pAccessors; + pAccessors = 0; + } + if (pList) { + delete pList; + } + } + return e; +} +CXFA_FMExpression * CXFA_FMParse::ParseDoExpression() +{ + CXFA_FMExpression *e = 0; + FX_DWORD line = m_pToken->m_uLinenum; + NextToken(); + e = ParseBlockExpression(); + Check(TOKend); + if (m_pErrorInfo->message.IsEmpty()) { + e = FX_NEW CXFA_FMDoExpression(line, e); + } else { + delete e; + e = 0; + } + return e; +} diff --git a/xfa/src/fxfa/src/fm2js/xfa_fmparse.h b/xfa/src/fxfa/src/fm2js/xfa_fmparse.h new file mode 100644 index 0000000000..06df65135f --- /dev/null +++ b/xfa/src/fxfa/src/fm2js/xfa_fmparse.h @@ -0,0 +1,49 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _XFA_FM_PARSE_H +#define _XFA_FM_PARSE_H +class CXFA_FMParse : public CFX_Object +{ +public: + CXFA_FMParse(); + ~CXFA_FMParse(); + FX_INT32 Init(FX_WSTR wsFormcalc, CXFA_FMErrorInfo *pErrorInfo); + void NextToken(); + void Check(XFA_FM_TOKEN op); + void Error(FX_DWORD lineNum, XFA_FM_ERRMSG msg, ...); + CFX_PtrArray * ParseTopExpression(); + CXFA_FMExpression *ParseFunction(); + CXFA_FMExpression *ParseExpression(); + CXFA_FMExpression *ParseVarExpression(); + CXFA_FMExpression *ParseExpExpression(); + CXFA_FMExpression *ParseBlockExpression(); + CXFA_FMExpression *ParseIfExpression(); + CXFA_FMExpression *ParseWhileExpression(); + CXFA_FMExpression *ParseForExpression(); + CXFA_FMExpression *ParseForeachExpression(); + CXFA_FMExpression *ParseDoExpression(); + CXFA_FMSimpleExpression *ParseParenExpression(); + CXFA_FMSimpleExpression *ParseSimpleExpression(); + CXFA_FMSimpleExpression *ParseSubassignmentInForExpression(); + CXFA_FMSimpleExpression *ParseLogicalOrExpression(); + CXFA_FMSimpleExpression *ParseLogicalAndExpression(); + CXFA_FMSimpleExpression *ParseEqualityExpression(); + CXFA_FMSimpleExpression *ParseRelationalExpression(); + CXFA_FMSimpleExpression *ParseAddtiveExpression(); + CXFA_FMSimpleExpression *ParseMultiplicativeExpression(); + CXFA_FMSimpleExpression *ParseUnaryExpression(); + CXFA_FMSimpleExpression *ParsePrimaryExpression(); + CXFA_FMSimpleExpression *ParsePostExpression(CXFA_FMSimpleExpression *e); + CXFA_FMSimpleExpression *ParseIndexExpression(); +private: + FX_LPCWSTR m_pScript; + FX_STRSIZE m_uLength; + CXFA_FMLexer *m_lexer; + CXFA_FMToken *m_pToken; + CXFA_FMErrorInfo *m_pErrorInfo; +}; +#endif diff --git a/xfa/src/fxfa/src/fm2js/xfa_lexer.cpp b/xfa/src/fxfa/src/fm2js/xfa_lexer.cpp new file mode 100644 index 0000000000..448d734f3a --- /dev/null +++ b/xfa/src/fxfa/src/fm2js/xfa_lexer.cpp @@ -0,0 +1,589 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "xfa_fm2js.h" +struct XFA_FMDChar { + static FX_LPCWSTR inc(FX_LPCWSTR &p) + { + ++p; + return p; + } + static FX_LPCWSTR dec(FX_LPCWSTR &p) + { + --p; + return p; + } + static FX_UINT16 get(FX_LPCWSTR p) + { + return *p; + } + static FX_BOOL isWhiteSpace(FX_LPCWSTR p) + { + return (*p) == 0x09 || (*p) == 0x0b || (*p) == 0x0c || (*p) == 0x20; + } + static FX_BOOL isLineTerminator(FX_LPCWSTR p) + { + return *p == 0x0A || *p == 0x0D; + } + static FX_BOOL isBinary(FX_LPCWSTR p) + { + return (*p) >= '0' && (*p) <= '1'; + } + static FX_BOOL isOctal(FX_LPCWSTR p) + { + return (*p) >= '0' && (*p) <= '7'; + } + static FX_BOOL isDigital(FX_LPCWSTR p) + { + return (*p) >= '0' && (*p) <= '9'; + } + static FX_BOOL isHex(FX_LPCWSTR p) + { + return isDigital(p) || ((*p) >= 'a' && (*p) <= 'f') || ((*p) >= 'A' && (*p) <= 'F'); + } + static FX_BOOL isAlpha(FX_LPCWSTR p) + { + return ((*p) <= 'z' && (*p) >= 'a') || ((*p) <= 'Z' && (*p) >= 'A'); + } + static FX_BOOL isAvalid(FX_LPCWSTR p, FX_BOOL flag = 0); + static FX_BOOL string2number(FX_LPCWSTR s, FX_DOUBLE *pValue, FX_LPCWSTR &pEnd); + static FX_BOOL isUnicodeAlpha(FX_UINT16 ch); +}; +inline FX_BOOL XFA_FMDChar::isAvalid(FX_LPCWSTR p, FX_BOOL flag) +{ + if (*p == 0) { + return 1; + } + if ((*p <= 0x0A && *p >= 0x09) || *p == 0x0D || (*p <= 0xd7ff && *p >= 0x20) || (*p <= 0xfffd && *p >= 0xe000)) { + return 1; + } + if (!flag) { + if (*p == 0x0B || *p == 0x0C) { + return 1; + } + } + return 0; +} +inline FX_BOOL XFA_FMDChar::string2number(FX_LPCWSTR s, FX_DOUBLE *pValue, FX_LPCWSTR &pEnd) +{ + if (s) { + *pValue = wcstod((wchar_t *)s, (wchar_t **)&pEnd); + } + return 0; +} +inline FX_BOOL XFA_FMDChar::isUnicodeAlpha(FX_UINT16 ch) +{ + if (ch == 0 || ch == 0x0A || ch == 0x0D || ch == 0x09 || ch == 0x0B || ch == 0x0C || ch == 0x20 || ch == '.' + || ch == ';' || ch == '"' || ch == '=' || ch == '<' || ch == '>' || ch == ',' || ch == '(' || ch == ')' + || ch == ']' || ch == '[' || ch == '&' || ch == '|' || ch == '+' || ch == '-' || ch == '*' || ch == '/') { + return FALSE; + } else { + return TRUE; + } +} +static XFA_FMKeyword keyWords[] = { + {TOKand, 0x00000026, (FX_LPCWSTR)(L"&")}, + {TOKlparen, 0x00000028, (FX_LPCWSTR)(L"(")}, + {TOKrparen, 0x00000029, (FX_LPCWSTR)(L")")}, + {TOKmul, 0x0000002a, (FX_LPCWSTR)(L"*")}, + {TOKplus, 0x0000002b, (FX_LPCWSTR)(L"+")}, + {TOKcomma, 0x0000002c, (FX_LPCWSTR)(L",")}, + {TOKminus, 0x0000002d, (FX_LPCWSTR)(L"-")}, + {TOKdot, 0x0000002e, (FX_LPCWSTR)(L".")}, + {TOKdiv, 0x0000002f, (FX_LPCWSTR)(L"/")}, + {TOKlt, 0x0000003c, (FX_LPCWSTR)(L"<")}, + {TOKassign, 0x0000003d, (FX_LPCWSTR)(L"=")}, + {TOKgt, 0x0000003e, (FX_LPCWSTR)(L">")}, + {TOKlbracket, 0x0000005b, (FX_LPCWSTR)(L"[")}, + {TOKrbracket, 0x0000005d, (FX_LPCWSTR)(L"]")}, + {TOKor, 0x0000007c, (FX_LPCWSTR)(L"|")}, + {TOKdotscream, 0x0000ec11, (FX_LPCWSTR)(L".#")}, + {TOKdotstar, 0x0000ec18, (FX_LPCWSTR)(L".*")}, + {TOKdotdot, 0x0000ec1c, (FX_LPCWSTR)(L"..")}, + {TOKle, 0x000133f9, (FX_LPCWSTR)(L"<=")}, + {TOKne, 0x000133fa, (FX_LPCWSTR)(L"<>")}, + {TOKeq, 0x0001391a, (FX_LPCWSTR)(L"==")}, + {TOKge, 0x00013e3b, (FX_LPCWSTR)(L">=")}, + {TOKdo, 0x00020153, (FX_LPCWSTR)(L"do")}, + {TOKkseq, 0x00020676, (FX_LPCWSTR)(L"eq")}, + {TOKksge, 0x000210ac, (FX_LPCWSTR)(L"ge")}, + {TOKksgt, 0x000210bb, (FX_LPCWSTR)(L"gt")}, + {TOKif, 0x00021aef, (FX_LPCWSTR)(L"if")}, + {TOKin, 0x00021af7, (FX_LPCWSTR)(L"in")}, + {TOKksle, 0x00022a51, (FX_LPCWSTR)(L"le")}, + {TOKkslt, 0x00022a60, (FX_LPCWSTR)(L"lt")}, + {TOKksne, 0x00023493, (FX_LPCWSTR)(L"ne")}, + {TOKksor, 0x000239c1, (FX_LPCWSTR)(L"or")}, + {TOKnull, 0x052931bb, (FX_LPCWSTR)(L"null")}, + {TOKbreak, 0x05518c25, (FX_LPCWSTR)(L"break")}, + {TOKksand, 0x09f9db33, (FX_LPCWSTR)(L"and")}, + {TOKend, 0x0a631437, (FX_LPCWSTR)(L"end")}, + {TOKeof, 0x0a63195a, (FX_LPCWSTR)(L"eof")}, + {TOKfor, 0x0a7d67a7, (FX_LPCWSTR)(L"for")}, + {TOKnan, 0x0b4f91dd, (FX_LPCWSTR)(L"nan")}, + {TOKksnot, 0x0b4fd9b1, (FX_LPCWSTR)(L"not")}, + {TOKvar, 0x0c2203e9, (FX_LPCWSTR)(L"var")}, + {TOKthen, 0x2d5738cf, (FX_LPCWSTR)(L"then")}, + {TOKelse, 0x45f65ee9, (FX_LPCWSTR)(L"else")}, + {TOKexit, 0x4731d6ba, (FX_LPCWSTR)(L"exit")}, + {TOKdownto, 0x4caadc3b, (FX_LPCWSTR)(L"downto")}, + {TOKreturn, 0x4db8bd60, (FX_LPCWSTR)(L"return")}, + {TOKinfinity, 0x5c0a010a, (FX_LPCWSTR)(L"infinity")}, + {TOKendwhile, 0x5c64bff0, (FX_LPCWSTR)(L"endwhile")}, + {TOKforeach, 0x67e31f38, (FX_LPCWSTR)(L"foreach")}, + {TOKendfunc, 0x68f984a3, (FX_LPCWSTR)(L"endfunc")}, + {TOKelseif, 0x78253218, (FX_LPCWSTR)(L"elseif")}, + {TOKwhile, 0x84229259, (FX_LPCWSTR)(L"while")}, + {TOKendfor, 0x8ab49d7e, (FX_LPCWSTR)(L"endfor")}, + {TOKthrow, 0x8db05c94, (FX_LPCWSTR)(L"throw")}, + {TOKstep, 0xa7a7887c, (FX_LPCWSTR)(L"step")}, + {TOKupto, 0xb5155328, (FX_LPCWSTR)(L"upto")}, + {TOKcontinue, 0xc0340685, (FX_LPCWSTR)(L"continue")}, + {TOKfunc, 0xcdce60ec, (FX_LPCWSTR)(L"func")}, + {TOKendif, 0xe0e8fee6, (FX_LPCWSTR)(L"endif")}, +}; +static const FX_WORD KEYWORD_START = TOKdo; +static const FX_WORD KEYWORD_END = TOKendif; +FX_LPCWSTR XFA_FM_KeywordToString(XFA_FM_TOKEN op) +{ + return keyWords[op].m_keword; +} +CXFA_FMToken::CXFA_FMToken() +{ + m_type = TOKreserver; + m_uLinenum = 1; + m_pNext = 0; +} +CXFA_FMToken::CXFA_FMToken( FX_DWORD uLineNum ) +{ + m_type = TOKreserver; + m_uLinenum = uLineNum; + m_pNext = 0; +} +CXFA_FMToken::~CXFA_FMToken() +{ +} +CXFA_FMLexer::CXFA_FMLexer(FX_WSTR wsFormCalc, CXFA_FMErrorInfo *pErrorInfo) +{ + m_pScript = wsFormCalc.GetPtr(); + m_uLength = wsFormCalc.GetLength(); + m_uCurrentLine = 1; + m_ptr = m_pScript; + m_pToken = 0; + m_pErrorInfo = pErrorInfo; +} +CXFA_FMToken *CXFA_FMLexer::NextToken() +{ + CXFA_FMToken *t = 0; + if (!m_pToken) { + m_pToken = Scan(); + } else { + if (m_pToken->m_pNext) { + t = m_pToken->m_pNext; + delete m_pToken; + m_pToken = t; + } else { + t = m_pToken; + m_pToken = Scan(); + delete t; + } + } + return m_pToken; +} +CXFA_FMToken * CXFA_FMLexer::Scan() +{ + FX_UINT16 ch = 0; + CXFA_FMToken * p = FX_NEW CXFA_FMToken(m_uCurrentLine); + if (!XFA_FMDChar::isAvalid(m_ptr)) { + ch = XFA_FMDChar::get(m_ptr); + Error(FMERR_UNSUPPORTED_CHAR, ch); + return p; + } + int iRet = 0; + while (1) { + if (!XFA_FMDChar::isAvalid(m_ptr)) { + ch = XFA_FMDChar::get(m_ptr); + Error(FMERR_UNSUPPORTED_CHAR, ch); + return p; + } + ch = XFA_FMDChar::get(m_ptr); + switch (ch) { + case 0: + p->m_type = TOKeof; + return p; + case 0x0A: + ++m_uCurrentLine; + p->m_uLinenum = m_uCurrentLine; + XFA_FMDChar::inc(m_ptr); + break; + case 0x0D: + XFA_FMDChar::inc(m_ptr); + break; + case ';': { + FX_LPCWSTR pTemp = 0; + Comment(m_ptr, pTemp); + m_ptr = pTemp; + } + break; + case '"': { + FX_LPCWSTR pTemp = 0; + p->m_type = TOKstring; + iRet = String(p, m_ptr, pTemp); + if (iRet) { + return p; + } + m_ptr = pTemp; + } + return p; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': { + p->m_type = TOKnumber; + FX_LPCWSTR pTemp = 0; + iRet = Number(p, m_ptr, pTemp); + m_ptr = pTemp; + if (iRet) { + Error(FMERR_BAD_SUFFIX_NUMBER); + return p; + } + } + return p; + case '=': + XFA_FMDChar::inc(m_ptr); + if (XFA_FMDChar::isAvalid(m_ptr)) { + ch = XFA_FMDChar::get(m_ptr); + if (ch == '=') { + p->m_type = TOKeq; + XFA_FMDChar::inc(m_ptr); + return p; + } else { + p->m_type = TOKassign; + return p; + } + } else { + ch = XFA_FMDChar::get(m_ptr); + Error(FMERR_UNSUPPORTED_CHAR, ch); + return p; + } + break; + case '<': + XFA_FMDChar::inc(m_ptr); + if (XFA_FMDChar::isAvalid(m_ptr)) { + ch = XFA_FMDChar::get(m_ptr); + if (ch == '=') { + p->m_type = TOKle; + XFA_FMDChar::inc(m_ptr); + return p; + } else if (ch == '>') { + p->m_type = TOKne; + XFA_FMDChar::inc(m_ptr); + return p; + } else { + p->m_type = TOKlt; + return p; + } + } else { + ch = XFA_FMDChar::get(m_ptr); + Error(FMERR_UNSUPPORTED_CHAR, ch); + return p; + } + break; + case '>': + XFA_FMDChar::inc(m_ptr); + if (XFA_FMDChar::isAvalid(m_ptr)) { + ch = XFA_FMDChar::get(m_ptr); + if (ch == '=') { + p->m_type = TOKge; + XFA_FMDChar::inc(m_ptr); + return p; + } else { + p->m_type = TOKgt; + return p; + } + } else { + ch = XFA_FMDChar::get(m_ptr); + Error(FMERR_UNSUPPORTED_CHAR, ch); + return p; + } + break; + case ',': + p->m_type = TOKcomma; + XFA_FMDChar::inc(m_ptr); + return p; + case '(': + p->m_type = TOKlparen; + XFA_FMDChar::inc(m_ptr); + return p; + case ')': + p->m_type = TOKrparen; + XFA_FMDChar::inc(m_ptr); + return p; + case '[': + p->m_type = TOKlbracket; + XFA_FMDChar::inc(m_ptr); + return p; + case ']': + p->m_type = TOKrbracket; + XFA_FMDChar::inc(m_ptr); + return p; + case '&': + XFA_FMDChar::inc(m_ptr); + p->m_type = TOKand; + return p; + case '|': + XFA_FMDChar::inc(m_ptr); + p->m_type = TOKor; + return p; + case '+': + XFA_FMDChar::inc(m_ptr); + p->m_type = TOKplus; + return p; + case '-': + XFA_FMDChar::inc(m_ptr); + p->m_type = TOKminus; + return p; + case '*': + XFA_FMDChar::inc(m_ptr); + p->m_type = TOKmul; + return p; + case '/': + XFA_FMDChar::inc(m_ptr); + if (XFA_FMDChar::isAvalid(m_ptr)) { + ch = XFA_FMDChar::get(m_ptr); + if (ch == '/') { + FX_LPCWSTR pTemp = 0; + Comment(m_ptr, pTemp); + m_ptr = pTemp; + break; + } else { + p->m_type = TOKdiv; + return p; + } + } else { + ch = XFA_FMDChar::get(m_ptr); + Error(FMERR_UNSUPPORTED_CHAR, ch); + return p; + } + break; + case '.': + XFA_FMDChar::inc(m_ptr); + if (XFA_FMDChar::isAvalid(m_ptr)) { + ch = XFA_FMDChar::get(m_ptr); + if (ch == '.') { + p->m_type = TOKdotdot; + XFA_FMDChar::inc(m_ptr); + return p; + } else if (ch == '*') { + p->m_type = TOKdotstar; + XFA_FMDChar::inc(m_ptr); + return p; + } else if (ch == '#') { + p->m_type = TOKdotscream; + XFA_FMDChar::inc(m_ptr); + return p; + } else if (ch <= '9' && ch >= '0') { + p->m_type = TOKnumber; + FX_LPCWSTR pTemp = 0; + XFA_FMDChar::dec(m_ptr); + iRet = Number(p, m_ptr, pTemp); + m_ptr = pTemp; + if (iRet) { + Error(FMERR_BAD_SUFFIX_NUMBER); + } + return p; + } else { + p->m_type = TOKdot; + return p; + } + } else { + ch = XFA_FMDChar::get(m_ptr); + Error(FMERR_UNSUPPORTED_CHAR, ch); + return p; + } + case 0x09: + case 0x0B: + case 0x0C: + case 0x20: + XFA_FMDChar::inc(m_ptr); + break; + default: { + FX_LPCWSTR pTemp = 0; + iRet = Identifiers(p, m_ptr, pTemp); + m_ptr = pTemp; + if (iRet) { + return p; + } + p->m_type = IsKeyword(p->m_wstring); + } + return p; + } + } +} +FX_DWORD CXFA_FMLexer::Number(CXFA_FMToken *t, FX_LPCWSTR p, FX_LPCWSTR &pEnd) +{ + FX_DOUBLE number = 0; + if (XFA_FMDChar::string2number(p, &number, pEnd)) { + return 1; + } + if (pEnd && XFA_FMDChar::isAlpha(pEnd)) { + return 1; + } + t->m_wstring = CFX_WideStringC(p, (pEnd - p)); + return 0; +} +FX_DWORD CXFA_FMLexer::String(CXFA_FMToken *t, FX_LPCWSTR p, FX_LPCWSTR &pEnd) +{ + FX_LPCWSTR pStart = p; + FX_UINT16 ch = 0; + XFA_FMDChar::inc(p); + ch = XFA_FMDChar::get(p); + while (ch) { + if (!XFA_FMDChar::isAvalid(p)) { + ch = XFA_FMDChar::get(p); + pEnd = p; + t->m_wstring = CFX_WideStringC(pStart, (pEnd - pStart)); + Error(FMERR_UNSUPPORTED_CHAR, ch); + return 1; + } + if (ch == '"') { + XFA_FMDChar::inc(p); + if (!XFA_FMDChar::isAvalid(p)) { + ch = XFA_FMDChar::get(p); + pEnd = p; + t->m_wstring = CFX_WideStringC(pStart, (pEnd - pStart)); + Error(FMERR_UNSUPPORTED_CHAR, ch); + return 1; + } + ch = XFA_FMDChar::get(p); + if (ch == '"') { + goto NEXT; + } else { + break; + } + } +NEXT: + XFA_FMDChar::inc(p); + ch = XFA_FMDChar::get(p); + } + pEnd = p; + t->m_wstring = CFX_WideStringC(pStart, (pEnd - pStart)); + return 0; +} +FX_DWORD CXFA_FMLexer::Identifiers(CXFA_FMToken *t, FX_LPCWSTR p, FX_LPCWSTR &pEnd) +{ + FX_LPCWSTR pStart = p; + FX_UINT16 ch = 0; + ch = XFA_FMDChar::get(p); + XFA_FMDChar::inc(p); + if (!XFA_FMDChar::isAvalid(p)) { + pEnd = p; + t->m_wstring = CFX_WideStringC(pStart, (pEnd - pStart)); + Error(FMERR_UNSUPPORTED_CHAR, ch); + return 1; + } + ch = XFA_FMDChar::get(p); + while (ch) { + if (!XFA_FMDChar::isAvalid(p)) { + pEnd = p; + t->m_wstring = CFX_WideStringC(pStart, (pEnd - pStart)); + Error(FMERR_UNSUPPORTED_CHAR, ch); + return 1; + } + ch = XFA_FMDChar::get(p); + if (XFA_FMDChar::isUnicodeAlpha(ch)) { + XFA_FMDChar::inc(p); + } else { + pEnd = p; + t->m_wstring = CFX_WideStringC(pStart, (pEnd - pStart)); + return 0; + } + } + pEnd = p; + t->m_wstring = CFX_WideStringC(pStart, (pEnd - pStart)); + return 0; +} +void CXFA_FMLexer::Comment( FX_LPCWSTR p, FX_LPCWSTR &pEnd ) +{ + unsigned ch = 0; + XFA_FMDChar::inc(p); + ch = XFA_FMDChar::get(p); + while (ch) { + if (ch == 0x0D) { + XFA_FMDChar::inc(p); + pEnd = p; + return; + } + if (ch == 0x0A) { + ++m_uCurrentLine; + XFA_FMDChar::inc(p); + pEnd = p; + return; + } + XFA_FMDChar::inc(p); + ch = XFA_FMDChar::get(p); + } + pEnd = p; +} +XFA_FM_TOKEN CXFA_FMLexer::IsKeyword(FX_WSTR str) +{ + FX_INT32 iLength = str.GetLength(); + FX_UINT32 uHash = FX_HashCode_String_GetW(str.GetPtr(), iLength, TRUE); + FX_INT32 iStart = KEYWORD_START, iEnd = KEYWORD_END; + FX_INT32 iMid = (iStart + iEnd) / 2; + XFA_FMKeyword keyword; + do { + iMid = (iStart + iEnd) / 2; + keyword = keyWords[iMid]; + if (uHash == keyword.m_uHash) { + return keyword.m_type; + } else if (uHash < keyword.m_uHash) { + iEnd = iMid - 1; + } else { + iStart = iMid + 1; + } + } while (iStart <= iEnd); + return TOKidentifier; +} +CXFA_FMLexer::~CXFA_FMLexer() +{ + m_pScript = 0; + m_ptr = m_pScript; + if (m_pToken) { + CXFA_FMToken *t1 = m_pToken; + CXFA_FMToken *t2 = t1->m_pNext; + while (t2) { + delete t1; + t1 = t2; + t2 = t2->m_pNext; + } + delete m_pToken; + m_pToken = 0; + } + m_pErrorInfo = 0; +} +void CXFA_FMLexer::Error(XFA_FM_ERRMSG msg, ...) +{ + m_pErrorInfo->linenum = m_uCurrentLine; + FX_LPCWSTR lpMessageInfo = XFA_FM_ErrorMsg(msg); + va_list ap; + va_start(ap, msg); + m_pErrorInfo->message.FormatV(lpMessageInfo, ap); + va_end(ap); +} +FX_BOOL CXFA_FMLexer::HasError() const +{ + if (m_pErrorInfo->message.IsEmpty()) { + return FALSE; + } + return TRUE; +} diff --git a/xfa/src/fxfa/src/fm2js/xfa_lexer.h b/xfa/src/fxfa/src/fm2js/xfa_lexer.h new file mode 100644 index 0000000000..b073ceb047 --- /dev/null +++ b/xfa/src/fxfa/src/fm2js/xfa_lexer.h @@ -0,0 +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 + +#ifndef _XFA_FM_LEXER_H +#define _XFA_FM_LEXER_H +enum XFA_FM_TOKEN { + TOKand, TOKlparen, TOKrparen, TOKmul, TOKplus, TOKcomma, TOKminus, TOKdot, TOKdiv, TOKlt, + TOKassign, TOKgt, TOKlbracket, TOKrbracket, TOKor, TOKdotscream, TOKdotstar, TOKdotdot, + TOKle, TOKne, TOKeq, TOKge, + TOKdo, TOKkseq, TOKksge, TOKksgt, TOKif, TOKin, TOKksle, TOKkslt, TOKksne, TOKksor, TOKnull, + TOKbreak, TOKksand, TOKend, TOKeof, TOKfor, TOKnan, TOKksnot, TOKvar, TOKthen, TOKelse, TOKexit, + TOKdownto, TOKreturn, TOKinfinity, TOKendwhile, TOKforeach, TOKendfunc, TOKelseif, TOKwhile, + TOKendfor, TOKthrow, TOKstep, TOKupto, TOKcontinue, TOKfunc, TOKendif, + TOKstar, + TOKidentifier, TOKunderscore, TOKdollar, TOKexclamation, + TOKcall, + TOKstring, + TOKnumber, + TOKreserver +}; +struct XFA_FMKeyword { + XFA_FM_TOKEN m_type; + FX_UINT32 m_uHash; + FX_LPCWSTR m_keword; +}; +FX_LPCWSTR XFA_FM_KeywordToString(XFA_FM_TOKEN op); +class CXFA_FMToken : public CFX_Object +{ +public: + CXFA_FMToken(); + CXFA_FMToken(FX_DWORD uLineNum); + ~CXFA_FMToken(); + CFX_WideStringC m_wstring; + XFA_FM_TOKEN m_type; + FX_DWORD m_uLinenum; + CXFA_FMToken* m_pNext; +}; +class CXFA_FMLexer : public CFX_Object +{ +public: + CXFA_FMLexer(FX_WSTR wsFormcalc, CXFA_FMErrorInfo *pErrorInfo); + ~CXFA_FMLexer(); + CXFA_FMToken* NextToken(); + FX_DWORD Number(CXFA_FMToken *t, FX_LPCWSTR p, FX_LPCWSTR &pEnd); + FX_DWORD String(CXFA_FMToken *t, FX_LPCWSTR p, FX_LPCWSTR &pEnd); + FX_DWORD Identifiers(CXFA_FMToken *t, FX_LPCWSTR p, FX_LPCWSTR &pEnd); + void Comment(FX_LPCWSTR p, FX_LPCWSTR &pEnd); + XFA_FM_TOKEN IsKeyword(FX_WSTR p); + void SetCurrentLine(FX_DWORD line) + { + m_uCurrentLine = line; + } + void SetToken(CXFA_FMToken *pToken) + { + if (m_pToken) { + delete m_pToken; + } + m_pToken = pToken; + } + FX_LPCWSTR SavePos() + { + return m_ptr; + } + void RestorePos(FX_LPCWSTR pPos) + { + m_ptr = pPos; + } + void Error(XFA_FM_ERRMSG msg, ...); + FX_BOOL HasError() const; +protected: + CXFA_FMToken* Scan(); + FX_LPCWSTR m_pScript; + FX_LPCWSTR m_ptr; + FX_STRSIZE m_uLength; + FX_DWORD m_uCurrentLine; + CXFA_FMToken* m_pToken; + CXFA_FMErrorInfo* m_pErrorInfo; +}; +#endif diff --git a/xfa/src/fxfa/src/fm2js/xfa_program.cpp b/xfa/src/fxfa/src/fm2js/xfa_program.cpp new file mode 100644 index 0000000000..d291e7a614 --- /dev/null +++ b/xfa/src/fxfa/src/fm2js/xfa_program.cpp @@ -0,0 +1,50 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "xfa_fm2js.h" +CXFA_FMProgram::CXFA_FMProgram() + : m_globalFunction(0) +{ +} +CXFA_FMProgram::~CXFA_FMProgram() +{ + if (m_globalFunction != 0) { + delete m_globalFunction; + m_globalFunction = 0; + } +} +FX_INT32 CXFA_FMProgram::Init(FX_WSTR wsFormcalc) +{ + return m_parse.Init(wsFormcalc, &m_pErrorInfo); +} +FX_INT32 CXFA_FMProgram::ParseProgram() +{ + CFX_PtrArray * expressions = 0; + m_parse.NextToken(); + if (!m_pErrorInfo.message.IsEmpty()) { + return -1; + } + expressions = m_parse.ParseTopExpression(); + if (!m_pErrorInfo.message.IsEmpty()) { + CXFA_FMExpression *e = 0; + for (FX_INT32 u = 0; u < expressions->GetSize(); ++u) { + e = (CXFA_FMExpression *)expressions->GetAt(u); + if (e) { + delete e; + } + } + delete expressions; + return -1; + } + m_globalFunction = FX_NEW CXFA_FMFunctionDefinition(1, 1, FX_WSTRC(L""), 0, expressions); + return 0; +} +FX_INT32 CXFA_FMProgram::TranslateProgram(CFX_WideTextBuf &wsJavaScript) +{ + m_globalFunction->ToJavaScript(wsJavaScript); + wsJavaScript.AppendChar(0); + return 0; +} diff --git a/xfa/src/fxfa/src/fm2js/xfa_program.h b/xfa/src/fxfa/src/fm2js/xfa_program.h new file mode 100644 index 0000000000..a90af5e32f --- /dev/null +++ b/xfa/src/fxfa/src/fm2js/xfa_program.h @@ -0,0 +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 _XFA_FM_PROGRAM_H +#define _XFA_FM_PROGRAM_H +class CXFA_FMProgram : public CFX_Object +{ +public: + CXFA_FMProgram(); + ~CXFA_FMProgram(); + FX_INT32 Init(FX_WSTR wsFormcalc); + FX_INT32 ParseProgram(); + FX_INT32 TranslateProgram(CFX_WideTextBuf &wsJavaScript); + CXFA_FMErrorInfo& GetError() + { + return m_pErrorInfo; + } +private: + CXFA_FMErrorInfo m_pErrorInfo; + CXFA_FMParse m_parse; + CXFA_FMFunctionDefinition *m_globalFunction; +}; +#endif diff --git a/xfa/src/fxfa/src/fm2js/xfa_simpleexpression.cpp b/xfa/src/fxfa/src/fm2js/xfa_simpleexpression.cpp new file mode 100644 index 0000000000..c309f129ee --- /dev/null +++ b/xfa/src/fxfa/src/fm2js/xfa_simpleexpression.cpp @@ -0,0 +1,758 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "xfa_fm2js.h" +static CFX_WideStringC gs_lpStrExpFuncName[] = { + FX_WSTRC(L"foxit_xfa_formcalc_runtime.assign_value_operator"), + FX_WSTRC(L"foxit_xfa_formcalc_runtime.logical_or_operator"), + FX_WSTRC(L"foxit_xfa_formcalc_runtime.logical_and_operator"), + FX_WSTRC(L"foxit_xfa_formcalc_runtime.equality_operator"), + FX_WSTRC(L"foxit_xfa_formcalc_runtime.notequality_operator"), + FX_WSTRC(L"foxit_xfa_formcalc_runtime.less_operator"), + FX_WSTRC(L"foxit_xfa_formcalc_runtime.lessequal_operator"), + FX_WSTRC(L"foxit_xfa_formcalc_runtime.greater_operator"), + FX_WSTRC(L"foxit_xfa_formcalc_runtime.greaterequal_operator"), + FX_WSTRC(L"foxit_xfa_formcalc_runtime.plus_operator"), + FX_WSTRC(L"foxit_xfa_formcalc_runtime.minus_operator"), + FX_WSTRC(L"foxit_xfa_formcalc_runtime.multiple_operator"), + FX_WSTRC(L"foxit_xfa_formcalc_runtime.divide_operator"), + FX_WSTRC(L"foxit_xfa_formcalc_runtime.positive_operator"), + FX_WSTRC(L"foxit_xfa_formcalc_runtime.negative_operator"), + FX_WSTRC(L"foxit_xfa_formcalc_runtime.logical_not_operator"), + FX_WSTRC(L"foxit_xfa_formcalc_runtime."), + FX_WSTRC(L"foxit_xfa_formcalc_runtime.dot_accessor"), + FX_WSTRC(L"foxit_xfa_formcalc_runtime.dotdot_accessor"), + FX_WSTRC(L"foxit_xfa_formcalc_runtime.concat_fm_object"), + FX_WSTRC(L"foxit_xfa_formcalc_runtime.is_fm_object"), + FX_WSTRC(L"foxit_xfa_formcalc_runtime.is_fm_array"), + FX_WSTRC(L"foxit_xfa_formcalc_runtime.get_fm_value"), + FX_WSTRC(L"foxit_xfa_formcalc_runtime.get_fm_jsobj"), + FX_WSTRC(L"foxit_xfa_formcalc_runtime.fm_var_filter"), +}; +CFX_WideStringC XFA_FM_EXPTypeToString(XFA_FM_SimpleExpressionType simpleExpType) +{ + return gs_lpStrExpFuncName[simpleExpType]; +} +static XFA_FMBuildInFunc buildInFuncs[] = { + {0x0001f1f5, (FX_LPCWSTR)L"At"}, + {0x00020b9c, (FX_LPCWSTR)L"FV"}, + {0x00021aef, (FX_LPCWSTR)L"If"}, + {0x00023ee6, (FX_LPCWSTR)L"PV"}, + {0x04b5c9ee, (FX_LPCWSTR)L"Encode"}, + {0x08e96685, (FX_LPCWSTR)L"DateFmt"}, + {0x09f99db6, (FX_LPCWSTR)L"Abs"}, + {0x09f9e583, (FX_LPCWSTR)L"Apr"}, + {0x09fa043e, (FX_LPCWSTR)L"Avg"}, + {0x0a9782a0, (FX_LPCWSTR)L"Get"}, + {0x0b1b09df, (FX_LPCWSTR)L"Len"}, + {0x0b3543a6, (FX_LPCWSTR)L"Max"}, + {0x0b356ca4, (FX_LPCWSTR)L"Min"}, + {0x0b358b60, (FX_LPCWSTR)L"Mod"}, + {0x0b4fded4, (FX_LPCWSTR)L"NPV"}, + {0x0b846bf1, (FX_LPCWSTR)L"Pmt"}, + {0x0b8494f9, (FX_LPCWSTR)L"Put"}, + {0x0bb8df5d, (FX_LPCWSTR)L"Ref"}, + {0x0bd37a99, (FX_LPCWSTR)L"Str"}, + {0x0bd37fb5, (FX_LPCWSTR)L"Sum"}, + {0x1048469b, (FX_LPCWSTR)L"Cterm"}, + {0x11e03660, (FX_LPCWSTR)L"Exists"}, + {0x126236e6, (FX_LPCWSTR)L"Post"}, + {0x127c6661, (FX_LPCWSTR)L"PPmt"}, + {0x193ade3e, (FX_LPCWSTR)L"Right"}, + {0x1ec8ab2c, (FX_LPCWSTR)L"Rate"}, + {0x20e476dc, (FX_LPCWSTR)L"IsoTime2Num"}, + {0x23eb6816, (FX_LPCWSTR)L"TimeFmt"}, + {0x24fb17b0, (FX_LPCWSTR)L"LocalDateFmt"}, + {0x28dee6e9, (FX_LPCWSTR)L"Format"}, + {0x2d0890b8, (FX_LPCWSTR)L"Term"}, + {0x2d71b00f, (FX_LPCWSTR)L"Time"}, + {0x2f890fb1, (FX_LPCWSTR)L"Num2Time"}, + {0x3767511d, (FX_LPCWSTR)L"Ceil"}, + {0x3ffd1941, (FX_LPCWSTR)L"LocalTimeFmt"}, + {0x442f68c8, (FX_LPCWSTR)L"Round"}, + {0x46fd1128, (FX_LPCWSTR)L"Eval"}, + {0x4d629440, (FX_LPCWSTR)L"Date2Num"}, + {0x4dcf25f8, (FX_LPCWSTR)L"Concat"}, + {0x4e00255d, (FX_LPCWSTR)L"UnitValue"}, + {0x55a5cc29, (FX_LPCWSTR)L"Lower"}, + {0x5e43e04c, (FX_LPCWSTR)L"WordNum"}, + {0x620ce6ba, (FX_LPCWSTR)L"Ipmt"}, + {0x6f544d49, (FX_LPCWSTR)L"Count"}, + {0x7e241013, (FX_LPCWSTR)L"Within"}, + {0x9b9a6e2b, (FX_LPCWSTR)L"IsoDate2Num"}, + {0xb2c941c2, (FX_LPCWSTR)L"UnitType"}, + {0xb598a1f7, (FX_LPCWSTR)L"Uuid"}, + {0xbde9abde, (FX_LPCWSTR)L"Date"}, + {0xc0010b80, (FX_LPCWSTR)L"Num2Date"}, + {0xc1f6144c, (FX_LPCWSTR)L"Upper"}, + {0xc44028f7, (FX_LPCWSTR)L"Oneof"}, + {0xc62c1b2c, (FX_LPCWSTR)L"Space"}, + {0xd0ff50f9, (FX_LPCWSTR)L"HasValue"}, + {0xd1537042, (FX_LPCWSTR)L"Floor"}, + {0xd2ac9cf1, (FX_LPCWSTR)L"Time2Num"}, + {0xd907aee5, (FX_LPCWSTR)L"Num2GMTime"}, + {0xdf24f7c4, (FX_LPCWSTR)L"Decode"}, + {0xe2664803, (FX_LPCWSTR)L"Substr"}, + {0xe3e7b528, (FX_LPCWSTR)L"Stuff"}, + {0xe6792d4e, (FX_LPCWSTR)L"Rtrim"}, + {0xe8c23f5b, (FX_LPCWSTR)L"Parse"}, + {0xea18d121, (FX_LPCWSTR)L"Choose"}, + {0xebfef69c, (FX_LPCWSTR)L"Replace"}, + {0xf5ad782b, (FX_LPCWSTR)L"Left"}, + {0xf7bb2248, (FX_LPCWSTR)L"Ltrim"}, +}; +static const XFA_FMSOMMethod gs_FMSomMethods[] = { + {0x00000068, (FX_LPCWSTR)L"h", 0x01}, + {0x00000077, (FX_LPCWSTR)L"w", 0x01}, + {0x00000078, (FX_LPCWSTR)L"x", 0x01}, + {0x00000079, (FX_LPCWSTR)L"y", 0x01}, + {0x05eb5b0f, (FX_LPCWSTR)L"pageSpan", 0x01}, + {0x10f1b1bd, (FX_LPCWSTR)L"page", 0x01}, + {0x3bf1c2a5, (FX_LPCWSTR)L"absPageSpan", 0x01}, + {0x3c752495, (FX_LPCWSTR)L"verify", 0x0d}, + {0x44c352ad, (FX_LPCWSTR)L"formNodes", 0x01}, + {0x5775c2cc, (FX_LPCWSTR)L"absPageInBatch", 0x01}, + {0x5ee00996, (FX_LPCWSTR)L"setElement", 0x01}, + {0x7033bfd5, (FX_LPCWSTR)L"insert", 0x03}, + {0x8c5feb32, (FX_LPCWSTR)L"sheetInBatch", 0x01}, + {0x8f3a8379, (FX_LPCWSTR)L"sheet", 0x01}, + {0x92dada4f, (FX_LPCWSTR)L"saveFilteredXML", 0x01}, + {0x9cab7cae, (FX_LPCWSTR)L"remove", 0x01}, + {0xa68635f1, (FX_LPCWSTR)L"sign", 0x61}, + {0xaac241c8, (FX_LPCWSTR)L"isRecordGroup", 0x01}, + {0xd8ed1467, (FX_LPCWSTR)L"clear", 0x01}, + {0xda12e518, (FX_LPCWSTR)L"append", 0x01}, + {0xe74f0653, (FX_LPCWSTR)L"absPage", 0x01}, +}; +CXFA_FMSimpleExpression::CXFA_FMSimpleExpression(FX_DWORD line, XFA_FM_TOKEN op) + : m_line(line), + m_op(op) +{ +} +void CXFA_FMSimpleExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ +} +void CXFA_FMSimpleExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) +{} +XFA_FM_TOKEN CXFA_FMSimpleExpression::GetOperatorToken()const +{ + return m_op; +} +CXFA_FMNullExpression::CXFA_FMNullExpression(FX_DWORD line) + : CXFA_FMSimpleExpression(line, TOKnull) +{ +} +void CXFA_FMNullExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ + javascript << FX_WSTRC(L"null"); +} +CXFA_FMNumberExpression::CXFA_FMNumberExpression(FX_DWORD line, CFX_WideStringC wsNumber) + : CXFA_FMSimpleExpression(line, TOKnumber), m_wsNumber(wsNumber) +{ +} +void CXFA_FMNumberExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ + javascript << m_wsNumber; +} +CXFA_FMStringExpression::CXFA_FMStringExpression(FX_DWORD line, CFX_WideStringC wsString) + : CXFA_FMSimpleExpression(line, TOKstring), + m_wsString(wsString) +{ +} +void CXFA_FMStringExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ + CFX_WideString tempStr = m_wsString; + if (tempStr.GetLength() > 2) { + javascript.AppendChar(L'\"'); + FX_WCHAR oneChar; + for (FX_INT16 i = 1; i < tempStr.GetLength() - 1; i++) { + oneChar = tempStr[i]; + switch (oneChar) { + case L'\"': { + i++; + javascript << FX_WSTRC(L"\\\""); + } + break; + case 0x0d: + break; + case 0x0a: { + javascript << FX_WSTRC(L"\\n"); + } + break; + default: { + javascript.AppendChar(oneChar); + } + break; + } + } + javascript.AppendChar(L'\"'); + } else { + javascript << tempStr; + } +} +CXFA_FMIdentifierExpressionn::CXFA_FMIdentifierExpressionn(FX_DWORD line, CFX_WideStringC wsIdentifier) + : CXFA_FMSimpleExpression(line, TOKidentifier), m_wsIdentifier(wsIdentifier) +{ +} +void CXFA_FMIdentifierExpressionn::ToJavaScript(CFX_WideTextBuf& javascript) +{ + CFX_WideString tempStr = m_wsIdentifier; + if (tempStr.Equal(FX_WSTRC(L"$"))) { + tempStr = FX_WSTRC(L"this"); + } else if (tempStr.Equal(FX_WSTRC(L"!"))) { + tempStr = FX_WSTRC(L"xfa.datasets"); + } else if (tempStr.Equal(FX_WSTRC(L"$data"))) { + tempStr = FX_WSTRC(L"xfa.datasets.data"); + } else if (tempStr.Equal(FX_WSTRC(L"$event"))) { + tempStr = FX_WSTRC(L"xfa.event"); + } else if (tempStr.Equal(FX_WSTRC(L"$form"))) { + tempStr = FX_WSTRC(L"xfa.form"); + } else if (tempStr.Equal(FX_WSTRC(L"$host"))) { + tempStr = FX_WSTRC(L"xfa.host"); + } else if (tempStr.Equal(FX_WSTRC(L"$layout"))) { + tempStr = FX_WSTRC(L"xfa.layout"); + } else if (tempStr.Equal(FX_WSTRC(L"$template"))) { + tempStr = FX_WSTRC(L"xfa.template"); + } else if (tempStr[0] == L'!') { + tempStr = EXCLAMATION_IN_IDENTIFIER + tempStr.Mid(1); + } + javascript << tempStr; + return; +} +CXFA_FMUnaryExpression::CXFA_FMUnaryExpression(FX_DWORD line, XFA_FM_TOKEN op, CXFA_FMSimpleExpression *pExp) + : CXFA_FMSimpleExpression(line, op), m_pExp(pExp) +{ +} +CXFA_FMUnaryExpression::~CXFA_FMUnaryExpression() +{ + if (m_pExp != 0) { + delete m_pExp; + m_pExp = 0; + } +} +void CXFA_FMUnaryExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ +} +CXFA_FMBinExpression::CXFA_FMBinExpression(FX_DWORD line, XFA_FM_TOKEN op, CXFA_FMSimpleExpression *pExp1, CXFA_FMSimpleExpression *pExp2 ) + : CXFA_FMSimpleExpression(line, op), + m_pExp1(pExp1), + m_pExp2(pExp2) +{ +} +CXFA_FMBinExpression::~CXFA_FMBinExpression() +{ + if (m_pExp1 != 0) { + delete m_pExp1; + m_pExp1 = 0; + } + if (m_pExp2 != 0) { + delete m_pExp2; + m_pExp2 = 0; + } +} +void CXFA_FMBinExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ +} +CXFA_FMAssignExpression::CXFA_FMAssignExpression(FX_DWORD line, XFA_FM_TOKEN op, CXFA_FMSimpleExpression *pExp1, CXFA_FMSimpleExpression *pExp2 ) + : CXFA_FMBinExpression(line, op, pExp1, pExp2) +{ +} +void CXFA_FMAssignExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ + javascript << FX_WSTRC(L"if ("); + javascript << gs_lpStrExpFuncName[ISFMOBJECT]; + javascript << FX_WSTRC(L"("); + m_pExp1->ToJavaScript(javascript); + javascript << FX_WSTRC(L"))\n{\n"); + javascript << gs_lpStrExpFuncName[ASSIGN]; + javascript << FX_WSTRC(L"("); + m_pExp1->ToJavaScript(javascript); + javascript << FX_WSTRC(L", "); + m_pExp2->ToJavaScript(javascript); + javascript << FX_WSTRC(L");\n}\n"); + CFX_WideTextBuf tempExp1; + m_pExp1->ToJavaScript(tempExp1); + if (m_pExp1->GetOperatorToken() == TOKidentifier && tempExp1.GetWideString() != FX_WSTRC(L"this")) { + javascript << FX_WSTRC(L"else\n{\n"); + javascript << tempExp1; + javascript << FX_WSTRC(L" = "); + javascript << gs_lpStrExpFuncName[ASSIGN]; + javascript << FX_WSTRC(L"("); + m_pExp1->ToJavaScript(javascript); + javascript << FX_WSTRC(L", "); + m_pExp2->ToJavaScript(javascript); + javascript << FX_WSTRC(L");\n}\n"); + } +} +void CXFA_FMAssignExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) +{ + javascript << FX_WSTRC(L"if ("); + javascript << gs_lpStrExpFuncName[ISFMOBJECT]; + javascript << FX_WSTRC(L"("); + m_pExp1->ToJavaScript(javascript); + javascript << FX_WSTRC(L"))\n{\n"); + javascript << RUNTIMEFUNCTIONRETURNVALUE; + javascript << FX_WSTRC(L" = "); + javascript << gs_lpStrExpFuncName[ASSIGN]; + javascript << FX_WSTRC(L"("); + m_pExp1->ToJavaScript(javascript); + javascript << FX_WSTRC(L", "); + m_pExp2->ToJavaScript(javascript); + javascript << FX_WSTRC(L");\n}\n"); + CFX_WideTextBuf tempExp1; + m_pExp1->ToJavaScript(tempExp1); + if (m_pExp1->GetOperatorToken() == TOKidentifier && tempExp1.GetWideString() != FX_WSTRC(L"this")) { + javascript << FX_WSTRC(L"else\n{\n"); + javascript << RUNTIMEFUNCTIONRETURNVALUE; + javascript << FX_WSTRC(L" = "); + javascript << tempExp1; + javascript << FX_WSTRC(L" = "); + javascript << gs_lpStrExpFuncName[ASSIGN]; + javascript << FX_WSTRC(L"("); + m_pExp1->ToJavaScript(javascript); + javascript << FX_WSTRC(L", "); + m_pExp2->ToJavaScript(javascript); + javascript << FX_WSTRC(L");\n}\n"); + } +} +CXFA_FMLogicalOrExpression::CXFA_FMLogicalOrExpression(FX_DWORD line, XFA_FM_TOKEN op, CXFA_FMSimpleExpression *pExp1, CXFA_FMSimpleExpression *pExp2) + : CXFA_FMBinExpression(line, op, pExp1, pExp2) +{ +} +void CXFA_FMLogicalOrExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ + javascript << gs_lpStrExpFuncName[LOGICALOR]; + javascript << FX_WSTRC(L"("); + m_pExp1->ToJavaScript(javascript); + javascript << FX_WSTRC(L", "); + m_pExp2->ToJavaScript(javascript); + javascript << FX_WSTRC(L")"); +} +CXFA_FMLogicalAndExpression::CXFA_FMLogicalAndExpression(FX_DWORD line, XFA_FM_TOKEN op, CXFA_FMSimpleExpression *pExp1, CXFA_FMSimpleExpression *pExp2 ) + : CXFA_FMBinExpression(line, op, pExp1, pExp2) +{ +} +void CXFA_FMLogicalAndExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ + javascript << gs_lpStrExpFuncName[LOGICALAND]; + javascript << FX_WSTRC(L"("); + m_pExp1->ToJavaScript(javascript); + javascript << FX_WSTRC(L", "); + m_pExp2->ToJavaScript(javascript); + javascript << FX_WSTRC(L")"); +} +CXFA_FMEqualityExpression::CXFA_FMEqualityExpression(FX_DWORD line, XFA_FM_TOKEN op, CXFA_FMSimpleExpression *pExp1, CXFA_FMSimpleExpression *pExp2 ) + : CXFA_FMBinExpression(line, op, pExp1, pExp2) +{ +} +void CXFA_FMEqualityExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ + switch(m_op) { + case TOKeq: + case TOKkseq: + javascript << gs_lpStrExpFuncName[EQUALITY]; + break; + case TOKne: + case TOKksne: + javascript << gs_lpStrExpFuncName[NOTEQUALITY]; + break; + default: + FXSYS_assert(FALSE); + break; + } + javascript << FX_WSTRC(L"("); + m_pExp1->ToJavaScript(javascript); + javascript << FX_WSTRC(L", "); + m_pExp2->ToJavaScript(javascript); + javascript << FX_WSTRC(L")"); +} +CXFA_FMRelationalExpression::CXFA_FMRelationalExpression(FX_DWORD line, XFA_FM_TOKEN op, CXFA_FMSimpleExpression *pExp1, CXFA_FMSimpleExpression *pExp2 ) + : CXFA_FMBinExpression(line, op, pExp1, pExp2) +{ +} +void CXFA_FMRelationalExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ + switch (m_op) { + case TOKlt: + case TOKkslt: + javascript << gs_lpStrExpFuncName[LESS]; + break; + case TOKgt: + case TOKksgt: + javascript << gs_lpStrExpFuncName[GREATER]; + break; + case TOKle: + case TOKksle: + javascript << gs_lpStrExpFuncName[LESSEQUAL]; + break; + case TOKge: + case TOKksge: + javascript << gs_lpStrExpFuncName[GREATEREQUAL]; + break; + default: + FXSYS_assert(FALSE); + break; + } + javascript << FX_WSTRC(L"("); + m_pExp1->ToJavaScript(javascript); + javascript << FX_WSTRC(L", "); + m_pExp2->ToJavaScript(javascript); + javascript << FX_WSTRC(L")"); +} +CXFA_FMAdditiveExpression::CXFA_FMAdditiveExpression(FX_DWORD line, XFA_FM_TOKEN op, CXFA_FMSimpleExpression *pExp1, CXFA_FMSimpleExpression *pExp2 ) + : CXFA_FMBinExpression(line, op, pExp1, pExp2) +{ +} +void CXFA_FMAdditiveExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ + switch (m_op) { + case TOKplus: + javascript << gs_lpStrExpFuncName[PLUS]; + break; + case TOKminus: + javascript << gs_lpStrExpFuncName[MINUS]; + break; + default: + FXSYS_assert(FALSE); + break; + } + javascript << FX_WSTRC(L"("); + m_pExp1->ToJavaScript(javascript); + javascript << FX_WSTRC(L", "); + m_pExp2->ToJavaScript(javascript); + javascript << FX_WSTRC(L")"); +} +CXFA_FMMultiplicativeExpression::CXFA_FMMultiplicativeExpression(FX_DWORD line, XFA_FM_TOKEN op, CXFA_FMSimpleExpression *pExp1, CXFA_FMSimpleExpression *pExp2 ) + : CXFA_FMBinExpression(line, op, pExp1, pExp2) +{ +} +void CXFA_FMMultiplicativeExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ + switch (m_op) { + case TOKmul: + javascript << gs_lpStrExpFuncName[MULTIPLE]; + break; + case TOKdiv: + javascript << gs_lpStrExpFuncName[DIVIDE]; + break; + default: + FXSYS_assert(FALSE); + break; + } + javascript << FX_WSTRC(L"("); + m_pExp1->ToJavaScript(javascript); + javascript << FX_WSTRC(L", "); + m_pExp2->ToJavaScript(javascript); + javascript << FX_WSTRC(L")"); +} +CXFA_FMPosExpression::CXFA_FMPosExpression(FX_DWORD line, CXFA_FMSimpleExpression *pExp ) : CXFA_FMUnaryExpression(line, TOKplus, pExp) +{ +} +void CXFA_FMPosExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ + javascript << gs_lpStrExpFuncName[POSITIVE]; + javascript << FX_WSTRC(L"("); + m_pExp->ToJavaScript(javascript); + javascript << FX_WSTRC(L")"); +} +CXFA_FMNegExpression::CXFA_FMNegExpression(FX_DWORD line, CXFA_FMSimpleExpression *pExp ) + : CXFA_FMUnaryExpression(line, TOKminus, pExp) +{ +} +void CXFA_FMNegExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ + javascript << gs_lpStrExpFuncName[NEGATIVE]; + javascript << FX_WSTRC(L"("); + m_pExp->ToJavaScript(javascript); + javascript << FX_WSTRC(L")"); +} +CXFA_FMNotExpression::CXFA_FMNotExpression(FX_DWORD line, CXFA_FMSimpleExpression *pExp ) + : CXFA_FMUnaryExpression(line, TOKksnot, pExp) +{ +} +void CXFA_FMNotExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ + javascript << gs_lpStrExpFuncName[NOT]; + javascript << FX_WSTRC(L"("); + m_pExp->ToJavaScript(javascript); + javascript << FX_WSTRC(L")"); +} +CXFA_FMCallExpression::CXFA_FMCallExpression(FX_DWORD line, CXFA_FMSimpleExpression *pExp, CFX_PtrArray *pArguments, FX_BOOL bIsSomMethod) + : CXFA_FMUnaryExpression(line, TOKcall, pExp), + m_pArguments(pArguments), + m_bIsSomMethod(bIsSomMethod) +{ +} +CXFA_FMCallExpression::~CXFA_FMCallExpression() +{ + if (m_pArguments) { + FX_INT32 argc = m_pArguments->GetSize(); + FX_INT32 index = 0; + CXFA_FMSimpleExpression *e = 0; + while (index < argc) { + e = (CXFA_FMSimpleExpression *)m_pArguments->GetAt(index); + delete e; + index++; + } + m_pArguments->RemoveAll(); + delete m_pArguments; + m_pArguments = 0; + } +} +FX_BOOL CXFA_FMCallExpression::IsBuildInFunc(CFX_WideTextBuf& funcName) +{ + FX_INT32 iLength = funcName.GetLength(); + FX_UINT32 uHash = FX_HashCode_String_GetW(funcName.GetBuffer(), iLength, TRUE); + XFA_FMBuildInFunc buildinfunction; + FX_INT32 iStart = 0, iEnd = (sizeof(buildInFuncs) / sizeof(buildInFuncs[0])) - 1; + FX_INT32 iMid = (iStart + iEnd) / 2; + do { + iMid = (iStart + iEnd) / 2; + buildinfunction = buildInFuncs[iMid]; + if (uHash == buildinfunction.m_uHash) { + funcName.Clear(); + funcName << buildinfunction.m_buildinfunc; + return TRUE; + } else if (uHash < buildinfunction.m_uHash) { + iEnd = iMid - 1; + } else { + iStart = iMid + 1; + } + } while (iStart <= iEnd); + return FALSE; +} +FX_DWORD CXFA_FMCallExpression::IsSomMethodWithObjPara(FX_WSTR methodName) +{ + FX_INT32 iLength = methodName.GetLength(); + FX_UINT32 uHash = FX_HashCode_String_GetW(methodName.GetPtr(), iLength); + XFA_FMSOMMethod somMethodWithObjPara; + FX_DWORD parameters = 0x00; + FX_INT32 iStart = 0, iEnd = (sizeof(gs_FMSomMethods) / sizeof(gs_FMSomMethods[0])) - 1; + FX_INT32 iMid = (iStart + iEnd) / 2; + do { + iMid = (iStart + iEnd) / 2; + somMethodWithObjPara = gs_FMSomMethods[iMid]; + if (uHash == somMethodWithObjPara.m_uHash) { + parameters = somMethodWithObjPara.m_dParameters; + break; + } else if (uHash < somMethodWithObjPara.m_uHash) { + iEnd = iMid - 1; + } else { + iStart = iMid + 1; + } + } while (iStart <= iEnd); + return parameters; +} +void CXFA_FMCallExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ + CFX_WideTextBuf funcName; + m_pExp->ToJavaScript(funcName); + if (m_bIsSomMethod) { + javascript << funcName; + javascript << FX_WSTRC(L"("); + if (m_pArguments) { + FX_INT32 argc = m_pArguments->GetSize(); + FX_INT32 index = 0; + FX_DWORD methodPara = IsSomMethodWithObjPara(funcName.GetWideString()); + if (methodPara > 0) { + CXFA_FMSimpleExpression *e = 0; + while (index < argc) { + if ((methodPara & (0x01 << index)) > 0) { + javascript << gs_lpStrExpFuncName[GETFMJSOBJ]; + } else { + javascript << gs_lpStrExpFuncName[GETFMVALUE]; + } + javascript << FX_WSTRC(L"("); + e = (CXFA_FMSimpleExpression *)m_pArguments->GetAt(index); + e->ToJavaScript(javascript); + javascript << FX_WSTRC(L")"); + if (index + 1 < argc) { + javascript << FX_WSTRC(L", "); + } + index++; + } + } else { + CXFA_FMSimpleExpression *e = 0; + while (index < argc) { + javascript << gs_lpStrExpFuncName[GETFMVALUE]; + javascript << FX_WSTRC(L"("); + e = (CXFA_FMSimpleExpression *)m_pArguments->GetAt(index); + e->ToJavaScript(javascript); + javascript << FX_WSTRC(L")"); + if (index + 1 < argc) { + javascript << FX_WSTRC(L", "); + } + index++; + } + } + } + javascript << FX_WSTRC(L")"); + } else { + FX_BOOL isEvalFunc = FALSE; + FX_BOOL isExistsFunc = FALSE; + if (IsBuildInFunc(funcName)) { + if (funcName.GetWideString() == FX_WSTRC(L"Eval")) { + isEvalFunc = TRUE; + javascript << FX_WSTRC(L"eval.call(this, "); + javascript << gs_lpStrExpFuncName[CALL]; + javascript << FX_WSTRC(L"Translate"); + } else if (funcName.GetWideString() == FX_WSTRC(L"Exists")) { + isExistsFunc = TRUE; + javascript << gs_lpStrExpFuncName[CALL]; + javascript << funcName; + } else { + javascript << gs_lpStrExpFuncName[CALL]; + javascript << funcName; + } + } else { + javascript << funcName; + } + javascript << FX_WSTRC(L"("); + if (isExistsFunc) { + javascript << FX_WSTRC(L"\n(\nfunction ()\n{\ntry\n{\n"); + if (m_pArguments && m_pArguments->GetSize() > 0) { + CXFA_FMSimpleExpression *e = (CXFA_FMSimpleExpression *)m_pArguments->GetAt(0); + javascript << FX_WSTRC(L"return "); + e->ToJavaScript(javascript); + javascript << FX_WSTRC(L";\n}\n"); + } else { + javascript << FX_WSTRC(L"return 0;\n}\n"); + } + javascript << FX_WSTRC(L"catch(accessExceptions)\n{\nreturn 0;\n}\n}\n).call(this)\n"); + } else if (m_pArguments) { + FX_INT32 argc = m_pArguments->GetSize(); + FX_INT32 index = 0; + CXFA_FMSimpleExpression *e = 0; + while (index < argc) { + e = (CXFA_FMSimpleExpression *)m_pArguments->GetAt(index); + e->ToJavaScript(javascript); + if (index + 1 < argc) { + javascript << FX_WSTRC(L", "); + } + index++; + } + } + javascript << FX_WSTRC(L")"); + if (isEvalFunc) { + javascript << FX_WSTRC(L")"); + } + } +} +CXFA_FMDotAccessorExpression::CXFA_FMDotAccessorExpression(FX_DWORD line, CXFA_FMSimpleExpression *pAccessor, XFA_FM_TOKEN op, + CFX_WideStringC wsIdentifier, CXFA_FMSimpleExpression *pIndexExp) + : CXFA_FMBinExpression(line, op, pAccessor, pIndexExp), + m_wsIdentifier(wsIdentifier) +{} +void CXFA_FMDotAccessorExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ + javascript << gs_lpStrExpFuncName[DOT]; + javascript << FX_WSTRC(L"("); + if(m_pExp1) { + m_pExp1->ToJavaScript(javascript); + } else { + javascript << FX_WSTRC(L"null"); + } + javascript << FX_WSTRC(L", "); + javascript << FX_WSTRC(L"\""); + if (m_pExp1 && m_pExp1->GetOperatorToken() == TOKidentifier) { + m_pExp1->ToJavaScript(javascript); + } + javascript << FX_WSTRC(L"\", "); + if (m_op == TOKdotscream) { + javascript << FX_WSTRC(L"\"#"); + javascript << m_wsIdentifier; + javascript << FX_WSTRC(L"\", "); + } else if (m_op == TOKdotstar) { + javascript << FX_WSTRC(L"\"*\", "); + } else if (m_op == TOKcall) { + javascript << FX_WSTRC(L"\"\", "); + } else { + javascript << FX_WSTRC(L"\""); + javascript << m_wsIdentifier; + javascript << FX_WSTRC(L"\", "); + } + m_pExp2->ToJavaScript(javascript); + javascript << FX_WSTRC(L")"); +} +CXFA_FMIndexExpression::CXFA_FMIndexExpression(FX_DWORD line, XFA_FM_AccessorIndex accessorIndex, + CXFA_FMSimpleExpression *pIndexExp, FX_BOOL bIsStarIndex) + : CXFA_FMUnaryExpression(line, TOKlbracket, pIndexExp), + m_accessorIndex(accessorIndex), + m_bIsStarIndex(bIsStarIndex) +{} +void CXFA_FMIndexExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ + switch(m_accessorIndex) { + case ACCESSOR_NO_INDEX: + javascript << FX_WSTRC(L"0"); + break; + case ACCESSOR_NO_RELATIVEINDEX: + javascript << FX_WSTRC(L"1"); + break; + case ACCESSOR_POSITIVE_INDEX: + javascript << FX_WSTRC(L"2"); + break; + case ACCESSOR_NEGATIVE_INDEX: + javascript << FX_WSTRC(L"3"); + break; + default: + javascript << FX_WSTRC(L"0"); + } + if (!m_bIsStarIndex) { + javascript << FX_WSTRC(L", "); + if (m_pExp) { + m_pExp->ToJavaScript(javascript); + } else { + javascript << FX_WSTRC(L"0"); + } + } +} +CXFA_FMDotDotAccessorExpression::CXFA_FMDotDotAccessorExpression(FX_DWORD line, CXFA_FMSimpleExpression *pAccessor, XFA_FM_TOKEN op, + CFX_WideStringC wsIdentifier, CXFA_FMSimpleExpression *pIndexExp) + : CXFA_FMBinExpression(line, op, pAccessor, pIndexExp), + m_wsIdentifier(wsIdentifier) +{} +void CXFA_FMDotDotAccessorExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ + javascript << gs_lpStrExpFuncName[DOTDOT]; + javascript << FX_WSTRC(L"("); + m_pExp1->ToJavaScript(javascript); + javascript << FX_WSTRC(L", "); + javascript << FX_WSTRC(L"\""); + if (m_pExp1 && m_pExp1->GetOperatorToken() == TOKidentifier) { + m_pExp1->ToJavaScript(javascript); + } + javascript << FX_WSTRC(L"\", "); + javascript << FX_WSTRC(L"\""); + javascript << m_wsIdentifier; + javascript << FX_WSTRC(L"\", "); + m_pExp2->ToJavaScript(javascript); + javascript << FX_WSTRC(L")"); +} +CXFA_FMMethodCallExpression::CXFA_FMMethodCallExpression(FX_DWORD line, CXFA_FMSimpleExpression *pAccessorExp1, CXFA_FMSimpleExpression *pCallExp) + : CXFA_FMBinExpression(line, TOKdot, pAccessorExp1, pCallExp) +{ +} +void CXFA_FMMethodCallExpression::ToJavaScript(CFX_WideTextBuf& javascript) +{ + javascript << FX_WSTRC(L"(\nfunction ()\n{\n"); + javascript << FX_WSTRC(L"var method_return_value = null;\n"); + javascript << FX_WSTRC(L"var accessor_object = "); + m_pExp1->ToJavaScript(javascript); + javascript << FX_WSTRC(L";\n"); + javascript << FX_WSTRC(L"if ("); + javascript << gs_lpStrExpFuncName[ISFMARRAY]; + javascript << FX_WSTRC(L"(accessor_object))\n{\n"); + javascript << FX_WSTRC(L"for(var index = accessor_object.length - 1; index > 1; index--)\n{\n"); + javascript << FX_WSTRC(L"method_return_value = accessor_object[index]."); + m_pExp2->ToJavaScript(javascript); + javascript << FX_WSTRC(L";\n}\n}\n"); + javascript << FX_WSTRC(L"else\n{\nmethod_return_value = accessor_object."); + m_pExp2->ToJavaScript(javascript); + javascript << FX_WSTRC(L";\n}\n"); + javascript << FX_WSTRC(L"return method_return_value;\n"); + javascript << FX_WSTRC(L"}\n).call(this)"); +} diff --git a/xfa/src/fxfa/src/fm2js/xfa_simpleexpression.h b/xfa/src/fxfa/src/fm2js/xfa_simpleexpression.h new file mode 100644 index 0000000000..2a6245d348 --- /dev/null +++ b/xfa/src/fxfa/src/fm2js/xfa_simpleexpression.h @@ -0,0 +1,239 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _XFA_FM_SIMPLEEXPRESSION_H +#define _XFA_FM_SIMPLEEXPRESSION_H +enum XFA_FM_SimpleExpressionType { + ASSIGN, + LOGICALOR, + LOGICALAND, + EQUALITY, + NOTEQUALITY, + LESS, + LESSEQUAL, + GREATER, + GREATEREQUAL, + PLUS, + MINUS, + MULTIPLE, + DIVIDE, + POSITIVE, + NEGATIVE, + NOT, + CALL, + DOT, + DOTDOT, + CONCATFMOBJECT, + ISFMOBJECT, + ISFMARRAY, + GETFMVALUE, + GETFMJSOBJ, + VARFILTER +}; +CFX_WideStringC XFA_FM_EXPTypeToString(XFA_FM_SimpleExpressionType simpleExpType); +struct XFA_FMBuildInFunc { + FX_UINT32 m_uHash; + FX_LPCWSTR m_buildinfunc; +}; +struct XFA_FMSOMMethod { + FX_UINT32 m_uHash; + FX_LPCWSTR m_wsSomMethodName; + FX_DWORD m_dParameters; +}; +enum XFA_FM_AccessorIndex { + ACCESSOR_NO_INDEX, + ACCESSOR_NO_RELATIVEINDEX, + ACCESSOR_POSITIVE_INDEX, + ACCESSOR_NEGATIVE_INDEX +}; +class CXFA_FMSimpleExpression : public CFX_Object +{ +public: + CXFA_FMSimpleExpression(FX_DWORD line, XFA_FM_TOKEN op); + virtual ~CXFA_FMSimpleExpression() {}; + virtual void ToJavaScript(CFX_WideTextBuf& javascript); + virtual void ToImpliedReturnJS(CFX_WideTextBuf& javascript); + + XFA_FM_TOKEN GetOperatorToken() const; +protected: + FX_DWORD m_line; + XFA_FM_TOKEN m_op; +}; +class CXFA_FMNullExpression : public CXFA_FMSimpleExpression +{ +public: + CXFA_FMNullExpression(FX_DWORD line); + virtual ~CXFA_FMNullExpression() {}; + virtual void ToJavaScript(CFX_WideTextBuf& javascript); +}; +class CXFA_FMNumberExpression : public CXFA_FMSimpleExpression +{ +public: + CXFA_FMNumberExpression(FX_DWORD line, CFX_WideStringC wsNumber); + virtual ~CXFA_FMNumberExpression() {}; + virtual void ToJavaScript(CFX_WideTextBuf& javascript); +protected: + CFX_WideStringC m_wsNumber; +}; +class CXFA_FMStringExpression : public CXFA_FMSimpleExpression +{ +public: + CXFA_FMStringExpression(FX_DWORD line, CFX_WideStringC wsString); + virtual ~CXFA_FMStringExpression() {}; + virtual void ToJavaScript(CFX_WideTextBuf& javascript); +protected: + CFX_WideStringC m_wsString; +}; +class CXFA_FMIdentifierExpressionn : public CXFA_FMSimpleExpression +{ +public: + CXFA_FMIdentifierExpressionn(FX_DWORD line, CFX_WideStringC wsIdentifier); + virtual ~CXFA_FMIdentifierExpressionn() {}; + virtual void ToJavaScript(CFX_WideTextBuf& javascript); +protected: + CFX_WideStringC m_wsIdentifier; +}; +class CXFA_FMUnaryExpression : public CXFA_FMSimpleExpression +{ +public: + CXFA_FMUnaryExpression(FX_DWORD line, XFA_FM_TOKEN op, CXFA_FMSimpleExpression *pExp); + virtual ~CXFA_FMUnaryExpression(); + virtual void ToJavaScript(CFX_WideTextBuf& javascript); +protected: + CXFA_FMSimpleExpression *m_pExp; +}; +class CXFA_FMBinExpression : public CXFA_FMSimpleExpression +{ +public: + CXFA_FMBinExpression(FX_DWORD line, XFA_FM_TOKEN op, CXFA_FMSimpleExpression *pExp1, CXFA_FMSimpleExpression *pExp2); + virtual ~CXFA_FMBinExpression(); + virtual void ToJavaScript(CFX_WideTextBuf& javascript); +protected: + CXFA_FMSimpleExpression *m_pExp1; + CXFA_FMSimpleExpression *m_pExp2; +}; +class CXFA_FMAssignExpression : public CXFA_FMBinExpression +{ +public: + CXFA_FMAssignExpression(FX_DWORD line, XFA_FM_TOKEN op, CXFA_FMSimpleExpression *pExp1, CXFA_FMSimpleExpression *pExp2); + virtual ~CXFA_FMAssignExpression() {}; + virtual void ToJavaScript(CFX_WideTextBuf& javascript); + virtual void ToImpliedReturnJS(CFX_WideTextBuf& javascript); +}; +class CXFA_FMLogicalOrExpression : public CXFA_FMBinExpression +{ +public: + CXFA_FMLogicalOrExpression(FX_DWORD line, XFA_FM_TOKEN op, CXFA_FMSimpleExpression *pExp1, CXFA_FMSimpleExpression *pExp2); + virtual ~CXFA_FMLogicalOrExpression() {}; + virtual void ToJavaScript(CFX_WideTextBuf& javascript); +}; +class CXFA_FMLogicalAndExpression : public CXFA_FMBinExpression +{ +public: + CXFA_FMLogicalAndExpression(FX_DWORD line, XFA_FM_TOKEN op, CXFA_FMSimpleExpression *pExp1, CXFA_FMSimpleExpression *pExp2); + virtual ~CXFA_FMLogicalAndExpression() {}; + virtual void ToJavaScript(CFX_WideTextBuf& javascript); +}; +class CXFA_FMEqualityExpression : public CXFA_FMBinExpression +{ +public: + CXFA_FMEqualityExpression(FX_DWORD line, XFA_FM_TOKEN op, CXFA_FMSimpleExpression *pExp1, CXFA_FMSimpleExpression *pExp2); + virtual ~CXFA_FMEqualityExpression() {}; + virtual void ToJavaScript(CFX_WideTextBuf& javascript); +}; +class CXFA_FMRelationalExpression : public CXFA_FMBinExpression +{ +public: + CXFA_FMRelationalExpression(FX_DWORD line, XFA_FM_TOKEN op, CXFA_FMSimpleExpression *pExp1, CXFA_FMSimpleExpression *pExp2); + virtual ~CXFA_FMRelationalExpression() {}; + virtual void ToJavaScript(CFX_WideTextBuf& javascript); +}; +class CXFA_FMAdditiveExpression : public CXFA_FMBinExpression +{ +public: + CXFA_FMAdditiveExpression(FX_DWORD line, XFA_FM_TOKEN op, CXFA_FMSimpleExpression *pExp1, CXFA_FMSimpleExpression *pExp2); + virtual ~CXFA_FMAdditiveExpression() {}; + virtual void ToJavaScript(CFX_WideTextBuf& javascript); +}; +class CXFA_FMMultiplicativeExpression : public CXFA_FMBinExpression +{ +public: + CXFA_FMMultiplicativeExpression(FX_DWORD line, XFA_FM_TOKEN op, CXFA_FMSimpleExpression *pExp1, CXFA_FMSimpleExpression *pExp2); + virtual ~CXFA_FMMultiplicativeExpression() {}; + virtual void ToJavaScript(CFX_WideTextBuf& javascript); +}; +class CXFA_FMPosExpression : public CXFA_FMUnaryExpression +{ +public: + CXFA_FMPosExpression(FX_DWORD line, CXFA_FMSimpleExpression *pExp); + virtual ~CXFA_FMPosExpression() {}; + virtual void ToJavaScript(CFX_WideTextBuf& javascript); +}; +class CXFA_FMNegExpression : public CXFA_FMUnaryExpression +{ +public: + CXFA_FMNegExpression(FX_DWORD line, CXFA_FMSimpleExpression *pExp); + virtual ~CXFA_FMNegExpression() {}; + virtual void ToJavaScript(CFX_WideTextBuf& javascript); +}; +class CXFA_FMNotExpression : public CXFA_FMUnaryExpression +{ +public: + CXFA_FMNotExpression(FX_DWORD line, CXFA_FMSimpleExpression *pExp); + virtual ~CXFA_FMNotExpression() {}; + virtual void ToJavaScript(CFX_WideTextBuf& javascript); +}; +class CXFA_FMCallExpression : public CXFA_FMUnaryExpression +{ +public: + CXFA_FMCallExpression(FX_DWORD line, CXFA_FMSimpleExpression *pExp, CFX_PtrArray *pArguments, FX_BOOL bIsSomMethod); + virtual ~CXFA_FMCallExpression(); + virtual FX_BOOL IsBuildInFunc(CFX_WideTextBuf& funcName); + virtual FX_DWORD IsSomMethodWithObjPara(FX_WSTR methodName); + virtual void ToJavaScript(CFX_WideTextBuf& javascript); +private: + FX_BOOL m_bIsSomMethod; + CFX_PtrArray *m_pArguments; +}; +class CXFA_FMDotAccessorExpression : public CXFA_FMBinExpression +{ +public: + CXFA_FMDotAccessorExpression(FX_DWORD line, CXFA_FMSimpleExpression *pAccessor, XFA_FM_TOKEN op, + CFX_WideStringC wsIdentifier, CXFA_FMSimpleExpression *pIndexExp); + virtual ~CXFA_FMDotAccessorExpression() {}; + virtual void ToJavaScript(CFX_WideTextBuf& javascript); +protected: + CFX_WideStringC m_wsIdentifier; +}; +class CXFA_FMIndexExpression : public CXFA_FMUnaryExpression +{ +public: + CXFA_FMIndexExpression(FX_DWORD line, XFA_FM_AccessorIndex accessorIndex, CXFA_FMSimpleExpression *pIndexExp, FX_BOOL bIsStarIndex); + virtual ~CXFA_FMIndexExpression() {}; + virtual void ToJavaScript(CFX_WideTextBuf& javascript); +protected: + XFA_FM_AccessorIndex m_accessorIndex; + FX_BOOL m_bIsStarIndex; +}; +class CXFA_FMDotDotAccessorExpression : public CXFA_FMBinExpression +{ +public: + CXFA_FMDotDotAccessorExpression(FX_DWORD line, CXFA_FMSimpleExpression *pAccessor, XFA_FM_TOKEN op, + CFX_WideStringC wsIdentifier, CXFA_FMSimpleExpression *pIndexExp); + virtual ~CXFA_FMDotDotAccessorExpression() {}; + virtual void ToJavaScript(CFX_WideTextBuf& javascript); +protected: + CFX_WideStringC m_wsIdentifier; +}; +class CXFA_FMMethodCallExpression : public CXFA_FMBinExpression +{ +public: + CXFA_FMMethodCallExpression(FX_DWORD line, CXFA_FMSimpleExpression *pAccessorExp1, CXFA_FMSimpleExpression *pCallExp); + virtual ~CXFA_FMMethodCallExpression() {}; + virtual void ToJavaScript(CFX_WideTextBuf& javascript); +protected: +}; +#endif diff --git a/xfa/src/fxfa/src/parser/xfa_basic_data.cpp b/xfa/src/fxfa/src/parser/xfa_basic_data.cpp new file mode 100644 index 0000000000..c7508cbe99 --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_basic_data.cpp @@ -0,0 +1,1429 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_utils.h" +#include "../common/xfa_object.h" +#include "../common/xfa_document.h" +#include "../common/xfa_parser.h" +#include "../common/xfa_script.h" +#include "../common/xfa_docdata.h" +#include "../common/xfa_doclayout.h" +#include "../common/xfa_debug.h" +#include "../common/xfa_localemgr.h" +#include "../common/xfa_fm2jsapi.h" +#include "xfa_debug_parser.h" +#include "xfa_basic_imp.h" +#include "xfa_script_datawindow.h" +#include "xfa_script_eventpseudomodel.h" +#include "xfa_script_hostpseudomodel.h" +#include "xfa_script_logpseudomodel.h" +#include "xfa_script_layoutpseudomodel.h" +#include "xfa_script_signaturepseudomodel.h" +extern const XFA_ATTRIBUTEENUMINFO g_XFAEnumData[] = { + {0x2a, (FX_LPCWSTR)L"*", XFA_ATTRIBUTEENUM_Asterisk}, {0x2f, (FX_LPCWSTR)L"/", XFA_ATTRIBUTEENUM_Slash}, {0x5c, (FX_LPCWSTR)L"\\", XFA_ATTRIBUTEENUM_Backslash}, + {0x239bd, (FX_LPCWSTR)L"on", XFA_ATTRIBUTEENUM_On}, {0x25356, (FX_LPCWSTR)L"tb", XFA_ATTRIBUTEENUM_Tb}, {0x25885, (FX_LPCWSTR)L"up", XFA_ATTRIBUTEENUM_Up}, + {0x91b281, (FX_LPCWSTR)L"metaData", XFA_ATTRIBUTEENUM_MetaData}, {0x1f8dedb, (FX_LPCWSTR)L"delegate", XFA_ATTRIBUTEENUM_Delegate}, {0x2a6c55a, (FX_LPCWSTR)L"postSubmit", XFA_ATTRIBUTEENUM_PostSubmit}, + {0x31b19c1, (FX_LPCWSTR)L"name", XFA_ATTRIBUTEENUM_Name}, {0x378a38a, (FX_LPCWSTR)L"cross", XFA_ATTRIBUTEENUM_Cross}, {0x3848b3f, (FX_LPCWSTR)L"next", XFA_ATTRIBUTEENUM_Next}, + {0x48b6670, (FX_LPCWSTR)L"none", XFA_ATTRIBUTEENUM_None}, {0x51aafe5, (FX_LPCWSTR)L"shortEdge", XFA_ATTRIBUTEENUM_ShortEdge}, {0x55264c4, (FX_LPCWSTR)L"1mod10_1mod11", XFA_ATTRIBUTEENUM_1mod10_1mod11}, + {0x5a5c519, (FX_LPCWSTR)L"height", XFA_ATTRIBUTEENUM_Height}, {0x89ce549, (FX_LPCWSTR)L"crossDiagonal", XFA_ATTRIBUTEENUM_CrossDiagonal}, {0x9f9d0f9, (FX_LPCWSTR)L"all", XFA_ATTRIBUTEENUM_All}, + {0x9f9db48, (FX_LPCWSTR)L"any", XFA_ATTRIBUTEENUM_Any}, {0xa126261, (FX_LPCWSTR)L"toRight", XFA_ATTRIBUTEENUM_ToRight}, {0xa36de29, (FX_LPCWSTR)L"matchTemplate", XFA_ATTRIBUTEENUM_MatchTemplate}, + {0xa48d040, (FX_LPCWSTR)L"dpl", XFA_ATTRIBUTEENUM_Dpl}, {0xa559c05, (FX_LPCWSTR)L"invisible", XFA_ATTRIBUTEENUM_Invisible}, {0xa7d48e3, (FX_LPCWSTR)L"fit", XFA_ATTRIBUTEENUM_Fit}, + {0xa8a8f80, (FX_LPCWSTR)L"width", XFA_ATTRIBUTEENUM_Width}, {0xab466bb, (FX_LPCWSTR)L"preSubmit", XFA_ATTRIBUTEENUM_PreSubmit}, {0xacc5785, (FX_LPCWSTR)L"ipl", XFA_ATTRIBUTEENUM_Ipl}, + {0xafab0f8, (FX_LPCWSTR)L"flateCompress", XFA_ATTRIBUTEENUM_FlateCompress}, {0xb355816, (FX_LPCWSTR)L"med", XFA_ATTRIBUTEENUM_Med}, {0xb69ef77, (FX_LPCWSTR)L"odd", XFA_ATTRIBUTEENUM_Odd}, + {0xb69f9bb, (FX_LPCWSTR)L"off", XFA_ATTRIBUTEENUM_Off}, {0xb843dba, (FX_LPCWSTR)L"pdf", XFA_ATTRIBUTEENUM_Pdf}, {0xbb912b8, (FX_LPCWSTR)L"row", XFA_ATTRIBUTEENUM_Row}, + {0xbedaf33, (FX_LPCWSTR)L"top", XFA_ATTRIBUTEENUM_Top}, {0xc56afcc, (FX_LPCWSTR)L"xdp", XFA_ATTRIBUTEENUM_Xdp}, {0xc56ba02, (FX_LPCWSTR)L"xfd", XFA_ATTRIBUTEENUM_Xfd}, + {0xc56ddf1, (FX_LPCWSTR)L"xml", XFA_ATTRIBUTEENUM_Xml}, {0xc8b65f3, (FX_LPCWSTR)L"zip", XFA_ATTRIBUTEENUM_Zip}, {0xc8b89d6, (FX_LPCWSTR)L"zpl", XFA_ATTRIBUTEENUM_Zpl}, + {0xf55d7ee, (FX_LPCWSTR)L"visible", XFA_ATTRIBUTEENUM_Visible}, {0xfe3596a, (FX_LPCWSTR)L"exclude", XFA_ATTRIBUTEENUM_Exclude}, {0x109d7ce7, (FX_LPCWSTR)L"mouseEnter", XFA_ATTRIBUTEENUM_MouseEnter}, + {0x10f1bc0c, (FX_LPCWSTR)L"pair", XFA_ATTRIBUTEENUM_Pair}, {0x1154efe6, (FX_LPCWSTR)L"filter", XFA_ATTRIBUTEENUM_Filter}, {0x125bc94b, (FX_LPCWSTR)L"moveLast", XFA_ATTRIBUTEENUM_MoveLast}, + {0x12e1f1f0, (FX_LPCWSTR)L"exportAndImport", XFA_ATTRIBUTEENUM_ExportAndImport}, {0x13000c60, (FX_LPCWSTR)L"push", XFA_ATTRIBUTEENUM_Push}, {0x138ee315, (FX_LPCWSTR)L"portrait", XFA_ATTRIBUTEENUM_Portrait}, + {0x14da2125, (FX_LPCWSTR)L"default", XFA_ATTRIBUTEENUM_Default}, {0x157749a5, (FX_LPCWSTR)L"storedProc", XFA_ATTRIBUTEENUM_StoredProc}, {0x16641198, (FX_LPCWSTR)L"stayBOF", XFA_ATTRIBUTEENUM_StayBOF}, + {0x16b2fc5b, (FX_LPCWSTR)L"stayEOF", XFA_ATTRIBUTEENUM_StayEOF}, {0x17fad373, (FX_LPCWSTR)L"postPrint", XFA_ATTRIBUTEENUM_PostPrint}, {0x193207d0, (FX_LPCWSTR)L"usCarrier", XFA_ATTRIBUTEENUM_UsCarrier}, + {0x193ade3e, (FX_LPCWSTR)L"right", XFA_ATTRIBUTEENUM_Right}, {0x1bfc72d9, (FX_LPCWSTR)L"preOpen", XFA_ATTRIBUTEENUM_PreOpen}, {0x1cc9317a, (FX_LPCWSTR)L"actual", XFA_ATTRIBUTEENUM_Actual}, + {0x1f31df1e, (FX_LPCWSTR)L"rest", XFA_ATTRIBUTEENUM_Rest}, {0x1fb1bf14, (FX_LPCWSTR)L"topCenter", XFA_ATTRIBUTEENUM_TopCenter}, {0x207de667, (FX_LPCWSTR)L"standardSymbol", XFA_ATTRIBUTEENUM_StandardSymbol}, + {0x2196a452, (FX_LPCWSTR)L"initialize", XFA_ATTRIBUTEENUM_Initialize}, {0x23bd40c7, (FX_LPCWSTR)L"justifyAll", XFA_ATTRIBUTEENUM_JustifyAll}, {0x247cf3e9, (FX_LPCWSTR)L"normal", XFA_ATTRIBUTEENUM_Normal}, + {0x25aa946b, (FX_LPCWSTR)L"landscape", XFA_ATTRIBUTEENUM_Landscape}, {0x2739b5c9, (FX_LPCWSTR)L"nonInteractive", XFA_ATTRIBUTEENUM_NonInteractive}, {0x27410f03, (FX_LPCWSTR)L"mouseExit", XFA_ATTRIBUTEENUM_MouseExit}, + {0x2854e62c, (FX_LPCWSTR)L"minus", XFA_ATTRIBUTEENUM_Minus}, {0x287e936a, (FX_LPCWSTR)L"diagonalLeft", XFA_ATTRIBUTEENUM_DiagonalLeft}, {0x2972a98f, (FX_LPCWSTR)L"simplexPaginated", XFA_ATTRIBUTEENUM_SimplexPaginated}, + {0x29d8225f, (FX_LPCWSTR)L"document", XFA_ATTRIBUTEENUM_Document}, {0x2a9d3016, (FX_LPCWSTR)L"warning", XFA_ATTRIBUTEENUM_Warning}, {0x2b35b6d9, (FX_LPCWSTR)L"auto", XFA_ATTRIBUTEENUM_Auto}, + {0x2c1653d9, (FX_LPCWSTR)L"below", XFA_ATTRIBUTEENUM_Below}, {0x2c1f0540, (FX_LPCWSTR)L"bottomLeft", XFA_ATTRIBUTEENUM_BottomLeft}, {0x2c44e816, (FX_LPCWSTR)L"bottomCenter", XFA_ATTRIBUTEENUM_BottomCenter}, + {0x2cd3e9f3, (FX_LPCWSTR)L"tcpl", XFA_ATTRIBUTEENUM_Tcpl}, {0x2d08af85, (FX_LPCWSTR)L"text", XFA_ATTRIBUTEENUM_Text}, {0x2dc478eb, (FX_LPCWSTR)L"grouping", XFA_ATTRIBUTEENUM_Grouping}, + {0x2ef3afdd, (FX_LPCWSTR)L"secureSymbol", XFA_ATTRIBUTEENUM_SecureSymbol}, {0x2f2dd29a, (FX_LPCWSTR)L"preExecute", XFA_ATTRIBUTEENUM_PreExecute}, {0x33c43dec, (FX_LPCWSTR)L"docClose", XFA_ATTRIBUTEENUM_DocClose}, + {0x33f25bb5, (FX_LPCWSTR)L"keyset", XFA_ATTRIBUTEENUM_Keyset}, {0x34e363da, (FX_LPCWSTR)L"vertical", XFA_ATTRIBUTEENUM_Vertical}, {0x361fa1b6, (FX_LPCWSTR)L"preSave", XFA_ATTRIBUTEENUM_PreSave}, + {0x36f1c6d8, (FX_LPCWSTR)L"preSign", XFA_ATTRIBUTEENUM_PreSign}, {0x399f02b5, (FX_LPCWSTR)L"bottom", XFA_ATTRIBUTEENUM_Bottom}, {0x3b0ab096, (FX_LPCWSTR)L"toTop", XFA_ATTRIBUTEENUM_ToTop}, + {0x3c752495, (FX_LPCWSTR)L"verify", XFA_ATTRIBUTEENUM_Verify}, {0x3ce05d68, (FX_LPCWSTR)L"first", XFA_ATTRIBUTEENUM_First}, {0x3ecead94, (FX_LPCWSTR)L"contentArea", XFA_ATTRIBUTEENUM_ContentArea}, + {0x40623b5b, (FX_LPCWSTR)L"solid", XFA_ATTRIBUTEENUM_Solid}, {0x42c6cd8d, (FX_LPCWSTR)L"pessimistic", XFA_ATTRIBUTEENUM_Pessimistic}, {0x43ddc6bf, (FX_LPCWSTR)L"duplexPaginated", XFA_ATTRIBUTEENUM_DuplexPaginated}, + {0x442f68c8, (FX_LPCWSTR)L"round", XFA_ATTRIBUTEENUM_Round}, {0x45efb847, (FX_LPCWSTR)L"remerge", XFA_ATTRIBUTEENUM_Remerge}, {0x46972265, (FX_LPCWSTR)L"ordered", XFA_ATTRIBUTEENUM_Ordered}, + {0x46f95531, (FX_LPCWSTR)L"percent", XFA_ATTRIBUTEENUM_Percent}, {0x46fd25ae, (FX_LPCWSTR)L"even", XFA_ATTRIBUTEENUM_Even}, {0x4731d6ba, (FX_LPCWSTR)L"exit", XFA_ATTRIBUTEENUM_Exit}, + {0x4977356b, (FX_LPCWSTR)L"toolTip", XFA_ATTRIBUTEENUM_ToolTip}, {0x49b980ee, (FX_LPCWSTR)L"orderedOccurrence", XFA_ATTRIBUTEENUM_OrderedOccurrence}, {0x4a7e2dfe, (FX_LPCWSTR)L"readOnly", XFA_ATTRIBUTEENUM_ReadOnly}, + {0x4c4e8acb, (FX_LPCWSTR)L"currency", XFA_ATTRIBUTEENUM_Currency}, {0x4dcf25f8, (FX_LPCWSTR)L"concat", XFA_ATTRIBUTEENUM_Concat}, {0x4febb826, (FX_LPCWSTR)L"Thai", XFA_ATTRIBUTEENUM_Thai}, + {0x50ef95b2, (FX_LPCWSTR)L"embossed", XFA_ATTRIBUTEENUM_Embossed}, {0x516e35ce, (FX_LPCWSTR)L"formdata", XFA_ATTRIBUTEENUM_Formdata}, {0x52fa6f0e, (FX_LPCWSTR)L"Greek", XFA_ATTRIBUTEENUM_Greek}, + {0x54034c2f, (FX_LPCWSTR)L"decimal", XFA_ATTRIBUTEENUM_Decimal}, {0x542c7300, (FX_LPCWSTR)L"select", XFA_ATTRIBUTEENUM_Select}, {0x551f0ae5, (FX_LPCWSTR)L"longEdge", XFA_ATTRIBUTEENUM_LongEdge}, + {0x55520a8a, (FX_LPCWSTR)L"protected", XFA_ATTRIBUTEENUM_Protected}, {0x559f76f3, (FX_LPCWSTR)L"bottomRight", XFA_ATTRIBUTEENUM_BottomRight}, {0x568cb500, (FX_LPCWSTR)L"zero", XFA_ATTRIBUTEENUM_Zero}, + {0x56bcecb7, (FX_LPCWSTR)L"forwardOnly", XFA_ATTRIBUTEENUM_ForwardOnly}, {0x56bf456b, (FX_LPCWSTR)L"docReady", XFA_ATTRIBUTEENUM_DocReady}, {0x573cb40c, (FX_LPCWSTR)L"hidden", XFA_ATTRIBUTEENUM_Hidden}, + {0x582e3424, (FX_LPCWSTR)L"include", XFA_ATTRIBUTEENUM_Include}, {0x58a3dd29, (FX_LPCWSTR)L"dashed", XFA_ATTRIBUTEENUM_Dashed}, {0x5955b22b, (FX_LPCWSTR)L"multiSelect", XFA_ATTRIBUTEENUM_MultiSelect}, + {0x598d5c53, (FX_LPCWSTR)L"inactive", XFA_ATTRIBUTEENUM_Inactive}, {0x59c8f27d, (FX_LPCWSTR)L"embed", XFA_ATTRIBUTEENUM_Embed}, {0x5e7555e8, (FX_LPCWSTR)L"static", XFA_ATTRIBUTEENUM_Static}, + {0x606d4def, (FX_LPCWSTR)L"onEntry", XFA_ATTRIBUTEENUM_OnEntry}, {0x6195eafb, (FX_LPCWSTR)L"Cyrillic", XFA_ATTRIBUTEENUM_Cyrillic}, {0x6491b0f3, (FX_LPCWSTR)L"nonBlank", XFA_ATTRIBUTEENUM_NonBlank}, + {0x67bef031, (FX_LPCWSTR)L"topRight", XFA_ATTRIBUTEENUM_TopRight}, {0x67df5ebd, (FX_LPCWSTR)L"Hebrew", XFA_ATTRIBUTEENUM_Hebrew}, {0x6aea98be, (FX_LPCWSTR)L"topLeft", XFA_ATTRIBUTEENUM_TopLeft}, + {0x6c51afc1, (FX_LPCWSTR)L"center", XFA_ATTRIBUTEENUM_Center}, {0x7145e6bf, (FX_LPCWSTR)L"moveFirst", XFA_ATTRIBUTEENUM_MoveFirst}, {0x7375465c, (FX_LPCWSTR)L"diamond", XFA_ATTRIBUTEENUM_Diamond}, + {0x7461aef4, (FX_LPCWSTR)L"pageOdd", XFA_ATTRIBUTEENUM_PageOdd}, {0x75f8aeb2, (FX_LPCWSTR)L"1mod10", XFA_ATTRIBUTEENUM_1mod10}, {0x76d708e0, (FX_LPCWSTR)L"Korean", XFA_ATTRIBUTEENUM_Korean}, + {0x789f14d7, (FX_LPCWSTR)L"aboveEmbedded", XFA_ATTRIBUTEENUM_AboveEmbedded}, {0x792ea39f, (FX_LPCWSTR)L"zipCompress", XFA_ATTRIBUTEENUM_ZipCompress}, {0x7a5b7193, (FX_LPCWSTR)L"numeric", XFA_ATTRIBUTEENUM_Numeric}, + {0x7abec0d2, (FX_LPCWSTR)L"circle", XFA_ATTRIBUTEENUM_Circle}, {0x7afbba38, (FX_LPCWSTR)L"toBottom", XFA_ATTRIBUTEENUM_ToBottom}, {0x7b95e661, (FX_LPCWSTR)L"inverted", XFA_ATTRIBUTEENUM_Inverted}, + {0x7baca2e3, (FX_LPCWSTR)L"update", XFA_ATTRIBUTEENUM_Update}, {0x7eb5da2c, (FX_LPCWSTR)L"isoname", XFA_ATTRIBUTEENUM_Isoname}, {0x7f6fd3d7, (FX_LPCWSTR)L"server", XFA_ATTRIBUTEENUM_Server}, + {0x814f82b5, (FX_LPCWSTR)L"position", XFA_ATTRIBUTEENUM_Position}, {0x82deacf0, (FX_LPCWSTR)L"middleCenter", XFA_ATTRIBUTEENUM_MiddleCenter}, {0x83a49dc6, (FX_LPCWSTR)L"optional", XFA_ATTRIBUTEENUM_Optional}, + {0x861a116f, (FX_LPCWSTR)L"usePrinterSetting", XFA_ATTRIBUTEENUM_UsePrinterSetting}, {0x86701ce0, (FX_LPCWSTR)L"outline", XFA_ATTRIBUTEENUM_Outline}, {0x8808385e, (FX_LPCWSTR)L"indexChange", XFA_ATTRIBUTEENUM_IndexChange}, + {0x891f4606, (FX_LPCWSTR)L"change", XFA_ATTRIBUTEENUM_Change}, {0x89939f36, (FX_LPCWSTR)L"pageArea", XFA_ATTRIBUTEENUM_PageArea}, {0x8b5c3b25, (FX_LPCWSTR)L"once", XFA_ATTRIBUTEENUM_Once}, + {0x8b5c6962, (FX_LPCWSTR)L"only", XFA_ATTRIBUTEENUM_Only}, {0x8b90e1f2, (FX_LPCWSTR)L"open", XFA_ATTRIBUTEENUM_Open}, {0x8bcfe96e, (FX_LPCWSTR)L"caption", XFA_ATTRIBUTEENUM_Caption}, + {0x8ce83ef8, (FX_LPCWSTR)L"raised", XFA_ATTRIBUTEENUM_Raised}, {0x8d269cae, (FX_LPCWSTR)L"justify", XFA_ATTRIBUTEENUM_Justify}, {0x8fd520dc, (FX_LPCWSTR)L"refAndDescendants", XFA_ATTRIBUTEENUM_RefAndDescendants}, + {0x9041d4b0, (FX_LPCWSTR)L"short", XFA_ATTRIBUTEENUM_Short}, {0x90c94426, (FX_LPCWSTR)L"pageFront", XFA_ATTRIBUTEENUM_PageFront}, {0x936beee5, (FX_LPCWSTR)L"monospace", XFA_ATTRIBUTEENUM_Monospace}, + {0x947fa00f, (FX_LPCWSTR)L"middle", XFA_ATTRIBUTEENUM_Middle}, {0x9528a7b4, (FX_LPCWSTR)L"prePrint", XFA_ATTRIBUTEENUM_PrePrint}, {0x959ab231, (FX_LPCWSTR)L"always", XFA_ATTRIBUTEENUM_Always}, + {0x96d61bf0, (FX_LPCWSTR)L"unknown", XFA_ATTRIBUTEENUM_Unknown}, {0x997194ee, (FX_LPCWSTR)L"toLeft", XFA_ATTRIBUTEENUM_ToLeft}, {0x9a83a3cd, (FX_LPCWSTR)L"above", XFA_ATTRIBUTEENUM_Above}, + {0x9d0d71c7, (FX_LPCWSTR)L"dashDot", XFA_ATTRIBUTEENUM_DashDot}, {0x9df56f3e, (FX_LPCWSTR)L"gregorian", XFA_ATTRIBUTEENUM_Gregorian}, {0x9f6723fd, (FX_LPCWSTR)L"Roman", XFA_ATTRIBUTEENUM_Roman}, + {0x9f693b21, (FX_LPCWSTR)L"mouseDown", XFA_ATTRIBUTEENUM_MouseDown}, {0xa1429b36, (FX_LPCWSTR)L"symbol", XFA_ATTRIBUTEENUM_Symbol}, {0xa5aa45cb, (FX_LPCWSTR)L"pageEven", XFA_ATTRIBUTEENUM_PageEven}, + {0xa68635f1, (FX_LPCWSTR)L"sign", XFA_ATTRIBUTEENUM_Sign}, {0xa7315093, (FX_LPCWSTR)L"addNew", XFA_ATTRIBUTEENUM_AddNew}, {0xa7a773fa, (FX_LPCWSTR)L"star", XFA_ATTRIBUTEENUM_Star}, + {0xa7d57b45, (FX_LPCWSTR)L"optimistic", XFA_ATTRIBUTEENUM_Optimistic}, {0xa8077321, (FX_LPCWSTR)L"rl-tb", XFA_ATTRIBUTEENUM_Rl_tb}, {0xa8f1468d, (FX_LPCWSTR)L"middleRight", XFA_ATTRIBUTEENUM_MiddleRight}, + {0xaa84a1f1, (FX_LPCWSTR)L"maintain", XFA_ATTRIBUTEENUM_Maintain}, {0xab40b12c, (FX_LPCWSTR)L"package", XFA_ATTRIBUTEENUM_Package}, {0xac8b4d85, (FX_LPCWSTR)L"SimplifiedChinese", XFA_ATTRIBUTEENUM_SimplifiedChinese}, + {0xadae6744, (FX_LPCWSTR)L"toCenter", XFA_ATTRIBUTEENUM_ToCenter}, {0xb0129df1, (FX_LPCWSTR)L"back", XFA_ATTRIBUTEENUM_Back}, {0xb0f088cf, (FX_LPCWSTR)L"unspecified", XFA_ATTRIBUTEENUM_Unspecified}, + {0xb1271067, (FX_LPCWSTR)L"batchOptimistic", XFA_ATTRIBUTEENUM_BatchOptimistic}, {0xb18313a1, (FX_LPCWSTR)L"bold", XFA_ATTRIBUTEENUM_Bold}, {0xb1833cad, (FX_LPCWSTR)L"both", XFA_ATTRIBUTEENUM_Both}, + {0xb221123f, (FX_LPCWSTR)L"butt", XFA_ATTRIBUTEENUM_Butt}, {0xb40c36bf, (FX_LPCWSTR)L"client", XFA_ATTRIBUTEENUM_Client}, {0xb56c7053, (FX_LPCWSTR)L"2mod10", XFA_ATTRIBUTEENUM_2mod10}, + {0xb683a345, (FX_LPCWSTR)L"imageOnly", XFA_ATTRIBUTEENUM_ImageOnly}, {0xb7732dea, (FX_LPCWSTR)L"horizontal", XFA_ATTRIBUTEENUM_Horizontal}, {0xb88652a4, (FX_LPCWSTR)L"dotted", XFA_ATTRIBUTEENUM_Dotted}, + {0xbb2f2880, (FX_LPCWSTR)L"userControl", XFA_ATTRIBUTEENUM_UserControl}, {0xbbb79c5d, (FX_LPCWSTR)L"diagonalRight", XFA_ATTRIBUTEENUM_DiagonalRight}, {0xbd077154, (FX_LPCWSTR)L"consumeData", XFA_ATTRIBUTEENUM_ConsumeData}, + {0xbd3fb11e, (FX_LPCWSTR)L"check", XFA_ATTRIBUTEENUM_Check}, {0xbde9abda, (FX_LPCWSTR)L"data", XFA_ATTRIBUTEENUM_Data}, {0xbf5a02d8, (FX_LPCWSTR)L"down", XFA_ATTRIBUTEENUM_Down}, + {0xbf7450ee, (FX_LPCWSTR)L"sansSerif", XFA_ATTRIBUTEENUM_SansSerif}, {0xc02d649f, (FX_LPCWSTR)L"inline", XFA_ATTRIBUTEENUM_Inline}, {0xc11a9e3a, (FX_LPCWSTR)L"TraditionalChinese", XFA_ATTRIBUTEENUM_TraditionalChinese}, + {0xc16169d8, (FX_LPCWSTR)L"warn", XFA_ATTRIBUTEENUM_Warn}, {0xc16f071f, (FX_LPCWSTR)L"refOnly", XFA_ATTRIBUTEENUM_RefOnly}, {0xc27c8ba5, (FX_LPCWSTR)L"interactiveForms", XFA_ATTRIBUTEENUM_InteractiveForms}, + {0xc2d1b15c, (FX_LPCWSTR)L"word", XFA_ATTRIBUTEENUM_Word}, {0xc3621288, (FX_LPCWSTR)L"unordered", XFA_ATTRIBUTEENUM_Unordered}, {0xc5251981, (FX_LPCWSTR)L"required", XFA_ATTRIBUTEENUM_Required}, + {0xc7088e7d, (FX_LPCWSTR)L"importOnly", XFA_ATTRIBUTEENUM_ImportOnly}, {0xc72cf0e3, (FX_LPCWSTR)L"belowEmbedded", XFA_ATTRIBUTEENUM_BelowEmbedded}, {0xc819cf07, (FX_LPCWSTR)L"Japanese", XFA_ATTRIBUTEENUM_Japanese}, + {0xcdce56b3, (FX_LPCWSTR)L"full", XFA_ATTRIBUTEENUM_Full}, {0xce0122e3, (FX_LPCWSTR)L"rl-row", XFA_ATTRIBUTEENUM_Rl_row}, {0xcf7d71f1, (FX_LPCWSTR)L"Vietnamese", XFA_ATTRIBUTEENUM_Vietnamese}, + {0xcfde3e09, (FX_LPCWSTR)L"EastEuropeanRoman", XFA_ATTRIBUTEENUM_EastEuropeanRoman}, {0xd576d08e, (FX_LPCWSTR)L"mouseUp", XFA_ATTRIBUTEENUM_MouseUp}, {0xd7a92904, (FX_LPCWSTR)L"exportOnly", XFA_ATTRIBUTEENUM_ExportOnly}, + {0xd8ed1467, (FX_LPCWSTR)L"clear", XFA_ATTRIBUTEENUM_Clear}, {0xd95657a6, (FX_LPCWSTR)L"click", XFA_ATTRIBUTEENUM_Click}, {0xd96c7de5, (FX_LPCWSTR)L"base64", XFA_ATTRIBUTEENUM_Base64}, + {0xd9f47f36, (FX_LPCWSTR)L"close", XFA_ATTRIBUTEENUM_Close}, {0xdb075bde, (FX_LPCWSTR)L"host", XFA_ATTRIBUTEENUM_Host}, {0xdb103411, (FX_LPCWSTR)L"global", XFA_ATTRIBUTEENUM_Global}, + {0xdb647188, (FX_LPCWSTR)L"blank", XFA_ATTRIBUTEENUM_Blank}, {0xdb9be968, (FX_LPCWSTR)L"table", XFA_ATTRIBUTEENUM_Table}, {0xdf590fbb, (FX_LPCWSTR)L"import", XFA_ATTRIBUTEENUM_Import}, + {0xe0e573fb, (FX_LPCWSTR)L"custom", XFA_ATTRIBUTEENUM_Custom}, {0xe0ecc79a, (FX_LPCWSTR)L"middleLeft", XFA_ATTRIBUTEENUM_MiddleLeft}, {0xe1452019, (FX_LPCWSTR)L"postExecute", XFA_ATTRIBUTEENUM_PostExecute}, + {0xe1911d98, (FX_LPCWSTR)L"radix", XFA_ATTRIBUTEENUM_Radix}, {0xe25fa7b8, (FX_LPCWSTR)L"postOpen", XFA_ATTRIBUTEENUM_PostOpen}, {0xe28dce7e, (FX_LPCWSTR)L"enter", XFA_ATTRIBUTEENUM_Enter}, + {0xe2c44de4, (FX_LPCWSTR)L"ignore", XFA_ATTRIBUTEENUM_Ignore}, {0xe2cd8c61, (FX_LPCWSTR)L"lr-tb", XFA_ATTRIBUTEENUM_Lr_tb}, {0xe2da8336, (FX_LPCWSTR)L"fantasy", XFA_ATTRIBUTEENUM_Fantasy}, + {0xe31d5396, (FX_LPCWSTR)L"italic", XFA_ATTRIBUTEENUM_Italic}, {0xe7ada113, (FX_LPCWSTR)L"author", XFA_ATTRIBUTEENUM_Author}, {0xe8e7cc18, (FX_LPCWSTR)L"toEdge", XFA_ATTRIBUTEENUM_ToEdge}, + {0xe97aa98b, (FX_LPCWSTR)L"choice", XFA_ATTRIBUTEENUM_Choice}, {0xeafd2a38, (FX_LPCWSTR)L"disabled", XFA_ATTRIBUTEENUM_Disabled}, {0xeb2b7972, (FX_LPCWSTR)L"crossHatch", XFA_ATTRIBUTEENUM_CrossHatch}, + {0xeb2db2d7, (FX_LPCWSTR)L"dataRef", XFA_ATTRIBUTEENUM_DataRef}, {0xec35dc6e, (FX_LPCWSTR)L"dashDotDot", XFA_ATTRIBUTEENUM_DashDotDot}, {0xef85d351, (FX_LPCWSTR)L"square", XFA_ATTRIBUTEENUM_Square}, + {0xf2102445, (FX_LPCWSTR)L"dynamic", XFA_ATTRIBUTEENUM_Dynamic}, {0xf272c7be, (FX_LPCWSTR)L"manual", XFA_ATTRIBUTEENUM_Manual}, {0xf2bbb64d, (FX_LPCWSTR)L"etched", XFA_ATTRIBUTEENUM_Etched}, + {0xf3b8fc6c, (FX_LPCWSTR)L"validationState", XFA_ATTRIBUTEENUM_ValidationState}, {0xf42f2b81, (FX_LPCWSTR)L"cursive", XFA_ATTRIBUTEENUM_Cursive}, {0xf54481d4, (FX_LPCWSTR)L"last", XFA_ATTRIBUTEENUM_Last}, + {0xf5ad782b, (FX_LPCWSTR)L"left", XFA_ATTRIBUTEENUM_Left}, {0xf616da2e, (FX_LPCWSTR)L"link", XFA_ATTRIBUTEENUM_Link}, {0xf6b4afb0, (FX_LPCWSTR)L"long", XFA_ATTRIBUTEENUM_Long}, + {0xf8636460, (FX_LPCWSTR)L"internationalCarrier", XFA_ATTRIBUTEENUM_InternationalCarrier}, {0xf9fb37ac, (FX_LPCWSTR)L"PDF1.3", XFA_ATTRIBUTEENUM_PDF1_3}, {0xf9fb37af, (FX_LPCWSTR)L"PDF1.6", XFA_ATTRIBUTEENUM_PDF1_6}, + {0xfbce7f19, (FX_LPCWSTR)L"serif", XFA_ATTRIBUTEENUM_Serif}, {0xfc82d695, (FX_LPCWSTR)L"postSave", XFA_ATTRIBUTEENUM_PostSave}, {0xfcef86b5, (FX_LPCWSTR)L"ready", XFA_ATTRIBUTEENUM_Ready}, + {0xfd54fbb7, (FX_LPCWSTR)L"postSign", XFA_ATTRIBUTEENUM_PostSign}, {0xfdc0aae2, (FX_LPCWSTR)L"Arabic", XFA_ATTRIBUTEENUM_Arabic}, {0xfe06d2ca, (FX_LPCWSTR)L"error", XFA_ATTRIBUTEENUM_Error}, + {0xfefc4885, (FX_LPCWSTR)L"urlencoded", XFA_ATTRIBUTEENUM_Urlencoded}, {0xff795ad2, (FX_LPCWSTR)L"lowered", XFA_ATTRIBUTEENUM_Lowered}, +}; +extern const FX_INT32 g_iXFAEnumCount = sizeof(g_XFAEnumData) / sizeof(XFA_ATTRIBUTEENUMINFO); +static const CXFA_Measurement g_XFAMeasurementData[] = { + CXFA_Measurement(0, XFA_UNIT_In), + CXFA_Measurement(0, XFA_UNIT_Pt), + CXFA_Measurement(5, XFA_UNIT_Mm), + CXFA_Measurement(0.25, XFA_UNIT_Mm), + CXFA_Measurement(-1, XFA_UNIT_Unknown), + CXFA_Measurement(0, XFA_UNIT_Angle), + CXFA_Measurement(10, XFA_UNIT_Pt), + CXFA_Measurement(360, XFA_UNIT_Angle), + CXFA_Measurement(0.5, XFA_UNIT_Pt), +}; +extern const XFA_ATTRIBUTEINFO g_XFAAttributeData[] = { + {0x68, (FX_LPCWSTR)L"h", XFA_ATTRIBUTE_H, XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(g_XFAMeasurementData + 0)}, + {0x77, (FX_LPCWSTR)L"w", XFA_ATTRIBUTE_W, XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(g_XFAMeasurementData + 0)}, + {0x78, (FX_LPCWSTR)L"x", XFA_ATTRIBUTE_X, XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(g_XFAMeasurementData + 0)}, + {0x79, (FX_LPCWSTR)L"y", XFA_ATTRIBUTE_Y, XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(g_XFAMeasurementData + 0)}, + {0x21aed, (FX_LPCWSTR)L"id", XFA_ATTRIBUTE_Id, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template | XFA_XDPPACKET_ConnectionSet | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x25363, (FX_LPCWSTR)L"to", XFA_ATTRIBUTE_To, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Config, (FX_LPVOID)NULL}, + {0xcb0ac9, (FX_LPCWSTR)L"lineThrough", XFA_ATTRIBUTE_LineThrough, XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)0}, + {0x2282c73, (FX_LPCWSTR)L"hAlign", XFA_ATTRIBUTE_HAlign, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Left}, + {0x2c1c7f1, (FX_LPCWSTR)L"typeface", XFA_ATTRIBUTE_Typeface, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(FX_LPCWSTR)L"Courier"}, + {0x3106c3a, (FX_LPCWSTR)L"beforeTarget", XFA_ATTRIBUTE_BeforeTarget, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x31b19c1, (FX_LPCWSTR)L"name", XFA_ATTRIBUTE_Name, XFA_ATTRIBUTETYPE_NOTSURE, XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Config | XFA_XDPPACKET_LocaleSet | XFA_XDPPACKET_Template | XFA_XDPPACKET_Datasets | XFA_XDPPACKET_Form | XFA_XDPPACKET_ConnectionSet | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x3848b3f, (FX_LPCWSTR)L"next", XFA_ATTRIBUTE_Next, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_None}, + {0x43e349b, (FX_LPCWSTR)L"dataRowCount", XFA_ATTRIBUTE_DataRowCount, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x5518c25, (FX_LPCWSTR)L"break", XFA_ATTRIBUTE_Break, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Close}, + {0x5ce6195, (FX_LPCWSTR)L"vScrollPolicy", XFA_ATTRIBUTE_VScrollPolicy, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Auto}, + {0x8c74ae9, (FX_LPCWSTR)L"fontHorizontalScale", XFA_ATTRIBUTE_FontHorizontalScale, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(FX_LPCWSTR)L"100%"}, + {0x8d4f1c7, (FX_LPCWSTR)L"textIndent", XFA_ATTRIBUTE_TextIndent, XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(g_XFAMeasurementData + 0)}, + {0x97c1c65, (FX_LPCWSTR)L"context", XFA_ATTRIBUTE_Context, XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_UNKNOWN, (FX_LPVOID)0}, + {0x9876578, (FX_LPCWSTR)L"trayOut", XFA_ATTRIBUTE_TrayOut, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Auto}, + {0xa2e3514, (FX_LPCWSTR)L"cap", XFA_ATTRIBUTE_Cap, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Square}, + {0xb3543a6, (FX_LPCWSTR)L"max", XFA_ATTRIBUTE_Max, XFA_ATTRIBUTETYPE_NOTSURE, XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xb356ca4, (FX_LPCWSTR)L"min", XFA_ATTRIBUTE_Min, XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)1}, + {0xbb8df5d, (FX_LPCWSTR)L"ref", XFA_ATTRIBUTE_Ref, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xbb8f3df, (FX_LPCWSTR)L"rid", XFA_ATTRIBUTE_Rid, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xc080cd3, (FX_LPCWSTR)L"url", XFA_ATTRIBUTE_Url, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xc0811ed, (FX_LPCWSTR)L"use", XFA_ATTRIBUTE_Use, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template | XFA_XDPPACKET_ConnectionSet | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xcfea02e, (FX_LPCWSTR)L"leftInset", XFA_ATTRIBUTE_LeftInset, XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(g_XFAMeasurementData + 0)}, + {0x1026c59d, (FX_LPCWSTR)L"widows", XFA_ATTRIBUTE_Widows, XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)0}, + {0x1059ec18, (FX_LPCWSTR)L"level", XFA_ATTRIBUTE_Level, XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Config, (FX_LPVOID)0}, + {0x1356caf8, (FX_LPCWSTR)L"bottomInset", XFA_ATTRIBUTE_BottomInset, XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(g_XFAMeasurementData + 0)}, + {0x13a08bdb, (FX_LPCWSTR)L"overflowTarget", XFA_ATTRIBUTE_OverflowTarget, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x1414d431, (FX_LPCWSTR)L"allowMacro", XFA_ATTRIBUTE_AllowMacro, XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)0}, + {0x14a32d52, (FX_LPCWSTR)L"pagePosition", XFA_ATTRIBUTE_PagePosition, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Any}, + {0x1517dfa1, (FX_LPCWSTR)L"columnWidths", XFA_ATTRIBUTE_ColumnWidths, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x169134a1, (FX_LPCWSTR)L"overflowLeader", XFA_ATTRIBUTE_OverflowLeader, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x1b8dce3e, (FX_LPCWSTR)L"action", XFA_ATTRIBUTE_Action, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Include}, + {0x1e459b8f, (FX_LPCWSTR)L"nonRepudiation", XFA_ATTRIBUTE_NonRepudiation, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x1ec8ab2c, (FX_LPCWSTR)L"rate", XFA_ATTRIBUTE_Rate, XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)50}, + {0x1ef3a64a, (FX_LPCWSTR)L"allowRichText", XFA_ATTRIBUTE_AllowRichText, XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)0}, + {0x2038c9b2, (FX_LPCWSTR)L"role", XFA_ATTRIBUTE_Role, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x20914367, (FX_LPCWSTR)L"overflowTrailer", XFA_ATTRIBUTE_OverflowTrailer, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x226ca8f1, (FX_LPCWSTR)L"operation", XFA_ATTRIBUTE_Operation, XFA_ATTRIBUTETYPE_NOTSURE, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x24d85167, (FX_LPCWSTR)L"timeout", XFA_ATTRIBUTE_Timeout, XFA_ATTRIBUTETYPE_NOTSURE, XFA_XDPPACKET_SourceSet, (FX_LPVOID)NULL}, + {0x25764436, (FX_LPCWSTR)L"topInset", XFA_ATTRIBUTE_TopInset, XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(g_XFAMeasurementData + 0)}, + {0x25839852, (FX_LPCWSTR)L"access", XFA_ATTRIBUTE_Access, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Open}, + {0x268b7ec1, (FX_LPCWSTR)L"commandType", XFA_ATTRIBUTE_CommandType, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_SourceSet, (FX_LPVOID)XFA_ATTRIBUTEENUM_Unknown}, + {0x28dee6e9, (FX_LPCWSTR)L"format", XFA_ATTRIBUTE_Format, XFA_ATTRIBUTETYPE_NOTSURE, XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x28e17e91, (FX_LPCWSTR)L"dataPrep", XFA_ATTRIBUTE_DataPrep, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_None}, + {0x292b88fe, (FX_LPCWSTR)L"widgetData", XFA_ATTRIBUTE_WidgetData, XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_UNKNOWN, (FX_LPVOID)0}, + {0x29418bb7, (FX_LPCWSTR)L"abbr", XFA_ATTRIBUTE_Abbr, XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_LocaleSet, (FX_LPVOID)0}, + {0x2a82d99c, (FX_LPCWSTR)L"marginRight", XFA_ATTRIBUTE_MarginRight, XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(g_XFAMeasurementData + 0)}, + {0x2b5df51e, (FX_LPCWSTR)L"dataDescription", XFA_ATTRIBUTE_DataDescription, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_ConnectionSet, (FX_LPVOID)NULL}, + {0x2bb3f470, (FX_LPCWSTR)L"encipherOnly", XFA_ATTRIBUTE_EncipherOnly, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x2cd79033, (FX_LPCWSTR)L"kerningMode", XFA_ATTRIBUTE_KerningMode, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_None}, + {0x2ee7678f, (FX_LPCWSTR)L"rotate", XFA_ATTRIBUTE_Rotate, XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(g_XFAMeasurementData + 5)}, + {0x2f105f72, (FX_LPCWSTR)L"wordCharacterCount", XFA_ATTRIBUTE_WordCharacterCount, XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)7}, + {0x2f16a382, (FX_LPCWSTR)L"type", XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_NOTSURE, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x34ae103c, (FX_LPCWSTR)L"reserve", XFA_ATTRIBUTE_Reserve, XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(g_XFAMeasurementData + 4)}, + {0x3650557e, (FX_LPCWSTR)L"textLocation", XFA_ATTRIBUTE_TextLocation, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Below}, + {0x39cdb0a2, (FX_LPCWSTR)L"priority", XFA_ATTRIBUTE_Priority, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Custom}, + {0x3a0273a6, (FX_LPCWSTR)L"underline", XFA_ATTRIBUTE_Underline, XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)0}, + {0x3b582286, (FX_LPCWSTR)L"moduleWidth", XFA_ATTRIBUTE_ModuleWidth, XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(g_XFAMeasurementData + 3)}, + {0x3d123c26, (FX_LPCWSTR)L"hyphenate", XFA_ATTRIBUTE_Hyphenate, XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)0}, + {0x3e7af94f, (FX_LPCWSTR)L"listen", XFA_ATTRIBUTE_Listen, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_RefOnly}, + {0x4156ee3f, (FX_LPCWSTR)L"delimiter", XFA_ATTRIBUTE_Delimiter, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x42fed1fd, (FX_LPCWSTR)L"contentType", XFA_ATTRIBUTE_ContentType, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template | XFA_XDPPACKET_Datasets | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x453eaf38, (FX_LPCWSTR)L"startNew", XFA_ATTRIBUTE_StartNew, XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)0}, + {0x45a6daf8, (FX_LPCWSTR)L"eofAction", XFA_ATTRIBUTE_EofAction, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_SourceSet, (FX_LPVOID)XFA_ATTRIBUTEENUM_MoveLast}, + {0x47cfa43a, (FX_LPCWSTR)L"allowNeutral", XFA_ATTRIBUTE_AllowNeutral, XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)0}, + {0x47d03490, (FX_LPCWSTR)L"connection", XFA_ATTRIBUTE_Connection, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x4873c601, (FX_LPCWSTR)L"baselineShift", XFA_ATTRIBUTE_BaselineShift, XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(g_XFAMeasurementData + 0)}, + {0x4b319767, (FX_LPCWSTR)L"overlinePeriod", XFA_ATTRIBUTE_OverlinePeriod, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_All}, + {0x4b8bc840, (FX_LPCWSTR)L"fracDigits", XFA_ATTRIBUTE_FracDigits, XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)2}, + {0x4ef3d02c, (FX_LPCWSTR)L"orientation", XFA_ATTRIBUTE_Orientation, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Portrait}, + {0x4fdc3454, (FX_LPCWSTR)L"timeStamp", XFA_ATTRIBUTE_TimeStamp, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_XDP, (FX_LPVOID)NULL}, + {0x52666f1c, (FX_LPCWSTR)L"printCheckDigit", XFA_ATTRIBUTE_PrintCheckDigit, XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)0}, + {0x534729c9, (FX_LPCWSTR)L"marginLeft", XFA_ATTRIBUTE_MarginLeft, XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(g_XFAMeasurementData + 0)}, + {0x5392ea58, (FX_LPCWSTR)L"stroke", XFA_ATTRIBUTE_Stroke, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Solid}, + {0x5404d6df, (FX_LPCWSTR)L"moduleHeight", XFA_ATTRIBUTE_ModuleHeight, XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(g_XFAMeasurementData + 2)}, + {0x54fa722c, (FX_LPCWSTR)L"transferEncoding", XFA_ATTRIBUTE_TransferEncoding, XFA_ATTRIBUTETYPE_NOTSURE, XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x552d9ad5, (FX_LPCWSTR)L"usage", XFA_ATTRIBUTE_Usage, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_ExportAndImport}, + {0x570ce835, (FX_LPCWSTR)L"presence", XFA_ATTRIBUTE_Presence, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Visible}, + {0x5739d1ff, (FX_LPCWSTR)L"radixOffset", XFA_ATTRIBUTE_RadixOffset, XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(g_XFAMeasurementData + 0)}, + {0x577682ac, (FX_LPCWSTR)L"preserve", XFA_ATTRIBUTE_Preserve, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x58be2870, (FX_LPCWSTR)L"aliasNode", XFA_ATTRIBUTE_AliasNode, XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_UNKNOWN, (FX_LPVOID)0}, + {0x5a32e493, (FX_LPCWSTR)L"multiLine", XFA_ATTRIBUTE_MultiLine, XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)0}, + {0x5a50e9e6, (FX_LPCWSTR)L"version", XFA_ATTRIBUTE_Version, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x5ab23b6c, (FX_LPCWSTR)L"startChar", XFA_ATTRIBUTE_StartChar, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x5b707a35, (FX_LPCWSTR)L"scriptTest", XFA_ATTRIBUTE_ScriptTest, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Error}, + {0x5c054755, (FX_LPCWSTR)L"startAngle", XFA_ATTRIBUTE_StartAngle, XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(g_XFAMeasurementData + 5)}, + {0x5ec958c0, (FX_LPCWSTR)L"cursorType", XFA_ATTRIBUTE_CursorType, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_SourceSet, (FX_LPVOID)XFA_ATTRIBUTEENUM_ForwardOnly}, + {0x5f760b50, (FX_LPCWSTR)L"digitalSignature", XFA_ATTRIBUTE_DigitalSignature, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x60a61edd, (FX_LPCWSTR)L"codeType", XFA_ATTRIBUTE_CodeType, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x60d4c8b1, (FX_LPCWSTR)L"output", XFA_ATTRIBUTE_Output, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_ConnectionSet, (FX_LPVOID)NULL}, + {0x64110ab5, (FX_LPCWSTR)L"bookendTrailer", XFA_ATTRIBUTE_BookendTrailer, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x65e30c67, (FX_LPCWSTR)L"imagingBBox", XFA_ATTRIBUTE_ImagingBBox, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(FX_LPCWSTR)L"none"}, + {0x66539c48, (FX_LPCWSTR)L"excludeInitialCap", XFA_ATTRIBUTE_ExcludeInitialCap, XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)0}, + {0x66642f8f, (FX_LPCWSTR)L"force", XFA_ATTRIBUTE_Force, XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Config, (FX_LPVOID)NULL}, + {0x69aa2292, (FX_LPCWSTR)L"crlSign", XFA_ATTRIBUTE_CrlSign, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x6a3405dd, (FX_LPCWSTR)L"previous", XFA_ATTRIBUTE_Previous, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_None}, + {0x6a95c976, (FX_LPCWSTR)L"pushCharacterCount", XFA_ATTRIBUTE_PushCharacterCount, XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)3}, + {0x6b6ddcfb, (FX_LPCWSTR)L"nullTest", XFA_ATTRIBUTE_NullTest, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Disabled}, + {0x6cfa828a, (FX_LPCWSTR)L"runAt", XFA_ATTRIBUTE_RunAt, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Client}, + {0x731e0665, (FX_LPCWSTR)L"spaceBelow", XFA_ATTRIBUTE_SpaceBelow, XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(g_XFAMeasurementData + 0)}, + {0x74788f8b, (FX_LPCWSTR)L"sweepAngle", XFA_ATTRIBUTE_SweepAngle, XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(g_XFAMeasurementData + 7)}, + {0x78bff531, (FX_LPCWSTR)L"numberOfCells", XFA_ATTRIBUTE_NumberOfCells, XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)0}, + {0x79543055, (FX_LPCWSTR)L"letterSpacing", XFA_ATTRIBUTE_LetterSpacing, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x79975f2b, (FX_LPCWSTR)L"lockType", XFA_ATTRIBUTE_LockType, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_SourceSet, (FX_LPVOID)XFA_ATTRIBUTEENUM_ReadOnly}, + {0x7a0cc471, (FX_LPCWSTR)L"passwordChar", XFA_ATTRIBUTE_PasswordChar, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(FX_LPCWSTR)L"*"}, + {0x7a7cc341, (FX_LPCWSTR)L"vAlign", XFA_ATTRIBUTE_VAlign, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Top}, + {0x7b29630a, (FX_LPCWSTR)L"sourceBelow", XFA_ATTRIBUTE_SourceBelow, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Config, (FX_LPVOID)XFA_ATTRIBUTEENUM_Update}, + {0x7b95e661, (FX_LPCWSTR)L"inverted", XFA_ATTRIBUTE_Inverted, XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)0}, + {0x7c2fd80b, (FX_LPCWSTR)L"mark", XFA_ATTRIBUTE_Mark, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Default}, + {0x7c2ff6ae, (FX_LPCWSTR)L"maxH", XFA_ATTRIBUTE_MaxH, XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(g_XFAMeasurementData + 0)}, + {0x7c2ff6bd, (FX_LPCWSTR)L"maxW", XFA_ATTRIBUTE_MaxW, XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(g_XFAMeasurementData + 0)}, + {0x7c732a66, (FX_LPCWSTR)L"truncate", XFA_ATTRIBUTE_Truncate, XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)0}, + {0x7d02356c, (FX_LPCWSTR)L"minH", XFA_ATTRIBUTE_MinH, XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(g_XFAMeasurementData + 0)}, + {0x7d02357b, (FX_LPCWSTR)L"minW", XFA_ATTRIBUTE_MinW, XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(g_XFAMeasurementData + 0)}, + {0x7d0b5fca, (FX_LPCWSTR)L"initial", XFA_ATTRIBUTE_Initial, XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)1}, + {0x7d9fd7c5, (FX_LPCWSTR)L"mode", XFA_ATTRIBUTE_Mode, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Config, (FX_LPVOID)XFA_ATTRIBUTEENUM_UsePrinterSetting}, + {0x7e7e845e, (FX_LPCWSTR)L"layout", XFA_ATTRIBUTE_Layout, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Position}, + {0x7f6fd3d7, (FX_LPCWSTR)L"server", XFA_ATTRIBUTE_Server, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x824f21b7, (FX_LPCWSTR)L"embedPDF", XFA_ATTRIBUTE_EmbedPDF, XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)0}, + {0x8340ea66, (FX_LPCWSTR)L"oddOrEven", XFA_ATTRIBUTE_OddOrEven, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Any}, + {0x836d4d7c, (FX_LPCWSTR)L"tabDefault", XFA_ATTRIBUTE_TabDefault, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x8855805f, (FX_LPCWSTR)L"contains", XFA_ATTRIBUTE_Contains, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Datasets, (FX_LPVOID)XFA_ATTRIBUTEENUM_Data}, + {0x8a692521, (FX_LPCWSTR)L"rightInset", XFA_ATTRIBUTE_RightInset, XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(g_XFAMeasurementData + 0)}, + {0x8af2e657, (FX_LPCWSTR)L"maxChars", XFA_ATTRIBUTE_MaxChars, XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)0}, + {0x8b90e1f2, (FX_LPCWSTR)L"open", XFA_ATTRIBUTE_Open, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_UserControl}, + {0x8c99377e, (FX_LPCWSTR)L"relation", XFA_ATTRIBUTE_Relation, XFA_ATTRIBUTETYPE_NOTSURE, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x8d181d61, (FX_LPCWSTR)L"wideNarrowRatio", XFA_ATTRIBUTE_WideNarrowRatio, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(FX_LPCWSTR)L"3:1"}, + {0x8e1c2921, (FX_LPCWSTR)L"relevant", XFA_ATTRIBUTE_Relevant, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x8e29d794, (FX_LPCWSTR)L"signatureType", XFA_ATTRIBUTE_SignatureType, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Filter}, + {0x8ec6204c, (FX_LPCWSTR)L"lineThroughPeriod", XFA_ATTRIBUTE_LineThroughPeriod, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_All}, + {0x8ed182d1, (FX_LPCWSTR)L"shape", XFA_ATTRIBUTE_Shape, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Square}, + {0x8fa01790, (FX_LPCWSTR)L"tabStops", XFA_ATTRIBUTE_TabStops, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x8fc36c0a, (FX_LPCWSTR)L"outputBelow", XFA_ATTRIBUTE_OutputBelow, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Config, (FX_LPVOID)XFA_ATTRIBUTEENUM_Warn}, + {0x9041d4b0, (FX_LPCWSTR)L"short", XFA_ATTRIBUTE_Short, XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(g_XFAMeasurementData + 0)}, + {0x907c7719, (FX_LPCWSTR)L"fontVerticalScale", XFA_ATTRIBUTE_FontVerticalScale, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(FX_LPCWSTR)L"100%"}, + {0x94446dcc, (FX_LPCWSTR)L"thickness", XFA_ATTRIBUTE_Thickness, XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(g_XFAMeasurementData + 8)}, + {0x957fa006, (FX_LPCWSTR)L"commitOn", XFA_ATTRIBUTE_CommitOn, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Select}, + {0x982bd892, (FX_LPCWSTR)L"remainCharacterCount", XFA_ATTRIBUTE_RemainCharacterCount, XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)3}, + {0x98fd4d81, (FX_LPCWSTR)L"keyAgreement", XFA_ATTRIBUTE_KeyAgreement, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x99800d7a, (FX_LPCWSTR)L"errorCorrectionLevel", XFA_ATTRIBUTE_ErrorCorrectionLevel, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0x9a63da3d, (FX_LPCWSTR)L"upsMode", XFA_ATTRIBUTE_UpsMode, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_UsCarrier}, + {0x9cc17d75, (FX_LPCWSTR)L"mergeMode", XFA_ATTRIBUTE_MergeMode, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_ConsumeData}, + {0x9d833d75, (FX_LPCWSTR)L"circular", XFA_ATTRIBUTE_Circular, XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)0}, + {0x9d8ee204, (FX_LPCWSTR)L"psName", XFA_ATTRIBUTE_PsName, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Config, (FX_LPVOID)NULL}, + {0x9dcc3ab3, (FX_LPCWSTR)L"trailer", XFA_ATTRIBUTE_Trailer, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xa0933954, (FX_LPCWSTR)L"unicodeRange", XFA_ATTRIBUTE_UnicodeRange, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Config, (FX_LPVOID)NULL}, + {0xa1b0d2f5, (FX_LPCWSTR)L"executeType", XFA_ATTRIBUTE_ExecuteType, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Import}, + {0xa25a883d, (FX_LPCWSTR)L"duplexImposition", XFA_ATTRIBUTE_DuplexImposition, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_LongEdge}, + {0xa42ca1b7, (FX_LPCWSTR)L"trayIn", XFA_ATTRIBUTE_TrayIn, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Auto}, + {0xa433f001, (FX_LPCWSTR)L"bindingNode", XFA_ATTRIBUTE_BindingNode, XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_UNKNOWN, (FX_LPVOID)0}, + {0xa5340ff5, (FX_LPCWSTR)L"bofAction", XFA_ATTRIBUTE_BofAction, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_SourceSet, (FX_LPVOID)XFA_ATTRIBUTEENUM_MoveFirst}, + {0xa5b410cf, (FX_LPCWSTR)L"save", XFA_ATTRIBUTE_Save, XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)0}, + {0xa6118c89, (FX_LPCWSTR)L"targetType", XFA_ATTRIBUTE_TargetType, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Auto}, + {0xa66404cb, (FX_LPCWSTR)L"keyEncipherment", XFA_ATTRIBUTE_KeyEncipherment, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xa6710262, (FX_LPCWSTR)L"credentialServerPolicy", XFA_ATTRIBUTE_CredentialServerPolicy, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Optional}, + {0xa686975b, (FX_LPCWSTR)L"size", XFA_ATTRIBUTE_Size, XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(g_XFAMeasurementData + 6)}, + {0xa85e74f3, (FX_LPCWSTR)L"initialNumber", XFA_ATTRIBUTE_InitialNumber, XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)1}, + {0xabef37e3, (FX_LPCWSTR)L"slope", XFA_ATTRIBUTE_Slope, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Backslash}, + {0xabfa6c4f, (FX_LPCWSTR)L"cSpace", XFA_ATTRIBUTE_CSpace, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(FX_LPCWSTR)L"SRGB"}, + {0xac06e2b0, (FX_LPCWSTR)L"colSpan", XFA_ATTRIBUTE_ColSpan, XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)1}, + {0xadc4c77b, (FX_LPCWSTR)L"binding", XFA_ATTRIBUTE_Binding, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xaf754613, (FX_LPCWSTR)L"checksum", XFA_ATTRIBUTE_Checksum, XFA_ATTRIBUTETYPE_NOTSURE, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xb045fbc5, (FX_LPCWSTR)L"charEncoding", XFA_ATTRIBUTE_CharEncoding, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(FX_LPCWSTR)L"UTF-8"}, + {0xb0e5485d, (FX_LPCWSTR)L"bind", XFA_ATTRIBUTE_Bind, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_SourceSet, (FX_LPVOID)NULL}, + {0xb12128b7, (FX_LPCWSTR)L"textEntry", XFA_ATTRIBUTE_TextEntry, XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)0}, + {0xb373a862, (FX_LPCWSTR)L"archive", XFA_ATTRIBUTE_Archive, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xb598a1f7, (FX_LPCWSTR)L"uuid", XFA_ATTRIBUTE_Uuid, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_XDP, (FX_LPVOID)NULL}, + {0xb5e49bf2, (FX_LPCWSTR)L"posture", XFA_ATTRIBUTE_Posture, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Normal}, + {0xb6b44172, (FX_LPCWSTR)L"after", XFA_ATTRIBUTE_After, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Auto}, + {0xb716467b, (FX_LPCWSTR)L"orphans", XFA_ATTRIBUTE_Orphans, XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)0}, + {0xbc0c4695, (FX_LPCWSTR)L"qualifiedName", XFA_ATTRIBUTE_QualifiedName, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_UNKNOWN, (FX_LPVOID)NULL}, + {0xbc254332, (FX_LPCWSTR)L"usehref", XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template | XFA_XDPPACKET_ConnectionSet | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xbc8fa350, (FX_LPCWSTR)L"locale", XFA_ATTRIBUTE_Locale, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xbd6e1d88, (FX_LPCWSTR)L"weight", XFA_ATTRIBUTE_Weight, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Normal}, + {0xbd96a0e9, (FX_LPCWSTR)L"underlinePeriod", XFA_ATTRIBUTE_UnderlinePeriod, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_All}, + {0xbde9abda, (FX_LPCWSTR)L"data", XFA_ATTRIBUTE_Data, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Link}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Config | XFA_XDPPACKET_LocaleSet, (FX_LPVOID)NULL}, + {0xbe9ba472, (FX_LPCWSTR)L"numbered", XFA_ATTRIBUTE_Numbered, XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)1}, + {0xc035c6b1, (FX_LPCWSTR)L"dataColumnCount", XFA_ATTRIBUTE_DataColumnCount, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xc0ec9fa4, (FX_LPCWSTR)L"overline", XFA_ATTRIBUTE_Overline, XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)0}, + {0xc2ba0923, (FX_LPCWSTR)L"urlPolicy", XFA_ATTRIBUTE_UrlPolicy, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xc2bd40fd, (FX_LPCWSTR)L"anchorType", XFA_ATTRIBUTE_AnchorType, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_TopLeft}, + {0xc39a88bd, (FX_LPCWSTR)L"labelRef", XFA_ATTRIBUTE_LabelRef, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xc3c1442f, (FX_LPCWSTR)L"bookendLeader", XFA_ATTRIBUTE_BookendLeader, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xc4547a08, (FX_LPCWSTR)L"maxLength", XFA_ATTRIBUTE_MaxLength, XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID) - 1}, + {0xc4fed09b, (FX_LPCWSTR)L"accessKey", XFA_ATTRIBUTE_AccessKey, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xc5762157, (FX_LPCWSTR)L"cursorLocation", XFA_ATTRIBUTE_CursorLocation, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_SourceSet, (FX_LPVOID)XFA_ATTRIBUTEENUM_Client}, + {0xc860f30a, (FX_LPCWSTR)L"delayedOpen", XFA_ATTRIBUTE_DelayedOpen, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_SourceSet, (FX_LPVOID)NULL}, + {0xc8da4da7, (FX_LPCWSTR)L"target", XFA_ATTRIBUTE_Target, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xca5dc27c, (FX_LPCWSTR)L"dataEncipherment", XFA_ATTRIBUTE_DataEncipherment, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xcb150479, (FX_LPCWSTR)L"afterTarget", XFA_ATTRIBUTE_AfterTarget, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xcbcaf66d, (FX_LPCWSTR)L"leader", XFA_ATTRIBUTE_Leader, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xcca7897e, (FX_LPCWSTR)L"picker", XFA_ATTRIBUTE_Picker, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Host}, + {0xcd7f7b54, (FX_LPCWSTR)L"from", XFA_ATTRIBUTE_From, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Config, (FX_LPVOID)NULL}, + {0xcea5e62c, (FX_LPCWSTR)L"baseProfile", XFA_ATTRIBUTE_BaseProfile, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Full}, + {0xd171b240, (FX_LPCWSTR)L"aspect", XFA_ATTRIBUTE_Aspect, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Fit}, + {0xd3c84d25, (FX_LPCWSTR)L"rowColumnRatio", XFA_ATTRIBUTE_RowColumnRatio, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xd4b01921, (FX_LPCWSTR)L"lineHeight", XFA_ATTRIBUTE_LineHeight, XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(g_XFAMeasurementData + 1)}, + {0xd4cc53f8, (FX_LPCWSTR)L"highlight", XFA_ATTRIBUTE_Highlight, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Inverted}, + {0xd50f903a, (FX_LPCWSTR)L"valueRef", XFA_ATTRIBUTE_ValueRef, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xd52482e0, (FX_LPCWSTR)L"maxEntries", XFA_ATTRIBUTE_MaxEntries, XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Config, (FX_LPVOID)5}, + {0xd57c513c, (FX_LPCWSTR)L"dataLength", XFA_ATTRIBUTE_DataLength, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xd6128d8d, (FX_LPCWSTR)L"activity", XFA_ATTRIBUTE_Activity, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Click}, + {0xd6a39990, (FX_LPCWSTR)L"input", XFA_ATTRIBUTE_Input, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_ConnectionSet, (FX_LPVOID)NULL}, + {0xd6e27f1d, (FX_LPCWSTR)L"value", XFA_ATTRIBUTE_Value, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Config | XFA_XDPPACKET_LocaleSet | XFA_XDPPACKET_Template | XFA_XDPPACKET_Datasets | XFA_XDPPACKET_ConnectionSet | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xd70798c2, (FX_LPCWSTR)L"blankOrNotBlank", XFA_ATTRIBUTE_BlankOrNotBlank, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Any}, + {0xd861f8af, (FX_LPCWSTR)L"addRevocationInfo", XFA_ATTRIBUTE_AddRevocationInfo, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xd8f982bf, (FX_LPCWSTR)L"genericFamily", XFA_ATTRIBUTE_GenericFamily, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Config, (FX_LPVOID)XFA_ATTRIBUTEENUM_Serif}, + {0xd996fa9b, (FX_LPCWSTR)L"hand", XFA_ATTRIBUTE_Hand, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Even}, + {0xdb55fec5, (FX_LPCWSTR)L"href", XFA_ATTRIBUTE_Href, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xdc75676c, (FX_LPCWSTR)L"textEncoding", XFA_ATTRIBUTE_TextEncoding, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xde7f92ba, (FX_LPCWSTR)L"leadDigits", XFA_ATTRIBUTE_LeadDigits, XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID) - 1}, + {0xe11a2cbc, (FX_LPCWSTR)L"permissions", XFA_ATTRIBUTE_Permissions, XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)2}, + {0xe18b5659, (FX_LPCWSTR)L"spaceAbove", XFA_ATTRIBUTE_SpaceAbove, XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(g_XFAMeasurementData + 0)}, + {0xe1a26b56, (FX_LPCWSTR)L"codeBase", XFA_ATTRIBUTE_CodeBase, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xe349d044, (FX_LPCWSTR)L"stock", XFA_ATTRIBUTE_Stock, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xe372ae97, (FX_LPCWSTR)L"isNull", XFA_ATTRIBUTE_IsNull, XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Datasets, (FX_LPVOID)0}, + {0xe4c3a5e5, (FX_LPCWSTR)L"restoreState", XFA_ATTRIBUTE_RestoreState, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Manual}, + {0xe5c96d6a, (FX_LPCWSTR)L"excludeAllCaps", XFA_ATTRIBUTE_ExcludeAllCaps, XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)0}, + {0xe64b1129, (FX_LPCWSTR)L"formatTest", XFA_ATTRIBUTE_FormatTest, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Warning}, + {0xe6f99487, (FX_LPCWSTR)L"hScrollPolicy", XFA_ATTRIBUTE_HScrollPolicy, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Auto}, + {0xe8dddf50, (FX_LPCWSTR)L"join", XFA_ATTRIBUTE_Join, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Square}, + {0xe8f118a8, (FX_LPCWSTR)L"keyCertSign", XFA_ATTRIBUTE_KeyCertSign, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xe948b9a8, (FX_LPCWSTR)L"radius", XFA_ATTRIBUTE_Radius, XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(g_XFAMeasurementData + 0)}, + {0xe996b2fe, (FX_LPCWSTR)L"sourceAbove", XFA_ATTRIBUTE_SourceAbove, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Config, (FX_LPVOID)XFA_ATTRIBUTEENUM_Warn}, + {0xea7090a0, (FX_LPCWSTR)L"override", XFA_ATTRIBUTE_Override, XFA_ATTRIBUTETYPE_NOTSURE, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xeb091003, (FX_LPCWSTR)L"classId", XFA_ATTRIBUTE_ClassId, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xeb511b54, (FX_LPCWSTR)L"disable", XFA_ATTRIBUTE_Disable, XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)0}, + {0xeda9017a, (FX_LPCWSTR)L"scope", XFA_ATTRIBUTE_Scope, XFA_ATTRIBUTETYPE_NOTSURE, XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xf197844d, (FX_LPCWSTR)L"match", XFA_ATTRIBUTE_Match, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Once}, + {0xf2009339, (FX_LPCWSTR)L"placement", XFA_ATTRIBUTE_Placement, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Left}, + {0xf4ffce73, (FX_LPCWSTR)L"before", XFA_ATTRIBUTE_Before, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_Auto}, + {0xf531b059, (FX_LPCWSTR)L"writingScript", XFA_ATTRIBUTE_WritingScript, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Config, (FX_LPVOID)XFA_ATTRIBUTEENUM_Asterisk}, + {0xf575ca75, (FX_LPCWSTR)L"endChar", XFA_ATTRIBUTE_EndChar, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xf6b47749, (FX_LPCWSTR)L"lock", XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Config, (FX_LPVOID)0}, + {0xf6b4afb0, (FX_LPCWSTR)L"long", XFA_ATTRIBUTE_Long, XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)(g_XFAMeasurementData + 0)}, + {0xf6b59543, (FX_LPCWSTR)L"intact", XFA_ATTRIBUTE_Intact, XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)XFA_ATTRIBUTEENUM_None}, + {0xf889e747, (FX_LPCWSTR)L"xdpContent", XFA_ATTRIBUTE_XdpContent, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, + {0xfea53ec6, (FX_LPCWSTR)L"decipherOnly", XFA_ATTRIBUTE_DecipherOnly, XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (FX_LPVOID)NULL}, +}; +extern const FX_INT32 g_iXFAAttributeCount = sizeof(g_XFAAttributeData) / sizeof(XFA_ATTRIBUTEINFO); +extern const XFA_NOTSUREATTRIBUTE g_XFANotsureAttributes[] = { + {XFA_ELEMENT_SubformSet, XFA_ATTRIBUTE_Relation, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_Ordered}, + {XFA_ELEMENT_NumberPattern, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_Numeric}, + {XFA_ELEMENT_KeyUsage, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_Optional}, + {XFA_ELEMENT_LabelPrinter, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_Zpl}, + {XFA_ELEMENT_CalendarSymbols, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_Gregorian}, + {XFA_ELEMENT_Barcode, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Cdata, (FX_LPVOID)NULL}, + {XFA_ELEMENT_Barcode, XFA_ATTRIBUTE_Checksum, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_None}, + {XFA_ELEMENT_TimePattern, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_Med}, + {XFA_ELEMENT_BatchOutput, XFA_ATTRIBUTE_Format, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_None}, + {XFA_ELEMENT_SubjectDNs, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_Optional}, + {XFA_ELEMENT_Issuers, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_Optional}, + {XFA_ELEMENT_EncryptionMethods, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_Optional}, + {XFA_ELEMENT_Pattern, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_CrossHatch}, + {XFA_ELEMENT_Compress, XFA_ATTRIBUTE_Scope, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_ImageOnly}, + {XFA_ELEMENT_Image, XFA_ATTRIBUTE_TransferEncoding, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_Base64}, + {XFA_ELEMENT_TimeStamp, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_Optional}, + {XFA_ELEMENT_Subform, XFA_ATTRIBUTE_Scope, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_Name}, + {XFA_ELEMENT_Handler, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_Optional}, + {XFA_ELEMENT_Record, XFA_ATTRIBUTE_Max, XFA_ATTRIBUTETYPE_Integer, (FX_LPVOID)0}, + {XFA_ELEMENT_Command, XFA_ATTRIBUTE_Timeout, XFA_ATTRIBUTETYPE_Integer, (FX_LPVOID)30}, + {XFA_ELEMENT_DigestMethods, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_Optional}, + {XFA_ELEMENT_PageSet, XFA_ATTRIBUTE_Relation, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_OrderedOccurrence}, + {XFA_ELEMENT_Equate, XFA_ATTRIBUTE_From, XFA_ATTRIBUTETYPE_Cdata, (FX_LPVOID)NULL}, + {XFA_ELEMENT_Equate, XFA_ATTRIBUTE_To, XFA_ATTRIBUTETYPE_Cdata, (FX_LPVOID)NULL}, + {XFA_ELEMENT_Traverse, XFA_ATTRIBUTE_Operation, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_Next}, + {XFA_ELEMENT_Encodings, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_Optional}, + {XFA_ELEMENT_Signing, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_Optional}, + {XFA_ELEMENT_Oids, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_Optional}, + {XFA_ELEMENT_Signature, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_PDF1_3}, + {XFA_ELEMENT_ExData, XFA_ATTRIBUTE_TransferEncoding, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_None}, + {XFA_ELEMENT_Linear, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_ToRight}, + {XFA_ELEMENT_CurrencySymbol, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_Symbol}, + {XFA_ELEMENT_EquateRange, XFA_ATTRIBUTE_From, XFA_ATTRIBUTETYPE_Cdata, (FX_LPVOID)NULL}, + {XFA_ELEMENT_EquateRange, XFA_ATTRIBUTE_To, XFA_ATTRIBUTETYPE_Cdata, (FX_LPVOID)NULL}, + {XFA_ELEMENT_SignData, XFA_ATTRIBUTE_Operation, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_Sign}, + {XFA_ELEMENT_DatePattern, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_Med}, + {XFA_ELEMENT_Bind, XFA_ATTRIBUTE_TransferEncoding, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_None}, + {XFA_ELEMENT_Reasons, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_Optional}, + {XFA_ELEMENT_AppearanceFilter, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_Optional}, + {XFA_ELEMENT_Form, XFA_ATTRIBUTE_Checksum, XFA_ATTRIBUTETYPE_Cdata, (FX_LPVOID)NULL}, + {XFA_ELEMENT_Value, XFA_ATTRIBUTE_Override, XFA_ATTRIBUTETYPE_Boolean, (FX_LPVOID)0}, + {XFA_ELEMENT_Calculate, XFA_ATTRIBUTE_Override, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_Error}, + {XFA_ELEMENT_Connect, XFA_ATTRIBUTE_Timeout, XFA_ATTRIBUTETYPE_Integer, (FX_LPVOID)15}, + {XFA_ELEMENT_Submit, XFA_ATTRIBUTE_Format, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_Xdp}, + {XFA_ELEMENT_Radial, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_ToEdge}, + {XFA_ELEMENT_LockDocument, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_Optional}, + {XFA_ELEMENT_Occur, XFA_ATTRIBUTE_Max, XFA_ATTRIBUTETYPE_Integer, (FX_LPVOID)1}, + {XFA_ELEMENT_NumberSymbol, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTETYPE_Enum, (FX_LPVOID)XFA_ATTRIBUTEENUM_Decimal}, +}; +extern const FX_INT32 g_iXFANotsureCount = sizeof(g_XFANotsureAttributes) / sizeof(XFA_NOTSUREATTRIBUTE); +extern const XFA_ELEMENTINFO g_XFAElementData[] = { + {0x23ee3, (FX_LPCWSTR)L"ps", XFA_ELEMENT_Ps, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0x25363, (FX_LPCWSTR)L"to", XFA_ELEMENT_To, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x2587e, (FX_LPCWSTR)L"ui", XFA_ELEMENT_Ui, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x1c648b, (FX_LPCWSTR)L"recordSet", XFA_ELEMENT_RecordSet, XFA_XDPPACKET_SourceSet, XFA_OBJECTTYPE_Node}, + {0x171428f, (FX_LPCWSTR)L"subsetBelow", XFA_ELEMENT_SubsetBelow, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x1a0776a, (FX_LPCWSTR)L"subformSet", XFA_ELEMENT_SubformSet, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContainerNode}, + {0x2340d70, (FX_LPCWSTR)L"adobeExtensionLevel", XFA_ELEMENT_AdobeExtensionLevel, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x2c1c7f1, (FX_LPCWSTR)L"typeface", XFA_ELEMENT_Typeface, XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_Node}, + {0x5518c25, (FX_LPCWSTR)L"break", XFA_ELEMENT_Break, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x5fff523, (FX_LPCWSTR)L"fontInfo", XFA_ELEMENT_FontInfo, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0x653a227, (FX_LPCWSTR)L"numberPattern", XFA_ELEMENT_NumberPattern, XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_ContentNode}, + {0x65b4a05, (FX_LPCWSTR)L"dynamicRender", XFA_ELEMENT_DynamicRender, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x7e4362e, (FX_LPCWSTR)L"printScaling", XFA_ELEMENT_PrintScaling, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x7fe6d3a, (FX_LPCWSTR)L"checkButton", XFA_ELEMENT_CheckButton, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x80cf58f, (FX_LPCWSTR)L"datePatterns", XFA_ELEMENT_DatePatterns, XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_Node}, + {0x811929d, (FX_LPCWSTR)L"sourceSet", XFA_ELEMENT_SourceSet, XFA_XDPPACKET_SourceSet, XFA_OBJECTTYPE_ModelNode}, + {0x9f9d612, (FX_LPCWSTR)L"amd", XFA_ELEMENT_Amd, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x9f9efb6, (FX_LPCWSTR)L"arc", XFA_ELEMENT_Arc, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0xa48835e, (FX_LPCWSTR)L"day", XFA_ELEMENT_Day, XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_ContentNode}, + {0xa6328b8, (FX_LPCWSTR)L"era", XFA_ELEMENT_Era, XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_ContentNode}, + {0xae6a0a0, (FX_LPCWSTR)L"jog", XFA_ELEMENT_Jog, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0xb1b3d22, (FX_LPCWSTR)L"log", XFA_ELEMENT_Log, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0xb35439e, (FX_LPCWSTR)L"map", XFA_ELEMENT_Map, XFA_XDPPACKET_Config | XFA_XDPPACKET_SourceSet, XFA_OBJECTTYPE_Node}, + {0xb355301, (FX_LPCWSTR)L"mdp", XFA_ELEMENT_Mdp, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0xb420438, (FX_LPCWSTR)L"breakBefore", XFA_ELEMENT_BreakBefore, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0xb6a091c, (FX_LPCWSTR)L"oid", XFA_ELEMENT_Oid, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_TextNode}, + {0xb84389f, (FX_LPCWSTR)L"pcl", XFA_ELEMENT_Pcl, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0xb843dba, (FX_LPCWSTR)L"pdf", XFA_ELEMENT_Pdf, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0xbb8df5d, (FX_LPCWSTR)L"ref", XFA_ELEMENT_Ref, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_TextNode}, + {0xc080cd0, (FX_LPCWSTR)L"uri", XFA_ELEMENT_Uri, XFA_XDPPACKET_Config | XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_TextNode}, + {0xc56afbf, (FX_LPCWSTR)L"xdc", XFA_ELEMENT_Xdc, XFA_XDPPACKET_Config | XFA_XDPPACKET_Xdc, XFA_OBJECTTYPE_ModelNode}, + {0xc56afcc, (FX_LPCWSTR)L"xdp", XFA_ELEMENT_Xdp, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0xc56b9ff, (FX_LPCWSTR)L"xfa", XFA_ELEMENT_Xfa, XFA_XDPPACKET_XDP, XFA_OBJECTTYPE_ModelNode}, + {0xc56fcb7, (FX_LPCWSTR)L"xsl", XFA_ELEMENT_Xsl, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0xc8b89d6, (FX_LPCWSTR)L"zpl", XFA_ELEMENT_Zpl, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0xc9bae94, (FX_LPCWSTR)L"cache", XFA_ELEMENT_Cache, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0xcb016be, (FX_LPCWSTR)L"margin", XFA_ELEMENT_Margin, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0xe1378fe, (FX_LPCWSTR)L"keyUsage", XFA_ELEMENT_KeyUsage, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0xfe3596a, (FX_LPCWSTR)L"exclude", XFA_ELEMENT_Exclude, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x10395ac7, (FX_LPCWSTR)L"choiceList", XFA_ELEMENT_ChoiceList, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x1059ec18, (FX_LPCWSTR)L"level", XFA_ELEMENT_Level, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x10874804, (FX_LPCWSTR)L"labelPrinter", XFA_ELEMENT_LabelPrinter, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0x10c40e03, (FX_LPCWSTR)L"calendarSymbols", XFA_ELEMENT_CalendarSymbols, XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_Node}, + {0x10f1ea24, (FX_LPCWSTR)L"para", XFA_ELEMENT_Para, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x10f1ea37, (FX_LPCWSTR)L"part", XFA_ELEMENT_Part, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x1140975b, (FX_LPCWSTR)L"pdfa", XFA_ELEMENT_Pdfa, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0x1154efe6, (FX_LPCWSTR)L"filter", XFA_ELEMENT_Filter, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x13f41de1, (FX_LPCWSTR)L"present", XFA_ELEMENT_Present, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0x1827e6ea, (FX_LPCWSTR)L"pagination", XFA_ELEMENT_Pagination, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x18463707, (FX_LPCWSTR)L"encoding", XFA_ELEMENT_Encoding, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_NodeC}, + {0x185e41e2, (FX_LPCWSTR)L"event", XFA_ELEMENT_Event, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x1adb142d, (FX_LPCWSTR)L"whitespace", XFA_ELEMENT_Whitespace, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV}, + {0x1f3f64c3, (FX_LPCWSTR)L"defaultUi", XFA_ELEMENT_DefaultUi, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x204e87cb, (FX_LPCWSTR)L"dataModel", XFA_ELEMENT_DataModel, XFA_XDPPACKET_Datasets, XFA_OBJECTTYPE_ModelNode}, + {0x2057b350, (FX_LPCWSTR)L"barcode", XFA_ELEMENT_Barcode, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x20596bad, (FX_LPCWSTR)L"timePattern", XFA_ELEMENT_TimePattern, XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_ContentNode}, + {0x210b74d3, (FX_LPCWSTR)L"batchOutput", XFA_ELEMENT_BatchOutput, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0x212ff0e2, (FX_LPCWSTR)L"enforce", XFA_ELEMENT_Enforce, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x21d351b4, (FX_LPCWSTR)L"currencySymbols", XFA_ELEMENT_CurrencySymbols, XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_Node}, + {0x21db83c5, (FX_LPCWSTR)L"addSilentPrint", XFA_ELEMENT_AddSilentPrint, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x22266258, (FX_LPCWSTR)L"rename", XFA_ELEMENT_Rename, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV}, + {0x226ca8f1, (FX_LPCWSTR)L"operation", XFA_ELEMENT_Operation, XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_TextNode}, + {0x23e27b84, (FX_LPCWSTR)L"typefaces", XFA_ELEMENT_Typefaces, XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_Node}, + {0x23f4aa75, (FX_LPCWSTR)L"subjectDNs", XFA_ELEMENT_SubjectDNs, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x240d5e8e, (FX_LPCWSTR)L"issuers", XFA_ELEMENT_Issuers, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x2457a033, (FX_LPCWSTR)L"signaturePseudoModel", XFA_ELEMENT_SignaturePseudoModel, XFA_XDPPACKET_XDP, XFA_OBJECTTYPE_OrdinaryObject}, + {0x24a52f8a, (FX_LPCWSTR)L"wsdlConnection", XFA_ELEMENT_WsdlConnection, XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_Node}, + {0x254ebd07, (FX_LPCWSTR)L"debug", XFA_ELEMENT_Debug, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0x2655c66a, (FX_LPCWSTR)L"delta", XFA_ELEMENT_Delta, XFA_XDPPACKET_Form, XFA_OBJECTTYPE_OrdinaryObject}, + {0x26c0daec, (FX_LPCWSTR)L"eraNames", XFA_ELEMENT_EraNames, XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_Node}, + {0x273ab03b, (FX_LPCWSTR)L"modifyAnnots", XFA_ELEMENT_ModifyAnnots, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x27875bb4, (FX_LPCWSTR)L"startNode", XFA_ELEMENT_StartNode, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV}, + {0x285d0dbc, (FX_LPCWSTR)L"button", XFA_ELEMENT_Button, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x28dee6e9, (FX_LPCWSTR)L"format", XFA_ELEMENT_Format, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x2a23349e, (FX_LPCWSTR)L"border", XFA_ELEMENT_Border, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x2ae67f19, (FX_LPCWSTR)L"area", XFA_ELEMENT_Area, XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContainerNode}, + {0x2c3c4c67, (FX_LPCWSTR)L"hyphenation", XFA_ELEMENT_Hyphenation, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x2d08af85, (FX_LPCWSTR)L"text", XFA_ELEMENT_Text, XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContentNode}, + {0x2d71b00f, (FX_LPCWSTR)L"time", XFA_ELEMENT_Time, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContentNode}, + {0x2f16a382, (FX_LPCWSTR)L"type", XFA_ELEMENT_Type, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x2fe057e9, (FX_LPCWSTR)L"overprint", XFA_ELEMENT_Overprint, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x302aee16, (FX_LPCWSTR)L"certificates", XFA_ELEMENT_Certificates, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x30b227df, (FX_LPCWSTR)L"encryptionMethods", XFA_ELEMENT_EncryptionMethods, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x32b900d1, (FX_LPCWSTR)L"setProperty", XFA_ELEMENT_SetProperty, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x337d9e45, (FX_LPCWSTR)L"printerName", XFA_ELEMENT_PrinterName, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x33edda4b, (FX_LPCWSTR)L"startPage", XFA_ELEMENT_StartPage, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV}, + {0x381943e4, (FX_LPCWSTR)L"pageOffset", XFA_ELEMENT_PageOffset, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0x382106cd, (FX_LPCWSTR)L"dateTime", XFA_ELEMENT_DateTime, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContentNode}, + {0x386e7421, (FX_LPCWSTR)L"comb", XFA_ELEMENT_Comb, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x390acd9e, (FX_LPCWSTR)L"pattern", XFA_ELEMENT_Pattern, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x3942163e, (FX_LPCWSTR)L"ifEmpty", XFA_ELEMENT_IfEmpty, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV}, + {0x39944a7b, (FX_LPCWSTR)L"suppressBanner", XFA_ELEMENT_SuppressBanner, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x3b3c3dca, (FX_LPCWSTR)L"outputBin", XFA_ELEMENT_OutputBin, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x3b8a4024, (FX_LPCWSTR)L"field", XFA_ELEMENT_Field, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContainerNode}, + {0x3c15352f, (FX_LPCWSTR)L"agent", XFA_ELEMENT_Agent, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0x3d7e8668, (FX_LPCWSTR)L"outputXSL", XFA_ELEMENT_OutputXSL, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0x3e1c91c5, (FX_LPCWSTR)L"adjustData", XFA_ELEMENT_AdjustData, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV}, + {0x3e7a9408, (FX_LPCWSTR)L"autoSave", XFA_ELEMENT_AutoSave, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV}, + {0x3ecead94, (FX_LPCWSTR)L"contentArea", XFA_ELEMENT_ContentArea, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContainerNode}, + {0x3ef334e3, (FX_LPCWSTR)L"eventPseudoModel", XFA_ELEMENT_EventPseudoModel, XFA_XDPPACKET_XDP, XFA_OBJECTTYPE_OrdinaryObject}, + {0x3fadaec0, (FX_LPCWSTR)L"wsdlAddress", XFA_ELEMENT_WsdlAddress, XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_TextNode}, + {0x40623b5b, (FX_LPCWSTR)L"solid", XFA_ELEMENT_Solid, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x41f0bd76, (FX_LPCWSTR)L"dateTimeSymbols", XFA_ELEMENT_DateTimeSymbols, XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_ContentNode}, + {0x444e7523, (FX_LPCWSTR)L"encryptionLevel", XFA_ELEMENT_EncryptionLevel, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x4523af55, (FX_LPCWSTR)L"edge", XFA_ELEMENT_Edge, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x45d5e3c1, (FX_LPCWSTR)L"stipple", XFA_ELEMENT_Stipple, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x475e4e87, (FX_LPCWSTR)L"attributes", XFA_ELEMENT_Attributes, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV}, + {0x487a8c87, (FX_LPCWSTR)L"versionControl", XFA_ELEMENT_VersionControl, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0x48e5248c, (FX_LPCWSTR)L"meridiem", XFA_ELEMENT_Meridiem, XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_ContentNode}, + {0x48f36719, (FX_LPCWSTR)L"exclGroup", XFA_ELEMENT_ExclGroup, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContainerNode}, + {0x4977356b, (FX_LPCWSTR)L"toolTip", XFA_ELEMENT_ToolTip, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_TextNode}, + {0x499afecc, (FX_LPCWSTR)L"compress", XFA_ELEMENT_Compress, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0x4a0c4948, (FX_LPCWSTR)L"reason", XFA_ELEMENT_Reason, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_TextNode}, + {0x4bdcce13, (FX_LPCWSTR)L"execute", XFA_ELEMENT_Execute, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x4c56b216, (FX_LPCWSTR)L"contentCopy", XFA_ELEMENT_ContentCopy, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x4cc176d3, (FX_LPCWSTR)L"dateTimeEdit", XFA_ELEMENT_DateTimeEdit, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x4e1e39b6, (FX_LPCWSTR)L"config", XFA_ELEMENT_Config, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ModelNode}, + {0x4e2d6083, (FX_LPCWSTR)L"image", XFA_ELEMENT_Image, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContentNode}, + {0x4e814150, (FX_LPCWSTR)L"#xHTML", XFA_ELEMENT_SharpxHTML, XFA_XDPPACKET_Template | XFA_XDPPACKET_Config | XFA_XDPPACKET_LocaleSet | XFA_XDPPACKET_ConnectionSet | XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_NodeV}, + {0x4f2388c1, (FX_LPCWSTR)L"numberOfCopies", XFA_ELEMENT_NumberOfCopies, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x4f512e30, (FX_LPCWSTR)L"behaviorOverride", XFA_ELEMENT_BehaviorOverride, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x4fdc3454, (FX_LPCWSTR)L"timeStamp", XFA_ELEMENT_TimeStamp, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x51d90546, (FX_LPCWSTR)L"month", XFA_ELEMENT_Month, XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_ContentNode}, + {0x523437e4, (FX_LPCWSTR)L"viewerPreferences", XFA_ELEMENT_ViewerPreferences, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0x53abc1c6, (FX_LPCWSTR)L"scriptModel", XFA_ELEMENT_ScriptModel, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x54034c2f, (FX_LPCWSTR)L"decimal", XFA_ELEMENT_Decimal, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContentNode}, + {0x54202c9e, (FX_LPCWSTR)L"subform", XFA_ELEMENT_Subform, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContainerNode}, + {0x542c7300, (FX_LPCWSTR)L"select", XFA_ELEMENT_Select, XFA_XDPPACKET_SourceSet, XFA_OBJECTTYPE_TextNode}, + {0x5436d198, (FX_LPCWSTR)L"window", XFA_ELEMENT_Window, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV}, + {0x5473b6dc, (FX_LPCWSTR)L"localeSet", XFA_ELEMENT_LocaleSet, XFA_XDPPACKET_Config | XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_ModelNode}, + {0x56ae179e, (FX_LPCWSTR)L"handler", XFA_ELEMENT_Handler, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_TextNode}, + {0x5700bd5f, (FX_LPCWSTR)L"hostPseudoModel", XFA_ELEMENT_HostPseudoModel, XFA_XDPPACKET_XDP, XFA_OBJECTTYPE_OrdinaryObject}, + {0x570ce835, (FX_LPCWSTR)L"presence", XFA_ELEMENT_Presence, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV}, + {0x5779d65f, (FX_LPCWSTR)L"record", XFA_ELEMENT_Record, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV}, + {0x59c8f27d, (FX_LPCWSTR)L"embed", XFA_ELEMENT_Embed, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x5a50e9e6, (FX_LPCWSTR)L"version", XFA_ELEMENT_Version, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x5b8383df, (FX_LPCWSTR)L"command", XFA_ELEMENT_Command, XFA_XDPPACKET_SourceSet, XFA_OBJECTTYPE_Node}, + {0x5c43c6c3, (FX_LPCWSTR)L"copies", XFA_ELEMENT_Copies, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x5e0c2c49, (FX_LPCWSTR)L"staple", XFA_ELEMENT_Staple, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0x5e5083dd, (FX_LPCWSTR)L"submitFormat", XFA_ELEMENT_SubmitFormat, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x5e8c5d20, (FX_LPCWSTR)L"boolean", XFA_ELEMENT_Boolean, XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContentNode}, + {0x60490a85, (FX_LPCWSTR)L"message", XFA_ELEMENT_Message, XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x60d4c8b1, (FX_LPCWSTR)L"output", XFA_ELEMENT_Output, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0x61810081, (FX_LPCWSTR)L"psMap", XFA_ELEMENT_PsMap, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0x62bd904b, (FX_LPCWSTR)L"excludeNS", XFA_ELEMENT_ExcludeNS, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV}, + {0x669d4f77, (FX_LPCWSTR)L"assist", XFA_ELEMENT_Assist, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x67334a1c, (FX_LPCWSTR)L"picture", XFA_ELEMENT_Picture, XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContentNode}, + {0x67fe7334, (FX_LPCWSTR)L"traversal", XFA_ELEMENT_Traversal, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x6894589c, (FX_LPCWSTR)L"silentPrint", XFA_ELEMENT_SilentPrint, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0x68a16bbd, (FX_LPCWSTR)L"webClient", XFA_ELEMENT_WebClient, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0x69f115df, (FX_LPCWSTR)L"layoutPseudoModel", XFA_ELEMENT_LayoutPseudoModel, XFA_XDPPACKET_XDP, XFA_OBJECTTYPE_OrdinaryObject}, + {0x6a4bc084, (FX_LPCWSTR)L"producer", XFA_ELEMENT_Producer, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x6a9e04c9, (FX_LPCWSTR)L"corner", XFA_ELEMENT_Corner, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x6ccd7274, (FX_LPCWSTR)L"msgId", XFA_ELEMENT_MsgId, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV}, + {0x6e67921f, (FX_LPCWSTR)L"color", XFA_ELEMENT_Color, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x6ec217a5, (FX_LPCWSTR)L"keep", XFA_ELEMENT_Keep, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x6eef1116, (FX_LPCWSTR)L"query", XFA_ELEMENT_Query, XFA_XDPPACKET_SourceSet, XFA_OBJECTTYPE_Node}, + {0x7033bfd5, (FX_LPCWSTR)L"insert", XFA_ELEMENT_Insert, XFA_XDPPACKET_SourceSet, XFA_OBJECTTYPE_TextNode}, + {0x704af389, (FX_LPCWSTR)L"imageEdit", XFA_ELEMENT_ImageEdit, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x7233018a, (FX_LPCWSTR)L"validate", XFA_ELEMENT_Validate, XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContentNode}, + {0x72ba47b4, (FX_LPCWSTR)L"digestMethods", XFA_ELEMENT_DigestMethods, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x72f2aa7a, (FX_LPCWSTR)L"numberPatterns", XFA_ELEMENT_NumberPatterns, XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_Node}, + {0x74caed29, (FX_LPCWSTR)L"pageSet", XFA_ELEMENT_PageSet, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContainerNode}, + {0x7568e6ae, (FX_LPCWSTR)L"integer", XFA_ELEMENT_Integer, XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContentNode}, + {0x76182db9, (FX_LPCWSTR)L"soapAddress", XFA_ELEMENT_SoapAddress, XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_TextNode}, + {0x773146c5, (FX_LPCWSTR)L"equate", XFA_ELEMENT_Equate, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV}, + {0x77d449dd, (FX_LPCWSTR)L"formFieldFilling", XFA_ELEMENT_FormFieldFilling, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x7889d68a, (FX_LPCWSTR)L"pageRange", XFA_ELEMENT_PageRange, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x7baca2e3, (FX_LPCWSTR)L"update", XFA_ELEMENT_Update, XFA_XDPPACKET_SourceSet, XFA_OBJECTTYPE_TextNode}, + {0x7ce89001, (FX_LPCWSTR)L"connectString", XFA_ELEMENT_ConnectString, XFA_XDPPACKET_SourceSet, XFA_OBJECTTYPE_TextNode}, + {0x7d9fd7c5, (FX_LPCWSTR)L"mode", XFA_ELEMENT_Mode, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x7e7e845e, (FX_LPCWSTR)L"layout", XFA_ELEMENT_Layout, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x7e845c34, (FX_LPCWSTR)L"#xml", XFA_ELEMENT_Sharpxml, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_NodeV}, + {0x7fb341df, (FX_LPCWSTR)L"xsdConnection", XFA_ELEMENT_XsdConnection, XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_Node}, + {0x7ffb51cc, (FX_LPCWSTR)L"traverse", XFA_ELEMENT_Traverse, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x80203b5a, (FX_LPCWSTR)L"encodings", XFA_ELEMENT_Encodings, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x803550fc, (FX_LPCWSTR)L"template", XFA_ELEMENT_Template, XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ModelNode}, + {0x803d5bbc, (FX_LPCWSTR)L"acrobat", XFA_ELEMENT_Acrobat, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0x821d6569, (FX_LPCWSTR)L"validationMessaging", XFA_ELEMENT_ValidationMessaging, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV}, + {0x830e688f, (FX_LPCWSTR)L"signing", XFA_ELEMENT_Signing, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x83a550d2, (FX_LPCWSTR)L"dataWindow", XFA_ELEMENT_DataWindow, XFA_XDPPACKET_Datasets, XFA_OBJECTTYPE_OrdinaryObject}, + {0x83dab9f5, (FX_LPCWSTR)L"script", XFA_ELEMENT_Script, XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContentNode}, + {0x8411ebcd, (FX_LPCWSTR)L"addViewerPreferences", XFA_ELEMENT_AddViewerPreferences, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x8777642e, (FX_LPCWSTR)L"alwaysEmbed", XFA_ELEMENT_AlwaysEmbed, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV}, + {0x877a6b39, (FX_LPCWSTR)L"passwordEdit", XFA_ELEMENT_PasswordEdit, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x87e84c99, (FX_LPCWSTR)L"numericEdit", XFA_ELEMENT_NumericEdit, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x8852cdec, (FX_LPCWSTR)L"encryptionMethod", XFA_ELEMENT_EncryptionMethod, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_NodeC}, + {0x891f4606, (FX_LPCWSTR)L"change", XFA_ELEMENT_Change, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x89939f36, (FX_LPCWSTR)L"pageArea", XFA_ELEMENT_PageArea, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContainerNode}, + {0x8a9d6247, (FX_LPCWSTR)L"submitUrl", XFA_ELEMENT_SubmitUrl, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x8ad8b90f, (FX_LPCWSTR)L"oids", XFA_ELEMENT_Oids, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x8b036f32, (FX_LPCWSTR)L"signature", XFA_ELEMENT_Signature, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x8b128efb, (FX_LPCWSTR)L"ADBE_JSConsole", XFA_ELEMENT_ADBE_JSConsole, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0x8bcfe96e, (FX_LPCWSTR)L"caption", XFA_ELEMENT_Caption, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x8e1c2921, (FX_LPCWSTR)L"relevant", XFA_ELEMENT_Relevant, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV}, + {0x8e3f0a4b, (FX_LPCWSTR)L"flipLabel", XFA_ELEMENT_FlipLabel, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV}, + {0x900280b7, (FX_LPCWSTR)L"exData", XFA_ELEMENT_ExData, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContentNode}, + {0x91e80352, (FX_LPCWSTR)L"dayNames", XFA_ELEMENT_DayNames, XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_Node}, + {0x93113b11, (FX_LPCWSTR)L"soapAction", XFA_ELEMENT_SoapAction, XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_TextNode}, + {0x938b09f6, (FX_LPCWSTR)L"defaultTypeface", XFA_ELEMENT_DefaultTypeface, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV}, + {0x95b37897, (FX_LPCWSTR)L"manifest", XFA_ELEMENT_Manifest, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x97b76b54, (FX_LPCWSTR)L"overflow", XFA_ELEMENT_Overflow, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x9a57861b, (FX_LPCWSTR)L"linear", XFA_ELEMENT_Linear, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0x9ad5a821, (FX_LPCWSTR)L"currencySymbol", XFA_ELEMENT_CurrencySymbol, XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_ContentNode}, + {0x9c6471b3, (FX_LPCWSTR)L"delete", XFA_ELEMENT_Delete, XFA_XDPPACKET_SourceSet, XFA_OBJECTTYPE_TextNode}, + {0x9deea61d, (FX_LPCWSTR)L"deltas", XFA_ELEMENT_Deltas, XFA_XDPPACKET_Form, XFA_OBJECTTYPE_OrdinaryObject}, + {0x9e67de21, (FX_LPCWSTR)L"digestMethod", XFA_ELEMENT_DigestMethod, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_NodeC}, + {0x9f3e9510, (FX_LPCWSTR)L"instanceManager", XFA_ELEMENT_InstanceManager, XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0xa0799892, (FX_LPCWSTR)L"equateRange", XFA_ELEMENT_EquateRange, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV}, + {0xa084a381, (FX_LPCWSTR)L"medium", XFA_ELEMENT_Medium, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0xa1211b8b, (FX_LPCWSTR)L"textEdit", XFA_ELEMENT_TextEdit, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0xa17008f0, (FX_LPCWSTR)L"templateCache", XFA_ELEMENT_TemplateCache, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0xa4f7b88f, (FX_LPCWSTR)L"compressObjectStream", XFA_ELEMENT_CompressObjectStream, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0xa65f5d17, (FX_LPCWSTR)L"dataValue", XFA_ELEMENT_DataValue, XFA_XDPPACKET_Datasets, XFA_OBJECTTYPE_Node}, + {0xa6caaa89, (FX_LPCWSTR)L"accessibleContent", XFA_ELEMENT_AccessibleContent, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0xa8c7d5e2, (FX_LPCWSTR)L"nodeList", XFA_ELEMENT_NodeList, XFA_XDPPACKET_XDP, XFA_OBJECTTYPE_NodeList}, + {0xa94cc00b, (FX_LPCWSTR)L"includeXDPContent", XFA_ELEMENT_IncludeXDPContent, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0xa9b081a1, (FX_LPCWSTR)L"xmlConnection", XFA_ELEMENT_XmlConnection, XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_Node}, + {0xab2a3b74, (FX_LPCWSTR)L"validateApprovalSignatures", XFA_ELEMENT_ValidateApprovalSignatures, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV}, + {0xab8c5a2b, (FX_LPCWSTR)L"signData", XFA_ELEMENT_SignData, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0xabaa2ceb, (FX_LPCWSTR)L"packets", XFA_ELEMENT_Packets, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0xadba359c, (FX_LPCWSTR)L"datePattern", XFA_ELEMENT_DatePattern, XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_ContentNode}, + {0xae222b2b, (FX_LPCWSTR)L"duplexOption", XFA_ELEMENT_DuplexOption, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0xb012effb, (FX_LPCWSTR)L"base", XFA_ELEMENT_Base, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0xb0e5485d, (FX_LPCWSTR)L"bind", XFA_ELEMENT_Bind, XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0xb45d61b2, (FX_LPCWSTR)L"compression", XFA_ELEMENT_Compression, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0xb563f0ff, (FX_LPCWSTR)L"user", XFA_ELEMENT_User, XFA_XDPPACKET_SourceSet, XFA_OBJECTTYPE_TextNode}, + {0xb5848ad5, (FX_LPCWSTR)L"rectangle", XFA_ELEMENT_Rectangle, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0xb6dacb72, (FX_LPCWSTR)L"effectiveOutputPolicy", XFA_ELEMENT_EffectiveOutputPolicy, XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_Node}, + {0xb7d7654d, (FX_LPCWSTR)L"ADBE_JSDebugger", XFA_ELEMENT_ADBE_JSDebugger, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0xbab37f73, (FX_LPCWSTR)L"acrobat7", XFA_ELEMENT_Acrobat7, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0xbc70081e, (FX_LPCWSTR)L"interactive", XFA_ELEMENT_Interactive, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0xbc8fa350, (FX_LPCWSTR)L"locale", XFA_ELEMENT_Locale, XFA_XDPPACKET_Config | XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_Node}, + {0xbcd44940, (FX_LPCWSTR)L"currentPage", XFA_ELEMENT_CurrentPage, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0xbde9abda, (FX_LPCWSTR)L"data", XFA_ELEMENT_Data, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0xbde9abde, (FX_LPCWSTR)L"date", XFA_ELEMENT_Date, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContentNode}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", XFA_ELEMENT_Desc, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0xbf4b6405, (FX_LPCWSTR)L"encrypt", XFA_ELEMENT_Encrypt, XFA_XDPPACKET_Template | XFA_XDPPACKET_Config | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContentNode}, + {0xbfa87cce, (FX_LPCWSTR)L"draw", XFA_ELEMENT_Draw, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContainerNode}, + {0xc181ff4b, (FX_LPCWSTR)L"encryption", XFA_ELEMENT_Encryption, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0xc1970f40, (FX_LPCWSTR)L"meridiemNames", XFA_ELEMENT_MeridiemNames, XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_Node}, + {0xc5ad9f5e, (FX_LPCWSTR)L"messaging", XFA_ELEMENT_Messaging, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0xc69549f4, (FX_LPCWSTR)L"speak", XFA_ELEMENT_Speak, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_TextNode}, + {0xc7743dc7, (FX_LPCWSTR)L"dataGroup", XFA_ELEMENT_DataGroup, XFA_XDPPACKET_Datasets, XFA_OBJECTTYPE_Node}, + {0xc7eb20e9, (FX_LPCWSTR)L"common", XFA_ELEMENT_Common, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0xc85d4528, (FX_LPCWSTR)L"#text", XFA_ELEMENT_Sharptext, XFA_XDPPACKET_Template | XFA_XDPPACKET_Config | XFA_XDPPACKET_LocaleSet | XFA_XDPPACKET_ConnectionSet | XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_NodeV}, + {0xc861556a, (FX_LPCWSTR)L"paginationOverride", XFA_ELEMENT_PaginationOverride, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0xc903dabb, (FX_LPCWSTR)L"reasons", XFA_ELEMENT_Reasons, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0xc9a8127f, (FX_LPCWSTR)L"signatureProperties", XFA_ELEMENT_SignatureProperties, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0xca010c2d, (FX_LPCWSTR)L"threshold", XFA_ELEMENT_Threshold, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV}, + {0xcb4c5e96, (FX_LPCWSTR)L"appearanceFilter", XFA_ELEMENT_AppearanceFilter, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_NodeC}, + {0xcc92aba7, (FX_LPCWSTR)L"fill", XFA_ELEMENT_Fill, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0xcd308b77, (FX_LPCWSTR)L"font", XFA_ELEMENT_Font, XFA_XDPPACKET_Template | XFA_XDPPACKET_Config | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0xcd309ff4, (FX_LPCWSTR)L"form", XFA_ELEMENT_Form, XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ModelNode}, + {0xcebcca2d, (FX_LPCWSTR)L"mediumInfo", XFA_ELEMENT_MediumInfo, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0xcfe0d643, (FX_LPCWSTR)L"certificate", XFA_ELEMENT_Certificate, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_TextNode}, + {0xd012c033, (FX_LPCWSTR)L"password", XFA_ELEMENT_Password, XFA_XDPPACKET_SourceSet, XFA_OBJECTTYPE_TextNode}, + {0xd01604bd, (FX_LPCWSTR)L"runScripts", XFA_ELEMENT_RunScripts, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0xd1227e6f, (FX_LPCWSTR)L"trace", XFA_ELEMENT_Trace, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0xd1532876, (FX_LPCWSTR)L"float", XFA_ELEMENT_Float, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContentNode}, + {0xd17a6c30, (FX_LPCWSTR)L"renderPolicy", XFA_ELEMENT_RenderPolicy, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0xd4bf6823, (FX_LPCWSTR)L"logPseudoModel", XFA_ELEMENT_LogPseudoModel, XFA_XDPPACKET_XDP, XFA_OBJECTTYPE_OrdinaryObject}, + {0xd58aa962, (FX_LPCWSTR)L"destination", XFA_ELEMENT_Destination, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0xd6e27f1d, (FX_LPCWSTR)L"value", XFA_ELEMENT_Value, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0xd7a14462, (FX_LPCWSTR)L"bookend", XFA_ELEMENT_Bookend, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0xd8c31254, (FX_LPCWSTR)L"exObject", XFA_ELEMENT_ExObject, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0xda6a8590, (FX_LPCWSTR)L"openAction", XFA_ELEMENT_OpenAction, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0xdab4fb7d, (FX_LPCWSTR)L"neverEmbed", XFA_ELEMENT_NeverEmbed, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV}, + {0xdb98475f, (FX_LPCWSTR)L"bindItems", XFA_ELEMENT_BindItems, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0xdbfbe02e, (FX_LPCWSTR)L"calculate", XFA_ELEMENT_Calculate, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0xdd7676ed, (FX_LPCWSTR)L"print", XFA_ELEMENT_Print, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0xdde273d7, (FX_LPCWSTR)L"extras", XFA_ELEMENT_Extras, XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0xde146b34, (FX_LPCWSTR)L"proto", XFA_ELEMENT_Proto, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0xdf059321, (FX_LPCWSTR)L"dSigData", XFA_ELEMENT_DSigData, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0xdfccf030, (FX_LPCWSTR)L"creator", XFA_ELEMENT_Creator, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0xdff78c6a, (FX_LPCWSTR)L"connect", XFA_ELEMENT_Connect, XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0xe11a2cbc, (FX_LPCWSTR)L"permissions", XFA_ELEMENT_Permissions, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0xe14c801c, (FX_LPCWSTR)L"connectionSet", XFA_ELEMENT_ConnectionSet, XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_ModelNode}, + {0xe1c83a14, (FX_LPCWSTR)L"submit", XFA_ELEMENT_Submit, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0xe29821cd, (FX_LPCWSTR)L"range", XFA_ELEMENT_Range, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV}, + {0xe38d83c7, (FX_LPCWSTR)L"linearized", XFA_ELEMENT_Linearized, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0xe3aa2578, (FX_LPCWSTR)L"packet", XFA_ELEMENT_Packet, XFA_XDPPACKET_XDP, XFA_OBJECTTYPE_NodeC}, + {0xe3aa860e, (FX_LPCWSTR)L"rootElement", XFA_ELEMENT_RootElement, XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_TextNode}, + {0xe3e553fa, (FX_LPCWSTR)L"plaintextMetadata", XFA_ELEMENT_PlaintextMetadata, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0xe3e6e4f2, (FX_LPCWSTR)L"numberSymbols", XFA_ELEMENT_NumberSymbols, XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_Node}, + {0xe3f067f6, (FX_LPCWSTR)L"printHighQuality", XFA_ELEMENT_PrintHighQuality, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0xe3fd078c, (FX_LPCWSTR)L"driver", XFA_ELEMENT_Driver, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0xe48b34f2, (FX_LPCWSTR)L"incrementalLoad", XFA_ELEMENT_IncrementalLoad, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV}, + {0xe550e7c2, (FX_LPCWSTR)L"subjectDN", XFA_ELEMENT_SubjectDN, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_NodeC}, + {0xe6669a78, (FX_LPCWSTR)L"compressLogicalStructure", XFA_ELEMENT_CompressLogicalStructure, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0xe7a7ea02, (FX_LPCWSTR)L"incrementalMerge", XFA_ELEMENT_IncrementalMerge, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0xe948530d, (FX_LPCWSTR)L"radial", XFA_ELEMENT_Radial, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0xea8d6999, (FX_LPCWSTR)L"variables", XFA_ELEMENT_Variables, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContainerNode}, + {0xeaa142c0, (FX_LPCWSTR)L"timePatterns", XFA_ELEMENT_TimePatterns, XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_Node}, + {0xeb943a71, (FX_LPCWSTR)L"effectiveInputPolicy", XFA_ELEMENT_EffectiveInputPolicy, XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_Node}, + {0xef04a2bc, (FX_LPCWSTR)L"nameAttr", XFA_ELEMENT_NameAttr, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV}, + {0xf07222ab, (FX_LPCWSTR)L"conformance", XFA_ELEMENT_Conformance, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0xf0aaaadc, (FX_LPCWSTR)L"transform", XFA_ELEMENT_Transform, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node}, + {0xf1433e88, (FX_LPCWSTR)L"lockDocument", XFA_ELEMENT_LockDocument, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContentNode}, + {0xf54eb997, (FX_LPCWSTR)L"breakAfter", XFA_ELEMENT_BreakAfter, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0xf616da28, (FX_LPCWSTR)L"line", XFA_ELEMENT_Line, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0xf616f3dc, (FX_LPCWSTR)L"list", XFA_ELEMENT_List, XFA_XDPPACKET_XDP, XFA_OBJECTTYPE_OrdinaryList}, + {0xf7055fb1, (FX_LPCWSTR)L"source", XFA_ELEMENT_Source, XFA_XDPPACKET_SourceSet, XFA_OBJECTTYPE_Node}, + {0xf7eebe1c, (FX_LPCWSTR)L"occur", XFA_ELEMENT_Occur, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, + {0xf8d10d97, (FX_LPCWSTR)L"pickTrayByPDFSize", XFA_ELEMENT_PickTrayByPDFSize, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0xf8f19e3a, (FX_LPCWSTR)L"monthNames", XFA_ELEMENT_MonthNames, XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_Node}, + {0xf984149b, (FX_LPCWSTR)L"severity", XFA_ELEMENT_Severity, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV}, + {0xf9bcb037, (FX_LPCWSTR)L"groupParent", XFA_ELEMENT_GroupParent, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV}, + {0xfbc42fff, (FX_LPCWSTR)L"documentAssembly", XFA_ELEMENT_DocumentAssembly, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0xfc78159f, (FX_LPCWSTR)L"numberSymbol", XFA_ELEMENT_NumberSymbol, XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_ContentNode}, + {0xfcbd606c, (FX_LPCWSTR)L"tagged", XFA_ELEMENT_Tagged, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode}, + {0xff063802, (FX_LPCWSTR)L"items", XFA_ELEMENT_Items, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node}, +}; +extern const FX_INT32 g_iXFAElementCount = sizeof(g_XFAElementData) / sizeof(XFA_ELEMENTINFO); +extern const XFA_ELEMENTHIERARCHY g_XFAElementPropertyIndex[] = { + {0, 8}, {8, 0}, {8, 14}, {22, 0}, {22, 0}, {22, 6}, {28, 0}, {28, 0}, {28, 1}, {29, 3}, {32, 0}, {32, 0}, {32, 0}, {32, 3}, {35, 1}, {36, 0}, {36, 0}, {36, 2}, {38, 0}, {38, 0}, + {38, 0}, {38, 4}, {42, 0}, {42, 0}, {42, 1}, {43, 0}, {43, 8}, {51, 19}, {70, 0}, {70, 0}, {70, 2}, {72, 1}, {73, 0}, {73, 2}, {75, 4}, {79, 1}, {80, 1}, {81, 0}, {81, 0}, {81, 3}, + {84, 0}, {84, 4}, {88, 4}, {92, 1}, {93, 0}, {93, 4}, {97, 9}, {106, 14}, {120, 0}, {120, 0}, {120, 5}, {125, 0}, {125, 1}, {126, 0}, {126, 0}, {126, 0}, {126, 0}, {126, 0}, {126, 1}, {127, 0}, + {127, 0}, {127, 0}, {127, 0}, {127, 0}, {127, 0}, {127, 0}, {127, 6}, {133, 1}, {134, 0}, {134, 1}, {135, 0}, {135, 0}, {135, 1}, {136, 2}, {138, 5}, {143, 2}, {145, 0}, {145, 0}, {145, 0}, {145, 0}, + {145, 0}, {145, 5}, {150, 0}, {150, 0}, {150, 0}, {150, 0}, {150, 0}, {150, 0}, {150, 0}, {150, 2}, {152, 0}, {152, 0}, {152, 0}, {152, 17}, {169, 0}, {169, 1}, {170, 0}, {170, 0}, {170, 2}, {172, 0}, + {172, 0}, {172, 1}, {173, 0}, {173, 0}, {173, 2}, {175, 2}, {177, 0}, {177, 0}, {177, 0}, {177, 11}, {188, 0}, {188, 0}, {188, 0}, {188, 0}, {188, 0}, {188, 4}, {192, 3}, {195, 0}, {195, 0}, {195, 0}, + {195, 0}, {195, 0}, {195, 0}, {195, 9}, {204, 0}, {204, 0}, {204, 17}, {221, 0}, {221, 0}, {221, 0}, {221, 0}, {221, 0}, {221, 0}, {221, 0}, {221, 0}, {221, 0}, {221, 4}, {225, 0}, {225, 0}, {225, 0}, + {225, 0}, {225, 2}, {227, 3}, {230, 0}, {230, 0}, {230, 2}, {232, 0}, {232, 1}, {233, 2}, {235, 2}, {237, 0}, {237, 0}, {237, 2}, {239, 0}, {239, 1}, {240, 1}, {241, 2}, {243, 0}, {243, 3}, {246, 4}, + {250, 0}, {250, 1}, {251, 2}, {253, 0}, {253, 0}, {253, 0}, {253, 0}, {253, 0}, {253, 0}, {253, 0}, {253, 0}, {253, 0}, {253, 0}, {253, 2}, {255, 2}, {257, 0}, {257, 6}, {263, 5}, {268, 0}, {268, 0}, + {268, 0}, {268, 3}, {271, 0}, {271, 0}, {271, 3}, {274, 4}, {278, 0}, {278, 0}, {278, 4}, {282, 0}, {282, 0}, {282, 5}, {287, 0}, {287, 5}, {292, 0}, {292, 0}, {292, 0}, {292, 1}, {293, 0}, {293, 0}, + {293, 1}, {294, 0}, {294, 2}, {296, 0}, {296, 0}, {296, 0}, {296, 0}, {296, 1}, {297, 0}, {297, 0}, {297, 4}, {301, 0}, {301, 0}, {301, 0}, {301, 0}, {301, 0}, {301, 0}, {301, 1}, {302, 0}, {302, 2}, + {304, 0}, {304, 0}, {304, 0}, {304, 0}, {304, 1}, {305, 4}, {309, 0}, {309, 3}, {312, 0}, {312, 0}, {312, 1}, {313, 0}, {313, 8}, {321, 0}, {321, 10}, {331, 0}, {331, 10}, {341, 1}, {342, 12}, {354, 3}, + {357, 1}, {358, 0}, {358, 0}, {358, 0}, {358, 8}, {366, 0}, {366, 0}, {366, 0}, {366, 0}, {366, 0}, {366, 0}, {366, 7}, {373, 2}, {375, 0}, {375, 1}, {376, 0}, {376, 0}, {376, 0}, {376, 0}, {376, 0}, + {376, 0}, {376, 0}, {376, 0}, {376, 13}, {389, 0}, {389, 1}, {390, 1}, {391, 0}, {391, 0}, {391, 3}, {394, 0}, {394, 0}, {394, 0}, {394, 0}, {394, 0}, {394, 4}, {398, 9}, {407, 0}, {407, 1}, {408, 0}, + {408, 0}, {408, 0}, {408, 0}, {408, 0}, {408, 1}, {409, 0}, {409, 2}, {411, 0}, {411, 0}, {411, 0}, {411, 0}, {411, 2}, {413, 0}, {413, 1}, {414, 0}, {414, 0}, {414, 0}, {414, 7}, {421, 0}, {421, 1}, + {422, 1}, {423, 0}, {423, 1}, {424, 1}, {425, 0}, {425, 1}, {426, 0}, {426, 0}, {426, 0}, {426, 0}, {426, 0}, {426, 0}, +}; +extern const XFA_PROPERTY g_XFAElementPropertyData[] = { + {XFA_ELEMENT_FontInfo, 1, 0}, {XFA_ELEMENT_Jog, 1, 0}, {XFA_ELEMENT_Xdc, 1, 0}, {XFA_ELEMENT_BatchOutput, 1, 0}, {XFA_ELEMENT_OutputBin, 1, 0}, {XFA_ELEMENT_Compress, 1, 0}, {XFA_ELEMENT_Staple, 1, 0}, {XFA_ELEMENT_MediumInfo, 1, 0}, {XFA_ELEMENT_CheckButton, 1, XFA_PROPERTYFLAG_OneOf}, {XFA_ELEMENT_ChoiceList, 1, XFA_PROPERTYFLAG_OneOf}, + {XFA_ELEMENT_DefaultUi, 1, XFA_PROPERTYFLAG_OneOf}, {XFA_ELEMENT_Barcode, 1, XFA_PROPERTYFLAG_OneOf}, {XFA_ELEMENT_Button, 1, XFA_PROPERTYFLAG_OneOf}, {XFA_ELEMENT_DateTimeEdit, 1, XFA_PROPERTYFLAG_OneOf}, {XFA_ELEMENT_Picture, 1, 0}, {XFA_ELEMENT_ImageEdit, 1, XFA_PROPERTYFLAG_OneOf}, {XFA_ELEMENT_PasswordEdit, 1, XFA_PROPERTYFLAG_OneOf}, {XFA_ELEMENT_NumericEdit, 1, XFA_PROPERTYFLAG_OneOf}, {XFA_ELEMENT_Signature, 1, XFA_PROPERTYFLAG_OneOf}, {XFA_ELEMENT_TextEdit, 1, XFA_PROPERTYFLAG_OneOf}, + {XFA_ELEMENT_ExObject, 1, XFA_PROPERTYFLAG_OneOf}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Break, 1, 0}, {XFA_ELEMENT_Overflow, 1, 0}, {XFA_ELEMENT_Desc, 1, 0}, {XFA_ELEMENT_Bookend, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Occur, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_SubsetBelow, 1, 0}, + {XFA_ELEMENT_Map, 1, 0}, {XFA_ELEMENT_Embed, 1, 0}, {XFA_ELEMENT_Margin, 1, 0}, {XFA_ELEMENT_Border, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_DatePattern, 4, 0}, {XFA_ELEMENT_Edge, 1, 0}, {XFA_ELEMENT_Fill, 1, 0}, {XFA_ELEMENT_To, 1, 0}, {XFA_ELEMENT_Uri, 1, 0}, + {XFA_ELEMENT_Mode, 1, 0}, {XFA_ELEMENT_Threshold, 1, 0}, {XFA_ELEMENT_Script, 1, 0}, {XFA_ELEMENT_FontInfo, 1, 0}, {XFA_ELEMENT_Jog, 1, 0}, {XFA_ELEMENT_Xdc, 1, 0}, {XFA_ELEMENT_BatchOutput, 1, 0}, {XFA_ELEMENT_PageOffset, 1, 0}, {XFA_ELEMENT_OutputBin, 1, 0}, {XFA_ELEMENT_Staple, 1, 0}, + {XFA_ELEMENT_MediumInfo, 1, 0}, {XFA_ELEMENT_AdobeExtensionLevel, 1, 0}, {XFA_ELEMENT_FontInfo, 1, 0}, {XFA_ELEMENT_Xdc, 1, 0}, {XFA_ELEMENT_Pdfa, 1, 0}, {XFA_ELEMENT_BatchOutput, 1, 0}, {XFA_ELEMENT_ViewerPreferences, 1, 0}, {XFA_ELEMENT_ScriptModel, 1, 0}, {XFA_ELEMENT_Version, 1, 0}, {XFA_ELEMENT_SubmitFormat, 1, 0}, + {XFA_ELEMENT_SilentPrint, 1, 0}, {XFA_ELEMENT_Producer, 1, 0}, {XFA_ELEMENT_Compression, 1, 0}, {XFA_ELEMENT_Interactive, 1, 0}, {XFA_ELEMENT_Encryption, 1, 0}, {XFA_ELEMENT_RenderPolicy, 1, 0}, {XFA_ELEMENT_OpenAction, 1, 0}, {XFA_ELEMENT_Creator, 1, 0}, {XFA_ELEMENT_Linearized, 1, 0}, {XFA_ELEMENT_Tagged, 1, 0}, + {XFA_ELEMENT_Uri, 1, 0}, {XFA_ELEMENT_Xsl, 1, 0}, {XFA_ELEMENT_Packets, 1, 0}, {XFA_ELEMENT_Uri, 1, 0}, {XFA_ELEMENT_Debug, 1, 0}, {XFA_ELEMENT_FontInfo, 1, 0}, {XFA_ELEMENT_Xdc, 1, 0}, {XFA_ELEMENT_BatchOutput, 1, 0}, {XFA_ELEMENT_FlipLabel, 1, 0}, {XFA_ELEMENT_TemplateCache, 1, 0}, + {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Margin, 1, 0}, {XFA_ELEMENT_Border, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_FontInfo, 1, 0}, {XFA_ELEMENT_Xdc, 1, 0}, {XFA_ELEMENT_BatchOutput, 1, 0}, {XFA_ELEMENT_FlipLabel, 1, 0}, {XFA_ELEMENT_EraNames, 1, 0}, {XFA_ELEMENT_DayNames, 2, 0}, + {XFA_ELEMENT_MeridiemNames, 1, 0}, {XFA_ELEMENT_MonthNames, 2, 0}, {XFA_ELEMENT_Hyphenation, 1, 0}, {XFA_ELEMENT_Amd, 1, 0}, {XFA_ELEMENT_Part, 1, 0}, {XFA_ELEMENT_IncludeXDPContent, 1, 0}, {XFA_ELEMENT_Conformance, 1, 0}, {XFA_ELEMENT_Mdp, 1, 0}, {XFA_ELEMENT_Certificates, 1, 0}, {XFA_ELEMENT_TimeStamp, 1, 0}, + {XFA_ELEMENT_Handler, 1, 0}, {XFA_ELEMENT_DigestMethods, 1, 0}, {XFA_ELEMENT_Encodings, 1, 0}, {XFA_ELEMENT_Reasons, 1, 0}, {XFA_ELEMENT_AppearanceFilter, 1, 0}, {XFA_ELEMENT_LockDocument, 1, 0}, {XFA_ELEMENT_Xdp, 1, 0}, {XFA_ELEMENT_Cache, 1, 0}, {XFA_ELEMENT_Pagination, 1, 0}, {XFA_ELEMENT_Overprint, 1, 0}, + {XFA_ELEMENT_BehaviorOverride, 1, 0}, {XFA_ELEMENT_Copies, 1, 0}, {XFA_ELEMENT_Output, 1, 0}, {XFA_ELEMENT_Validate, 1, 0}, {XFA_ELEMENT_Layout, 1, 0}, {XFA_ELEMENT_Script, 1, 0}, {XFA_ELEMENT_Common, 1, 0}, {XFA_ELEMENT_PaginationOverride, 1, 0}, {XFA_ELEMENT_Destination, 1, 0}, {XFA_ELEMENT_IncrementalMerge, 1, 0}, + {XFA_ELEMENT_Execute, 1, XFA_PROPERTYFLAG_OneOf}, {XFA_ELEMENT_Script, 1, XFA_PROPERTYFLAG_OneOf}, {XFA_ELEMENT_SignData, 1, XFA_PROPERTYFLAG_OneOf}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Submit, 1, XFA_PROPERTYFLAG_OneOf}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_CurrencySymbol, 3, 0}, {XFA_ELEMENT_Operation, 1, 0}, {XFA_ELEMENT_WsdlAddress, 1, 0}, {XFA_ELEMENT_SoapAddress, 1, 0}, + {XFA_ELEMENT_SoapAction, 1, 0}, {XFA_ELEMENT_EffectiveOutputPolicy, 1, 0}, {XFA_ELEMENT_EffectiveInputPolicy, 1, 0}, {XFA_ELEMENT_Uri, 1, 0}, {XFA_ELEMENT_Era, 2, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Picture, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Margin, 1, 0}, {XFA_ELEMENT_Edge, 4, 0}, + {XFA_ELEMENT_Corner, 4, 0}, {XFA_ELEMENT_Fill, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Desc, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_KeyUsage, 1, 0}, {XFA_ELEMENT_SubjectDNs, 1, 0}, {XFA_ELEMENT_Issuers, 1, 0}, {XFA_ELEMENT_Signing, 1, 0}, {XFA_ELEMENT_Oids, 1, 0}, + {XFA_ELEMENT_Color, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Ui, 1, 0}, {XFA_ELEMENT_Margin, 1, 0}, {XFA_ELEMENT_Para, 1, 0}, {XFA_ELEMENT_Format, 1, 0}, {XFA_ELEMENT_Border, 1, 0}, {XFA_ELEMENT_Assist, 1, 0}, {XFA_ELEMENT_Traversal, 1, 0}, {XFA_ELEMENT_Keep, 1, 0}, + {XFA_ELEMENT_Validate, 1, 0}, {XFA_ELEMENT_Caption, 1, 0}, {XFA_ELEMENT_Bind, 1, 0}, {XFA_ELEMENT_Desc, 1, 0}, {XFA_ELEMENT_Font, 1, 0}, {XFA_ELEMENT_Value, 1, 0}, {XFA_ELEMENT_Calculate, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Items, 2, 0}, {XFA_ELEMENT_Uri, 1, 0}, + {XFA_ELEMENT_Desc, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Color, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Color, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Margin, 1, 0}, {XFA_ELEMENT_Para, 1, 0}, {XFA_ELEMENT_Border, 1, 0}, + {XFA_ELEMENT_Assist, 1, 0}, {XFA_ELEMENT_Traversal, 1, 0}, {XFA_ELEMENT_Validate, 1, 0}, {XFA_ELEMENT_Caption, 1, 0}, {XFA_ELEMENT_Bind, 1, 0}, {XFA_ELEMENT_Desc, 1, 0}, {XFA_ELEMENT_Calculate, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Margin, 1, 0}, {XFA_ELEMENT_Border, 1, 0}, + {XFA_ELEMENT_Comb, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Present, 1, 0}, {XFA_ELEMENT_Acrobat, 1, 0}, {XFA_ELEMENT_Trace, 1, 0}, {XFA_ELEMENT_PrintScaling, 1, 0}, {XFA_ELEMENT_Enforce, 1, 0}, {XFA_ELEMENT_NumberOfCopies, 1, 0}, {XFA_ELEMENT_PageRange, 1, 0}, {XFA_ELEMENT_AddViewerPreferences, 1, 0}, + {XFA_ELEMENT_ADBE_JSConsole, 1, 0}, {XFA_ELEMENT_DuplexOption, 1, 0}, {XFA_ELEMENT_ADBE_JSDebugger, 1, 0}, {XFA_ELEMENT_PickTrayByPDFSize, 1, 0}, {XFA_ELEMENT_Break, 1, 0}, {XFA_ELEMENT_Margin, 1, 0}, {XFA_ELEMENT_Para, 1, 0}, {XFA_ELEMENT_Border, 1, 0}, {XFA_ELEMENT_Assist, 1, 0}, {XFA_ELEMENT_Traversal, 1, 0}, + {XFA_ELEMENT_Keep, 1, 0}, {XFA_ELEMENT_Validate, 1, 0}, {XFA_ELEMENT_PageSet, 1, 0}, {XFA_ELEMENT_Overflow, 1, 0}, {XFA_ELEMENT_Bind, 1, 0}, {XFA_ELEMENT_Desc, 1, 0}, {XFA_ELEMENT_Bookend, 1, 0}, {XFA_ELEMENT_Calculate, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Variables, 1, 0}, + {XFA_ELEMENT_Occur, 1, 0}, {XFA_ELEMENT_Query, 1, 0}, {XFA_ELEMENT_Insert, 1, 0}, {XFA_ELEMENT_Update, 1, 0}, {XFA_ELEMENT_Delete, 1, 0}, {XFA_ELEMENT_MsgId, 1, 0}, {XFA_ELEMENT_Severity, 1, 0}, {XFA_ELEMENT_To, 1, 0}, {XFA_ELEMENT_Uri, 1, 0}, {XFA_ELEMENT_Type, 1, 0}, + {XFA_ELEMENT_ToolTip, 1, 0}, {XFA_ELEMENT_Speak, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_AddSilentPrint, 1, 0}, {XFA_ELEMENT_PrinterName, 1, 0}, {XFA_ELEMENT_FontInfo, 1, 0}, {XFA_ELEMENT_Xdc, 1, 0}, {XFA_ELEMENT_Color, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, + {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_RecordSet, 1, 0}, {XFA_ELEMENT_Select, 1, 0}, {XFA_ELEMENT_Margin, 1, 0}, {XFA_ELEMENT_Border, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Message, 1, 0}, {XFA_ELEMENT_Picture, 1, 0}, {XFA_ELEMENT_Script, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, + {XFA_ELEMENT_NumberPattern, 4, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Occur, 1, 0}, {XFA_ELEMENT_Uri, 1, 0}, {XFA_ELEMENT_RootElement, 1, 0}, {XFA_ELEMENT_Script, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Uri, 1, 0}, {XFA_ELEMENT_Xsl, 1, 0}, {XFA_ELEMENT_StartPage, 1, 0}, + {XFA_ELEMENT_Relevant, 1, 0}, {XFA_ELEMENT_Base, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_AutoSave, 1, 0}, {XFA_ELEMENT_Validate, 1, 0}, {XFA_ELEMENT_ValidateApprovalSignatures, 1, 0}, {XFA_ELEMENT_Acrobat7, 1, 0}, {XFA_ELEMENT_Common, 1, 0}, {XFA_ELEMENT_Exclude, 1, 0}, {XFA_ELEMENT_CurrentPage, 1, 0}, + {XFA_ELEMENT_RunScripts, 1, 0}, {XFA_ELEMENT_Margin, 1, 0}, {XFA_ELEMENT_Border, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Margin, 1, 0}, {XFA_ELEMENT_Border, 1, 0}, {XFA_ELEMENT_Comb, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Medium, 1, 0}, {XFA_ELEMENT_Desc, 1, 0}, + {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Occur, 1, 0}, {XFA_ELEMENT_Margin, 1, 0}, {XFA_ELEMENT_Filter, 1, 0}, {XFA_ELEMENT_Border, 1, 0}, {XFA_ELEMENT_Manifest, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Margin, 1, 0}, {XFA_ELEMENT_Para, 1, 0}, {XFA_ELEMENT_Font, 1, 0}, + {XFA_ELEMENT_Value, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Day, 7, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Color, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Occur, 1, 0}, {XFA_ELEMENT_Margin, 1, 0}, {XFA_ELEMENT_Border, 1, 0}, {XFA_ELEMENT_Comb, 1, 0}, + {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Uri, 1, 0}, {XFA_ELEMENT_Filter, 1, 0}, {XFA_ELEMENT_Manifest, 1, 0}, {XFA_ELEMENT_Picture, 1, 0}, {XFA_ELEMENT_Level, 1, 0}, {XFA_ELEMENT_Type, 1, 0}, {XFA_ELEMENT_CompressObjectStream, 1, 0}, {XFA_ELEMENT_CompressLogicalStructure, 1, 0}, {XFA_ELEMENT_Edge, 4, 0}, + {XFA_ELEMENT_Corner, 4, 0}, {XFA_ELEMENT_Fill, 1, 0}, {XFA_ELEMENT_DynamicRender, 1, 0}, {XFA_ELEMENT_DatePatterns, 1, 0}, {XFA_ELEMENT_CalendarSymbols, 1, 0}, {XFA_ELEMENT_CurrencySymbols, 1, 0}, {XFA_ELEMENT_Typefaces, 1, 0}, {XFA_ELEMENT_DateTimeSymbols, 1, 0}, {XFA_ELEMENT_NumberPatterns, 1, 0}, {XFA_ELEMENT_NumberSymbols, 1, 0}, + {XFA_ELEMENT_TimePatterns, 1, 0}, {XFA_ELEMENT_Uri, 1, 0}, {XFA_ELEMENT_Xsl, 1, 0}, {XFA_ELEMENT_StartNode, 1, 0}, {XFA_ELEMENT_OutputXSL, 1, 0}, {XFA_ELEMENT_AdjustData, 1, 0}, {XFA_ELEMENT_Attributes, 1, 0}, {XFA_ELEMENT_Window, 1, 0}, {XFA_ELEMENT_Record, 1, 0}, {XFA_ELEMENT_Range, 1, 0}, + {XFA_ELEMENT_IncrementalLoad, 1, 0}, {XFA_ELEMENT_Text, 1, 0}, {XFA_ELEMENT_Time, 1, 0}, {XFA_ELEMENT_DateTime, 1, 0}, {XFA_ELEMENT_Image, 1, 0}, {XFA_ELEMENT_Decimal, 1, 0}, {XFA_ELEMENT_Boolean, 1, 0}, {XFA_ELEMENT_Integer, 1, 0}, {XFA_ELEMENT_ExData, 1, 0}, {XFA_ELEMENT_Date, 1, 0}, + {XFA_ELEMENT_Float, 1, 0}, {XFA_ELEMENT_Certificate, 1, 0}, {XFA_ELEMENT_Ui, 1, 0}, {XFA_ELEMENT_Margin, 1, 0}, {XFA_ELEMENT_Para, 1, 0}, {XFA_ELEMENT_Border, 1, 0}, {XFA_ELEMENT_Assist, 1, 0}, {XFA_ELEMENT_Traversal, 1, 0}, {XFA_ELEMENT_Keep, 1, 0}, {XFA_ELEMENT_Caption, 1, 0}, + {XFA_ELEMENT_Desc, 1, 0}, {XFA_ELEMENT_Font, 1, 0}, {XFA_ELEMENT_Value, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_EncryptionLevel, 1, 0}, {XFA_ELEMENT_Encrypt, 1, 0}, {XFA_ELEMENT_Permissions, 1, 0}, {XFA_ELEMENT_Meridiem, 2, 0}, {XFA_ELEMENT_SuppressBanner, 1, 0}, {XFA_ELEMENT_VersionControl, 1, 0}, + {XFA_ELEMENT_LocaleSet, 1, 0}, {XFA_ELEMENT_Template, 1, 0}, {XFA_ELEMENT_ValidationMessaging, 1, 0}, {XFA_ELEMENT_Locale, 1, 0}, {XFA_ELEMENT_Data, 1, 0}, {XFA_ELEMENT_Messaging, 1, 0}, {XFA_ELEMENT_Pattern, 1, XFA_PROPERTYFLAG_OneOf}, {XFA_ELEMENT_Solid, 1, XFA_PROPERTYFLAG_OneOf | XFA_PROPERTYFLAG_DefaultOneOf}, {XFA_ELEMENT_Stipple, 1, XFA_PROPERTYFLAG_OneOf}, {XFA_ELEMENT_Color, 1, 0}, + {XFA_ELEMENT_Linear, 1, XFA_PROPERTYFLAG_OneOf}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Radial, 1, XFA_PROPERTYFLAG_OneOf}, {XFA_ELEMENT_Fill, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Map, 1, 0}, {XFA_ELEMENT_Arc, 1, XFA_PROPERTYFLAG_OneOf}, {XFA_ELEMENT_Text, 1, XFA_PROPERTYFLAG_OneOf}, {XFA_ELEMENT_Time, 1, XFA_PROPERTYFLAG_OneOf}, {XFA_ELEMENT_DateTime, 1, XFA_PROPERTYFLAG_OneOf}, + {XFA_ELEMENT_Image, 1, XFA_PROPERTYFLAG_OneOf}, {XFA_ELEMENT_Decimal, 1, XFA_PROPERTYFLAG_OneOf}, {XFA_ELEMENT_Boolean, 1, XFA_PROPERTYFLAG_OneOf}, {XFA_ELEMENT_Integer, 1, XFA_PROPERTYFLAG_OneOf}, {XFA_ELEMENT_ExData, 1, XFA_PROPERTYFLAG_OneOf}, {XFA_ELEMENT_Rectangle, 1, XFA_PROPERTYFLAG_OneOf}, {XFA_ELEMENT_Date, 1, XFA_PROPERTYFLAG_OneOf}, {XFA_ELEMENT_Float, 1, XFA_PROPERTYFLAG_OneOf}, {XFA_ELEMENT_Line, 1, XFA_PROPERTYFLAG_OneOf}, {XFA_ELEMENT_Extras, 1, 0}, + {XFA_ELEMENT_Destination, 1, 0}, {XFA_ELEMENT_Message, 1, 0}, {XFA_ELEMENT_Script, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Picture, 1, 0}, {XFA_ELEMENT_ConnectString, 1, 0}, {XFA_ELEMENT_User, 1, 0}, {XFA_ELEMENT_Password, 1, 0}, {XFA_ELEMENT_ModifyAnnots, 1, 0}, {XFA_ELEMENT_ContentCopy, 1, 0}, + {XFA_ELEMENT_FormFieldFilling, 1, 0}, {XFA_ELEMENT_Change, 1, 0}, {XFA_ELEMENT_AccessibleContent, 1, 0}, {XFA_ELEMENT_Print, 1, 0}, {XFA_ELEMENT_PlaintextMetadata, 1, 0}, {XFA_ELEMENT_PrintHighQuality, 1, 0}, {XFA_ELEMENT_DocumentAssembly, 1, 0}, {XFA_ELEMENT_Encrypt, 1, 0}, {XFA_ELEMENT_NumberSymbol, 5, 0}, {XFA_ELEMENT_FontInfo, 1, 0}, + {XFA_ELEMENT_Xdc, 1, 0}, {XFA_ELEMENT_Color, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_TimePattern, 4, 0}, {XFA_ELEMENT_Whitespace, 1, 0}, {XFA_ELEMENT_Rename, 1, 0}, {XFA_ELEMENT_IfEmpty, 1, 0}, {XFA_ELEMENT_Presence, 1, 0}, {XFA_ELEMENT_Picture, 1, 0}, {XFA_ELEMENT_NameAttr, 1, 0}, + {XFA_ELEMENT_GroupParent, 1, 0}, {XFA_ELEMENT_Script, 1, 0}, {XFA_ELEMENT_Edge, 1, 0}, {XFA_ELEMENT_Connect, 1, 0}, {XFA_ELEMENT_Extras, 1, 0}, {XFA_ELEMENT_Month, 12, 0}, +}; +extern const XFA_ELEMENTHIERARCHY g_XFAElementChildrenIndex[] = { + {0, 0}, {0, 0}, {0, 0}, {0, 1}, {1, 0}, {1, 4}, {5, 0}, {5, 0}, {5, 0}, {5, 3}, {8, 0}, {8, 0}, {8, 0}, {8, 0}, {8, 0}, {8, 1}, {9, 0}, {9, 0}, {9, 0}, {9, 0}, + {9, 0}, {9, 0}, {9, 2}, {11, 0}, {11, 0}, {11, 0}, {11, 0}, {11, 0}, {11, 0}, {11, 0}, {11, 0}, {11, 0}, {11, 0}, {11, 0}, {11, 0}, {11, 0}, {11, 0}, {11, 0}, {11, 0}, {11, 0}, + {11, 0}, {11, 0}, {11, 0}, {11, 0}, {11, 0}, {11, 0}, {11, 0}, {11, 8}, {19, 0}, {19, 0}, {19, 0}, {19, 0}, {19, 0}, {19, 0}, {19, 0}, {19, 0}, {19, 0}, {19, 0}, {19, 0}, {19, 0}, + {19, 0}, {19, 0}, {19, 1}, {20, 1}, {21, 1}, {22, 0}, {22, 0}, {22, 0}, {22, 0}, {22, 0}, {22, 0}, {22, 0}, {22, 0}, {22, 0}, {22, 0}, {22, 7}, {29, 0}, {29, 0}, {29, 0}, {29, 0}, + {29, 0}, {29, 0}, {29, 1}, {30, 1}, {31, 0}, {31, 0}, {31, 0}, {31, 0}, {31, 0}, {31, 0}, {31, 0}, {31, 0}, {31, 0}, {31, 4}, {35, 2}, {37, 0}, {37, 0}, {37, 0}, {37, 0}, {37, 0}, + {37, 0}, {37, 0}, {37, 0}, {37, 0}, {37, 0}, {37, 0}, {37, 0}, {37, 0}, {37, 0}, {37, 4}, {41, 0}, {41, 0}, {41, 0}, {41, 0}, {41, 0}, {41, 0}, {41, 2}, {43, 0}, {43, 0}, {43, 0}, + {43, 0}, {43, 0}, {43, 0}, {43, 0}, {43, 0}, {43, 0}, {43, 13}, {56, 0}, {56, 0}, {56, 1}, {57, 0}, {57, 0}, {57, 0}, {57, 0}, {57, 0}, {57, 0}, {57, 0}, {57, 0}, {57, 0}, {57, 0}, + {57, 0}, {57, 1}, {58, 0}, {58, 1}, {59, 0}, {59, 0}, {59, 0}, {59, 1}, {60, 0}, {60, 0}, {60, 0}, {60, 0}, {60, 0}, {60, 0}, {60, 0}, {60, 0}, {60, 1}, {61, 0}, {61, 0}, {61, 0}, + {61, 1}, {62, 0}, {62, 2}, {64, 0}, {64, 0}, {64, 0}, {64, 0}, {64, 0}, {64, 0}, {64, 0}, {64, 0}, {64, 0}, {64, 0}, {64, 0}, {64, 0}, {64, 1}, {65, 1}, {66, 1}, {67, 0}, {67, 1}, + {68, 0}, {68, 0}, {68, 0}, {68, 0}, {68, 0}, {68, 0}, {68, 0}, {68, 0}, {68, 6}, {74, 0}, {74, 1}, {75, 0}, {75, 0}, {75, 0}, {75, 0}, {75, 0}, {75, 0}, {75, 0}, {75, 0}, {75, 0}, + {75, 1}, {76, 0}, {76, 0}, {76, 0}, {76, 0}, {76, 0}, {76, 0}, {76, 0}, {76, 0}, {76, 0}, {76, 0}, {76, 0}, {76, 0}, {76, 0}, {76, 0}, {76, 0}, {76, 0}, {76, 0}, {76, 0}, {76, 0}, + {76, 0}, {76, 0}, {76, 0}, {76, 0}, {76, 0}, {76, 0}, {76, 0}, {76, 0}, {76, 0}, {76, 0}, {76, 0}, {76, 0}, {76, 0}, {76, 0}, {76, 2}, {78, 0}, {78, 0}, {78, 0}, {78, 1}, {79, 0}, + {79, 0}, {79, 1}, {80, 0}, {80, 0}, {80, 1}, {81, 0}, {81, 0}, {81, 1}, {82, 0}, {82, 0}, {82, 0}, {82, 0}, {82, 0}, {82, 0}, {82, 0}, {82, 0}, {82, 0}, {82, 0}, {82, 1}, {83, 0}, + {83, 0}, {83, 0}, {83, 0}, {83, 0}, {83, 0}, {83, 11}, {94, 0}, {94, 0}, {94, 0}, {94, 0}, {94, 0}, {94, 11}, {105, 106}, {211, 0}, {211, 0}, {211, 1}, {212, 0}, {212, 3}, {215, 1}, {216, 0}, + {216, 0}, {216, 0}, {216, 0}, {216, 0}, {216, 0}, {216, 0}, {216, 0}, {216, 0}, {216, 0}, {216, 0}, {216, 0}, {216, 0}, {216, 12}, {228, 0}, {228, 0}, {228, 0}, {228, 0}, {228, 0}, {228, 0}, {228, 0}, + {228, 0}, {228, 0}, {228, 2}, {230, 0}, {230, 0}, {230, 0}, {230, 0}, {230, 0}, {230, 0}, {230, 0}, {230, 0}, {230, 10}, +}; +extern const FX_WORD g_XFAElementChildrenData[] = { + XFA_ELEMENT_Extras, XFA_ELEMENT_SubformSet, XFA_ELEMENT_BreakBefore, XFA_ELEMENT_Subform, XFA_ELEMENT_BreakAfter, XFA_ELEMENT_AlwaysEmbed, XFA_ELEMENT_DefaultTypeface, XFA_ELEMENT_NeverEmbed, XFA_ELEMENT_Source, XFA_ELEMENT_Equate, + XFA_ELEMENT_EquateRange, XFA_ELEMENT_Ps, XFA_ELEMENT_Pcl, XFA_ELEMENT_Pdf, XFA_ELEMENT_Zpl, XFA_ELEMENT_LabelPrinter, XFA_ELEMENT_WebClient, XFA_ELEMENT_SubmitUrl, XFA_ELEMENT_Driver, XFA_ELEMENT_Typeface, + XFA_ELEMENT_SubjectDN, XFA_ELEMENT_Certificate, XFA_ELEMENT_SubformSet, XFA_ELEMENT_Area, XFA_ELEMENT_Field, XFA_ELEMENT_ExclGroup, XFA_ELEMENT_Subform, XFA_ELEMENT_Draw, XFA_ELEMENT_ExObject, XFA_ELEMENT_EncryptionMethod, + XFA_ELEMENT_Ref, XFA_ELEMENT_Event, XFA_ELEMENT_SetProperty, XFA_ELEMENT_BindItems, XFA_ELEMENT_Connect, XFA_ELEMENT_Pdf, XFA_ELEMENT_Destination, XFA_ELEMENT_Event, XFA_ELEMENT_SetProperty, XFA_ELEMENT_Field, + XFA_ELEMENT_Connect, XFA_ELEMENT_Agent, XFA_ELEMENT_PsMap, XFA_ELEMENT_SubformSet, XFA_ELEMENT_BreakBefore, XFA_ELEMENT_Event, XFA_ELEMENT_Area, XFA_ELEMENT_SetProperty, XFA_ELEMENT_Field, XFA_ELEMENT_ExclGroup, + XFA_ELEMENT_Subform, XFA_ELEMENT_Draw, XFA_ELEMENT_ExObject, XFA_ELEMENT_Proto, XFA_ELEMENT_Connect, XFA_ELEMENT_BreakAfter, XFA_ELEMENT_Locale, XFA_ELEMENT_Text, XFA_ELEMENT_Font, XFA_ELEMENT_Traverse, + XFA_ELEMENT_Map, XFA_ELEMENT_DigestMethod, XFA_ELEMENT_PageSet, XFA_ELEMENT_PageArea, XFA_ELEMENT_Encoding, XFA_ELEMENT_Subform, XFA_ELEMENT_SubmitUrl, XFA_ELEMENT_Certificate, XFA_ELEMENT_Area, XFA_ELEMENT_Field, + XFA_ELEMENT_ContentArea, XFA_ELEMENT_ExclGroup, XFA_ELEMENT_Subform, XFA_ELEMENT_Draw, XFA_ELEMENT_Oid, XFA_ELEMENT_Ref, XFA_ELEMENT_ExcludeNS, XFA_ELEMENT_Transform, XFA_ELEMENT_SetProperty, XFA_ELEMENT_Message, + XFA_ELEMENT_Log, XFA_ELEMENT_Reason, XFA_ELEMENT_Area, XFA_ELEMENT_Text, XFA_ELEMENT_Time, XFA_ELEMENT_DateTime, XFA_ELEMENT_Image, XFA_ELEMENT_Decimal, XFA_ELEMENT_Boolean, XFA_ELEMENT_Integer, + XFA_ELEMENT_ExData, XFA_ELEMENT_Date, XFA_ELEMENT_Float, XFA_ELEMENT_ExObject, XFA_ELEMENT_Text, XFA_ELEMENT_Time, XFA_ELEMENT_DateTime, XFA_ELEMENT_Image, XFA_ELEMENT_Decimal, XFA_ELEMENT_Boolean, + XFA_ELEMENT_Integer, XFA_ELEMENT_ExData, XFA_ELEMENT_Date, XFA_ELEMENT_Float, XFA_ELEMENT_Extras, XFA_ELEMENT_Ui, XFA_ELEMENT_SubformSet, XFA_ELEMENT_Break, XFA_ELEMENT_CheckButton, XFA_ELEMENT_Arc, + XFA_ELEMENT_Mdp, XFA_ELEMENT_BreakBefore, XFA_ELEMENT_Oid, XFA_ELEMENT_Ref, XFA_ELEMENT_Margin, XFA_ELEMENT_KeyUsage, XFA_ELEMENT_ChoiceList, XFA_ELEMENT_Para, XFA_ELEMENT_Filter, XFA_ELEMENT_Encoding, + XFA_ELEMENT_Event, XFA_ELEMENT_DefaultUi, XFA_ELEMENT_Barcode, XFA_ELEMENT_SubjectDNs, XFA_ELEMENT_Issuers, XFA_ELEMENT_Button, XFA_ELEMENT_Format, XFA_ELEMENT_Border, XFA_ELEMENT_Area, XFA_ELEMENT_Hyphenation, + XFA_ELEMENT_Text, XFA_ELEMENT_Time, XFA_ELEMENT_Certificates, XFA_ELEMENT_SetProperty, XFA_ELEMENT_DateTime, XFA_ELEMENT_Comb, XFA_ELEMENT_Pattern, XFA_ELEMENT_Field, XFA_ELEMENT_ContentArea, XFA_ELEMENT_Solid, + XFA_ELEMENT_Edge, XFA_ELEMENT_Stipple, XFA_ELEMENT_ExclGroup, XFA_ELEMENT_ToolTip, XFA_ELEMENT_Reason, XFA_ELEMENT_Execute, XFA_ELEMENT_DateTimeEdit, XFA_ELEMENT_Image, XFA_ELEMENT_TimeStamp, XFA_ELEMENT_Decimal, + XFA_ELEMENT_Subform, XFA_ELEMENT_Handler, XFA_ELEMENT_Boolean, XFA_ELEMENT_Message, XFA_ELEMENT_Assist, XFA_ELEMENT_Picture, XFA_ELEMENT_Traversal, XFA_ELEMENT_Corner, XFA_ELEMENT_Color, XFA_ELEMENT_Keep, + XFA_ELEMENT_ImageEdit, XFA_ELEMENT_Validate, XFA_ELEMENT_DigestMethods, XFA_ELEMENT_PageSet, XFA_ELEMENT_Integer, XFA_ELEMENT_Traverse, XFA_ELEMENT_Encodings, XFA_ELEMENT_Signing, XFA_ELEMENT_Script, XFA_ELEMENT_PasswordEdit, + XFA_ELEMENT_NumericEdit, XFA_ELEMENT_PageArea, XFA_ELEMENT_Oids, XFA_ELEMENT_Signature, XFA_ELEMENT_Caption, XFA_ELEMENT_ExData, XFA_ELEMENT_Manifest, XFA_ELEMENT_Overflow, XFA_ELEMENT_Linear, XFA_ELEMENT_DigestMethod, + XFA_ELEMENT_Medium, XFA_ELEMENT_TextEdit, XFA_ELEMENT_SignData, XFA_ELEMENT_Rectangle, XFA_ELEMENT_Date, XFA_ELEMENT_Desc, XFA_ELEMENT_Encrypt, XFA_ELEMENT_Draw, XFA_ELEMENT_Speak, XFA_ELEMENT_Reasons, + XFA_ELEMENT_AppearanceFilter, XFA_ELEMENT_Fill, XFA_ELEMENT_Font, XFA_ELEMENT_Certificate, XFA_ELEMENT_Float, XFA_ELEMENT_Value, XFA_ELEMENT_Bookend, XFA_ELEMENT_ExObject, XFA_ELEMENT_BindItems, XFA_ELEMENT_Calculate, + XFA_ELEMENT_Extras, XFA_ELEMENT_Connect, XFA_ELEMENT_Submit, XFA_ELEMENT_SubjectDN, XFA_ELEMENT_Radial, XFA_ELEMENT_Variables, XFA_ELEMENT_LockDocument, XFA_ELEMENT_BreakAfter, XFA_ELEMENT_Line, XFA_ELEMENT_Occur, + XFA_ELEMENT_Items, XFA_ELEMENT_Extras, XFA_ELEMENT_WsdlConnection, XFA_ELEMENT_XsdConnection, XFA_ELEMENT_XmlConnection, XFA_ELEMENT_SignData, XFA_ELEMENT_Text, XFA_ELEMENT_Time, XFA_ELEMENT_DateTime, XFA_ELEMENT_Image, + XFA_ELEMENT_Decimal, XFA_ELEMENT_Boolean, XFA_ELEMENT_Integer, XFA_ELEMENT_Script, XFA_ELEMENT_ExData, XFA_ELEMENT_Manifest, XFA_ELEMENT_Date, XFA_ELEMENT_Float, XFA_ELEMENT_Command, XFA_ELEMENT_Bind, + XFA_ELEMENT_Text, XFA_ELEMENT_Time, XFA_ELEMENT_DateTime, XFA_ELEMENT_Image, XFA_ELEMENT_Decimal, XFA_ELEMENT_Boolean, XFA_ELEMENT_Integer, XFA_ELEMENT_ExData, XFA_ELEMENT_Date, XFA_ELEMENT_Float, +}; +extern const XFA_ELEMENTHIERARCHY g_XFAElementAttributeIndex[] = { + {0, 3}, {3, 2}, {5, 3}, {8, 10}, {18, 2}, {20, 6}, {26, 2}, {28, 1}, {29, 13}, {42, 2}, {44, 1}, {45, 2}, {47, 2}, {49, 7}, {56, 0}, {56, 4}, {60, 2}, {62, 7}, {69, 0}, {69, 0}, + {69, 2}, {71, 2}, {73, 8}, {81, 5}, {86, 8}, {94, 4}, {98, 3}, {101, 3}, {104, 3}, {107, 6}, {113, 2}, {115, 2}, {117, 2}, {119, 2}, {121, 3}, {124, 2}, {126, 7}, {133, 13}, {146, 2}, {148, 6}, + {154, 2}, {156, 3}, {159, 1}, {160, 17}, {177, 2}, {179, 2}, {181, 6}, {187, 2}, {189, 2}, {191, 3}, {194, 7}, {201, 2}, {203, 3}, {206, 0}, {206, 21}, {227, 1}, {228, 3}, {231, 2}, {233, 0}, {233, 2}, + {235, 2}, {237, 6}, {243, 0}, {243, 4}, {247, 4}, {251, 0}, {251, 2}, {253, 2}, {255, 0}, {255, 0}, {255, 2}, {257, 2}, {259, 4}, {263, 3}, {266, 7}, {273, 10}, {283, 9}, {292, 6}, {298, 4}, {302, 2}, + {304, 2}, {306, 6}, {312, 4}, {316, 3}, {319, 2}, {321, 2}, {323, 4}, {327, 4}, {331, 4}, {335, 4}, {339, 2}, {341, 2}, {343, 2}, {345, 22}, {367, 3}, {370, 2}, {372, 2}, {374, 2}, {376, 9}, {385, 0}, + {385, 4}, {389, 3}, {392, 0}, {392, 2}, {394, 7}, {401, 4}, {405, 2}, {407, 4}, {411, 0}, {411, 21}, {432, 4}, {436, 3}, {439, 4}, {443, 6}, {449, 2}, {451, 5}, {456, 2}, {458, 8}, {466, 1}, {467, 2}, + {469, 2}, {471, 5}, {476, 0}, {476, 2}, {478, 2}, {480, 6}, {486, 26}, {512, 4}, {516, 2}, {518, 2}, {520, 4}, {524, 0}, {524, 2}, {526, 2}, {528, 2}, {530, 2}, {532, 5}, {537, 2}, {539, 3}, {542, 2}, + {544, 4}, {548, 5}, {553, 2}, {555, 0}, {555, 2}, {557, 4}, {561, 5}, {566, 3}, {569, 2}, {571, 3}, {574, 0}, {574, 2}, {576, 9}, {585, 2}, {587, 5}, {592, 6}, {598, 5}, {603, 4}, {607, 4}, {611, 8}, + {619, 4}, {623, 0}, {623, 7}, {630, 4}, {634, 4}, {638, 5}, {643, 2}, {645, 2}, {647, 4}, {651, 4}, {655, 2}, {657, 2}, {659, 1}, {660, 2}, {662, 5}, {667, 4}, {671, 3}, {674, 2}, {676, 2}, {678, 4}, + {682, 0}, {682, 9}, {691, 2}, {693, 2}, {695, 5}, {700, 4}, {704, 3}, {707, 2}, {709, 10}, {719, 2}, {721, 4}, {725, 4}, {729, 2}, {731, 6}, {737, 2}, {739, 2}, {741, 9}, {750, 1}, {751, 4}, {755, 3}, + {758, 5}, {763, 6}, {769, 4}, {773, 1}, {774, 4}, {778, 0}, {778, 3}, {781, 1}, {782, 5}, {787, 10}, {797, 7}, {804, 3}, {807, 2}, {809, 5}, {814, 2}, {816, 0}, {816, 2}, {818, 2}, {820, 2}, {822, 6}, + {828, 2}, {830, 1}, {831, 2}, {833, 2}, {835, 8}, {843, 2}, {845, 4}, {849, 4}, {853, 4}, {857, 2}, {859, 2}, {861, 2}, {863, 3}, {866, 2}, {868, 2}, {870, 4}, {874, 3}, {877, 5}, {882, 20}, {902, 2}, + {904, 0}, {904, 2}, {906, 6}, {912, 1}, {913, 2}, {915, 1}, {916, 2}, {918, 4}, {922, 2}, {924, 2}, {926, 4}, {930, 4}, {934, 20}, {954, 1}, {955, 2}, {957, 4}, {961, 4}, {965, 2}, {967, 2}, {969, 4}, + {973, 2}, {975, 0}, {975, 2}, {977, 5}, {982, 5}, {987, 8}, {995, 2}, {997, 2}, {999, 4}, {1003, 4}, {1007, 2}, {1009, 4}, {1013, 0}, {1013, 1}, {1014, 2}, {1016, 9}, {1025, 2}, {1027, 0}, {1027, 8}, {1035, 2}, + {1037, 2}, {1039, 0}, {1039, 4}, {1043, 2}, {1045, 0}, {1045, 2}, {1047, 3}, {1050, 2}, {1052, 5}, {1057, 2}, {1059, 2}, {1061, 4}, {1065, 3}, {1068, 0}, {1068, 4}, {1072, 2}, {1074, 2}, {1076, 3}, {1079, 4}, {1083, 8}, + {1091, 5}, {1096, 0}, {1096, 4}, {1100, 6}, {1106, 2}, {1108, 1}, {1109, 2}, {1111, 2}, {1113, 2}, {1115, 1}, {1116, 2}, {1118, 7}, +}; +extern const FX_BYTE g_XFAElementAttributeData[] = { + XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, + XFA_ATTRIBUTE_Max, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_EofAction, XFA_ATTRIBUTE_CursorType, XFA_ATTRIBUTE_LockType, XFA_ATTRIBUTE_BofAction, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_CursorLocation, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, + XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Relation, XFA_ATTRIBUTE_Relevant, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Id, + XFA_ATTRIBUTE_BeforeTarget, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_OverflowTarget, XFA_ATTRIBUTE_OverflowLeader, XFA_ATTRIBUTE_OverflowTrailer, XFA_ATTRIBUTE_StartNew, XFA_ATTRIBUTE_BookendTrailer, XFA_ATTRIBUTE_After, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_BookendLeader, + XFA_ATTRIBUTE_AfterTarget, XFA_ATTRIBUTE_Before, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, + XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_AllowNeutral, XFA_ATTRIBUTE_Mark, XFA_ATTRIBUTE_Shape, XFA_ATTRIBUTE_Size, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, + XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_StartAngle, XFA_ATTRIBUTE_SweepAngle, XFA_ATTRIBUTE_Circular, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Hand, XFA_ATTRIBUTE_Desc, + XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Bind, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_From, + XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_SignatureType, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Permissions, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_StartNew, XFA_ATTRIBUTE_Trailer, + XFA_ATTRIBUTE_TargetType, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Target, XFA_ATTRIBUTE_Leader, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Desc, + XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, + XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_TimeStamp, XFA_ATTRIBUTE_Uuid, XFA_ATTRIBUTE_Desc, + XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_LeftInset, XFA_ATTRIBUTE_BottomInset, + XFA_ATTRIBUTE_TopInset, XFA_ATTRIBUTE_RightInset, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_NonRepudiation, XFA_ATTRIBUTE_EncipherOnly, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTE_DigitalSignature, XFA_ATTRIBUTE_CrlSign, + XFA_ATTRIBUTE_KeyAgreement, XFA_ATTRIBUTE_KeyEncipherment, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_DataEncipherment, XFA_ATTRIBUTE_KeyCertSign, XFA_ATTRIBUTE_DecipherOnly, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, + XFA_ATTRIBUTE_Open, XFA_ATTRIBUTE_CommitOn, XFA_ATTRIBUTE_TextEntry, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Name, + XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_HAlign, XFA_ATTRIBUTE_TextIndent, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Widows, XFA_ATTRIBUTE_MarginRight, XFA_ATTRIBUTE_MarginLeft, XFA_ATTRIBUTE_RadixOffset, XFA_ATTRIBUTE_Preserve, XFA_ATTRIBUTE_SpaceBelow, + XFA_ATTRIBUTE_VAlign, XFA_ATTRIBUTE_TabDefault, XFA_ATTRIBUTE_TabStops, XFA_ATTRIBUTE_Orphans, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_LineHeight, XFA_ATTRIBUTE_SpaceAbove, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, + XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Version, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_AddRevocationInfo, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, + XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Ref, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Listen, XFA_ATTRIBUTE_Usehref, + XFA_ATTRIBUTE_Activity, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_DataRowCount, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_DataPrep, + XFA_ATTRIBUTE_Type, XFA_ATTRIBUTE_TextLocation, XFA_ATTRIBUTE_ModuleWidth, XFA_ATTRIBUTE_PrintCheckDigit, XFA_ATTRIBUTE_ModuleHeight, XFA_ATTRIBUTE_StartChar, XFA_ATTRIBUTE_Truncate, XFA_ATTRIBUTE_WideNarrowRatio, XFA_ATTRIBUTE_ErrorCorrectionLevel, XFA_ATTRIBUTE_UpsMode, + XFA_ATTRIBUTE_Checksum, XFA_ATTRIBUTE_CharEncoding, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_DataColumnCount, XFA_ATTRIBUTE_RowColumnRatio, XFA_ATTRIBUTE_DataLength, XFA_ATTRIBUTE_EndChar, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Format, XFA_ATTRIBUTE_Desc, + XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, + XFA_ATTRIBUTE_Output, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Input, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Type, + XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_DataDescription, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, + XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Highlight, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Break, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Presence, + XFA_ATTRIBUTE_Relevant, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Hand, XFA_ATTRIBUTE_X, XFA_ATTRIBUTE_Y, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Level, XFA_ATTRIBUTE_Relevant, + XFA_ATTRIBUTE_ColSpan, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_WordCharacterCount, XFA_ATTRIBUTE_Hyphenate, XFA_ATTRIBUTE_ExcludeInitialCap, XFA_ATTRIBUTE_PushCharacterCount, XFA_ATTRIBUTE_RemainCharacterCount, + XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_ExcludeAllCaps, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Rid, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_MaxChars, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, + XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Url, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_CredentialServerPolicy, + XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_UrlPolicy, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Ref, XFA_ATTRIBUTE_Connection, XFA_ATTRIBUTE_Target, XFA_ATTRIBUTE_Desc, + XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_X, XFA_ATTRIBUTE_Y, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, + XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_NumberOfCells, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, + XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_H, XFA_ATTRIBUTE_W, XFA_ATTRIBUTE_X, XFA_ATTRIBUTE_Y, XFA_ATTRIBUTE_Id, + XFA_ATTRIBUTE_HAlign, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Access, XFA_ATTRIBUTE_Rotate, XFA_ATTRIBUTE_Presence, XFA_ATTRIBUTE_VAlign, XFA_ATTRIBUTE_MaxH, XFA_ATTRIBUTE_MaxW, XFA_ATTRIBUTE_MinH, + XFA_ATTRIBUTE_MinW, XFA_ATTRIBUTE_Relevant, XFA_ATTRIBUTE_ColSpan, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Locale, XFA_ATTRIBUTE_AnchorType, XFA_ATTRIBUTE_AccessKey, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, + XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_H, XFA_ATTRIBUTE_W, XFA_ATTRIBUTE_X, XFA_ATTRIBUTE_Y, + XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Relevant, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, + XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Cap, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Stroke, XFA_ATTRIBUTE_Presence, XFA_ATTRIBUTE_Thickness, + XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Rate, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_SourceBelow, XFA_ATTRIBUTE_OutputBelow, XFA_ATTRIBUTE_SourceAbove, + XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_H, XFA_ATTRIBUTE_W, XFA_ATTRIBUTE_X, XFA_ATTRIBUTE_Y, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_HAlign, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Access, + XFA_ATTRIBUTE_Presence, XFA_ATTRIBUTE_VAlign, XFA_ATTRIBUTE_MaxH, XFA_ATTRIBUTE_MaxW, XFA_ATTRIBUTE_MinH, XFA_ATTRIBUTE_MinW, XFA_ATTRIBUTE_Layout, XFA_ATTRIBUTE_Relevant, XFA_ATTRIBUTE_ColSpan, XFA_ATTRIBUTE_Usehref, + XFA_ATTRIBUTE_AnchorType, XFA_ATTRIBUTE_AccessKey, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Rid, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Scope, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, + XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Connection, XFA_ATTRIBUTE_RunAt, XFA_ATTRIBUTE_ExecuteType, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, + XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Picker, XFA_ATTRIBUTE_HScrollPolicy, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, + XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_ContentType, XFA_ATTRIBUTE_TransferEncoding, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Aspect, XFA_ATTRIBUTE_Href, XFA_ATTRIBUTE_Value, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, + XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTE_Server, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, + XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_FracDigits, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_LeadDigits, XFA_ATTRIBUTE_H, XFA_ATTRIBUTE_W, XFA_ATTRIBUTE_X, XFA_ATTRIBUTE_Y, + XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_HAlign, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_AllowMacro, XFA_ATTRIBUTE_ColumnWidths, XFA_ATTRIBUTE_Access, XFA_ATTRIBUTE_Presence, XFA_ATTRIBUTE_VAlign, XFA_ATTRIBUTE_MaxH, + XFA_ATTRIBUTE_MaxW, XFA_ATTRIBUTE_MinH, XFA_ATTRIBUTE_MinW, XFA_ATTRIBUTE_Layout, XFA_ATTRIBUTE_Relevant, XFA_ATTRIBUTE_MergeMode, XFA_ATTRIBUTE_ColSpan, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Locale, XFA_ATTRIBUTE_AnchorType, + XFA_ATTRIBUTE_RestoreState, XFA_ATTRIBUTE_Scope, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, + XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, + XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Timeout, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Mode, + XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, + XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Role, + XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, + XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Stroke, XFA_ATTRIBUTE_Presence, + XFA_ATTRIBUTE_Inverted, XFA_ATTRIBUTE_Thickness, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Join, XFA_ATTRIBUTE_Radius, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_CSpace, + XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Value, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Next, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Previous, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Intact, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, + XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_CommandType, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, + XFA_ATTRIBUTE_Data, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_ScriptTest, XFA_ATTRIBUTE_NullTest, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_FormatTest, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, + XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Relation, XFA_ATTRIBUTE_Relevant, XFA_ATTRIBUTE_DuplexImposition, XFA_ATTRIBUTE_Usehref, + XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_To, XFA_ATTRIBUTE_Force, + XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_From, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, + XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Value, + XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_DataDescription, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Ref, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Operation, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Type, + XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_BaseProfile, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, + XFA_ATTRIBUTE_Type, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_ContentType, XFA_ATTRIBUTE_RunAt, XFA_ATTRIBUTE_Binding, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, + XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_PasswordChar, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_HScrollPolicy, + XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_HScrollPolicy, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, + XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_PagePosition, XFA_ATTRIBUTE_OddOrEven, XFA_ATTRIBUTE_Relevant, XFA_ATTRIBUTE_InitialNumber, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Numbered, XFA_ATTRIBUTE_BlankOrNotBlank, XFA_ATTRIBUTE_Desc, + XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, + XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Reserve, XFA_ATTRIBUTE_Presence, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Placement, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, + XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Rid, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_ContentType, XFA_ATTRIBUTE_TransferEncoding, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_MaxLength, XFA_ATTRIBUTE_Href, + XFA_ATTRIBUTE_Abbr, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_WritingScript, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, + XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Action, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Trailer, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Target, XFA_ATTRIBUTE_Leader, XFA_ATTRIBUTE_Id, + XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, + XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_To, XFA_ATTRIBUTE_UnicodeRange, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_From, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_TrayOut, XFA_ATTRIBUTE_Use, + XFA_ATTRIBUTE_Orientation, XFA_ATTRIBUTE_ImagingBBox, XFA_ATTRIBUTE_Short, XFA_ATTRIBUTE_TrayIn, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Stock, XFA_ATTRIBUTE_Long, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_VScrollPolicy, XFA_ATTRIBUTE_Use, + XFA_ATTRIBUTE_AllowRichText, XFA_ATTRIBUTE_MultiLine, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_HScrollPolicy, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_MaxEntries, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Name, + XFA_ATTRIBUTE_ContentType, XFA_ATTRIBUTE_Contains, XFA_ATTRIBUTE_Value, XFA_ATTRIBUTE_IsNull, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_DataDescription, + XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Ref, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Operation, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Target, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, + XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Ref, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_ContentType, + XFA_ATTRIBUTE_TransferEncoding, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Match, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, + XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Hand, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, + XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, + XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, + XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_H, XFA_ATTRIBUTE_W, XFA_ATTRIBUTE_X, XFA_ATTRIBUTE_Y, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_HAlign, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, + XFA_ATTRIBUTE_Rotate, XFA_ATTRIBUTE_Presence, XFA_ATTRIBUTE_VAlign, XFA_ATTRIBUTE_MaxH, XFA_ATTRIBUTE_MaxW, XFA_ATTRIBUTE_MinH, XFA_ATTRIBUTE_MinW, XFA_ATTRIBUTE_Relevant, XFA_ATTRIBUTE_ColSpan, XFA_ATTRIBUTE_Usehref, + XFA_ATTRIBUTE_Locale, XFA_ATTRIBUTE_AnchorType, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Rid, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Priority, + XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Disable, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Value, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, + XFA_ATTRIBUTE_Type, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTE_Usehref, + XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Presence, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_LineThrough, XFA_ATTRIBUTE_Typeface, XFA_ATTRIBUTE_FontHorizontalScale, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_KerningMode, + XFA_ATTRIBUTE_Underline, XFA_ATTRIBUTE_BaselineShift, XFA_ATTRIBUTE_OverlinePeriod, XFA_ATTRIBUTE_LetterSpacing, XFA_ATTRIBUTE_LineThroughPeriod, XFA_ATTRIBUTE_FontVerticalScale, XFA_ATTRIBUTE_PsName, XFA_ATTRIBUTE_Size, XFA_ATTRIBUTE_Posture, XFA_ATTRIBUTE_Usehref, + XFA_ATTRIBUTE_Weight, XFA_ATTRIBUTE_UnderlinePeriod, XFA_ATTRIBUTE_Overline, XFA_ATTRIBUTE_GenericFamily, XFA_ATTRIBUTE_Checksum, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, + XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, + XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Relevant, + XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Override, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Trailer, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Leader, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, + XFA_ATTRIBUTE_CodeType, XFA_ATTRIBUTE_Archive, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_CodeBase, XFA_ATTRIBUTE_ClassId, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Ref, + XFA_ATTRIBUTE_Connection, XFA_ATTRIBUTE_LabelRef, XFA_ATTRIBUTE_ValueRef, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Override, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, + XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Value, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Ref, XFA_ATTRIBUTE_Use, + XFA_ATTRIBUTE_Timeout, XFA_ATTRIBUTE_Connection, XFA_ATTRIBUTE_Usage, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_DelayedOpen, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Format, + XFA_ATTRIBUTE_EmbedPDF, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Target, XFA_ATTRIBUTE_TextEncoding, XFA_ATTRIBUTE_XdpContent, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, + XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, + XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Delimiter, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, + XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, + XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Ref, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, + XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_StartNew, XFA_ATTRIBUTE_Trailer, XFA_ATTRIBUTE_TargetType, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Target, + XFA_ATTRIBUTE_Leader, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Slope, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Hand, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Usehref, + XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Max, XFA_ATTRIBUTE_Min, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Initial, XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Abbr, XFA_ATTRIBUTE_Desc, + XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTE_Id, XFA_ATTRIBUTE_Name, + XFA_ATTRIBUTE_Ref, XFA_ATTRIBUTE_Use, XFA_ATTRIBUTE_Presence, XFA_ATTRIBUTE_Save, XFA_ATTRIBUTE_Usehref, +}; +extern const XFA_PACKETINFO g_XFAPacketData[] = { + {0x0, NULL, XFA_XDPPACKET_USER, NULL, XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTMANY}, + {0x811929d, (FX_LPCWSTR)L"sourceSet", XFA_XDPPACKET_SourceSet, (FX_LPCWSTR)L"http://www.xfa.org/schema/xfa-source-set/", XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE}, + {0xb843dba, (FX_LPCWSTR)L"pdf", XFA_XDPPACKET_Pdf, (FX_LPCWSTR)L"http://ns.adobe.com/xdp/pdf/", XFA_XDPPACKET_FLAGS_COMPLETEMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE}, + {0xc56afbf, (FX_LPCWSTR)L"xdc", XFA_XDPPACKET_Xdc, (FX_LPCWSTR)L"http://www.xfa.org/schema/xdc/", XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE}, + {0xc56afcc, (FX_LPCWSTR)L"xdp", XFA_XDPPACKET_XDP, (FX_LPCWSTR)L"http://ns.adobe.com/xdp/", XFA_XDPPACKET_FLAGS_COMPLETEMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE}, + {0x132a8fbc, (FX_LPCWSTR)L"xmpmeta", XFA_XDPPACKET_Xmpmeta, (FX_LPCWSTR)L"http://ns.adobe.com/xmpmeta/", XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTMANY}, + {0x48d004a8, (FX_LPCWSTR)L"xfdf", XFA_XDPPACKET_Xfdf, (FX_LPCWSTR)L"http://ns.adobe.com/xfdf/", XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE}, + {0x4e1e39b6, (FX_LPCWSTR)L"config", XFA_XDPPACKET_Config, (FX_LPCWSTR)L"http://www.xfa.org/schema/xci/", XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE}, + {0x5473b6dc, (FX_LPCWSTR)L"localeSet", XFA_XDPPACKET_LocaleSet, (FX_LPCWSTR)L"http://www.xfa.org/schema/xfa-locale-set/", XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE}, + {0x6038580a, (FX_LPCWSTR)L"stylesheet", XFA_XDPPACKET_Stylesheet, (FX_LPCWSTR)L"http://www.w3.org/1999/XSL/Transform", XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTMANY}, + {0x803550fc, (FX_LPCWSTR)L"template", XFA_XDPPACKET_Template, (FX_LPCWSTR)L"http://www.xfa.org/schema/xfa-template/", XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE}, + {0x8b036f32, (FX_LPCWSTR)L"signature", XFA_XDPPACKET_Signature, (FX_LPCWSTR)L"http://www.w3.org/2000/09/xmldsig#", XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE}, + {0x99b95079, (FX_LPCWSTR)L"datasets", XFA_XDPPACKET_Datasets, (FX_LPCWSTR)L"http://www.xfa.org/schema/xfa-data/", XFA_XDPPACKET_FLAGS_PREFIXMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE}, + {0xcd309ff4, (FX_LPCWSTR)L"form", XFA_XDPPACKET_Form, (FX_LPCWSTR)L"http://www.xfa.org/schema/xfa-form/", XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE}, + {0xe14c801c, (FX_LPCWSTR)L"connectionSet", XFA_XDPPACKET_ConnectionSet, (FX_LPCWSTR)L"http://www.xfa.org/schema/xfa-connection-set/", XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE}, +}; +extern const FX_INT32 g_iXFAPacketCount = sizeof(g_XFAPacketData) / sizeof(XFA_PACKETINFO); +extern const XFA_SCRIPTHIERARCHY g_XFAScriptIndex[] = { + {0, 0, 0, 2, 316}, {0, 0, 2, 2, 316}, {0, 0, 4, 2, 316}, {0, 0, 6, 8, 316}, {0, 0, 14, 4, 316}, {0, 0, 18, 5, 317}, {0, 0, 23, 2, 316}, {0, 0, 25, 1, 316}, {0, 0, 26, 12, 316}, {0, 0, 38, 2, 316}, {0, 0, 40, 1, 316}, {0, 0, 41, 3, 316}, {0, 0, 44, 2, 316}, {0, 0, 46, 6, 316}, {0, 0, 52, 0, 316}, {0, 0, 52, 2, 319}, {0, 0, 54, 2, 316}, {0, 0, 56, 6, 316}, {0, 0, 62, 0, 316}, {0, 0, 62, 0, 316}, + {0, 0, 62, 2, 316}, {0, 0, 64, 2, 316}, {0, 0, 66, 6, 316}, {0, 0, 72, 4, 316}, {0, 0, 76, 7, 316}, {0, 0, 83, 2, 320}, {0, 0, 85, 3, 316}, {0, 0, 88, 3, 316}, {0, 0, 91, 2, 320}, {0, 0, 93, 6, 320}, {0, 0, 99, 4, 316}, {0, 0, 103, 2, 316}, {0, 0, 105, 3, 319}, {0, 0, 108, 4, 316}, {0, 0, 112, 3, 316}, {0, 0, 115, 2, 316}, {0, 0, 117, 6, 316}, {0, 0, 123, 12, 316}, {0, 0, 135, 2, 316}, {0, 0, 137, 5, 316}, + {0, 0, 142, 2, 316}, {0, 0, 144, 3, 316}, {0, 0, 147, 1, 316}, {0, 0, 148, 14, 316}, {0, 0, 162, 2, 316}, {0, 0, 164, 2, 316}, {0, 0, 166, 3, 316}, {0, 0, 169, 2, 316}, {0, 0, 171, 2, 316}, {0, 0, 173, 2, 316}, {0, 0, 175, 4, 316}, {0, 0, 179, 2, 316}, {0, 0, 181, 2, 316}, {0, 0, 183, 0, 319}, {0, 0, 183, 20, 316}, {0, 0, 203, 1, 316}, {0, 0, 204, 3, 316}, {0, 0, 207, 2, 316}, {0, 0, 209, 0, 316}, {0, 0, 209, 2, 316}, + {0, 0, 211, 2, 316}, {0, 0, 213, 4, 320}, {0, 0, 217, 0, 316}, {0, 0, 217, 1, 316}, {0, 0, 218, 3, 316}, {0, 4, 221, 0, 312}, {4, 1, 221, 1, 316}, {5, 0, 222, 2, 316}, {5, 1, 224, 3, -1}, {6, 0, 227, 0, 316}, {6, 0, 227, 2, 316}, {6, 0, 229, 2, 316}, {6, 0, 231, 3, 316}, {6, 0, 234, 2, 316}, {6, 0, 236, 6, 316}, {6, 0, 242, 10, 317}, {6, 0, 252, 9, 316}, {6, 0, 261, 5, 318}, {6, 0, 266, 4, 318}, {6, 0, 270, 2, 316}, + {6, 0, 272, 2, 316}, {6, 0, 274, 5, 316}, {6, 0, 279, 3, 316}, {6, 0, 282, 2, 316}, {6, 0, 284, 2, 316}, {6, 0, 286, 2, 316}, {6, 0, 288, 2, 316}, {6, 0, 290, 4, 316}, {6, 0, 294, 3, 316}, {6, 0, 297, 3, 316}, {6, 0, 300, 2, 316}, {6, 0, 302, 2, 316}, {6, 0, 304, 2, 316}, {6, 13, 306, 36, 317}, {19, 0, 342, 3, 316}, {19, 0, 345, 2, 316}, {19, 0, 347, 2, 316}, {19, 0, 349, 2, 316}, {19, 0, 351, 7, 317}, {19, 2, 358, 16, 312}, + {21, 0, 374, 2, 320}, {21, 0, 376, 2, 316}, {21, 0, 378, 0, 316}, {21, 0, 378, 2, 316}, {21, 0, 380, 6, 316}, {21, 0, 386, 3, 316}, {21, 0, 389, 2, 316}, {21, 0, 391, 4, 316}, {21, 0, 395, 0, 316}, {21, 5, 395, 30, 316}, {26, 0, 425, 2, 320}, {26, 0, 427, 3, 316}, {26, 0, 430, 2, 320}, {26, 0, 432, 5, 316}, {26, 0, 437, 2, 316}, {26, 0, 439, 3, 316}, {26, 0, 442, 2, 316}, {26, 0, 444, 8, 316}, {26, 0, 452, 1, 316}, {26, 0, 453, 2, 316}, + {26, 0, 455, 2, 316}, {26, 0, 457, 4, 316}, {26, 0, 461, 0, 316}, {26, 0, 461, 2, 316}, {26, 0, 463, 2, 316}, {26, 0, 465, 6, 318}, {26, 5, 471, 31, 317}, {31, 0, 502, 2, 320}, {31, 0, 504, 2, 316}, {31, 0, 506, 2, 316}, {31, 0, 508, 4, 320}, {31, 16, 512, 14, 312}, {47, 0, 526, 2, 316}, {47, 0, 528, 2, 316}, {47, 0, 530, 2, 316}, {47, 0, 532, 2, 316}, {47, 0, 534, 3, 316}, {47, 0, 537, 2, 316}, {47, 0, 539, 3, 316}, {47, 0, 542, 3, 316}, + {47, 0, 545, 4, 318}, {47, 0, 549, 4, 316}, {47, 0, 553, 2, 316}, {47, 0, 555, 0, 316}, {47, 0, 555, 2, 316}, {47, 0, 557, 3, 316}, {47, 0, 560, 6, 316}, {47, 0, 566, 2, 316}, {47, 0, 568, 2, 316}, {47, 0, 570, 3, 316}, {47, 19, 573, 1, 312}, {66, 0, 574, 2, 316}, {66, 0, 576, 8, 316}, {66, 0, 584, 2, 316}, {66, 0, 586, 4, 316}, {66, 0, 590, 5, 316}, {66, 0, 595, 3, 316}, {66, 0, 598, 2, 320}, {66, 0, 600, 3, 316}, {66, 0, 603, 7, 316}, + {66, 0, 610, 3, 316}, {66, 0, 613, 0, 316}, {66, 0, 613, 4, 317}, {66, 0, 617, 4, 318}, {66, 0, 621, 2, 320}, {66, 0, 623, 5, 316}, {66, 0, 628, 2, 316}, {66, 0, 630, 2, 316}, {66, 0, 632, 2, 320}, {66, 0, 634, 2, 320}, {66, 0, 636, 4, 316}, {66, 0, 640, 2, 316}, {66, 0, 642, 1, 316}, {66, 0, 643, 1, 316}, {66, 0, 644, 4, 316}, {66, 0, 648, 3, 316}, {66, 7, 651, 2, 319}, {73, 0, 653, 2, 316}, {73, 0, 655, 2, 316}, {73, 0, 657, 3, 316}, + {73, 4, 660, 4, 312}, {77, 0, 664, 10, 316}, {77, 0, 674, 2, 316}, {77, 0, 676, 4, 316}, {77, 0, 680, 4, 316}, {77, 0, 684, 3, 316}, {77, 0, 687, 2, 316}, {77, 0, 689, 2, 316}, {77, 0, 691, 8, 317}, {77, 0, 699, 3, 316}, {77, 0, 702, 3, 316}, {77, 0, 705, 2, 316}, {77, 0, 707, 2, 316}, {77, 0, 709, 5, 316}, {77, 0, 714, 4, 316}, {77, 0, 718, 2, 316}, {77, 0, 720, 8, 318}, {77, 0, 728, 1, 316}, {77, 0, 729, 2, 320}, {77, 0, 731, 3, 316}, + {77, 1, 734, 4, 316}, {78, 0, 738, 5, 316}, {78, 0, 743, 3, 316}, {78, 0, 746, 1, 316}, {78, 0, 747, 2, 320}, {78, 0, 749, 0, 313}, {78, 0, 749, 2, 316}, {78, 5, 751, 3, 316}, {83, 0, 754, 5, 316}, {83, 0, 759, 7, 316}, {83, 0, 766, 6, 316}, {83, 0, 772, 3, 316}, {83, 0, 775, 2, 316}, {83, 0, 777, 5, 316}, {83, 0, 782, 2, 316}, {83, 0, 784, 0, 314}, {83, 0, 784, 2, 316}, {83, 0, 786, 1, 316}, {83, 0, 787, 2, 316}, {83, 0, 789, 5, 316}, + {83, 0, 794, 2, 316}, {83, 0, 796, 1, 316}, {83, 0, 797, 2, 316}, {83, 0, 799, 2, 316}, {83, 0, 801, 6, 316}, {83, 0, 807, 2, 316}, {83, 0, 809, 2, 320}, {83, 0, 811, 3, 316}, {83, 0, 814, 4, 316}, {83, 0, 818, 2, 316}, {83, 0, 820, 2, 316}, {83, 0, 822, 2, 316}, {83, 0, 824, 2, 316}, {83, 0, 826, 2, 316}, {83, 0, 828, 2, 316}, {83, 0, 830, 4, 318}, {83, 1, 834, 2, 316}, {84, 0, 836, 5, 316}, {84, 0, 841, 20, 317}, {84, 0, 861, 2, 316}, + {84, 0, 863, 0, 316}, {84, 0, 863, 2, 316}, {84, 0, 865, 4, 320}, {84, 0, 869, 0, 316}, {84, 0, 869, 2, 316}, {84, 0, 871, 1, 316}, {84, 0, 872, 2, 316}, {84, 0, 874, 3, 316}, {84, 0, 877, 2, 316}, {84, 0, 879, 2, 316}, {84, 0, 881, 4, 316}, {84, 0, 885, 3, 316}, {84, 0, 888, 17, 316}, {84, 6, 905, 1, 319}, {90, 0, 906, 2, 316}, {90, 0, 908, 2, 320}, {90, 0, 910, 2, 320}, {90, 0, 912, 2, 316}, {90, 0, 914, 2, 316}, {90, 0, 916, 4, 318}, + {90, 0, 920, 2, 316}, {90, 5, 922, 0, 312}, {95, 0, 922, 2, 316}, {95, 0, 924, 4, 316}, {95, 0, 928, 4, 316}, {95, 0, 932, 6, 316}, {95, 0, 938, 2, 316}, {95, 0, 940, 4, 316}, {95, 0, 944, 3, 316}, {95, 0, 947, 3, 316}, {95, 0, 950, 2, 316}, {95, 0, 952, 3, 316}, {95, 0, 955, 0, 316}, {95, 0, 955, 0, 316}, {95, 0, 955, 2, 316}, {95, 0, 957, 7, 316}, {95, 0, 964, 2, 316}, {95, 0, 966, 0, 319}, {95, 0, 966, 7, 316}, {95, 0, 973, 2, 316}, + {95, 0, 975, 2, 316}, {95, 3, 977, 1, 316}, {98, 0, 978, 2, 320}, {98, 0, 980, 4, 316}, {98, 0, 984, 0, 316}, {98, 0, 984, 2, 316}, {98, 0, 986, 2, 316}, {98, 0, 988, 4, 316}, {98, 0, 992, 1, 316}, {98, 0, 993, 2, 316}, {98, 0, 995, 2, 316}, {98, 0, 997, 3, 316}, {98, 0, 1000, 2, 317}, {98, 0, 1002, 0, 316}, {98, 0, 1002, 4, 316}, {98, 0, 1006, 4, 316}, {98, 0, 1010, 2, 316}, {98, 0, 1012, 3, 316}, {98, 0, 1015, 4, 316}, {98, 0, 1019, 7, 316}, + {98, 0, 1026, 4, 316}, {98, 0, 1030, 1, 313}, {98, 17, 1031, 3, 316}, {115, 0, 1034, 5, 316}, {115, 0, 1039, 2, 316}, {115, 0, 1041, 1, 316}, {115, 0, 1042, 4, 316}, {115, 0, 1046, 2, 316}, {115, 0, 1048, 2, 316}, {115, 0, 1050, 1, 316}, {115, 0, 1051, 2, 316}, {115, 0, 1053, 5, 316}, {115, 0, 1058, 1, -1}, {115, 4, 1059, 1, 312}, {119, 1, 1060, 0, 313}, {120, 2, 1060, 8, 312}, {122, 11, 1068, 6, 315}, {133, 2, 1074, 0, 316}, {135, 0, 1074, 0, 316}, {135, 3, 1074, 2, 316}, + {138, 0, 1076, 2, 316}, +}; +extern const XFA_METHODINFO g_SomMethodData[] = { + {0x3c752495, (FX_LPCWSTR)L"verify", (XFA_METHOD_CALLBACK)&CScript_SignaturePseudoModel::Script_SignaturePseudoModel_Verify}, {0xa68635f1, (FX_LPCWSTR)L"sign", (XFA_METHOD_CALLBACK)&CScript_SignaturePseudoModel::Script_SignaturePseudoModel_Sign}, {0xa7f2c5e6, (FX_LPCWSTR)L"enumerate", (XFA_METHOD_CALLBACK)&CScript_SignaturePseudoModel::Script_SignaturePseudoModel_Enumerate}, + {0xd8ed1467, (FX_LPCWSTR)L"clear", (XFA_METHOD_CALLBACK)&CScript_SignaturePseudoModel::Script_SignaturePseudoModel_Clear}, {0x4bdcce13, (FX_LPCWSTR)L"execute", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_WsdlConnection_Execute}, {0x1c296ba4, (FX_LPCWSTR)L"restore", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Delta_Restore}, + {0x7d123a9, (FX_LPCWSTR)L"clearItems", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_ClearItems}, {0xfb0b007, (FX_LPCWSTR)L"execEvent", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_ExecEvent}, {0x6716ce97, (FX_LPCWSTR)L"execInitialize", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_ExecInitialize}, + {0x7bb919c2, (FX_LPCWSTR)L"deleteItem", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_DeleteItem}, {0x9f053d5e, (FX_LPCWSTR)L"getSaveItem", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_GetSaveItem}, {0xbbd32747, (FX_LPCWSTR)L"boundItem", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_BoundItem}, + {0xc492d950, (FX_LPCWSTR)L"getItemState", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_GetItemState}, {0xc6013cd3, (FX_LPCWSTR)L"execCalculate", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_ExecCalculate}, {0xd8930d0e, (FX_LPCWSTR)L"setItems", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_SetItems}, + {0xe0f15045, (FX_LPCWSTR)L"getDisplayItem", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_GetDisplayItem}, {0xe23acddc, (FX_LPCWSTR)L"setItemState", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_SetItemState}, {0xe2dfb2f8, (FX_LPCWSTR)L"addItem", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_AddItem}, + {0xef8ce48f, (FX_LPCWSTR)L"execValidate", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_ExecValidate}, {0x461079ef, (FX_LPCWSTR)L"emit", (XFA_METHOD_CALLBACK)&CScript_EventPseudoModel::Script_EventPseudoModel_Emit}, {0xfec90c63, (FX_LPCWSTR)L"reset", (XFA_METHOD_CALLBACK)&CScript_EventPseudoModel::Script_EventPseudoModel_Reset}, + {0xfb0b007, (FX_LPCWSTR)L"execEvent", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_ExclGroup_ExecEvent}, {0x3d832221, (FX_LPCWSTR)L"selectedMember", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_ExclGroup_SelectedMember}, {0x6716ce97, (FX_LPCWSTR)L"execInitialize", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_ExclGroup_ExecInitialize}, + {0xc6013cd3, (FX_LPCWSTR)L"execCalculate", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_ExclGroup_ExecCalculate}, {0xef8ce48f, (FX_LPCWSTR)L"execValidate", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_ExclGroup_ExecValidate}, {0xfb0b007, (FX_LPCWSTR)L"execEvent", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Subform_ExecEvent}, + {0x6716ce97, (FX_LPCWSTR)L"execInitialize", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Subform_ExecInitialize}, {0xc6013cd3, (FX_LPCWSTR)L"execCalculate", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Subform_ExecCalculate}, {0xd9b9b1f1, (FX_LPCWSTR)L"getInvalidObjects", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Subform_GetInvalidObjects}, + {0xef8ce48f, (FX_LPCWSTR)L"execValidate", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Subform_ExecValidate}, {0xa366b7c, (FX_LPCWSTR)L"exportData", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::Script_HostPseudoModel_ExportData}, {0x16cc226c, (FX_LPCWSTR)L"gotoURL", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::Script_HostPseudoModel_GotoURL}, + {0x1e0722f5, (FX_LPCWSTR)L"pageDown", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::Script_HostPseudoModel_PageDown}, {0x3e66cb2c, (FX_LPCWSTR)L"setFocus", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::Script_HostPseudoModel_SetFocus}, {0x4ac9faae, (FX_LPCWSTR)L"openList", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::Script_HostPseudoModel_OpenList}, + {0x7b89714f, (FX_LPCWSTR)L"response", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::Script_HostPseudoModel_Response}, {0x7fd9fd58, (FX_LPCWSTR)L"documentInBatch", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::Script_HostPseudoModel_DocumentInBatch}, {0xaf1d019d, (FX_LPCWSTR)L"resetData", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::Script_HostPseudoModel_ResetData}, + {0xb07be13c, (FX_LPCWSTR)L"beep", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::Script_HostPseudoModel_Beep}, {0xb1882ca0, (FX_LPCWSTR)L"getFocus", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::Script_HostPseudoModel_GetFocus}, {0xbf4ba9ee, (FX_LPCWSTR)L"messageBox", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::Script_HostPseudoModel_MessageBox}, + {0xd6d4dbc1, (FX_LPCWSTR)L"documentCountInBatch", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::Script_HostPseudoModel_DocumentCountInBatch}, {0xdd7676ed, (FX_LPCWSTR)L"print", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::Script_HostPseudoModel_Print}, {0xe2f863d0, (FX_LPCWSTR)L"currentDateTime", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::Script_HostPseudoModel_CurrentDateTime}, + {0xf995d0f5, (FX_LPCWSTR)L"importData", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::Script_HostPseudoModel_ImportData}, {0xfeb96b62, (FX_LPCWSTR)L"pageUp", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::Script_HostPseudoModel_PageUp}, {0x68, (FX_LPCWSTR)L"h", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::Script_LayoutPseudoModel_H}, + {0x77, (FX_LPCWSTR)L"w", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::Script_LayoutPseudoModel_W}, {0x78, (FX_LPCWSTR)L"x", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::Script_LayoutPseudoModel_X}, {0x79, (FX_LPCWSTR)L"y", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::Script_LayoutPseudoModel_Y}, + {0x5460206, (FX_LPCWSTR)L"pageCount", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::Script_LayoutPseudoModel_PageCount}, {0x5eb5b0f, (FX_LPCWSTR)L"pageSpan", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::Script_LayoutPseudoModel_PageSpan}, {0x10f1b1bd, (FX_LPCWSTR)L"page", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::Script_LayoutPseudoModel_Page}, + {0x1c1e6318, (FX_LPCWSTR)L"pageContent", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::Script_LayoutPseudoModel_PageContent}, {0x1c1f4a5c, (FX_LPCWSTR)L"absPageCount", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::Script_LayoutPseudoModel_AbsPageCount}, {0x1ec47db5, (FX_LPCWSTR)L"absPageCountInBatch", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::Script_LayoutPseudoModel_AbsPageCountInBatch}, + {0x2e4ecbdb, (FX_LPCWSTR)L"sheetCountInBatch", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::Script_LayoutPseudoModel_SheetCountInBatch}, {0x2fcff4b5, (FX_LPCWSTR)L"relayout", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::Script_LayoutPseudoModel_Relayout}, {0x3bf1c2a5, (FX_LPCWSTR)L"absPageSpan", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::Script_LayoutPseudoModel_AbsPageSpan}, + {0x5775c2cc, (FX_LPCWSTR)L"absPageInBatch", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::Script_LayoutPseudoModel_AbsPageInBatch}, {0x8c5feb32, (FX_LPCWSTR)L"sheetInBatch", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::Script_LayoutPseudoModel_SheetInBatch}, {0x8f3a8379, (FX_LPCWSTR)L"sheet", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::Script_LayoutPseudoModel_Sheet}, + {0x96f3c4cb, (FX_LPCWSTR)L"relayoutPageArea", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::Script_LayoutPseudoModel_RelayoutPageArea}, {0xd2a4a542, (FX_LPCWSTR)L"sheetCount", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::Script_LayoutPseudoModel_SheetCount}, {0xe74f0653, (FX_LPCWSTR)L"absPage", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::Script_LayoutPseudoModel_AbsPage}, + {0x44c352ad, (FX_LPCWSTR)L"formNodes", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Template_FormNodes}, {0x45efb847, (FX_LPCWSTR)L"remerge", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Template_Remerge}, {0x6716ce97, (FX_LPCWSTR)L"execInitialize", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Template_ExecInitialize}, + {0x712c6afa, (FX_LPCWSTR)L"createNode", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Template_CreateNode}, {0xa8a35e25, (FX_LPCWSTR)L"recalculate", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Template_Recalculate}, {0xc6013cd3, (FX_LPCWSTR)L"execCalculate", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Template_ExecCalculate}, + {0xef8ce48f, (FX_LPCWSTR)L"execValidate", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Template_ExecValidate}, {0x4cc1c0f9, (FX_LPCWSTR)L"moveCurrentRecord", (XFA_METHOD_CALLBACK)&CScript_DataWindow::Script_DataWindow_MoveCurrentRecord}, {0x5779d65f, (FX_LPCWSTR)L"record", (XFA_METHOD_CALLBACK)&CScript_DataWindow::Script_DataWindow_Record}, + {0x8a476498, (FX_LPCWSTR)L"gotoRecord", (XFA_METHOD_CALLBACK)&CScript_DataWindow::Script_DataWindow_GotoRecord}, {0xaac241c8, (FX_LPCWSTR)L"isRecordGroup", (XFA_METHOD_CALLBACK)&CScript_DataWindow::Script_DataWindow_IsRecordGroup}, {0x1c6f4277, (FX_LPCWSTR)L"evaluate", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Manifest_Evaluate}, + {0x2afec2cc, (FX_LPCWSTR)L"moveInstance", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_InstanceManager_MoveInstance}, {0x2bf94a63, (FX_LPCWSTR)L"removeInstance", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_InstanceManager_RemoveInstance}, {0x303adaf4, (FX_LPCWSTR)L"setInstances", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_InstanceManager_SetInstances}, + {0x4d76b89e, (FX_LPCWSTR)L"addInstance", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_InstanceManager_AddInstance}, {0xc660dc8a, (FX_LPCWSTR)L"insertInstance", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_InstanceManager_InsertInstance}, {0xddfd1ea1, (FX_LPCWSTR)L"metadata", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Desc_Metadata}, + {0x44c352ad, (FX_LPCWSTR)L"formNodes", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Form_FormNodes}, {0x45efb847, (FX_LPCWSTR)L"remerge", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Form_Remerge}, {0x6716ce97, (FX_LPCWSTR)L"execInitialize", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Form_ExecInitialize}, + {0xa8a35e25, (FX_LPCWSTR)L"recalculate", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Form_Recalculate}, {0xc6013cd3, (FX_LPCWSTR)L"execCalculate", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Form_ExecCalculate}, {0xef8ce48f, (FX_LPCWSTR)L"execValidate", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Form_ExecValidate}, + {0x60490a85, (FX_LPCWSTR)L"message", (XFA_METHOD_CALLBACK)&CScript_LogPseudoModel::Script_LogPseudoModel_Message}, {0x60ecfcc9, (FX_LPCWSTR)L"traceDeactivate", (XFA_METHOD_CALLBACK)&CScript_LogPseudoModel::Script_LogPseudoModel_TraceDeactivate}, {0x86a0f4c0, (FX_LPCWSTR)L"traceActivate", (XFA_METHOD_CALLBACK)&CScript_LogPseudoModel::Script_LogPseudoModel_TraceActivate}, + {0x93eac39a, (FX_LPCWSTR)L"traceEnabled", (XFA_METHOD_CALLBACK)&CScript_LogPseudoModel::Script_LogPseudoModel_TraceEnabled}, {0xd1227e6f, (FX_LPCWSTR)L"trace", (XFA_METHOD_CALLBACK)&CScript_LogPseudoModel::Script_LogPseudoModel_Trace}, {0x36c0ee14, (FX_LPCWSTR)L"getAttribute", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Packet_GetAttribute}, + {0x5468e2a0, (FX_LPCWSTR)L"setAttribute", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Packet_SetAttribute}, {0xadc48de2, (FX_LPCWSTR)L"removeAttribute", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Packet_RemoveAttribute}, {0x3848b3f, (FX_LPCWSTR)L"next", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_Next}, + {0x14e25bc8, (FX_LPCWSTR)L"cancelBatch", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_CancelBatch}, {0x3ce05d68, (FX_LPCWSTR)L"first", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_First}, {0x649e1e65, (FX_LPCWSTR)L"updateBatch", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_UpdateBatch}, + {0x6a3405dd, (FX_LPCWSTR)L"previous", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_Previous}, {0x74818fb3, (FX_LPCWSTR)L"isBOF", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_IsBOF}, {0x74d07a76, (FX_LPCWSTR)L"isEOF", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_IsEOF}, + {0x7613cb66, (FX_LPCWSTR)L"cancel", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_Cancel}, {0x7baca2e3, (FX_LPCWSTR)L"update", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_Update}, {0x8b90e1f2, (FX_LPCWSTR)L"open", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_Open}, + {0x9c6471b3, (FX_LPCWSTR)L"delete", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_Delete}, {0xa7315093, (FX_LPCWSTR)L"addNew", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_AddNew}, {0xa7ce5f8d, (FX_LPCWSTR)L"requery", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_Requery}, + {0xc7368674, (FX_LPCWSTR)L"resync", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_Resync}, {0xd9f47f36, (FX_LPCWSTR)L"close", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_Close}, {0xf54481d4, (FX_LPCWSTR)L"last", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_Last}, + {0xf7965460, (FX_LPCWSTR)L"hasDataChanged", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_HasDataChanged}, {0x6275f6af, (FX_LPCWSTR)L"item", (XFA_METHOD_CALLBACK)&CXFA_NodeList::Script_ListClass_Item}, {0x7033bfd5, (FX_LPCWSTR)L"insert", (XFA_METHOD_CALLBACK)&CXFA_NodeList::Script_ListClass_Insert}, + {0x9cab7cae, (FX_LPCWSTR)L"remove", (XFA_METHOD_CALLBACK)&CXFA_NodeList::Script_ListClass_Remove}, {0xda12e518, (FX_LPCWSTR)L"append", (XFA_METHOD_CALLBACK)&CXFA_NodeList::Script_ListClass_Append}, {0xd892a054, (FX_LPCWSTR)L"namedItem", (XFA_METHOD_CALLBACK)&CXFA_NodeList::Script_TreelistClass_NamedItem}, + {0xba2dd386, (FX_LPCWSTR)L"resolveNode", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_TreeClass_ResolveNode}, {0xe509e2b9, (FX_LPCWSTR)L"resolveNodes", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_TreeClass_ResolveNodes}, {0x1bca1ebd, (FX_LPCWSTR)L"applyXSL", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_ApplyXSL}, + {0x36c0ee14, (FX_LPCWSTR)L"getAttribute", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_GetAttribute}, {0x5468e2a0, (FX_LPCWSTR)L"setAttribute", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_SetAttribute}, {0x5ee00996, (FX_LPCWSTR)L"setElement", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_SetElement}, + {0x92dada4f, (FX_LPCWSTR)L"saveFilteredXML", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_SaveFilteredXML}, {0x9c456500, (FX_LPCWSTR)L"saveXML", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_SaveXML}, {0xabd3200a, (FX_LPCWSTR)L"getElement", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_GetElement}, + {0xb269c60d, (FX_LPCWSTR)L"isPropertySpecified", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_IsPropertySpecified}, {0xb528be91, (FX_LPCWSTR)L"loadXML", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_LoadXML}, {0xd9f46591, (FX_LPCWSTR)L"clone", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_Clone}, + {0xe006a76b, (FX_LPCWSTR)L"assignNode", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_AssignNode}, {0x7303fcea, (FX_LPCWSTR)L"getDelta", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_ContainerClass_GetDelta}, {0xe7742c9d, (FX_LPCWSTR)L"getDeltas", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_ContainerClass_GetDeltas}, + {0x30ff6aad, (FX_LPCWSTR)L"clearErrorList", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_ModelClass_ClearErrorList}, {0x712c6afa, (FX_LPCWSTR)L"createNode", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_ModelClass_CreateNode}, {0x83a6411d, (FX_LPCWSTR)L"isCompatibleNS", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_ModelClass_IsCompatibleNS}, +}; +extern const FX_INT32 g_iSomMethodCount = sizeof(g_SomMethodData) / sizeof(XFA_METHODINFO); +extern const _XFA_SCRIPTATTRIBUTEINFO g_SomAttributeData[] = { + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xb3543a6, (FX_LPCWSTR)L"max", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Max, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x45a6daf8, (FX_LPCWSTR)L"eofAction", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_EofAction, XFA_SCRIPT_Basic}, + {0x5ec958c0, (FX_LPCWSTR)L"cursorType", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_CursorType, XFA_SCRIPT_Basic}, {0x79975f2b, (FX_LPCWSTR)L"lockType", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_LockType, XFA_SCRIPT_Basic}, {0xa5340ff5, (FX_LPCWSTR)L"bofAction", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_BofAction, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xc5762157, (FX_LPCWSTR)L"cursorLocation", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_CursorLocation, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x1ee2d24d, (FX_LPCWSTR)L"instanceIndex", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_InstanceIndex, -1, XFA_SCRIPT_Basic}, {0x8c99377e, (FX_LPCWSTR)L"relation", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Relation, XFA_SCRIPT_Basic}, + {0x8e1c2921, (FX_LPCWSTR)L"relevant", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0x31b19c1, (FX_LPCWSTR)L"name", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic}, {0x3106c3a, (FX_LPCWSTR)L"beforeTarget", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_BeforeTarget, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x13a08bdb, (FX_LPCWSTR)L"overflowTarget", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_OverflowTarget, XFA_SCRIPT_Basic}, {0x169134a1, (FX_LPCWSTR)L"overflowLeader", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_OverflowLeader, XFA_SCRIPT_Basic}, + {0x20914367, (FX_LPCWSTR)L"overflowTrailer", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_OverflowTrailer, XFA_SCRIPT_Basic}, {0x453eaf38, (FX_LPCWSTR)L"startNew", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_StartNew, XFA_SCRIPT_Basic}, {0x64110ab5, (FX_LPCWSTR)L"bookendTrailer", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_BookendTrailer, XFA_SCRIPT_Basic}, + {0xb6b44172, (FX_LPCWSTR)L"after", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_After, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xc3c1442f, (FX_LPCWSTR)L"bookendLeader", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_BookendLeader, XFA_SCRIPT_Basic}, + {0xcb150479, (FX_LPCWSTR)L"afterTarget", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_AfterTarget, XFA_SCRIPT_Basic}, {0xf4ffce73, (FX_LPCWSTR)L"before", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Before, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0x31b19c1, (FX_LPCWSTR)L"name", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xd6e27f1d, (FX_LPCWSTR)L"value", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue_Read, -1, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x47cfa43a, (FX_LPCWSTR)L"allowNeutral", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_AllowNeutral, XFA_SCRIPT_Basic}, + {0x7c2fd80b, (FX_LPCWSTR)L"mark", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Mark, XFA_SCRIPT_Basic}, {0x8ed182d1, (FX_LPCWSTR)L"shape", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Shape, XFA_SCRIPT_Basic}, {0xa686975b, (FX_LPCWSTR)L"size", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Size, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0x5c054755, (FX_LPCWSTR)L"startAngle", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_StartAngle, XFA_SCRIPT_Basic}, {0x74788f8b, (FX_LPCWSTR)L"sweepAngle", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_SweepAngle, XFA_SCRIPT_Basic}, {0x9d833d75, (FX_LPCWSTR)L"circular", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Circular, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xd996fa9b, (FX_LPCWSTR)L"hand", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Hand, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xb0e5485d, (FX_LPCWSTR)L"bind", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Bind, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xcd7f7b54, (FX_LPCWSTR)L"from", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_From, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x8e29d794, (FX_LPCWSTR)L"signatureType", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_SignatureType, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xe11a2cbc, (FX_LPCWSTR)L"permissions", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Permissions, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x453eaf38, (FX_LPCWSTR)L"startNew", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_StartNew, XFA_SCRIPT_Basic}, + {0x9dcc3ab3, (FX_LPCWSTR)L"trailer", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Trailer, XFA_SCRIPT_Basic}, {0xa6118c89, (FX_LPCWSTR)L"targetType", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_TargetType, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xc8da4da7, (FX_LPCWSTR)L"target", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Target, XFA_SCRIPT_Basic}, {0xcbcaf66d, (FX_LPCWSTR)L"leader", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Leader, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0x31b19c1, (FX_LPCWSTR)L"name", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0x31b19c1, (FX_LPCWSTR)L"name", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0x2d574d58, (FX_LPCWSTR)L"this", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Xfa_This, -1, XFA_SCRIPT_Object}, {0x4fdc3454, (FX_LPCWSTR)L"timeStamp", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_TimeStamp, XFA_SCRIPT_Basic}, {0xb598a1f7, (FX_LPCWSTR)L"uuid", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Uuid, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0x31b19c1, (FX_LPCWSTR)L"name", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xcfea02e, (FX_LPCWSTR)L"leftInset", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_LeftInset, XFA_SCRIPT_Basic}, {0x1356caf8, (FX_LPCWSTR)L"bottomInset", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_BottomInset, XFA_SCRIPT_Basic}, + {0x25764436, (FX_LPCWSTR)L"topInset", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_TopInset, XFA_SCRIPT_Basic}, {0x8a692521, (FX_LPCWSTR)L"rightInset", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_RightInset, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x1e459b8f, (FX_LPCWSTR)L"nonRepudiation", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_NonRepudiation, XFA_SCRIPT_Basic}, {0x2bb3f470, (FX_LPCWSTR)L"encipherOnly", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_EncipherOnly, XFA_SCRIPT_Basic}, + {0x2f16a382, (FX_LPCWSTR)L"type", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic}, {0x5f760b50, (FX_LPCWSTR)L"digitalSignature", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_DigitalSignature, XFA_SCRIPT_Basic}, {0x69aa2292, (FX_LPCWSTR)L"crlSign", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_CrlSign, XFA_SCRIPT_Basic}, + {0x98fd4d81, (FX_LPCWSTR)L"keyAgreement", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_KeyAgreement, XFA_SCRIPT_Basic}, {0xa66404cb, (FX_LPCWSTR)L"keyEncipherment", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_KeyEncipherment, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xca5dc27c, (FX_LPCWSTR)L"dataEncipherment", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_DataEncipherment, XFA_SCRIPT_Basic}, {0xe8f118a8, (FX_LPCWSTR)L"keyCertSign", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_KeyCertSign, XFA_SCRIPT_Basic}, {0xfea53ec6, (FX_LPCWSTR)L"decipherOnly", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_DecipherOnly, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0x8b90e1f2, (FX_LPCWSTR)L"open", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Open, XFA_SCRIPT_Basic}, {0x957fa006, (FX_LPCWSTR)L"commitOn", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_CommitOn, XFA_SCRIPT_Basic}, {0xb12128b7, (FX_LPCWSTR)L"textEntry", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_TextEntry, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0x31b19c1, (FX_LPCWSTR)L"name", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0x31b19c1, (FX_LPCWSTR)L"name", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic}, {0x2282c73, (FX_LPCWSTR)L"hAlign", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_HAlign, XFA_SCRIPT_Basic}, {0x8d4f1c7, (FX_LPCWSTR)L"textIndent", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_TextIndent, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x2a82d99c, (FX_LPCWSTR)L"marginRight", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_MarginRight, XFA_SCRIPT_Basic}, {0x534729c9, (FX_LPCWSTR)L"marginLeft", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_MarginLeft, XFA_SCRIPT_Basic}, + {0x5739d1ff, (FX_LPCWSTR)L"radixOffset", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_RadixOffset, XFA_SCRIPT_Basic}, {0x577682ac, (FX_LPCWSTR)L"preserve", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Preserve, XFA_SCRIPT_Basic}, {0x731e0665, (FX_LPCWSTR)L"spaceBelow", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_SpaceBelow, XFA_SCRIPT_Basic}, + {0x7a7cc341, (FX_LPCWSTR)L"vAlign", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_VAlign, XFA_SCRIPT_Basic}, {0x836d4d7c, (FX_LPCWSTR)L"tabDefault", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_TabDefault, XFA_SCRIPT_Basic}, {0x8fa01790, (FX_LPCWSTR)L"tabStops", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_TabStops, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xd4b01921, (FX_LPCWSTR)L"lineHeight", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_LineHeight, XFA_SCRIPT_Basic}, {0xe18b5659, (FX_LPCWSTR)L"spaceAbove", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_SpaceAbove, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xd861f8af, (FX_LPCWSTR)L"addRevocationInfo", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_AddRevocationInfo, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xbb8df5d, (FX_LPCWSTR)L"ref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Ref, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xd6128d8d, (FX_LPCWSTR)L"activity", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Activity, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0x43e349b, (FX_LPCWSTR)L"dataRowCount", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_DataRowCount, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x28e17e91, (FX_LPCWSTR)L"dataPrep", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_DataPrep, XFA_SCRIPT_Basic}, + {0x2f16a382, (FX_LPCWSTR)L"type", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic}, {0x3650557e, (FX_LPCWSTR)L"textLocation", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_TextLocation, XFA_SCRIPT_Basic}, {0x3b582286, (FX_LPCWSTR)L"moduleWidth", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_ModuleWidth, XFA_SCRIPT_Basic}, + {0x52666f1c, (FX_LPCWSTR)L"printCheckDigit", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_PrintCheckDigit, XFA_SCRIPT_Basic}, {0x5404d6df, (FX_LPCWSTR)L"moduleHeight", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_ModuleHeight, XFA_SCRIPT_Basic}, {0x5ab23b6c, (FX_LPCWSTR)L"startChar", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_StartChar, XFA_SCRIPT_Basic}, + {0x7c732a66, (FX_LPCWSTR)L"truncate", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Truncate, XFA_SCRIPT_Basic}, {0x8d181d61, (FX_LPCWSTR)L"wideNarrowRatio", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_WideNarrowRatio, XFA_SCRIPT_Basic}, {0x99800d7a, (FX_LPCWSTR)L"errorCorrectionLevel", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_ErrorCorrectionLevel, XFA_SCRIPT_Basic}, + {0x9a63da3d, (FX_LPCWSTR)L"upsMode", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_UpsMode, XFA_SCRIPT_Basic}, {0xaf754613, (FX_LPCWSTR)L"checksum", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Checksum, XFA_SCRIPT_Basic}, {0xb045fbc5, (FX_LPCWSTR)L"charEncoding", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_CharEncoding, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xc035c6b1, (FX_LPCWSTR)L"dataColumnCount", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_DataColumnCount, XFA_SCRIPT_Basic}, {0xd3c84d25, (FX_LPCWSTR)L"rowColumnRatio", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_RowColumnRatio, XFA_SCRIPT_Basic}, + {0xd57c513c, (FX_LPCWSTR)L"dataLength", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_DataLength, XFA_SCRIPT_Basic}, {0xf575ca75, (FX_LPCWSTR)L"endChar", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_EndChar, XFA_SCRIPT_Basic}, {0x31b19c1, (FX_LPCWSTR)L"name", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic}, + {0x28dee6e9, (FX_LPCWSTR)L"format", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Format, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x60d4c8b1, (FX_LPCWSTR)L"output", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Output, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xd6a39990, (FX_LPCWSTR)L"input", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Input, XFA_SCRIPT_Basic}, {0x2f16a382, (FX_LPCWSTR)L"type", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0x2f16a382, (FX_LPCWSTR)L"type", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0x2b5df51e, (FX_LPCWSTR)L"dataDescription", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_DataDescription, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0x6c0d9600, (FX_LPCWSTR)L"currentValue", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Delta_CurrentValue, -1, XFA_SCRIPT_Basic}, + {0x942643f0, (FX_LPCWSTR)L"savedValue", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Delta_SavedValue, -1, XFA_SCRIPT_Basic}, {0xc8da4da7, (FX_LPCWSTR)L"target", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Delta_Target, -1, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xd4cc53f8, (FX_LPCWSTR)L"highlight", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Highlight, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0x5518c25, (FX_LPCWSTR)L"break", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Break, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x570ce835, (FX_LPCWSTR)L"presence", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Presence, XFA_SCRIPT_Basic}, {0x8e1c2921, (FX_LPCWSTR)L"relevant", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xd996fa9b, (FX_LPCWSTR)L"hand", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Hand, XFA_SCRIPT_Basic}, {0x78, (FX_LPCWSTR)L"x", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_X, XFA_SCRIPT_Basic}, + {0x79, (FX_LPCWSTR)L"y", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Y, XFA_SCRIPT_Basic}, {0x31b19c1, (FX_LPCWSTR)L"name", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic}, {0x31b19c1, (FX_LPCWSTR)L"name", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x1059ec18, (FX_LPCWSTR)L"level", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_Integer, XFA_ATTRIBUTE_Level, XFA_SCRIPT_Basic}, {0x8e1c2921, (FX_LPCWSTR)L"relevant", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic}, + {0xac06e2b0, (FX_LPCWSTR)L"colSpan", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_ColSpan, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0x21aed, (FX_LPCWSTR)L"id", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Id, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x2f105f72, (FX_LPCWSTR)L"wordCharacterCount", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_WordCharacterCount, XFA_SCRIPT_Basic}, + {0x3d123c26, (FX_LPCWSTR)L"hyphenate", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Hyphenate, XFA_SCRIPT_Basic}, {0x66539c48, (FX_LPCWSTR)L"excludeInitialCap", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_ExcludeInitialCap, XFA_SCRIPT_Basic}, {0x6a95c976, (FX_LPCWSTR)L"pushCharacterCount", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_PushCharacterCount, XFA_SCRIPT_Basic}, + {0x982bd892, (FX_LPCWSTR)L"remainCharacterCount", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_RemainCharacterCount, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xe5c96d6a, (FX_LPCWSTR)L"excludeAllCaps", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_ExcludeAllCaps, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x8af2e657, (FX_LPCWSTR)L"maxChars", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_MaxChars, XFA_SCRIPT_Basic}, {0xa52682bd, (FX_LPCWSTR)L"{default}", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xd6e27f1d, (FX_LPCWSTR)L"value", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0xa52682bd, (FX_LPCWSTR)L"{default}", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xd6e27f1d, (FX_LPCWSTR)L"value", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc080cd3, (FX_LPCWSTR)L"url", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Url, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0xa6710262, (FX_LPCWSTR)L"credentialServerPolicy", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_CredentialServerPolicy, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xc2ba0923, (FX_LPCWSTR)L"urlPolicy", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_UrlPolicy, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x2f16a382, (FX_LPCWSTR)L"type", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0x47d03490, (FX_LPCWSTR)L"connection", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Connection, XFA_SCRIPT_Basic}, {0xc8da4da7, (FX_LPCWSTR)L"target", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Target, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0xa52682bd, (FX_LPCWSTR)L"{default}", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xd6e27f1d, (FX_LPCWSTR)L"value", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x78bff531, (FX_LPCWSTR)L"numberOfCells", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_Integer, XFA_ATTRIBUTE_NumberOfCells, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x2f16a382, (FX_LPCWSTR)L"type", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0x68, (FX_LPCWSTR)L"h", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_H, XFA_SCRIPT_Basic}, {0x77, (FX_LPCWSTR)L"w", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_W, XFA_SCRIPT_Basic}, {0x78, (FX_LPCWSTR)L"x", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_X, XFA_SCRIPT_Basic}, + {0x79, (FX_LPCWSTR)L"y", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Y, XFA_SCRIPT_Basic}, {0x2282c73, (FX_LPCWSTR)L"hAlign", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_HAlign, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0x1abbd7e0, (FX_LPCWSTR)L"dataNode", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DataNode, -1, XFA_SCRIPT_Object}, {0x25839852, (FX_LPCWSTR)L"access", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Access, XFA_SCRIPT_Basic}, {0x2ee7678f, (FX_LPCWSTR)L"rotate", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Rotate, XFA_SCRIPT_Basic}, + {0x3b1ddd06, (FX_LPCWSTR)L"fillColor", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_FillColor, -1, XFA_SCRIPT_Basic}, {0x54c399e3, (FX_LPCWSTR)L"formattedValue", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Field_FormattedValue, -1, XFA_SCRIPT_Basic}, {0x570ce835, (FX_LPCWSTR)L"presence", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Presence, XFA_SCRIPT_Basic}, + {0x5a3b375d, (FX_LPCWSTR)L"borderColor", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_BorderColor, -1, XFA_SCRIPT_Basic}, {0x5e936ed6, (FX_LPCWSTR)L"fontColor", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_FontColor, -1, XFA_SCRIPT_Basic}, {0x6826c408, (FX_LPCWSTR)L"parentSubform", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Field_ParentSubform, -1, XFA_SCRIPT_Basic}, + {0x79b67434, (FX_LPCWSTR)L"mandatoryMessage", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_MandatoryMessage, -1, XFA_SCRIPT_Basic}, {0x7a7cc341, (FX_LPCWSTR)L"vAlign", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_VAlign, XFA_SCRIPT_Basic}, {0x7c2ff6ae, (FX_LPCWSTR)L"maxH", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_MaxH, XFA_SCRIPT_Basic}, + {0x7c2ff6bd, (FX_LPCWSTR)L"maxW", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_MaxW, XFA_SCRIPT_Basic}, {0x7d02356c, (FX_LPCWSTR)L"minH", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_MinH, XFA_SCRIPT_Basic}, {0x7d02357b, (FX_LPCWSTR)L"minW", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_MinW, XFA_SCRIPT_Basic}, + {0x85fd6faf, (FX_LPCWSTR)L"mandatory", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_Mandatory, -1, XFA_SCRIPT_Basic}, {0x8e1c2921, (FX_LPCWSTR)L"relevant", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic}, {0x964fb42e, (FX_LPCWSTR)L"formatMessage", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Field_FormatMessage, -1, XFA_SCRIPT_Basic}, + {0xa03cf627, (FX_LPCWSTR)L"rawValue", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, {0xa52682bd, (FX_LPCWSTR)L"{default}", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, {0xa60dd202, (FX_LPCWSTR)L"length", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Field_Length, -1, XFA_SCRIPT_Basic}, + {0xac06e2b0, (FX_LPCWSTR)L"colSpan", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_ColSpan, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xbc8fa350, (FX_LPCWSTR)L"locale", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Locale, XFA_SCRIPT_Basic}, + {0xc2bd40fd, (FX_LPCWSTR)L"anchorType", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_AnchorType, XFA_SCRIPT_Basic}, {0xc4fed09b, (FX_LPCWSTR)L"accessKey", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_AccessKey, XFA_SCRIPT_Basic}, {0xcabfa3d0, (FX_LPCWSTR)L"validationMessage", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_ValidationMessage, -1, XFA_SCRIPT_Basic}, + {0xdcecd663, (FX_LPCWSTR)L"editValue", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Field_EditValue, -1, XFA_SCRIPT_Basic}, {0xe07e5061, (FX_LPCWSTR)L"selectedIndex", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Field_SelectedIndex, -1, XFA_SCRIPT_Basic}, {0xf65e34be, (FX_LPCWSTR)L"borderWidth", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_BorderWidth, -1, XFA_SCRIPT_Basic}, + {0x31b19c1, (FX_LPCWSTR)L"name", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0x68, (FX_LPCWSTR)L"h", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_H, XFA_SCRIPT_Basic}, {0x77, (FX_LPCWSTR)L"w", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_W, XFA_SCRIPT_Basic}, {0x78, (FX_LPCWSTR)L"x", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_X, XFA_SCRIPT_Basic}, + {0x79, (FX_LPCWSTR)L"y", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Y, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x8e1c2921, (FX_LPCWSTR)L"relevant", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xd843798, (FX_LPCWSTR)L"fullText", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::Script_EventPseudoModel_FullText, -1, XFA_SCRIPT_Basic}, {0x1b6d1cf5, (FX_LPCWSTR)L"reenter", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::Script_EventPseudoModel_Reenter, -1, XFA_SCRIPT_Basic}, + {0x1e6ffa9a, (FX_LPCWSTR)L"prevContentType", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::Script_EventPseudoModel_PrevContentType, -1, XFA_SCRIPT_Basic}, {0x25a3c206, (FX_LPCWSTR)L"soapFaultString", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::Script_EventPseudoModel_SoapFaultString, -1, XFA_SCRIPT_Basic}, {0x2e00c007, (FX_LPCWSTR)L"newContentType", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::Script_EventPseudoModel_NewContentType, -1, XFA_SCRIPT_Basic}, + {0x4570500f, (FX_LPCWSTR)L"modifier", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::Script_EventPseudoModel_Modifier, -1, XFA_SCRIPT_Basic}, {0x50e2e33b, (FX_LPCWSTR)L"selEnd", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::Script_EventPseudoModel_SelEnd, -1, XFA_SCRIPT_Basic}, {0x57de87c2, (FX_LPCWSTR)L"prevText", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::Script_EventPseudoModel_PrevText, -1, XFA_SCRIPT_Basic}, + {0x6ea04e0a, (FX_LPCWSTR)L"soapFaultCode", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::Script_EventPseudoModel_SoapFaultCode, -1, XFA_SCRIPT_Basic}, {0x6f6556cf, (FX_LPCWSTR)L"newText", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::Script_EventPseudoModel_NewText, -1, XFA_SCRIPT_Basic}, {0x891f4606, (FX_LPCWSTR)L"change", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::Script_EventPseudoModel_Change, -1, XFA_SCRIPT_Basic}, + {0x8fa3c19e, (FX_LPCWSTR)L"shift", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::Script_EventPseudoModel_Shift, -1, XFA_SCRIPT_Basic}, {0xa9d9b2e1, (FX_LPCWSTR)L"keyDown", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::Script_EventPseudoModel_KeyDown, -1, XFA_SCRIPT_Basic}, {0xbfc89db2, (FX_LPCWSTR)L"selStart", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::Script_EventPseudoModel_SelStart, -1, XFA_SCRIPT_Basic}, + {0xc32a5812, (FX_LPCWSTR)L"commitKey", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::Script_EventPseudoModel_CommitKey, -1, XFA_SCRIPT_Basic}, {0xc8da4da7, (FX_LPCWSTR)L"target", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::Script_EventPseudoModel_Target, -1, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xa2e3514, (FX_LPCWSTR)L"cap", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Cap, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x5392ea58, (FX_LPCWSTR)L"stroke", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Stroke, XFA_SCRIPT_Basic}, {0x570ce835, (FX_LPCWSTR)L"presence", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Presence, XFA_SCRIPT_Basic}, + {0x94446dcc, (FX_LPCWSTR)L"thickness", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Thickness, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0x1ec8ab2c, (FX_LPCWSTR)L"rate", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Rate, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0x7b29630a, (FX_LPCWSTR)L"sourceBelow", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_SourceBelow, XFA_SCRIPT_Basic}, {0x8fc36c0a, (FX_LPCWSTR)L"outputBelow", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_OutputBelow, XFA_SCRIPT_Basic}, + {0xe996b2fe, (FX_LPCWSTR)L"sourceAbove", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_SourceAbove, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0x68, (FX_LPCWSTR)L"h", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_H, XFA_SCRIPT_Basic}, + {0x77, (FX_LPCWSTR)L"w", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_W, XFA_SCRIPT_Basic}, {0x78, (FX_LPCWSTR)L"x", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_X, XFA_SCRIPT_Basic}, {0x79, (FX_LPCWSTR)L"y", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Y, XFA_SCRIPT_Basic}, + {0x2282c73, (FX_LPCWSTR)L"hAlign", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_HAlign, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xf23332f, (FX_LPCWSTR)L"errorText", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_ExclGroup_ErrorText, -1, XFA_SCRIPT_Basic}, + {0x1abbd7e0, (FX_LPCWSTR)L"dataNode", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DataNode, -1, XFA_SCRIPT_Object}, {0x25839852, (FX_LPCWSTR)L"access", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Access, XFA_SCRIPT_Basic}, {0x3b1ddd06, (FX_LPCWSTR)L"fillColor", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_FillColor, -1, XFA_SCRIPT_Basic}, + {0x570ce835, (FX_LPCWSTR)L"presence", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Presence, XFA_SCRIPT_Basic}, {0x5a3b375d, (FX_LPCWSTR)L"borderColor", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_BorderColor, -1, XFA_SCRIPT_Basic}, {0x79b67434, (FX_LPCWSTR)L"mandatoryMessage", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_MandatoryMessage, -1, XFA_SCRIPT_Basic}, + {0x7a7cc341, (FX_LPCWSTR)L"vAlign", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_VAlign, XFA_SCRIPT_Basic}, {0x7c2ff6ae, (FX_LPCWSTR)L"maxH", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_MaxH, XFA_SCRIPT_Basic}, {0x7c2ff6bd, (FX_LPCWSTR)L"maxW", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_MaxW, XFA_SCRIPT_Basic}, + {0x7d02356c, (FX_LPCWSTR)L"minH", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_MinH, XFA_SCRIPT_Basic}, {0x7d02357b, (FX_LPCWSTR)L"minW", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_MinW, XFA_SCRIPT_Basic}, {0x7e7e845e, (FX_LPCWSTR)L"layout", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Layout, XFA_SCRIPT_Basic}, + {0x846599f8, (FX_LPCWSTR)L"transient", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_ExclGroup_Transient, -1, XFA_SCRIPT_Basic}, {0x85fd6faf, (FX_LPCWSTR)L"mandatory", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_Mandatory, -1, XFA_SCRIPT_Basic}, {0x8e1c2921, (FX_LPCWSTR)L"relevant", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic}, + {0xa03cf627, (FX_LPCWSTR)L"rawValue", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_ExclGroup_DefaultAndRawValue, -1, XFA_SCRIPT_Basic}, {0xa52682bd, (FX_LPCWSTR)L"{default}", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_ExclGroup_DefaultAndRawValue, -1, XFA_SCRIPT_Basic}, {0xac06e2b0, (FX_LPCWSTR)L"colSpan", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_ColSpan, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xc2bd40fd, (FX_LPCWSTR)L"anchorType", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_AnchorType, XFA_SCRIPT_Basic}, {0xc4fed09b, (FX_LPCWSTR)L"accessKey", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_AccessKey, XFA_SCRIPT_Basic}, + {0xcabfa3d0, (FX_LPCWSTR)L"validationMessage", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_ValidationMessage, -1, XFA_SCRIPT_Basic}, {0xf65e34be, (FX_LPCWSTR)L"borderWidth", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_BorderWidth, -1, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xeda9017a, (FX_LPCWSTR)L"scope", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Scope, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x47d03490, (FX_LPCWSTR)L"connection", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Connection, XFA_SCRIPT_Basic}, {0x6cfa828a, (FX_LPCWSTR)L"runAt", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_RunAt, XFA_SCRIPT_Basic}, + {0xa1b0d2f5, (FX_LPCWSTR)L"executeType", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_ExecuteType, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xe6f99487, (FX_LPCWSTR)L"hScrollPolicy", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_HScrollPolicy, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x42fed1fd, (FX_LPCWSTR)L"contentType", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_ContentType, XFA_SCRIPT_Basic}, {0x54fa722c, (FX_LPCWSTR)L"transferEncoding", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_TransferEncoding, XFA_SCRIPT_Basic}, + {0xa52682bd, (FX_LPCWSTR)L"{default}", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue_Read, -1, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xd171b240, (FX_LPCWSTR)L"aspect", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Aspect, XFA_SCRIPT_Basic}, + {0xd6e27f1d, (FX_LPCWSTR)L"value", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue_Read, -1, XFA_SCRIPT_Basic}, {0xdb55fec5, (FX_LPCWSTR)L"href", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Href, XFA_SCRIPT_Basic}, {0xd6e27f1d, (FX_LPCWSTR)L"value", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Value, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x2f16a382, (FX_LPCWSTR)L"type", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic}, + {0x7f6fd3d7, (FX_LPCWSTR)L"server", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Server, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x4b8bc840, (FX_LPCWSTR)L"fracDigits", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_FracDigits, XFA_SCRIPT_Basic}, {0xa52682bd, (FX_LPCWSTR)L"{default}", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xd6e27f1d, (FX_LPCWSTR)L"value", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, {0xde7f92ba, (FX_LPCWSTR)L"leadDigits", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_LeadDigits, XFA_SCRIPT_Basic}, + {0x68, (FX_LPCWSTR)L"h", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_H, XFA_SCRIPT_Basic}, {0x77, (FX_LPCWSTR)L"w", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_W, XFA_SCRIPT_Basic}, {0x78, (FX_LPCWSTR)L"x", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_X, XFA_SCRIPT_Basic}, + {0x79, (FX_LPCWSTR)L"y", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Y, XFA_SCRIPT_Basic}, {0x2282c73, (FX_LPCWSTR)L"hAlign", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_HAlign, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0x1414d431, (FX_LPCWSTR)L"allowMacro", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_AllowMacro, XFA_SCRIPT_Basic}, {0x1517dfa1, (FX_LPCWSTR)L"columnWidths", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_ColumnWidths, XFA_SCRIPT_Basic}, {0x1abbd7e0, (FX_LPCWSTR)L"dataNode", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DataNode, -1, XFA_SCRIPT_Object}, + {0x1ee2d24d, (FX_LPCWSTR)L"instanceIndex", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_InstanceIndex, -1, XFA_SCRIPT_Basic}, {0x25839852, (FX_LPCWSTR)L"access", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Access, XFA_SCRIPT_Basic}, {0x3b1ddd06, (FX_LPCWSTR)L"fillColor", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_FillColor, -1, XFA_SCRIPT_Basic}, + {0x570ce835, (FX_LPCWSTR)L"presence", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Presence, XFA_SCRIPT_Basic}, {0x5a3b375d, (FX_LPCWSTR)L"borderColor", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_BorderColor, -1, XFA_SCRIPT_Basic}, {0x7a7cc341, (FX_LPCWSTR)L"vAlign", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_VAlign, XFA_SCRIPT_Basic}, + {0x7c2ff6ae, (FX_LPCWSTR)L"maxH", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_MaxH, XFA_SCRIPT_Basic}, {0x7c2ff6bd, (FX_LPCWSTR)L"maxW", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_MaxW, XFA_SCRIPT_Basic}, {0x7d02356c, (FX_LPCWSTR)L"minH", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_MinH, XFA_SCRIPT_Basic}, + {0x7d02357b, (FX_LPCWSTR)L"minW", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_MinW, XFA_SCRIPT_Basic}, {0x7e7e845e, (FX_LPCWSTR)L"layout", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Layout, XFA_SCRIPT_Basic}, {0x8e1c2921, (FX_LPCWSTR)L"relevant", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic}, + {0x9cc17d75, (FX_LPCWSTR)L"mergeMode", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_MergeMode, XFA_SCRIPT_Basic}, {0x9f3e9510, (FX_LPCWSTR)L"instanceManager", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Subform_InstanceManager, -1, XFA_SCRIPT_Object}, {0xac06e2b0, (FX_LPCWSTR)L"colSpan", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_ColSpan, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xbc8fa350, (FX_LPCWSTR)L"locale", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Subform_Locale, -1, XFA_SCRIPT_Basic}, {0xc2bd40fd, (FX_LPCWSTR)L"anchorType", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_AnchorType, XFA_SCRIPT_Basic}, + {0xcabfa3d0, (FX_LPCWSTR)L"validationMessage", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_ValidationMessage, -1, XFA_SCRIPT_Basic}, {0xe4c3a5e5, (FX_LPCWSTR)L"restoreState", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_RestoreState, XFA_SCRIPT_Basic}, {0xeda9017a, (FX_LPCWSTR)L"scope", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Scope, XFA_SCRIPT_Basic}, + {0xf65e34be, (FX_LPCWSTR)L"borderWidth", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_BorderWidth, -1, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x2f16a382, (FX_LPCWSTR)L"type", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic}, + {0x5a50e9e6, (FX_LPCWSTR)L"version", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Handler_Version, -1, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0x4107ed, (FX_LPCWSTR)L"foxitAppType", (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::Script_HostPseudoModel_FoxitAppType, -1, XFA_SCRIPT_Basic}, + {0x31b19c1, (FX_LPCWSTR)L"name", (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::Script_HostPseudoModel_Name, -1, XFA_SCRIPT_Basic}, {0x66c1ae9, (FX_LPCWSTR)L"validationsEnabled", (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::Script_HostPseudoModel_ValidationsEnabled, -1, XFA_SCRIPT_Basic}, {0x14d04502, (FX_LPCWSTR)L"title", (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::Script_HostPseudoModel_Title, -1, XFA_SCRIPT_Basic}, + {0x193afe8b, (FX_LPCWSTR)L"foxitName", (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::Script_HostPseudoModel_FoxitName, -1, XFA_SCRIPT_Basic}, {0x392ae445, (FX_LPCWSTR)L"platform", (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::Script_HostPseudoModel_Platform, -1, XFA_SCRIPT_Basic}, {0x5a50e9e6, (FX_LPCWSTR)L"version", (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::Script_HostPseudoModel_Version, -1, XFA_SCRIPT_Basic}, + {0x66cb1eed, (FX_LPCWSTR)L"variation", (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::Script_HostPseudoModel_Variation, -1, XFA_SCRIPT_Basic}, {0x7717cbc4, (FX_LPCWSTR)L"language", (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::Script_HostPseudoModel_Language, -1, XFA_SCRIPT_Basic}, {0x86698963, (FX_LPCWSTR)L"appType", (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::Script_HostPseudoModel_AppType, -1, XFA_SCRIPT_Basic}, + {0x94ff9e8d, (FX_LPCWSTR)L"calculationsEnabled", (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::Script_HostPseudoModel_CalculationsEnabled, -1, XFA_SCRIPT_Basic}, {0xbcd44940, (FX_LPCWSTR)L"currentPage", (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::Script_HostPseudoModel_CurrentPage, -1, XFA_SCRIPT_Basic}, {0xd4286870, (FX_LPCWSTR)L"foxitVersion", (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::Script_HostPseudoModel_FoxitVersion, -1, XFA_SCRIPT_Basic}, + {0xd592b920, (FX_LPCWSTR)L"numPages", (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::Script_HostPseudoModel_NumPages, -1, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x24d85167, (FX_LPCWSTR)L"timeout", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Timeout, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0x7d9fd7c5, (FX_LPCWSTR)L"mode", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Mode, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0x7d9fd7c5, (FX_LPCWSTR)L"mode", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_SubmitFormat_Mode, -1, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0xa52682bd, (FX_LPCWSTR)L"{default}", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xd6e27f1d, (FX_LPCWSTR)L"value", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0x2038c9b2, (FX_LPCWSTR)L"role", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Role, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0xa52682bd, (FX_LPCWSTR)L"{default}", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xd6e27f1d, (FX_LPCWSTR)L"value", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0x31b19c1, (FX_LPCWSTR)L"name", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xfcef86b5, (FX_LPCWSTR)L"ready", (XFA_ATTRIBUTE_CALLBACK)&CScript_LayoutPseudoModel::Script_LayoutPseudoModel_Ready, -1, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x5392ea58, (FX_LPCWSTR)L"stroke", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Stroke, XFA_SCRIPT_Basic}, {0x570ce835, (FX_LPCWSTR)L"presence", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Presence, XFA_SCRIPT_Basic}, + {0x7b95e661, (FX_LPCWSTR)L"inverted", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Inverted, XFA_SCRIPT_Basic}, {0x94446dcc, (FX_LPCWSTR)L"thickness", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Thickness, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xe8dddf50, (FX_LPCWSTR)L"join", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Join, XFA_SCRIPT_Basic}, {0xe948b9a8, (FX_LPCWSTR)L"radius", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Radius, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xabfa6c4f, (FX_LPCWSTR)L"cSpace", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_CSpace, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xd6e27f1d, (FX_LPCWSTR)L"value", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Value, XFA_SCRIPT_Basic}, {0x3848b3f, (FX_LPCWSTR)L"next", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Next, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x6a3405dd, (FX_LPCWSTR)L"previous", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Previous, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xf6b59543, (FX_LPCWSTR)L"intact", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Intact, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x268b7ec1, (FX_LPCWSTR)L"commandType", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_CommandType, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xbde9abda, (FX_LPCWSTR)L"data", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Data, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x5b707a35, (FX_LPCWSTR)L"scriptTest", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_ScriptTest, XFA_SCRIPT_Basic}, {0x6b6ddcfb, (FX_LPCWSTR)L"nullTest", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_NullTest, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xe64b1129, (FX_LPCWSTR)L"formatTest", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_FormatTest, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x2f16a382, (FX_LPCWSTR)L"type", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x8c99377e, (FX_LPCWSTR)L"relation", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Relation, XFA_SCRIPT_Basic}, + {0x8e1c2921, (FX_LPCWSTR)L"relevant", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0xa52682bd, (FX_LPCWSTR)L"{default}", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xd6e27f1d, (FX_LPCWSTR)L"value", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0x25363, (FX_LPCWSTR)L"to", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_To, XFA_SCRIPT_Basic}, + {0x66642f8f, (FX_LPCWSTR)L"force", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Force, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xcd7f7b54, (FX_LPCWSTR)L"from", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_From, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xd6e27f1d, (FX_LPCWSTR)L"value", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Value, XFA_SCRIPT_Basic}, {0x2b5df51e, (FX_LPCWSTR)L"dataDescription", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_DataDescription, XFA_SCRIPT_Basic}, {0xbb8df5d, (FX_LPCWSTR)L"ref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Ref, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x226ca8f1, (FX_LPCWSTR)L"operation", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Operation, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x2f16a382, (FX_LPCWSTR)L"type", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x2f16a382, (FX_LPCWSTR)L"type", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xfb67185, (FX_LPCWSTR)L"recordsBefore", (XFA_ATTRIBUTE_CALLBACK)&CScript_DataWindow::Script_DataWindow_RecordsBefore, -1, XFA_SCRIPT_Basic}, {0x21d5dfcb, (FX_LPCWSTR)L"currentRecordNumber", (XFA_ATTRIBUTE_CALLBACK)&CScript_DataWindow::Script_DataWindow_CurrentRecordNumber, -1, XFA_SCRIPT_Basic}, {0x312af044, (FX_LPCWSTR)L"recordsAfter", (XFA_ATTRIBUTE_CALLBACK)&CScript_DataWindow::Script_DataWindow_RecordsAfter, -1, XFA_SCRIPT_Basic}, + {0x6aab37cb, (FX_LPCWSTR)L"isDefined", (XFA_ATTRIBUTE_CALLBACK)&CScript_DataWindow::Script_DataWindow_IsDefined, -1, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x42fed1fd, (FX_LPCWSTR)L"contentType", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_ContentType, XFA_SCRIPT_Basic}, + {0x6cfa828a, (FX_LPCWSTR)L"runAt", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_RunAt, XFA_SCRIPT_Basic}, {0xa021b738, (FX_LPCWSTR)L"stateless", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Script_Stateless, -1, XFA_SCRIPT_Basic}, {0xa52682bd, (FX_LPCWSTR)L"{default}", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, + {0xadc4c77b, (FX_LPCWSTR)L"binding", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Binding, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xd6e27f1d, (FX_LPCWSTR)L"value", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0x7a0cc471, (FX_LPCWSTR)L"passwordChar", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_PasswordChar, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xe6f99487, (FX_LPCWSTR)L"hScrollPolicy", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_HScrollPolicy, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xe6f99487, (FX_LPCWSTR)L"hScrollPolicy", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_HScrollPolicy, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x14a32d52, (FX_LPCWSTR)L"pagePosition", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_PagePosition, XFA_SCRIPT_Basic}, + {0x8340ea66, (FX_LPCWSTR)L"oddOrEven", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_OddOrEven, XFA_SCRIPT_Basic}, {0x8e1c2921, (FX_LPCWSTR)L"relevant", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic}, {0xa85e74f3, (FX_LPCWSTR)L"initialNumber", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_InitialNumber, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xbe9ba472, (FX_LPCWSTR)L"numbered", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Numbered, XFA_SCRIPT_Basic}, {0xd70798c2, (FX_LPCWSTR)L"blankOrNotBlank", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_BlankOrNotBlank, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xd6e27f1d, (FX_LPCWSTR)L"value", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x2f16a382, (FX_LPCWSTR)L"type", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x34ae103c, (FX_LPCWSTR)L"reserve", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Reserve, XFA_SCRIPT_Basic}, + {0x570ce835, (FX_LPCWSTR)L"presence", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Presence, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xf2009339, (FX_LPCWSTR)L"placement", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Placement, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x42fed1fd, (FX_LPCWSTR)L"contentType", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_ContentType, XFA_SCRIPT_Basic}, {0x54fa722c, (FX_LPCWSTR)L"transferEncoding", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_TransferEncoding, XFA_SCRIPT_Basic}, + {0xa52682bd, (FX_LPCWSTR)L"{default}", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xc4547a08, (FX_LPCWSTR)L"maxLength", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_MaxLength, XFA_SCRIPT_Basic}, + {0xd6e27f1d, (FX_LPCWSTR)L"value", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, {0xdb55fec5, (FX_LPCWSTR)L"href", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Href, XFA_SCRIPT_Basic}, {0x29418bb7, (FX_LPCWSTR)L"abbr", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Abbr, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf531b059, (FX_LPCWSTR)L"writingScript", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_WritingScript, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0x1b8dce3e, (FX_LPCWSTR)L"action", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Action, XFA_SCRIPT_Basic}, {0xa52682bd, (FX_LPCWSTR)L"{default}", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x9dcc3ab3, (FX_LPCWSTR)L"trailer", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Trailer, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xc8da4da7, (FX_LPCWSTR)L"target", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Target, XFA_SCRIPT_Basic}, {0xcbcaf66d, (FX_LPCWSTR)L"leader", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Leader, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0x2f16a382, (FX_LPCWSTR)L"type", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0x31b19c1, (FX_LPCWSTR)L"name", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xb3543a6, (FX_LPCWSTR)L"max", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_InstanceManager_Max, -1, XFA_SCRIPT_Basic}, {0xb356ca4, (FX_LPCWSTR)L"min", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_InstanceManager_Min, -1, XFA_SCRIPT_Basic}, + {0x6f544d49, (FX_LPCWSTR)L"count", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_InstanceManager_Count, -1, XFA_SCRIPT_Basic}, {0x25363, (FX_LPCWSTR)L"to", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_To, XFA_SCRIPT_Basic}, {0xa0933954, (FX_LPCWSTR)L"unicodeRange", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_UnicodeRange, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xcd7f7b54, (FX_LPCWSTR)L"from", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_From, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x4ef3d02c, (FX_LPCWSTR)L"orientation", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Orientation, XFA_SCRIPT_Basic}, {0x65e30c67, (FX_LPCWSTR)L"imagingBBox", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_ImagingBBox, XFA_SCRIPT_Basic}, + {0x9041d4b0, (FX_LPCWSTR)L"short", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Short, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xe349d044, (FX_LPCWSTR)L"stock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Stock, XFA_SCRIPT_Basic}, + {0xf6b4afb0, (FX_LPCWSTR)L"long", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Long, XFA_SCRIPT_Basic}, {0x5ce6195, (FX_LPCWSTR)L"vScrollPolicy", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_VScrollPolicy, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0x1ef3a64a, (FX_LPCWSTR)L"allowRichText", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_AllowRichText, XFA_SCRIPT_Basic}, {0x5a32e493, (FX_LPCWSTR)L"multiLine", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_MultiLine, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xe6f99487, (FX_LPCWSTR)L"hScrollPolicy", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_HScrollPolicy, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xd52482e0, (FX_LPCWSTR)L"maxEntries", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_MaxEntries, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0x42fed1fd, (FX_LPCWSTR)L"contentType", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_ContentType, XFA_SCRIPT_Basic}, {0x8855805f, (FX_LPCWSTR)L"contains", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Contains, XFA_SCRIPT_Basic}, {0xa52682bd, (FX_LPCWSTR)L"{default}", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, + {0xd6e27f1d, (FX_LPCWSTR)L"value", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, {0xe372ae97, (FX_LPCWSTR)L"isNull", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_IsNull, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0x2b5df51e, (FX_LPCWSTR)L"dataDescription", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_DataDescription, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xbb8df5d, (FX_LPCWSTR)L"ref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Ref, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x226ca8f1, (FX_LPCWSTR)L"operation", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Operation, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xc8da4da7, (FX_LPCWSTR)L"target", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Target, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0x31b19c1, (FX_LPCWSTR)L"name", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xbb8df5d, (FX_LPCWSTR)L"ref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Ref, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x42fed1fd, (FX_LPCWSTR)L"contentType", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_ContentType, XFA_SCRIPT_Basic}, + {0x54fa722c, (FX_LPCWSTR)L"transferEncoding", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_TransferEncoding, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xf197844d, (FX_LPCWSTR)L"match", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Match, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xd996fa9b, (FX_LPCWSTR)L"hand", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Hand, XFA_SCRIPT_Basic}, {0x21aed, (FX_LPCWSTR)L"id", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Id, XFA_SCRIPT_Basic}, {0x31b19c1, (FX_LPCWSTR)L"name", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0xa52682bd, (FX_LPCWSTR)L"{default}", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xd6e27f1d, (FX_LPCWSTR)L"value", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0x28dee6e9, (FX_LPCWSTR)L"format", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Encrypt_Format, -1, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0x68, (FX_LPCWSTR)L"h", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_H, XFA_SCRIPT_Basic}, {0x77, (FX_LPCWSTR)L"w", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_W, XFA_SCRIPT_Basic}, + {0x78, (FX_LPCWSTR)L"x", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_X, XFA_SCRIPT_Basic}, {0x79, (FX_LPCWSTR)L"y", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Y, XFA_SCRIPT_Basic}, {0x2282c73, (FX_LPCWSTR)L"hAlign", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_HAlign, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x2ee7678f, (FX_LPCWSTR)L"rotate", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Rotate, XFA_SCRIPT_Basic}, {0x570ce835, (FX_LPCWSTR)L"presence", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Presence, XFA_SCRIPT_Basic}, + {0x7a7cc341, (FX_LPCWSTR)L"vAlign", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_VAlign, XFA_SCRIPT_Basic}, {0x7c2ff6ae, (FX_LPCWSTR)L"maxH", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_MaxH, XFA_SCRIPT_Basic}, {0x7c2ff6bd, (FX_LPCWSTR)L"maxW", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_MaxW, XFA_SCRIPT_Basic}, + {0x7d02356c, (FX_LPCWSTR)L"minH", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_MinH, XFA_SCRIPT_Basic}, {0x7d02357b, (FX_LPCWSTR)L"minW", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_MinW, XFA_SCRIPT_Basic}, {0x8e1c2921, (FX_LPCWSTR)L"relevant", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic}, + {0xa03cf627, (FX_LPCWSTR)L"rawValue", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, {0xa52682bd, (FX_LPCWSTR)L"{default}", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, {0xac06e2b0, (FX_LPCWSTR)L"colSpan", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_ColSpan, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xbc8fa350, (FX_LPCWSTR)L"locale", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Locale, XFA_SCRIPT_Basic}, {0xc2bd40fd, (FX_LPCWSTR)L"anchorType", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_AnchorType, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x39cdb0a2, (FX_LPCWSTR)L"priority", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Priority, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xeb511b54, (FX_LPCWSTR)L"disable", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Disable, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xd6e27f1d, (FX_LPCWSTR)L"value", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Value, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x2f16a382, (FX_LPCWSTR)L"type", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0x21aed, (FX_LPCWSTR)L"id", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Id, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x2f16a382, (FX_LPCWSTR)L"type", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x570ce835, (FX_LPCWSTR)L"presence", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Presence, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xcb0ac9, (FX_LPCWSTR)L"lineThrough", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_LineThrough, XFA_SCRIPT_Basic}, {0x2c1c7f1, (FX_LPCWSTR)L"typeface", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Typeface, XFA_SCRIPT_Basic}, {0x8c74ae9, (FX_LPCWSTR)L"fontHorizontalScale", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_FontHorizontalScale, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x2cd79033, (FX_LPCWSTR)L"kerningMode", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_KerningMode, XFA_SCRIPT_Basic}, {0x3a0273a6, (FX_LPCWSTR)L"underline", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Underline, XFA_SCRIPT_Basic}, + {0x4873c601, (FX_LPCWSTR)L"baselineShift", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_BaselineShift, XFA_SCRIPT_Basic}, {0x4b319767, (FX_LPCWSTR)L"overlinePeriod", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_OverlinePeriod, XFA_SCRIPT_Basic}, {0x79543055, (FX_LPCWSTR)L"letterSpacing", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_LetterSpacing, XFA_SCRIPT_Basic}, + {0x8ec6204c, (FX_LPCWSTR)L"lineThroughPeriod", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_LineThroughPeriod, XFA_SCRIPT_Basic}, {0x907c7719, (FX_LPCWSTR)L"fontVerticalScale", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_FontVerticalScale, XFA_SCRIPT_Basic}, {0xa686975b, (FX_LPCWSTR)L"size", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Size, XFA_SCRIPT_Basic}, + {0xb5e49bf2, (FX_LPCWSTR)L"posture", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Posture, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xbd6e1d88, (FX_LPCWSTR)L"weight", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Weight, XFA_SCRIPT_Basic}, + {0xbd96a0e9, (FX_LPCWSTR)L"underlinePeriod", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_UnderlinePeriod, XFA_SCRIPT_Basic}, {0xc0ec9fa4, (FX_LPCWSTR)L"overline", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Overline, XFA_SCRIPT_Basic}, {0xaf754613, (FX_LPCWSTR)L"checksum", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Form_Checksum, -1, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xa52682bd, (FX_LPCWSTR)L"{default}", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xd6e27f1d, (FX_LPCWSTR)L"value", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x8e1c2921, (FX_LPCWSTR)L"relevant", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xea7090a0, (FX_LPCWSTR)L"override", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Override, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x9dcc3ab3, (FX_LPCWSTR)L"trailer", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Trailer, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xcbcaf66d, (FX_LPCWSTR)L"leader", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Leader, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0x60a61edd, (FX_LPCWSTR)L"codeType", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_CodeType, XFA_SCRIPT_Basic}, {0xb373a862, (FX_LPCWSTR)L"archive", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Archive, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xe1a26b56, (FX_LPCWSTR)L"codeBase", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_CodeBase, XFA_SCRIPT_Basic}, {0xeb091003, (FX_LPCWSTR)L"classId", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_ClassId, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0x47d03490, (FX_LPCWSTR)L"connection", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Connection, XFA_SCRIPT_Basic}, + {0xc39a88bd, (FX_LPCWSTR)L"labelRef", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_LabelRef, XFA_SCRIPT_Basic}, {0xd50f903a, (FX_LPCWSTR)L"valueRef", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_ValueRef, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xea7090a0, (FX_LPCWSTR)L"override", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Override, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x2f16a382, (FX_LPCWSTR)L"type", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Extras_Type, -1, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xbb8df5d, (FX_LPCWSTR)L"ref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Ref, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x24d85167, (FX_LPCWSTR)L"timeout", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Timeout, XFA_SCRIPT_Basic}, + {0x47d03490, (FX_LPCWSTR)L"connection", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Connection, XFA_SCRIPT_Basic}, {0x552d9ad5, (FX_LPCWSTR)L"usage", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usage, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xc860f30a, (FX_LPCWSTR)L"delayedOpen", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_DelayedOpen, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x28dee6e9, (FX_LPCWSTR)L"format", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Format, XFA_SCRIPT_Basic}, {0x824f21b7, (FX_LPCWSTR)L"embedPDF", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_EmbedPDF, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xc8da4da7, (FX_LPCWSTR)L"target", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Target, XFA_SCRIPT_Basic}, {0xdc75676c, (FX_LPCWSTR)L"textEncoding", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_TextEncoding, XFA_SCRIPT_Basic}, + {0xf889e747, (FX_LPCWSTR)L"xdpContent", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_XdpContent, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0x97be91b, (FX_LPCWSTR)L"content", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Packet_Content, -1, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0x4156ee3f, (FX_LPCWSTR)L"delimiter", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Delimiter, XFA_SCRIPT_Basic}, + {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x2f16a382, (FX_LPCWSTR)L"type", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0x21aed, (FX_LPCWSTR)L"id", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Id, XFA_SCRIPT_Basic}, {0x31b19c1, (FX_LPCWSTR)L"name", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbb8df5d, (FX_LPCWSTR)L"ref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Ref, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0x21aed, (FX_LPCWSTR)L"id", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Id, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0x2f16a382, (FX_LPCWSTR)L"type", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, + {0x453eaf38, (FX_LPCWSTR)L"startNew", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_StartNew, XFA_SCRIPT_Basic}, {0x9dcc3ab3, (FX_LPCWSTR)L"trailer", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Trailer, XFA_SCRIPT_Basic}, {0xa6118c89, (FX_LPCWSTR)L"targetType", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_TargetType, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xc8da4da7, (FX_LPCWSTR)L"target", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Target, XFA_SCRIPT_Basic}, {0xcbcaf66d, (FX_LPCWSTR)L"leader", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Leader, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xabef37e3, (FX_LPCWSTR)L"slope", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Slope, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, + {0xd996fa9b, (FX_LPCWSTR)L"hand", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Hand, XFA_SCRIPT_Basic}, {0xa60dd202, (FX_LPCWSTR)L"length", (XFA_ATTRIBUTE_CALLBACK)&CXFA_NodeList::Script_ListClass_Length, -1, XFA_SCRIPT_Basic}, {0x20146, (FX_LPCWSTR)L"db", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Source_Db, -1, XFA_SCRIPT_Basic}, + {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xb3543a6, (FX_LPCWSTR)L"max", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Occur_Max, -1, XFA_SCRIPT_Basic}, + {0xb356ca4, (FX_LPCWSTR)L"min", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Occur_Min, -1, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x7d0b5fca, (FX_LPCWSTR)L"initial", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Initial, XFA_SCRIPT_Basic}, + {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0x29418bb7, (FX_LPCWSTR)L"abbr", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Abbr, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, + {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0x31b19c1, (FX_LPCWSTR)L"name", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic}, {0xbe52dfbf, (FX_LPCWSTR)L"desc", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic}, {0xf6b47749, (FX_LPCWSTR)L"lock", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL, XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic}, + {0xbb8df5d, (FX_LPCWSTR)L"ref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Ref, XFA_SCRIPT_Basic}, {0xc0811ed, (FX_LPCWSTR)L"use", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic}, {0x570ce835, (FX_LPCWSTR)L"presence", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Presence, XFA_SCRIPT_Basic}, + {0xa5b410cf, (FX_LPCWSTR)L"save", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Save, XFA_SCRIPT_Basic}, {0xbc254332, (FX_LPCWSTR)L"usehref", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic}, {0xb2c80857, (FX_LPCWSTR)L"className", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Object::Script_ObjectClass_ClassName, -1, XFA_SCRIPT_Basic}, + {0xa60dd202, (FX_LPCWSTR)L"length", (XFA_ATTRIBUTE_CALLBACK)&CXFA_NodeList::Script_ListClass_Length, -1, XFA_SCRIPT_Basic}, {0x31b19c1, (FX_LPCWSTR)L"name", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic}, {0x9f9d0f9, (FX_LPCWSTR)L"all", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_TreeClass_All, -1, XFA_SCRIPT_Object}, + {0x4df15659, (FX_LPCWSTR)L"nodes", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_TreeClass_Nodes, -1, XFA_SCRIPT_Object}, {0x78a8d6cf, (FX_LPCWSTR)L"classAll", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_TreeClass_ClassAll, -1, XFA_SCRIPT_Object}, {0xcad6d8ca, (FX_LPCWSTR)L"parent", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_TreeClass_Parent, -1, XFA_SCRIPT_Object}, + {0xd5679c78, (FX_LPCWSTR)L"index", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_TreeClass_Index, -1, XFA_SCRIPT_Basic}, {0xdb5b4bce, (FX_LPCWSTR)L"classIndex", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_TreeClass_ClassIndex, -1, XFA_SCRIPT_Basic}, {0xe4989adf, (FX_LPCWSTR)L"somExpression", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_TreeClass_SomExpression, -1, XFA_SCRIPT_Basic}, + {0x21aed, (FX_LPCWSTR)L"id", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String, XFA_ATTRIBUTE_Id, XFA_SCRIPT_Basic}, {0x234a1, (FX_LPCWSTR)L"ns", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_NodeClass_Ns, -1, XFA_SCRIPT_Basic}, {0x50d1a9d1, (FX_LPCWSTR)L"model", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_NodeClass_Model, -1, XFA_SCRIPT_Object}, + {0xacb4823f, (FX_LPCWSTR)L"isContainer", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_NodeClass_IsContainer, -1, XFA_SCRIPT_Basic}, {0xe372ae97, (FX_LPCWSTR)L"isNull", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_NodeClass_IsNull, -1, XFA_SCRIPT_Basic}, {0xfe612a5b, (FX_LPCWSTR)L"oneOfChild", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_NodeClass_OneOfChild, -1, XFA_SCRIPT_Object}, + {0x97c1c65, (FX_LPCWSTR)L"context", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_ModelClass_Context, -1, XFA_SCRIPT_Object}, {0x58be2870, (FX_LPCWSTR)L"aliasNode", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_ModelClass_AliasNode, -1, XFA_SCRIPT_Object}, {0xa52682bd, (FX_LPCWSTR)L"{default}", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, + {0xd6e27f1d, (FX_LPCWSTR)L"value", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1, XFA_SCRIPT_Basic}, +}; +extern const FX_INT32 g_iSomAttributeCount = sizeof(g_SomAttributeData) / sizeof(XFA_ATTRIBUTEINFO); diff --git a/xfa/src/fxfa/src/parser/xfa_basic_imp.cpp b/xfa/src/fxfa/src/parser/xfa_basic_imp.cpp new file mode 100644 index 0000000000..2d8f173f0f --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_basic_imp.cpp @@ -0,0 +1,634 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_utils.h" +#include "../common/xfa_object.h" +#include "../common/xfa_document.h" +#include "../common/xfa_parser.h" +#include "../common/xfa_script.h" +#include "../common/xfa_docdata.h" +#include "../common/xfa_doclayout.h" +#include "../common/xfa_debug.h" +#include "../common/xfa_localemgr.h" +#include "../common/xfa_fm2jsapi.h" +#include "xfa_debug_parser.h" +#include "xfa_basic_imp.h" +extern const XFA_PACKETINFO g_XFAPacketData[]; +extern const FX_INT32 g_iXFAPacketCount; +extern const XFA_ATTRIBUTEENUMINFO g_XFAEnumData[]; +extern const FX_INT32 g_iXFAEnumCount; +extern const XFA_ATTRIBUTEINFO g_XFAAttributeData[]; +extern const FX_INT32 g_iXFAAttributeCount; +extern const XFA_ELEMENTINFO g_XFAElementData[]; +extern const FX_INT32 g_iXFAElementCount; +extern const XFA_ELEMENTHIERARCHY g_XFAElementChildrenIndex[]; +extern const FX_WORD g_XFAElementChildrenData[]; +extern const XFA_ELEMENTHIERARCHY g_XFAElementAttributeIndex[]; +extern const FX_BYTE g_XFAElementAttributeData[]; +extern const XFA_NOTSUREATTRIBUTE g_XFANotsureAttributes[]; +extern const FX_INT32 g_iXFANotsureCount; +extern const XFA_ELEMENTHIERARCHY g_XFAElementPropertyIndex[]; +extern const XFA_PROPERTY g_XFAElementPropertyData[]; +extern const XFA_SCRIPTHIERARCHY g_XFAScriptIndex[]; +extern const XFA_METHODINFO g_SomMethodData[]; +extern const FX_INT32 g_iSomMethodCount; +extern const XFA_SCRIPTATTRIBUTEINFO g_SomAttributeData[]; +extern const FX_INT32 g_iSomAttributeCount; +XFA_LPCPACKETINFO XFA_GetPacketByName(FX_WSTR wsName) +{ + FX_INT32 iLength = wsName.GetLength(); + if (iLength == 0) { + return NULL; + } + FX_UINT32 uHash = FX_HashCode_String_GetW(wsName.GetPtr(), iLength); + FX_INT32 iStart = 0, iEnd = g_iXFAPacketCount - 1; + do { + FX_INT32 iMid = (iStart + iEnd) / 2; + XFA_LPCPACKETINFO pInfo = g_XFAPacketData + iMid; + if (uHash == pInfo->uHash) { + return pInfo; + } else if (uHash < pInfo->uHash) { + iEnd = iMid - 1; + } else { + iStart = iMid + 1; + } + } while (iStart <= iEnd); + return NULL; +} +XFA_LPCPACKETINFO XFA_GetPacketByID(FX_DWORD dwPacket) +{ + FX_INT32 iStart = 0, iEnd = g_iXFAPacketCount - 1; + do { + FX_INT32 iMid = (iStart + iEnd) / 2; + FX_DWORD dwFind = (g_XFAPacketData + iMid)->eName; + if (dwPacket == dwFind) { + return g_XFAPacketData + iMid; + } else if (dwPacket < dwFind) { + iEnd = iMid - 1; + } else { + iStart = iMid + 1; + } + } while (iStart <= iEnd); + return NULL; +} +XFA_LPCATTRIBUTEENUMINFO XFA_GetAttributeEnumByName(FX_WSTR wsName) +{ + FX_INT32 iLength = wsName.GetLength(); + if (iLength == 0) { + return NULL; + } + FX_UINT32 uHash = FX_HashCode_String_GetW(wsName.GetPtr(), iLength); + FX_INT32 iStart = 0, iEnd = g_iXFAEnumCount - 1; + do { + FX_INT32 iMid = (iStart + iEnd) / 2; + XFA_LPCATTRIBUTEENUMINFO pInfo = g_XFAEnumData + iMid; + if (uHash == pInfo->uHash) { + return pInfo; + } else if (uHash < pInfo->uHash) { + iEnd = iMid - 1; + } else { + iStart = iMid + 1; + } + } while (iStart <= iEnd); + return NULL; +} +XFA_LPCATTRIBUTEENUMINFO XFA_GetAttributeEnumByID(XFA_ATTRIBUTEENUM eName) +{ + return g_XFAEnumData + eName; +} +FX_INT32 XFA_GetAttributeCount() +{ + return g_iXFAAttributeCount; +} +XFA_LPCATTRIBUTEINFO XFA_GetAttributeByName(FX_WSTR wsName) +{ + FX_INT32 iLength = wsName.GetLength(); + if (iLength == 0) { + return NULL; + } + FX_UINT32 uHash = FX_HashCode_String_GetW(wsName.GetPtr(), iLength); + FX_INT32 iStart = 0, iEnd = g_iXFAAttributeCount - 1; + do { + FX_INT32 iMid = (iStart + iEnd) / 2; + XFA_LPCATTRIBUTEINFO pInfo = g_XFAAttributeData + iMid; + if (uHash == pInfo->uHash) { + return pInfo; + } else if (uHash < pInfo->uHash) { + iEnd = iMid - 1; + } else { + iStart = iMid + 1; + } + } while (iStart <= iEnd); + return NULL; +} +XFA_LPCATTRIBUTEINFO XFA_GetAttributeByID(XFA_ATTRIBUTE eName) +{ + return (eName < g_iXFAAttributeCount) ? (g_XFAAttributeData + eName) : NULL; +} +FX_BOOL XFA_GetAttributeDefaultValue(FX_LPVOID &pValue, XFA_ELEMENT eElement, XFA_ATTRIBUTE eAttribute, XFA_ATTRIBUTETYPE eType, FX_DWORD dwPacket) +{ + XFA_LPCATTRIBUTEINFO pInfo = XFA_GetAttributeByID(eAttribute); + if (pInfo == NULL) { + return FALSE; + } + if (dwPacket && (dwPacket & pInfo->dwPackets) == 0) { + return FALSE; + } + if (pInfo->eType == eType) { + pValue = pInfo->pDefValue; + return TRUE; + } else if (pInfo->eType == XFA_ATTRIBUTETYPE_NOTSURE) { + XFA_LPCNOTSUREATTRIBUTE pAttr = XFA_GetNotsureAttribute(eElement, eAttribute, eType); + if (pAttr) { + pValue = pAttr->pValue; + return TRUE; + } + } + return FALSE; +} +XFA_ATTRIBUTEENUM XFA_GetAttributeDefaultValue_Enum(XFA_ELEMENT eElement, XFA_ATTRIBUTE eAttribute, FX_DWORD dwPacket) +{ + FX_LPVOID pValue; + if (XFA_GetAttributeDefaultValue(pValue, eElement, eAttribute, XFA_ATTRIBUTETYPE_Enum, dwPacket)) { + return (XFA_ATTRIBUTEENUM)(FX_UINTPTR)pValue; + } + return XFA_ATTRIBUTEENUM_Unknown; +} +CFX_WideStringC XFA_GetAttributeDefaultValue_Cdata(XFA_ELEMENT eElement, XFA_ATTRIBUTE eAttribute, FX_DWORD dwPacket) +{ + FX_LPVOID pValue; + if (XFA_GetAttributeDefaultValue(pValue, eElement, eAttribute, XFA_ATTRIBUTETYPE_Cdata, dwPacket)) { + return (FX_LPCWSTR)pValue; + } + return NULL; +} +FX_BOOL XFA_GetAttributeDefaultValue_Boolean(XFA_ELEMENT eElement, XFA_ATTRIBUTE eAttribute, FX_DWORD dwPacket) +{ + FX_LPVOID pValue; + if (XFA_GetAttributeDefaultValue(pValue, eElement, eAttribute, XFA_ATTRIBUTETYPE_Boolean, dwPacket)) { + return (FX_BOOL)(FX_UINTPTR)pValue; + } + return FALSE; +} +FX_INT32 XFA_GetAttributeDefaultValue_Integer(XFA_ELEMENT eElement, XFA_ATTRIBUTE eAttribute, FX_DWORD dwPacket) +{ + FX_LPVOID pValue; + if (XFA_GetAttributeDefaultValue(pValue, eElement, eAttribute, XFA_ATTRIBUTETYPE_Integer, dwPacket)) { + return (FX_INT32)(FX_UINTPTR)pValue; + } + return 0; +} +CXFA_Measurement XFA_GetAttributeDefaultValue_Measure(XFA_ELEMENT eElement, XFA_ATTRIBUTE eAttribute, FX_DWORD dwPacket) +{ + FX_LPVOID pValue; + if (XFA_GetAttributeDefaultValue(pValue, eElement, eAttribute, XFA_ATTRIBUTETYPE_Measure, dwPacket)) { + return *(CXFA_Measurement*)pValue; + } + return CXFA_Measurement(); +} +FX_INT32 XFA_GetElementCount() +{ + return g_iXFAElementCount; +} +XFA_LPCELEMENTINFO XFA_GetElementByName(FX_WSTR wsName) +{ + FX_INT32 iLength = wsName.GetLength(); + if (iLength == 0) { + return NULL; + } + FX_UINT32 uHash = FX_HashCode_String_GetW(wsName.GetPtr(), iLength); + FX_INT32 iStart = 0, iEnd = g_iXFAElementCount - 1; + do { + FX_INT32 iMid = (iStart + iEnd) / 2; + XFA_LPCELEMENTINFO pInfo = g_XFAElementData + iMid; + if (uHash == pInfo->uHash) { + return pInfo; + } else if (uHash < pInfo->uHash) { + iEnd = iMid - 1; + } else { + iStart = iMid + 1; + } + } while (iStart <= iEnd); + return NULL; +} +XFA_LPCELEMENTINFO XFA_GetElementByID(XFA_ELEMENT eName) +{ + return (eName < g_iXFAElementCount) ? (g_XFAElementData + eName) : NULL; +} +FX_LPCWORD XFA_GetElementChildren(XFA_ELEMENT eElement, FX_INT32 &iCount) +{ + if (eElement >= g_iXFAElementCount) { + return NULL; + } + XFA_LPCELEMENTHIERARCHY pElement = g_XFAElementChildrenIndex + eElement; + iCount = pElement->wCount; + return g_XFAElementChildrenData + pElement->wStart; +} +FX_LPCBYTE XFA_GetElementAttributes(XFA_ELEMENT eElement, FX_INT32 &iCount) +{ + if (eElement >= g_iXFAElementCount) { + return NULL; + } + XFA_LPCELEMENTHIERARCHY pElement = g_XFAElementAttributeIndex + eElement; + iCount = pElement->wCount; + return g_XFAElementAttributeData + pElement->wStart; +} +XFA_LPCATTRIBUTEINFO XFA_GetAttributeOfElement(XFA_ELEMENT eElement, XFA_ATTRIBUTE eAttribute, FX_DWORD dwPacket) +{ + FX_INT32 iCount = 0; + FX_LPCBYTE pAttr = XFA_GetElementAttributes(eElement, iCount); + if (pAttr == NULL || iCount < 1) { + return NULL; + } + CFX_DSPATemplate search; + FX_INT32 index = search.Lookup(eAttribute, pAttr, iCount); + if (index < 0) { + return NULL; + } + XFA_LPCATTRIBUTEINFO pInfo = XFA_GetAttributeByID(eAttribute); + ASSERT(pInfo != NULL); + if (dwPacket == XFA_XDPPACKET_UNKNOWN) { + return pInfo; + } + return (dwPacket & pInfo->dwPackets) ? pInfo : NULL; +} +XFA_LPCELEMENTINFO XFA_GetChildOfElement(XFA_ELEMENT eElement, XFA_ELEMENT eChild, FX_DWORD dwPacket) +{ + FX_INT32 iCount = 0; + FX_LPCWORD pChild = XFA_GetElementChildren(eElement, iCount); + if (pChild == NULL || iCount < 1) { + return NULL; + } + CFX_DSPATemplate search; + FX_INT32 index = search.Lookup(eChild, pChild, iCount); + if (index < 0) { + return NULL; + } + XFA_LPCELEMENTINFO pInfo = XFA_GetElementByID(eChild); + ASSERT(pInfo != NULL); + if (dwPacket == XFA_XDPPACKET_UNKNOWN) { + return pInfo; + } + return (dwPacket & pInfo->dwPackets) ? pInfo : NULL; +} +XFA_LPCPROPERTY XFA_GetElementProperties(XFA_ELEMENT eElement, FX_INT32 &iCount) +{ + if (eElement >= g_iXFAElementCount) { + return NULL; + } + XFA_LPCELEMENTHIERARCHY pElement = g_XFAElementPropertyIndex + eElement; + iCount = pElement->wCount; + return g_XFAElementPropertyData + pElement->wStart; +} +XFA_LPCPROPERTY XFA_GetPropertyOfElement(XFA_ELEMENT eElement, XFA_ELEMENT eProperty, FX_DWORD dwPacket) +{ + FX_INT32 iCount = 0; + XFA_LPCPROPERTY pProperty = XFA_GetElementProperties(eElement, iCount); + if (pProperty == NULL || iCount < 1) { + return NULL; + } + FX_INT32 iStart = 0, iEnd = iCount - 1, iMid; + do { + iMid = (iStart + iEnd) / 2; + XFA_ELEMENT eName = (XFA_ELEMENT)pProperty[iMid].eName; + if (eProperty == eName) { + break; + } else if (eProperty < eName) { + iEnd = iMid - 1; + } else { + iStart = iMid + 1; + } + } while (iStart <= iEnd); + if (iStart > iEnd) { + return NULL; + } + XFA_LPCELEMENTINFO pInfo = XFA_GetElementByID(eProperty); + ASSERT(pInfo != NULL); + if (dwPacket == XFA_XDPPACKET_UNKNOWN) { + return pProperty + iMid; + } + return (dwPacket & pInfo->dwPackets) ? (pProperty + iMid) : NULL; +} +XFA_LPCNOTSUREATTRIBUTE XFA_GetNotsureAttribute(XFA_ELEMENT eElement, XFA_ATTRIBUTE eAttribute, XFA_ATTRIBUTETYPE eType) +{ + FX_INT32 iStart = 0, iEnd = g_iXFANotsureCount - 1; + do { + FX_INT32 iMid = (iStart + iEnd) / 2; + XFA_LPCNOTSUREATTRIBUTE pAttr = g_XFANotsureAttributes + iMid; + if (eElement == pAttr->eElement) { + if (pAttr->eAttribute == eAttribute) { + if (eType == XFA_ATTRIBUTETYPE_NOTSURE || eType == pAttr->eType) { + return pAttr; + } + return NULL; + } else { + FX_INT32 iBefore = iMid - 1; + if(iBefore >= 0) { + pAttr = g_XFANotsureAttributes + iBefore; + while(eElement == pAttr->eElement) { + if(pAttr->eAttribute == eAttribute) { + if (eType == XFA_ATTRIBUTETYPE_NOTSURE || eType == pAttr->eType) { + return pAttr; + } + return NULL; + } + iBefore --; + if(iBefore < 0) { + break; + } + pAttr = g_XFANotsureAttributes + iBefore; + } + } + FX_INT32 iAfter = iMid + 1; + if(iAfter <= g_iXFANotsureCount - 1) { + pAttr = g_XFANotsureAttributes + iAfter; + while(eElement == pAttr->eElement) { + if(pAttr->eAttribute == eAttribute) { + if (eType == XFA_ATTRIBUTETYPE_NOTSURE || eType == pAttr->eType) { + return pAttr; + } + return NULL; + } + iAfter ++; + if(iAfter > g_iXFANotsureCount - 1) { + break; + } + pAttr = g_XFANotsureAttributes + iAfter; + } + } + return NULL; + } + } else if (eElement < pAttr->eElement) { + iEnd = iMid - 1; + } else { + iStart = iMid + 1; + } + } while (iStart <= iEnd); + return NULL; +} +FX_INT32 XFA_GetMethodCount() +{ + return g_iSomMethodCount; +} +XFA_LPCMETHODINFO XFA_GetMethodByName(XFA_ELEMENT eElement, FX_WSTR wsMethodName) +{ + FX_INT32 iLength = wsMethodName.GetLength(); + if (iLength == 0) { + return NULL; + } + FX_INT32 iElementIndex = eElement; + while(iElementIndex != -1) { + XFA_LPCSCRIPTHIERARCHY scriptIndex = g_XFAScriptIndex + iElementIndex; + FX_INT32 icount = scriptIndex->wMethodCount; + if(icount == 0) { + iElementIndex = scriptIndex->wParentIndex; + continue; + } + FX_UINT32 uHash = FX_HashCode_String_GetW(wsMethodName.GetPtr(), iLength); + FX_INT32 iStart = scriptIndex->wMethodStart, iEnd = iStart + icount - 1; + do { + FX_INT32 iMid = (iStart + iEnd) / 2; + XFA_LPCMETHODINFO pInfo = g_SomMethodData + iMid; + if (uHash == pInfo->uHash) { + return pInfo; + } else if (uHash < pInfo->uHash) { + iEnd = iMid - 1; + } else { + iStart = iMid + 1; + } + } while (iStart <= iEnd); + iElementIndex = scriptIndex->wParentIndex; + } + return NULL; +} +XFA_LPCSCRIPTATTRIBUTEINFO XFA_GetScriptAttributeByName(XFA_ELEMENT eElement, FX_WSTR wsAttributeName) +{ + FX_INT32 iLength = wsAttributeName.GetLength(); + if (iLength == 0) { + return NULL; + } + FX_INT32 iElementIndex = eElement; + while(iElementIndex != -1) { + XFA_LPCSCRIPTHIERARCHY scriptIndex = g_XFAScriptIndex + iElementIndex; + FX_INT32 icount = scriptIndex->wAttributeCount; + if(icount == 0) { + iElementIndex = scriptIndex->wParentIndex; + continue; + } + FX_UINT32 uHash = FX_HashCode_String_GetW(wsAttributeName.GetPtr(), iLength); + FX_INT32 iStart = scriptIndex->wAttributeStart, iEnd = iStart + icount - 1; + do { + FX_INT32 iMid = (iStart + iEnd) / 2; + XFA_LPCSCRIPTATTRIBUTEINFO pInfo = g_SomAttributeData + iMid; + if (uHash == pInfo->uHash) { + return pInfo; + } else if (uHash < pInfo->uHash) { + iEnd = iMid - 1; + } else { + iStart = iMid + 1; + } + } while (iStart <= iEnd); + iElementIndex = scriptIndex->wParentIndex; + } + return NULL; +} +void CXFA_Measurement::Set(FX_WSTR wsMeasure) +{ + if (wsMeasure.IsEmpty()) { + m_fValue = 0; + m_eUnit = XFA_UNIT_Unknown; + return; + } + FX_INT32 iUsedLen = 0; + FX_INT32 iOffset = (wsMeasure.GetAt(0) == L'=') ? 1 : 0; + FX_FLOAT fValue = FX_wcstof(wsMeasure.GetPtr() + iOffset, wsMeasure.GetLength() - iOffset, &iUsedLen); + XFA_UNIT eUnit = GetUnit(wsMeasure.Mid(iOffset + iUsedLen)); + Set(fValue, eUnit); +} +FX_BOOL CXFA_Measurement::ToString(CFX_WideString &wsMeasure) const +{ + switch (GetUnit()) { + case XFA_UNIT_Mm: + wsMeasure.Format((FX_LPCWSTR)L"%.8gmm", GetValue()); + return TRUE; + case XFA_UNIT_Pt: + wsMeasure.Format((FX_LPCWSTR)L"%.8gpt", GetValue()); + return TRUE; + case XFA_UNIT_In: + wsMeasure.Format((FX_LPCWSTR)L"%.8gin", GetValue()); + return TRUE; + case XFA_UNIT_Cm: + wsMeasure.Format((FX_LPCWSTR)L"%.8gcm", GetValue()); + return TRUE; + case XFA_UNIT_Mp: + wsMeasure.Format((FX_LPCWSTR)L"%.8gmp", GetValue()); + return TRUE; + case XFA_UNIT_Pc: + wsMeasure.Format((FX_LPCWSTR)L"%.8gpc", GetValue()); + return TRUE; + case XFA_UNIT_Em: + wsMeasure.Format((FX_LPCWSTR)L"%.8gem", GetValue()); + return TRUE; + case XFA_UNIT_Percent: + wsMeasure.Format((FX_LPCWSTR)L"%.8g%%", GetValue()); + return TRUE; + default: + wsMeasure.Format((FX_LPCWSTR)L"%.8g", GetValue()); + return FALSE; + } +} +FX_BOOL CXFA_Measurement::ToUnit(XFA_UNIT eUnit, FX_FLOAT &fValue) const +{ + fValue = GetValue(); + XFA_UNIT eFrom = GetUnit(); + if (eFrom == eUnit) { + return TRUE; + } + switch (eFrom) { + case XFA_UNIT_Pt: + break; + case XFA_UNIT_Mm: + fValue *= 72 / 2.54f / 10; + break; + case XFA_UNIT_In: + fValue *= 72; + break; + case XFA_UNIT_Cm: + fValue *= 72 / 2.54f; + break; + case XFA_UNIT_Mp: + fValue *= 0.001f; + break; + case XFA_UNIT_Pc: + fValue *= 12.0f; + break; + default: + fValue = 0; + return FALSE; + } + switch (eUnit) { + case XFA_UNIT_Pt: + return TRUE; + case XFA_UNIT_Mm: + fValue /= 72 / 2.54f / 10; + return TRUE; + case XFA_UNIT_In: + fValue /= 72; + return TRUE; + case XFA_UNIT_Cm: + fValue /= 72 / 2.54f; + return TRUE; + case XFA_UNIT_Mp: + fValue /= 0.001f; + return TRUE; + case XFA_UNIT_Pc: + fValue /= 12.0f; + return TRUE; + default: + fValue = 0; + return FALSE; + } + return FALSE; +} +XFA_UNIT CXFA_Measurement::GetUnit(FX_WSTR wsUnit) +{ + if (wsUnit == FX_WSTRC(L"mm")) { + return XFA_UNIT_Mm; + } else if (wsUnit == FX_WSTRC(L"pt")) { + return XFA_UNIT_Pt; + } else if (wsUnit == FX_WSTRC(L"in")) { + return XFA_UNIT_In; + } else if (wsUnit == FX_WSTRC(L"cm")) { + return XFA_UNIT_Cm; + } else if (wsUnit == FX_WSTRC(L"pc")) { + return XFA_UNIT_Pc; + } else if (wsUnit == FX_WSTRC(L"mp")) { + return XFA_UNIT_Mp; + } else if (wsUnit == FX_WSTRC(L"em")) { + return XFA_UNIT_Em; + } else if (wsUnit == FX_WSTRC(L"%")) { + return XFA_UNIT_Percent; + } else { + return XFA_UNIT_Unknown; + } +} +IFX_Stream* XFA_CreateWideTextRead(const CFX_WideString &wsBuffer) +{ + return FX_NEW CXFA_WideTextRead(wsBuffer); +} +CXFA_WideTextRead::CXFA_WideTextRead(const CFX_WideString &wsBuffer) + : m_wsBuffer(wsBuffer) + , m_iPosition(0) + , m_iRefCount(1) +{ +} +void CXFA_WideTextRead::Release() +{ + if (--m_iRefCount < 1) { + delete this; + } +} +IFX_Stream* CXFA_WideTextRead::Retain() +{ + m_iRefCount++; + return this; +} +FX_DWORD CXFA_WideTextRead::GetAccessModes() const +{ + return FX_STREAMACCESS_Read | FX_STREAMACCESS_Text; +} +FX_INT32 CXFA_WideTextRead::GetLength() const +{ + return m_wsBuffer.GetLength() * sizeof(FX_WCHAR); +} +FX_INT32 CXFA_WideTextRead::Seek(FX_STREAMSEEK eSeek, FX_INT32 iOffset) +{ + switch (eSeek) { + case FX_STREAMSEEK_Begin: + m_iPosition = iOffset; + break; + case FX_STREAMSEEK_Current: + m_iPosition += iOffset; + break; + case FX_STREAMSEEK_End: + m_iPosition = m_wsBuffer.GetLength() + iOffset; + break; + } + if (m_iPosition < 0) { + m_iPosition = 0; + } + if (m_iPosition > m_wsBuffer.GetLength()) { + m_iPosition = m_wsBuffer.GetLength(); + } + return GetPosition(); +} +FX_INT32 CXFA_WideTextRead::GetPosition() +{ + return m_iPosition * sizeof(FX_WCHAR); +} +FX_BOOL CXFA_WideTextRead::IsEOF() const +{ + return m_iPosition >= m_wsBuffer.GetLength(); +} +FX_INT32 CXFA_WideTextRead::ReadString(FX_LPWSTR pStr, FX_INT32 iMaxLength, FX_BOOL &bEOS, FX_INT32 const *pByteSize ) +{ + if (iMaxLength > m_wsBuffer.GetLength() - m_iPosition) { + iMaxLength = m_wsBuffer.GetLength() - m_iPosition; + } + FXSYS_wcsncpy(pStr, (FX_LPCWSTR)m_wsBuffer + m_iPosition, iMaxLength); + m_iPosition += iMaxLength; + bEOS = IsEOF(); + return iMaxLength; +} +FX_WORD CXFA_WideTextRead::GetCodePage() const +{ + return (sizeof(FX_WCHAR) == 2) ? FX_CODEPAGE_UTF16LE : FX_CODEPAGE_UTF32LE; +} +FX_WORD CXFA_WideTextRead::SetCodePage(FX_WORD wCodePage) +{ + return GetCodePage(); +} diff --git a/xfa/src/fxfa/src/parser/xfa_basic_imp.h b/xfa/src/fxfa/src/parser/xfa_basic_imp.h new file mode 100644 index 0000000000..7fced07a05 --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_basic_imp.h @@ -0,0 +1,73 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _XFA_BASIC_IMP +#define _XFA_BASIC_IMP +typedef struct _XFA_NOTSUREATTRIBUTE { + XFA_ELEMENT eElement; + XFA_ATTRIBUTE eAttribute; + XFA_ATTRIBUTETYPE eType; + FX_LPVOID pValue; +} XFA_NOTSUREATTRIBUTE, * XFA_LPNOTSUREATTRIBUTE; +typedef XFA_NOTSUREATTRIBUTE const * XFA_LPCNOTSUREATTRIBUTE; +XFA_LPCNOTSUREATTRIBUTE XFA_GetNotsureAttribute(XFA_ELEMENT eElement, XFA_ATTRIBUTE eAttribute, XFA_ATTRIBUTETYPE eType = XFA_ATTRIBUTETYPE_NOTSURE); +class CXFA_WideTextRead : public IFX_Stream, public CFX_Object +{ +public: + CXFA_WideTextRead(const CFX_WideString &wsBuffer); + virtual void Release(); + virtual IFX_Stream* Retain(); + + virtual FX_DWORD GetAccessModes() const; + virtual FX_INT32 GetLength() const; + virtual FX_INT32 Seek(FX_STREAMSEEK eSeek, FX_INT32 iOffset); + virtual FX_INT32 GetPosition(); + virtual FX_BOOL IsEOF() const; + + virtual FX_INT32 ReadData(FX_LPBYTE pBuffer, FX_INT32 iBufferSize) + { + return 0; + } + virtual FX_INT32 ReadString(FX_LPWSTR pStr, FX_INT32 iMaxLength, FX_BOOL &bEOS, FX_INT32 const *pByteSize = NULL); + virtual FX_INT32 WriteData(FX_LPCBYTE pBuffer, FX_INT32 iBufferSize) + { + return 0; + } + virtual FX_INT32 WriteString(FX_LPCWSTR pStr, FX_INT32 iLength) + { + return 0; + } + virtual void Flush() {} + virtual FX_BOOL SetLength(FX_INT32 iLength) + { + return FALSE; + } + + virtual FX_INT32 GetBOM(FX_BYTE bom[4]) const + { + return 0; + } + virtual FX_WORD GetCodePage() const; + virtual FX_WORD SetCodePage(FX_WORD wCodePage); + + virtual void Lock() {} + virtual void Unlock() {} + + virtual IFX_Stream* CreateSharedStream(FX_DWORD dwAccess, FX_INT32 iOffset, FX_INT32 iLength) + { + return NULL; + } + + CFX_WideString GetSrcText() const + { + return m_wsBuffer; + } +protected: + CFX_WideString m_wsBuffer; + FX_INT32 m_iPosition; + FX_INT32 m_iRefCount; +}; +#endif diff --git a/xfa/src/fxfa/src/parser/xfa_debug_parser.cpp b/xfa/src/fxfa/src/parser/xfa_debug_parser.cpp new file mode 100644 index 0000000000..4f5365e1d8 --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_debug_parser.cpp @@ -0,0 +1,18 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_utils.h" +#include "../common/xfa_object.h" +#include "../common/xfa_document.h" +#include "../common/xfa_parser.h" +#include "../common/xfa_script.h" +#include "../common/xfa_docdata.h" +#include "../common/xfa_doclayout.h" +#include "../common/xfa_debug.h" +#include "../common/xfa_localemgr.h" +#include "../common/xfa_fm2jsapi.h" +#include "xfa_debug_parser.h" diff --git a/xfa/src/fxfa/src/parser/xfa_debug_parser.h b/xfa/src/fxfa/src/parser/xfa_debug_parser.h new file mode 100644 index 0000000000..90dce89d3e --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_debug_parser.h @@ -0,0 +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 + +#ifndef _XFA_DEBUG_PARSER_H_ +#define _XFA_DEBUG_PARSER_H_ +#endif diff --git a/xfa/src/fxfa/src/parser/xfa_document_datadescription_imp.cpp b/xfa/src/fxfa/src/parser/xfa_document_datadescription_imp.cpp new file mode 100644 index 0000000000..a559d5415f --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_document_datadescription_imp.cpp @@ -0,0 +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 "../../../foxitlib.h" +#include "../common/xfa_utils.h" +#include "../common/xfa_object.h" +#include "../common/xfa_document.h" +#include "../common/xfa_parser.h" +#include "../common/xfa_script.h" +#include "../common/xfa_docdata.h" +#include "../common/xfa_doclayout.h" +#include "../common/xfa_debug.h" +#include "../common/xfa_localemgr.h" +#include "../common/xfa_fm2jsapi.h" +#include "xfa_debug_parser.h" +#define XFA_HASHCODE_Group 0xf7f75fcd +class CXFA_TraverseStrategy_DDGroup +{ +public: + static inline CXFA_Node* GetFirstChild(CXFA_Node* pDDGroupNode) + { + return pDDGroupNode->GetFirstChildByName(XFA_HASHCODE_Group); + } + static inline CXFA_Node* GetNextSibling(CXFA_Node* pDDGroupNode) + { + return pDDGroupNode->GetNextSameNameSibling(XFA_HASHCODE_Group); + } + static inline CXFA_Node* GetParent(CXFA_Node* pDDGroupNode) + { + return pDDGroupNode->GetNodeItem(XFA_NODEITEM_Parent); + } +}; +void XFA_DataDescription_UpdateDataRelation(CXFA_Node* pDataNode, CXFA_Node* pDataDescriptionNode) +{ + FXSYS_assert(pDataDescriptionNode); + for(CXFA_Node* pDataChild = pDataNode->GetNodeItem(XFA_NODEITEM_FirstChild); pDataChild; pDataChild = pDataChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { + FX_DWORD dwNameHash = pDataChild->GetNameHash(); + XFA_ELEMENT eType = pDataChild->GetClassID(); + if(!dwNameHash) { + continue; + } + CXFA_NodeIteratorTemplate sIterator(pDataDescriptionNode); + for (CXFA_Node* pDDGroupNode = sIterator.GetCurrent(); pDDGroupNode; pDDGroupNode = sIterator.MoveToNext()) { + if(pDDGroupNode != pDataDescriptionNode) { + if(pDDGroupNode->GetClassID() != XFA_ELEMENT_DataGroup) { + continue; + } + CFX_WideString wsNamespace; + if(!pDDGroupNode->TryNamespace(wsNamespace) || wsNamespace != FX_WSTRC(L"http://ns.adobe.com/data-description/")) { + continue; + } + } + CXFA_Node* pDDNode = pDDGroupNode->GetFirstChildByName(dwNameHash); + if(!pDDNode) { + continue; + } + if(pDDNode->GetClassID() != eType) { + break; + } + pDataChild->SetDataDescriptionNode(pDDNode); + XFA_DataDescription_UpdateDataRelation(pDataChild, pDDNode); + break; + } + } +} +CXFA_Node* XFA_DataDescription_MaybeCreateDataNode(CXFA_Document* pDocument, CXFA_Node* pDataParent, XFA_ELEMENT eNodeType, FX_WSTR wsName) +{ + if(!pDataParent) { + return NULL; + } + CXFA_Node *pParentDDNode = pDataParent->GetDataDescriptionNode(); + if(!pParentDDNode) { + CXFA_Node *pDataNode = pDocument->CreateNode(XFA_XDPPACKET_Datasets, eNodeType); + FXSYS_assert(pDataNode); + pDataNode->SetCData(XFA_ATTRIBUTE_Name, wsName); + pDataNode->CreateXMLMappingNode(); + pDataParent->InsertChild(pDataNode); + pDataNode->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE); + return pDataNode; + } else { + CXFA_NodeIteratorTemplate sIterator(pParentDDNode); + for (CXFA_Node* pDDGroupNode = sIterator.GetCurrent(); pDDGroupNode; pDDGroupNode = sIterator.MoveToNext()) { + if(pDDGroupNode != pParentDDNode) { + if(pDDGroupNode->GetClassID() != XFA_ELEMENT_DataGroup) { + continue; + } + CFX_WideString wsNamespace; + if(!pDDGroupNode->TryNamespace(wsNamespace) || wsNamespace != FX_WSTRC(L"http://ns.adobe.com/data-description/")) { + continue; + } + } + CXFA_Node* pDDNode = pDDGroupNode->GetFirstChildByName(wsName); + if(!pDDNode) { + continue; + } + if(pDDNode->GetClassID() != eNodeType) { + break; + } + CXFA_Node *pDataNode = pDocument->CreateNode(XFA_XDPPACKET_Datasets, eNodeType); + FXSYS_assert(pDataNode); + pDataNode->SetCData(XFA_ATTRIBUTE_Name, wsName); + pDataNode->CreateXMLMappingNode(); + if(eNodeType == XFA_ELEMENT_DataValue && pDDNode->GetEnum(XFA_ATTRIBUTE_Contains) == XFA_ATTRIBUTEENUM_MetaData) { + pDataNode->SetEnum(XFA_ATTRIBUTE_Contains, XFA_ATTRIBUTEENUM_MetaData); + } + pDataParent->InsertChild(pDataNode); + pDataNode->SetDataDescriptionNode(pDDNode); + pDataNode->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE); + return pDataNode; + } + return NULL; + } +} diff --git a/xfa/src/fxfa/src/parser/xfa_document_datadescription_imp.h b/xfa/src/fxfa/src/parser/xfa_document_datadescription_imp.h new file mode 100644 index 0000000000..ede14c03aa --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_document_datadescription_imp.h @@ -0,0 +1,11 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _XFA_DOCUMENT_DATADESCRIPTION_IMP_H_ +#define _XFA_DOCUMENT_DATADESCRIPTION_IMP_H_ +void XFA_DataDescription_UpdateDataRelation(CXFA_Node* pDataNode, CXFA_Node* pDataDescriptionNode); +CXFA_Node* XFA_DataDescription_MaybeCreateDataNode(CXFA_Document* pDocument, CXFA_Node* pDataParent, XFA_ELEMENT eNodeType, FX_WSTR wsName); +#endif diff --git a/xfa/src/fxfa/src/parser/xfa_document_datamerger_imp.cpp b/xfa/src/fxfa/src/parser/xfa_document_datamerger_imp.cpp new file mode 100644 index 0000000000..4cb97f436b --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_document_datamerger_imp.cpp @@ -0,0 +1,1267 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_utils.h" +#include "../common/xfa_object.h" +#include "../common/xfa_document.h" +#include "../common/xfa_parser.h" +#include "../common/xfa_script.h" +#include "../common/xfa_docdata.h" +#include "../common/xfa_doclayout.h" +#include "../common/xfa_debug.h" +#include "../common/xfa_localemgr.h" +#include "../common/xfa_fm2jsapi.h" +#include "xfa_debug_parser.h" +#include "xfa_basic_imp.h" +#include "xfa_document_imp.h" +#include "xfa_document_datadescription_imp.h" +#include "xfa_document_datamerger_imp.h" +#include "xfa_document_layout_imp.h" +static FX_BOOL XFA_GetOccurInfo(CXFA_Node* pOccurNode, FX_INT32& iMin, FX_INT32& iMax, FX_INT32& iInit) +{ + if(!pOccurNode) { + return FALSE; + } + CXFA_Occur occur(pOccurNode); + return occur.GetOccurInfo(iMin, iMax, iInit); +} +struct XFA_DataMerge_RecurseRecord { + CXFA_Node *pTemplateChild; + CXFA_Node *pDataChild; +}; +static CXFA_Node* XFA_DataMerge_FormValueNode_CreateChild(CXFA_Node* pValueNode, XFA_ELEMENT iType = XFA_ELEMENT_UNKNOWN) +{ + CXFA_Node * pChildNode = pValueNode->GetNodeItem(XFA_NODEITEM_FirstChild); + if (!pChildNode) { + if (iType == XFA_ELEMENT_UNKNOWN) { + return FALSE; + } + pChildNode = pValueNode->GetProperty(0, iType); + } + return pChildNode; +} +static void XFA_DataMerge_FormValueNode_MatchNoneCreateChild(CXFA_Node* pFormNode) +{ + CXFA_WidgetData* pWidgetData = pFormNode->GetWidgetData(); + FXSYS_assert(pWidgetData); + XFA_ELEMENT eUIType = pWidgetData->GetUIType(); +} +static FX_BOOL XFA_DataMerge_FormValueNode_SetChildContent(CXFA_Node* pValueNode, const CFX_WideString& wsContent, XFA_ELEMENT iType = XFA_ELEMENT_UNKNOWN) +{ + if (!pValueNode) { + return FALSE; + } + FXSYS_assert(pValueNode->GetPacketID() == XFA_XDPPACKET_Form); + CXFA_Node* pChildNode = XFA_DataMerge_FormValueNode_CreateChild(pValueNode, iType); + if (!pChildNode) { + return FALSE; + } + XFA_OBJECTTYPE objectType = pChildNode->GetObjectType(); + switch (objectType) { + case XFA_OBJECTTYPE_ContentNode: { + CXFA_Node *pContentRawDataNode = pChildNode->GetNodeItem(XFA_NODEITEM_FirstChild); + if (!pContentRawDataNode) { + XFA_ELEMENT element = XFA_ELEMENT_Sharptext; + if (pChildNode->GetClassID() == XFA_ELEMENT_ExData) { + CFX_WideString wsContentType; + pChildNode->GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType, FALSE); + if (wsContentType.Equal(FX_WSTRC(L"text/html"))) { + element = XFA_ELEMENT_SharpxHTML; + } else if (wsContentType.Equal(FX_WSTRC(L"text/xml"))) { + element = XFA_ELEMENT_Sharpxml; + } + } + pContentRawDataNode = pChildNode->CreateSamePacketNode(element); + pChildNode->InsertChild(pContentRawDataNode); + } + pContentRawDataNode->SetCData(XFA_ATTRIBUTE_Value, wsContent); + } + break; + case XFA_OBJECTTYPE_NodeC: + case XFA_OBJECTTYPE_TextNode: + case XFA_OBJECTTYPE_NodeV: { + pChildNode->SetCData(XFA_ATTRIBUTE_Value, wsContent); + } + break; + default: + FXSYS_assert(FALSE); + break; + } + return TRUE; +} +static void XFA_DataMerge_CreateDataBinding(CXFA_Node* pFormNode, CXFA_Node* pDataNode, FX_BOOL bDataToForm = TRUE) +{ + pFormNode->SetObject(XFA_ATTRIBUTE_BindingNode, pDataNode); + pDataNode->AddBindItem(pFormNode); + XFA_ELEMENT eClass = pFormNode->GetClassID(); + if (eClass != XFA_ELEMENT_Field && eClass != XFA_ELEMENT_ExclGroup) { + return; + } + CXFA_WidgetData* pWidgetData = pFormNode->GetWidgetData(); + FXSYS_assert(pWidgetData); + FX_BOOL bNotify = FALSE; + XFA_ELEMENT eUIType = pWidgetData->GetUIType(); + CXFA_Value defValue = pFormNode->GetProperty(0, XFA_ELEMENT_Value); + if(!bDataToForm) { + CFX_WideString wsValue; + CFX_WideString wsFormatedValue; + switch (eUIType) { + case XFA_ELEMENT_ImageEdit: { + CXFA_Image image = defValue.GetImage(); + CFX_WideString wsContentType; + CFX_WideString wsHref; + if (image) { + image.GetContent(wsValue); + image.GetContentType(wsContentType); + image.GetHref(wsHref); + } + IFDE_XMLElement *pXMLDataElement = (IFDE_XMLElement *)(pDataNode->GetXMLMappingNode()); + FXSYS_assert(pXMLDataElement); + pWidgetData->GetFormatDataValue(wsValue, wsFormatedValue); + pDataNode->SetAttributeValue(wsValue, wsFormatedValue); + pDataNode->SetCData(XFA_ATTRIBUTE_ContentType, wsContentType); + if (!wsHref.IsEmpty()) { + pXMLDataElement->SetString(FX_WSTRC(L"href"), wsHref); + } + } + break; + case XFA_ELEMENT_ChoiceList: + defValue.GetChildValueContent(wsValue); + if (pWidgetData->GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) { + CFX_WideStringArray wsSelTextArray; + pWidgetData->GetSelectedItemsValue(wsSelTextArray); + FX_INT32 iSize = wsSelTextArray.GetSize(); + if (iSize >= 1) { + CXFA_Node *pValue = NULL; + IFDE_XMLNode *pValueXMLNode = NULL; + for (FX_INT32 i = 0; i < iSize; i++) { + pValue = pDataNode->CreateSamePacketNode(XFA_ELEMENT_DataValue); + pValue->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L"value")); + pValueXMLNode = pValue->CreateXMLMappingNode(); + pDataNode->InsertChild(pValue); + pValue->SetCData(XFA_ATTRIBUTE_Value, wsSelTextArray[i]); + } + } else { + IFDE_XMLNode *pXMLNode = pDataNode->GetXMLMappingNode(); + FXSYS_assert(pXMLNode->GetType() == FDE_XMLNODE_Element); + ((IFDE_XMLElement *)pXMLNode)->SetString(FX_WSTRC(L"xfa:dataNode"), FX_WSTRC(L"dataGroup")); + } + } else if (!wsValue.IsEmpty()) { + pWidgetData->GetFormatDataValue(wsValue, wsFormatedValue); + pDataNode->SetAttributeValue(wsValue, wsFormatedValue); + } + break; + case XFA_ELEMENT_CheckButton: + defValue.GetChildValueContent(wsValue); + if (wsValue.IsEmpty()) { + break; + } + pWidgetData->GetFormatDataValue(wsValue, wsFormatedValue); + pDataNode->SetAttributeValue(wsValue, wsFormatedValue); + break; + case XFA_ELEMENT_ExclGroup: { + CXFA_Node* pChecked = NULL; + XFA_ELEMENT eValueType = XFA_ELEMENT_UNKNOWN; + CXFA_Node* pChild = pFormNode->GetNodeItem(XFA_NODEITEM_FirstChild); + for ( ; pChild; pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if (pChild->GetClassID() != XFA_ELEMENT_Field) { + continue; + } + CXFA_Node* pValue = pChild->GetChild(0, XFA_ELEMENT_Value); + if (!pValue) { + continue; + } + CXFA_Value valueChild(pValue); + valueChild.GetChildValueContent(wsValue); + if (wsValue.IsEmpty()) { + continue; + } + CXFA_Node* pItems = pChild->GetChild(0, XFA_ELEMENT_Items); + if (!pItems) { + continue; + } + CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild); + if (!pText) { + continue; + } + CFX_WideString wsContent; + if (pText->TryContent(wsContent) && (wsContent == wsValue)) { + pChecked = pChild; + eValueType = pText->GetClassID(); + wsFormatedValue = wsValue; + pDataNode->SetAttributeValue(wsValue, wsFormatedValue); + pFormNode->SetCData(XFA_ATTRIBUTE_Value, wsContent); + break; + } + } + if (!pChecked) { + break; + } + pChild = pFormNode->GetNodeItem(XFA_NODEITEM_FirstChild); + for ( ; pChild; pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if (pChild == pChecked) { + continue; + } + if (pChild->GetClassID() != XFA_ELEMENT_Field) { + continue; + } + CXFA_Node* pValue = pChild->GetProperty(0, XFA_ELEMENT_Value); + CXFA_Node* pItems = pChild->GetChild(0, XFA_ELEMENT_Items); + CXFA_Node* pText = pItems ? pItems->GetNodeItem(XFA_NODEITEM_FirstChild) : NULL; + if (pText) { + pText = pText->GetNodeItem(XFA_NODEITEM_NextSibling); + } + CFX_WideString wsContent; + if (pText) { + pText->TryContent(wsContent); + } + XFA_DataMerge_FormValueNode_SetChildContent(pValue, wsContent, XFA_ELEMENT_Text); + } + } + break; + case XFA_ELEMENT_NumericEdit: { + defValue.GetChildValueContent(wsValue); + if (wsValue.IsEmpty()) { + break; + } + CFX_WideString wsOutput; + pWidgetData->NormalizeNumStr(wsValue, wsOutput); + wsValue = wsOutput; + pWidgetData->GetFormatDataValue(wsValue, wsFormatedValue); + pDataNode->SetAttributeValue(wsValue, wsFormatedValue); + CXFA_Node* pValue = pFormNode->GetProperty(0, XFA_ELEMENT_Value); + XFA_DataMerge_FormValueNode_SetChildContent(pValue, wsValue, XFA_ELEMENT_Float); + } + break; + default: + defValue.GetChildValueContent(wsValue); + if (wsValue.IsEmpty()) { + break; + } + pWidgetData->GetFormatDataValue(wsValue, wsFormatedValue); + pDataNode->SetAttributeValue(wsValue, wsFormatedValue); + break; + } + } else { + CFX_WideString wsXMLValue; + pDataNode->TryContent(wsXMLValue); + CFX_WideString wsNormailizeValue; + pWidgetData->GetNormalizeDataValue(wsXMLValue, wsNormailizeValue); + pDataNode->SetAttributeValue(wsNormailizeValue, wsXMLValue); + switch (eUIType) { + case XFA_ELEMENT_ImageEdit: { + XFA_DataMerge_FormValueNode_SetChildContent(defValue.GetNode(), wsNormailizeValue, XFA_ELEMENT_Image); + CXFA_Image image = defValue.GetImage(); + if (image) { + IFDE_XMLElement *pXMLDataElement = (IFDE_XMLElement *)(pDataNode->GetXMLMappingNode()); + FXSYS_assert(pXMLDataElement); + CFX_WideString wsContentType; + CFX_WideString wsHref; + pXMLDataElement->GetString((FX_LPCWSTR)L"xfa:contentType", wsContentType); + if (!wsContentType.IsEmpty()) { + pDataNode->SetCData(XFA_ATTRIBUTE_ContentType, wsContentType); + image.SetContentType(wsContentType); + } + pXMLDataElement->GetString((FX_LPCWSTR)L"href", wsHref); + if (!wsHref.IsEmpty()) { + image.SetHref(wsHref); + } + } + } + break; + case XFA_ELEMENT_ChoiceList: + if (pWidgetData->GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) { + CXFA_NodeArray items; + pDataNode->GetNodeList(items); + FX_INT32 iCounts = items.GetSize(); + if (iCounts > 0) { + wsNormailizeValue.Empty(); + CFX_WideString wsItem; + for (FX_INT32 i = 0; i < iCounts; i++) { + items[i]->TryContent(wsItem); + wsItem = (iCounts == 1) ? wsItem : wsItem + FX_WSTRC(L"\n"); + wsNormailizeValue += wsItem; + } + CXFA_ExData exData = defValue.GetExData(); + FXSYS_assert(exData != NULL); + exData.SetContentType((iCounts == 1) ? FX_WSTRC(L"text/plain") : FX_WSTRC(L"text/xml")); + } + XFA_DataMerge_FormValueNode_SetChildContent(defValue.GetNode(), wsNormailizeValue, XFA_ELEMENT_ExData); + } else { + XFA_DataMerge_FormValueNode_SetChildContent(defValue.GetNode(), wsNormailizeValue, XFA_ELEMENT_Text); + } + break; + case XFA_ELEMENT_CheckButton: + XFA_DataMerge_FormValueNode_SetChildContent(defValue.GetNode(), wsNormailizeValue, XFA_ELEMENT_Text); + break; + case XFA_ELEMENT_ExclGroup: { + pWidgetData->SetSelectedMemberByValue(wsNormailizeValue, bNotify, FALSE, FALSE); + } + break; + case XFA_ELEMENT_DateTimeEdit: + XFA_DataMerge_FormValueNode_SetChildContent(defValue.GetNode(), wsNormailizeValue, XFA_ELEMENT_DateTime); + break; + case XFA_ELEMENT_NumericEdit: { + CFX_WideString wsPicture; + pWidgetData->GetPictureContent(wsPicture, XFA_VALUEPICTURE_DataBind); + if(wsPicture.IsEmpty()) { + CFX_WideString wsOutput; + pWidgetData->NormalizeNumStr(wsNormailizeValue, wsOutput); + wsNormailizeValue = wsOutput; + } + XFA_DataMerge_FormValueNode_SetChildContent(defValue.GetNode(), wsNormailizeValue, XFA_ELEMENT_Float); + } + break; + case XFA_ELEMENT_Barcode: + case XFA_ELEMENT_Button: + case XFA_ELEMENT_PasswordEdit: + case XFA_ELEMENT_Signature: + case XFA_ELEMENT_TextEdit: + default: + XFA_DataMerge_FormValueNode_SetChildContent(defValue.GetNode(), wsNormailizeValue, XFA_ELEMENT_Text); + break; + } + } +} +static CXFA_Node* XFA_DataMerge_GetGlobalBinding(CXFA_Document* pDocument, FX_DWORD dwNameHash) +{ + CXFA_Node* pNode = NULL; + pDocument->m_rgGlobalBinding.Lookup(dwNameHash, pNode); + return pNode; +} +static void XFA_DataMerge_RegisterGlobalBinding(CXFA_Document* pDocument, FX_DWORD dwNameHash, CXFA_Node* pDataNode) +{ + pDocument->m_rgGlobalBinding.SetAt(dwNameHash, pDataNode); +} +static void XFA_DataMerge_ClearGlobalBinding(CXFA_Document* pDocument) +{ + pDocument->m_rgGlobalBinding.RemoveAll(); +} +static CXFA_Node* XFA_DataMerge_ScopeMatchGlobalBinding(CXFA_Node* pDataScope, FX_DWORD dwNameHash, XFA_ELEMENT eMatchDataNodeType, FX_BOOL bUpLevel = TRUE) +{ + for(CXFA_Node *pCurDataScope = pDataScope, *pLastDataScope = NULL; + pCurDataScope && pCurDataScope->GetPacketID() == XFA_XDPPACKET_Datasets; + pLastDataScope = pCurDataScope, pCurDataScope = pCurDataScope->GetNodeItem(XFA_NODEITEM_Parent)) { + for(CXFA_Node* pDataChild = pCurDataScope->GetFirstChildByName(dwNameHash); pDataChild; pDataChild = pDataChild->GetNextSameNameSibling(dwNameHash)) { + if(pDataChild == pLastDataScope || (eMatchDataNodeType != XFA_ELEMENT_DataModel && pDataChild->GetClassID() != eMatchDataNodeType) || pDataChild->HasBindItem()) { + continue; + } + return pDataChild; + } + for(CXFA_Node* pDataChild = pCurDataScope->GetFirstChildByClass(XFA_ELEMENT_DataGroup); pDataChild; pDataChild = pDataChild->GetNextSameClassSibling(XFA_ELEMENT_DataGroup)) { + CXFA_Node* pDataNode = XFA_DataMerge_ScopeMatchGlobalBinding(pDataChild, dwNameHash, eMatchDataNodeType, FALSE); + if(pDataNode) { + return pDataNode; + } + } + if(!bUpLevel) { + break; + } + } + return NULL; +} +static CXFA_Node* XFA_DataMerge_FindGlobalDataNode(CXFA_Document* pDocument, CFX_WideStringC wsName, CXFA_Node* pDataScope, XFA_ELEMENT eMatchNodeType) +{ + FX_DWORD dwNameHash = wsName.IsEmpty() ? 0 : FX_HashCode_String_GetW(wsName.GetPtr(), wsName.GetLength()); + if (dwNameHash != 0) { + CXFA_Node *pBounded = XFA_DataMerge_GetGlobalBinding(pDocument, dwNameHash); + if(!pBounded) { + pBounded = XFA_DataMerge_ScopeMatchGlobalBinding(pDataScope, dwNameHash, eMatchNodeType); + if(pBounded) { + XFA_DataMerge_RegisterGlobalBinding(pDocument, dwNameHash, pBounded); + } + } + return pBounded; + } + return NULL; +} +static CXFA_Node* XFA_DataMerge_FindOnceDataNode(CXFA_Document* pDocument, CFX_WideStringC wsName, CXFA_Node* pDataScope, XFA_ELEMENT eMatchNodeType) +{ + FX_DWORD dwNameHash = wsName.IsEmpty() ? 0 : FX_HashCode_String_GetW(wsName.GetPtr(), wsName.GetLength()); + if (dwNameHash != 0) { + for(CXFA_Node *pCurDataScope = pDataScope, *pLastDataScope = NULL; + pCurDataScope && pCurDataScope->GetPacketID() == XFA_XDPPACKET_Datasets; + pLastDataScope = pCurDataScope, pCurDataScope = pCurDataScope->GetNodeItem(XFA_NODEITEM_Parent)) { + for(CXFA_Node* pDataChild = pCurDataScope->GetFirstChildByName(dwNameHash); pDataChild; pDataChild = pDataChild->GetNextSameNameSibling(dwNameHash)) { + if(pDataChild == pLastDataScope || (eMatchNodeType != XFA_ELEMENT_DataModel && pDataChild->GetClassID() != eMatchNodeType) || pDataChild->HasBindItem()) { + continue; + } + return pDataChild; + } + } + } + return NULL; +} +static CXFA_Node* XFA_DataMerge_FindDataRefDataNode(CXFA_Document* pDocument, CFX_WideStringC wsRef, CXFA_Node* pDataScope, XFA_ELEMENT eMatchNodeType, CXFA_Node* pTemplateNode, FX_BOOL bForceBind, FX_BOOL bUpLevel = TRUE) +{ + FX_DWORD dFlags = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_BindNew; + if (bUpLevel || wsRef != FX_WSTRC(L"name")) { + dFlags |= (XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings); + } + XFA_RESOLVENODE_RS rs; + pDocument->GetScriptContext()->ResolveObjects(pDataScope, wsRef, rs, dFlags, pTemplateNode); + if (rs.dwFlags == XFA_RESOLVENODE_RSTYPE_CreateNodeAll || rs.dwFlags == XFA_RESOLVENODE_RSTYPE_CreateNodeMidAll || rs.nodes.GetSize() > 1) { + return pDocument->GetNotBindNode(rs.nodes); + } else if (rs.dwFlags == XFA_RESOLVENODE_RSTYPE_CreateNodeOne) { + CXFA_Object* pObject = (rs.nodes.GetSize() > 0) ? rs.nodes[0] : NULL; + CXFA_Node *pNode = (pObject && pObject->IsNode()) ? (CXFA_Node*)pObject : NULL; + if (!bForceBind && (pNode != NULL) && pNode->HasBindItem()) { + pNode = NULL; + } + return pNode; + } + return NULL; +} +CXFA_Node* XFA_DataMerge_FindFormDOMInstance(CXFA_Document* pDocument, XFA_ELEMENT eClassID, FX_DWORD dwNameHash, CXFA_Node* pFormParent) +{ + CXFA_Node* pFormChild = pFormParent->GetNodeItem(XFA_NODEITEM_FirstChild); + for(; pFormChild; pFormChild = pFormChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if(pFormChild->GetClassID() == eClassID && pFormChild->GetNameHash() == dwNameHash && pFormChild->HasFlag(XFA_NODEFLAG_UnusedNode)) { + return pFormChild; + } + } + return NULL; +} +static FX_BOOL XFA_NeedGenerateForm(CXFA_Node* pTemplateChild, FX_BOOL bUseInstanceManager = TRUE) +{ + XFA_ELEMENT eType = pTemplateChild->GetClassID(); + if (eType == XFA_ELEMENT_Variables) { + return TRUE; + } + if(pTemplateChild->GetObjectType() == XFA_OBJECTTYPE_ContainerNode) { + return FALSE; + } + if (eType == XFA_ELEMENT_Proto || (bUseInstanceManager && eType == XFA_ELEMENT_Occur)) { + return FALSE; + } + return TRUE; +} +CXFA_Node* XFA_NodeMerge_CloneOrMergeContainer(CXFA_Document* pDocument, CXFA_Node* pFormParent, CXFA_Node* pTemplateNode, FX_BOOL bRecursive, CXFA_NodeArray* pSubformArray) +{ + CXFA_Node* pExistingNode = NULL; + if (pSubformArray == NULL) { + pExistingNode = XFA_DataMerge_FindFormDOMInstance(pDocument, pTemplateNode->GetClassID(), pTemplateNode->GetNameHash(), pFormParent); + } else if (pSubformArray->GetSize() > 0) { + pExistingNode = pSubformArray->GetAt(0); + pSubformArray->RemoveAt(0); + } + if(pExistingNode) { + if (pSubformArray) { + pFormParent->InsertChild(pExistingNode); + } else if (pExistingNode->IsContainerNode()) { + pFormParent->RemoveChild(pExistingNode); + pFormParent->InsertChild(pExistingNode); + } + pExistingNode->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE); + pExistingNode->SetTemplateNode(pTemplateNode); + if(bRecursive && pExistingNode->GetClassID() != XFA_ELEMENT_Items) { + for (CXFA_Node *pTemplateChild = pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if(XFA_NeedGenerateForm(pTemplateChild)) { + XFA_NodeMerge_CloneOrMergeContainer(pDocument, pExistingNode, pTemplateChild, bRecursive); + } + } + } + pExistingNode->SetFlag(XFA_NODEFLAG_Initialized); + return pExistingNode; + } + CXFA_Node* pNewNode = pTemplateNode->CloneTemplateToForm(FALSE); + pFormParent->InsertChild(pNewNode, NULL); + if(bRecursive) { + for (CXFA_Node *pTemplateChild = pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if(XFA_NeedGenerateForm(pTemplateChild)) { + CXFA_Node* pNewChild = pTemplateChild->CloneTemplateToForm(TRUE); + pNewNode->InsertChild(pNewChild, NULL); + } + } + } + return pNewNode; +} +static CXFA_Node* XFA_NodeMerge_CloneOrMergeInstanceManager(CXFA_Document* pDocument, CXFA_Node* pFormParent, CXFA_Node* pTemplateNode, CXFA_NodeArray& subforms) +{ + CFX_WideStringC wsSubformName = pTemplateNode->GetCData(XFA_ATTRIBUTE_Name); + CFX_WideString wsInstMgrNodeName = FX_WSTRC(L"_") + wsSubformName; + FX_DWORD dwInstNameHash = FX_HashCode_String_GetW(wsInstMgrNodeName, wsInstMgrNodeName.GetLength()); + CXFA_Node* pExistingNode = XFA_DataMerge_FindFormDOMInstance(pDocument, XFA_ELEMENT_InstanceManager, dwInstNameHash, pFormParent); + if(pExistingNode) { + FX_DWORD dwNameHash = pTemplateNode->GetNameHash(); + for(CXFA_Node* pNode = pExistingNode->GetNodeItem(XFA_NODEITEM_NextSibling); pNode; ) { + XFA_ELEMENT eCurType = pNode->GetClassID(); + if (eCurType == XFA_ELEMENT_InstanceManager) { + break; + } + if ((eCurType != XFA_ELEMENT_Subform) && (eCurType != XFA_ELEMENT_SubformSet)) { + pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling); + continue; + } + if (dwNameHash != pNode->GetNameHash()) { + break; + } + CXFA_Node* pNextNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling); + pFormParent->RemoveChild(pNode); + subforms.Add(pNode); + pNode = pNextNode; + } + pFormParent->RemoveChild(pExistingNode); + pFormParent->InsertChild(pExistingNode); + pExistingNode->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE); + pExistingNode->SetTemplateNode(pTemplateNode); + return pExistingNode; + } + CXFA_Node* pNewNode = pDocument->GetParser()->GetFactory()->CreateNode(XFA_XDPPACKET_Form, XFA_ELEMENT_InstanceManager); + FXSYS_assert(pNewNode); + wsInstMgrNodeName = FX_WSTRC(L"_") + pTemplateNode->GetCData(XFA_ATTRIBUTE_Name); + pNewNode->SetCData(XFA_ATTRIBUTE_Name, wsInstMgrNodeName); + pFormParent->InsertChild(pNewNode, NULL); + pNewNode->SetTemplateNode(pTemplateNode); + return pNewNode; +} +static CXFA_Node* XFA_DataMerge_FindMatchingDataNode(CXFA_Document* pDocument, CXFA_Node* pTemplateNode, CXFA_Node* pDataScope, FX_BOOL& bAccessedDataDOM, FX_BOOL bForceBind, CXFA_NodeIteratorTemplate* pIterator, FX_BOOL& bSelfMatch, XFA_ATTRIBUTEENUM& eBindMatch, FX_BOOL bUpLevel = TRUE) +{ + FX_BOOL bOwnIterator = FALSE; + if(!pIterator) { + bOwnIterator = TRUE; + pIterator = FX_NEW CXFA_NodeIteratorTemplate(pTemplateNode); + } + CXFA_Node* pResult = NULL; + for(CXFA_Node* pCurTemplateNode = pIterator->GetCurrent(); pCurTemplateNode; ) { + XFA_ELEMENT eMatchNodeType; + switch(pCurTemplateNode->GetClassID()) { + case XFA_ELEMENT_Subform: + eMatchNodeType = XFA_ELEMENT_DataGroup; + break; + case XFA_ELEMENT_Field: { + eMatchNodeType = XFA_FieldIsMultiListBox(pCurTemplateNode) ? XFA_ELEMENT_DataGroup : XFA_ELEMENT_DataValue; + } + break; + case XFA_ELEMENT_ExclGroup: + eMatchNodeType = XFA_ELEMENT_DataValue; + break; + default: + pCurTemplateNode = pIterator->MoveToNext(); + continue; + } + CXFA_Node* pTemplateNodeOccur = pCurTemplateNode->GetFirstChildByClass(XFA_ELEMENT_Occur); + FX_INT32 iMin, iMax, iInit; + if(pTemplateNodeOccur && XFA_GetOccurInfo(pTemplateNodeOccur, iMin, iMax, iInit) && iMax == 0) { + pCurTemplateNode = pIterator->MoveToNext(); + continue; + } + CXFA_Node* pTemplateNodeBind = pCurTemplateNode->GetFirstChildByClass(XFA_ELEMENT_Bind); + XFA_ATTRIBUTEENUM eMatch = pTemplateNodeBind ? pTemplateNodeBind->GetEnum(XFA_ATTRIBUTE_Match) : XFA_ATTRIBUTEENUM_Once; + eBindMatch = eMatch; + switch(eMatch) { + case XFA_ATTRIBUTEENUM_None: + pCurTemplateNode = pIterator->MoveToNext(); + continue; + case XFA_ATTRIBUTEENUM_Global: + bAccessedDataDOM = TRUE; + if(!bForceBind) { + pCurTemplateNode = pIterator->MoveToNext(); + continue; + } + if (eMatchNodeType == XFA_ELEMENT_DataValue || (eMatchNodeType == XFA_ELEMENT_DataGroup && XFA_FieldIsMultiListBox(pTemplateNodeBind))) { + CXFA_Node* pGlobalBindNode = XFA_DataMerge_FindGlobalDataNode(pDocument, pCurTemplateNode->GetCData(XFA_ATTRIBUTE_Name), pDataScope, eMatchNodeType); + if(!pGlobalBindNode) { + pCurTemplateNode = pIterator->MoveToNext(); + continue; + } + pResult = pGlobalBindNode; + break; + } + case XFA_ATTRIBUTEENUM_Once: { + bAccessedDataDOM = TRUE; + CXFA_Node* pOnceBindNode = XFA_DataMerge_FindOnceDataNode(pDocument, pCurTemplateNode->GetCData(XFA_ATTRIBUTE_Name), pDataScope, eMatchNodeType); + if(!pOnceBindNode) { + pCurTemplateNode = pIterator->MoveToNext(); + continue; + } + pResult = pOnceBindNode; + } + break; + case XFA_ATTRIBUTEENUM_DataRef: { + bAccessedDataDOM = TRUE; + CXFA_Node* pDataRefBindNode = XFA_DataMerge_FindDataRefDataNode(pDocument, pTemplateNodeBind->GetCData(XFA_ATTRIBUTE_Ref), pDataScope, eMatchNodeType, pTemplateNode, bForceBind, bUpLevel); + if(pDataRefBindNode && pDataRefBindNode->GetClassID() == eMatchNodeType) { + pResult = pDataRefBindNode; + } + if(!pResult) { + pCurTemplateNode = pIterator->SkipChildrenAndMoveToNext(); + continue; + } + } + break; + default: + break; + } + if(pCurTemplateNode == pTemplateNode && pResult != NULL) { + bSelfMatch = TRUE; + } + break; + } + if(bOwnIterator) { + delete pIterator; + } + return pResult; +} +static void XFA_DataMerge_SortRecurseRecord(CFX_ArrayTemplate& rgRecords, CXFA_Node* pDataScope, FX_BOOL bChoiceMode = FALSE) +{ + FX_INT32 iCount = rgRecords.GetSize(); + CFX_ArrayTemplate rgResultRecord; + for (CXFA_Node* pChildNode = pDataScope->GetNodeItem(XFA_NODEITEM_FirstChild); pChildNode; pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + for(FX_INT32 i = 0; i < iCount; i ++) { + CXFA_Node* pNode = rgRecords[i].pDataChild; + if (pChildNode == pNode) { + XFA_DataMerge_RecurseRecord sNewRecord = {rgRecords[i].pTemplateChild, pNode}; + rgResultRecord.Add(sNewRecord); + rgRecords.RemoveAt(i); + iCount--; + break; + } + } + if (bChoiceMode && rgResultRecord.GetSize() > 0) { + break; + } + } + if (rgResultRecord.GetSize() > 0) { + if (!bChoiceMode) { + for (FX_INT32 i = 0; i < iCount; i++) { + XFA_DataMerge_RecurseRecord sNewRecord = {rgRecords[i].pTemplateChild, rgRecords[i].pDataChild}; + rgResultRecord.Add(sNewRecord); + } + } + rgRecords.RemoveAll(); + rgRecords.Copy(rgResultRecord); + } +} +static CXFA_Node* XFA_DataMerge_CopyContainer_SubformSet(CXFA_Document* pDocument, CXFA_Node* pTemplateNode, CXFA_Node* pFormParentNode, CXFA_Node* pDataScope, FX_BOOL bOneInstance, FX_BOOL bDataMerge) +{ + XFA_ELEMENT eElement = pTemplateNode->GetClassID(); + CXFA_Node *pOccurNode = NULL; + CXFA_Node *pFirstInstance = NULL; + FX_BOOL bUseInstanceManager = pFormParentNode->GetClassID() != XFA_ELEMENT_Area; + CXFA_Node* pInstMgrNode = NULL; + CXFA_NodeArray subformArray; + CXFA_NodeArray* pSearchArray = NULL; + if (!bOneInstance && (eElement == XFA_ELEMENT_SubformSet || eElement == XFA_ELEMENT_Subform)) { + pInstMgrNode = bUseInstanceManager ? XFA_NodeMerge_CloneOrMergeInstanceManager(pDocument, pFormParentNode, pTemplateNode, subformArray) : NULL; + if(CXFA_Node* pOccurTemplateNode = pTemplateNode->GetFirstChildByClass(XFA_ELEMENT_Occur)) { + pOccurNode = pInstMgrNode != NULL ? XFA_NodeMerge_CloneOrMergeContainer(pDocument, pInstMgrNode, pOccurTemplateNode, FALSE) : pOccurTemplateNode; + } else if (pInstMgrNode) { + pOccurNode = pInstMgrNode->GetFirstChildByClass(XFA_ELEMENT_Occur); + if (pOccurNode) { + pOccurNode->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE); + } + } + if (pInstMgrNode) { + pInstMgrNode->SetFlag(XFA_NODEFLAG_Initialized); + pSearchArray = &subformArray; + if (pFormParentNode->GetClassID() == XFA_ELEMENT_PageArea) { + bOneInstance = TRUE; + if (subformArray.GetSize() < 1) { + pSearchArray = NULL; + } + } else if ((pTemplateNode->GetNameHash() == 0) && (subformArray.GetSize() < 1)) { + pSearchArray = NULL; + } + } + } + FX_INT32 iMax = 1, iInit = 1, iMin = 1; + if(!bOneInstance) { + XFA_GetOccurInfo(pOccurNode, iMin, iMax, iInit); + } + XFA_ATTRIBUTEENUM eRelation = eElement == XFA_ELEMENT_SubformSet ? pTemplateNode->GetEnum(XFA_ATTRIBUTE_Relation) : XFA_ATTRIBUTEENUM_Ordered; + FX_INT32 iCurRepeatIndex = 0; + XFA_ATTRIBUTEENUM eParentBindMatch = XFA_ATTRIBUTEENUM_None; + if (bDataMerge) { + CXFA_NodeIteratorTemplate sNodeIterator(pTemplateNode); + FX_BOOL bAccessedDataDOM = FALSE; + if (eElement == XFA_ELEMENT_SubformSet || eElement == XFA_ELEMENT_Area) { + sNodeIterator.MoveToNext(); + } else { + CFX_MapPtrTemplate subformMapArray; + CXFA_NodeArray subformArray; + for (; iMax < 0 || iCurRepeatIndex < iMax; iCurRepeatIndex++) { + FX_BOOL bSelfMatch = FALSE; + XFA_ATTRIBUTEENUM eBindMatch = XFA_ATTRIBUTEENUM_None; + CXFA_Node* pDataNode = XFA_DataMerge_FindMatchingDataNode(pDocument, pTemplateNode, pDataScope, bAccessedDataDOM, FALSE, &sNodeIterator, bSelfMatch, eBindMatch); + if(!pDataNode || sNodeIterator.GetCurrent() != pTemplateNode) { + break; + } + eParentBindMatch = eBindMatch; + CXFA_Node* pSubformNode = XFA_NodeMerge_CloneOrMergeContainer(pDocument, pFormParentNode, pTemplateNode, FALSE, pSearchArray); + if(!pFirstInstance) { + pFirstInstance = pSubformNode; + } + XFA_DataMerge_CreateDataBinding(pSubformNode, pDataNode); + FXSYS_assert(pSubformNode); + subformMapArray.SetAt(pSubformNode, pDataNode); + subformArray.Add(pSubformNode); + } + FX_POSITION position = subformMapArray.GetStartPosition(); + for(FX_INT32 iIndex = 0; iIndex < subformArray.GetSize(); iIndex ++) { + CXFA_Node* pSubform = subformArray[iIndex]; + CXFA_Node* pDataNode = (CXFA_Node*)subformMapArray.GetValueAt(pSubform); + for (CXFA_Node *pTemplateChild = pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if (XFA_NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { + XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubform, pTemplateChild, TRUE); + } else if (pTemplateChild->GetObjectType() == XFA_OBJECTTYPE_ContainerNode) { + pDocument->DataMerge_CopyContainer(pTemplateChild, pSubform, pDataNode, FALSE, TRUE, FALSE); + } + } + } + subformMapArray.RemoveAll(); + } + for (; iMax < 0 || iCurRepeatIndex < iMax; iCurRepeatIndex++) { + FX_BOOL bSelfMatch = FALSE; + CXFA_Node* pOldNode = sNodeIterator.GetCurrent(); + XFA_ATTRIBUTEENUM eBindMatch = XFA_ATTRIBUTEENUM_None; + if(!XFA_DataMerge_FindMatchingDataNode(pDocument, pTemplateNode, pDataScope, bAccessedDataDOM, FALSE, &sNodeIterator, bSelfMatch, eBindMatch)) { + break; + } + if(eBindMatch == XFA_ATTRIBUTEENUM_DataRef && eParentBindMatch == XFA_ATTRIBUTEENUM_DataRef) { + break; + } + if (eRelation == XFA_ATTRIBUTEENUM_Choice || eRelation == XFA_ATTRIBUTEENUM_Unordered) { + CXFA_Node* pSubformSetNode = XFA_NodeMerge_CloneOrMergeContainer(pDocument, pFormParentNode, pTemplateNode, FALSE, pSearchArray); + FXSYS_assert(pSubformSetNode); + if(!pFirstInstance) { + pFirstInstance = pSubformSetNode; + } + CFX_ArrayTemplate rgItemMatchList; + CFX_ArrayTemplate rgItemUnmatchList; + for (CXFA_Node *pTemplateChild = pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if (XFA_NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { + XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubformSetNode, pTemplateChild, TRUE); + } else if(pTemplateChild->GetObjectType() == XFA_OBJECTTYPE_ContainerNode) { + CXFA_Node *pDataMatch; + bSelfMatch = FALSE; + eBindMatch = XFA_ATTRIBUTEENUM_None; + if(eRelation != XFA_ATTRIBUTEENUM_Ordered && (pDataMatch = XFA_DataMerge_FindMatchingDataNode(pDocument, pTemplateChild, pDataScope, bAccessedDataDOM, FALSE, NULL, bSelfMatch, eBindMatch))) { + XFA_DataMerge_RecurseRecord sNewRecord = {pTemplateChild, pDataMatch}; + if(bSelfMatch) { + rgItemMatchList.InsertAt(0, sNewRecord); + } else { + rgItemMatchList.Add(sNewRecord); + } + } else { + rgItemUnmatchList.Add(pTemplateChild); + } + } + } + switch(eRelation) { + case XFA_ATTRIBUTEENUM_Choice: { + FXSYS_assert(rgItemMatchList.GetSize()); + XFA_DataMerge_SortRecurseRecord(rgItemMatchList, pDataScope, TRUE); + pDocument->DataMerge_CopyContainer(rgItemMatchList[0].pTemplateChild, pSubformSetNode, pDataScope); + } + break; + case XFA_ATTRIBUTEENUM_Unordered: { + if(rgItemMatchList.GetSize()) { + XFA_DataMerge_SortRecurseRecord(rgItemMatchList, pDataScope); + for(FX_INT32 i = 0, count = rgItemMatchList.GetSize(); i < count; i ++) { + pDocument->DataMerge_CopyContainer(rgItemMatchList[i].pTemplateChild, pSubformSetNode, pDataScope); + } + } + for(FX_INT32 i = 0, count = rgItemUnmatchList.GetSize(); i < count; i ++) { + pDocument->DataMerge_CopyContainer(rgItemUnmatchList[i], pSubformSetNode, pDataScope); + } + } + break; + default: + break; + } + } else { + CXFA_Node* pSubformSetNode = XFA_NodeMerge_CloneOrMergeContainer(pDocument, pFormParentNode, pTemplateNode, FALSE, pSearchArray); + FXSYS_assert(pSubformSetNode); + if(!pFirstInstance) { + pFirstInstance = pSubformSetNode; + } + for (CXFA_Node *pTemplateChild = pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if (XFA_NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { + XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubformSetNode, pTemplateChild, TRUE); + } else if (pTemplateChild->GetObjectType() == XFA_OBJECTTYPE_ContainerNode) { + pDocument->DataMerge_CopyContainer(pTemplateChild, pSubformSetNode, pDataScope); + } + } + } + } + if(iCurRepeatIndex == 0 && bAccessedDataDOM == FALSE) { + FX_INT32 iLimit = iMax; + if (pInstMgrNode && pTemplateNode->GetNameHash() == 0) { + iLimit = subformArray.GetSize(); + if (iLimit < iMin) { + iLimit = iInit; + } + } + for (; (iLimit < 0 || iCurRepeatIndex < iLimit); iCurRepeatIndex++) { + if (pInstMgrNode) { + if (pSearchArray && pSearchArray->GetSize() < 1) { + if (pTemplateNode->GetNameHash() != 0) { + break; + } + pSearchArray = NULL; + } + } else if(!XFA_DataMerge_FindFormDOMInstance(pDocument, pTemplateNode->GetClassID(), pTemplateNode->GetNameHash(), pFormParentNode)) { + break; + } + CXFA_Node* pSubformNode = XFA_NodeMerge_CloneOrMergeContainer(pDocument, pFormParentNode, pTemplateNode, FALSE, pSearchArray); + FXSYS_assert(pSubformNode); + if(!pFirstInstance) { + pFirstInstance = pSubformNode; + } + for (CXFA_Node *pTemplateChild = pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if (XFA_NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { + XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubformNode, pTemplateChild, TRUE); + } else if(pTemplateChild->GetObjectType() == XFA_OBJECTTYPE_ContainerNode) { + pDocument->DataMerge_CopyContainer(pTemplateChild, pSubformNode, pDataScope); + } + } + } + } + } + FX_INT32 iMinimalLimit = iCurRepeatIndex == 0 ? iInit : iMin; + for (; iCurRepeatIndex < iMinimalLimit; iCurRepeatIndex++) { + CXFA_Node* pSubformSetNode = XFA_NodeMerge_CloneOrMergeContainer(pDocument, pFormParentNode, pTemplateNode, FALSE, pSearchArray); + FXSYS_assert(pSubformSetNode); + if(!pFirstInstance) { + pFirstInstance = pSubformSetNode; + } + FX_BOOL bFound = FALSE; + for (CXFA_Node *pTemplateChild = pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if (XFA_NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { + XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubformSetNode, pTemplateChild, TRUE); + } else if(pTemplateChild->GetObjectType() == XFA_OBJECTTYPE_ContainerNode) { + if(bFound && eRelation == XFA_ATTRIBUTEENUM_Choice) { + continue; + } + pDocument->DataMerge_CopyContainer(pTemplateChild, pSubformSetNode, pDataScope, FALSE, bDataMerge); + bFound = TRUE; + } + } + } + return pFirstInstance; +} +static CXFA_Node* XFA_DataMerge_CopyContainer_Field(CXFA_Document* pDocument, CXFA_Node* pTemplateNode, CXFA_Node* pFormNode, CXFA_Node* pDataScope, FX_BOOL bDataMerge, FX_BOOL bUpLevel = TRUE) +{ + CXFA_Node* pFieldNode = XFA_NodeMerge_CloneOrMergeContainer(pDocument, pFormNode, pTemplateNode, FALSE); + FXSYS_assert(pFieldNode); + for (CXFA_Node *pTemplateChildNode = pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); pTemplateChildNode; pTemplateChildNode = pTemplateChildNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if(XFA_NeedGenerateForm(pTemplateChildNode)) { + XFA_NodeMerge_CloneOrMergeContainer(pDocument, pFieldNode, pTemplateChildNode, TRUE); + } else if (pTemplateNode->GetClassID() == XFA_ELEMENT_ExclGroup && pTemplateChildNode->IsContainerNode()) { + if (pTemplateChildNode->GetClassID() == XFA_ELEMENT_Field) { + XFA_DataMerge_CopyContainer_Field(pDocument, pTemplateChildNode, pFieldNode, NULL, FALSE); + } + } + } + if(bDataMerge) { + FX_BOOL bAccessedDataDOM = FALSE; + FX_BOOL bSelfMatch = FALSE; + XFA_ATTRIBUTEENUM eBindMatch; + CXFA_Node* pDataNode = XFA_DataMerge_FindMatchingDataNode(pDocument, pTemplateNode, pDataScope, bAccessedDataDOM, TRUE, NULL, bSelfMatch, eBindMatch, bUpLevel); + if(pDataNode) { + XFA_DataMerge_CreateDataBinding(pFieldNode, pDataNode); + } + } else { + XFA_DataMerge_FormValueNode_MatchNoneCreateChild(pFieldNode); + } + return pFieldNode; +} +CXFA_Node* CXFA_Document::DataMerge_CopyContainer(CXFA_Node* pTemplateNode, CXFA_Node* pFormNode, CXFA_Node* pDataScope, FX_BOOL bOneInstance , FX_BOOL bDataMerge , FX_BOOL bUpLevel) +{ + switch(pTemplateNode->GetClassID()) { + case XFA_ELEMENT_SubformSet: + case XFA_ELEMENT_Subform: + case XFA_ELEMENT_Area: + case XFA_ELEMENT_PageArea: + return XFA_DataMerge_CopyContainer_SubformSet(this, pTemplateNode, pFormNode, pDataScope, bOneInstance, bDataMerge); + case XFA_ELEMENT_ExclGroup: + case XFA_ELEMENT_Field: + case XFA_ELEMENT_Draw: + case XFA_ELEMENT_ContentArea: + return XFA_DataMerge_CopyContainer_Field(this, pTemplateNode, pFormNode, pDataScope, bDataMerge, bUpLevel); + case XFA_ELEMENT_PageSet: + break; + case XFA_ELEMENT_Variables: + break; + default: + FXSYS_assert(FALSE); + break; + } + return NULL; +} +#define XFA_DATAMERGE_UPDATEBINDINGRELATIONS_DFS +#ifdef XFA_DATAMERGE_UPDATEBINDINGRELATIONS_DFS +static void XFA_DataMerge_UpdateBindingRelations(CXFA_Document* pDocument, CXFA_Node* pFormNode, CXFA_Node* pDataScope, FX_BOOL bDataRef, FX_BOOL bParentDataRef) +{ + FX_BOOL bMatchRef = TRUE; + XFA_ELEMENT eClassID = pFormNode->GetClassID(); + CXFA_Node* pDataNode = pFormNode->GetBindData(); + if(eClassID == XFA_ELEMENT_Subform || eClassID == XFA_ELEMENT_ExclGroup || eClassID == XFA_ELEMENT_Field) { + CXFA_Node *pTemplateNode = pFormNode->GetTemplateNode(); + CXFA_Node *pTemplateNodeBind = pTemplateNode ? pTemplateNode->GetFirstChildByClass(XFA_ELEMENT_Bind) : NULL; + XFA_ATTRIBUTEENUM eMatch = pTemplateNodeBind ? pTemplateNodeBind->GetEnum(XFA_ATTRIBUTE_Match) : XFA_ATTRIBUTEENUM_Once; + switch(eMatch) { + case XFA_ATTRIBUTEENUM_None: + if (!bDataRef || bParentDataRef) { + XFA_DataMerge_FormValueNode_MatchNoneCreateChild(pFormNode); + } + break; + case XFA_ATTRIBUTEENUM_Once: + if (!bDataRef || bParentDataRef) { + if (!pDataNode) { + if (pFormNode->GetNameHash() != 0 && pFormNode->GetEnum(XFA_ATTRIBUTE_Scope) != XFA_ATTRIBUTEENUM_None) { + XFA_ELEMENT eDataNodeType = (eClassID == XFA_ELEMENT_Subform || XFA_FieldIsMultiListBox(pFormNode)) ? XFA_ELEMENT_DataGroup : XFA_ELEMENT_DataValue; + pDataNode = XFA_DataDescription_MaybeCreateDataNode(pDocument, pDataScope, eDataNodeType, pFormNode->GetCData(XFA_ATTRIBUTE_Name)); + if(pDataNode) { + XFA_DataMerge_CreateDataBinding(pFormNode, pDataNode, FALSE); + } + } + if (!pDataNode) { + XFA_DataMerge_FormValueNode_MatchNoneCreateChild(pFormNode); + } + } else { + CXFA_Node* pDataParent = pDataNode->GetNodeItem(XFA_NODEITEM_Parent); + if(pDataParent != pDataScope) { + FXSYS_assert(pDataParent); + pDataParent->RemoveChild(pDataNode); + pDataScope->InsertChild(pDataNode); + } + } + } + break; + case XFA_ATTRIBUTEENUM_Global: + if (!bDataRef || bParentDataRef) { + FX_DWORD dwNameHash = pFormNode->GetNameHash(); + if (dwNameHash != 0 && !pDataNode) { + pDataNode = XFA_DataMerge_GetGlobalBinding(pDocument, dwNameHash); + if(!pDataNode) { + XFA_ELEMENT eDataNodeType = (eClassID == XFA_ELEMENT_Subform || XFA_FieldIsMultiListBox(pFormNode)) ? XFA_ELEMENT_DataGroup : XFA_ELEMENT_DataValue; + CXFA_Node* pRecordNode = (CXFA_Node*)pDocument->GetXFANode(XFA_HASHCODE_Record); + pDataNode = XFA_DataDescription_MaybeCreateDataNode(pDocument, pRecordNode, eDataNodeType, pFormNode->GetCData(XFA_ATTRIBUTE_Name)); + if(pDataNode) { + XFA_DataMerge_CreateDataBinding(pFormNode, pDataNode, FALSE); + XFA_DataMerge_RegisterGlobalBinding(pDocument, pFormNode->GetNameHash(), pDataNode); + } + } else { + XFA_DataMerge_CreateDataBinding(pFormNode, pDataNode); + } + } + if (!pDataNode) { + XFA_DataMerge_FormValueNode_MatchNoneCreateChild(pFormNode); + } + } + break; + case XFA_ATTRIBUTEENUM_DataRef: { + bMatchRef = bDataRef; + bParentDataRef = TRUE; + if (!pDataNode && bDataRef) { + CFX_WideStringC wsRef = pTemplateNodeBind->GetCData(XFA_ATTRIBUTE_Ref); + FX_DWORD dFlags = XFA_RESOLVENODE_Children + | XFA_RESOLVENODE_CreateNode; + XFA_RESOLVENODE_RS rs; + pDocument->GetScriptContext()->ResolveObjects(pDataScope, wsRef, rs, dFlags, pTemplateNode); + CXFA_Object* pObject = (rs.nodes.GetSize() > 0) ? rs.nodes[0] : NULL; + pDataNode = (pObject && pObject->IsNode()) ? (CXFA_Node*)pObject : NULL; + if(pDataNode) { + XFA_DataMerge_CreateDataBinding(pFormNode, pDataNode, rs.dwFlags == XFA_RESOVENODE_RSTYPE_ExistNodes ? TRUE : FALSE); + } else { + XFA_DataMerge_FormValueNode_MatchNoneCreateChild(pFormNode); + } + } + } + break; + default: + break; + } + } + if(bMatchRef && (eClassID == XFA_ELEMENT_Subform || eClassID == XFA_ELEMENT_SubformSet || eClassID == XFA_ELEMENT_Area || eClassID == XFA_ELEMENT_PageArea || eClassID == XFA_ELEMENT_PageSet)) { + for(CXFA_Node* pFormChild = pFormNode->GetNodeItem(XFA_NODEITEM_FirstChild); pFormChild; pFormChild = pFormChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if(pFormChild->GetObjectType() != XFA_OBJECTTYPE_ContainerNode) { + continue; + } + if(pFormChild->HasFlag(XFA_NODEFLAG_UnusedNode)) { + continue; + } + XFA_DataMerge_UpdateBindingRelations(pDocument, pFormChild, pDataNode ? pDataNode : pDataScope, bDataRef, bParentDataRef); + } + } +} +#else +static void XFA_DataMerge_UpdateBindingRelations(CXFA_Document* pDocument, CXFA_Node* pFormNode, CXFA_Node* pDataScope, CFX_PtrList& rgFormNodeList, CFX_PtrList& rgDataScopeList, FX_BOOL bD _DEBUG +#ifdef _DEBUG + CFX_WideString wsFormSOM; CFX_WideString wsDataScopeSOM; + pFormNode->GetSOMExpression(wsFormSOM); pDataScope->GetSOMExpression(wsDataScopeSOM); +#endif + XFA_ELEMENT eClassID = pFormNode->GetClassID(); + CXFA_Node* pDataNode = pFormNode->GetBindData(); + if(eClassID == XFA_ELEMENT_Subform || eClassID == XFA_ELEMENT_ExclGroup || eClassID == XFA_ELEMENT_Field) +{ +CXFA_Node *pTemplateNode = pFormNode->GetTemplateNode(); + CXFA_Node *pTemplateNodeBind = pTemplateNode ? pTemplateNode->GetFirstChildByClass(XFA_ELEMENT_Bind) : NULL; + XFA_ATTRIBUTEENUM eMatch = pTemplateNodeBind ? pTemplateNodeBind->GetEnum(XFA_ATTRIBUTE_Match) : XFA_ATTRIBUTEENUM_Once; + switch(eMatch) { + case XFA_ATTRIBUTEENUM_None: + break; + case XFA_ATTRIBUTEENUM_Once: { + if (!pDataNode) { + if (pFormNode->GetNameHash() != 0 && pFormNode->GetEnum(XFA_ATTRIBUTE_Scope) != XFA_ATTRIBUTEENUM_None) { + XFA_ELEMENT eDataNodeType = eClassID == XFA_ELEMENT_Subform ? XFA_ELEMENT_DataGroup : XFA_ELEMENT_DataValue; + pDataNode = XFA_DataDescription_MaybeCreateDataNode(pDocument, pDataScope, eDataNodeType, pFormNode->GetCData(XFA_ATTRIBUTE_Name)); + if(pDataNode) { + XFA_DataMerge_CreateDataBinding(pFormNode, pDataNode, FALSE); + } + } + } else { + CXFA_Node* pDataParent = pDataNode->GetNodeItem(XFA_NODEITEM_Parent); + if(pDataParent != pDataScope) { + FXSYS_assert(pDataParent); + pDataParent->RemoveChild(pDataNode); + pDataScope->InsertChild(pDataNode); + } + } + } + break; + case XFA_ATTRIBUTEENUM_Global: { + FX_DWORD dwNameHash = pFormNode->GetNameHash(); + if (dwNameHash != 0 && !pDataNode) { + pDataNode = XFA_DataMerge_GetGlobalBinding(pDocument, dwNameHash); + if(!pDataNode) { + XFA_ELEMENT eDataNodeType = eClassID == XFA_ELEMENT_Subform ? XFA_ELEMENT_DataGroup : XFA_ELEMENT_DataValue; + CXFA_Node* pRecordNode = (CXFA_Node*)pDocument->GetXFANode(XFA_HASHCODE_Record); + pDataNode = XFA_DataDescription_MaybeCreateDataNode(pDocument, pRecordNode, eDataNodeType, pFormNode->GetCData(XFA_ATTRIBUTE_Name)); + } + if(pDataNode) { + XFA_DataMerge_CreateDataBinding(pFormNode, pDataNode, FALSE); + XFA_DataMerge_RegisterGlobalBinding(pDocument, pFormNode->GetNameHash(), pDataNode); + } + } + } + break; + case XFA_ATTRIBUTEENUM_DataRef: { + if (!pDataNode) { + CFX_WideStringC wsRef = pTemplateNodeBind->GetCData(XFA_ATTRIBUTE_Ref); + FX_DWORD dFlags = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Attributes | XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent + | XFA_RESOLVENODE_CreateNode; + XFA_RESOLVENODE_RS rs; + pDocument->GetScriptContext()->ResolveObjects(pDataScope, wsRef, rs, dFlags, pTemplateNode); + CXFA_Object* pObject = (rs.nodes.GetSize() > 0) ? rs.nodes[0] : NULL; + pDataNode = (pObject && pObject->IsNode()) ? (CXFA_Node*)pObject : NULL; + if(pDataNode) { + XFA_DataMerge_CreateDataBinding(pFormNode, pDataNode, FALSE); + } + } + } + break; + } +} +if(eClassID == XFA_ELEMENT_Subform || eClassID == XFA_ELEMENT_ExclGroup || eClassID == XFA_ELEMENT_SubformSet || eClassID == XFA_ELEMENT_Area || eClassID == XFA_ELEMENT_PageArea) +{ +for(CXFA_Node* pFormChild = pFormNode->GetNodeItem(XFA_NODEITEM_FirstChild); pFormChild; pFormChild = pFormChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if(pFormChild->GetObjectType() != XFA_OBJECTTYPE_ContainerNode) { + continue; + } + if(pFormChild->HasFlag(XFA_NODEFLAG_UnusedNode)) { + continue; + } + rgFormNodeList.AddTail(pFormChild); + rgDataScopeList.AddTail(pDataNode ? pDataNode : pDataScope); + } +} +} +#endif +CXFA_Node* XFA_DataMerge_FindDataScope(CXFA_Node* pParentFormNode) +{ + for(CXFA_Node* pRootBoundNode = pParentFormNode; pRootBoundNode && pRootBoundNode->GetObjectType() == XFA_OBJECTTYPE_ContainerNode; pRootBoundNode = pRootBoundNode->GetNodeItem(XFA_NODEITEM_Parent)) { + CXFA_Node* pDataScope = pRootBoundNode->GetBindData(); + if(pDataScope) { + return pDataScope; + } + } + return (CXFA_Node*)pParentFormNode->GetDocument()->GetXFANode(XFA_HASHCODE_Data); +} +void CXFA_Document::DataMerge_UpdateBindingRelations(CXFA_Node* pFormUpdateRoot) +{ + CXFA_Node* pDataScope = XFA_DataMerge_FindDataScope(pFormUpdateRoot->GetNodeItem(XFA_NODEITEM_Parent)); + if (!pDataScope) { + return; + } +#ifdef XFA_DATAMERGE_UPDATEBINDINGRELATIONS_DFS + XFA_DataMerge_UpdateBindingRelations(this, pFormUpdateRoot, pDataScope, FALSE, FALSE); + XFA_DataMerge_UpdateBindingRelations(this, pFormUpdateRoot, pDataScope, TRUE, FALSE); +#else + CFX_PtrList rgFormNodeList, rgDataScopeList; + rgFormNodeList.AddTail(pFormUpdateRoot); + rgDataScopeList.AddTail(pDataScope); + while(rgFormNodeList.GetCount()) { + FX_POSITION pos; + pos = rgFormNodeList.GetHeadPosition(); + CXFA_Node *pCurFormNode = (CXFA_Node*)rgFormNodeList.GetAt(pos); + rgFormNodeList.RemoveAt(pos); + pos = rgDataScopeList.GetHeadPosition(); + CXFA_Node *pCurDataScope = (CXFA_Node*)rgDataScopeList.GetAt(pos); + rgDataScopeList.RemoveAt(pos); + XFA_DataMerge_UpdateBindingRelations(this, pCurFormNode, pCurDataScope, rgFormNodeList, rgDataScopeList); + } +#endif +} +CXFA_Node * CXFA_Document::GetNotBindNode(CXFA_ObjArray& arrayNodes) +{ + for(FX_INT32 i = 0; i < arrayNodes.GetSize(); i++) { + CXFA_Object* pObject = arrayNodes[i]; + if(!pObject->IsNode()) { + continue; + } + if (((CXFA_Node*)pObject)->HasBindItem()) { + continue; + } + return ((CXFA_Node*)pObject); + } + return NULL; +} +void CXFA_Document::DoDataMerge() +{ + CXFA_Node* pTemplateRoot = m_pRootNode->GetFirstChildByClass(XFA_ELEMENT_Template); + CXFA_Node* pDatasetsRoot = (CXFA_Node*)GetXFANode(XFA_HASHCODE_Datasets); + if(!pDatasetsRoot) { + IFDE_XMLElement* pDatasetsXMLNode = IFDE_XMLElement::Create(FX_WSTRC(L"xfa:datasets")); + FXSYS_assert(pDatasetsXMLNode); + pDatasetsXMLNode->SetString(FX_WSTRC(L"xmlns:xfa"), FX_WSTRC(L"http://www.xfa.org/schema/xfa-data/1.0/")); + pDatasetsRoot = CreateNode(XFA_XDPPACKET_Datasets, XFA_ELEMENT_DataModel); + pDatasetsRoot->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L"datasets")); + m_pRootNode->GetXMLMappingNode()->InsertChildNode(pDatasetsXMLNode); + m_pRootNode->InsertChild(pDatasetsRoot); + pDatasetsRoot->SetXMLMappingNode(pDatasetsXMLNode); + } + CXFA_Node *pDataRoot = NULL, *pDDRoot = NULL; + CFX_WideString wsDatasetsURI; + pDatasetsRoot->TryNamespace(wsDatasetsURI); + for(CXFA_Node *pChildNode = pDatasetsRoot->GetNodeItem(XFA_NODEITEM_FirstChild); pChildNode; pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if(pChildNode->GetClassID() != XFA_ELEMENT_DataGroup) { + continue; + } + CFX_WideString wsNamespaceURI; + if(!pDDRoot && pChildNode->GetNameHash() == XFA_HASHCODE_DataDescription) { + if(!pChildNode->TryNamespace(wsNamespaceURI)) { + continue; + } + if(wsNamespaceURI == FX_WSTRC(L"http://ns.adobe.com/data-description/")) { + pDDRoot = pChildNode; + } + } else if(!pDataRoot && pChildNode->GetNameHash() == XFA_HASHCODE_Data) { + if(!pChildNode->TryNamespace(wsNamespaceURI)) { + continue; + } + if(wsNamespaceURI == wsDatasetsURI) { + pDataRoot = pChildNode; + } + } + if(pDataRoot && pDDRoot) { + break; + } + } + if(!pDataRoot) { + IFDE_XMLElement* pDataRootXMLNode = IFDE_XMLElement::Create(FX_WSTRC(L"xfa:data")); + FXSYS_assert(pDataRootXMLNode); + pDataRoot = CreateNode(XFA_XDPPACKET_Datasets, XFA_ELEMENT_DataGroup); + pDataRoot->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L"data")); + pDataRoot->SetXMLMappingNode(pDataRootXMLNode); + pDatasetsRoot->InsertChild(pDataRoot); + } + CXFA_Node* pDataTopLevel = pDataRoot->GetFirstChildByClass(XFA_ELEMENT_DataGroup); + FX_DWORD dwNameHash = pDataTopLevel ? pDataTopLevel->GetNameHash() : 0; + CXFA_Node* pTemplateChosen = dwNameHash != 0 ? pTemplateRoot->GetFirstChildByName(dwNameHash) : NULL; + if(!pTemplateChosen || pTemplateChosen->GetClassID() != XFA_ELEMENT_Subform) { + pTemplateChosen = pTemplateRoot->GetFirstChildByClass(XFA_ELEMENT_Subform); + } + if(!pTemplateChosen) { + return; + } + CXFA_Node* pFormRoot = m_pRootNode->GetFirstChildByClass(XFA_ELEMENT_Form); + FX_BOOL bEmptyForm = FALSE; + if(!pFormRoot) { + bEmptyForm = TRUE; + pFormRoot = CreateNode(XFA_XDPPACKET_Form, XFA_ELEMENT_Form); + FXSYS_assert(pFormRoot); + pFormRoot->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L"form")); + m_pRootNode->InsertChild(pFormRoot, NULL); + } else { + CXFA_NodeIteratorTemplate sIterator(pFormRoot); + for(CXFA_Node *pNode = sIterator.MoveToNext(); pNode; pNode = sIterator.MoveToNext()) { + pNode->SetFlag(XFA_NODEFLAG_UnusedNode); + } + } + CXFA_Node* pSubformSetNode = XFA_NodeMerge_CloneOrMergeContainer(this, pFormRoot, pTemplateChosen, FALSE); + FXSYS_assert(pSubformSetNode); + if (!pDataTopLevel) { + CFX_WideStringC wsFormName = pSubformSetNode->GetCData(XFA_ATTRIBUTE_Name); + CFX_WideString wsDataTopLevelName = wsFormName.IsEmpty() ? FX_WSTRC(L"form") : wsFormName; + IFDE_XMLElement* pDataTopLevelXMLNode = IFDE_XMLElement::Create(wsDataTopLevelName); + FXSYS_assert(pDataTopLevelXMLNode); + pDataTopLevel = CreateNode(XFA_XDPPACKET_Datasets, XFA_ELEMENT_DataGroup); + pDataTopLevel->SetCData(XFA_ATTRIBUTE_Name, wsDataTopLevelName); + pDataTopLevel->SetXMLMappingNode(pDataTopLevelXMLNode); + CXFA_Node* pBeforeNode = pDataRoot->GetNodeItem(XFA_NODEITEM_FirstChild); + pDataRoot->InsertChild(pDataTopLevel, pBeforeNode); + } + FXSYS_assert(pDataTopLevel); + XFA_DataMerge_CreateDataBinding(pSubformSetNode, pDataTopLevel); + for (CXFA_Node *pTemplateChild = pTemplateChosen->GetNodeItem(XFA_NODEITEM_FirstChild); pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if (XFA_NeedGenerateForm(pTemplateChild)) { + XFA_NodeMerge_CloneOrMergeContainer(this, pSubformSetNode, pTemplateChild, TRUE); + } else if(pTemplateChild->GetObjectType() == XFA_OBJECTTYPE_ContainerNode) { + DataMerge_CopyContainer(pTemplateChild, pSubformSetNode, pDataTopLevel); + } + } + if(pDDRoot) { + XFA_DataDescription_UpdateDataRelation(pDataRoot, pDDRoot); + } + DataMerge_UpdateBindingRelations(pSubformSetNode); + CXFA_Node* pPageSetNode = pSubformSetNode->GetFirstChildByClass(XFA_ELEMENT_PageSet); + while (pPageSetNode) { + m_pPendingPageSet.Add(pPageSetNode); + CXFA_Node* pNextPageSetNode = pPageSetNode->GetNextSameClassSibling(XFA_ELEMENT_PageSet); + pSubformSetNode->RemoveChild(pPageSetNode); + pPageSetNode = pNextPageSetNode; + } + if(!bEmptyForm) { + CXFA_NodeIteratorTemplate sIterator(pFormRoot); + CXFA_Node *pNode = sIterator.MoveToNext(); + while(pNode) { + if(pNode->HasFlag(XFA_NODEFLAG_UnusedNode)) { + if(pNode->GetObjectType() == XFA_OBJECTTYPE_ContainerNode || pNode->GetClassID() == XFA_ELEMENT_InstanceManager) { + CXFA_Node* pNext = sIterator.SkipChildrenAndMoveToNext(); + pNode->GetNodeItem(XFA_NODEITEM_Parent)->RemoveChild(pNode); + pNode = pNext; + } else { + pNode->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE); + pNode->SetFlag(XFA_NODEFLAG_Initialized); + pNode = sIterator.MoveToNext(); + } + } else { + pNode->SetFlag(XFA_NODEFLAG_Initialized); + pNode = sIterator.MoveToNext(); + } + } + } +} +void CXFA_Document::DoDataRemerge(FX_BOOL bDoDataMerge) +{ + CXFA_Node* pFormRoot = (CXFA_Node*)this->GetXFANode(XFA_HASHCODE_Form); + if(pFormRoot) { + while(CXFA_Node* pNode = pFormRoot->GetNodeItem(XFA_NODEITEM_FirstChild)) { + pFormRoot->RemoveChild(pNode); + } + pFormRoot->SetObject(XFA_ATTRIBUTE_BindingNode, NULL); + } + XFA_DataMerge_ClearGlobalBinding(this); + if (bDoDataMerge) { + DoDataMerge(); + } + CXFA_LayoutProcessor* pLayoutProcessor = GetLayoutProcessor(); + pLayoutProcessor->SetForceReLayout(TRUE); +} diff --git a/xfa/src/fxfa/src/parser/xfa_document_datamerger_imp.h b/xfa/src/fxfa/src/parser/xfa_document_datamerger_imp.h new file mode 100644 index 0000000000..9b7bc5a408 --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_document_datamerger_imp.h @@ -0,0 +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 + +#ifndef _XFA_DOCUMENT_DATAMERGER_IMP_H_ +#define _XFA_DOCUMENT_DATAMERGER_IMP_H_ +CXFA_Node* XFA_NodeMerge_CloneOrMergeContainer(CXFA_Document* pDocument, CXFA_Node* pFormParent, CXFA_Node* pTemplateNode, FX_BOOL bRecursive, CXFA_NodeArray* pSubformArray = NULL); +CXFA_Node* XFA_DataMerge_FindDataScope(CXFA_Node* pParentFormNode); +CXFA_Node* XFA_DataMerge_FindFormDOMInstance(CXFA_Document* pDocument, XFA_ELEMENT eClassID, FX_DWORD dwNameHash, CXFA_Node* pFormParent); +#endif diff --git a/xfa/src/fxfa/src/parser/xfa_document_imp.cpp b/xfa/src/fxfa/src/parser/xfa_document_imp.cpp new file mode 100644 index 0000000000..ad1ff99253 --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_document_imp.cpp @@ -0,0 +1,418 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_utils.h" +#include "../common/xfa_object.h" +#include "../common/xfa_document.h" +#include "../common/xfa_parser.h" +#include "../common/xfa_script.h" +#include "../common/xfa_docdata.h" +#include "../common/xfa_doclayout.h" +#include "../common/xfa_debug.h" +#include "../common/xfa_localemgr.h" +#include "../common/xfa_fm2jsapi.h" +#include "xfa_debug_parser.h" +#include "xfa_basic_imp.h" +#include "xfa_document_layout_imp.h" +#include "xfa_script_datawindow.h" +#include "xfa_script_eventpseudomodel.h" +#include "xfa_script_hostpseudomodel.h" +#include "xfa_script_logpseudomodel.h" +#include "xfa_script_layoutpseudomodel.h" +#include "xfa_script_signaturepseudomodel.h" +CXFA_Document::CXFA_Document(IXFA_DocParser *pParser) + : m_pParser(pParser) + , m_pLayoutProcessor(NULL) + , m_pRootNode(NULL) + , m_pScriptContext(NULL) + , m_pLocalMgr(NULL) + , m_pScriptDataWindow(NULL) + , m_pScriptEvent(NULL) + , m_pScriptHost(NULL) + , m_pScriptLog(NULL) + , m_pScriptLayout(NULL) + , m_pScriptSignature(NULL) + , m_dwDocFlags(0) + , m_eCurVersionMode(XFA_VERSION_DEFAULT) +{ + ASSERT(m_pParser); +} +CXFA_Document::~CXFA_Document() +{ + if (m_pRootNode) { + delete m_pRootNode; + } + PurgeNodes(); +} +void CXFA_Document::ClearLayoutData() +{ + if(m_pLayoutProcessor) { + delete m_pLayoutProcessor; + m_pLayoutProcessor = NULL; + } + if (m_pScriptContext) { + m_pScriptContext->Release(); + m_pScriptContext = NULL; + } + if (m_pLocalMgr) { + delete m_pLocalMgr; + m_pLocalMgr = NULL; + } + if(m_pScriptDataWindow) { + delete m_pScriptDataWindow; + m_pScriptDataWindow = NULL; + } + if(m_pScriptEvent) { + delete m_pScriptEvent; + m_pScriptEvent = NULL; + } + if (m_pScriptHost) { + delete m_pScriptHost; + m_pScriptHost = NULL; + } + if (m_pScriptLog) { + delete m_pScriptLog; + m_pScriptLog = NULL; + } + if(m_pScriptLayout) { + delete m_pScriptLayout; + m_pScriptLayout = NULL; + } + if(m_pScriptSignature) { + delete m_pScriptSignature; + m_pScriptSignature = NULL; + } +} +void CXFA_Document::SetRoot(CXFA_Node* pNewRoot) +{ + if(m_pRootNode) { + AddPurgeNode(m_pRootNode); + } + m_pRootNode = pNewRoot; + RemovePurgeNode(pNewRoot); +} +IXFA_Notify* CXFA_Document::GetNotify() const +{ + return m_pParser->GetNotify(); +} +CXFA_Object* CXFA_Document::GetXFANode(FX_WSTR wsNodeName) +{ + return GetXFANode(FX_HashCode_String_GetW(wsNodeName.GetPtr(), wsNodeName.GetLength())); +} +CXFA_Object* CXFA_Document::GetXFANode(FX_DWORD dwNodeNameHash) +{ + switch(dwNodeNameHash) { + case XFA_HASHCODE_Data: { + CXFA_Node* pDatasetsNode = (CXFA_Node*)GetXFANode(XFA_HASHCODE_Datasets); + if(!pDatasetsNode) { + return NULL; + } + for (CXFA_Node* pDatasetsChild = pDatasetsNode->GetFirstChildByClass(XFA_ELEMENT_DataGroup); pDatasetsChild; pDatasetsChild = pDatasetsChild->GetNextSameClassSibling(XFA_ELEMENT_DataGroup)) { + if(pDatasetsChild->GetNameHash() != XFA_HASHCODE_Data) { + continue; + } + CFX_WideString wsNamespaceURI; + if(!pDatasetsChild->TryNamespace(wsNamespaceURI)) { + continue; + } + CFX_WideString wsDatasetsURI; + if(!pDatasetsNode->TryNamespace(wsDatasetsURI)) { + continue; + } + if(wsNamespaceURI == wsDatasetsURI) { + return pDatasetsChild; + } + } + } + return NULL; + case XFA_HASHCODE_Record: { + CXFA_Node* pData = (CXFA_Node*)GetXFANode(XFA_HASHCODE_Data); + return pData ? pData->GetFirstChildByClass(XFA_ELEMENT_DataGroup) : NULL; + } + case XFA_HASHCODE_DataWindow: { + if(m_pScriptDataWindow == NULL) { + m_pScriptDataWindow = FX_NEW CScript_DataWindow(this); + } + return m_pScriptDataWindow; + } + case XFA_HASHCODE_Event: { + if(m_pScriptEvent == NULL) { + m_pScriptEvent = FX_NEW CScript_EventPseudoModel(this); + } + return m_pScriptEvent; + } + case XFA_HASHCODE_Host: { + if(m_pScriptHost == NULL) { + m_pScriptHost = FX_NEW CScript_HostPseudoModel(this); + } + return m_pScriptHost; + } + case XFA_HASHCODE_Log: { + if (m_pScriptLog == NULL) { + m_pScriptLog = FX_NEW CScript_LogPseudoModel(this); + } + return m_pScriptLog; + } + case XFA_HASHCODE_Signature: { + if(m_pScriptSignature == NULL) { + m_pScriptSignature = FX_NEW CScript_SignaturePseudoModel(this); + } + return m_pScriptSignature; + } + case XFA_HASHCODE_Layout: { + if(m_pScriptLayout == NULL) { + m_pScriptLayout = FX_NEW CScript_LayoutPseudoModel(this); + } + return m_pScriptLayout; + } + default: + return m_pRootNode->GetFirstChildByName(dwNodeNameHash); + } +} +CXFA_Node* CXFA_Document::CreateNode(FX_DWORD dwPacket, XFA_ELEMENT eElement) +{ + XFA_LPCPACKETINFO pPacket = XFA_GetPacketByID(dwPacket); + return CreateNode(pPacket, eElement); +} +CXFA_Node* CXFA_Document::CreateNode(XFA_LPCPACKETINFO pPacket, XFA_ELEMENT eElement) +{ + if (pPacket == NULL) { + return NULL; + } + XFA_LPCELEMENTINFO pElement = XFA_GetElementByID(eElement); + if (pElement && (pElement->dwPackets & pPacket->eName)) { + CXFA_Node* pNode = FX_NEW CXFA_Node(this, pPacket->eName, pElement->eName); + if(pNode) { + AddPurgeNode(pNode); + } + return pNode; + } + return NULL; +} +void CXFA_Document::AddPurgeNode(CXFA_Node *pNode) +{ + m_rgPurgeNodes.Add(pNode); +} +FX_BOOL CXFA_Document::RemovePurgeNode(CXFA_Node *pNode) +{ + return m_rgPurgeNodes.RemoveKey(pNode); +} +void CXFA_Document::PurgeNodes() +{ + FX_POSITION psNode = m_rgPurgeNodes.GetStartPosition(); + while(psNode) { + CXFA_Node* pNode; + m_rgPurgeNodes.GetNextAssoc(psNode, pNode); + delete pNode; + } + m_rgPurgeNodes.RemoveAll(); +} +void CXFA_Document::SetFlag(FX_DWORD dwFlag, FX_BOOL bOn ) +{ + if (bOn) { + m_dwDocFlags |= dwFlag; + } else { + m_dwDocFlags &= ~dwFlag; + } +} +FX_BOOL CXFA_Document::IsInteractive() +{ + if (m_dwDocFlags & XFA_DOCFLAG_HasInteractive) { + return m_dwDocFlags & XFA_DOCFLAG_Interactive; + } + CXFA_Node* pConfig = (CXFA_Node*)this->GetXFANode(XFA_HASHCODE_Config); + if (!pConfig) { + return FALSE; + } + CFX_WideString wsInteractive; + CXFA_Node* pPresent = pConfig->GetFirstChildByClass(XFA_ELEMENT_Present); + if (!pPresent) { + return FALSE; + } + CXFA_Node* pPDF = pPresent->GetFirstChildByClass(XFA_ELEMENT_Pdf); + if (!pPDF) { + return FALSE; + } + CXFA_Node* pInteractive = pPDF->GetChild(0, XFA_ELEMENT_Interactive); + if (pInteractive) { + m_dwDocFlags |= XFA_DOCFLAG_HasInteractive; + if (pInteractive->TryContent(wsInteractive) && wsInteractive == FX_WSTRC(L"1")) { + m_dwDocFlags |= XFA_DOCFLAG_Interactive; + return TRUE; + } + } + return FALSE; +} +CXFA_LocaleMgr* CXFA_Document::GetLocalMgr() +{ + if (!m_pLocalMgr) { + CFX_WideString wsLanguage; + this->GetParser()->GetNotify()->GetAppProvider()->GetLanguage(wsLanguage); + m_pLocalMgr = FX_NEW CXFA_LocaleMgr((CXFA_Node*)this->GetXFANode(XFA_HASHCODE_LocaleSet), wsLanguage); + } + return m_pLocalMgr; +} +IXFA_ScriptContext* CXFA_Document::InitScriptContext(FXJSE_HRUNTIME hRuntime) +{ + if (!m_pScriptContext) { + m_pScriptContext = XFA_ScriptContext_Create(this); + } + m_pScriptContext->Initialize(hRuntime); + return m_pScriptContext; +} +IXFA_ScriptContext* CXFA_Document::GetScriptContext() +{ + if (!m_pScriptContext) { + m_pScriptContext = XFA_ScriptContext_Create(this); + } + return m_pScriptContext; +} +XFA_VERSION CXFA_Document::RecognizeXFAVersionNumber(CFX_WideString& wsTemplateNS) +{ + CFX_WideStringC wsTemplateURIPrefix = XFA_GetPacketByIndex(XFA_PACKET_Template)->pURI; + FX_STRSIZE nPrefixLength = wsTemplateURIPrefix.GetLength(); + if(CFX_WideStringC(wsTemplateNS, wsTemplateNS.GetLength()) != wsTemplateURIPrefix) { + return XFA_VERSION_UNKNOWN; + } + FX_STRSIZE nDotPos = wsTemplateNS.Find('.', nPrefixLength); + if(nDotPos == (FX_STRSIZE)-1) { + return XFA_VERSION_UNKNOWN; + } + FX_INT8 iMajor = FXSYS_wtoi(wsTemplateNS.Mid(nPrefixLength, nDotPos - nPrefixLength)); + FX_INT8 iMinor = FXSYS_wtoi(wsTemplateNS.Mid(nDotPos + 1, wsTemplateNS.GetLength() - nDotPos - 2)); + XFA_VERSION eVersion = (XFA_VERSION)((FX_INT32)iMajor * 100 + iMinor); + if(eVersion < XFA_VERSION_MIN || eVersion > XFA_VERSION_MAX) { + return XFA_VERSION_UNKNOWN; + } + m_eCurVersionMode = eVersion; + return eVersion; +} +CXFA_Node* CXFA_Document::GetNodeByID(CXFA_Node* pRoot, FX_WSTR wsID) +{ + if(!pRoot || wsID.IsEmpty()) { + return NULL; + } + CXFA_NodeIterator sIterator(pRoot); + for(CXFA_Node* pNode = sIterator.GetCurrent(); pNode; pNode = sIterator.MoveToNext()) { + CFX_WideStringC wsIDVal; + if(pNode->TryCData(XFA_ATTRIBUTE_Id, wsIDVal) && !wsIDVal.IsEmpty()) { + if(wsIDVal == wsID) { + return pNode; + } + } + } + return NULL; +} +static void XFA_ProtoMerge_MergeNodeRecurse(CXFA_Document *pDocument, CXFA_Node *pDestNodeParent, CXFA_Node *pProtoNode) +{ + CXFA_Node* pExistingNode = NULL; + for(CXFA_Node* pFormChild = pDestNodeParent->GetNodeItem(XFA_NODEITEM_FirstChild); pFormChild; pFormChild = pFormChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if(pFormChild->GetClassID() == pProtoNode->GetClassID() && pFormChild->GetNameHash() == pProtoNode->GetNameHash() && pFormChild->HasFlag(XFA_NODEFLAG_UnusedNode)) { + pFormChild->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE); + pExistingNode = pFormChild; + break; + } + } + if (pExistingNode) { + pExistingNode->SetTemplateNode(pProtoNode); + for (CXFA_Node *pTemplateChild = pProtoNode->GetNodeItem(XFA_NODEITEM_FirstChild); pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { + XFA_ProtoMerge_MergeNodeRecurse(pDocument, pExistingNode, pTemplateChild); + } + return; + } + CXFA_Node* pNewNode = pProtoNode->Clone(TRUE); + pNewNode->SetTemplateNode(pProtoNode); + pDestNodeParent->InsertChild(pNewNode, NULL); +} +static void XFA_ProtoMerge_MergeNode(CXFA_Document *pDocument, CXFA_Node *pDestNode, CXFA_Node *pProtoNode) +{ + { + CXFA_NodeIterator sIterator(pDestNode); + for(CXFA_Node* pNode = sIterator.GetCurrent(); pNode; pNode = sIterator.MoveToNext()) { + pNode->SetFlag(XFA_NODEFLAG_UnusedNode); + } + } + pDestNode->SetTemplateNode(pProtoNode); + for (CXFA_Node *pTemplateChild = pProtoNode->GetNodeItem(XFA_NODEITEM_FirstChild); pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { + XFA_ProtoMerge_MergeNodeRecurse(pDocument, pDestNode, pTemplateChild); + } + { + CXFA_NodeIterator sIterator(pDestNode); + for(CXFA_Node* pNode = sIterator.GetCurrent(); pNode; pNode = sIterator.MoveToNext()) { + pNode->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE); + } + } +} +void CXFA_Document::DoProtoMerge() +{ + CXFA_Node* pTemplateRoot = (CXFA_Node*)GetXFANode(XFA_HASHCODE_Template); + if(!pTemplateRoot) { + return; + } + CFX_MapPtrTemplate mIDMap; + CXFA_NodeSet sUseNodes; + CXFA_NodeIterator sIterator(pTemplateRoot); + for(CXFA_Node* pNode = sIterator.GetCurrent(); pNode; pNode = sIterator.MoveToNext()) { + CFX_WideStringC wsIDVal; + if(pNode->TryCData(XFA_ATTRIBUTE_Id, wsIDVal) && !wsIDVal.IsEmpty()) { + mIDMap[FX_HashCode_String_GetW(wsIDVal.GetPtr(), wsIDVal.GetLength())] = pNode; + } + CFX_WideStringC wsUseVal; + if(pNode->TryCData(XFA_ATTRIBUTE_Use, wsUseVal) && !wsUseVal.IsEmpty()) { + sUseNodes.Add(pNode); + } else if (pNode->TryCData(XFA_ATTRIBUTE_Usehref, wsUseVal) && !wsUseVal.IsEmpty()) { + sUseNodes.Add(pNode); + } + } + FX_POSITION pos = sUseNodes.GetStartPosition(); + while (pos) { + CXFA_Node* pUseHrefNode = NULL; + sUseNodes.GetNextAssoc(pos, pUseHrefNode); + CFX_WideString wsUseVal; + CFX_WideStringC wsURI, wsID, wsSOM; + if (pUseHrefNode->TryCData(XFA_ATTRIBUTE_Usehref, wsUseVal) && !wsUseVal.IsEmpty()) { + FX_STRSIZE uSharpPos = wsUseVal.Find('#'); + if(uSharpPos < 0) { + wsURI = wsUseVal; + } else { + wsURI = CFX_WideStringC((FX_LPCWSTR)wsUseVal, uSharpPos); + FX_STRSIZE uLen = wsUseVal.GetLength(); + if(uLen >= uSharpPos + 5 && CFX_WideStringC((FX_LPCWSTR)wsUseVal + uSharpPos, 5) == FX_WSTRC(L"#som(") && wsUseVal[uLen - 1] == ')') { + wsSOM = CFX_WideStringC((FX_LPCWSTR)wsUseVal + uSharpPos + 5, uLen - 1 - uSharpPos - 5); + } else { + wsID = CFX_WideStringC((FX_LPCWSTR)wsUseVal + uSharpPos + 1, uLen - uSharpPos - 1); + } + } + } else if(pUseHrefNode->TryCData(XFA_ATTRIBUTE_Use, wsUseVal) && !wsUseVal.IsEmpty()) { + if(wsUseVal[0] == '#') { + wsID = CFX_WideStringC((FX_LPCWSTR)wsUseVal + 1, wsUseVal.GetLength() - 1); + } else { + wsSOM = CFX_WideStringC((FX_LPCWSTR)wsUseVal, wsUseVal.GetLength()); + } + } + if (!wsURI.IsEmpty() && wsURI != FX_WSTRC(L".")) { + continue; + } + CXFA_Node* pProtoNode = NULL; + if(!wsSOM.IsEmpty()) { + FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Attributes | XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings; + XFA_RESOLVENODE_RS resoveNodeRS; + FX_INT32 iRet = m_pScriptContext->ResolveObjects(pUseHrefNode, wsSOM, resoveNodeRS, dwFlag); + if(iRet > 0 && resoveNodeRS.nodes[0]->IsNode()) { + pProtoNode = (CXFA_Node*)resoveNodeRS.nodes[0]; + } + } else if(!wsID.IsEmpty()) { + if(!mIDMap.Lookup(FX_HashCode_String_GetW(wsID.GetPtr(), wsID.GetLength()), pProtoNode)) { + continue; + } + } + if(!pProtoNode) { + continue; + } + XFA_ProtoMerge_MergeNode(this, pUseHrefNode, pProtoNode); + } +} diff --git a/xfa/src/fxfa/src/parser/xfa_document_imp.h b/xfa/src/fxfa/src/parser/xfa_document_imp.h new file mode 100644 index 0000000000..53404c0d9e --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_document_imp.h @@ -0,0 +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 + +#ifndef _XFA_DOCUMENT_IMP_H_ +#define _XFA_DOCUMENT_IMP_H_ +#endif diff --git a/xfa/src/fxfa/src/parser/xfa_document_layout_imp.cpp b/xfa/src/fxfa/src/parser/xfa_document_layout_imp.cpp new file mode 100644 index 0000000000..5ca9bb7a9b --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_document_layout_imp.cpp @@ -0,0 +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 "../../../foxitlib.h" +#include "../common/xfa_utils.h" +#include "../common/xfa_object.h" +#include "../common/xfa_document.h" +#include "../common/xfa_parser.h" +#include "../common/xfa_script.h" +#include "../common/xfa_docdata.h" +#include "../common/xfa_doclayout.h" +#include "../common/xfa_debug.h" +#include "../common/xfa_localemgr.h" +#include "../common/xfa_fm2jsapi.h" +#include "xfa_debug_parser.h" +#include "xfa_basic_imp.h" +#include "xfa_document_imp.h" +#include "xfa_document_layout_imp.h" +#include "xfa_document_datamerger_imp.h" +#include "xfa_layout_itemlayout.h" +#include "xfa_layout_pagemgr_new.h" +#include "xfa_layout_appadapter.h" +CXFA_LayoutProcessor* CXFA_Document::GetLayoutProcessor() +{ + if(!m_pLayoutProcessor) { + m_pLayoutProcessor = FX_NEW CXFA_LayoutProcessor(this); + ASSERT(m_pLayoutProcessor); + } + return m_pLayoutProcessor; +} +IXFA_DocLayout* CXFA_Document::GetDocLayout() +{ + return GetLayoutProcessor(); +} +CXFA_LayoutProcessor::CXFA_LayoutProcessor(CXFA_Document* pDocument) + : m_pDocument(pDocument) + , m_pRootItemLayoutProcessor(NULL) + , m_pLayoutPageMgr(NULL) + , m_nProgressCounter(0) + , m_bNeeLayout(TRUE) +{ +} +CXFA_LayoutProcessor::~CXFA_LayoutProcessor() +{ + ClearLayoutData(); +} +CXFA_Document* CXFA_LayoutProcessor::GetDocument() const +{ + return m_pDocument; +} +FX_INT32 CXFA_LayoutProcessor::StartLayout(FX_BOOL bForceRestart) +{ + if (!bForceRestart && !IsNeedLayout()) { + return 100; + } + if(m_pRootItemLayoutProcessor) { + delete m_pRootItemLayoutProcessor; + m_pRootItemLayoutProcessor = NULL; + } + m_nProgressCounter = 0; + CXFA_Node* pFormPacketNode = (CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_Form); + if (!pFormPacketNode) { + return -1; + } + CXFA_Node* pFormRoot = pFormPacketNode->GetFirstChildByClass(XFA_ELEMENT_Subform); + if(!pFormRoot) { + return -1; + } + if (!m_pLayoutPageMgr) { + m_pLayoutPageMgr = FX_NEW CXFA_LayoutPageMgr(this); + } + if (!m_pLayoutPageMgr->InitLayoutPage(pFormRoot)) { + return -1; + } + if (!m_pLayoutPageMgr->PrepareFirstPage(pFormRoot)) { + return -1; + } + m_pRootItemLayoutProcessor = FX_NEW CXFA_ItemLayoutProcessor(pFormRoot, m_pLayoutPageMgr); +#ifndef _XFA_LAYOUTITEM_ProcessCACHE_ + m_pRootItemLayoutProcessor->m_pPageMgrCreateItem = m_pLayoutPageMgr; +#endif + m_nProgressCounter = 1; + return 0; +} +FX_INT32 CXFA_LayoutProcessor::DoLayout(IFX_Pause* pPause ) +{ + if (m_nProgressCounter < 1) { + return -1; + } + XFA_ItemLayoutProcessorResult eStatus; + CXFA_Node* pFormNode = m_pRootItemLayoutProcessor->GetFormNode(); + FX_FLOAT fPosX = pFormNode->GetMeasure(XFA_ATTRIBUTE_X).ToUnit(XFA_UNIT_Pt); + FX_FLOAT fPosY = pFormNode->GetMeasure(XFA_ATTRIBUTE_Y).ToUnit(XFA_UNIT_Pt); + do { + FX_FLOAT fAvailHeight = m_pLayoutPageMgr->GetAvailHeight(); + eStatus = m_pRootItemLayoutProcessor->DoLayout(TRUE, fAvailHeight, fAvailHeight); + if(eStatus != XFA_ItemLayoutProcessorResult_Done) { + m_nProgressCounter++; + } + CXFA_ContentLayoutItemImpl* pLayoutItem = m_pRootItemLayoutProcessor->ExtractLayoutItem(); + if(pLayoutItem) { + pLayoutItem->m_sPos.Set(fPosX, fPosY); + } + m_pLayoutPageMgr->SubmitContentItem(pLayoutItem, eStatus); + } while (eStatus != XFA_ItemLayoutProcessorResult_Done && (!pPause || !pPause->NeedToPauseNow())); + if (eStatus == XFA_ItemLayoutProcessorResult_Done) { + m_pLayoutPageMgr->FinishPaginatedPageSets(); + m_pLayoutPageMgr->SyncLayoutData(); + m_bNeeLayout = FALSE; + m_rgChangedContainers.RemoveAll(); + } + return 100 * (eStatus == XFA_ItemLayoutProcessorResult_Done ? m_nProgressCounter : m_nProgressCounter - 1) / m_nProgressCounter; +} +FX_BOOL CXFA_LayoutProcessor::IncrementLayout() +{ + if (m_bNeeLayout) { + StartLayout(TRUE); + return DoLayout(NULL) == 100; + } + for (FX_INT32 i = 0, c = m_rgChangedContainers.GetSize(); i < c; i++) { + CXFA_Node *pNode = m_rgChangedContainers[i]; + CXFA_Node *pParentNode = pNode->GetNodeItem(XFA_NODEITEM_Parent, XFA_OBJECTTYPE_ContainerNode); + if(!pParentNode) { + return FALSE; + } + if(!CXFA_ItemLayoutProcessor::IncrementRelayoutNode(this, pNode, pParentNode)) { + return FALSE; + } + } + m_rgChangedContainers.RemoveAll(); + return TRUE; +} +FX_INT32 CXFA_LayoutProcessor::CountPages() const +{ + return m_pLayoutPageMgr ? m_pLayoutPageMgr->GetPageCount() : 0; +} +IXFA_LayoutPage* CXFA_LayoutProcessor::GetPage(FX_INT32 index) const +{ + return m_pLayoutPageMgr ? m_pLayoutPageMgr->GetPage(index) : NULL; +} +CXFA_LayoutItem* CXFA_LayoutProcessor::GetLayoutItem(CXFA_Node *pFormItem) +{ + return (CXFA_LayoutItem*)pFormItem->GetUserData(XFA_LAYOUTITEMKEY); +} +void CXFA_LayoutProcessor::AddChangedContainer(CXFA_Node* pContainer) +{ + if (m_rgChangedContainers.Find(pContainer) < 0) { + m_rgChangedContainers.Add(pContainer); + } +} +CXFA_ContainerLayoutItemImpl* CXFA_LayoutProcessor::GetRootLayoutItem() const +{ + return m_pLayoutPageMgr ? m_pLayoutPageMgr->GetRootLayoutItem() : NULL; +} +void CXFA_LayoutProcessor::ClearLayoutData() +{ + if(m_pLayoutPageMgr) { + delete m_pLayoutPageMgr; + m_pLayoutPageMgr = NULL; + } + if(m_pRootItemLayoutProcessor) { + delete m_pRootItemLayoutProcessor; + m_pRootItemLayoutProcessor = NULL; + } + m_nProgressCounter = 0; +} +FX_BOOL CXFA_LayoutProcessor::IsNeedLayout() +{ + return m_bNeeLayout || m_rgChangedContainers.GetSize() > 0; +} +CXFA_LayoutItemImpl::CXFA_LayoutItemImpl(CXFA_Node *pNode, FX_BOOL bIsContentLayoutItem) + : m_pFormNode(pNode) + , m_bIsContentLayoutItem(bIsContentLayoutItem) + , m_pParent(NULL) + , m_pNextSibling(NULL) + , m_pFirstChild(NULL) +{ +} +CXFA_LayoutItemImpl::~CXFA_LayoutItemImpl() +{ +} +CXFA_ContainerLayoutItemImpl::CXFA_ContainerLayoutItemImpl(CXFA_Node *pNode) + : CXFA_LayoutItemImpl(pNode, FALSE), m_pOldSubform(NULL) +{ +} +CXFA_ContentLayoutItemImpl::CXFA_ContentLayoutItemImpl(CXFA_Node *pNode) + : CXFA_LayoutItemImpl(pNode, TRUE) + , m_pPrev(NULL) + , m_pNext(NULL) + , m_dwStatus(0) +{ +} +CXFA_ContentLayoutItemImpl::~CXFA_ContentLayoutItemImpl() +{ + if (m_pFormNode->GetUserData(XFA_LAYOUTITEMKEY) == this) { + m_pFormNode->SetUserData(XFA_LAYOUTITEMKEY, NULL); + } +} diff --git a/xfa/src/fxfa/src/parser/xfa_document_layout_imp.h b/xfa/src/fxfa/src/parser/xfa_document_layout_imp.h new file mode 100644 index 0000000000..178268caf9 --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_document_layout_imp.h @@ -0,0 +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 + +#ifndef _XFA_DOCUMENT_LAYOUT_IMP_H_ +#define _XFA_DOCUMENT_LAYOUT_IMP_H_ +class CXFA_ItemLayoutProcessor; +class CXFA_LayoutPageMgr; +class CXFA_LayoutAppAdapter; +class CXFA_ContainerLayoutItemImpl; +class CXFA_LayoutProcessor : public IXFA_DocLayout, public CFX_Object +{ +public: + CXFA_LayoutProcessor(CXFA_Document* pDocument); + ~CXFA_LayoutProcessor(); + virtual CXFA_Document* GetDocument() const; + virtual FX_INT32 StartLayout(FX_BOOL bForceRestart = FALSE); + virtual FX_INT32 DoLayout(IFX_Pause *pPause = NULL); + virtual FX_BOOL IncrementLayout(); + virtual FX_INT32 CountPages() const; + virtual IXFA_LayoutPage* GetPage(FX_INT32 index) const; + virtual CXFA_LayoutItem* GetLayoutItem(CXFA_Node *pFormItem); + + void AddChangedContainer(CXFA_Node* pContainer); + void SetForceReLayout(FX_BOOL bForceRestart) + { + m_bNeeLayout = bForceRestart; + } + CXFA_ContainerLayoutItemImpl* GetRootLayoutItem() const; + CXFA_ItemLayoutProcessor* GetRootRootItemLayoutProcessor() + { + return m_pRootItemLayoutProcessor; + } + CXFA_LayoutPageMgr* GetLayoutPageMgr() + { + return m_pLayoutPageMgr; + } +protected: + void ClearLayoutData(); + + FX_BOOL IsNeedLayout(); + + CXFA_Document* m_pDocument; + CXFA_ItemLayoutProcessor* m_pRootItemLayoutProcessor; + CXFA_LayoutPageMgr* m_pLayoutPageMgr; + CXFA_NodeArray m_rgChangedContainers; + FX_UINT32 m_nProgressCounter; + FX_BOOL m_bNeeLayout; +}; +#endif diff --git a/xfa/src/fxfa/src/parser/xfa_document_serialize.cpp b/xfa/src/fxfa/src/parser/xfa_document_serialize.cpp new file mode 100644 index 0000000000..690a255ce1 --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_document_serialize.cpp @@ -0,0 +1,543 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_utils.h" +#include "../common/xfa_object.h" +#include "../common/xfa_document.h" +#include "../common/xfa_parser.h" +#include "../common/xfa_script.h" +#include "../common/xfa_docdata.h" +#include "../common/xfa_doclayout.h" +#include "../common/xfa_debug.h" +#include "../common/xfa_localemgr.h" +#include "../common/xfa_fm2jsapi.h" +#include "xfa_debug_parser.h" +#include "xfa_document_serialize.h" +IXFA_PacketImport* IXFA_PacketImport::Create(CXFA_Document *pDocument) +{ + return FX_NEW CXFA_DataImporter(pDocument); +} +CXFA_DataImporter::CXFA_DataImporter(CXFA_Document *pDocument) + : m_pDocument(pDocument) +{ + ASSERT(m_pDocument != NULL); +} +FX_BOOL CXFA_DataImporter::ImportData(IFX_FileRead* pDataDocument) +{ + IXFA_Parser *pDataDocumentParser = IXFA_Parser::Create(m_pDocument); + if(!pDataDocumentParser) { + return FALSE; + } + if(pDataDocumentParser->StartParse(pDataDocument, XFA_XDPPACKET_Datasets) != XFA_PARSESTATUS_Ready) { + pDataDocumentParser->Release(); + return FALSE; + } + if(pDataDocumentParser->DoParse(NULL) < XFA_PARSESTATUS_Done) { + pDataDocumentParser->Release(); + return FALSE; + } + CXFA_Node* pImportDataRoot = pDataDocumentParser->GetRootNode(); + if(!pImportDataRoot) { + pDataDocumentParser->Release(); + return FALSE; + } + CXFA_Node* pDataModel = (CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_Datasets); + if (!pDataModel) { + pDataDocumentParser->Release(); + return FALSE; + } + CXFA_Node* pDataNode = (CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_Data); + if (pDataNode) { + pDataModel->RemoveChild(pDataNode); + } + if (pImportDataRoot->GetClassID() == XFA_ELEMENT_DataModel) { + while(CXFA_Node* pChildNode = pImportDataRoot->GetNodeItem(XFA_NODEITEM_FirstChild)) { + pImportDataRoot->RemoveChild(pChildNode); + pDataModel->InsertChild(pChildNode); + } + } else { + IFDE_XMLNode* pXMLNode = pImportDataRoot->GetXMLMappingNode(); + IFDE_XMLNode* pParentXMLNode = pXMLNode->GetNodeItem(IFDE_XMLNode::Parent); + if (pParentXMLNode) { + pParentXMLNode->RemoveChildNode(pXMLNode); + } + pDataModel->InsertChild(pImportDataRoot); + } + m_pDocument->DoDataRemerge(FALSE); + pDataDocumentParser->Release(); + return TRUE; +} +CFX_WideString XFA_ExportEncodeAttribute(const CFX_WideString& str) +{ + CFX_WideTextBuf textBuf; + FX_INT32 iLen = str.GetLength(); + for (FX_INT32 i = 0; i < iLen; i++) { + switch (str[i]) { + case '&': + textBuf << FX_WSTRC(L"&"); + break; + case '<': + textBuf << FX_WSTRC(L"<"); + break; + case '>': + textBuf << FX_WSTRC(L">"); + break; + case '\'': + textBuf << FX_WSTRC(L"'"); + break; + case '\"': + textBuf << FX_WSTRC(L"""); + break; + default: + textBuf.AppendChar(str[i]); + } + } + return textBuf.GetWideString(); +} +CFX_WideString XFA_ExportEncodeContent(FX_WSTR str) +{ + CFX_WideTextBuf textBuf; + FX_INT32 iLen = str.GetLength(); + for (FX_INT32 i = 0; i < iLen; i++) { + FX_WCHAR ch = str.GetAt(i); + if (!FDE_IsXMLValidChar(ch)) { + continue; + } + if (ch == '&') { + textBuf << FX_WSTRC(L"&"); + } else if (ch == '<') { + textBuf << FX_WSTRC(L"<"); + } else if (ch == '>') { + textBuf << FX_WSTRC(L">"); + } else if (ch == '\'') { + textBuf << FX_WSTRC(L"'"); + } else if (ch == '\"') { + textBuf << FX_WSTRC(L"""); + } else if (ch == ' ') { + if (i && str.GetAt(i - 1) != ' ') { + textBuf.AppendChar(' '); + } else { + textBuf << FX_WSTRC(L" "); + } + } else { + textBuf.AppendChar(str.GetAt(i)); + } + } + return textBuf.GetWideString(); +} +static void XFA_SaveAttribute(CXFA_Node* pNode, XFA_ATTRIBUTE eName, FX_WSTR wsName, FX_BOOL bProto, CFX_WideString &wsOutput) +{ + CFX_WideString wsValue; + if ((!bProto && !pNode->HasAttribute((XFA_ATTRIBUTE)eName, bProto)) || !pNode->GetAttribute((XFA_ATTRIBUTE)eName, wsValue, FALSE)) { + return; + } + wsValue = XFA_ExportEncodeAttribute(wsValue); + wsOutput += FX_WSTRC(L" "); + wsOutput += wsName; + wsOutput += FX_WSTRC(L"=\""); + wsOutput += wsValue; + wsOutput += FX_WSTRC(L"\""); +} +static FX_BOOL XFA_DataExporter_AttributeSaveInDataModel(CXFA_Node* pNode, XFA_ATTRIBUTE eAttribute) +{ + FX_BOOL bSaveInDataModel = FALSE; + if (pNode->GetClassID() != XFA_ELEMENT_Image) { + return bSaveInDataModel; + } + CXFA_Node* pValueNode = pNode->GetNodeItem(XFA_NODEITEM_Parent); + if (!pValueNode || pValueNode->GetClassID() != XFA_ELEMENT_Value) { + return bSaveInDataModel; + } + CXFA_Node* pFieldNode = pValueNode->GetNodeItem(XFA_NODEITEM_Parent); + if (pFieldNode && pFieldNode->GetBindData() && eAttribute == XFA_ATTRIBUTE_Href) { + bSaveInDataModel = TRUE; + } + return bSaveInDataModel; +} +FX_BOOL XFA_DataExporter_ContentNodeNeedtoExport(CXFA_Node* pContentNode) +{ + CFX_WideString wsContent; + if (!pContentNode->TryContent(wsContent, FALSE, FALSE)) { + return FALSE; + } + FXSYS_assert(pContentNode->GetObjectType() == XFA_OBJECTTYPE_ContentNode); + CXFA_Node* pParentNode = pContentNode->GetNodeItem(XFA_NODEITEM_Parent); + if (!pParentNode || pParentNode->GetClassID() != XFA_ELEMENT_Value) { + return TRUE; + } + CXFA_Node* pGrandParentNode = pParentNode->GetNodeItem(XFA_NODEITEM_Parent); + if (!pGrandParentNode || pGrandParentNode->GetObjectType() != XFA_OBJECTTYPE_ContainerNode) { + return TRUE; + } + if (pGrandParentNode->GetBindData()) { + return FALSE; + } + CXFA_WidgetData* pWidgetData = pGrandParentNode->GetWidgetData(); + XFA_ELEMENT eUIType = pWidgetData->GetUIType(); + if (eUIType == XFA_ELEMENT_PasswordEdit) { + return FALSE; + } + return TRUE; +} +static void XFA_DataExporter_RecognizeXFAVersionNumber(CXFA_Node *pTemplateRoot, CFX_WideString& wsVersionNumber) +{ + wsVersionNumber.Empty(); + if(!pTemplateRoot) { + return; + } + CFX_WideString wsTemplateNS; + if(!pTemplateRoot->TryNamespace(wsTemplateNS)) { + return; + } + XFA_VERSION eVersion = pTemplateRoot->GetDocument()->RecognizeXFAVersionNumber(wsTemplateNS); + if(eVersion == XFA_VERSION_UNKNOWN) { + eVersion = XFA_VERSION_DEFAULT; + } + wsVersionNumber.Format((FX_LPCWSTR)L"%i.%i", eVersion / 100, eVersion % 100); +} +static void XFA_DataExporter_RegenerateFormFile_Changed(CXFA_Node* pNode, CFX_WideTextBuf& buf, FX_BOOL bSaveXML = FALSE) +{ + CFX_WideString wsAttrs; + FX_INT32 iAttrs = 0; + FX_LPCBYTE pAttrs = XFA_GetElementAttributes(pNode->GetClassID(), iAttrs); + while (iAttrs--) { + XFA_LPCATTRIBUTEINFO pAttr = XFA_GetAttributeByID((XFA_ATTRIBUTE)pAttrs[iAttrs]); + if (pAttr->eName == XFA_ATTRIBUTE_Name || (XFA_DataExporter_AttributeSaveInDataModel(pNode, pAttr->eName) && !bSaveXML)) { + continue; + } + CFX_WideString wsAttr; + XFA_SaveAttribute(pNode, pAttr->eName, pAttr->pName, bSaveXML, wsAttr); + wsAttrs += wsAttr; + } + CFX_WideString wsChildren; + switch(pNode->GetObjectType()) { + case XFA_OBJECTTYPE_ContentNode: { + if (!bSaveXML && !XFA_DataExporter_ContentNodeNeedtoExport(pNode)) { + break; + } + CXFA_Node *pRawValueNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild); + while(pRawValueNode && pRawValueNode->GetClassID() != XFA_ELEMENT_SharpxHTML && pRawValueNode->GetClassID() != XFA_ELEMENT_Sharptext && pRawValueNode->GetClassID() != XFA_ELEMENT_Sharpxml) { + pRawValueNode = pRawValueNode->GetNodeItem(XFA_NODEITEM_NextSibling); + } + if(!pRawValueNode) { + break; + } + CFX_WideString wsContentType; + pNode->GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType, FALSE); + if (pRawValueNode->GetClassID() == XFA_ELEMENT_SharpxHTML && wsContentType.Equal(FX_WSTRC(L"text/html"))) { + IFDE_XMLNode* pExDataXML = pNode->GetXMLMappingNode(); + if (!pExDataXML) { + break; + } + IFDE_XMLNode* pRichTextXML = pExDataXML->GetNodeItem(IFDE_XMLNode::FirstChild); + if (!pRichTextXML) { + break; + } + IFX_MemoryStream* pMemStream = FX_CreateMemoryStream(TRUE); + IFX_Stream *pTempStream = IFX_Stream::CreateStream((IFX_FileWrite*)pMemStream, FX_STREAMACCESS_Text | FX_STREAMACCESS_Write | FX_STREAMACCESS_Append); + pTempStream->SetCodePage(FX_CODEPAGE_UTF8); + pRichTextXML->SaveXMLNode(pTempStream); + wsChildren += CFX_WideString::FromUTF8((FX_LPCSTR)pMemStream->GetBuffer(), pMemStream->GetSize()); + pTempStream->Release(); + pMemStream->Release(); + } else if (pRawValueNode->GetClassID() == XFA_ELEMENT_Sharpxml && wsContentType.Equal(FX_WSTRC(L"text/xml"))) { + CFX_WideString wsRawValue; + pRawValueNode->GetAttribute(XFA_ATTRIBUTE_Value, wsRawValue, FALSE); + if (wsRawValue.IsEmpty()) { + break; + } + CFX_WideStringArray wsSelTextArray; + FX_INT32 iStart = 0; + FX_INT32 iEnd = wsRawValue.Find(L'\n', iStart); + iEnd = (iEnd == -1) ? wsRawValue.GetLength() : iEnd; + while (iEnd >= iStart) { + wsSelTextArray.Add(wsRawValue.Mid(iStart, iEnd - iStart)); + iStart = iEnd + 1; + if (iStart >= wsRawValue.GetLength()) { + break; + } + iEnd = wsRawValue.Find(L'\n', iStart); + } + CXFA_Node *pParentNode = pNode->GetNodeItem(XFA_NODEITEM_Parent); + FXSYS_assert(pParentNode); + CXFA_Node *pGrandparentNode = pParentNode->GetNodeItem(XFA_NODEITEM_Parent); + FXSYS_assert(pGrandparentNode); + CFX_WideString bodyTagName; + bodyTagName = pGrandparentNode->GetCData(XFA_ATTRIBUTE_Name); + if (bodyTagName.IsEmpty()) { + bodyTagName = FX_WSTRC(L"ListBox1"); + } + buf << FX_WSTRC(L"<"); + buf << bodyTagName; + buf << FX_WSTRC(L" xmlns=\"\"\n>"); + for (FX_INT32 i = 0; i < wsSelTextArray.GetSize(); i++) { + buf << FX_WSTRC(L""); + buf << XFA_ExportEncodeContent(wsSelTextArray[i]); + buf << FX_WSTRC(L""); + } + buf << FX_WSTRC(L""); + wsChildren += buf.GetWideString(); + buf.Clear(); + } else { + CFX_WideStringC wsValue = pRawValueNode->GetCData(XFA_ATTRIBUTE_Value); + wsChildren += XFA_ExportEncodeContent(wsValue); + } + } + break; + case XFA_OBJECTTYPE_TextNode: + case XFA_OBJECTTYPE_NodeC: + case XFA_OBJECTTYPE_NodeV: { + CFX_WideStringC wsValue = pNode->GetCData(XFA_ATTRIBUTE_Value); + wsChildren += XFA_ExportEncodeContent(wsValue); + } + break; + default: + if (pNode->GetClassID() == XFA_ELEMENT_Items) { + CXFA_Node* pTemplateNode = pNode->GetTemplateNode(); + if (!pTemplateNode || pTemplateNode->CountChildren(XFA_ELEMENT_UNKNOWN) != pNode->CountChildren(XFA_ELEMENT_UNKNOWN)) { + bSaveXML = TRUE; + } + } + CFX_WideTextBuf newBuf; + CXFA_Node* pChildNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild); + while (pChildNode) { + XFA_DataExporter_RegenerateFormFile_Changed(pChildNode, newBuf, bSaveXML); + wsChildren += newBuf.GetWideString(); + newBuf.Clear(); + pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling); + } + if (!bSaveXML && !wsChildren.IsEmpty() && pNode->GetClassID() == XFA_ELEMENT_Items) { + wsChildren.Empty(); + bSaveXML = TRUE; + CXFA_Node* pChildNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild); + while (pChildNode) { + XFA_DataExporter_RegenerateFormFile_Changed(pChildNode, newBuf, bSaveXML); + wsChildren += newBuf.GetWideString(); + newBuf.Clear(); + pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling); + } + } + break; + } + if (!wsChildren.IsEmpty() || !wsAttrs.IsEmpty() || pNode->HasAttribute(XFA_ATTRIBUTE_Name)) { + CFX_WideStringC wsElement; + pNode->GetClassName(wsElement); + CFX_WideString wsName; + XFA_SaveAttribute(pNode, XFA_ATTRIBUTE_Name, FX_WSTRC(L"name"), TRUE, wsName); + buf << FX_WSTRC(L"<"); + buf << wsElement; + buf << wsName; + buf << wsAttrs; + if (wsChildren.IsEmpty()) { + buf << FX_WSTRC(L"\n/>"); + } else { + buf << FX_WSTRC(L"\n>"); + buf << wsChildren; + buf << FX_WSTRC(L""); + } + } +} +static void XFA_DataExporter_RegenerateFormFile_Container(CXFA_Node* pNode, IFX_Stream* pStream, FX_BOOL bSaveXML = FALSE) +{ + XFA_ELEMENT eElement = pNode->GetClassID(); + if (eElement == XFA_ELEMENT_Field || eElement == XFA_ELEMENT_Draw || !pNode->IsContainerNode()) { + CFX_WideTextBuf buf; + XFA_DataExporter_RegenerateFormFile_Changed(pNode, buf, bSaveXML); + FX_STRSIZE nLen = buf.GetLength(); + if (nLen > 0) { + pStream->WriteString((FX_LPCWSTR)buf.GetBuffer(), nLen); + } + return; + } + CFX_WideStringC wsElement; + pNode->GetClassName(wsElement); + pStream->WriteString((FX_LPCWSTR)L"<", 1); + pStream->WriteString(wsElement.GetPtr(), wsElement.GetLength()); + CFX_WideString wsOutput; + XFA_SaveAttribute(pNode, XFA_ATTRIBUTE_Name, FX_WSTRC(L"name"), TRUE, wsOutput); + CFX_WideString wsAttrs; + FX_INT32 iAttrs = 0; + FX_LPCBYTE pAttrs = XFA_GetElementAttributes(pNode->GetClassID(), iAttrs); + while (iAttrs--) { + XFA_LPCATTRIBUTEINFO pAttr = XFA_GetAttributeByID((XFA_ATTRIBUTE)pAttrs[iAttrs]); + if (pAttr->eName == XFA_ATTRIBUTE_Name) { + continue; + } + CFX_WideString wsAttr; + XFA_SaveAttribute(pNode, pAttr->eName, pAttr->pName, FALSE, wsAttr); + wsOutput += wsAttr; + } + if (!wsOutput.IsEmpty()) { + pStream->WriteString((FX_LPCWSTR)wsOutput, wsOutput.GetLength()); + } + CXFA_Node* pChildNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild); + if (pChildNode) { + pStream->WriteString((FX_LPCWSTR)L"\n>", 2); + while (pChildNode) { + XFA_DataExporter_RegenerateFormFile_Container(pChildNode, pStream, bSaveXML); + pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling); + } + pStream->WriteString((FX_LPCWSTR)L"WriteString(wsElement.GetPtr(), wsElement.GetLength()); + pStream->WriteString((FX_LPCWSTR)L"\n>", 2); + } else { + pStream->WriteString((FX_LPCWSTR)L"\n/>", 3); + } +} +void XFA_DataExporter_RegenerateFormFile(CXFA_Node* pNode, IFX_Stream* pStream, FX_LPCSTR pChecksum , FX_BOOL bSaveXML) +{ + if(pNode->GetObjectType() == XFA_OBJECTTYPE_ModelNode) { + static FX_LPCWSTR s_pwsTagName = (FX_LPCWSTR)L""; + pStream->WriteString(s_pwsTagName, FXSYS_wcslen(s_pwsTagName)); + if (pChecksum != NULL) { + static FX_LPCWSTR s_pwChecksum = (FX_LPCWSTR)L" checksum=\""; + CFX_WideString wsChecksum = CFX_WideString::FromUTF8(pChecksum, FXSYS_strlen(pChecksum)); + pStream->WriteString(s_pwChecksum, FXSYS_wcslen(s_pwChecksum)); + pStream->WriteString((FX_LPCWSTR)wsChecksum, wsChecksum.GetLength()); + pStream->WriteString((FX_LPCWSTR)L"\"", 1); + } + pStream->WriteString((FX_LPCWSTR)L" xmlns=\"", FXSYS_wcslen((FX_LPCWSTR)L" xmlns=\"")); + FX_LPCWSTR pURI = XFA_GetPacketByIndex(XFA_PACKET_Form)->pURI; + pStream->WriteString(pURI, FXSYS_wcslen(pURI)); + CFX_WideString wsVersionNumber; + XFA_DataExporter_RecognizeXFAVersionNumber((CXFA_Node*)pNode->GetDocument()->GetXFANode(XFA_XDPPACKET_Template), wsVersionNumber); + if (wsVersionNumber.IsEmpty()) { + wsVersionNumber = FX_WSTRC(L"2.8"); + } + wsVersionNumber += FX_WSTRC(L"/\"\n>"); + pStream->WriteString((FX_LPCWSTR)wsVersionNumber, wsVersionNumber.GetLength()); + CXFA_Node* pChildNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild); + while (pChildNode) { + XFA_DataExporter_RegenerateFormFile_Container(pChildNode, pStream); + pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling); + } + pStream->WriteString(s_pwsClose, FXSYS_wcslen(s_pwsClose)); + } else { + XFA_DataExporter_RegenerateFormFile_Container(pNode, pStream, bSaveXML); + } +} +IXFA_PacketExport* IXFA_PacketExport::Create(CXFA_Document *pDocument, XFA_DATAFORMAT eFormat ) +{ + return FX_NEW CXFA_DataExporter(pDocument); +} +CXFA_DataExporter::CXFA_DataExporter(CXFA_Document *pDocument) + : m_pDocument(pDocument) +{ + ASSERT(m_pDocument != NULL); +} +FX_BOOL CXFA_DataExporter::Export(IFX_FileWrite *pWrite) +{ + return Export(pWrite, m_pDocument->GetRoot()); +} +FX_BOOL CXFA_DataExporter::Export(IFX_FileWrite *pWrite, CXFA_Node *pNode, FX_DWORD dwFlag , FX_LPCSTR pChecksum ) +{ + ASSERT(pWrite != NULL); + if (pWrite == NULL) { + return FALSE; + } + IFX_Stream *pStream = IFX_Stream::CreateStream(pWrite, FX_STREAMACCESS_Text | FX_STREAMACCESS_Write | FX_STREAMACCESS_Append); + if (pStream == NULL) { + return FALSE; + } + pStream->SetCodePage(FX_CODEPAGE_UTF8); + FX_BOOL bRet = Export(pStream, pNode, dwFlag, pChecksum); + pStream->Release(); + return bRet; +} +FX_BOOL CXFA_DataExporter::Export(IFX_Stream *pStream, CXFA_Node *pNode, FX_DWORD dwFlag, FX_LPCSTR pChecksum) +{ + IFDE_XMLDoc* pXMLDoc = m_pDocument->GetParser()->GetXMLDoc(); + if(pNode->GetObjectType() == XFA_OBJECTTYPE_ModelNode) { + switch (pNode->GetPacketID()) { + case XFA_XDPPACKET_XDP: { + static FX_LPCWSTR s_pwsPreamble = (FX_LPCWSTR)L""; + pStream->WriteString(s_pwsPreamble, FXSYS_wcslen(s_pwsPreamble)); + for(CXFA_Node *pChild = pNode->GetNodeItem(XFA_NODEITEM_FirstChild); pChild; pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { + Export(pStream, pChild, dwFlag, pChecksum); + } + static FX_LPCWSTR s_pwsPostamble = (FX_LPCWSTR)L""; + pStream->WriteString(s_pwsPostamble, FXSYS_wcslen(s_pwsPostamble)); + } + break; + case XFA_XDPPACKET_Datasets: { + IFDE_XMLElement* pElement = (IFDE_XMLElement*)pNode->GetXMLMappingNode(); + if(!pElement || pElement->GetType() != FDE_XMLNODE_Element) { + return FALSE; + } + CXFA_Node *pDataNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild); + FXSYS_assert(pDataNode != NULL); + XFA_DataExporter_DealWithDataGroupNode(pDataNode); + pXMLDoc->SaveXMLNode(pStream, pElement); + } + break; + case XFA_XDPPACKET_Form: { + XFA_DataExporter_RegenerateFormFile(pNode, pStream, pChecksum); + } + break; + case XFA_XDPPACKET_Template: + default: { + IFDE_XMLElement* pElement = (IFDE_XMLElement*)pNode->GetXMLMappingNode(); + if(!pElement || pElement->GetType() != FDE_XMLNODE_Element) { + return FALSE; + } + pXMLDoc->SaveXMLNode(pStream, pElement); + } + break; + } + } else { + CXFA_Node* pDataNode = pNode->GetNodeItem(XFA_NODEITEM_Parent); + CXFA_Node* pExportNode = pNode; + for (CXFA_Node* pChildNode = pDataNode->GetNodeItem(XFA_NODEITEM_FirstChild); pChildNode; pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if (pChildNode != pNode) { + pExportNode = pDataNode; + break; + } + } + IFDE_XMLElement* pElement = (IFDE_XMLElement*)pExportNode->GetXMLMappingNode(); + if(!pElement || pElement->GetType() != FDE_XMLNODE_Element) { + return FALSE; + } + XFA_DataExporter_DealWithDataGroupNode(pExportNode); + pElement->SetString(FX_WSTRC(L"xmlns:xfa"), FX_WSTRC(L"http://www.xfa.org/schema/xfa-data/1.0/")); + pXMLDoc->SaveXMLNode(pStream, pElement); + pElement->RemoveAttribute(FX_LPCWSTR(L"xmlns:xfa")); + } + return TRUE; +} +static void XFA_DataExporter_GenerateChecksum(CXFA_Document* pDocument, CFX_WideString& wsChecksum) +{ +} +void XFA_DataExporter_DealWithDataGroupNode(CXFA_Node *pDataNode) +{ + if (!pDataNode || pDataNode->GetClassID() == XFA_ELEMENT_DataValue) { + return; + } + FX_INT32 iChildNum = 0; + for (CXFA_Node *pChildNode = pDataNode->GetNodeItem(XFA_NODEITEM_FirstChild); pChildNode; pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + iChildNum++; + XFA_DataExporter_DealWithDataGroupNode(pChildNode); + } + if (pDataNode->GetClassID() == XFA_ELEMENT_DataGroup) { + if (iChildNum > 0) { + IFDE_XMLNode *pXMLNode = pDataNode->GetXMLMappingNode(); + FXSYS_assert(pXMLNode->GetType() == FDE_XMLNODE_Element); + IFDE_XMLElement *pXMLElement = (IFDE_XMLElement *)pXMLNode; + if (pXMLElement->HasAttribute((FX_LPCWSTR)L"xfa:dataNode")) { + pXMLElement->RemoveAttribute((FX_LPCWSTR)L"xfa:dataNode"); + } + } else { + IFDE_XMLNode *pXMLNode = pDataNode->GetXMLMappingNode(); + FXSYS_assert(pXMLNode->GetType() == FDE_XMLNODE_Element); + ((IFDE_XMLElement *)pXMLNode)->SetString(FX_WSTRC(L"xfa:dataNode"), FX_WSTRC(L"dataGroup")); + } + } +} diff --git a/xfa/src/fxfa/src/parser/xfa_document_serialize.h b/xfa/src/fxfa/src/parser/xfa_document_serialize.h new file mode 100644 index 0000000000..1caf96a76c --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_document_serialize.h @@ -0,0 +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 _XFA_DOCUMENT_SERIALIZE_H_ +#define _XFA_DOCUMENT_SERIALIZE_H_ +class CXFA_DataImporter : public IXFA_PacketImport, public CFX_Object +{ +public: + CXFA_DataImporter(CXFA_Document *pDocument); + virtual void Release() + { + delete this; + } + virtual FX_BOOL ImportData(IFX_FileRead* pDataDocument); +protected: + CXFA_Document *m_pDocument; +}; +class CXFA_DataExporter : public IXFA_PacketExport, public CFX_Object +{ +public: + CXFA_DataExporter(CXFA_Document *pDocument); + virtual void Release() + { + delete this; + } + virtual FX_BOOL Export(IFX_FileWrite *pWrite); + virtual FX_BOOL Export(IFX_FileWrite *pWrite, CXFA_Node *pNode, FX_DWORD dwFlag = 0, FX_LPCSTR pChecksum = NULL); +protected: + FX_BOOL Export(IFX_Stream *pStream, CXFA_Node *pNode, FX_DWORD dwFlag, FX_LPCSTR pChecksum); + CXFA_Document *m_pDocument; +}; +#endif diff --git a/xfa/src/fxfa/src/parser/xfa_layout_appadapter.cpp b/xfa/src/fxfa/src/parser/xfa_layout_appadapter.cpp new file mode 100644 index 0000000000..fb592b4c97 --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_layout_appadapter.cpp @@ -0,0 +1,180 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_utils.h" +#include "../common/xfa_object.h" +#include "../common/xfa_document.h" +#include "../common/xfa_parser.h" +#include "../common/xfa_script.h" +#include "../common/xfa_docdata.h" +#include "../common/xfa_doclayout.h" +#include "../common/xfa_debug.h" +#include "../common/xfa_localemgr.h" +#include "../common/xfa_fm2jsapi.h" +#include "xfa_debug_parser.h" +#include "xfa_document_layout_imp.h" +#include "xfa_layout_itemlayout.h" +#include "xfa_layout_pagemgr_new.h" +#include "xfa_layout_appadapter.h" +IXFA_DocLayout* IXFA_LayoutPage::GetLayout() const +{ + CXFA_ContainerLayoutItemImpl* pThis = (CXFA_ContainerLayoutItemImpl*)this; + return pThis->m_pFormNode->GetDocument()->GetLayoutProcessor(); +} +FX_INT32 IXFA_LayoutPage::GetPageIndex() const +{ + CXFA_ContainerLayoutItemImpl* pThis = (CXFA_ContainerLayoutItemImpl*)this; + return pThis->m_pFormNode->GetDocument()->GetLayoutProcessor()->GetLayoutPageMgr()->GetPageIndex((IXFA_LayoutPage*)this); +} +void IXFA_LayoutPage::GetPageSize(CFX_SizeF &size) +{ + CXFA_ContainerLayoutItemImpl* pThis = (CXFA_ContainerLayoutItemImpl*)this; + size.Set(0, 0); + CXFA_Node *pMedium = pThis->m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Medium); + if (pMedium) { + size.x = pMedium->GetMeasure(XFA_ATTRIBUTE_Short).ToUnit(XFA_UNIT_Pt); + size.y = pMedium->GetMeasure(XFA_ATTRIBUTE_Long).ToUnit(XFA_UNIT_Pt); + if (pMedium->GetEnum(XFA_ATTRIBUTE_Orientation) == XFA_ATTRIBUTEENUM_Landscape) { + size.Set(size.y, size.x); + } + } +} +CXFA_Node* IXFA_LayoutPage::GetMasterPage() const +{ + CXFA_ContainerLayoutItemImpl* pThis = (CXFA_ContainerLayoutItemImpl*)this; + return pThis->m_pFormNode; +} +IXFA_LayoutPage* CXFA_LayoutItem::GetPage() const +{ + CXFA_ContainerLayoutItemImpl* pThis = (CXFA_ContainerLayoutItemImpl*)this; + for(CXFA_LayoutItemImpl* pCurNode = pThis; pCurNode; pCurNode = pCurNode->m_pParent) { + if(pCurNode->m_pFormNode->GetClassID() == XFA_ELEMENT_PageArea) { + return (IXFA_LayoutPage*)pCurNode; + } + } + return NULL; +} +CXFA_Node* CXFA_LayoutItem::GetFormNode() const +{ + CXFA_ContentLayoutItemImpl* pThis = (CXFA_ContentLayoutItemImpl*)this; + return pThis->m_pFormNode; +} +void CXFA_LayoutItem::GetRect(CFX_RectF &rtLayout, FX_BOOL bRelative) const +{ + CXFA_ContentLayoutItemImpl* pThis = (CXFA_ContentLayoutItemImpl*)this; + CFX_PointF sPos = pThis->m_sPos; + CFX_SizeF sSize = pThis->m_sSize; + if (!bRelative) { + for(CXFA_LayoutItemImpl* pLayoutItem = pThis->m_pParent; pLayoutItem; pLayoutItem = pLayoutItem->m_pParent) { + if(pLayoutItem->IsContentLayoutItem()) { + sPos += ((CXFA_ContentLayoutItemImpl*)pLayoutItem)->m_sPos; + if(CXFA_Node* pMarginNode = pLayoutItem->m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin)) { + sPos.Add(pMarginNode->GetMeasure(XFA_ATTRIBUTE_LeftInset).ToUnit(XFA_UNIT_Pt), pMarginNode->GetMeasure(XFA_ATTRIBUTE_TopInset).ToUnit(XFA_UNIT_Pt)); + } + } else { + if(pLayoutItem->m_pFormNode->GetClassID() == XFA_ELEMENT_ContentArea) { + sPos.Add(pLayoutItem->m_pFormNode->GetMeasure(XFA_ATTRIBUTE_X).ToUnit(XFA_UNIT_Pt), pLayoutItem->m_pFormNode->GetMeasure(XFA_ATTRIBUTE_Y).ToUnit(XFA_UNIT_Pt)); + break; + } else if(pLayoutItem->m_pFormNode->GetClassID() == XFA_ELEMENT_PageArea) { + break; + } + } + } + } + rtLayout.Set(sPos.x, sPos.y, sSize.x, sSize.y); +} +CXFA_LayoutItem* CXFA_LayoutItem::GetParent() const +{ + CXFA_LayoutItemImpl* pThis = (CXFA_LayoutItemImpl*)this; + return (CXFA_LayoutItem*)pThis->m_pParent; +} +CXFA_LayoutItem* CXFA_LayoutItem::GetFirst() const +{ + CXFA_ContentLayoutItemImpl* pThis = (CXFA_ContentLayoutItemImpl*)this; + CXFA_ContentLayoutItemImpl* pCurNode = pThis; + while(pCurNode->m_pPrev) { + pCurNode = pCurNode->m_pPrev; + } + return (CXFA_LayoutItem*)pCurNode; +} +CXFA_LayoutItem* CXFA_LayoutItem::GetPrev() const +{ + CXFA_ContentLayoutItemImpl* pThis = (CXFA_ContentLayoutItemImpl*)this; + return (CXFA_LayoutItem*)pThis->m_pPrev; +} +CXFA_LayoutItem* CXFA_LayoutItem::GetNext() const +{ + CXFA_ContentLayoutItemImpl* pThis = (CXFA_ContentLayoutItemImpl*)this; + return (CXFA_LayoutItem*)pThis->m_pNext; +} +CXFA_LayoutItem* CXFA_LayoutItem::GetLast() const +{ + CXFA_ContentLayoutItemImpl* pThis = (CXFA_ContentLayoutItemImpl*)this; + CXFA_ContentLayoutItemImpl* pCurNode = pThis; + while(pCurNode->m_pNext) { + pCurNode = pCurNode->m_pNext; + } + return (CXFA_LayoutItem*)pCurNode; +} +FX_INT32 CXFA_LayoutItem::GetIndex() const +{ + CXFA_ContentLayoutItemImpl* pThis = (CXFA_ContentLayoutItemImpl*)this; + FX_INT32 iIndex = 0; + CXFA_ContentLayoutItemImpl* pCurNode = pThis; + while(pCurNode->m_pPrev) { + pCurNode = pCurNode->m_pPrev; + iIndex++; + } + return iIndex; +} +FX_INT32 CXFA_LayoutItem::GetCount() const +{ + CXFA_ContentLayoutItemImpl* pThis = (CXFA_ContentLayoutItemImpl*)this; + FX_INT32 iCount = 1; + CXFA_ContentLayoutItemImpl* pCurNode = NULL; + pCurNode = pThis; + while(pCurNode->m_pPrev) { + pCurNode = pCurNode->m_pPrev; + iCount++; + } + pCurNode = pThis; + while(pCurNode->m_pNext) { + pCurNode = pCurNode->m_pNext; + iCount++; + } + return iCount; +} +FX_DWORD XFA_GetRelevant(CXFA_Node* pFormItem, FX_DWORD dwParentRelvant) +{ + FX_DWORD dwRelevant = XFA_LAYOUTSTATUS_Viewable | XFA_LAYOUTSTATUS_Printable; + CFX_WideStringC wsRelevant; + if (pFormItem->TryCData(XFA_ATTRIBUTE_Relevant, wsRelevant)) { + if (wsRelevant == FX_WSTRC(L"+print") || wsRelevant == FX_WSTRC(L"print")) { + dwRelevant &= ~XFA_LAYOUTSTATUS_Viewable; + } else if (wsRelevant == FX_WSTRC(L"-print")) { + dwRelevant &= ~XFA_LAYOUTSTATUS_Printable; + } + } + if (!(dwParentRelvant & XFA_LAYOUTSTATUS_Viewable) && (dwRelevant != XFA_LAYOUTSTATUS_Viewable)) { + dwRelevant &= ~XFA_LAYOUTSTATUS_Viewable; + } + if (!(dwParentRelvant & XFA_LAYOUTSTATUS_Printable) && (dwRelevant != XFA_LAYOUTSTATUS_Printable)) { + dwRelevant &= ~XFA_LAYOUTSTATUS_Printable; + } + return dwRelevant; +} +void XFA_ReleaseLayoutItem(CXFA_LayoutItemImpl *pLayoutItem) +{ + CXFA_LayoutItemImpl *pNext, *pNode = pLayoutItem->m_pFirstChild; + while (pNode) { + pNext = pNode->m_pNextSibling; + pNode->m_pParent = NULL; + XFA_ReleaseLayoutItem(pNode); + pNode = pNext; + } + delete pLayoutItem; +} diff --git a/xfa/src/fxfa/src/parser/xfa_layout_appadapter.h b/xfa/src/fxfa/src/parser/xfa_layout_appadapter.h new file mode 100644 index 0000000000..ab50517b9f --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_layout_appadapter.h @@ -0,0 +1,74 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _XFA_LAYOUT_APPADAPTER_H_ +#define _XFA_LAYOUT_APPADAPTER_H_ +class CXFA_TraverseStrategy_PageAreaContainerLayoutItem +{ +public: + static inline CXFA_ContainerLayoutItemImpl* GetFirstChild(CXFA_ContainerLayoutItemImpl* pLayoutItem) + { + if(pLayoutItem->m_pFormNode->GetClassID() == XFA_ELEMENT_PageSet) { + return (CXFA_ContainerLayoutItemImpl*)pLayoutItem->m_pFirstChild; + } + return NULL; + } + static inline CXFA_ContainerLayoutItemImpl* GetNextSibling(CXFA_ContainerLayoutItemImpl* pLayoutItem) + { + return (CXFA_ContainerLayoutItemImpl*)pLayoutItem->m_pNextSibling; + } + static inline CXFA_ContainerLayoutItemImpl* GetParent(CXFA_ContainerLayoutItemImpl* pLayoutItem) + { + return (CXFA_ContainerLayoutItemImpl*)pLayoutItem->m_pParent; + } +}; +class CXFA_TraverseStrategy_ContentAreaContainerLayoutItem +{ +public: + static inline CXFA_ContainerLayoutItemImpl* GetFirstChild(CXFA_ContainerLayoutItemImpl* pLayoutItem) + { + for(CXFA_LayoutItemImpl* pChildItem = pLayoutItem->m_pFirstChild; pChildItem; pChildItem = pChildItem->m_pNextSibling) { + if(pChildItem->IsContentLayoutItem()) { + continue; + } + return (CXFA_ContainerLayoutItemImpl*)pChildItem; + } + return NULL; + } + static inline CXFA_ContainerLayoutItemImpl* GetNextSibling(CXFA_ContainerLayoutItemImpl* pLayoutItem) + { + for(CXFA_LayoutItemImpl* pChildItem = pLayoutItem->m_pNextSibling; pChildItem; pChildItem = pChildItem->m_pNextSibling) { + if(pChildItem->IsContentLayoutItem()) { + continue; + } + return (CXFA_ContainerLayoutItemImpl*)pChildItem; + } + return NULL; + } + static inline CXFA_ContainerLayoutItemImpl* GetParent(CXFA_ContainerLayoutItemImpl* pLayoutItem) + { + return (CXFA_ContainerLayoutItemImpl*)pLayoutItem->m_pParent; + } +}; +class CXFA_TraverseStrategy_ContentLayoutItem +{ +public: + static inline CXFA_ContentLayoutItemImpl* GetFirstChild(CXFA_ContentLayoutItemImpl* pLayoutItem) + { + return (CXFA_ContentLayoutItemImpl*)pLayoutItem->m_pFirstChild; + } + static inline CXFA_ContentLayoutItemImpl* GetNextSibling(CXFA_ContentLayoutItemImpl* pLayoutItem) + { + return (CXFA_ContentLayoutItemImpl*)pLayoutItem->m_pNextSibling; + } + static inline CXFA_ContentLayoutItemImpl* GetParent(CXFA_ContentLayoutItemImpl* pLayoutItem) + { + return (CXFA_ContentLayoutItemImpl*)pLayoutItem->m_pParent; + } +}; +FX_DWORD XFA_GetRelevant(CXFA_Node* pFormItem, FX_DWORD dwParentRelvant); +void XFA_ReleaseLayoutItem(CXFA_LayoutItemImpl* pLayoutItem); +#endif diff --git a/xfa/src/fxfa/src/parser/xfa_layout_itemlayout.cpp b/xfa/src/fxfa/src/parser/xfa_layout_itemlayout.cpp new file mode 100644 index 0000000000..e6a2070088 --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_layout_itemlayout.cpp @@ -0,0 +1,2391 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_utils.h" +#include "../common/xfa_object.h" +#include "../common/xfa_document.h" +#include "../common/xfa_parser.h" +#include "../common/xfa_script.h" +#include "../common/xfa_docdata.h" +#include "../common/xfa_doclayout.h" +#include "../common/xfa_debug.h" +#include "../common/xfa_localemgr.h" +#include "../common/xfa_fm2jsapi.h" +#include "xfa_debug_parser.h" +#include "xfa_document_layout_imp.h" +#include "xfa_layout_itemlayout.h" +#include "xfa_layout_pagemgr_new.h" +#include "xfa_layout_appadapter.h" +CXFA_ItemLayoutProcessor::CXFA_ItemLayoutProcessor(CXFA_Node *pNode, CXFA_LayoutPageMgr* pPageMgr) + : m_pFormNode(pNode) + , m_pLayoutItem(NULL) + , m_pCurChildNode(XFA_LAYOUT_INVALIDNODE) + , m_nCurChildNodeStage(XFA_ItemLayoutProcessorStages_None) + , m_pCurChildPreprocessor(NULL) + , m_fUsedSize(0) + , m_pPageMgr(pPageMgr) + , m_bHasAvailHeight(TRUE) +#ifdef _XFA_LAYOUTITEM_ProcessCACHE_ + , m_pOldLayoutItem(NULL) +#else + , m_pPageMgrCreateItem(NULL) +#endif + , m_bKeepBreakFinish(FALSE) + , m_pKeepHeadNode(NULL) + , m_pKeepTailNode(NULL) + , m_bIsProcessKeep(FALSE) + , m_bBreakPending(TRUE) + , m_fLastRowWidth(0) + , m_fLastRowY(0) + , m_bUseInheriated(FALSE) + , m_fWidthLimite(0) + , m_ePreProcessRs(XFA_ItemLayoutProcessorResult_Done) +{ + FXSYS_assert(m_pFormNode && (m_pFormNode->IsContainerNode() || m_pFormNode->GetClassID() == XFA_ELEMENT_Form)); +#ifdef _XFA_LAYOUTITEM_ProcessCACHE_ + m_pOldLayoutItem = (CXFA_ContentLayoutItemImpl*)m_pFormNode->GetUserData(XFA_LAYOUTITEMKEY); +#endif +} +CXFA_ContentLayoutItemImpl* CXFA_ItemLayoutProcessor::CreateContentLayoutItem(CXFA_Node* pFormNode) +{ + if(!pFormNode) { + return NULL; + } + CXFA_ContentLayoutItemImpl* pLayoutItem = NULL; +#ifdef _XFA_LAYOUTITEM_ProcessCACHE_ + if (m_pOldLayoutItem) { + pLayoutItem = m_pOldLayoutItem; + m_pOldLayoutItem = m_pOldLayoutItem->m_pNext; + return pLayoutItem; + } + pLayoutItem = (CXFA_ContentLayoutItemImpl*)pFormNode->GetDocument()->GetParser()->GetNotify()->OnCreateLayoutItem(pFormNode); +#else + pLayoutItem = (CXFA_ContentLayoutItemImpl*)m_pPageMgrCreateItem->FindOrCreateLayoutItem(pFormNode); +#endif + CXFA_ContentLayoutItemImpl* pPrevLayoutItem = (CXFA_ContentLayoutItemImpl*)pFormNode->GetUserData(XFA_LAYOUTITEMKEY); + if(pPrevLayoutItem) { + while(pPrevLayoutItem->m_pNext) { + pPrevLayoutItem = pPrevLayoutItem->m_pNext; + } + pPrevLayoutItem->m_pNext = pLayoutItem; + pLayoutItem->m_pPrev = pPrevLayoutItem; + } else { + pFormNode->SetUserData(XFA_LAYOUTITEMKEY, pLayoutItem); + } + return pLayoutItem; +} +FX_BOOL CXFA_ItemLayoutProcessor::FindLayoutItemSplitPos(CXFA_ContentLayoutItemImpl* pLayoutItem, FX_FLOAT fCurVerticalOffset, FX_FLOAT& fProposedSplitPos, FX_BOOL& bAppChange, FX_BOOL bCalculateMargin ) +{ + CXFA_Node* pFormNode = pLayoutItem->m_pFormNode; + if (fProposedSplitPos > fCurVerticalOffset + XFA_LAYOUT_FLOAT_PERCISION && fProposedSplitPos <= fCurVerticalOffset + pLayoutItem->m_sSize.y - XFA_LAYOUT_FLOAT_PERCISION) { + switch(pFormNode->GetIntact()) { + case XFA_ATTRIBUTEENUM_None: { + FX_BOOL bAnyChanged = FALSE; + CXFA_Document* pDocument = pFormNode->GetDocument(); + IXFA_Notify* pNotify = pDocument->GetParser()->GetNotify(); + FX_FLOAT fCurTopMargin = 0, fCurBottomMargin = 0; + CXFA_Node* pMarginNode = pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin); + if(pMarginNode && bCalculateMargin) { + fCurTopMargin = pMarginNode->GetMeasure(XFA_ATTRIBUTE_TopInset).ToUnit(XFA_UNIT_Pt); + fCurBottomMargin = pMarginNode->GetMeasure(XFA_ATTRIBUTE_BottomInset).ToUnit(XFA_UNIT_Pt); + } + FX_BOOL bChanged = TRUE; + while(bChanged) { + bChanged = FALSE; + { + FX_FLOAT fRelSplitPos = fProposedSplitPos - fCurVerticalOffset; + if(pNotify->FindSplitPos(pFormNode, ((CXFA_LayoutItem*)pLayoutItem)->GetIndex(), fRelSplitPos)) { + bAnyChanged = TRUE; + bChanged = TRUE; + fProposedSplitPos = fCurVerticalOffset + fRelSplitPos; + bAppChange = TRUE; + if(fProposedSplitPos <= fCurVerticalOffset + XFA_LAYOUT_FLOAT_PERCISION) { + return TRUE; + } + } + } + FX_FLOAT fRelSplitPos = fProposedSplitPos - fCurBottomMargin; + for(CXFA_ContentLayoutItemImpl* pChildItem = (CXFA_ContentLayoutItemImpl*)pLayoutItem->m_pFirstChild; pChildItem; pChildItem = (CXFA_ContentLayoutItemImpl*)pChildItem->m_pNextSibling) { + FX_FLOAT fChildOffset = fCurVerticalOffset + fCurTopMargin + pChildItem->m_sPos.y; + FX_BOOL bAppChange = FALSE; + if (FindLayoutItemSplitPos(pChildItem, fChildOffset, fRelSplitPos, bAppChange, bCalculateMargin)) { + if(fRelSplitPos - fChildOffset < XFA_LAYOUT_FLOAT_PERCISION && bAppChange) { + fProposedSplitPos = fRelSplitPos - fCurTopMargin; + } else { + fProposedSplitPos = fRelSplitPos + fCurBottomMargin; + } + bAnyChanged = TRUE; + bChanged = TRUE; + if(fProposedSplitPos <= fCurVerticalOffset + XFA_LAYOUT_FLOAT_PERCISION) { + return TRUE; + } + if(bAnyChanged) { + break; + } + } + } + } + return bAnyChanged; + } + break; + case XFA_ATTRIBUTEENUM_ContentArea: + case XFA_ATTRIBUTEENUM_PageArea: { + fProposedSplitPos = fCurVerticalOffset; + return TRUE; + } + default: + return FALSE; + } + } + return FALSE; +} +static XFA_ATTRIBUTEENUM XFA_ItemLayoutProcessor_GetLayout(CXFA_Node* pFormNode, FX_BOOL& bRootForceTb) +{ + bRootForceTb = FALSE; + XFA_ATTRIBUTEENUM eLayoutMode; + if(pFormNode->TryEnum(XFA_ATTRIBUTE_Layout, eLayoutMode, FALSE)) { + return eLayoutMode; + } + CXFA_Node *pParentNode = pFormNode->GetNodeItem(XFA_NODEITEM_Parent); + if(pParentNode && pParentNode->GetClassID() == XFA_ELEMENT_Form) { + bRootForceTb = TRUE; + return XFA_ATTRIBUTEENUM_Tb; + } + return XFA_ATTRIBUTEENUM_Position; +} +static FX_BOOL XFA_ExistContainerKeep(CXFA_Node* pCurNode, FX_BOOL bPreFind) +{ + if(pCurNode == NULL || !XFA_ItemLayoutProcessor_IsTakingSpace(pCurNode)) { + return FALSE; + } + XFA_NODEITEM eItemType = XFA_NODEITEM_PrevSibling; + if(!bPreFind) { + eItemType = XFA_NODEITEM_NextSibling; + } + CXFA_Node* pPreContainer = pCurNode->GetNodeItem(eItemType, XFA_OBJECTTYPE_ContainerNode); + if(pPreContainer == NULL) { + return FALSE; + } + CXFA_Node* pKeep = pCurNode->GetFirstChildByClass(XFA_ELEMENT_Keep); + if (pKeep) { + XFA_ATTRIBUTEENUM ePrevious; + XFA_ATTRIBUTE eKeepType = XFA_ATTRIBUTE_Previous; + if(!bPreFind) { + eKeepType = XFA_ATTRIBUTE_Next; + } + if (pKeep->TryEnum(eKeepType, ePrevious, FALSE)) { + if(ePrevious == XFA_ATTRIBUTEENUM_ContentArea || ePrevious == XFA_ATTRIBUTEENUM_PageArea) { + return TRUE; + } + } + } + pKeep = pPreContainer->GetFirstChildByClass(XFA_ELEMENT_Keep); + if (!pKeep) { + return FALSE; + } + XFA_ATTRIBUTEENUM eNext; + XFA_ATTRIBUTE eKeepType = XFA_ATTRIBUTE_Next; + if(!bPreFind) { + eKeepType = XFA_ATTRIBUTE_Previous; + } + if (!pKeep->TryEnum(eKeepType, eNext, FALSE)) { + return FALSE; + } + if(eNext == XFA_ATTRIBUTEENUM_ContentArea || eNext == XFA_ATTRIBUTEENUM_PageArea) { + return TRUE; + } + return FALSE; +} +FX_FLOAT CXFA_ItemLayoutProcessor::FindSplitPos(FX_FLOAT fProposedSplitPos) +{ + ASSERT(m_pLayoutItem); + XFA_ATTRIBUTEENUM eLayout = m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout); + FX_BOOL bCalculateMargin = TRUE; + if(eLayout == XFA_ATTRIBUTEENUM_Position) { + bCalculateMargin = FALSE; + } + while(fProposedSplitPos > XFA_LAYOUT_FLOAT_PERCISION) { + FX_BOOL bAppChange = FALSE; + if(!FindLayoutItemSplitPos(m_pLayoutItem, 0, fProposedSplitPos, bAppChange, bCalculateMargin)) { + break; + } + } + return fProposedSplitPos; +} +void CXFA_ItemLayoutProcessor::SplitLayoutItem(CXFA_ContentLayoutItemImpl* pLayoutItem, CXFA_ContentLayoutItemImpl* pSecondParent, FX_FLOAT fSplitPos) +{ + FX_FLOAT fCurTopMargin = 0, fCurBottomMargin = 0; + XFA_ATTRIBUTEENUM eLayout = m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout); + FX_BOOL bCalculateMargin = TRUE; + if(eLayout == XFA_ATTRIBUTEENUM_Position) { + bCalculateMargin = FALSE; + } + CXFA_Node* pMarginNode = pLayoutItem->m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin); + if(pMarginNode && bCalculateMargin) { + fCurTopMargin = pMarginNode->GetMeasure(XFA_ATTRIBUTE_TopInset).ToUnit(XFA_UNIT_Pt); + fCurBottomMargin = pMarginNode->GetMeasure(XFA_ATTRIBUTE_BottomInset).ToUnit(XFA_UNIT_Pt); + } + CXFA_ContentLayoutItemImpl* pSecondLayoutItem = NULL; + if (m_pCurChildPreprocessor && m_pCurChildPreprocessor->m_pFormNode == pLayoutItem->m_pFormNode) { + pSecondLayoutItem = m_pCurChildPreprocessor->CreateContentLayoutItem(pLayoutItem->m_pFormNode); + } else { + pSecondLayoutItem = CreateContentLayoutItem(pLayoutItem->m_pFormNode); + } + pSecondLayoutItem->m_sPos.x = pLayoutItem->m_sPos.x; + pSecondLayoutItem->m_sSize.x = pLayoutItem->m_sSize.x; + pSecondLayoutItem->m_sPos.y = 0; + pSecondLayoutItem->m_sSize.y = pLayoutItem->m_sSize.y - fSplitPos; + pLayoutItem->m_sSize.y -= pSecondLayoutItem->m_sSize.y; + if(pLayoutItem->m_pFirstChild) { + pSecondLayoutItem->m_sSize.y += fCurTopMargin; + } + if (pSecondParent) { + pSecondParent->AddChild(pSecondLayoutItem); + if(fCurTopMargin > 0 && pLayoutItem->m_pFirstChild) { + pSecondParent->m_sSize.y += fCurTopMargin; + CXFA_ContentLayoutItemImpl* pParentItem = (CXFA_ContentLayoutItemImpl*)pSecondParent->m_pParent; + while(pParentItem) { + pParentItem->m_sSize.y += fCurTopMargin; + pParentItem = (CXFA_ContentLayoutItemImpl*)pParentItem->m_pParent; + } + } + } else { + pSecondLayoutItem->m_pParent = pLayoutItem->m_pParent; + pSecondLayoutItem->m_pNextSibling = pLayoutItem->m_pNextSibling; + pLayoutItem->m_pNextSibling = pSecondLayoutItem; + } + CXFA_ContentLayoutItemImpl *pChildren = (CXFA_ContentLayoutItemImpl*)pLayoutItem->m_pFirstChild; + pLayoutItem->m_pFirstChild = NULL; + FX_FLOAT lHeightForKeep = 0; + CFX_ArrayTemplate keepLayoutItems; + FX_FLOAT fAddMarginHeight = 0; + for(CXFA_ContentLayoutItemImpl *pChildItem = pChildren, *pChildNext = NULL; pChildItem; pChildItem = pChildNext) { + pChildNext = (CXFA_ContentLayoutItemImpl*)pChildItem->m_pNextSibling; + pChildItem->m_pNextSibling = NULL; + if (fSplitPos <= fCurTopMargin + pChildItem->m_sPos.y + fCurBottomMargin + XFA_LAYOUT_FLOAT_PERCISION) { + if(!XFA_ExistContainerKeep(pChildItem->m_pFormNode, TRUE)) { + pChildItem->m_sPos.y -= fSplitPos - fCurBottomMargin; + pChildItem->m_sPos.y += lHeightForKeep; + pChildItem->m_sPos.y += fAddMarginHeight; + pSecondLayoutItem->AddChild(pChildItem); + } else { + if(lHeightForKeep < XFA_LAYOUT_FLOAT_PERCISION) { + for(FX_INT32 iIndex = 0; iIndex < keepLayoutItems.GetSize(); iIndex ++) { + CXFA_ContentLayoutItemImpl *pPreItem = keepLayoutItems[iIndex]; + pLayoutItem->RemoveChild(pPreItem); + pPreItem->m_sPos.y -= fSplitPos; + if(pPreItem->m_sPos.y < 0) { + pPreItem->m_sPos.y = 0; + } + if (pPreItem->m_sPos.y + pPreItem->m_sSize.y > lHeightForKeep) { + pPreItem->m_sPos.y = lHeightForKeep; + lHeightForKeep += pPreItem->m_sSize.y; + pSecondLayoutItem->m_sSize.y += pPreItem->m_sSize.y; + if(pSecondParent) { + pSecondParent->m_sSize.y += pPreItem->m_sSize.y; + } + } + pSecondLayoutItem->AddChild(pPreItem); + } + } + pChildItem->m_sPos.y -= fSplitPos; + pChildItem->m_sPos.y += lHeightForKeep; + pChildItem->m_sPos.y += fAddMarginHeight; + pSecondLayoutItem->AddChild(pChildItem); + } + } else if (fSplitPos + XFA_LAYOUT_FLOAT_PERCISION >= fCurTopMargin + fCurBottomMargin + pChildItem->m_sPos.y + pChildItem->m_sSize.y) { + pLayoutItem->AddChild(pChildItem); + if(XFA_ExistContainerKeep(pChildItem->m_pFormNode, FALSE)) { + keepLayoutItems.Add(pChildItem); + } else { + keepLayoutItems.RemoveAll(); + } + } else { + FX_FLOAT fOldHeight = pSecondLayoutItem->m_sSize.y; + SplitLayoutItem(pChildItem, pSecondLayoutItem, fSplitPos - fCurTopMargin - fCurBottomMargin - pChildItem->m_sPos.y); + fAddMarginHeight = pSecondLayoutItem->m_sSize.y - fOldHeight; + pLayoutItem->AddChild(pChildItem); + } + } +} +void CXFA_ItemLayoutProcessor::SplitLayoutItem(FX_FLOAT fSplitPos) +{ + ASSERT(m_pLayoutItem); + SplitLayoutItem(m_pLayoutItem, NULL, fSplitPos); + return; +} +void CXFA_LayoutItemImpl::AddChild(CXFA_LayoutItemImpl *pChildItem) +{ + if(pChildItem->m_pParent) { + pChildItem->m_pParent->RemoveChild(pChildItem); + } + pChildItem->m_pParent = this; + if(m_pFirstChild == NULL) { + m_pFirstChild = pChildItem; + } else { + CXFA_LayoutItemImpl* pExistingChildItem = m_pFirstChild; + while(pExistingChildItem->m_pNextSibling) { + pExistingChildItem = pExistingChildItem->m_pNextSibling; + } + pExistingChildItem->m_pNextSibling = pChildItem; + } +} +void CXFA_LayoutItemImpl::AddHeadChild(CXFA_LayoutItemImpl *pChildItem) +{ + if(pChildItem->m_pParent) { + pChildItem->m_pParent->RemoveChild(pChildItem); + } + pChildItem->m_pParent = this; + if(m_pFirstChild == NULL) { + m_pFirstChild = pChildItem; + } else { + CXFA_LayoutItemImpl* pExistingChildItem = m_pFirstChild; + m_pFirstChild = pChildItem; + m_pFirstChild->m_pNextSibling = pExistingChildItem; + } +} +void CXFA_LayoutItemImpl::InsertChild(CXFA_LayoutItemImpl *pBeforeItem, CXFA_LayoutItemImpl *pChildItem) +{ + if(pBeforeItem->m_pParent != this) { + return; + } + if(pChildItem->m_pParent) { + pChildItem->m_pParent = NULL; + } + pChildItem->m_pParent = this; + CXFA_LayoutItemImpl* pExistingChildItem = pBeforeItem->m_pNextSibling; + pBeforeItem->m_pNextSibling = pChildItem; + pChildItem->m_pNextSibling = pExistingChildItem; +} +void CXFA_LayoutItemImpl::RemoveChild(CXFA_LayoutItemImpl *pChildItem) +{ + if(pChildItem->m_pParent != this) { + return; + } + if(m_pFirstChild == pChildItem) { + m_pFirstChild = pChildItem->m_pNextSibling; + } else { + CXFA_LayoutItemImpl* pExistingChildItem = m_pFirstChild; + while(pExistingChildItem && pExistingChildItem->m_pNextSibling != pChildItem) { + pExistingChildItem = pExistingChildItem->m_pNextSibling; + } + if(pExistingChildItem) { + pExistingChildItem->m_pNextSibling = pChildItem->m_pNextSibling; + } + } + pChildItem->m_pNextSibling = NULL; + pChildItem->m_pParent = NULL; +} +CXFA_ContentLayoutItemImpl* CXFA_ItemLayoutProcessor::ExtractLayoutItem() +{ + CXFA_ContentLayoutItemImpl* pLayoutItem = m_pLayoutItem; + if(pLayoutItem) { + m_pLayoutItem = (CXFA_ContentLayoutItemImpl*)pLayoutItem->m_pNextSibling; + pLayoutItem->m_pNextSibling = NULL; + } +#ifdef _XFA_LAYOUTITEM_ProcessCACHE_ + if (m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages_Done && m_pOldLayoutItem && m_pOldLayoutItem->IsContentLayoutItem()) { + if (m_pOldLayoutItem->m_pPrev) { + m_pOldLayoutItem->m_pPrev->m_pNext = NULL; + } + IXFA_Notify* pNotify = m_pOldLayoutItem->m_pFormNode->GetDocument()->GetParser()->GetNotify(); + IXFA_DocLayout* pDocLayout = m_pOldLayoutItem->m_pFormNode->GetDocument()->GetDocLayout(); + CXFA_ContentLayoutItemImpl* pOldLayoutItem = m_pOldLayoutItem; + while (pOldLayoutItem) { + CXFA_ContentLayoutItemImpl* pNextOldLayoutItem = pOldLayoutItem->m_pNext; + pNotify->OnLayoutEvent(pDocLayout, (CXFA_LayoutItem*)pOldLayoutItem, XFA_LAYOUTEVENT_ItemRemoving); + delete pOldLayoutItem; + pOldLayoutItem = pNextOldLayoutItem; + } + m_pOldLayoutItem = NULL; + } +#endif + return pLayoutItem; +} +static FX_BOOL XFA_ItemLayoutProcessor_FindBreakNode(CXFA_Node* pContainerNode, CXFA_Node*& pCurActionNode, XFA_ItemLayoutProcessorStages& nCurStage, FX_BOOL bBreakBefore) +{ + FX_BOOL bFindRs = FALSE; + for(CXFA_Node *pBreakNode = pContainerNode; pBreakNode; pBreakNode = pBreakNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + XFA_ATTRIBUTE eAttributeType = XFA_ATTRIBUTE_Before; + if(!bBreakBefore) { + eAttributeType = XFA_ATTRIBUTE_After; + } + switch(pBreakNode->GetClassID()) { + case XFA_ELEMENT_BreakBefore: { + if(bBreakBefore) { + pCurActionNode = pBreakNode; + nCurStage = XFA_ItemLayoutProcessorStages_BreakBefore; + bFindRs = TRUE; + } + } + break; + case XFA_ELEMENT_BreakAfter: { + if(!bBreakBefore) { + pCurActionNode = pBreakNode; + nCurStage = XFA_ItemLayoutProcessorStages_BreakAfter; + bFindRs = TRUE; + } + } + break; + case XFA_ELEMENT_Break: + if(pBreakNode->GetEnum(eAttributeType) != XFA_ATTRIBUTEENUM_Auto) { + pCurActionNode = pBreakNode; + nCurStage = XFA_ItemLayoutProcessorStages_BreakBefore; + if(!bBreakBefore) { + nCurStage = XFA_ItemLayoutProcessorStages_BreakAfter; + } + bFindRs = TRUE; + break; + } + default: + break; + } + if(bFindRs) { + break; + } + } + return bFindRs; +} +#ifdef _XFA_LAYOUTITEM_ProcessCACHE_ +static void XFA_DeleteLayoutGeneratedNode(CXFA_Node* pGenerateNode) +{ + IXFA_Notify* pNotify = pGenerateNode->GetDocument()->GetParser()->GetNotify(); + IXFA_DocLayout* pDocLayout = pGenerateNode->GetDocument()->GetDocLayout(); + CXFA_NodeIteratorTemplate sIterator(pGenerateNode); + for(CXFA_Node* pNode = sIterator.GetCurrent(); pNode; pNode = sIterator.MoveToNext()) { + CXFA_ContentLayoutItemImpl* pCurLayoutItem = (CXFA_ContentLayoutItemImpl*)pNode->GetUserData(XFA_LAYOUTITEMKEY); + CXFA_ContentLayoutItemImpl* pNextLayoutItem = NULL; + while (pCurLayoutItem) { + pNextLayoutItem = pCurLayoutItem->m_pNext; + pNotify->OnLayoutEvent(pDocLayout, (CXFA_LayoutItem*)pCurLayoutItem, XFA_LAYOUTEVENT_ItemRemoving); + delete pCurLayoutItem; + pCurLayoutItem = pNextLayoutItem; + } + } + pGenerateNode->GetNodeItem(XFA_NODEITEM_Parent)->RemoveChild(pGenerateNode); +} +#endif +void CXFA_ItemLayoutProcessor::XFA_ItemLayoutProcessor_GotoNextContainerNode(CXFA_Node*& pCurActionNode, XFA_ItemLayoutProcessorStages& nCurStage, CXFA_Node* pParentContainer, FX_BOOL bUsePageBreak) +{ + CXFA_Node *pEntireContainer = pParentContainer; + CXFA_Node* pChildContainer = XFA_LAYOUT_INVALIDNODE; + switch (nCurStage) { + case XFA_ItemLayoutProcessorStages_BreakBefore: + case XFA_ItemLayoutProcessorStages_BreakAfter: { + pChildContainer = pCurActionNode->GetNodeItem(XFA_NODEITEM_Parent); + } + break; + case XFA_ItemLayoutProcessorStages_Keep: + case XFA_ItemLayoutProcessorStages_Container: + pChildContainer = pCurActionNode; + break; + default: + pChildContainer = XFA_LAYOUT_INVALIDNODE; + break; + } + switch(nCurStage) { + case XFA_ItemLayoutProcessorStages_Keep: { + CXFA_Node *pBreakAfterNode = pChildContainer->GetNodeItem(XFA_NODEITEM_FirstChild); + if(!m_bKeepBreakFinish && XFA_ItemLayoutProcessor_FindBreakNode(pBreakAfterNode, pCurActionNode, nCurStage, FALSE)) { + return; + } + goto CheckNextChildContainer; + } + case XFA_ItemLayoutProcessorStages_None: { + pCurActionNode = XFA_LAYOUT_INVALIDNODE; + case XFA_ItemLayoutProcessorStages_BookendLeader: + for(CXFA_Node *pBookendNode = pCurActionNode == XFA_LAYOUT_INVALIDNODE ? pEntireContainer->GetNodeItem(XFA_NODEITEM_FirstChild) : + pCurActionNode->GetNodeItem(XFA_NODEITEM_NextSibling); + pBookendNode; pBookendNode = pBookendNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + switch(pBookendNode->GetClassID()) { + case XFA_ELEMENT_Bookend: + case XFA_ELEMENT_Break: + pCurActionNode = pBookendNode; + nCurStage = XFA_ItemLayoutProcessorStages_BookendLeader; + return; + default: + break; + } + } + } + { + pCurActionNode = XFA_LAYOUT_INVALIDNODE; + case XFA_ItemLayoutProcessorStages_BreakBefore: + if(pCurActionNode != XFA_LAYOUT_INVALIDNODE) { + CXFA_Node *pBreakBeforeNode = pCurActionNode->GetNodeItem(XFA_NODEITEM_NextSibling); + if(!m_bKeepBreakFinish && XFA_ItemLayoutProcessor_FindBreakNode(pBreakBeforeNode, pCurActionNode, nCurStage, TRUE)) { + return; + } + if(m_bIsProcessKeep) { + if(ProcessKeepNodesForBreakBefore(pCurActionNode, nCurStage, pChildContainer)) { + return; + } + goto CheckNextChildContainer; + } + pCurActionNode = pChildContainer; + nCurStage = XFA_ItemLayoutProcessorStages_Container; + return; + } + goto CheckNextChildContainer; + } + case XFA_ItemLayoutProcessorStages_Container: { + pCurActionNode = XFA_LAYOUT_INVALIDNODE; + case XFA_ItemLayoutProcessorStages_BreakAfter: { + if(pCurActionNode == XFA_LAYOUT_INVALIDNODE) { + CXFA_Node *pBreakAfterNode = pChildContainer->GetNodeItem(XFA_NODEITEM_FirstChild); + if(!m_bKeepBreakFinish && XFA_ItemLayoutProcessor_FindBreakNode(pBreakAfterNode, pCurActionNode, nCurStage, FALSE)) { + return; + } + } else { + CXFA_Node *pBreakAfterNode = pCurActionNode->GetNodeItem(XFA_NODEITEM_NextSibling); + if(XFA_ItemLayoutProcessor_FindBreakNode(pBreakAfterNode, pCurActionNode, nCurStage, FALSE)) { + return; + } + } + goto CheckNextChildContainer; + } + } +CheckNextChildContainer: { + CXFA_Node *pNextChildContainer = pChildContainer == XFA_LAYOUT_INVALIDNODE ? + pEntireContainer->GetNodeItem(XFA_NODEITEM_FirstChild, XFA_OBJECTTYPE_ContainerNode) : + pChildContainer->GetNodeItem(XFA_NODEITEM_NextSibling, XFA_OBJECTTYPE_ContainerNode); + while(pNextChildContainer && pNextChildContainer->HasFlag(XFA_NODEFLAG_LayoutGeneratedNode)) { + CXFA_Node* pSaveNode = pNextChildContainer; + pNextChildContainer = pNextChildContainer->GetNodeItem(XFA_NODEITEM_NextSibling, XFA_OBJECTTYPE_ContainerNode); +#ifdef _XFA_LAYOUTITEM_ProcessCACHE_ + if (pSaveNode->HasFlag(XFA_NODEFLAG_UnusedNode)) { + XFA_DeleteLayoutGeneratedNode(pSaveNode); + } +#endif + } + if(!pNextChildContainer) { + goto NoMoreChildContainer; + } + FX_BOOL bLastKeep = FALSE; + if(ProcessKeepNodesForCheckNext(pCurActionNode, nCurStage, pNextChildContainer, bLastKeep)) { + return; + } + if(!m_bKeepBreakFinish && !bLastKeep && XFA_ItemLayoutProcessor_FindBreakNode(pNextChildContainer->GetNodeItem(XFA_NODEITEM_FirstChild), pCurActionNode, nCurStage, TRUE)) { + return; + } + pCurActionNode = pNextChildContainer; + if(m_bIsProcessKeep) { + nCurStage = XFA_ItemLayoutProcessorStages_Keep; + } else { + nCurStage = XFA_ItemLayoutProcessorStages_Container; + } + return; + } +NoMoreChildContainer: { + pCurActionNode = XFA_LAYOUT_INVALIDNODE; + case XFA_ItemLayoutProcessorStages_BookendTrailer: + for(CXFA_Node *pBookendNode = pCurActionNode == XFA_LAYOUT_INVALIDNODE ? pEntireContainer->GetNodeItem(XFA_NODEITEM_FirstChild) : + pCurActionNode->GetNodeItem(XFA_NODEITEM_NextSibling); + pBookendNode; pBookendNode = pBookendNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + switch(pBookendNode->GetClassID()) { + case XFA_ELEMENT_Bookend: + case XFA_ELEMENT_Break: + pCurActionNode = pBookendNode; + nCurStage = XFA_ItemLayoutProcessorStages_BookendTrailer; + return; + default: + break; + } + } + } + default: + pCurActionNode = NULL; + nCurStage = XFA_ItemLayoutProcessorStages_Done; + } +} +FX_BOOL CXFA_ItemLayoutProcessor::ProcessKeepNodesForCheckNext(CXFA_Node*& pCurActionNode, XFA_ItemLayoutProcessorStages& nCurStage, CXFA_Node*& pNextContainer, FX_BOOL& bLastKeepNode) +{ + FX_BOOL bCanSplite = pNextContainer->GetIntact() == XFA_ATTRIBUTEENUM_None; + FX_BOOL bNextKeep = FALSE; + if(XFA_ExistContainerKeep(pNextContainer, FALSE)) { + bNextKeep = TRUE; + } + if(bNextKeep && !bCanSplite) { + if(!m_bIsProcessKeep && !m_bKeepBreakFinish) { + m_pKeepHeadNode = pNextContainer; + m_bIsProcessKeep = TRUE; + } + } else { + if(m_bIsProcessKeep && m_pKeepHeadNode != NULL) { + m_pKeepTailNode = pNextContainer; + if(!m_bKeepBreakFinish && XFA_ItemLayoutProcessor_FindBreakNode(pNextContainer->GetNodeItem(XFA_NODEITEM_FirstChild), pCurActionNode, nCurStage, TRUE)) { + return TRUE; + } else { + pNextContainer = m_pKeepHeadNode; + m_bKeepBreakFinish = TRUE; + m_pKeepHeadNode = NULL; + m_pKeepTailNode = NULL; + m_bIsProcessKeep = FALSE; + } + } else { + if(m_bKeepBreakFinish) { + bLastKeepNode = TRUE; + } + m_bKeepBreakFinish = FALSE; + } + } + return FALSE; +} +FX_BOOL CXFA_ItemLayoutProcessor::ProcessKeepNodesForBreakBefore(CXFA_Node*& pCurActionNode, XFA_ItemLayoutProcessorStages& nCurStage, CXFA_Node* pContainerNode) +{ + if(m_pKeepTailNode == pContainerNode) { + pCurActionNode = m_pKeepHeadNode; + m_bKeepBreakFinish = TRUE; + m_pKeepHeadNode = NULL; + m_pKeepTailNode = NULL; + m_bIsProcessKeep = FALSE; + nCurStage = XFA_ItemLayoutProcessorStages_Container; + return TRUE; + } + CXFA_Node *pBreakAfterNode = pContainerNode->GetNodeItem(XFA_NODEITEM_FirstChild); + if(XFA_ItemLayoutProcessor_FindBreakNode(pBreakAfterNode, pCurActionNode, nCurStage, FALSE)) { + return TRUE; + } + return FALSE; +} +FX_BOOL XFA_ItemLayoutProcessor_IsTakingSpace(CXFA_Node* pNode) +{ + XFA_ATTRIBUTEENUM ePresence = pNode->GetEnum(XFA_ATTRIBUTE_Presence); + return ePresence == XFA_ATTRIBUTEENUM_Visible || ePresence == XFA_ATTRIBUTEENUM_Invisible; +} +static inline void XFA_ItemLayoutProcessor_CalculateContainerSpecfiedSize(CXFA_Node* pFormNode, FX_FLOAT& fContainerWidth, FX_FLOAT& fContainerHeight, FX_BOOL& bContainerWidthAutoSize, FX_BOOL& bContainerHeightAutoSize) +{ + fContainerWidth = 0; + fContainerHeight = 0; + bContainerWidthAutoSize = TRUE; + bContainerHeightAutoSize = TRUE; + XFA_ELEMENT eClassID = pFormNode->GetClassID(); + CXFA_Measurement mTmpValue; + if(bContainerWidthAutoSize && (eClassID == XFA_ELEMENT_Subform || eClassID == XFA_ELEMENT_ExclGroup) && pFormNode->TryMeasure(XFA_ATTRIBUTE_W, mTmpValue, FALSE) && mTmpValue.GetValue() > XFA_LAYOUT_FLOAT_PERCISION) { + fContainerWidth = mTmpValue.ToUnit(XFA_UNIT_Pt); + bContainerWidthAutoSize = FALSE; + } + if(bContainerHeightAutoSize && (eClassID == XFA_ELEMENT_Subform || eClassID == XFA_ELEMENT_ExclGroup) && pFormNode->TryMeasure(XFA_ATTRIBUTE_H, mTmpValue, FALSE) && mTmpValue.GetValue() > XFA_LAYOUT_FLOAT_PERCISION) { + fContainerHeight = mTmpValue.ToUnit(XFA_UNIT_Pt); + bContainerHeightAutoSize = FALSE; + } + if(bContainerWidthAutoSize && eClassID == XFA_ELEMENT_Subform && pFormNode->TryMeasure(XFA_ATTRIBUTE_MaxW, mTmpValue, FALSE) && mTmpValue.GetValue() > XFA_LAYOUT_FLOAT_PERCISION) { + fContainerWidth = mTmpValue.ToUnit(XFA_UNIT_Pt); + bContainerWidthAutoSize = FALSE; + } + if(bContainerHeightAutoSize && eClassID == XFA_ELEMENT_Subform && pFormNode->TryMeasure(XFA_ATTRIBUTE_MaxH, mTmpValue, FALSE) && mTmpValue.GetValue() > XFA_LAYOUT_FLOAT_PERCISION) { + fContainerHeight = mTmpValue.ToUnit(XFA_UNIT_Pt); + bContainerHeightAutoSize = FALSE; + } +} +static inline void XFA_ItemLayoutProcessor_CalculateContainerComponentSizeFromContentSize +(CXFA_Node* pFormNode, FX_BOOL bContainerWidthAutoSize, FX_FLOAT fContentCalculatedWidth, FX_FLOAT& fContainerWidth, FX_BOOL bContainerHeightAutoSize, FX_FLOAT fContentCalculatedHeight, FX_FLOAT& fContainerHeight) +{ + CXFA_Node* pMarginNode = pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin); + CXFA_Measurement mTmpValue; + if(bContainerWidthAutoSize) { + fContainerWidth = fContentCalculatedWidth; + if(pMarginNode) { + if(pMarginNode->TryMeasure(XFA_ATTRIBUTE_LeftInset, mTmpValue, FALSE)) { + fContainerWidth += mTmpValue.ToUnit(XFA_UNIT_Pt); + } + if(pMarginNode->TryMeasure(XFA_ATTRIBUTE_RightInset, mTmpValue, FALSE)) { + fContainerWidth += mTmpValue.ToUnit(XFA_UNIT_Pt); + } + } + } + if(bContainerHeightAutoSize) { + fContainerHeight = fContentCalculatedHeight; + if(pMarginNode) { + if(pMarginNode->TryMeasure(XFA_ATTRIBUTE_TopInset, mTmpValue, FALSE)) { + fContainerHeight += mTmpValue.ToUnit(XFA_UNIT_Pt); + } + if(pMarginNode->TryMeasure(XFA_ATTRIBUTE_BottomInset, mTmpValue, FALSE)) { + fContainerHeight += mTmpValue.ToUnit(XFA_UNIT_Pt); + } + } + } +} +void CXFA_ItemLayoutProcessor::CalculatePositionedContainerPos(CXFA_Node* pNode, FX_FLOAT fWidth, FX_FLOAT fHeight, FX_FLOAT& fAbsoluteX, FX_FLOAT& fAbsoluteY) +{ + FX_FLOAT fAnchorX = pNode->GetMeasure(XFA_ATTRIBUTE_X).ToUnit(XFA_UNIT_Pt); + FX_FLOAT fAnchorY = pNode->GetMeasure(XFA_ATTRIBUTE_Y).ToUnit(XFA_UNIT_Pt); + FX_INT32 nRotate = FXSYS_round(pNode->GetMeasure(XFA_ATTRIBUTE_Rotate).GetValue()); + nRotate = (nRotate < 0 ? (nRotate % 360) + 360 : nRotate % 360) / 90; + XFA_ATTRIBUTEENUM eAnchorType = pNode->GetEnum(XFA_ATTRIBUTE_AnchorType); + FX_INT32 nAnchorType = 0; + switch(eAnchorType) { + case XFA_ATTRIBUTEENUM_TopLeft: + nAnchorType = 0; + break; + case XFA_ATTRIBUTEENUM_TopCenter: + nAnchorType = 1; + break; + case XFA_ATTRIBUTEENUM_TopRight: + nAnchorType = 2; + break; + case XFA_ATTRIBUTEENUM_MiddleLeft: + nAnchorType = 3; + break; + case XFA_ATTRIBUTEENUM_MiddleCenter: + nAnchorType = 4; + break; + case XFA_ATTRIBUTEENUM_MiddleRight: + nAnchorType = 5; + break; + case XFA_ATTRIBUTEENUM_BottomLeft: + nAnchorType = 6; + break; + case XFA_ATTRIBUTEENUM_BottomCenter: + nAnchorType = 7; + break; + case XFA_ATTRIBUTEENUM_BottomRight: + nAnchorType = 8; + break; + default: + break; + } + static const FX_UINT8 nNextPos[4][9] = {{0, 1, 2, 3, 4, 5, 6, 7, 8}, {6, 3, 0, 7, 4, 1, 8, 5, 2}, {8, 7, 6, 5, 4, 3, 2, 1, 0}, {2, 5, 8, 1, 4, 7, 0, 3, 6}}; + FX_INT32 nAbsoluteAnchorType = nNextPos[nRotate][nAnchorType]; + fAbsoluteX = fAnchorX; + fAbsoluteY = fAnchorY; + switch(nAbsoluteAnchorType / 3) { + case 1: + fAbsoluteY -= fHeight / 2; + break; + case 2: + fAbsoluteY -= fHeight; + break; + default: + break; + } + switch(nAbsoluteAnchorType % 3) { + case 1: + fAbsoluteX -= fWidth / 2; + break; + case 2: + fAbsoluteX -= fWidth; + break; + default: + break; + } +} +static FX_BOOL XFA_ItemLayoutProcessor_FloatAlmostEqual(FX_FLOAT f1, FX_FLOAT f2) +{ + return f1 >= f2 - XFA_LAYOUT_FLOAT_PERCISION && f1 <= f2 + XFA_LAYOUT_FLOAT_PERCISION; +} +static FX_BOOL XFA_ItemLayoutProcessor_FloatGreaterThan(FX_FLOAT f1, FX_FLOAT f2) +{ + return f1 > f2 + XFA_LAYOUT_FLOAT_PERCISION; +} +static FX_BOOL XFA_ItemLayoutProcessor_FloatLessThan(FX_FLOAT f1, FX_FLOAT f2) +{ + return f1 < f2 - XFA_LAYOUT_FLOAT_PERCISION; +} +FX_BOOL CXFA_ItemLayoutProcessor::IncrementRelayoutNode(CXFA_LayoutProcessor* pLayoutProcessor, CXFA_Node *pNode, CXFA_Node *pParentNode) +{ + return FALSE; +} +void CXFA_ItemLayoutProcessor::DoLayoutPageArea(CXFA_ContainerLayoutItemImpl* pPageAreaLayoutItem) +{ + CXFA_Node *pFormNode = pPageAreaLayoutItem->m_pFormNode; + CXFA_Node *pCurChildNode = XFA_LAYOUT_INVALIDNODE; + XFA_ItemLayoutProcessorStages nCurChildNodeStage = XFA_ItemLayoutProcessorStages_None; + CXFA_LayoutItemImpl* pBeforeItem = NULL; + for(XFA_ItemLayoutProcessor_GotoNextContainerNode(pCurChildNode, nCurChildNodeStage, pFormNode, FALSE); + pCurChildNode; + XFA_ItemLayoutProcessor_GotoNextContainerNode(pCurChildNode, nCurChildNodeStage, pFormNode, FALSE)) { + if (nCurChildNodeStage != XFA_ItemLayoutProcessorStages_Container) { + continue; + } + if(pCurChildNode->GetClassID() == XFA_ELEMENT_Variables) { + continue; + } + CXFA_ItemLayoutProcessor* pProcessor = FX_NEW CXFA_ItemLayoutProcessor(pCurChildNode, NULL); +#ifndef _XFA_LAYOUTITEM_ProcessCACHE_ + pProcessor->m_pPageMgrCreateItem = m_pPageMgrCreateItem; +#endif + pProcessor->DoLayout(FALSE, XFA_LAYOUT_FLOAT_MAX); + if(!pProcessor->HasLayoutItem()) { + delete pProcessor; + continue; + } + FX_FLOAT fWidth, fHeight; + pProcessor->GetCurrentComponentSize(fWidth, fHeight); + FX_FLOAT fAbsoluteX = 0, fAbsoluteY = 0; + CalculatePositionedContainerPos(pCurChildNode, fWidth, fHeight, fAbsoluteX, fAbsoluteY); + pProcessor->SetCurrentComponentPos(fAbsoluteX, fAbsoluteY); + CXFA_LayoutItemImpl* pProcessItem = pProcessor->ExtractLayoutItem(); + if(pBeforeItem == NULL) { + pPageAreaLayoutItem->AddHeadChild(pProcessItem); + } else { + pPageAreaLayoutItem->InsertChild(pBeforeItem, pProcessItem); + } + pBeforeItem = pProcessItem; + delete pProcessor; + } + pBeforeItem = NULL; + CXFA_LayoutItemImpl* pLayoutItem = pPageAreaLayoutItem->m_pFirstChild; + while (pLayoutItem) { + if (!pLayoutItem->IsContentLayoutItem() || pLayoutItem->m_pFormNode->GetClassID() != XFA_ELEMENT_Draw) { + pLayoutItem = pLayoutItem->m_pNextSibling; + continue; + } + if (pLayoutItem->m_pFormNode->GetClassID() == XFA_ELEMENT_Draw) { + CXFA_LayoutItemImpl* pNextLayoutItem = pLayoutItem->m_pNextSibling; + pPageAreaLayoutItem->RemoveChild(pLayoutItem); + if (pBeforeItem == NULL) { + pPageAreaLayoutItem->AddHeadChild(pLayoutItem); + } else { + pPageAreaLayoutItem->InsertChild(pBeforeItem, pLayoutItem); + } + pBeforeItem = pLayoutItem; + pLayoutItem = pNextLayoutItem; + } + } +} +void CXFA_ItemLayoutProcessor::DoLayoutPositionedContainer(CXFA_LayoutContext* pContext) +{ + if(m_pLayoutItem != NULL) { + return; + } + m_pLayoutItem = CreateContentLayoutItem(m_pFormNode); + FX_BOOL bIgnoreXY = (m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout) != XFA_ATTRIBUTEENUM_Position); + FX_FLOAT fContainerWidth = 0, fContainerHeight = 0; + FX_BOOL bContainerWidthAutoSize = TRUE, bContainerHeightAutoSize = TRUE; + XFA_ItemLayoutProcessor_CalculateContainerSpecfiedSize(m_pFormNode, fContainerWidth, fContainerHeight, bContainerWidthAutoSize, bContainerHeightAutoSize); + FX_FLOAT fContentCalculatedWidth = 0, fContentCalculatedHeight = 0; + FX_FLOAT fHiddenContentCalculatedWidth = 0, fHiddenContentCalculatedHeight = 0; + if(m_pCurChildNode == XFA_LAYOUT_INVALIDNODE) { + XFA_ItemLayoutProcessor_GotoNextContainerNode(m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, FALSE); + } + FX_INT32 iColIndex = 0; + for(; m_pCurChildNode; XFA_ItemLayoutProcessor_GotoNextContainerNode(m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, FALSE)) { + if (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages_Container) { + continue; + } + if(m_pCurChildNode->GetClassID() == XFA_ELEMENT_Variables) { + continue; + } + CXFA_ItemLayoutProcessor* pProcessor = FX_NEW CXFA_ItemLayoutProcessor(m_pCurChildNode, m_pPageMgr); +#ifndef _XFA_LAYOUTITEM_ProcessCACHE_ + pProcessor->m_pPageMgrCreateItem = m_pPageMgrCreateItem; +#endif + if (pContext && pContext->m_prgSpecifiedColumnWidths) { + FX_INT32 iColSpan = m_pCurChildNode->GetInteger(XFA_ATTRIBUTE_ColSpan); + if (iColSpan <= pContext->m_prgSpecifiedColumnWidths->GetSize() - iColIndex) { + pContext->m_fCurColumnWidth = 0; + pContext->m_bCurColumnWidthAvaiable = TRUE; + if(iColSpan == -1) { + iColSpan = pContext->m_prgSpecifiedColumnWidths->GetSize(); + } + for (FX_INT32 i = 0; i < iColSpan; i++) { + pContext->m_fCurColumnWidth += pContext->m_prgSpecifiedColumnWidths->GetAt(iColIndex + i); + } + if(pContext->m_fCurColumnWidth == 0) { + pContext->m_bCurColumnWidthAvaiable = FALSE; + } + iColIndex += iColSpan; + } + } + pProcessor->DoLayout(FALSE, XFA_LAYOUT_FLOAT_MAX, XFA_LAYOUT_FLOAT_MAX, pContext); + if(!pProcessor->HasLayoutItem()) { + delete pProcessor; + continue; + } + FX_FLOAT fWidth, fHeight; + pProcessor->GetCurrentComponentSize(fWidth, fHeight); + FX_BOOL bChangeParentSize = FALSE; + if (XFA_ItemLayoutProcessor_IsTakingSpace(m_pCurChildNode)) { + bChangeParentSize = TRUE; + } + FX_FLOAT fAbsoluteX = 0, fAbsoluteY = 0; + if(!bIgnoreXY) { + CalculatePositionedContainerPos(m_pCurChildNode, fWidth, fHeight, fAbsoluteX, fAbsoluteY); + } + pProcessor->SetCurrentComponentPos(fAbsoluteX, fAbsoluteY); + if(bContainerWidthAutoSize) { + FX_FLOAT fChildSuppliedWidth = fAbsoluteX + fWidth; + if(bChangeParentSize) { + if(fContentCalculatedWidth < fChildSuppliedWidth) { + fContentCalculatedWidth = fChildSuppliedWidth; + } + } else { + if(fHiddenContentCalculatedWidth < fChildSuppliedWidth && m_pCurChildNode->GetClassID() != XFA_ELEMENT_Subform) { + fHiddenContentCalculatedWidth = fChildSuppliedWidth; + } + } + } + if(bContainerHeightAutoSize) { + FX_FLOAT fChildSuppliedHeight = fAbsoluteY + fHeight; + if(bChangeParentSize) { + if(fContentCalculatedHeight < fChildSuppliedHeight) { + fContentCalculatedHeight = fChildSuppliedHeight; + } + } else { + if(fHiddenContentCalculatedHeight < fChildSuppliedHeight && m_pCurChildNode->GetClassID() != XFA_ELEMENT_Subform) { + fHiddenContentCalculatedHeight = fChildSuppliedHeight; + } + } + } + m_pLayoutItem->AddChild(pProcessor->ExtractLayoutItem()); + delete pProcessor; + } + XFA_VERSION eVersion = m_pFormNode->GetDocument()->GetCurVersionMode(); + if(fContentCalculatedWidth == 0 && eVersion < XFA_VERSION_207) { + fContentCalculatedWidth = fHiddenContentCalculatedWidth; + } + if(fContentCalculatedHeight == 0 && eVersion < XFA_VERSION_207) { + fContentCalculatedHeight = fHiddenContentCalculatedHeight; + } + XFA_ItemLayoutProcessor_CalculateContainerComponentSizeFromContentSize(m_pFormNode, bContainerWidthAutoSize, fContentCalculatedWidth, fContainerWidth, bContainerHeightAutoSize, fContentCalculatedHeight, fContainerHeight); + SetCurrentComponentSize(fContainerWidth, fContainerHeight); +} +static inline void XFA_ItemLayoutProcessor_UpdateWidgetSize(CXFA_ContentLayoutItemImpl* pLayoutItem, FX_FLOAT& fWidth, FX_FLOAT& fHeight) +{ + CXFA_Node *pNode = pLayoutItem->m_pFormNode; + ASSERT(pNode); + XFA_ELEMENT eClassID = pNode->GetClassID(); + switch(eClassID) { + case XFA_ELEMENT_Subform: + case XFA_ELEMENT_Area: + case XFA_ELEMENT_ExclGroup: + case XFA_ELEMENT_SubformSet: { + if(fWidth < -XFA_LAYOUT_FLOAT_PERCISION) { + fWidth = pLayoutItem->m_sSize.x; + } + if(fHeight < -XFA_LAYOUT_FLOAT_PERCISION) { + fHeight = pLayoutItem->m_sSize.y; + } + break; + } + case XFA_ELEMENT_Draw: + case XFA_ELEMENT_Field: { + pNode->GetDocument()->GetParser()->GetNotify()->StartFieldDrawLayout(pNode, fWidth, fHeight); + break; + } + default: + ASSERT(FALSE); + } +} +static inline void XFA_ItemLayoutProcessor_RelocateTableRowCells(CXFA_ContentLayoutItemImpl* pLayoutRow, const CFX_ArrayTemplate& rgSpecifiedColumnWidths, XFA_ATTRIBUTEENUM eLayout) +{ + FX_FLOAT fContainerWidth = 0, fContainerHeight = 0; + FX_BOOL bContainerWidthAutoSize = TRUE, bContainerHeightAutoSize = TRUE; + XFA_ItemLayoutProcessor_CalculateContainerSpecfiedSize(pLayoutRow->m_pFormNode, fContainerWidth, fContainerHeight, bContainerWidthAutoSize, bContainerHeightAutoSize); + CXFA_Node* pMarginNode = pLayoutRow->m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin); + FX_FLOAT fLeftInset = 0, fTopInset = 0, fRightInset = 0, fBottomInset = 0; + if(pMarginNode) { + fLeftInset = pMarginNode->GetMeasure(XFA_ATTRIBUTE_LeftInset).ToUnit(XFA_UNIT_Pt); + fTopInset = pMarginNode->GetMeasure(XFA_ATTRIBUTE_TopInset).ToUnit(XFA_UNIT_Pt); + fRightInset = pMarginNode->GetMeasure(XFA_ATTRIBUTE_RightInset).ToUnit(XFA_UNIT_Pt); + fBottomInset = pMarginNode->GetMeasure(XFA_ATTRIBUTE_BottomInset).ToUnit(XFA_UNIT_Pt); + } + FX_FLOAT fContentWidthLimit = bContainerWidthAutoSize ? XFA_LAYOUT_FLOAT_MAX : fContainerWidth - fLeftInset - fRightInset; + FX_FLOAT fContentCurrentHeight = pLayoutRow->m_sSize.y - fTopInset - fBottomInset; + FX_FLOAT fContentCalculatedWidth = 0, fContentCalculatedHeight = 0; + FX_FLOAT fCurrentColX = 0; + FX_INT32 nCurrentColIdx = 0; + FX_BOOL bMetWholeRowCell = FALSE; + for(CXFA_ContentLayoutItemImpl* pLayoutChild = (CXFA_ContentLayoutItemImpl*)pLayoutRow->m_pFirstChild; pLayoutChild; pLayoutChild = (CXFA_ContentLayoutItemImpl*)pLayoutChild->m_pNextSibling) { + FX_INT32 nOriginalColSpan = pLayoutChild->m_pFormNode->GetInteger(XFA_ATTRIBUTE_ColSpan); + FX_INT32 nColSpan = nOriginalColSpan; + FX_FLOAT fColSpanWidth = 0; + if(nColSpan == -1 || nCurrentColIdx + nColSpan > rgSpecifiedColumnWidths.GetSize()) { + nColSpan = rgSpecifiedColumnWidths.GetSize() - nCurrentColIdx; + } + for(FX_INT32 i = 0; i < nColSpan; i ++) { + fColSpanWidth += rgSpecifiedColumnWidths[nCurrentColIdx + i]; + } + if (nColSpan != nOriginalColSpan) { + fColSpanWidth = bMetWholeRowCell ? 0 : FX_MAX(fColSpanWidth, pLayoutChild->m_sSize.y); + } + if(nOriginalColSpan == -1) { + bMetWholeRowCell = TRUE; + } + pLayoutChild->m_sPos.Set(fCurrentColX, 0); + pLayoutChild->m_sSize.x = fColSpanWidth; + if(XFA_ItemLayoutProcessor_IsTakingSpace(pLayoutChild->m_pFormNode)) { + fCurrentColX += fColSpanWidth; + nCurrentColIdx += nColSpan; + FX_FLOAT fNewHeight = bContainerHeightAutoSize ? -1 : fContentCurrentHeight; + XFA_ItemLayoutProcessor_UpdateWidgetSize(pLayoutChild, fColSpanWidth, fNewHeight); + pLayoutChild->m_sSize.y = fNewHeight; + if(bContainerHeightAutoSize) { + FX_FLOAT fChildSuppliedHeight = pLayoutChild->m_sSize.y; + if(fContentCalculatedHeight < fChildSuppliedHeight) { + fContentCalculatedHeight = fChildSuppliedHeight; + } + } + } + } + if(bContainerHeightAutoSize) { + for(CXFA_ContentLayoutItemImpl* pLayoutChild = (CXFA_ContentLayoutItemImpl*)pLayoutRow->m_pFirstChild; pLayoutChild; pLayoutChild = (CXFA_ContentLayoutItemImpl*)pLayoutChild->m_pNextSibling) { + XFA_ItemLayoutProcessor_UpdateWidgetSize(pLayoutChild, pLayoutChild->m_sSize.x, fContentCalculatedHeight); + FX_FLOAT fOldChildHeight = pLayoutChild->m_sSize.y; + pLayoutChild->m_sSize.y = fContentCalculatedHeight; + CXFA_Node* pParaNode = pLayoutChild->m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Para); + if(pParaNode && pLayoutChild->m_pFirstChild) { + FX_FLOAT fOffHeight = fContentCalculatedHeight - fOldChildHeight; + XFA_ATTRIBUTEENUM eVType = pParaNode->GetEnum(XFA_ATTRIBUTE_VAlign); + switch(eVType) { + case XFA_ATTRIBUTEENUM_Middle: + fOffHeight = fOffHeight / 2; + break; + case XFA_ATTRIBUTEENUM_Bottom: + break; + case XFA_ATTRIBUTEENUM_Top: + default: + fOffHeight = 0; + break; + } + if(fOffHeight > 0) { + for(CXFA_ContentLayoutItemImpl* pInnerLayoutChild = (CXFA_ContentLayoutItemImpl*)pLayoutChild->m_pFirstChild; pInnerLayoutChild; pInnerLayoutChild = (CXFA_ContentLayoutItemImpl*)pInnerLayoutChild->m_pNextSibling) { + pInnerLayoutChild->m_sPos.y += fOffHeight; + } + } + } + } + } + if(bContainerWidthAutoSize) { + FX_FLOAT fChildSuppliedWidth = fCurrentColX; + if(fContentWidthLimit < XFA_LAYOUT_FLOAT_MAX && fContentWidthLimit > fChildSuppliedWidth) { + fChildSuppliedWidth = fContentWidthLimit; + } + if (fContentCalculatedWidth < fChildSuppliedWidth) { + fContentCalculatedWidth = fChildSuppliedWidth; + } + } else { + fContentCalculatedWidth = fContainerWidth - fLeftInset - fRightInset; + } + if(pLayoutRow->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout) == XFA_ATTRIBUTEENUM_Rl_row) { + for(CXFA_ContentLayoutItemImpl* pLayoutChild = (CXFA_ContentLayoutItemImpl*)pLayoutRow->m_pFirstChild; pLayoutChild; pLayoutChild = (CXFA_ContentLayoutItemImpl*)pLayoutChild->m_pNextSibling) { + pLayoutChild->m_sPos.x = fContentCalculatedWidth - pLayoutChild->m_sPos.x - pLayoutChild->m_sSize.x; + } + } + XFA_ItemLayoutProcessor_CalculateContainerComponentSizeFromContentSize(pLayoutRow->m_pFormNode, bContainerWidthAutoSize, fContentCalculatedWidth, fContainerWidth, bContainerHeightAutoSize, fContentCalculatedHeight, fContainerHeight); + pLayoutRow->m_sSize.Set(fContainerWidth, fContainerHeight); +} +void CXFA_ItemLayoutProcessor::DoLayoutTableContainer(CXFA_Node* pLayoutNode) +{ + if(m_pLayoutItem != NULL) { + return; + } + if(pLayoutNode == NULL) { + pLayoutNode = m_pFormNode; + } + ASSERT(m_pCurChildNode == XFA_LAYOUT_INVALIDNODE); + m_pLayoutItem = CreateContentLayoutItem(m_pFormNode); + FX_FLOAT fContainerWidth = 0, fContainerHeight = 0; + FX_BOOL bContainerWidthAutoSize = TRUE, bContainerHeightAutoSize = TRUE; + XFA_ItemLayoutProcessor_CalculateContainerSpecfiedSize(m_pFormNode, fContainerWidth, fContainerHeight, bContainerWidthAutoSize, bContainerHeightAutoSize); + FX_FLOAT fContentCalculatedWidth = 0, fContentCalculatedHeight = 0; + CXFA_Node* pMarginNode = m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin); + FX_FLOAT fLeftInset = 0, fTopInset = 0, fRightInset = 0, fBottomInset = 0; + if(pMarginNode) { + fLeftInset = pMarginNode->GetMeasure(XFA_ATTRIBUTE_LeftInset).ToUnit(XFA_UNIT_Pt); + fTopInset = pMarginNode->GetMeasure(XFA_ATTRIBUTE_TopInset).ToUnit(XFA_UNIT_Pt); + fRightInset = pMarginNode->GetMeasure(XFA_ATTRIBUTE_RightInset).ToUnit(XFA_UNIT_Pt); + fBottomInset = pMarginNode->GetMeasure(XFA_ATTRIBUTE_BottomInset).ToUnit(XFA_UNIT_Pt); + } + FX_FLOAT fContentWidthLimit = bContainerWidthAutoSize ? XFA_LAYOUT_FLOAT_MAX : fContainerWidth - fLeftInset - fRightInset; + CFX_WideStringC wsColumnWidths; + if (pLayoutNode->TryCData(XFA_ATTRIBUTE_ColumnWidths, wsColumnWidths)) { + CFX_WideStringArray widths; + if (FX_SeparateStringW(wsColumnWidths.GetPtr(), wsColumnWidths.GetLength(), L' ', widths) > 0) { + FX_INT32 iCols = widths.GetSize(); + CFX_WideString wsWidth; + for (FX_INT32 i = 0; i < iCols; i++) { + wsWidth = widths[i]; + wsWidth.TrimLeft(L' '); + if (!wsWidth.IsEmpty()) { + CXFA_Measurement measure(wsWidth); + m_rgSpecifiedColumnWidths.Add(measure.ToUnit(XFA_UNIT_Pt)); + } + } + } + } + FX_INT32 iSpecifiedColumnCount = m_rgSpecifiedColumnWidths.GetSize(); + CXFA_LayoutContext layoutContext; + layoutContext.m_prgSpecifiedColumnWidths = &m_rgSpecifiedColumnWidths; + CXFA_LayoutContext* pLayoutContext = iSpecifiedColumnCount > 0 ? &layoutContext : NULL; + if(m_pCurChildNode == XFA_LAYOUT_INVALIDNODE) { + XFA_ItemLayoutProcessor_GotoNextContainerNode(m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, FALSE); + } + for(; m_pCurChildNode; XFA_ItemLayoutProcessor_GotoNextContainerNode(m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, FALSE)) { + layoutContext.m_bCurColumnWidthAvaiable = FALSE; + layoutContext.m_fCurColumnWidth = 0; + if (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages_Container) { + continue; + } + CXFA_ItemLayoutProcessor* pProcessor = FX_NEW CXFA_ItemLayoutProcessor(m_pCurChildNode, m_pPageMgr); +#ifndef _XFA_LAYOUTITEM_ProcessCACHE_ + pProcessor->m_pPageMgrCreateItem = m_pPageMgrCreateItem; +#endif + pProcessor->DoLayout(FALSE, XFA_LAYOUT_FLOAT_MAX, XFA_LAYOUT_FLOAT_MAX, pLayoutContext); + if(!pProcessor->HasLayoutItem()) { + delete pProcessor; + continue; + } + m_pLayoutItem->AddChild(pProcessor->ExtractLayoutItem()); + delete pProcessor; + } + FX_INT32 iRowCount = 0, iColCount = 0; + { + CFX_ArrayTemplate rgRowItems; + CFX_ArrayTemplate rgRowItemsSpan; + CFX_ArrayTemplate rgRowItemsWidth; + for(CXFA_ContentLayoutItemImpl* pLayoutChild = (CXFA_ContentLayoutItemImpl*)m_pLayoutItem->m_pFirstChild; pLayoutChild; pLayoutChild = (CXFA_ContentLayoutItemImpl*)pLayoutChild->m_pNextSibling) { + if(pLayoutChild->m_pFormNode->GetClassID() != XFA_ELEMENT_Subform) { + continue; + } + if(!XFA_ItemLayoutProcessor_IsTakingSpace(pLayoutChild->m_pFormNode)) { + continue; + } + XFA_ATTRIBUTEENUM eLayout = pLayoutChild->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout); + if(eLayout != XFA_ATTRIBUTEENUM_Row && eLayout != XFA_ATTRIBUTEENUM_Rl_row) { + continue; + } + if (CXFA_ContentLayoutItemImpl* pRowLayoutCell = (CXFA_ContentLayoutItemImpl*)pLayoutChild->m_pFirstChild) { + rgRowItems.Add(pRowLayoutCell); + FX_INT32 iColSpan = pRowLayoutCell->m_pFormNode->GetInteger(XFA_ATTRIBUTE_ColSpan); + rgRowItemsSpan.Add(iColSpan); + rgRowItemsWidth.Add(pRowLayoutCell->m_sSize.x); + } + } + iRowCount = rgRowItems.GetSize(); + iColCount = 0; + FX_BOOL bMoreColumns = TRUE; + while(bMoreColumns) { + bMoreColumns = FALSE; + FX_BOOL bAutoCol = FALSE; + for(FX_INT32 i = 0; i < iRowCount; i ++) { + while(rgRowItems[i] != NULL && (rgRowItemsSpan[i] <= 0 || !XFA_ItemLayoutProcessor_IsTakingSpace(rgRowItems[i]->m_pFormNode))) { + CXFA_ContentLayoutItemImpl* pNewCell = (CXFA_ContentLayoutItemImpl*)rgRowItems[i]->m_pNextSibling; + if(rgRowItemsSpan[i] < 0 && XFA_ItemLayoutProcessor_IsTakingSpace(rgRowItems[i]->m_pFormNode)) { + pNewCell = NULL; + } + rgRowItems[i] = pNewCell; + rgRowItemsSpan[i] = pNewCell ? pNewCell->m_pFormNode->GetInteger(XFA_ATTRIBUTE_ColSpan) : 0; + rgRowItemsWidth[i] = pNewCell ? pNewCell->m_sSize.x : 0; + } + CXFA_ContentLayoutItemImpl* pCell = rgRowItems[i]; + if(!pCell) { + continue; + } + bMoreColumns = TRUE; + if (rgRowItemsSpan[i] == 1) { + if (iColCount >= iSpecifiedColumnCount) { + for (FX_INT32 j = 0, c = iColCount + 1 - m_rgSpecifiedColumnWidths.GetSize(); j < c; j ++) { + m_rgSpecifiedColumnWidths.Add(0); + } + } + if (m_rgSpecifiedColumnWidths[iColCount] < XFA_LAYOUT_FLOAT_PERCISION) { + bAutoCol = TRUE; + } + if (bAutoCol && m_rgSpecifiedColumnWidths[iColCount] < rgRowItemsWidth[i]) { + m_rgSpecifiedColumnWidths[iColCount] = rgRowItemsWidth[i]; + } + } + } + if(bMoreColumns) { + FX_FLOAT fFinalColumnWidth = m_rgSpecifiedColumnWidths[iColCount]; + for(FX_INT32 i = 0; i < iRowCount; i ++) { + if(!rgRowItems[i]) { + continue; + } + rgRowItemsSpan[i]--; + rgRowItemsWidth[i] -= fFinalColumnWidth; + } + iColCount ++; + } + } + } + FX_FLOAT fCurrentRowY = 0; + for(CXFA_ContentLayoutItemImpl* pLayoutChild = (CXFA_ContentLayoutItemImpl*)m_pLayoutItem->m_pFirstChild; pLayoutChild; pLayoutChild = (CXFA_ContentLayoutItemImpl*)pLayoutChild->m_pNextSibling) { + if(!XFA_ItemLayoutProcessor_IsTakingSpace(pLayoutChild->m_pFormNode)) { + continue; + } + if(pLayoutChild->m_pFormNode->GetClassID() == XFA_ELEMENT_Subform) { + XFA_ATTRIBUTEENUM eSubformLayout = pLayoutChild->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout); + if(eSubformLayout == XFA_ATTRIBUTEENUM_Row || eSubformLayout == XFA_ATTRIBUTEENUM_Rl_row) { + XFA_ItemLayoutProcessor_RelocateTableRowCells(pLayoutChild, m_rgSpecifiedColumnWidths, eSubformLayout); + } + } + pLayoutChild->m_sPos.y = fCurrentRowY; + if(bContainerWidthAutoSize) { + pLayoutChild->m_sPos.x = 0; + } else { + switch(pLayoutChild->m_pFormNode->GetEnum(XFA_ATTRIBUTE_HAlign)) { + case XFA_ATTRIBUTEENUM_Left: + default: + pLayoutChild->m_sPos.x = 0; + break; + case XFA_ATTRIBUTEENUM_Center: + pLayoutChild->m_sPos.x = (fContentWidthLimit - pLayoutChild->m_sSize.x) / 2 ; + break; + case XFA_ATTRIBUTEENUM_Right: + pLayoutChild->m_sPos.x = fContentWidthLimit - pLayoutChild->m_sSize.x; + break; + } + } + if(bContainerWidthAutoSize) { + FX_FLOAT fChildSuppliedWidth = pLayoutChild->m_sPos.x + pLayoutChild->m_sSize.x; + if(fContentWidthLimit < XFA_LAYOUT_FLOAT_MAX && fContentWidthLimit > fChildSuppliedWidth) { + fChildSuppliedWidth = fContentWidthLimit; + } + if (fContentCalculatedWidth < fChildSuppliedWidth) { + fContentCalculatedWidth = fChildSuppliedWidth; + } + } + fCurrentRowY += pLayoutChild->m_sSize.y; + } + if(bContainerHeightAutoSize) { + FX_FLOAT fChildSuppliedHeight = fCurrentRowY; + if(fContentCalculatedHeight < fChildSuppliedHeight) { + fContentCalculatedHeight = fChildSuppliedHeight; + } + } + XFA_ItemLayoutProcessor_CalculateContainerComponentSizeFromContentSize(m_pFormNode, bContainerWidthAutoSize, fContentCalculatedWidth, fContainerWidth, bContainerHeightAutoSize, fContentCalculatedHeight, fContainerHeight); + SetCurrentComponentSize(fContainerWidth, fContainerHeight); +} +static FX_UINT8 XFA_ItemLayoutProcessor_HAlignEnumToInt(XFA_ATTRIBUTEENUM eHAlign) +{ + switch(eHAlign) { + case XFA_ATTRIBUTEENUM_Center: + return 1; + case XFA_ATTRIBUTEENUM_Right: + return 2; + case XFA_ATTRIBUTEENUM_Left: + default: + return 0; + } +} +static void XFA_ItemLayoutProcessor_UpdatePendedItemLayout(CXFA_ItemLayoutProcessor* pProcessor, CXFA_ContentLayoutItemImpl* pLayoutItem) +{ + XFA_ATTRIBUTEENUM eLayout = pLayoutItem->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout); + switch(eLayout) { + case XFA_ATTRIBUTEENUM_Row: + case XFA_ATTRIBUTEENUM_Rl_row: + XFA_ItemLayoutProcessor_RelocateTableRowCells(pLayoutItem, pProcessor->m_rgSpecifiedColumnWidths, eLayout); + break; + default: + break; + } +} +FX_BOOL CXFA_ItemLayoutProcessor::IsAddNewRowForTrailer(CXFA_ContentLayoutItemImpl* pTrailerItem) +{ + if(!pTrailerItem) { + return FALSE; + } + FX_FLOAT fWidth = pTrailerItem->m_sSize.x; + XFA_ATTRIBUTEENUM eLayout = m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout); + if(eLayout != XFA_ATTRIBUTEENUM_Tb && m_fWidthLimite > fWidth) { + return FALSE; + } + return TRUE; +} +static void XFA_ItemLayoutProcessor_AddTrailerBeforeSplit(CXFA_ItemLayoutProcessor* pProcessor, FX_FLOAT fSplitPos, CXFA_ContentLayoutItemImpl* pTrailerLayoutItem, FX_BOOL bUseInherited = FALSE) +{ + if(!pTrailerLayoutItem) { + return; + } + FX_FLOAT fHeight = pTrailerLayoutItem->m_sSize.y; + if(bUseInherited) { + FX_FLOAT fNewSplitPos = 0; + if(fSplitPos - fHeight > XFA_LAYOUT_FLOAT_PERCISION) { + fNewSplitPos = pProcessor->FindSplitPos(fSplitPos - fHeight); + } + if (fNewSplitPos > XFA_LAYOUT_FLOAT_PERCISION) { + pProcessor->SplitLayoutItem(fNewSplitPos); + } + return; + } + XFA_ItemLayoutProcessor_UpdatePendedItemLayout(pProcessor, pTrailerLayoutItem); + CXFA_Node* pMarginNode = pProcessor->m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin); + FX_FLOAT fLeftInset = 0, fTopInset = 0, fRightInset = 0, fBottomInset = 0; + if(pMarginNode) { + fLeftInset = pMarginNode->GetMeasure(XFA_ATTRIBUTE_LeftInset).ToUnit(XFA_UNIT_Pt); + fTopInset = pMarginNode->GetMeasure(XFA_ATTRIBUTE_TopInset).ToUnit(XFA_UNIT_Pt); + fRightInset = pMarginNode->GetMeasure(XFA_ATTRIBUTE_RightInset).ToUnit(XFA_UNIT_Pt); + fBottomInset = pMarginNode->GetMeasure(XFA_ATTRIBUTE_BottomInset).ToUnit(XFA_UNIT_Pt); + } + FX_FLOAT fWidth = pTrailerLayoutItem->m_sSize.x; + XFA_ATTRIBUTEENUM eLayout = pProcessor->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout); + if(!pProcessor->IsAddNewRowForTrailer(pTrailerLayoutItem)) { + pTrailerLayoutItem->m_sPos.y = pProcessor->m_fLastRowY; + pTrailerLayoutItem->m_sPos.x = pProcessor->m_fLastRowWidth; + pProcessor->m_pLayoutItem->m_sSize.x += pTrailerLayoutItem->m_sSize.x; + pProcessor->m_pLayoutItem->AddChild(pTrailerLayoutItem); + return; + } + FX_FLOAT fNewSplitPos = 0; + if(fSplitPos - fHeight > XFA_LAYOUT_FLOAT_PERCISION) { + fNewSplitPos = pProcessor->FindSplitPos(fSplitPos - fHeight); + } + if (fNewSplitPos > XFA_LAYOUT_FLOAT_PERCISION) { + pProcessor->SplitLayoutItem(fNewSplitPos); + pTrailerLayoutItem->m_sPos.y = fNewSplitPos - fTopInset - fBottomInset; + } else { + pTrailerLayoutItem->m_sPos.y = fSplitPos - fTopInset - fBottomInset; + } + switch(pTrailerLayoutItem->m_pFormNode->GetEnum(XFA_ATTRIBUTE_HAlign)) { + case XFA_ATTRIBUTEENUM_Left: + default: + pTrailerLayoutItem->m_sPos.x = fLeftInset; + break; + case XFA_ATTRIBUTEENUM_Right: + pTrailerLayoutItem->m_sPos.x = pProcessor->m_pLayoutItem->m_sSize.x - fRightInset - pTrailerLayoutItem->m_sSize.x; + break; + case XFA_ATTRIBUTEENUM_Center: + pTrailerLayoutItem->m_sPos.x = (pProcessor->m_pLayoutItem->m_sSize.x - fLeftInset - fRightInset - pTrailerLayoutItem->m_sSize.x) / 2; + break; + } + pProcessor->m_pLayoutItem->m_sSize.y += fHeight; + pProcessor->m_pLayoutItem->AddChild(pTrailerLayoutItem); +}; +static void XFA_ItemLayoutProcessor_AddLeaderAfterSplit(CXFA_ItemLayoutProcessor* pProcessor, CXFA_ContentLayoutItemImpl* pLeaderLayoutItem) +{ + XFA_ItemLayoutProcessor_UpdatePendedItemLayout(pProcessor, pLeaderLayoutItem); + CXFA_Node* pMarginNode = pProcessor->m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin); + FX_FLOAT fLeftInset = 0, fTopInset = 0, fRightInset = 0, fBottomInset = 0; + if(pMarginNode) { + fLeftInset = pMarginNode->GetMeasure(XFA_ATTRIBUTE_LeftInset).ToUnit(XFA_UNIT_Pt); + fTopInset = pMarginNode->GetMeasure(XFA_ATTRIBUTE_TopInset).ToUnit(XFA_UNIT_Pt); + fRightInset = pMarginNode->GetMeasure(XFA_ATTRIBUTE_RightInset).ToUnit(XFA_UNIT_Pt); + fBottomInset = pMarginNode->GetMeasure(XFA_ATTRIBUTE_BottomInset).ToUnit(XFA_UNIT_Pt); + } + FX_FLOAT fHeight = pLeaderLayoutItem->m_sSize.y; + for (CXFA_ContentLayoutItemImpl* pChildItem = (CXFA_ContentLayoutItemImpl*)pProcessor->m_pLayoutItem->m_pFirstChild; pChildItem; pChildItem = (CXFA_ContentLayoutItemImpl*)pChildItem->m_pNextSibling) { + pChildItem->m_sPos.y += fHeight; + } + pLeaderLayoutItem->m_sPos.y = 0; + switch(pLeaderLayoutItem->m_pFormNode->GetEnum(XFA_ATTRIBUTE_HAlign)) { + case XFA_ATTRIBUTEENUM_Left: + default: + pLeaderLayoutItem->m_sPos.x = fLeftInset; + break; + case XFA_ATTRIBUTEENUM_Right: + pLeaderLayoutItem->m_sPos.x = pProcessor->m_pLayoutItem->m_sSize.x - fRightInset - pLeaderLayoutItem->m_sSize.x; + break; + case XFA_ATTRIBUTEENUM_Center: + pLeaderLayoutItem->m_sPos.x = (pProcessor->m_pLayoutItem->m_sSize.x - fLeftInset - fRightInset - pLeaderLayoutItem->m_sSize.x) / 2; + break; + } + pProcessor->m_pLayoutItem->m_sSize.y += fHeight; + pProcessor->m_pLayoutItem->AddChild(pLeaderLayoutItem); +}; +static void XFA_ItemLayoutProcessor_AddPendingNode(CXFA_ItemLayoutProcessor* pProcessor, CXFA_Node* pPendingNode, FX_BOOL bBreakPending) +{ + pProcessor->m_rgPendingNodes.AddTail(pPendingNode); + pProcessor->m_bBreakPending = bBreakPending; +} +static FX_FLOAT XFA_ItemLayoutProcessor_InsertPendingItems(CXFA_ItemLayoutProcessor* pProcessor, CXFA_Node* pCurChildNode) +{ + FX_FLOAT fTotalHeight = 0; + if(pProcessor->m_rgPendingNodes.GetCount() < 1) { + return fTotalHeight; + } + if(pProcessor->m_pLayoutItem == NULL) { + pProcessor->m_pLayoutItem = pProcessor->CreateContentLayoutItem(pCurChildNode); + pProcessor->m_pLayoutItem->m_sSize.Set(0, 0); + } + while(pProcessor->m_rgPendingNodes.GetCount() > 0) { + FX_POSITION pos = pProcessor->m_rgPendingNodes.GetHeadPosition(); + CXFA_Node* pPendingNode = (CXFA_Node*)pProcessor->m_rgPendingNodes.GetAt(pos); + pProcessor->m_rgPendingNodes.RemoveAt(pos); + CXFA_ContentLayoutItemImpl* pPendingLayoutItem = NULL; + CXFA_ItemLayoutProcessor *pPendingProcessor = FX_NEW CXFA_ItemLayoutProcessor(pPendingNode, NULL); +#ifndef _XFA_LAYOUTITEM_ProcessCACHE_ + pPendingProcessor->m_pPageMgrCreateItem = pProcessor->m_pPageMgrCreateItem; +#endif + pPendingProcessor->DoLayout(FALSE, XFA_LAYOUT_FLOAT_MAX); + pPendingLayoutItem = pPendingProcessor->HasLayoutItem() ? pPendingProcessor->ExtractLayoutItem() : NULL; + delete pPendingProcessor; + if(pPendingLayoutItem) { + XFA_ItemLayoutProcessor_AddLeaderAfterSplit(pProcessor, pPendingLayoutItem); + if(pProcessor->m_bBreakPending) { + fTotalHeight += pPendingLayoutItem->m_sSize.y; + } + } + } + return fTotalHeight; +} +FX_FLOAT CXFA_ItemLayoutProcessor::InsertKeepLayoutItems() +{ + FX_FLOAT fTotalHeight = 0; + if(m_arrayKeepItems.GetSize()) { + if(m_pLayoutItem == NULL) { + m_pLayoutItem = CreateContentLayoutItem(m_pFormNode); + m_pLayoutItem->m_sSize.Set(0, 0); + } + for(FX_INT32 iIndex = m_arrayKeepItems.GetSize() - 1; iIndex >= 0 ; iIndex --) { + XFA_ItemLayoutProcessor_AddLeaderAfterSplit(this, m_arrayKeepItems[iIndex]); + fTotalHeight += m_arrayKeepItems[iIndex]->m_sSize.y; + } + m_arrayKeepItems.RemoveAll(); + } + return fTotalHeight; +} +FX_BOOL CXFA_ItemLayoutProcessor::ProcessKeepForSplite(CXFA_ItemLayoutProcessor* pParentProcessor, CXFA_ItemLayoutProcessor* pChildProcessor, XFA_ItemLayoutProcessorResult eRetValue, + CFX_ArrayTemplate& rgCurLineLayoutItem, FX_FLOAT& fContentCurRowAvailWidth, + FX_FLOAT& fContentCurRowHeight, FX_FLOAT& fContentCurRowY, FX_BOOL& bAddedItemInRow, FX_BOOL& bForceEndPage, XFA_ItemLayoutProcessorResult& result) +{ + if(pParentProcessor == NULL || pChildProcessor == NULL) { + return FALSE; + } + if(pParentProcessor->m_pCurChildNode->GetIntact() != XFA_ATTRIBUTEENUM_None || !pChildProcessor->m_bHasAvailHeight) { + if(XFA_ExistContainerKeep(pParentProcessor->m_pCurChildNode, TRUE)) { + FX_FLOAT fChildWidth, fChildHeight; + pChildProcessor->GetCurrentComponentSize(fChildWidth, fChildHeight); + CFX_ArrayTemplate keepLayoutItems; + if(pParentProcessor->JudgePutNextPage(pParentProcessor->m_pLayoutItem, fChildHeight, keepLayoutItems)) { + m_arrayKeepItems.RemoveAll(); + for(FX_INT32 iIndex = 0; iIndex < keepLayoutItems.GetSize(); iIndex++) { + CXFA_ContentLayoutItemImpl* pItem = keepLayoutItems.GetAt(iIndex); + pParentProcessor->m_pLayoutItem->RemoveChild(pItem); + fContentCurRowY -= pItem->m_sSize.y; + m_arrayKeepItems.Add(pItem); + } + bAddedItemInRow = TRUE; + bForceEndPage = TRUE; + result = XFA_ItemLayoutProcessorResult_PageFullBreak; + return TRUE; + } + rgCurLineLayoutItem.Add(pChildProcessor->ExtractLayoutItem()); + bAddedItemInRow = TRUE; + fContentCurRowAvailWidth -= fChildWidth; + if(fContentCurRowHeight < fChildHeight ) { + fContentCurRowHeight = fChildHeight; + } + result = eRetValue; + return TRUE; + } + } + return FALSE; +} +FX_BOOL CXFA_ItemLayoutProcessor::JudgePutNextPage(CXFA_ContentLayoutItemImpl* pParentLayoutItem, FX_FLOAT fChildHeight, CFX_ArrayTemplate &pKeepItems) +{ + if(pParentLayoutItem == NULL) { + return FALSE; + } + FX_FLOAT fItemsHeight = 0; + for(CXFA_ContentLayoutItemImpl* pChildLayoutItem = (CXFA_ContentLayoutItemImpl*)pParentLayoutItem->m_pFirstChild; pChildLayoutItem; pChildLayoutItem = (CXFA_ContentLayoutItemImpl*)pChildLayoutItem->m_pNextSibling) { + if(XFA_ExistContainerKeep(pChildLayoutItem->m_pFormNode, FALSE)) { + pKeepItems.Add(pChildLayoutItem); + fItemsHeight += pChildLayoutItem->m_sSize.y; + } else { + pKeepItems.RemoveAll(); + fItemsHeight = 0; + } + } + fItemsHeight += fChildHeight; + if(m_pPageMgr->GetNextAvailContentHeight(fItemsHeight)) { + return TRUE; + } + return FALSE; +} +void CXFA_ItemLayoutProcessor::ProcessUnUseBinds(CXFA_Node* pFormNode) +{ + if(!pFormNode) { + return; + } + CXFA_NodeIteratorTemplate sIterator(pFormNode); + for(CXFA_Node *pNode = sIterator.MoveToNext(); pNode; pNode = sIterator.MoveToNext()) { + if(pNode->IsContainerNode()) { + CXFA_Node* pBindNode = pNode->GetBindData(); + if (pBindNode) { + pBindNode->RemoveBindItem(pNode); + pNode->SetObject(XFA_ATTRIBUTE_BindingNode, NULL); + } + } + pNode->SetFlag(XFA_NODEFLAG_UnusedNode); + } +} +void CXFA_ItemLayoutProcessor::ProcessUnUseOverFlow(CXFA_Node* pLeaderNode, CXFA_Node* pTrailerNode, CXFA_ContentLayoutItemImpl* pTrailerItem, CXFA_Node* pFormNode) +{ + ProcessUnUseBinds(pLeaderNode); + ProcessUnUseBinds(pTrailerNode); + if(pFormNode == NULL) { + return; + } + if(pFormNode->GetClassID() == XFA_ELEMENT_Overflow || pFormNode->GetClassID() == XFA_ELEMENT_Break) { + pFormNode = pFormNode->GetNodeItem(XFA_NODEITEM_Parent); + } + if(pLeaderNode && pFormNode) { + pFormNode->RemoveChild(pLeaderNode); + } + if(pTrailerNode && pFormNode) { + pFormNode->RemoveChild(pTrailerNode); + } + if(pTrailerItem) { + XFA_ReleaseLayoutItem(pTrailerItem); + } +} +static XFA_ItemLayoutProcessorResult XFA_ItemLayoutProcessor_InsertFlowedItem(CXFA_ItemLayoutProcessor* pThis, CXFA_ItemLayoutProcessor*& pProcessor, + FX_BOOL bContainerWidthAutoSize, FX_BOOL bContainerHeightAutoSize, FX_FLOAT fContainerHeight, XFA_ATTRIBUTEENUM eFlowStrategy, FX_UINT8& uCurHAlignState, CFX_ArrayTemplate (&rgCurLineLayoutItems)[3], + FX_BOOL bUseBreakControl, FX_FLOAT fAvailHeight, FX_FLOAT fRealHeight, FX_FLOAT& fContentCurRowY, FX_FLOAT& fContentWidthLimit, FX_FLOAT& fContentCurRowAvailWidth, + FX_FLOAT& fContentCurRowHeight, FX_BOOL& bAddedItemInRow, FX_BOOL& bForceEndPage, CXFA_LayoutContext* pLayoutContext = NULL, FX_BOOL bNewRow = FALSE) +{ + FX_BOOL bTakeSpace = XFA_ItemLayoutProcessor_IsTakingSpace(pProcessor->m_pFormNode); + FX_UINT8 uHAlign = XFA_ItemLayoutProcessor_HAlignEnumToInt(pThis->m_pCurChildNode->GetEnum(XFA_ATTRIBUTE_HAlign)); + if(bContainerWidthAutoSize) { + uHAlign = 0; + } + if((eFlowStrategy != XFA_ATTRIBUTEENUM_Rl_tb && uHAlign < uCurHAlignState) || (eFlowStrategy == XFA_ATTRIBUTEENUM_Rl_tb && uHAlign > uCurHAlignState)) { + return XFA_ItemLayoutProcessorResult_RowFullBreak; + } + uCurHAlignState = uHAlign; + FX_BOOL bIsOwnSplite = pProcessor->m_pFormNode->GetIntact() == XFA_ATTRIBUTEENUM_None; + FX_BOOL bUseRealHeight = bTakeSpace && bContainerHeightAutoSize && bIsOwnSplite + && pProcessor->m_pFormNode->GetNodeItem(XFA_NODEITEM_Parent)->GetIntact() == XFA_ATTRIBUTEENUM_None; + FX_BOOL bIsTransHeight = bTakeSpace; + if(bIsTransHeight && !bIsOwnSplite) { + FX_BOOL bRootForceTb = FALSE; + XFA_ATTRIBUTEENUM eLayoutStrategy = XFA_ItemLayoutProcessor_GetLayout(pProcessor->m_pFormNode, bRootForceTb); + if(eLayoutStrategy == XFA_ATTRIBUTEENUM_Lr_tb || eLayoutStrategy == XFA_ATTRIBUTEENUM_Rl_tb) { + bIsTransHeight = FALSE; + } + } + FX_BOOL bUseInherited = FALSE; + CXFA_LayoutContext layoutContext; + if (pThis->m_pPageMgr) { + CXFA_Node* pOverflowNode = pThis->m_pPageMgr->QueryOverflow(pThis->m_pFormNode); + if(pOverflowNode) { + layoutContext.m_pOverflowNode = pOverflowNode; + layoutContext.m_pOverflowProcessor = pThis; + pLayoutContext = &layoutContext; + } + } + XFA_ItemLayoutProcessorResult eRetValue = XFA_ItemLayoutProcessorResult_Done; + if(!bNewRow || pProcessor->m_ePreProcessRs == XFA_ItemLayoutProcessorResult_Done) { + eRetValue = pProcessor->DoLayout(bTakeSpace ? bUseBreakControl : FALSE, bUseRealHeight ? + fRealHeight - fContentCurRowY : XFA_LAYOUT_FLOAT_MAX, bIsTransHeight ? fRealHeight - fContentCurRowY : XFA_LAYOUT_FLOAT_MAX, pLayoutContext); + pProcessor->m_ePreProcessRs = eRetValue; + } else { + eRetValue = pProcessor->m_ePreProcessRs; + pProcessor->m_ePreProcessRs = XFA_ItemLayoutProcessorResult_Done; + } + if (pProcessor->HasLayoutItem() == FALSE) { + return eRetValue; + } + FX_FLOAT fChildWidth, fChildHeight; + pProcessor->GetCurrentComponentSize(fChildWidth, fChildHeight); + if (bUseRealHeight && fRealHeight < XFA_LAYOUT_FLOAT_PERCISION) { + fRealHeight = XFA_LAYOUT_FLOAT_MAX; + fAvailHeight = XFA_LAYOUT_FLOAT_MAX; + } + if (!bTakeSpace || (fChildWidth <= fContentCurRowAvailWidth + XFA_LAYOUT_FLOAT_PERCISION) || (fContentWidthLimit - fContentCurRowAvailWidth <= XFA_LAYOUT_FLOAT_PERCISION)) { + CXFA_Node *pOverflowLeaderNode = NULL, *pOverflowTrailerNode = NULL, *pFormNode = NULL; + CXFA_ContentLayoutItemImpl* pTrailerLayoutItem = NULL; + FX_BOOL bIsAddTrailerHeight = FALSE; + if(pThis->m_pPageMgr && pProcessor->m_pFormNode->GetIntact() == XFA_ATTRIBUTEENUM_None) { + pFormNode = pThis->m_pPageMgr->QueryOverflow(pProcessor->m_pFormNode); + if(pFormNode == NULL && pLayoutContext && pLayoutContext->m_pOverflowProcessor) { + pFormNode = pLayoutContext->m_pOverflowNode; + bUseInherited = TRUE; + } + if(pThis->m_pPageMgr->ProcessOverflow(pFormNode, pOverflowLeaderNode, pOverflowTrailerNode, FALSE, FALSE)) { + if(pProcessor->JudgeLeaderOrTrailerForOccur(pOverflowTrailerNode)) { + if(pOverflowTrailerNode) { + CXFA_ItemLayoutProcessor *pOverflowLeaderProcessor = FX_NEW CXFA_ItemLayoutProcessor(pOverflowTrailerNode, NULL); +#ifndef _XFA_LAYOUTITEM_ProcessCACHE_ + pOverflowLeaderProcessor->m_pPageMgrCreateItem = pProcessor->m_pPageMgrCreateItem; +#endif + pOverflowLeaderProcessor->DoLayout(FALSE, XFA_LAYOUT_FLOAT_MAX); + pTrailerLayoutItem = pOverflowLeaderProcessor->HasLayoutItem() ? pOverflowLeaderProcessor->ExtractLayoutItem() : NULL; + delete pOverflowLeaderProcessor; + } + if(bUseInherited) { + bIsAddTrailerHeight = pThis->IsAddNewRowForTrailer(pTrailerLayoutItem); + } else { + bIsAddTrailerHeight = pProcessor->IsAddNewRowForTrailer(pTrailerLayoutItem); + } + if(bIsAddTrailerHeight) { + FX_FLOAT fTrailerHeight = pTrailerLayoutItem->m_sSize.y; + fChildHeight += fTrailerHeight; + bIsAddTrailerHeight = TRUE; + } + } + } + } + if(!bTakeSpace || fContentCurRowY + fChildHeight <= fAvailHeight + XFA_LAYOUT_FLOAT_PERCISION || + (!bContainerHeightAutoSize && pThis->m_fUsedSize + fAvailHeight + XFA_LAYOUT_FLOAT_PERCISION >= fContainerHeight)) { + if(!bTakeSpace || eRetValue == XFA_ItemLayoutProcessorResult_Done) { + if(pProcessor->m_bUseInheriated) { + if(pTrailerLayoutItem) { + XFA_ItemLayoutProcessor_AddTrailerBeforeSplit(pProcessor, fChildHeight, pTrailerLayoutItem); + } + if(pProcessor->JudgeLeaderOrTrailerForOccur(pOverflowLeaderNode)) { + XFA_ItemLayoutProcessor_AddPendingNode(pProcessor, pOverflowLeaderNode, FALSE); + } + pProcessor->m_bUseInheriated = FALSE; + } else { + if(bIsAddTrailerHeight) { + fChildHeight -= pTrailerLayoutItem->m_sSize.y; + } + pProcessor->ProcessUnUseOverFlow(pOverflowLeaderNode, pOverflowTrailerNode, pTrailerLayoutItem, pFormNode); + } + CXFA_ContentLayoutItemImpl* pChildLayoutItem = pProcessor->ExtractLayoutItem(); + if(XFA_ExistContainerKeep(pProcessor->m_pFormNode, FALSE) && pProcessor->m_pFormNode->GetIntact() == XFA_ATTRIBUTEENUM_None) { + pThis->m_arrayKeepItems.Add(pChildLayoutItem); + } else { + pThis->m_arrayKeepItems.RemoveAll(); + } + rgCurLineLayoutItems[uHAlign].Add(pChildLayoutItem); + bAddedItemInRow = TRUE; + if(bTakeSpace) { + fContentCurRowAvailWidth -= fChildWidth; + if(fContentCurRowHeight < fChildHeight ) { + fContentCurRowHeight = fChildHeight; + } + } + return XFA_ItemLayoutProcessorResult_Done; + } else { + if(eRetValue == XFA_ItemLayoutProcessorResult_PageFullBreak) { + if(pProcessor->m_bUseInheriated) { + if(pTrailerLayoutItem) { + XFA_ItemLayoutProcessor_AddTrailerBeforeSplit(pProcessor, fChildHeight, pTrailerLayoutItem); + } + if(pProcessor->JudgeLeaderOrTrailerForOccur(pOverflowLeaderNode)) { + XFA_ItemLayoutProcessor_AddPendingNode(pProcessor, pOverflowLeaderNode, FALSE); + } + pProcessor->m_bUseInheriated = FALSE; + } else { + if(bIsAddTrailerHeight) { + fChildHeight -= pTrailerLayoutItem->m_sSize.y; + } + pProcessor->ProcessUnUseOverFlow(pOverflowLeaderNode, pOverflowTrailerNode, pTrailerLayoutItem, pFormNode); + } + } + rgCurLineLayoutItems[uHAlign].Add(pProcessor->ExtractLayoutItem()); + bAddedItemInRow = TRUE; + fContentCurRowAvailWidth -= fChildWidth; + if(fContentCurRowHeight < fChildHeight ) { + fContentCurRowHeight = fChildHeight; + } + return eRetValue; + } + } else { + XFA_ItemLayoutProcessorResult eResult; + if(pThis->ProcessKeepForSplite(pThis, pProcessor, eRetValue, rgCurLineLayoutItems[uHAlign], + fContentCurRowAvailWidth, fContentCurRowHeight, fContentCurRowY, bAddedItemInRow, bForceEndPage, eResult)) { + return eResult; + } + bForceEndPage = TRUE; + FX_FLOAT fSplitPos = pProcessor->FindSplitPos(fAvailHeight - fContentCurRowY); + if (fSplitPos > XFA_LAYOUT_FLOAT_PERCISION) { + XFA_ATTRIBUTEENUM eLayout = pProcessor->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout); + if(eLayout == XFA_ATTRIBUTEENUM_Tb && eRetValue == XFA_ItemLayoutProcessorResult_Done) { + pProcessor->ProcessUnUseOverFlow(pOverflowLeaderNode, pOverflowTrailerNode, pTrailerLayoutItem, pFormNode); + rgCurLineLayoutItems[uHAlign].Add(pProcessor->ExtractLayoutItem()); + bAddedItemInRow = TRUE; + if(bTakeSpace) { + fContentCurRowAvailWidth -= fChildWidth; + if(fContentCurRowHeight < fChildHeight ) { + fContentCurRowHeight = fChildHeight; + } + } + return XFA_ItemLayoutProcessorResult_PageFullBreak; + } + CXFA_Node *pTempLeaderNode = NULL, *pTempTrailerNode = NULL; + if(pThis->m_pPageMgr && !pProcessor->m_bUseInheriated && eRetValue != XFA_ItemLayoutProcessorResult_PageFullBreak) { + pThis->m_pPageMgr->ProcessOverflow(pFormNode, pTempLeaderNode, pTempTrailerNode, FALSE, TRUE); + } + if(pTrailerLayoutItem && bIsAddTrailerHeight) { + XFA_ItemLayoutProcessor_AddTrailerBeforeSplit(pProcessor, fSplitPos, pTrailerLayoutItem, bUseInherited); + } else { + pProcessor->SplitLayoutItem(fSplitPos); + } + if(bUseInherited) { + pProcessor->ProcessUnUseOverFlow(pOverflowLeaderNode, pOverflowTrailerNode, pTrailerLayoutItem, pFormNode); + pThis->m_bUseInheriated = TRUE; + } else { + if(pProcessor->m_pLayoutItem->m_pFirstChild && pProcessor->m_pLayoutItem->m_pFirstChild->m_pNextSibling == NULL + && pProcessor->m_pLayoutItem->m_pFirstChild->m_pFormNode->HasFlag(XFA_NODEFLAG_LayoutGeneratedNode)) { + pProcessor->ProcessUnUseOverFlow(pOverflowLeaderNode, pOverflowTrailerNode, pTrailerLayoutItem, pFormNode); + } else { + if(pProcessor->JudgeLeaderOrTrailerForOccur(pOverflowLeaderNode)) { + XFA_ItemLayoutProcessor_AddPendingNode(pProcessor, pOverflowLeaderNode, FALSE); + } + } + } + if(pProcessor->m_pLayoutItem->m_pNextSibling) { + pProcessor->GetCurrentComponentSize(fChildWidth, fChildHeight); + rgCurLineLayoutItems[uHAlign].Add(pProcessor->ExtractLayoutItem()); + bAddedItemInRow = TRUE; + if(bTakeSpace) { + fContentCurRowAvailWidth -= fChildWidth; + if(fContentCurRowHeight < fChildHeight ) { + fContentCurRowHeight = fChildHeight; + } + } + } + return XFA_ItemLayoutProcessorResult_PageFullBreak; + } else if (fContentCurRowY <= XFA_LAYOUT_FLOAT_PERCISION) { + pProcessor->GetCurrentComponentSize(fChildWidth, fChildHeight); + if(pProcessor->m_pPageMgr->GetNextAvailContentHeight(fChildHeight)) { + CXFA_Node *pTempLeaderNode = NULL, *pTempTrailerNode = NULL; + if(pThis->m_pPageMgr) { + if(pFormNode == NULL && pLayoutContext != NULL) { + pFormNode = pLayoutContext->m_pOverflowProcessor->m_pFormNode; + } + pThis->m_pPageMgr->ProcessOverflow(pFormNode, pTempLeaderNode, pTempTrailerNode, FALSE, TRUE); + } + if(bUseInherited) { + pProcessor->ProcessUnUseOverFlow(pOverflowLeaderNode, pOverflowTrailerNode, pTrailerLayoutItem, pFormNode); + pThis->m_bUseInheriated = TRUE; + } + return XFA_ItemLayoutProcessorResult_PageFullBreak; + } + rgCurLineLayoutItems[uHAlign].Add(pProcessor->ExtractLayoutItem()); + bAddedItemInRow = TRUE; + if(bTakeSpace) { + fContentCurRowAvailWidth -= fChildWidth; + if(fContentCurRowHeight < fChildHeight ) { + fContentCurRowHeight = fChildHeight; + } + } + if(eRetValue == XFA_ItemLayoutProcessorResult_Done) { + bForceEndPage = FALSE; + } + return eRetValue; + } else { + XFA_ATTRIBUTEENUM eLayout = pProcessor->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout); + if(pProcessor->m_pFormNode->GetIntact() == XFA_ATTRIBUTEENUM_None && eLayout == XFA_ATTRIBUTEENUM_Tb) { + if(pThis->m_pPageMgr) { + pThis->m_pPageMgr->ProcessOverflow(pFormNode, pOverflowLeaderNode, pOverflowTrailerNode, FALSE, TRUE); + } + if(pTrailerLayoutItem) { + XFA_ItemLayoutProcessor_AddTrailerBeforeSplit(pProcessor, fSplitPos, pTrailerLayoutItem); + } + if(pProcessor->JudgeLeaderOrTrailerForOccur(pOverflowLeaderNode)) { + XFA_ItemLayoutProcessor_AddPendingNode(pProcessor, pOverflowLeaderNode, FALSE); + } + } else { + if(eRetValue == XFA_ItemLayoutProcessorResult_Done) { + if(pFormNode == NULL && pLayoutContext != NULL) { + pFormNode = pLayoutContext->m_pOverflowProcessor->m_pFormNode; + } + if(pThis->m_pPageMgr) { + pThis->m_pPageMgr->ProcessOverflow(pFormNode, pOverflowLeaderNode, pOverflowTrailerNode, FALSE, TRUE); + } + if(bUseInherited) { + pProcessor->ProcessUnUseOverFlow(pOverflowLeaderNode, pOverflowTrailerNode, pTrailerLayoutItem, pFormNode); + pThis->m_bUseInheriated = TRUE; + } + } + } + return XFA_ItemLayoutProcessorResult_PageFullBreak; + } + } + } else { + return XFA_ItemLayoutProcessorResult_RowFullBreak; + } + return XFA_ItemLayoutProcessorResult_Done; +} +XFA_ItemLayoutProcessorResult CXFA_ItemLayoutProcessor::DoLayoutFlowedContainer(FX_BOOL bUseBreakControl, XFA_ATTRIBUTEENUM eFlowStrategy, FX_FLOAT fHeightLimit, FX_FLOAT fRealHeight, CXFA_LayoutContext* pContext, FX_BOOL bRootForceTb) +{ + m_bHasAvailHeight = TRUE; + FX_FLOAT fContainerWidth = 0, fContainerHeight = 0; + FX_BOOL bBreakDone = FALSE; + FX_BOOL bContainerWidthAutoSize = TRUE, bContainerHeightAutoSize = TRUE; + FX_BOOL bForceEndPage = FALSE; + FX_BOOL bIsManualBreak = FALSE; + if(m_pCurChildPreprocessor) { + m_pCurChildPreprocessor->m_ePreProcessRs = XFA_ItemLayoutProcessorResult_Done; + } + XFA_ItemLayoutProcessor_CalculateContainerSpecfiedSize(m_pFormNode, fContainerWidth, fContainerHeight, bContainerWidthAutoSize, bContainerHeightAutoSize); + if (pContext && pContext->m_bCurColumnWidthAvaiable) { + bContainerWidthAutoSize = FALSE; + fContainerWidth = pContext->m_fCurColumnWidth; + } + if(!bContainerHeightAutoSize) { + fContainerHeight -= m_fUsedSize; + } + if(!bContainerHeightAutoSize) { + CXFA_Node* pParentNode = m_pFormNode->GetNodeItem(XFA_NODEITEM_Parent); + FX_BOOL bFocrTb = FALSE; + if(pParentNode && XFA_ItemLayoutProcessor_GetLayout(pParentNode, bFocrTb) == XFA_ATTRIBUTEENUM_Row) { + CXFA_Node* pChildContainer = m_pFormNode->GetNodeItem(XFA_NODEITEM_FirstChild, XFA_OBJECTTYPE_ContainerNode); + if(pChildContainer && pChildContainer->GetNodeItem(XFA_NODEITEM_NextSibling, XFA_OBJECTTYPE_ContainerNode)) { + fContainerHeight = 0; + bContainerHeightAutoSize = TRUE; + } + } + } + CXFA_Node* pMarginNode = m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin); + FX_FLOAT fLeftInset = 0, fTopInset = 0, fRightInset = 0, fBottomInset = 0; + if(pMarginNode) { + fLeftInset = pMarginNode->GetMeasure(XFA_ATTRIBUTE_LeftInset).ToUnit(XFA_UNIT_Pt); + fTopInset = pMarginNode->GetMeasure(XFA_ATTRIBUTE_TopInset).ToUnit(XFA_UNIT_Pt); + fRightInset = pMarginNode->GetMeasure(XFA_ATTRIBUTE_RightInset).ToUnit(XFA_UNIT_Pt); + fBottomInset = pMarginNode->GetMeasure(XFA_ATTRIBUTE_BottomInset).ToUnit(XFA_UNIT_Pt); + } + FX_FLOAT fContentWidthLimit = bContainerWidthAutoSize ? XFA_LAYOUT_FLOAT_MAX : fContainerWidth - fLeftInset - fRightInset; + FX_FLOAT fContentCalculatedWidth = 0, fContentCalculatedHeight = 0; + FX_FLOAT fAvailHeight = fHeightLimit - fTopInset - fBottomInset; + if(fAvailHeight < 0) { + m_bHasAvailHeight = FALSE; + } + fRealHeight = fRealHeight - fTopInset - fBottomInset; + FX_FLOAT fContentCurRowY = 0; + CXFA_ContentLayoutItemImpl* pLayoutChild = NULL; + if(m_pLayoutItem != NULL) { + if (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages_Done && eFlowStrategy != XFA_ATTRIBUTEENUM_Tb) { + pLayoutChild = (CXFA_ContentLayoutItemImpl*)m_pLayoutItem->m_pFirstChild; + for (CXFA_ContentLayoutItemImpl* pLayoutNext = pLayoutChild; pLayoutNext; pLayoutNext = (CXFA_ContentLayoutItemImpl*)pLayoutNext->m_pNextSibling) { + if (pLayoutNext->m_sPos.y != pLayoutChild->m_sPos.y) { + pLayoutChild = pLayoutNext; + } + } + } + for(CXFA_ContentLayoutItemImpl* pLayoutTempChild = (CXFA_ContentLayoutItemImpl*)m_pLayoutItem->m_pFirstChild; pLayoutTempChild != pLayoutChild; pLayoutTempChild = (CXFA_ContentLayoutItemImpl*)pLayoutTempChild->m_pNextSibling) { + if(XFA_ItemLayoutProcessor_IsTakingSpace(pLayoutTempChild->m_pFormNode)) { + FX_FLOAT fChildContentWidth = pLayoutTempChild->m_sPos.x + pLayoutTempChild->m_sSize.x; + FX_FLOAT fChildContentHeight = pLayoutTempChild->m_sPos.y + pLayoutTempChild->m_sSize.y; + if(fContentCalculatedWidth < fChildContentWidth) { + fContentCalculatedWidth = fChildContentWidth; + } + if(fContentCalculatedHeight < fChildContentHeight) { + fContentCalculatedHeight = fChildContentHeight; + } + } + } + if (pLayoutChild) { + fContentCurRowY = pLayoutChild->m_sPos.y; + } else { + fContentCurRowY = fContentCalculatedHeight; + } + } + fContentCurRowY += InsertKeepLayoutItems(); + if(m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages_None) { + XFA_ItemLayoutProcessor_GotoNextContainerNode(m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, TRUE); + } + fContentCurRowY += XFA_ItemLayoutProcessor_InsertPendingItems(this, m_pFormNode); + if(m_pCurChildPreprocessor && m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages_Container) { + if(XFA_ExistContainerKeep(m_pCurChildPreprocessor->GetFormNode(), FALSE)) { + m_pKeepHeadNode = m_pCurChildNode; + m_bIsProcessKeep = TRUE; + m_nCurChildNodeStage = XFA_ItemLayoutProcessorStages_Keep; + } + } + while(m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages_Done) { + FX_FLOAT fContentCurRowHeight = 0; + FX_FLOAT fContentCurRowAvailWidth = fContentWidthLimit; + m_fWidthLimite = fContentCurRowAvailWidth; + CFX_ArrayTemplate rgCurLineLayoutItems[3]; + FX_UINT8 uCurHAlignState = (eFlowStrategy != XFA_ATTRIBUTEENUM_Rl_tb ? 0 : 2); + if (pLayoutChild) { + for (CXFA_ContentLayoutItemImpl* pLayoutNext = pLayoutChild; pLayoutNext; pLayoutNext = (CXFA_ContentLayoutItemImpl*)pLayoutNext->m_pNextSibling) { + if (pLayoutNext->m_pNextSibling == NULL && m_pCurChildPreprocessor && m_pCurChildPreprocessor->m_pFormNode == pLayoutNext->m_pFormNode) { + pLayoutNext->m_pNext = m_pCurChildPreprocessor->m_pLayoutItem; + m_pCurChildPreprocessor->m_pLayoutItem = pLayoutNext; + break; + } + FX_UINT8 uHAlign = XFA_ItemLayoutProcessor_HAlignEnumToInt(pLayoutNext->m_pFormNode->GetEnum(XFA_ATTRIBUTE_HAlign)); + rgCurLineLayoutItems[uHAlign].Add(pLayoutNext); + if (eFlowStrategy == XFA_ATTRIBUTEENUM_Lr_tb) { + if (uHAlign > uCurHAlignState) { + uCurHAlignState = uHAlign; + } + } else if (uHAlign < uCurHAlignState) { + uCurHAlignState = uHAlign; + } + if (XFA_ItemLayoutProcessor_IsTakingSpace(pLayoutNext->m_pFormNode)) { + if (pLayoutNext->m_sSize.y > fContentCurRowHeight) { + fContentCurRowHeight = pLayoutNext->m_sSize.y; + } + fContentCurRowAvailWidth -= pLayoutNext->m_sSize.x; + } + } + if ((CXFA_ContentLayoutItemImpl*)m_pLayoutItem->m_pFirstChild == pLayoutChild) { + m_pLayoutItem->m_pFirstChild = NULL; + } else { + CXFA_ContentLayoutItemImpl* pLayoutNext = (CXFA_ContentLayoutItemImpl*)m_pLayoutItem->m_pFirstChild; + for (; pLayoutNext; pLayoutNext = (CXFA_ContentLayoutItemImpl*)pLayoutNext->m_pNextSibling) { + if ((CXFA_ContentLayoutItemImpl*)pLayoutNext->m_pNextSibling == pLayoutChild) { + pLayoutNext->m_pNextSibling = NULL; + break; + } + } + } + CXFA_ContentLayoutItemImpl* pLayoutNextTemp = (CXFA_ContentLayoutItemImpl*)pLayoutChild; + while (pLayoutNextTemp) { + pLayoutNextTemp->m_pParent = NULL; + CXFA_ContentLayoutItemImpl* pSaveLayoutNext = (CXFA_ContentLayoutItemImpl*)pLayoutNextTemp->m_pNextSibling; + pLayoutNextTemp->m_pNextSibling = NULL; + pLayoutNextTemp = pSaveLayoutNext; + } + pLayoutChild = NULL; + } + while(m_pCurChildNode) { + CXFA_ItemLayoutProcessor* pProcessor = NULL; + FX_BOOL bAddedItemInRow = FALSE; + fContentCurRowY += XFA_ItemLayoutProcessor_InsertPendingItems(this, m_pFormNode); + switch(m_nCurChildNodeStage) { + case XFA_ItemLayoutProcessorStages_Keep: + case XFA_ItemLayoutProcessorStages_None: + break; + case XFA_ItemLayoutProcessorStages_BreakBefore: { + for(FX_INT32 iIndex = 0; iIndex < m_arrayKeepItems.GetSize(); iIndex++) { + CXFA_ContentLayoutItemImpl* pItem = m_arrayKeepItems.GetAt(iIndex); + m_pLayoutItem->RemoveChild(pItem); + fContentCalculatedHeight -= pItem->m_sSize.y; + } + CXFA_Node *pLeaderNode = NULL, *pTrailerNode = NULL; + FX_BOOL bCreatePage = FALSE; + if(bUseBreakControl && m_pPageMgr && m_pPageMgr->ProcessBreakBeforeOrAfter(m_pCurChildNode, TRUE, pLeaderNode, pTrailerNode, bCreatePage) && m_pFormNode->GetClassID() != XFA_ELEMENT_Form + && bCreatePage) { + if(JudgeLeaderOrTrailerForOccur(pLeaderNode)) { + XFA_ItemLayoutProcessor_AddPendingNode(this, pLeaderNode, TRUE); + } + if(JudgeLeaderOrTrailerForOccur(pTrailerNode)) { + if(m_pFormNode->GetNodeItem(XFA_NODEITEM_Parent)->GetClassID() == XFA_ELEMENT_Form && m_pLayoutItem == NULL) { + XFA_ItemLayoutProcessor_AddPendingNode(this, pTrailerNode, TRUE); + } else { + CXFA_ItemLayoutProcessor *pProcessor = FX_NEW CXFA_ItemLayoutProcessor(pTrailerNode, NULL); +#ifndef _XFA_LAYOUTITEM_ProcessCACHE_ + pProcessor->m_pPageMgrCreateItem = m_pPageMgrCreateItem; +#endif + XFA_ItemLayoutProcessor_InsertFlowedItem(this, pProcessor, bContainerWidthAutoSize, bContainerHeightAutoSize, fContainerHeight, eFlowStrategy, uCurHAlignState, + rgCurLineLayoutItems, FALSE, XFA_LAYOUT_FLOAT_MAX, XFA_LAYOUT_FLOAT_MAX, fContentCurRowY, fContentWidthLimit, fContentCurRowAvailWidth, + fContentCurRowHeight, bAddedItemInRow, bForceEndPage, pContext); + delete pProcessor; + pProcessor = NULL; + } + } + XFA_ItemLayoutProcessor_GotoNextContainerNode(m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, TRUE); + bForceEndPage = TRUE; + bIsManualBreak = TRUE; + goto SuspendAndCreateNewRow; + } + } + break; + case XFA_ItemLayoutProcessorStages_BreakAfter: { + XFA_ItemLayoutProcessorResult eResult; + CXFA_Node *pLeaderNode = NULL, *pTrailerNode = NULL; + FX_BOOL bCreatePage = FALSE; + if(bUseBreakControl && m_pPageMgr && m_pPageMgr->ProcessBreakBeforeOrAfter(m_pCurChildNode, FALSE, pLeaderNode, pTrailerNode, bCreatePage) && m_pFormNode->GetClassID() != XFA_ELEMENT_Form) { + if(JudgeLeaderOrTrailerForOccur(pTrailerNode)) { + CXFA_ItemLayoutProcessor *pProcessor = FX_NEW CXFA_ItemLayoutProcessor(pTrailerNode, NULL); +#ifndef _XFA_LAYOUTITEM_ProcessCACHE_ + pProcessor->m_pPageMgrCreateItem = m_pPageMgrCreateItem; +#endif + eResult = XFA_ItemLayoutProcessor_InsertFlowedItem(this, pProcessor, bContainerWidthAutoSize, bContainerHeightAutoSize, fContainerHeight, eFlowStrategy, uCurHAlignState, + rgCurLineLayoutItems, FALSE, XFA_LAYOUT_FLOAT_MAX, XFA_LAYOUT_FLOAT_MAX, fContentCurRowY, fContentWidthLimit, fContentCurRowAvailWidth, + fContentCurRowHeight, bAddedItemInRow, bForceEndPage, pContext); + delete pProcessor; + pProcessor = NULL; + } + if(!bCreatePage) { + if(JudgeLeaderOrTrailerForOccur(pLeaderNode)) { + CalculateRowChildPosition(rgCurLineLayoutItems, eFlowStrategy, bContainerHeightAutoSize, bContainerWidthAutoSize, + fContentCalculatedWidth, fContentCalculatedHeight, fContentCurRowY, fContentCurRowHeight, fContentWidthLimit); + rgCurLineLayoutItems->RemoveAll(); + CXFA_ItemLayoutProcessor *pProcessor = FX_NEW CXFA_ItemLayoutProcessor(pLeaderNode, NULL); +#ifndef _XFA_LAYOUTITEM_ProcessCACHE_ + pProcessor->m_pPageMgrCreateItem = m_pPageMgrCreateItem; +#endif + XFA_ItemLayoutProcessor_InsertFlowedItem(this, pProcessor, bContainerWidthAutoSize, bContainerHeightAutoSize, fContainerHeight, eFlowStrategy, uCurHAlignState, + rgCurLineLayoutItems, FALSE, XFA_LAYOUT_FLOAT_MAX, XFA_LAYOUT_FLOAT_MAX, fContentCurRowY, fContentWidthLimit, fContentCurRowAvailWidth, + fContentCurRowHeight, bAddedItemInRow, bForceEndPage, pContext); + delete pProcessor; + pProcessor = NULL; + } + } else { + if(JudgeLeaderOrTrailerForOccur(pLeaderNode)) { + XFA_ItemLayoutProcessor_AddPendingNode(this, pLeaderNode, TRUE); + } + } + XFA_ItemLayoutProcessor_GotoNextContainerNode(m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, TRUE); + if(bCreatePage) { + bForceEndPage = TRUE; + bIsManualBreak = TRUE; + if(m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages_Done) { + bBreakDone = TRUE; + } + } + goto SuspendAndCreateNewRow; + } + } + break; + case XFA_ItemLayoutProcessorStages_BookendLeader: { + CXFA_Node* pLeaderNode = NULL; + if (m_pCurChildPreprocessor) { + pProcessor = m_pCurChildPreprocessor; + m_pCurChildPreprocessor = NULL; + } else if(m_pPageMgr && m_pPageMgr->ProcessBookendLeaderOrTrailer(m_pCurChildNode, TRUE, pLeaderNode)) { + pProcessor = FX_NEW CXFA_ItemLayoutProcessor(pLeaderNode, m_pPageMgr); +#ifndef _XFA_LAYOUTITEM_ProcessCACHE_ + pProcessor->m_pPageMgrCreateItem = m_pPageMgrCreateItem; +#endif + } + if(pProcessor) { + if(XFA_ItemLayoutProcessor_InsertFlowedItem(this, pProcessor, bContainerWidthAutoSize, bContainerHeightAutoSize, fContainerHeight, eFlowStrategy, uCurHAlignState, + rgCurLineLayoutItems, bUseBreakControl, fAvailHeight, fRealHeight, fContentCurRowY, fContentWidthLimit, fContentCurRowAvailWidth, + fContentCurRowHeight, bAddedItemInRow, bForceEndPage, pContext) != XFA_ItemLayoutProcessorResult_Done) { + goto SuspendAndCreateNewRow; + } else { + delete pProcessor; + pProcessor = NULL; + } + } + } + break; + case XFA_ItemLayoutProcessorStages_BookendTrailer: { + CXFA_Node* pTrailerNode = NULL; + if (m_pCurChildPreprocessor) { + pProcessor = m_pCurChildPreprocessor; + m_pCurChildPreprocessor = NULL; + } else if(m_pPageMgr && m_pPageMgr->ProcessBookendLeaderOrTrailer(m_pCurChildNode, FALSE, pTrailerNode)) { + pProcessor = FX_NEW CXFA_ItemLayoutProcessor(pTrailerNode, m_pPageMgr); +#ifndef _XFA_LAYOUTITEM_ProcessCACHE_ + pProcessor->m_pPageMgrCreateItem = m_pPageMgrCreateItem; +#endif + } + if(pProcessor) { + if(XFA_ItemLayoutProcessor_InsertFlowedItem(this, pProcessor, bContainerWidthAutoSize, bContainerHeightAutoSize, fContainerHeight, eFlowStrategy, uCurHAlignState, + rgCurLineLayoutItems, bUseBreakControl, fAvailHeight, fRealHeight, fContentCurRowY, fContentWidthLimit, fContentCurRowAvailWidth, + fContentCurRowHeight, bAddedItemInRow, bForceEndPage, pContext) != XFA_ItemLayoutProcessorResult_Done) { + goto SuspendAndCreateNewRow; + } else { + delete pProcessor; + pProcessor = NULL; + } + } + } + break; + case XFA_ItemLayoutProcessorStages_Container: + ASSERT(m_pCurChildNode->IsContainerNode()); + if(m_pCurChildNode->GetClassID() == XFA_ELEMENT_Variables) { + break; + } + if(fContentCurRowY >= fHeightLimit + XFA_LAYOUT_FLOAT_PERCISION && XFA_ItemLayoutProcessor_IsTakingSpace(m_pCurChildNode)) { + bForceEndPage = TRUE; + goto SuspendAndCreateNewRow; + } + if(m_pCurChildNode->IsContainerNode()) { + FX_BOOL bNewRow = FALSE; + if (m_pCurChildPreprocessor) { + pProcessor = m_pCurChildPreprocessor; + m_pCurChildPreprocessor = NULL; + bNewRow = TRUE; + } else { + pProcessor = FX_NEW CXFA_ItemLayoutProcessor(m_pCurChildNode, m_pPageMgr); +#ifndef _XFA_LAYOUTITEM_ProcessCACHE_ + pProcessor->m_pPageMgrCreateItem = m_pPageMgrCreateItem; +#endif + } + XFA_ItemLayoutProcessor_InsertPendingItems(pProcessor, m_pCurChildNode); + XFA_ItemLayoutProcessorResult rs = XFA_ItemLayoutProcessor_InsertFlowedItem(this, pProcessor, bContainerWidthAutoSize, bContainerHeightAutoSize, fContainerHeight, eFlowStrategy, uCurHAlignState, + rgCurLineLayoutItems, bUseBreakControl, fAvailHeight, fRealHeight, fContentCurRowY, fContentWidthLimit, fContentCurRowAvailWidth, + fContentCurRowHeight, bAddedItemInRow, bForceEndPage, pContext, bNewRow); + switch(rs) { + case XFA_ItemLayoutProcessorResult_ManualBreak: + bIsManualBreak = TRUE; + case XFA_ItemLayoutProcessorResult_PageFullBreak: + bForceEndPage = TRUE; + case XFA_ItemLayoutProcessorResult_RowFullBreak: + goto SuspendAndCreateNewRow; + case XFA_ItemLayoutProcessorResult_Done: + default: + fContentCurRowY += XFA_ItemLayoutProcessor_InsertPendingItems(pProcessor, m_pCurChildNode); + delete pProcessor; + pProcessor = NULL; + } + } + break; + case XFA_ItemLayoutProcessorStages_Done: + break; + default: + break; + } + XFA_ItemLayoutProcessor_GotoNextContainerNode(m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, TRUE); + if(bAddedItemInRow && eFlowStrategy == XFA_ATTRIBUTEENUM_Tb) { + break; + } else { + continue; + } +SuspendAndCreateNewRow: + if (pProcessor) { + m_pCurChildPreprocessor = pProcessor; + } + break; + } + CalculateRowChildPosition(rgCurLineLayoutItems, eFlowStrategy, bContainerHeightAutoSize, bContainerWidthAutoSize, + fContentCalculatedWidth, fContentCalculatedHeight, fContentCurRowY, fContentCurRowHeight, fContentWidthLimit, bRootForceTb); + m_fWidthLimite = fContentCurRowAvailWidth; + if(bForceEndPage) { + break; + } + } + FX_BOOL bRetValue = (m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages_Done && m_rgPendingNodes.GetCount() == 0); + if(bBreakDone) { + bRetValue = FALSE; + } + XFA_ItemLayoutProcessor_CalculateContainerComponentSizeFromContentSize(m_pFormNode, bContainerWidthAutoSize, fContentCalculatedWidth, fContainerWidth, bContainerHeightAutoSize, fContentCalculatedHeight, fContainerHeight); + if(fContainerHeight >= XFA_LAYOUT_FLOAT_PERCISION || m_pLayoutItem || bRetValue) { + if(m_pLayoutItem == NULL) { + m_pLayoutItem = CreateContentLayoutItem(m_pFormNode); + } + if(fContainerHeight < 0 ) { + fContainerHeight = 0; + } + SetCurrentComponentSize(fContainerWidth, fContainerHeight); + if(bForceEndPage) { + m_fUsedSize = 0; + } else { + m_fUsedSize += m_pLayoutItem->m_sSize.y; + } + } + return bRetValue ? XFA_ItemLayoutProcessorResult_Done : (bIsManualBreak ? XFA_ItemLayoutProcessorResult_ManualBreak : XFA_ItemLayoutProcessorResult_PageFullBreak); +} +FX_BOOL CXFA_ItemLayoutProcessor::CalculateRowChildPosition(CFX_ArrayTemplate(&rgCurLineLayoutItems)[3], XFA_ATTRIBUTEENUM eFlowStrategy, FX_BOOL bContainerHeightAutoSize, + FX_BOOL bContainerWidthAutoSize, FX_FLOAT& fContentCalculatedWidth, FX_FLOAT& fContentCalculatedHeight, FX_FLOAT& fContentCurRowY, FX_FLOAT fContentCurRowHeight, FX_FLOAT fContentWidthLimit, FX_BOOL bRootForceTb) +{ + FX_INT32 nGroupLengths[3] = {0, 0, 0}; + FX_FLOAT fGroupWidths[3] = {0, 0, 0}; + FX_INT32 nTotalLength = 0; + for(FX_INT32 i = 0; i < 3; i ++) { + nGroupLengths[i] = rgCurLineLayoutItems[i].GetSize(); + for(FX_INT32 c = nGroupLengths[i], j = 0; j < c; j++) { + nTotalLength++; + if(XFA_ItemLayoutProcessor_IsTakingSpace(rgCurLineLayoutItems[i][j]->m_pFormNode)) { + fGroupWidths[i] += rgCurLineLayoutItems[i][j]->m_sSize.x; + } + } + } + if(!nTotalLength) { + if(bContainerHeightAutoSize) { + FX_FLOAT fNewHeight = fContentCurRowY; + if(fContentCalculatedHeight > fNewHeight) { + fContentCalculatedHeight = fNewHeight; + } + } + return FALSE; + } + if(m_pLayoutItem == NULL) { + m_pLayoutItem = CreateContentLayoutItem(m_pFormNode); + } + if (eFlowStrategy != XFA_ATTRIBUTEENUM_Rl_tb) { + FX_FLOAT fCurPos; + fCurPos = 0; + for(FX_INT32 c = nGroupLengths[0], j = 0; j < c; j++) { + if(bRootForceTb) { + FX_FLOAT fAbsoluteX, fAbsoluteY; + CalculatePositionedContainerPos(rgCurLineLayoutItems[0][j]->m_pFormNode, rgCurLineLayoutItems[0][j]->m_sSize.x, rgCurLineLayoutItems[0][j]->m_sSize.y, fAbsoluteX, fAbsoluteY); + rgCurLineLayoutItems[0][j]->m_sPos.Set(fAbsoluteX, fAbsoluteY); + } else { + rgCurLineLayoutItems[0][j]->m_sPos.Set(fCurPos, fContentCurRowY); + if(XFA_ItemLayoutProcessor_IsTakingSpace(rgCurLineLayoutItems[0][j]->m_pFormNode)) { + fCurPos += rgCurLineLayoutItems[0][j]->m_sSize.x; + } + } + m_pLayoutItem->AddChild(rgCurLineLayoutItems[0][j]); + m_fLastRowWidth = fCurPos; + } + fCurPos = (fContentWidthLimit + fGroupWidths[0] - fGroupWidths[1] - fGroupWidths[2]) / 2; + for(FX_INT32 c = nGroupLengths[1], j = 0; j < c; j++) { + if(bRootForceTb) { + FX_FLOAT fAbsoluteX, fAbsoluteY; + CalculatePositionedContainerPos(rgCurLineLayoutItems[1][j]->m_pFormNode, rgCurLineLayoutItems[1][j]->m_sSize.x, rgCurLineLayoutItems[1][j]->m_sSize.y, fAbsoluteX, fAbsoluteY); + rgCurLineLayoutItems[1][j]->m_sPos.Set(fAbsoluteX, fAbsoluteY); + } else { + rgCurLineLayoutItems[1][j]->m_sPos.Set(fCurPos, fContentCurRowY); + if(XFA_ItemLayoutProcessor_IsTakingSpace(rgCurLineLayoutItems[1][j]->m_pFormNode)) { + fCurPos += rgCurLineLayoutItems[1][j]->m_sSize.x; + } + } + m_pLayoutItem->AddChild(rgCurLineLayoutItems[1][j]); + m_fLastRowWidth = fCurPos; + } + fCurPos = fContentWidthLimit - fGroupWidths[2]; + for(FX_INT32 c = nGroupLengths[2], j = 0; j < c; j++) { + if(bRootForceTb) { + FX_FLOAT fAbsoluteX, fAbsoluteY; + CalculatePositionedContainerPos(rgCurLineLayoutItems[2][j]->m_pFormNode, rgCurLineLayoutItems[2][j]->m_sSize.x, rgCurLineLayoutItems[2][j]->m_sSize.y, fAbsoluteX, fAbsoluteY); + rgCurLineLayoutItems[2][j]->m_sPos.Set(fAbsoluteX, fAbsoluteY); + } else { + rgCurLineLayoutItems[2][j]->m_sPos.Set(fCurPos, fContentCurRowY); + if(XFA_ItemLayoutProcessor_IsTakingSpace(rgCurLineLayoutItems[2][j]->m_pFormNode)) { + fCurPos += rgCurLineLayoutItems[2][j]->m_sSize.x; + } + } + m_pLayoutItem->AddChild(rgCurLineLayoutItems[2][j]); + m_fLastRowWidth = fCurPos; + } + } else { + FX_FLOAT fCurPos; + fCurPos = fGroupWidths[0]; + for(FX_INT32 c = nGroupLengths[0], j = 0; j < c; j++) { + if(XFA_ItemLayoutProcessor_IsTakingSpace(rgCurLineLayoutItems[0][j]->m_pFormNode)) { + fCurPos -= rgCurLineLayoutItems[0][j]->m_sSize.x; + } + rgCurLineLayoutItems[0][j]->m_sPos.Set(fCurPos, fContentCurRowY); + m_pLayoutItem->AddChild(rgCurLineLayoutItems[0][j]); + m_fLastRowWidth = fCurPos; + } + fCurPos = (fContentWidthLimit + fGroupWidths[0] + fGroupWidths[1] - fGroupWidths[2]) / 2; + for(FX_INT32 c = nGroupLengths[1], j = 0; j < c; j++) { + if(XFA_ItemLayoutProcessor_IsTakingSpace(rgCurLineLayoutItems[1][j]->m_pFormNode)) { + fCurPos -= rgCurLineLayoutItems[1][j]->m_sSize.x; + } + rgCurLineLayoutItems[1][j]->m_sPos.Set(fCurPos, fContentCurRowY); + m_pLayoutItem->AddChild(rgCurLineLayoutItems[1][j]); + m_fLastRowWidth = fCurPos; + } + fCurPos = fContentWidthLimit; + for(FX_INT32 c = nGroupLengths[2], j = 0; j < c; j++) { + if(XFA_ItemLayoutProcessor_IsTakingSpace(rgCurLineLayoutItems[2][j]->m_pFormNode)) { + fCurPos -= rgCurLineLayoutItems[2][j]->m_sSize.x; + } + rgCurLineLayoutItems[2][j]->m_sPos.Set(fCurPos, fContentCurRowY); + m_pLayoutItem->AddChild(rgCurLineLayoutItems[2][j]); + m_fLastRowWidth = fCurPos; + } + } + m_fLastRowY = fContentCurRowY; + fContentCurRowY += fContentCurRowHeight; + if(bContainerWidthAutoSize) { + FX_FLOAT fChildSuppliedWidth = fGroupWidths[0]; + if(fContentWidthLimit < XFA_LAYOUT_FLOAT_MAX && fContentWidthLimit > fChildSuppliedWidth) { + fChildSuppliedWidth = fContentWidthLimit; + } + if (fContentCalculatedWidth < fChildSuppliedWidth) { + fContentCalculatedWidth = fChildSuppliedWidth; + } + } + if(bContainerHeightAutoSize) { + FX_FLOAT fChildSuppliedHeight = fContentCurRowY; + if(fContentCalculatedHeight < fChildSuppliedHeight) { + fContentCalculatedHeight = fChildSuppliedHeight; + } + } + return TRUE; +} +CXFA_Node* CXFA_ItemLayoutProcessor::GetSubformSetParent(CXFA_Node* pSubformSet) +{ + if(pSubformSet && pSubformSet->GetClassID() == XFA_ELEMENT_SubformSet) { + CXFA_Node* pParent = pSubformSet->GetNodeItem(XFA_NODEITEM_Parent); + while(pParent) { + if(pParent->GetClassID() != XFA_ELEMENT_SubformSet) { + return pParent; + } + pParent = pParent->GetNodeItem(XFA_NODEITEM_Parent); + } + } + return pSubformSet; +} +void CXFA_ItemLayoutProcessor::DoLayoutField() +{ + if(m_pLayoutItem != NULL) { + return; + } + ASSERT(m_pCurChildNode == XFA_LAYOUT_INVALIDNODE); + m_pLayoutItem = CreateContentLayoutItem(m_pFormNode); + if (!m_pLayoutItem) { + return; + } + CXFA_Document* pDocument = m_pFormNode->GetDocument(); + IXFA_Notify* pNotify = pDocument->GetParser()->GetNotify(); + FX_FLOAT fHeight = -1; + FX_FLOAT fWidth = -1; + pNotify->StartFieldDrawLayout(m_pFormNode, fWidth, fHeight); + FX_INT32 nRotate = FXSYS_round(m_pFormNode->GetMeasure(XFA_ATTRIBUTE_Rotate).GetValue()); + nRotate = (nRotate < 0 ? (nRotate % 360) + 360 : nRotate % 360); + if(nRotate == 90 || nRotate == 270) { + FX_FLOAT fTmp = fWidth; + fWidth = fHeight; + fHeight = fTmp; + } + SetCurrentComponentSize(fWidth, fHeight); +} +XFA_ItemLayoutProcessorResult CXFA_ItemLayoutProcessor::DoLayout(FX_BOOL bUseBreakControl, FX_FLOAT fHeightLimit, FX_FLOAT fRealHeight, CXFA_LayoutContext* pContext) +{ + XFA_ELEMENT eClassID = m_pFormNode->GetClassID(); + switch(eClassID) { + case XFA_ELEMENT_Subform: + case XFA_ELEMENT_Area: + case XFA_ELEMENT_ExclGroup: + case XFA_ELEMENT_SubformSet: { + FX_BOOL bRootForceTb = FALSE; + CXFA_Node* pLayoutNode = GetSubformSetParent(m_pFormNode); + XFA_ATTRIBUTEENUM eLayoutStrategy = XFA_ItemLayoutProcessor_GetLayout(pLayoutNode, bRootForceTb); + switch(eLayoutStrategy) { + case XFA_ATTRIBUTEENUM_Tb: + case XFA_ATTRIBUTEENUM_Lr_tb: + case XFA_ATTRIBUTEENUM_Rl_tb: + return DoLayoutFlowedContainer(bUseBreakControl, eLayoutStrategy, fHeightLimit, fRealHeight, pContext, bRootForceTb); + case XFA_ATTRIBUTEENUM_Position: + case XFA_ATTRIBUTEENUM_Row: + case XFA_ATTRIBUTEENUM_Rl_row: + default: + DoLayoutPositionedContainer(pContext); + m_nCurChildNodeStage = XFA_ItemLayoutProcessorStages_Done; + return XFA_ItemLayoutProcessorResult_Done; + case XFA_ATTRIBUTEENUM_Table: + DoLayoutTableContainer(pLayoutNode); + m_nCurChildNodeStage = XFA_ItemLayoutProcessorStages_Done; + return XFA_ItemLayoutProcessorResult_Done; + } + } + case XFA_ELEMENT_Draw: + case XFA_ELEMENT_Field: + DoLayoutField(); + m_nCurChildNodeStage = XFA_ItemLayoutProcessorStages_Done; + return XFA_ItemLayoutProcessorResult_Done; + case XFA_ELEMENT_ContentArea: + return XFA_ItemLayoutProcessorResult_Done; + default: + return XFA_ItemLayoutProcessorResult_Done; + } +} +void CXFA_ItemLayoutProcessor::GetCurrentComponentPos(FX_FLOAT& fAbsoluteX, FX_FLOAT& fAbsoluteY) +{ + ASSERT(m_pLayoutItem); + fAbsoluteX = m_pLayoutItem->m_sPos.x; + fAbsoluteY = m_pLayoutItem->m_sPos.y; +} +void CXFA_ItemLayoutProcessor::GetCurrentComponentSize(FX_FLOAT& fWidth, FX_FLOAT& fHeight) +{ + ASSERT(m_pLayoutItem); + fWidth = m_pLayoutItem->m_sSize.x; + fHeight = m_pLayoutItem->m_sSize.y; +} +void CXFA_ItemLayoutProcessor::SetCurrentComponentPos(FX_FLOAT fAbsoluteX, FX_FLOAT fAbsoluteY) +{ + ASSERT(m_pLayoutItem); + m_pLayoutItem->m_sPos.Set(fAbsoluteX, fAbsoluteY); +} +void CXFA_ItemLayoutProcessor::SetCurrentComponentSize(FX_FLOAT fWidth, FX_FLOAT fHeight) +{ + ASSERT(m_pLayoutItem); + m_pLayoutItem->m_sSize.Set(fWidth, fHeight); +} +FX_BOOL CXFA_ItemLayoutProcessor::JudgeLeaderOrTrailerForOccur(CXFA_Node* pFormNode) +{ + if(pFormNode == NULL) { + return FALSE; + } + CXFA_Node* pTemplate = pFormNode->GetTemplateNode(); + if (!pTemplate) { + pTemplate = pFormNode; + } + CXFA_Occur NodeOccur = pTemplate->GetFirstChildByClass(XFA_ELEMENT_Occur); + FX_INT32 iMax = NodeOccur.GetMax(); + if (iMax > -1) { + FX_INT32 iCount = (FX_INT32)(FX_UINTPTR)m_PendingNodesCount.GetValueAt(pTemplate); + if (iCount >= iMax) { + return FALSE; + } + iCount++; + m_PendingNodesCount.SetAt(pTemplate, (FX_LPVOID)(FX_UINTPTR)(iCount)); + return TRUE; + } + return TRUE; +} diff --git a/xfa/src/fxfa/src/parser/xfa_layout_itemlayout.h b/xfa/src/fxfa/src/parser/xfa_layout_itemlayout.h new file mode 100644 index 0000000000..7844fb556f --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_layout_itemlayout.h @@ -0,0 +1,132 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _XFA_LAYOUT_ITEMLAYOUT_H_ +#define _XFA_LAYOUT_ITEMLAYOUT_H_ +#define XFA_LAYOUT_INVALIDNODE ((CXFA_Node*)(FX_INTPTR)-1) +#define XFA_LAYOUT_FLOAT_PERCISION (0.0005f) +#include "float.h" +#define XFA_LAYOUT_FLOAT_MAX FLT_MAX +class CXFA_ItemLayoutProcessor; +class CXFA_LayoutPageMgr; +class CXFA_ContainerLayoutItemImpl; +class CXFA_ContentLayoutItemImpl; +enum XFA_ItemLayoutProcessorResult { + XFA_ItemLayoutProcessorResult_Done, + XFA_ItemLayoutProcessorResult_PageFullBreak, + XFA_ItemLayoutProcessorResult_RowFullBreak, + XFA_ItemLayoutProcessorResult_ManualBreak, +}; +enum XFA_ItemLayoutProcessorStages { + XFA_ItemLayoutProcessorStages_None, + XFA_ItemLayoutProcessorStages_BookendLeader, + XFA_ItemLayoutProcessorStages_BreakBefore, + XFA_ItemLayoutProcessorStages_Keep, + XFA_ItemLayoutProcessorStages_Container, + XFA_ItemLayoutProcessorStages_BreakAfter, + XFA_ItemLayoutProcessorStages_BookendTrailer, + XFA_ItemLayoutProcessorStages_Done, +}; +class CXFA_LayoutContext : public CFX_Object +{ +public: + CXFA_LayoutContext(): m_prgSpecifiedColumnWidths(NULL) + , m_fCurColumnWidth(0) + , m_bCurColumnWidthAvaiable(FALSE) + , m_pOverflowProcessor(NULL) + , m_pOverflowNode(NULL) + { + } + ~CXFA_LayoutContext() + { + m_pOverflowProcessor = NULL; + } + CFX_ArrayTemplate* m_prgSpecifiedColumnWidths; + FX_FLOAT m_fCurColumnWidth; + FX_BOOL m_bCurColumnWidthAvaiable; + CXFA_ItemLayoutProcessor* m_pOverflowProcessor; + CXFA_Node* m_pOverflowNode; +}; +class CXFA_ItemLayoutProcessor : public CFX_Object +{ +public: + CXFA_ItemLayoutProcessor(CXFA_Node *pNode, CXFA_LayoutPageMgr* pPageMgr); + XFA_ItemLayoutProcessorResult DoLayout(FX_BOOL bUseBreakControl, FX_FLOAT fHeightLimit, FX_FLOAT fRealHeight = XFA_LAYOUT_FLOAT_MAX, CXFA_LayoutContext* pContext = NULL); + void GetCurrentComponentPos(FX_FLOAT& fAbsoluteX, FX_FLOAT& fAbsoluteY); + void GetCurrentComponentSize(FX_FLOAT& fWidth, FX_FLOAT& fHeight); + void SetCurrentComponentPos(FX_FLOAT fAbsoluteX, FX_FLOAT fAbsoluteY); + void SetCurrentComponentSize(FX_FLOAT fWidth, FX_FLOAT fHeight); + inline CXFA_Node* GetFormNode() + { + return m_pFormNode; + } + inline FX_BOOL HasLayoutItem() + { + return m_pLayoutItem != NULL; + } + CXFA_ContentLayoutItemImpl* ExtractLayoutItem(); + + static FX_BOOL IncrementRelayoutNode(CXFA_LayoutProcessor* pLayoutProcessor, CXFA_Node *pNode, CXFA_Node *pParentNode); + static void CalculatePositionedContainerPos(CXFA_Node* pNode, FX_FLOAT fWidth, FX_FLOAT fHeight, FX_FLOAT& fAbsoluteX, FX_FLOAT& fAbsoluteY); + static FX_BOOL FindLayoutItemSplitPos(CXFA_ContentLayoutItemImpl* pLayoutItem, FX_FLOAT fCurVerticalOffset, FX_FLOAT& fProposedSplitPos, FX_BOOL& bAppChange, FX_BOOL bCalculateMargin = TRUE); + FX_FLOAT FindSplitPos(FX_FLOAT fProposedSplitPos); + void SplitLayoutItem(CXFA_ContentLayoutItemImpl* pLayoutItem, CXFA_ContentLayoutItemImpl* pSecondParent, FX_FLOAT fSplitPos); + void SplitLayoutItem(FX_FLOAT fSplitPos); + FX_BOOL JudgePutNextPage(CXFA_ContentLayoutItemImpl* pParentLayoutItem, FX_FLOAT fChildHeight, CFX_ArrayTemplate &pKeepItems); + FX_BOOL ProcessKeepForSplite(CXFA_ItemLayoutProcessor* pParentProcessor, CXFA_ItemLayoutProcessor* pChildProcessor, XFA_ItemLayoutProcessorResult eRetValue, + CFX_ArrayTemplate& rgCurLineLayoutItem, FX_FLOAT& fContentCurRowAvailWidth, + FX_FLOAT& fContentCurRowHeight, FX_FLOAT& fContentCurRowY, FX_BOOL& bAddedItemInRow, FX_BOOL& bForceEndPage, XFA_ItemLayoutProcessorResult& result); + FX_FLOAT InsertKeepLayoutItems(); + void DoLayoutPageArea(CXFA_ContainerLayoutItemImpl* pPageAreaLayoutItem); + FX_BOOL CalculateRowChildPosition(CFX_ArrayTemplate(&rgCurLineLayoutItems)[3], XFA_ATTRIBUTEENUM eFlowStrategy, FX_BOOL bContainerHeightAutoSize, + FX_BOOL bContainerWidthAutoSize, FX_FLOAT& fContentCalculatedWidth, FX_FLOAT& fContentCalculatedHeight, FX_FLOAT& fContentCurRowY, + FX_FLOAT fContentCurRowHeight, FX_FLOAT fContentWidthLimit, FX_BOOL bRootForceTb = FALSE); + void ProcessUnUseOverFlow(CXFA_Node* pLeaderNode, CXFA_Node* pTrailerNode, CXFA_ContentLayoutItemImpl* pTrailerItem, CXFA_Node* pFormNode); + void ProcessUnUseBinds(CXFA_Node* pFormNode); + FX_BOOL IsAddNewRowForTrailer(CXFA_ContentLayoutItemImpl* pTrailerItem); + FX_BOOL JudgeLeaderOrTrailerForOccur(CXFA_Node* pFormNode); + CXFA_ContentLayoutItemImpl* CreateContentLayoutItem(CXFA_Node* pFormNode); +protected: + void DoLayoutPositionedContainer(CXFA_LayoutContext* pContext = NULL); + void DoLayoutTableContainer(CXFA_Node* pLayoutNode); + XFA_ItemLayoutProcessorResult DoLayoutFlowedContainer(FX_BOOL bUseBreakControl, XFA_ATTRIBUTEENUM eFlowStrategy, FX_FLOAT fHeightLimit, FX_FLOAT fRealHeight, CXFA_LayoutContext* pContext = NULL, FX_BOOL bRootForceTb = FALSE); + void DoLayoutField(); + void XFA_ItemLayoutProcessor_GotoNextContainerNode(CXFA_Node*& pCurActionNode, XFA_ItemLayoutProcessorStages& nCurStage, CXFA_Node* pParentContainer, FX_BOOL bUsePageBreak); + FX_BOOL ProcessKeepNodesForCheckNext(CXFA_Node*& pCurActionNode, XFA_ItemLayoutProcessorStages& nCurStage, CXFA_Node*& pNextContainer, FX_BOOL& bLastKeepNode); + FX_BOOL ProcessKeepNodesForBreakBefore(CXFA_Node*& pCurActionNode, XFA_ItemLayoutProcessorStages& nCurStage, CXFA_Node* pContainerNode); + CXFA_Node* GetSubformSetParent(CXFA_Node* pSubformSet); + +public: + FX_BOOL m_bKeepBreakFinish; + FX_BOOL m_bIsProcessKeep; + CXFA_Node* m_pKeepHeadNode; + CXFA_Node* m_pKeepTailNode; + CXFA_Node* m_pFormNode; + CXFA_ContentLayoutItemImpl* m_pLayoutItem; +#ifdef _XFA_LAYOUTITEM_ProcessCACHE_ + CXFA_ContentLayoutItemImpl* m_pOldLayoutItem; +#else + CXFA_LayoutPageMgr* m_pPageMgrCreateItem; +#endif + CXFA_Node* m_pCurChildNode; + CXFA_ItemLayoutProcessor* m_pCurChildPreprocessor; + XFA_ItemLayoutProcessorStages m_nCurChildNodeStage; + FX_FLOAT m_fUsedSize; + CXFA_LayoutPageMgr* m_pPageMgr; + CFX_PtrList m_rgPendingNodes; + FX_BOOL m_bBreakPending; + CFX_ArrayTemplate m_rgSpecifiedColumnWidths; + CFX_ArrayTemplate m_arrayKeepItems; + CFX_MapPtrToPtr m_PendingNodesCount; + FX_FLOAT m_fLastRowWidth; + FX_FLOAT m_fLastRowY; + FX_FLOAT m_fWidthLimite; + FX_BOOL m_bUseInheriated; + XFA_ItemLayoutProcessorResult m_ePreProcessRs; + FX_BOOL m_bHasAvailHeight; +}; +FX_BOOL XFA_ItemLayoutProcessor_IsTakingSpace(CXFA_Node* pNode); +#endif diff --git a/xfa/src/fxfa/src/parser/xfa_layout_pagemgr_new.cpp b/xfa/src/fxfa/src/parser/xfa_layout_pagemgr_new.cpp new file mode 100644 index 0000000000..bc2d8104fd --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_layout_pagemgr_new.cpp @@ -0,0 +1,1680 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_utils.h" +#include "../common/xfa_object.h" +#include "../common/xfa_document.h" +#include "../common/xfa_parser.h" +#include "../common/xfa_script.h" +#include "../common/xfa_docdata.h" +#include "../common/xfa_doclayout.h" +#include "../common/xfa_debug.h" +#include "../common/xfa_localemgr.h" +#include "../common/xfa_fm2jsapi.h" +#include "xfa_debug_parser.h" +#include "xfa_document_datamerger_imp.h" +#include "xfa_document_layout_imp.h" +#include "xfa_layout_itemlayout.h" +#include "xfa_layout_pagemgr_new.h" +#include "xfa_layout_appadapter.h" +CXFA_LayoutPageMgr::CXFA_LayoutPageMgr(CXFA_LayoutProcessor* pLayoutProcessor) + : m_pLayoutProcessor(pLayoutProcessor) + , m_pTemplatePageSetRoot(NULL) + , m_pPageSetLayoutItemRoot(NULL) + , m_pCurrentContainerRecord(NULL) + , m_nCurPageCount(0) + , m_pCurPageArea(NULL) + , m_ePageSetMode(XFA_ATTRIBUTEENUM_OrderedOccurrence) + , m_nAvailPages(0) + , m_pPageSetCurRoot(NULL) + , m_bCreateOverFlowPage(FALSE) +{ +} +CXFA_LayoutPageMgr::~CXFA_LayoutPageMgr() +{ + ClearData(); + CXFA_LayoutItemImpl *pLayoutItem = GetRootLayoutItem(); + CXFA_LayoutItemImpl *pNextLayout = NULL; + for(; pLayoutItem; pLayoutItem = pNextLayout) { + pNextLayout = pLayoutItem->m_pNextSibling; + XFA_ReleaseLayoutItem(pLayoutItem); + } +} +FX_BOOL CXFA_LayoutPageMgr::InitLayoutPage(CXFA_Node* pFormNode) +{ + PrepareLayout(); + CXFA_Node* pTemplateNode = pFormNode->GetTemplateNode(); + if (!pTemplateNode) { + return FALSE; + } + m_pTemplatePageSetRoot = pTemplateNode->GetProperty(0, XFA_ELEMENT_PageSet); + ASSERT(m_pTemplatePageSetRoot); + if (m_pPageSetLayoutItemRoot) { + m_pPageSetLayoutItemRoot->m_pParent = NULL; + m_pPageSetLayoutItemRoot->m_pFirstChild = NULL; + m_pPageSetLayoutItemRoot->m_pNextSibling = NULL; + m_pPageSetLayoutItemRoot->m_pFormNode = m_pTemplatePageSetRoot; + } else { + m_pPageSetLayoutItemRoot = FX_NEW CXFA_ContainerLayoutItemImpl(m_pTemplatePageSetRoot); + } + m_pPageSetCurRoot = m_pPageSetLayoutItemRoot; + m_pTemplatePageSetRoot->SetUserData(XFA_LAYOUTITEMKEY, (FX_LPVOID)m_pPageSetLayoutItemRoot); + XFA_ATTRIBUTEENUM eRelation = m_pTemplatePageSetRoot->GetEnum(XFA_ATTRIBUTE_Relation); + if(eRelation != XFA_ATTRIBUTEENUM_Unknown) { + m_ePageSetMode = eRelation; + } + InitPageSetMap(); + CXFA_Node* pPageArea = NULL; + FX_INT32 iCount = 0; + for (pPageArea = m_pTemplatePageSetRoot->GetNodeItem(XFA_NODEITEM_FirstChild); pPageArea; pPageArea = pPageArea->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if (pPageArea->GetClassID() == XFA_ELEMENT_PageArea) { + iCount++; + if (pPageArea->GetFirstChildByClass(XFA_ELEMENT_ContentArea)) { + return TRUE; + } + } + } + if (iCount > 0) { + return FALSE; + } + CXFA_Document* pDocument = pTemplateNode->GetDocument(); + IXFA_ObjFactory* pObjFactory = pDocument->GetParser()->GetFactory(); + pPageArea = m_pTemplatePageSetRoot->GetChild(0, XFA_ELEMENT_PageArea); + if (!pPageArea) { + pPageArea = pObjFactory->CreateNode(m_pTemplatePageSetRoot->GetPacketID(), XFA_ELEMENT_PageArea); + if(!pPageArea) { + return FALSE; + } + m_pTemplatePageSetRoot->InsertChild(pPageArea, NULL); + pPageArea->SetFlag(XFA_NODEFLAG_Initialized); + } + CXFA_Node* pContentArea = pPageArea->GetChild(0, XFA_ELEMENT_ContentArea); + if (!pContentArea) { + pContentArea = pObjFactory->CreateNode(pPageArea->GetPacketID(), XFA_ELEMENT_ContentArea); + if(!pContentArea) { + return FALSE; + } + pPageArea->InsertChild(pContentArea, NULL); + pContentArea->SetFlag(XFA_NODEFLAG_Initialized); + pContentArea->SetMeasure(XFA_ATTRIBUTE_X, CXFA_Measurement(0.25f, XFA_UNIT_In)); + pContentArea->SetMeasure(XFA_ATTRIBUTE_Y, CXFA_Measurement(0.25f, XFA_UNIT_In)); + pContentArea->SetMeasure(XFA_ATTRIBUTE_W, CXFA_Measurement(8.0f, XFA_UNIT_In)); + pContentArea->SetMeasure(XFA_ATTRIBUTE_H, CXFA_Measurement(10.5f, XFA_UNIT_In)); + } + CXFA_Node* pMedium = pPageArea->GetChild(0, XFA_ELEMENT_Medium); + if (!pMedium) { + pMedium = pObjFactory->CreateNode(pPageArea->GetPacketID(), XFA_ELEMENT_Medium); + if(!pContentArea) { + return FALSE; + } + pPageArea->InsertChild(pMedium, NULL); + pMedium->SetFlag(XFA_NODEFLAG_Initialized); + pMedium->SetMeasure(XFA_ATTRIBUTE_Short, CXFA_Measurement(8.5f, XFA_UNIT_In)); + pMedium->SetMeasure(XFA_ATTRIBUTE_Long, CXFA_Measurement(11.0f, XFA_UNIT_In)); + } + return TRUE; +} +FX_BOOL CXFA_LayoutPageMgr::PrepareFirstPage(CXFA_Node* pRootSubform) +{ + FX_BOOL bProBreakBefore = FALSE; + CXFA_Node* pBreakBeforeNode = NULL; + while (pRootSubform) { + for(CXFA_Node* pBreakNode = pRootSubform->GetNodeItem(XFA_NODEITEM_FirstChild); pBreakNode; pBreakNode = pBreakNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + XFA_ELEMENT eType = pBreakNode->GetClassID(); + if (eType == XFA_ELEMENT_BreakBefore || (eType == XFA_ELEMENT_Break && pBreakNode->GetEnum(XFA_ATTRIBUTE_Before) != XFA_ATTRIBUTEENUM_Auto)) { + bProBreakBefore = TRUE; + pBreakBeforeNode = pBreakNode; + break; + } + } + if (bProBreakBefore) { + break; + } + bProBreakBefore = TRUE; + pRootSubform = pRootSubform->GetFirstChildByClass(XFA_ELEMENT_Subform); + while (pRootSubform && !XFA_ItemLayoutProcessor_IsTakingSpace(pRootSubform)) { + pRootSubform = pRootSubform->GetNextSameClassSibling(XFA_ELEMENT_Subform); + } + } + CXFA_Node* pLeader, *pTrailer; + if (pBreakBeforeNode && ExecuteBreakBeforeOrAfter(pBreakBeforeNode, TRUE, pLeader, pTrailer)) { + m_pCurrentContainerRecord = m_rgProposedContainerRecord.GetHeadPosition(); + return TRUE; + } + return AppendNewPage(TRUE); +} +FX_BOOL CXFA_LayoutPageMgr::AppendNewPage(FX_BOOL bFirstTemPage) +{ + if(m_pCurrentContainerRecord != m_rgProposedContainerRecord.GetTailPosition()) { + return TRUE; + } + CXFA_Node* pPageNode = GetNextAvailPageArea(NULL); + if (!pPageNode) { + return FALSE; + } + if (bFirstTemPage && m_pCurrentContainerRecord == NULL) { + m_pCurrentContainerRecord = m_rgProposedContainerRecord.GetHeadPosition(); + } + return !bFirstTemPage || m_pCurrentContainerRecord != NULL; +} +static void XFA_LayoutItemMgr_ReorderLayoutItemToTail(CXFA_ContainerLayoutItemImpl* pLayoutItem) +{ + CXFA_ContainerLayoutItemImpl* pParentLayoutItem = (CXFA_ContainerLayoutItemImpl*)pLayoutItem->m_pParent; + if(!pParentLayoutItem) { + return; + } + CXFA_LayoutItemImpl* pNext = pLayoutItem->m_pNextSibling; + pParentLayoutItem->RemoveChild(pLayoutItem); + pParentLayoutItem->AddChild(pLayoutItem); +} +static void XFA_LayoutItemMgr_RemoveLayoutItem(CXFA_ContainerLayoutItemImpl* pLayoutItem) +{ + CXFA_ContainerLayoutItemImpl* pParentLayoutItem = (CXFA_ContainerLayoutItemImpl*)pLayoutItem->m_pParent; + if(!pParentLayoutItem) { + return; + } + CXFA_LayoutItemImpl* pNext = pLayoutItem->m_pNextSibling; + pParentLayoutItem->RemoveChild(pLayoutItem); +} +void CXFA_LayoutPageMgr::RemoveLayoutRecord(CXFA_ContainerRecord* pNewRecord, CXFA_ContainerRecord* pPrevRecord) +{ + if(!pNewRecord || !pPrevRecord) { + return; + } + if(pNewRecord->pCurPageSet != pPrevRecord->pCurPageSet) { + XFA_LayoutItemMgr_RemoveLayoutItem(pNewRecord->pCurPageSet); + return; + } + if(pNewRecord->pCurPageArea != pPrevRecord->pCurPageArea) { + XFA_LayoutItemMgr_RemoveLayoutItem(pNewRecord->pCurPageArea); + return; + } + if(pNewRecord->pCurContentArea != pPrevRecord->pCurContentArea) { + XFA_LayoutItemMgr_RemoveLayoutItem(pNewRecord->pCurContentArea); + return; + } +} +void CXFA_LayoutPageMgr::ReorderPendingLayoutRecordToTail(CXFA_ContainerRecord* pNewRecord, CXFA_ContainerRecord* pPrevRecord) +{ + if(!pNewRecord || !pPrevRecord) { + return; + } + if(pNewRecord->pCurPageSet != pPrevRecord->pCurPageSet) { + XFA_LayoutItemMgr_ReorderLayoutItemToTail(pNewRecord->pCurPageSet); + return; + } + if(pNewRecord->pCurPageArea != pPrevRecord->pCurPageArea) { + XFA_LayoutItemMgr_ReorderLayoutItemToTail(pNewRecord->pCurPageArea); + return; + } + if(pNewRecord->pCurContentArea != pPrevRecord->pCurContentArea) { + XFA_LayoutItemMgr_ReorderLayoutItemToTail(pNewRecord->pCurContentArea); + return; + } +} +void CXFA_LayoutPageMgr::SubmitContentItem(CXFA_ContentLayoutItemImpl* pContentLayoutItem, XFA_ItemLayoutProcessorResult eStatus) +{ + if(pContentLayoutItem) { + GetCurrentContainerRecord()->pCurContentArea->AddChild(pContentLayoutItem); + m_bCreateOverFlowPage = FALSE; + } + if(eStatus != XFA_ItemLayoutProcessorResult_Done) { + if(eStatus == XFA_ItemLayoutProcessorResult_PageFullBreak && m_pCurrentContainerRecord == m_rgProposedContainerRecord.GetTailPosition()) { + AppendNewPage(); + } + m_pCurrentContainerRecord = m_rgProposedContainerRecord.GetTailPosition(); + m_pCurPageArea = GetCurrentContainerRecord()->pCurPageArea->m_pFormNode; + } +} +FX_FLOAT CXFA_LayoutPageMgr::GetAvailHeight() +{ + FX_FLOAT fAvailHeight = GetCurrentContainerRecord()->pCurContentArea->m_pFormNode->GetMeasure(XFA_ATTRIBUTE_H).ToUnit(XFA_UNIT_Pt); + if (fAvailHeight < XFA_LAYOUT_FLOAT_PERCISION) { + if (m_pCurrentContainerRecord == m_rgProposedContainerRecord.GetHeadPosition()) { + fAvailHeight = 0; + } else { + fAvailHeight = XFA_LAYOUT_FLOAT_MAX; + } + } + return fAvailHeight; +} +static CXFA_Node* XFA_ResolveBreakTarget(CXFA_Node* pPageSetRoot, FX_BOOL bNewExprStyle, CFX_WideStringC& wsTargetExpr) +{ + CXFA_Document* pDocument = pPageSetRoot->GetDocument(); + if(wsTargetExpr.IsEmpty()) { + return NULL; + } + CFX_WideString wsTargetAll = wsTargetExpr; + wsTargetAll.TrimLeft(); + wsTargetAll.TrimRight(); + FX_INT32 iSpliteIndex = 0; + FX_BOOL bTargetAllFind = TRUE; + while(iSpliteIndex != -1) { + CFX_WideString wsTargetExpr; + FX_INT32 iSpliteNextIndex = 0; + if(!bTargetAllFind) { + iSpliteNextIndex = wsTargetAll.Find(' ', iSpliteIndex); + wsTargetExpr = wsTargetAll.Mid(iSpliteIndex, iSpliteNextIndex - iSpliteIndex); + } else { + wsTargetExpr = wsTargetAll; + } + if(wsTargetExpr.IsEmpty()) { + return NULL; + } + bTargetAllFind = FALSE; + if(wsTargetExpr.GetAt(0) == '#') { + CXFA_Node *pNode = pDocument->GetNodeByID((CXFA_Node*)pDocument->GetXFANode(XFA_HASHCODE_Template), wsTargetExpr.Mid(1)); + if(pNode) { + return pNode; + } + } else if(bNewExprStyle) { + CFX_WideString wsProcessedTarget = wsTargetExpr; + if(wsTargetExpr.Left(4) == FX_WSTRC(L"som(") && wsTargetExpr.Right(1) == FX_WSTRC(L")")) { + wsProcessedTarget = wsTargetExpr.Mid(4, wsTargetExpr.GetLength() - 5); + } + XFA_RESOLVENODE_RS rs; + FX_INT32 iCount = pDocument->GetScriptContext()->ResolveObjects(pPageSetRoot, wsProcessedTarget, rs, XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Attributes | XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent); + if(iCount > 0 && rs.nodes[0]->IsNode()) { + return (CXFA_Node*)rs.nodes[0]; + } + } + iSpliteIndex = iSpliteNextIndex; + } + return NULL; +} + +FX_BOOL XFA_LayoutPageMgr_RunBreakTestScript(CXFA_Node* pTestScript) +{ + CFX_WideString wsExpression; + pTestScript->TryContent(wsExpression); + if(wsExpression.IsEmpty()) { + return TRUE; + } + return pTestScript->GetDocument()->GetParser()->GetNotify()->RunScript(pTestScript, pTestScript->GetNodeItem(XFA_NODEITEM_Parent, XFA_OBJECTTYPE_ContainerNode)); +} +CXFA_ContainerRecord* CXFA_LayoutPageMgr::CreateContainerRecord(CXFA_Node* pPageNode, FX_BOOL bCreateNew) +{ + CXFA_ContainerRecord* pNewRecord = FX_NEW CXFA_ContainerRecord(); + if(m_pCurrentContainerRecord) { + if(!IsPageSetRootOrderedOccurrence() || pPageNode == NULL) { + *pNewRecord = *GetCurrentContainerRecord(); + m_rgProposedContainerRecord.AddTail(pNewRecord); + return pNewRecord; + } + CXFA_Node* pPageSet = pPageNode->GetNodeItem(XFA_NODEITEM_Parent); + if(!bCreateNew) { + if(pPageSet == m_pTemplatePageSetRoot) { + pNewRecord->pCurPageSet = m_pPageSetCurRoot; + } else { + CXFA_ContainerLayoutItemImpl* pParentLayoutItem = (CXFA_ContainerLayoutItemImpl*)pPageSet->GetUserData(XFA_LAYOUTITEMKEY); + if(pParentLayoutItem == NULL) { + pParentLayoutItem = m_pPageSetCurRoot; + } + pNewRecord->pCurPageSet = pParentLayoutItem; + } + } else { + CXFA_ContainerLayoutItemImpl* pParentPageSetLayout = NULL; + if(pPageSet == GetCurrentContainerRecord()->pCurPageSet->m_pFormNode) { + pParentPageSetLayout = (CXFA_ContainerLayoutItemImpl*)GetCurrentContainerRecord()->pCurPageSet->m_pParent; + } else { + pParentPageSetLayout = (CXFA_ContainerLayoutItemImpl*)pPageSet->GetNodeItem(XFA_NODEITEM_Parent)->GetUserData(XFA_LAYOUTITEMKEY); + } + CXFA_ContainerLayoutItemImpl* pPageSetLayoutItem = FX_NEW CXFA_ContainerLayoutItemImpl(pPageSet); + pPageSet->SetUserData(XFA_LAYOUTITEMKEY, (FX_LPVOID)pPageSetLayoutItem); + if(pParentPageSetLayout == NULL) { + CXFA_ContainerLayoutItemImpl* pPrePageSet = m_pPageSetLayoutItemRoot; + while(pPrePageSet->m_pNextSibling) { + pPrePageSet = (CXFA_ContainerLayoutItemImpl*)pPrePageSet->m_pNextSibling; + } + pPrePageSet->m_pNextSibling = pPageSetLayoutItem; + m_pPageSetCurRoot = pPageSetLayoutItem; + } else { + pParentPageSetLayout->AddChild(pPageSetLayoutItem); + } + pNewRecord->pCurPageSet = pPageSetLayoutItem; + } + } else { + if(pPageNode) { + CXFA_Node* pPageSet = pPageNode->GetNodeItem(XFA_NODEITEM_Parent); + if(pPageSet == m_pTemplatePageSetRoot) { + pNewRecord->pCurPageSet = m_pPageSetLayoutItemRoot; + } else { + CXFA_ContainerLayoutItemImpl* pPageSetLayoutItem = FX_NEW CXFA_ContainerLayoutItemImpl(pPageSet); + pPageSet->SetUserData(XFA_LAYOUTITEMKEY, (FX_LPVOID)pPageSetLayoutItem); + m_pPageSetLayoutItemRoot->AddChild(pPageSetLayoutItem); + pNewRecord->pCurPageSet = pPageSetLayoutItem; + } + } else { + pNewRecord->pCurPageSet = m_pPageSetLayoutItemRoot; + } + } + m_rgProposedContainerRecord.AddTail(pNewRecord); + return pNewRecord; +} +void CXFA_LayoutPageMgr::AddPageAreaLayoutItem(CXFA_ContainerRecord* pNewRecord, CXFA_Node* pNewPageArea) +{ + CXFA_ContainerLayoutItemImpl* pNewPageAreaLayoutItem = NULL; + if (m_PageArray.GetSize() > m_nAvailPages) { + CXFA_ContainerLayoutItemImpl* pContainerItem = m_PageArray[m_nAvailPages]; + pContainerItem->m_pFormNode = pNewPageArea; + m_nAvailPages++; + pNewPageAreaLayoutItem = pContainerItem; + } else { + IXFA_Notify* pNotify = pNewPageArea->GetDocument()->GetParser()->GetNotify(); + CXFA_ContainerLayoutItemImpl* pContainerItem = (CXFA_ContainerLayoutItemImpl*)pNotify->OnCreateLayoutItem(pNewPageArea); + m_PageArray.Add(pContainerItem); + m_nAvailPages++; + pNotify->OnPageEvent((IXFA_LayoutPage*)pContainerItem, XFA_PAGEEVENT_PageAdded, (FX_LPVOID)(FX_UINTPTR)m_nAvailPages); + pNewPageAreaLayoutItem = pContainerItem; + } + pNewRecord->pCurPageSet->AddChild(pNewPageAreaLayoutItem); + pNewRecord->pCurPageArea = pNewPageAreaLayoutItem; + pNewRecord->pCurContentArea = NULL; +} +void CXFA_LayoutPageMgr::AddContentAreaLayoutItem(CXFA_ContainerRecord* pNewRecord, CXFA_Node* pContentArea) +{ + if(pContentArea == NULL) { + pNewRecord->pCurContentArea = NULL; + return; + } + CXFA_ContainerLayoutItemImpl* pNewContentAreaLayoutItem = FX_NEW CXFA_ContainerLayoutItemImpl(pContentArea); + ASSERT(pNewRecord->pCurPageArea); + pNewRecord->pCurPageArea->AddChild(pNewContentAreaLayoutItem); + pNewRecord->pCurContentArea = pNewContentAreaLayoutItem; +} +class CXFA_TraverseStrategy_PageSetContainerLayoutItem +{ +public: + static inline CXFA_ContainerLayoutItemImpl* GetFirstChild(CXFA_ContainerLayoutItemImpl* pLayoutItem) + { + if(pLayoutItem->m_pFormNode->GetClassID() == XFA_ELEMENT_PageSet) { + CXFA_ContainerLayoutItemImpl* pChildItem = (CXFA_ContainerLayoutItemImpl*)pLayoutItem->m_pFirstChild; + while(pChildItem && pChildItem->m_pFormNode->GetClassID() != XFA_ELEMENT_PageSet) { + pChildItem = (CXFA_ContainerLayoutItemImpl*)pChildItem->m_pNextSibling; + } + return pChildItem; + } + return NULL; + } + static inline CXFA_ContainerLayoutItemImpl* GetNextSibling(CXFA_ContainerLayoutItemImpl* pLayoutItem) + { + CXFA_ContainerLayoutItemImpl* pChildItem = (CXFA_ContainerLayoutItemImpl*)pLayoutItem->m_pNextSibling; + while(pChildItem && pChildItem->m_pFormNode->GetClassID() != XFA_ELEMENT_PageSet) { + pChildItem = (CXFA_ContainerLayoutItemImpl*)pChildItem->m_pNextSibling; + } + return pChildItem; + } + static inline CXFA_ContainerLayoutItemImpl* GetParent(CXFA_ContainerLayoutItemImpl* pLayoutItem) + { + return (CXFA_ContainerLayoutItemImpl*)pLayoutItem->m_pParent; + } +}; +void CXFA_LayoutPageMgr::FinishPaginatedPageSets() +{ + CXFA_ContainerLayoutItemImpl* pRootPageSetLayoutItem = m_pPageSetLayoutItemRoot; + for (; pRootPageSetLayoutItem; pRootPageSetLayoutItem = (CXFA_ContainerLayoutItemImpl*)pRootPageSetLayoutItem->m_pNextSibling) { + CXFA_NodeIteratorTemplate sIterator(pRootPageSetLayoutItem); + for(CXFA_ContainerLayoutItemImpl *pPageSetLayoutItem = sIterator.GetCurrent(); pPageSetLayoutItem; pPageSetLayoutItem = sIterator.MoveToNext()) { + XFA_ATTRIBUTEENUM ePageRelation = pPageSetLayoutItem->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Relation); + switch(ePageRelation) { + case XFA_ATTRIBUTEENUM_OrderedOccurrence: + default: { + ProcessLastPageSet(); + } + break; + case XFA_ATTRIBUTEENUM_SimplexPaginated: + case XFA_ATTRIBUTEENUM_DuplexPaginated: { + CXFA_LayoutItemImpl* pLastPageAreaLayoutItem = NULL; + FX_INT32 nPageAreaCount = 0; + for(CXFA_LayoutItemImpl* pPageAreaLayoutItem = pPageSetLayoutItem->m_pFirstChild; pPageAreaLayoutItem; pPageAreaLayoutItem = pPageAreaLayoutItem->m_pNextSibling) { + if(pPageAreaLayoutItem->m_pFormNode->GetClassID() != XFA_ELEMENT_PageArea) { + continue; + } + nPageAreaCount++; + pLastPageAreaLayoutItem = pPageAreaLayoutItem; + } + if(!pLastPageAreaLayoutItem) { + break; + } + if (!FindPageAreaFromPageSet_SimplexDuplex(pPageSetLayoutItem->m_pFormNode, NULL, NULL, NULL, TRUE, TRUE, nPageAreaCount == 1 ? XFA_ATTRIBUTEENUM_Only : XFA_ATTRIBUTEENUM_Last) + && (nPageAreaCount == 1 && !FindPageAreaFromPageSet_SimplexDuplex(pPageSetLayoutItem->m_pFormNode, NULL, NULL, NULL, TRUE, TRUE, XFA_ATTRIBUTEENUM_Last))) { + break; + } + CXFA_Node *pNode = m_pCurPageArea; + XFA_ATTRIBUTEENUM eCurChoice = pNode->GetEnum(XFA_ATTRIBUTE_PagePosition); + if(eCurChoice == XFA_ATTRIBUTEENUM_Last) { + XFA_ATTRIBUTEENUM eOddOrEven = XFA_ATTRIBUTEENUM_Any; + pNode->TryEnum(XFA_ATTRIBUTE_OddOrEven, eOddOrEven); + XFA_ATTRIBUTEENUM eLastChoice = pLastPageAreaLayoutItem->m_pFormNode->GetEnum(XFA_ATTRIBUTE_PagePosition); + if (eLastChoice == XFA_ATTRIBUTEENUM_First && (ePageRelation == XFA_ATTRIBUTEENUM_SimplexPaginated || eOddOrEven != XFA_ATTRIBUTEENUM_Odd)) { + CXFA_ContainerRecord* pRecord = CreateContainerRecord(); + AddPageAreaLayoutItem(pRecord, pNode); + break;; + } + } + FX_BOOL bUsable = TRUE; + CFX_ArrayTemplate rgUsedHeights; + for(CXFA_LayoutItemImpl* pChildLayoutItem = pLastPageAreaLayoutItem->m_pFirstChild; pChildLayoutItem; pChildLayoutItem = pChildLayoutItem->m_pNextSibling) { + if(pChildLayoutItem->m_pFormNode->GetClassID() != XFA_ELEMENT_ContentArea) { + continue; + } + FX_FLOAT fUsedHeight = 0; + for(CXFA_LayoutItemImpl* pContentChildLayoutItem = pChildLayoutItem->m_pFirstChild; pContentChildLayoutItem; pContentChildLayoutItem = pContentChildLayoutItem->m_pNextSibling) { + if(!pContentChildLayoutItem->IsContentLayoutItem()) { + continue; + } + fUsedHeight += ((CXFA_ContentLayoutItemImpl*)pContentChildLayoutItem)->m_sSize.y; + } + rgUsedHeights.Add(fUsedHeight); + } + FX_INT32 iCurContentAreaIndex = -1; + for(CXFA_Node* pContentAreaNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild); pContentAreaNode; pContentAreaNode = pContentAreaNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if(pContentAreaNode->GetClassID() != XFA_ELEMENT_ContentArea) { + continue; + } + iCurContentAreaIndex++; + if(rgUsedHeights[iCurContentAreaIndex] > pContentAreaNode->GetMeasure(XFA_ATTRIBUTE_H).ToUnit(XFA_UNIT_Pt) + XFA_LAYOUT_FLOAT_PERCISION) { + bUsable = FALSE; + break; + } + } + if(bUsable) { + CXFA_LayoutItemImpl* pChildLayoutItem = pLastPageAreaLayoutItem->m_pFirstChild; + CXFA_Node* pContentAreaNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild); + pLastPageAreaLayoutItem->m_pFormNode = pNode; + while(pChildLayoutItem && pContentAreaNode) { + if(pChildLayoutItem->m_pFormNode->GetClassID() != XFA_ELEMENT_ContentArea) { + pChildLayoutItem = pChildLayoutItem->m_pNextSibling; + continue; + } + if(pContentAreaNode->GetClassID() != XFA_ELEMENT_ContentArea) { + pContentAreaNode = pContentAreaNode->GetNodeItem(XFA_NODEITEM_NextSibling); + continue; + } + pChildLayoutItem->m_pFormNode = pContentAreaNode; + pChildLayoutItem = pChildLayoutItem->m_pNextSibling; + pContentAreaNode = pContentAreaNode->GetNodeItem(XFA_NODEITEM_NextSibling); + } + } else if(pNode->GetEnum(XFA_ATTRIBUTE_PagePosition) == XFA_ATTRIBUTEENUM_Last) { + CXFA_ContainerRecord* pRecord = CreateContainerRecord(); + AddPageAreaLayoutItem(pRecord, pNode); + } + } + break; + } + } + } +} +FX_INT32 CXFA_LayoutPageMgr::GetPageCount() const +{ + return m_PageArray.GetSize(); +} +IXFA_LayoutPage* CXFA_LayoutPageMgr::GetPage(FX_INT32 index) const +{ + if (m_PageArray.GetSize() > index) { + return (IXFA_LayoutPage*)m_PageArray[index]; + } + return NULL; +} +FX_INT32 CXFA_LayoutPageMgr::GetPageIndex(IXFA_LayoutPage* pPage) const +{ + return m_PageArray.Find((CXFA_ContainerLayoutItemImpl*)pPage); +} +FX_BOOL CXFA_LayoutPageMgr::RunBreak(XFA_ELEMENT eBreakType, XFA_ATTRIBUTEENUM eTargetType, CXFA_Node* pTarget, FX_BOOL bStartNew) +{ + FX_BOOL bRet = FALSE; + switch(eTargetType) { + case XFA_ATTRIBUTEENUM_ContentArea: + if (pTarget && pTarget->GetClassID() != XFA_ELEMENT_ContentArea) { + pTarget = NULL; + } + if (!pTarget || !m_pCurrentContainerRecord || pTarget != GetCurrentContainerRecord()->pCurContentArea->m_pFormNode || bStartNew) { + CXFA_Node* pPageArea = NULL; + if(pTarget) { + pPageArea = pTarget->GetNodeItem(XFA_NODEITEM_Parent); + } + pPageArea = GetNextAvailPageArea(pPageArea, pTarget); + bRet = pPageArea != NULL; + } + break; + case XFA_ATTRIBUTEENUM_PageArea: + if (pTarget && pTarget->GetClassID() != XFA_ELEMENT_PageArea) { + pTarget = NULL; + } + if (!pTarget || !m_pCurrentContainerRecord || pTarget != GetCurrentContainerRecord()->pCurPageArea->m_pFormNode || bStartNew) { + CXFA_Node* pPageArea = GetNextAvailPageArea(pTarget, NULL, TRUE); + bRet = pPageArea != NULL; + } + break; + case XFA_ATTRIBUTEENUM_PageOdd: + if (pTarget && pTarget->GetClassID() != XFA_ELEMENT_PageArea) { + pTarget = NULL; + } + if (m_nAvailPages % 2 != 1 || !m_pCurrentContainerRecord || (pTarget && pTarget != GetCurrentContainerRecord()->pCurPageArea->m_pFormNode) || bStartNew) { + if(m_nAvailPages % 2 == 1) { + } + } + break; + case XFA_ATTRIBUTEENUM_PageEven: + if (pTarget && pTarget->GetClassID() != XFA_ELEMENT_PageArea) { + pTarget = NULL; + } + if (m_nAvailPages % 2 != 0 || !m_pCurrentContainerRecord || (pTarget && pTarget != GetCurrentContainerRecord()->pCurPageArea->m_pFormNode) || bStartNew) { + if(m_nAvailPages % 2 == 0) { + } + } + break; + case XFA_ATTRIBUTEENUM_Auto: + default: + break;; + } + return bRet; +} +FX_BOOL CXFA_LayoutPageMgr::ExecuteBreakBeforeOrAfter(CXFA_Node* pCurNode, FX_BOOL bBefore, CXFA_Node* &pBreakLeaderTemplate, CXFA_Node* &pBreakTrailerTemplate) +{ + XFA_ELEMENT eType = pCurNode->GetClassID(); + switch(eType) { + case XFA_ELEMENT_BreakBefore: + case XFA_ELEMENT_BreakAfter: { + CFX_WideStringC wsBreakLeader, wsBreakTrailer; + CXFA_Node* pFormNode = pCurNode->GetNodeItem(XFA_NODEITEM_Parent, XFA_OBJECTTYPE_ContainerNode); + CXFA_Node *pContainer = pFormNode->GetTemplateNode(); + FX_BOOL bStartNew = pCurNode->GetInteger(XFA_ATTRIBUTE_StartNew) != 0; + CXFA_Node *pScript = pCurNode->GetFirstChildByClass(XFA_ELEMENT_Script); + if(pScript && !XFA_LayoutPageMgr_RunBreakTestScript(pScript)) { + return FALSE; + } + CFX_WideStringC wsTarget = pCurNode->GetCData(XFA_ATTRIBUTE_Target); + CXFA_Node* pTarget = XFA_ResolveBreakTarget(m_pTemplatePageSetRoot, TRUE, wsTarget); + wsBreakTrailer = pCurNode->GetCData(XFA_ATTRIBUTE_Trailer); + wsBreakLeader = pCurNode->GetCData(XFA_ATTRIBUTE_Leader); + pBreakLeaderTemplate = XFA_ResolveBreakTarget(pContainer, TRUE, wsBreakLeader); + pBreakTrailerTemplate = XFA_ResolveBreakTarget(pContainer, TRUE, wsBreakTrailer); + if(RunBreak(eType, pCurNode->GetEnum(XFA_ATTRIBUTE_TargetType), pTarget, bStartNew)) { + return TRUE; + } else { + if(m_rgProposedContainerRecord.GetCount() > 0 && m_pCurrentContainerRecord == m_rgProposedContainerRecord.GetHeadPosition() + && eType == XFA_ELEMENT_BreakBefore) { + CXFA_Node* pParentNode = pFormNode->GetNodeItem(XFA_NODEITEM_Parent, XFA_OBJECTTYPE_ContainerNode); + if(!pParentNode || pFormNode != pParentNode->GetNodeItem(XFA_NODEITEM_FirstChild, XFA_OBJECTTYPE_ContainerNode)) { + break; + } + pParentNode = pParentNode->GetNodeItem(XFA_NODEITEM_Parent); + if(!pParentNode || pParentNode->GetClassID() != XFA_ELEMENT_Form) { + break; + } + return TRUE; + } + } + } + break; + case XFA_ELEMENT_Break: { + FX_BOOL bStartNew = pCurNode->GetInteger(XFA_ATTRIBUTE_StartNew) != 0; + CFX_WideStringC wsTarget = pCurNode->GetCData(bBefore ? XFA_ATTRIBUTE_BeforeTarget : XFA_ATTRIBUTE_AfterTarget); + CXFA_Node* pTarget = XFA_ResolveBreakTarget(m_pTemplatePageSetRoot, TRUE, wsTarget); + if(RunBreak(bBefore ? XFA_ELEMENT_BreakBefore : XFA_ELEMENT_BreakAfter, pCurNode->GetEnum(bBefore ? XFA_ATTRIBUTE_Before : XFA_ATTRIBUTE_After), pTarget, bStartNew)) { + return TRUE; + } + } + break; + default: + break; + } + return FALSE; +} +static void XFA_SetLayoutGeneratedNodeFlag(CXFA_Node* pNode) +{ + pNode->SetFlag(XFA_NODEFLAG_LayoutGeneratedNode, TRUE, FALSE); + pNode->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE, FALSE); +} +FX_BOOL CXFA_LayoutPageMgr::ProcessBreakBeforeOrAfter(CXFA_Node* pBreakNode, FX_BOOL bBefore, CXFA_Node* &pBreakLeaderNode, CXFA_Node* &pBreakTrailerNode, FX_BOOL& bCreatePage) +{ + CXFA_Node *pLeaderTemplate = NULL, *pTrailerTemplate = NULL; + CXFA_Node *pFormNode = pBreakNode->GetNodeItem(XFA_NODEITEM_Parent, XFA_OBJECTTYPE_ContainerNode); + if(XFA_ItemLayoutProcessor_IsTakingSpace(pFormNode)) { + bCreatePage = ExecuteBreakBeforeOrAfter(pBreakNode, bBefore, pLeaderTemplate, pTrailerTemplate); + CXFA_Document* pDocument = pBreakNode->GetDocument(); + CXFA_Node* pDataScope = NULL; + pFormNode = pFormNode->GetNodeItem(XFA_NODEITEM_Parent, XFA_OBJECTTYPE_ContainerNode); + if(pLeaderTemplate) { + if(!pDataScope) { + pDataScope = XFA_DataMerge_FindDataScope(pFormNode); + } + pBreakLeaderNode = pDocument->DataMerge_CopyContainer(pLeaderTemplate, pFormNode, pDataScope, TRUE); + pDocument->DataMerge_UpdateBindingRelations(pBreakLeaderNode); + XFA_SetLayoutGeneratedNodeFlag(pBreakLeaderNode); + } + if(pTrailerTemplate) { + if(!pDataScope) { + pDataScope = XFA_DataMerge_FindDataScope(pFormNode); + } + pBreakTrailerNode = pDocument->DataMerge_CopyContainer(pTrailerTemplate, pFormNode, pDataScope, TRUE); + pDocument->DataMerge_UpdateBindingRelations(pBreakTrailerNode); + XFA_SetLayoutGeneratedNodeFlag(pBreakTrailerNode); + } + return TRUE; + } + return FALSE; +} +FX_BOOL CXFA_LayoutPageMgr::ProcessBookendLeaderOrTrailer(CXFA_Node* pBookendNode, FX_BOOL bLeader, CXFA_Node* &pBookendAppendNode) +{ + CXFA_Node* pLeaderTemplate = NULL; + CXFA_Node* pFormNode = pBookendNode->GetNodeItem(XFA_NODEITEM_Parent, XFA_OBJECTTYPE_ContainerNode); + if(ResolveBookendLeaderOrTrailer(pBookendNode, bLeader, pLeaderTemplate)) { + CXFA_Document *pDocument = pBookendNode->GetDocument(); + CXFA_Node *pDataScope = NULL; + if(pLeaderTemplate) { + if(!pDataScope) { + pDataScope = XFA_DataMerge_FindDataScope(pFormNode); + } + pBookendAppendNode = pDocument->DataMerge_CopyContainer(pLeaderTemplate, pFormNode, pDataScope, TRUE); + pDocument->DataMerge_UpdateBindingRelations(pBookendAppendNode); + XFA_SetLayoutGeneratedNodeFlag(pBookendAppendNode); + return TRUE; + } + } + return FALSE; +} +CXFA_Node* CXFA_LayoutPageMgr::BreakOverflow(CXFA_Node* pOverflowNode, CXFA_Node*& pLeaderTemplate, CXFA_Node*& pTrailerTemplate, FX_BOOL bCreatePage ) +{ + CFX_WideStringC wsOverflowLeader, wsOverflowTrailer; + CXFA_Node *pContainer = pOverflowNode->GetNodeItem(XFA_NODEITEM_Parent, XFA_OBJECTTYPE_ContainerNode)->GetTemplateNode(); + if(pOverflowNode->GetClassID() == XFA_ELEMENT_Break) { + CFX_WideStringC wsOverflowLeader; + CFX_WideStringC wsOverflowTarget; + CFX_WideStringC wsOverflowTrailer; + pOverflowNode->TryCData(XFA_ATTRIBUTE_OverflowLeader, wsOverflowLeader); + pOverflowNode->TryCData(XFA_ATTRIBUTE_OverflowTrailer, wsOverflowTrailer); + pOverflowNode->TryCData(XFA_ATTRIBUTE_OverflowTarget, wsOverflowTarget); + if (!wsOverflowLeader.IsEmpty() || !wsOverflowTrailer.IsEmpty() || !wsOverflowTarget.IsEmpty()) { + if(!wsOverflowTarget.IsEmpty() && bCreatePage && !m_bCreateOverFlowPage) { + CXFA_Node* pTarget = XFA_ResolveBreakTarget(this->m_pTemplatePageSetRoot, TRUE, wsOverflowTarget); + if(pTarget) { + m_bCreateOverFlowPage = TRUE; + switch(pTarget->GetClassID()) { + case XFA_ELEMENT_PageArea: + RunBreak(XFA_ELEMENT_Overflow, XFA_ATTRIBUTEENUM_PageArea, pTarget, TRUE); + break; + case XFA_ELEMENT_ContentArea: + RunBreak(XFA_ELEMENT_Overflow, XFA_ATTRIBUTEENUM_ContentArea, pTarget, TRUE); + break; + default: + break; + } + } + } + if(!bCreatePage) { + pLeaderTemplate = XFA_ResolveBreakTarget(pContainer, TRUE, wsOverflowLeader); + pTrailerTemplate = XFA_ResolveBreakTarget(pContainer, TRUE, wsOverflowTrailer); + } + return pOverflowNode; + } + return NULL; + } else if(pOverflowNode->GetClassID() == XFA_ELEMENT_Overflow) { + CFX_WideStringC wsOverflowTarget; + pOverflowNode->TryCData(XFA_ATTRIBUTE_Leader, wsOverflowLeader); + pOverflowNode->TryCData(XFA_ATTRIBUTE_Trailer, wsOverflowTrailer); + pOverflowNode->TryCData(XFA_ATTRIBUTE_Target, wsOverflowTarget); + if(!wsOverflowTarget.IsEmpty() && bCreatePage && !m_bCreateOverFlowPage) { + CXFA_Node* pTarget = XFA_ResolveBreakTarget(this->m_pTemplatePageSetRoot, TRUE, wsOverflowTarget); + if(pTarget) { + m_bCreateOverFlowPage = TRUE; + switch(pTarget->GetClassID()) { + case XFA_ELEMENT_PageArea: + RunBreak(XFA_ELEMENT_Overflow, XFA_ATTRIBUTEENUM_PageArea, pTarget, TRUE); + break; + case XFA_ELEMENT_ContentArea: + RunBreak(XFA_ELEMENT_Overflow, XFA_ATTRIBUTEENUM_ContentArea, pTarget, TRUE); + break; + default: + break; + } + } + } + if(!bCreatePage) { + pLeaderTemplate = XFA_ResolveBreakTarget(pContainer, TRUE, wsOverflowLeader); + pTrailerTemplate = XFA_ResolveBreakTarget(pContainer, TRUE, wsOverflowTrailer); + } + return pOverflowNode; + } + return NULL; +} +FX_BOOL CXFA_LayoutPageMgr::ProcessOverflow(CXFA_Node* pFormNode, CXFA_Node* &pLeaderNode, CXFA_Node* &pTrailerNode, FX_BOOL bDataMerge, FX_BOOL bCreatePage) +{ + if(pFormNode == NULL) { + return FALSE; + } + CXFA_Node *pLeaderTemplate = NULL, *pTrailerTemplate = NULL; + FX_BOOL bIsOverflowNode = FALSE; + if(pFormNode->GetClassID() == XFA_ELEMENT_Overflow || pFormNode->GetClassID() == XFA_ELEMENT_Break) { + bIsOverflowNode = TRUE; + } + for(CXFA_Node* pCurNode = bIsOverflowNode ? pFormNode : pFormNode->GetNodeItem(XFA_NODEITEM_FirstChild); pCurNode; pCurNode = pCurNode->GetNodeItem((XFA_NODEITEM_NextSibling))) { + if(BreakOverflow(pCurNode, pLeaderTemplate, pTrailerTemplate, bCreatePage)) { + if(bIsOverflowNode) { + pFormNode = pCurNode->GetNodeItem(XFA_NODEITEM_Parent); + } + CXFA_Document *pDocument = pCurNode->GetDocument(); + CXFA_Node *pDataScope = NULL; + if(pLeaderTemplate) { + if(!pDataScope) { + pDataScope = XFA_DataMerge_FindDataScope(pFormNode); + } + pLeaderNode = pDocument->DataMerge_CopyContainer(pLeaderTemplate, pFormNode, pDataScope, TRUE); + pDocument->DataMerge_UpdateBindingRelations(pLeaderNode); + XFA_SetLayoutGeneratedNodeFlag(pLeaderNode); + } + if(pTrailerTemplate) { + if(!pDataScope) { + pDataScope = XFA_DataMerge_FindDataScope(pFormNode); + } + pTrailerNode = pDocument->DataMerge_CopyContainer(pTrailerTemplate, pFormNode, pDataScope, TRUE); + pDocument->DataMerge_UpdateBindingRelations(pTrailerNode); + XFA_SetLayoutGeneratedNodeFlag(pTrailerNode); + } + return TRUE; + } + if(bIsOverflowNode) { + break; + } + } + return FALSE; +} +FX_BOOL CXFA_LayoutPageMgr::ResolveBookendLeaderOrTrailer(CXFA_Node* pBookendNode, FX_BOOL bLeader, CXFA_Node* &pBookendAppendTemplate) +{ + CFX_WideStringC wsBookendLeader; + CXFA_Node *pContainer = pBookendNode->GetNodeItem(XFA_NODEITEM_Parent, XFA_OBJECTTYPE_ContainerNode)->GetTemplateNode(); + if(pBookendNode->GetClassID() == XFA_ELEMENT_Break) { + pBookendNode->TryCData(bLeader ? XFA_ATTRIBUTE_BookendLeader : XFA_ATTRIBUTE_BookendTrailer, wsBookendLeader); + if (!wsBookendLeader.IsEmpty()) { + pBookendAppendTemplate = XFA_ResolveBreakTarget(pContainer, FALSE, wsBookendLeader); + return TRUE; + } + return FALSE; + } else if(pBookendNode->GetClassID() == XFA_ELEMENT_Bookend) { + pBookendNode->TryCData(bLeader ? XFA_ATTRIBUTE_Leader : XFA_ATTRIBUTE_Trailer, wsBookendLeader); + pBookendAppendTemplate = XFA_ResolveBreakTarget(pContainer, TRUE, wsBookendLeader); + return TRUE; + } + return FALSE; +} +FX_BOOL CXFA_LayoutPageMgr::FindPageAreaFromPageSet(CXFA_Node* pPageSet, CXFA_Node* pStartChild, CXFA_Node* pTargetPageArea, CXFA_Node* pTargetContentArea, FX_BOOL bNewPage, FX_BOOL bQuery) +{ + if(pPageSet == NULL && pStartChild == NULL) { + return FALSE; + } + FX_INT32 iPageSetCount = 0; + if(IsPageSetRootOrderedOccurrence()) { + return FindPageAreaFromPageSet_Ordered(pPageSet, pStartChild, pTargetPageArea, pTargetContentArea, bNewPage, bQuery); + } + XFA_ATTRIBUTEENUM ePreferredPosition = m_pCurrentContainerRecord ? XFA_ATTRIBUTEENUM_Rest : XFA_ATTRIBUTEENUM_First; + return FindPageAreaFromPageSet_SimplexDuplex(pPageSet, pStartChild, pTargetPageArea, pTargetContentArea, bNewPage, bQuery, ePreferredPosition); +} +FX_BOOL CXFA_LayoutPageMgr::FindPageAreaFromPageSet_Ordered(CXFA_Node* pPageSet, CXFA_Node* pStartChild, CXFA_Node* pTargetPageArea, CXFA_Node* pTargetContentArea, FX_BOOL bNewPage, FX_BOOL bQuery) +{ + FX_INT32 iPageSetCount = 0; + if(!pStartChild && !bQuery) { + m_pPageSetMap.Lookup(pPageSet, iPageSetCount); + FX_INT32 iMax = -1; + CXFA_Node* pOccurNode = pPageSet->GetFirstChildByClass(XFA_ELEMENT_Occur); + if(pOccurNode) { + pOccurNode->TryInteger(XFA_ATTRIBUTE_Max, iMax, FALSE); + } + if (iMax >= 0 && iMax <= iPageSetCount) { + return FALSE; + } + } + FX_BOOL bRes = FALSE; + CXFA_Node *pCurrentNode = pStartChild ? pStartChild->GetNodeItem(XFA_NODEITEM_NextSibling) : pPageSet->GetNodeItem(XFA_NODEITEM_FirstChild); + for(; pCurrentNode; pCurrentNode = pCurrentNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if(pCurrentNode->GetClassID() == XFA_ELEMENT_PageArea) { + if((pTargetPageArea == pCurrentNode || pTargetPageArea == NULL)) { + if (pCurrentNode->GetFirstChildByClass(XFA_ELEMENT_ContentArea) == NULL) { + if(pTargetPageArea == pCurrentNode) { + CreateMinPageRecord(pCurrentNode, TRUE); + pTargetPageArea = NULL; + } + continue; + } + if (!bQuery) { + CXFA_ContainerRecord* pNewRecord = CreateContainerRecord(pCurrentNode, pStartChild == NULL); + AddPageAreaLayoutItem(pNewRecord, pCurrentNode); + if(pTargetContentArea == NULL) { + pTargetContentArea = pCurrentNode->GetFirstChildByClass(XFA_ELEMENT_ContentArea); + } + AddContentAreaLayoutItem(pNewRecord, pTargetContentArea); + } + m_pCurPageArea = pCurrentNode; + m_nCurPageCount = 1; + bRes = TRUE; + break; + } + if(!bQuery) { + CreateMinPageRecord(pCurrentNode, FALSE); + } + } else if(pCurrentNode->GetClassID() == XFA_ELEMENT_PageSet) { + if(FindPageAreaFromPageSet_Ordered(pCurrentNode, NULL, pTargetPageArea, pTargetContentArea, bNewPage, bQuery)) { + bRes = TRUE; + break; + } + if(!bQuery) { + CreateMinPageSetRecord(pCurrentNode, TRUE); + } + } + } + if(!pStartChild && bRes && !bQuery) { + m_pPageSetMap.SetAt(pPageSet, ++ iPageSetCount); + } + return bRes; +} +FX_BOOL CXFA_LayoutPageMgr::FindPageAreaFromPageSet_SimplexDuplex(CXFA_Node* pPageSet, CXFA_Node* pStartChild, CXFA_Node* pTargetPageArea, CXFA_Node* pTargetContentArea, FX_BOOL bNewPage, FX_BOOL bQuery, XFA_ATTRIBUTEENUM ePreferredPosition) +{ + XFA_ATTRIBUTEENUM eAdvisedPagePosition = pTargetPageArea ? pTargetPageArea->GetEnum(XFA_ATTRIBUTE_PagePosition) : (XFA_ATTRIBUTEENUM) - 1; + const XFA_ATTRIBUTEENUM eFallbackPosition = XFA_ATTRIBUTEENUM_Any; + CXFA_Node *pPreferredPageArea = NULL, *pFallbackPageArea = NULL; + CXFA_Node* pCurrentNode = NULL; + if (!pStartChild || pStartChild->GetClassID() == XFA_ELEMENT_PageArea) { + pCurrentNode = pPageSet->GetNodeItem(XFA_NODEITEM_FirstChild); + } else { + pCurrentNode = pStartChild->GetNodeItem(XFA_NODEITEM_NextSibling); + } + for(; pCurrentNode; pCurrentNode = pCurrentNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if(pCurrentNode->GetClassID() == XFA_ELEMENT_PageArea) { + if(!MatchPageAreaOddOrEven(pCurrentNode, FALSE)) { + continue; + } + XFA_ATTRIBUTEENUM eCurPagePosition = pCurrentNode->GetEnum(XFA_ATTRIBUTE_PagePosition); + if(ePreferredPosition == XFA_ATTRIBUTEENUM_Last) { + if (eCurPagePosition != ePreferredPosition) { + continue; + } + if (m_ePageSetMode == XFA_ATTRIBUTEENUM_SimplexPaginated || pCurrentNode->GetEnum(XFA_ATTRIBUTE_OddOrEven) == XFA_ATTRIBUTEENUM_Any) { + pPreferredPageArea = pCurrentNode; + break; + } + CXFA_ContainerRecord* pNewRecord = CreateContainerRecord(); + AddPageAreaLayoutItem(pNewRecord, pCurrentNode); + AddContentAreaLayoutItem(pNewRecord, pCurrentNode->GetFirstChildByClass(XFA_ELEMENT_ContentArea)); + pPreferredPageArea = pCurrentNode; + return FALSE; + } else if(ePreferredPosition == XFA_ATTRIBUTEENUM_Only) { + if (eCurPagePosition != ePreferredPosition) { + continue; + } + if (m_ePageSetMode != XFA_ATTRIBUTEENUM_DuplexPaginated || pCurrentNode->GetEnum(XFA_ATTRIBUTE_OddOrEven) == XFA_ATTRIBUTEENUM_Any) { + pPreferredPageArea = pCurrentNode; + break; + } + return FALSE; + } + if((pTargetPageArea == pCurrentNode || pTargetPageArea == NULL)) { + if (pCurrentNode->GetFirstChildByClass(XFA_ELEMENT_ContentArea) == NULL) { + if(pTargetPageArea == pCurrentNode) { + CXFA_ContainerRecord* pNewRecord = CreateContainerRecord(); + AddPageAreaLayoutItem(pNewRecord, pCurrentNode); + pTargetPageArea = NULL; + } + continue; + } + if((ePreferredPosition == XFA_ATTRIBUTEENUM_Rest && eCurPagePosition == XFA_ATTRIBUTEENUM_Any) || eCurPagePosition == ePreferredPosition) { + pPreferredPageArea = pCurrentNode; + break; + } else if(eCurPagePosition == eFallbackPosition && !pFallbackPageArea) { + pFallbackPageArea = pCurrentNode; + } + } else if (pTargetPageArea && !MatchPageAreaOddOrEven(pTargetPageArea, FALSE)) { + CXFA_ContainerRecord* pNewRecord = CreateContainerRecord(); + AddPageAreaLayoutItem(pNewRecord, pCurrentNode); + AddContentAreaLayoutItem(pNewRecord, pCurrentNode->GetFirstChildByClass(XFA_ELEMENT_ContentArea)); + } + } else if(pCurrentNode->GetClassID() == XFA_ELEMENT_PageSet) { + if(FindPageAreaFromPageSet_SimplexDuplex(pCurrentNode, NULL, pTargetPageArea, pTargetContentArea, bNewPage, bQuery, ePreferredPosition)) { + break; + } + } + } + CXFA_Node* pCurPageArea = NULL; + if(pPreferredPageArea) { + pCurPageArea = pPreferredPageArea; + } else if(pFallbackPageArea) { + pCurPageArea = pFallbackPageArea; + } + if (!pCurPageArea) { + return FALSE; + } + if (!bQuery) { + CXFA_ContainerRecord* pNewRecord = CreateContainerRecord(); + AddPageAreaLayoutItem(pNewRecord, pCurPageArea); + if(pTargetContentArea == NULL) { + pTargetContentArea = pCurPageArea->GetFirstChildByClass(XFA_ELEMENT_ContentArea); + } + AddContentAreaLayoutItem(pNewRecord, pTargetContentArea); + } + m_pCurPageArea = pCurPageArea; + return TRUE; +} +FX_BOOL CXFA_LayoutPageMgr::MatchPageAreaOddOrEven(CXFA_Node* pPageArea, FX_BOOL bLastMatch) +{ + if (m_ePageSetMode != XFA_ATTRIBUTEENUM_DuplexPaginated) { + return TRUE; + } + XFA_ATTRIBUTEENUM eOddOrEven = XFA_ATTRIBUTEENUM_Any; + pPageArea->TryEnum(XFA_ATTRIBUTE_OddOrEven, eOddOrEven); + if (eOddOrEven != XFA_ATTRIBUTEENUM_Any) { + FX_INT32 iPageCount = GetPageCount(); + if (bLastMatch) { + return eOddOrEven == XFA_ATTRIBUTEENUM_Odd ? iPageCount % 2 == 1 : iPageCount % 2 == 0; + } + return eOddOrEven == XFA_ATTRIBUTEENUM_Odd ? iPageCount % 2 == 0 : iPageCount % 2 == 1; + } + return TRUE; +} +CXFA_Node* CXFA_LayoutPageMgr::GetNextAvailPageArea(CXFA_Node* pTargetPageArea, CXFA_Node* pTargetContentArea, FX_BOOL bNewPage, FX_BOOL bQuery) +{ + if(m_pCurPageArea == NULL) { + FindPageAreaFromPageSet(m_pTemplatePageSetRoot, NULL, pTargetPageArea, pTargetContentArea, bNewPage, bQuery); + ASSERT(m_pCurPageArea); + return m_pCurPageArea; + } + if(pTargetPageArea == NULL || pTargetPageArea == m_pCurPageArea) { + if(!bNewPage && GetNextContentArea(pTargetContentArea)) { + return m_pCurPageArea; + } + if(IsPageSetRootOrderedOccurrence()) { + FX_INT32 iMax = -1; + CXFA_Node* pOccurNode = m_pCurPageArea->GetFirstChildByClass(XFA_ELEMENT_Occur); + if(pOccurNode) { + pOccurNode->TryInteger(XFA_ATTRIBUTE_Max, iMax, FALSE); + } + if((iMax < 0 || m_nCurPageCount < iMax)) { + if (!bQuery) { + CXFA_ContainerRecord* pNewRecord = CreateContainerRecord(m_pCurPageArea); + AddPageAreaLayoutItem(pNewRecord, m_pCurPageArea); + if(pTargetContentArea == NULL) { + pTargetContentArea = m_pCurPageArea->GetFirstChildByClass(XFA_ELEMENT_ContentArea); + } + AddContentAreaLayoutItem(pNewRecord, pTargetContentArea); + } + m_nCurPageCount ++; + return m_pCurPageArea; + } + } + } + if(!bQuery && IsPageSetRootOrderedOccurrence()) { + CreateMinPageRecord(m_pCurPageArea, FALSE, TRUE); + } + if(FindPageAreaFromPageSet(m_pCurPageArea->GetNodeItem(XFA_NODEITEM_Parent), m_pCurPageArea, pTargetPageArea, pTargetContentArea, bNewPage, bQuery)) { + return m_pCurPageArea; + } + CXFA_Node* pPageSet = m_pCurPageArea->GetNodeItem(XFA_NODEITEM_Parent); + while(TRUE) { + if (FindPageAreaFromPageSet(pPageSet, NULL, pTargetPageArea, pTargetContentArea, bNewPage, bQuery)) { + return m_pCurPageArea; + } + if(!bQuery && IsPageSetRootOrderedOccurrence()) { + CreateMinPageSetRecord(pPageSet); + } + if(FindPageAreaFromPageSet(NULL, pPageSet, pTargetPageArea, pTargetContentArea, bNewPage, bQuery)) { + return m_pCurPageArea; + } + if(pPageSet == m_pTemplatePageSetRoot) { + break; + } + pPageSet = pPageSet->GetNodeItem(XFA_NODEITEM_Parent); + } + return NULL; +} +static FX_BOOL XFA_LayoutPageMgr_CheckContentAreaNotUsed(CXFA_ContainerLayoutItemImpl* pPageAreaLayoutItem, CXFA_Node* pContentArea, CXFA_ContainerLayoutItemImpl*& pContentAreaLayoutItem) +{ + for(CXFA_ContainerLayoutItemImpl* pLayoutItem = (CXFA_ContainerLayoutItemImpl*)pPageAreaLayoutItem->m_pFirstChild; pLayoutItem; pLayoutItem = (CXFA_ContainerLayoutItemImpl*)pLayoutItem->m_pNextSibling) { + if(pLayoutItem->m_pFormNode == pContentArea) { + if(pLayoutItem->m_pFirstChild == NULL) { + pContentAreaLayoutItem = pLayoutItem; + return TRUE; + } + return FALSE; + } + } + return TRUE; +} +FX_BOOL CXFA_LayoutPageMgr::GetNextContentArea(CXFA_Node* pContentArea) +{ + CXFA_Node* pCurContentNode = GetCurrentContainerRecord()->pCurContentArea->m_pFormNode; + if(pContentArea == NULL) { + pContentArea = pCurContentNode->GetNextSameClassSibling(XFA_ELEMENT_ContentArea); + if(pContentArea == NULL) { + return FALSE; + } + } else { + if(pContentArea->GetNodeItem(XFA_NODEITEM_Parent) != m_pCurPageArea) { + return FALSE; + } + CXFA_ContainerLayoutItemImpl* pContentAreaLayout = NULL; + if(!XFA_LayoutPageMgr_CheckContentAreaNotUsed(GetCurrentContainerRecord()->pCurPageArea, pContentArea, pContentAreaLayout)) { + return FALSE; + } + if(pContentAreaLayout) { + if(pContentAreaLayout->m_pFormNode != pCurContentNode) { + CXFA_ContainerRecord* pNewRecord = CreateContainerRecord(); + pNewRecord->pCurContentArea = pContentAreaLayout; + return TRUE; + } else { + return FALSE; + } + } + } + CXFA_ContainerRecord* pNewRecord = CreateContainerRecord(); + AddContentAreaLayoutItem(pNewRecord, pContentArea); + return TRUE; +} +void CXFA_LayoutPageMgr::InitPageSetMap() +{ + if(!IsPageSetRootOrderedOccurrence()) { + return; + } + CXFA_NodeIterator sIterator(m_pTemplatePageSetRoot); + for (CXFA_Node* pPageSetNode = sIterator.GetCurrent(); pPageSetNode; pPageSetNode = sIterator.MoveToNext()) { + if(pPageSetNode->GetClassID() == XFA_ELEMENT_PageSet) { + XFA_ATTRIBUTEENUM eRelation = pPageSetNode->GetEnum(XFA_ATTRIBUTE_Relation); + if(eRelation == XFA_ATTRIBUTEENUM_OrderedOccurrence) { + m_pPageSetMap.SetAt(pPageSetNode, 0); + } + } + } +} +FX_INT32 CXFA_LayoutPageMgr::CreateMinPageRecord(CXFA_Node* pPageArea, FX_BOOL bTargetPageArea, FX_BOOL bCreateLast) +{ + if(pPageArea == NULL) { + return 0; + } + CXFA_Node* pOccurNode = pPageArea->GetFirstChildByClass(XFA_ELEMENT_Occur); + FX_INT32 iMin = 0; + if((pOccurNode && pOccurNode->TryInteger(XFA_ATTRIBUTE_Min, iMin, FALSE)) || bTargetPageArea) { + CXFA_Node* pContentArea = pPageArea->GetFirstChildByClass(XFA_ELEMENT_ContentArea); + if (iMin < 1 && bTargetPageArea && !pContentArea) { + iMin = 1; + } + FX_INT32 i = 0; + if(bCreateLast) { + i = m_nCurPageCount; + } + for(; i < iMin; i++) { + CXFA_ContainerRecord* pNewRecord = CreateContainerRecord(); + AddPageAreaLayoutItem(pNewRecord, pPageArea); + AddContentAreaLayoutItem(pNewRecord, pContentArea); + } + } + return iMin; +} +void CXFA_LayoutPageMgr::CreateMinPageSetRecord(CXFA_Node* pPageSet, FX_BOOL bCreateAll) +{ + if(pPageSet == NULL) { + return; + } + FX_INT32 iCurSetCount = 0; + if(!m_pPageSetMap.Lookup(pPageSet, iCurSetCount)) { + return; + } + if(bCreateAll) { + iCurSetCount = 0; + } + CXFA_Node* pOccurNode = pPageSet->GetFirstChildByClass(XFA_ELEMENT_Occur); + FX_INT32 iMin = 0; + if(pOccurNode && pOccurNode->TryInteger(XFA_ATTRIBUTE_Min, iMin, FALSE)) { + if(iCurSetCount < iMin) { + for(FX_INT32 i = 0; i < iMin - iCurSetCount; i++) { + for(CXFA_Node *pCurrentPageNode = pPageSet->GetNodeItem(XFA_NODEITEM_FirstChild); pCurrentPageNode; pCurrentPageNode = pCurrentPageNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if(pCurrentPageNode->GetClassID() == XFA_ELEMENT_PageArea) { + CreateMinPageRecord(pCurrentPageNode, FALSE); + } else if(pCurrentPageNode->GetClassID() == XFA_ELEMENT_PageSet) { + CreateMinPageSetRecord(pCurrentPageNode, TRUE); + } + } + } + m_pPageSetMap.SetAt(pPageSet, iMin); + } + } +} +void CXFA_LayoutPageMgr::CreateNextMinRecord(CXFA_Node* pRecordNode) +{ + if(pRecordNode == NULL) { + return; + } + for(CXFA_Node *pCurrentNode = pRecordNode->GetNodeItem(XFA_NODEITEM_NextSibling); pCurrentNode; pCurrentNode = pCurrentNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if(pCurrentNode->GetClassID() == XFA_ELEMENT_PageArea) { + CreateMinPageRecord(pCurrentNode, FALSE); + } else if(pCurrentNode->GetClassID() == XFA_ELEMENT_PageSet) { + CreateMinPageSetRecord(pCurrentNode, TRUE); + } + } +} +void CXFA_LayoutPageMgr::ProcessLastPageSet() +{ + CreateMinPageRecord(m_pCurPageArea, FALSE, TRUE); + CreateNextMinRecord(m_pCurPageArea); + CXFA_Node* pPageSet = m_pCurPageArea->GetNodeItem(XFA_NODEITEM_Parent); + while(TRUE) { + CreateMinPageSetRecord(pPageSet); + if(pPageSet == m_pTemplatePageSetRoot) { + break; + } + CreateNextMinRecord(pPageSet); + pPageSet = pPageSet->GetNodeItem(XFA_NODEITEM_Parent); + } +} +FX_BOOL CXFA_LayoutPageMgr::GetNextAvailContentHeight(FX_FLOAT fChildHeight) +{ + CXFA_Node* pCurContentNode = GetCurrentContainerRecord()->pCurContentArea->m_pFormNode; + if(pCurContentNode == NULL) { + return FALSE; + } + pCurContentNode = pCurContentNode->GetNextSameClassSibling(XFA_ELEMENT_ContentArea); + if(pCurContentNode) { + FX_FLOAT fNextContentHeight = pCurContentNode->GetMeasure(XFA_ATTRIBUTE_H).ToUnit(XFA_UNIT_Pt); + return fNextContentHeight > fChildHeight ? TRUE : FALSE; + } + CXFA_Node* pPageNode = GetCurrentContainerRecord()->pCurPageArea->m_pFormNode; + CXFA_Node* pOccurNode = pPageNode->GetFirstChildByClass(XFA_ELEMENT_Occur); + FX_INT32 iMax = 0; + if(pOccurNode && pOccurNode->TryInteger(XFA_ATTRIBUTE_Max, iMax, FALSE)) { + if(m_nCurPageCount == iMax) { + CXFA_Node* pSrcPage = m_pCurPageArea; + FX_INT32 nSrcPageCount = m_nCurPageCount; + FX_POSITION psSrcRecord = m_rgProposedContainerRecord.GetTailPosition(); + CXFA_Node* pNextPage = GetNextAvailPageArea(NULL, NULL, FALSE, TRUE); + m_pCurPageArea = pSrcPage; + m_nCurPageCount = nSrcPageCount; + CXFA_ContainerRecord* pPrevRecord = (CXFA_ContainerRecord*)m_rgProposedContainerRecord.GetNext(psSrcRecord); + while (psSrcRecord) { + FX_POSITION psSaveRecord = psSrcRecord; + CXFA_ContainerRecord* pInsertRecord = (CXFA_ContainerRecord*)m_rgProposedContainerRecord.GetNext(psSrcRecord); + RemoveLayoutRecord(pInsertRecord, pPrevRecord); + delete pInsertRecord; + m_rgProposedContainerRecord.RemoveAt(psSaveRecord); + } + if(pNextPage) { + CXFA_Node* pContentArea = pNextPage->GetFirstChildByClass(XFA_ELEMENT_ContentArea); + if(pContentArea) { + FX_FLOAT fNextContentHeight = pContentArea->GetMeasure(XFA_ATTRIBUTE_H).ToUnit(XFA_UNIT_Pt); + if(fNextContentHeight > fChildHeight) { + return TRUE; + } + } + } + return FALSE; + } + } + CXFA_Node* pContentArea = pPageNode->GetFirstChildByClass(XFA_ELEMENT_ContentArea); + FX_FLOAT fNextContentHeight = pContentArea->GetMeasure(XFA_ATTRIBUTE_H).ToUnit(XFA_UNIT_Pt); + if (fNextContentHeight < XFA_LAYOUT_FLOAT_PERCISION) { + return TRUE; + } + if(fNextContentHeight > fChildHeight) { + return TRUE; + } + return FALSE; +} +void CXFA_LayoutPageMgr::ClearData() +{ + ClearRecordList(); +} +void CXFA_LayoutPageMgr::ClearRecordList() +{ + if (!m_pTemplatePageSetRoot) { + return; + } + if(m_rgProposedContainerRecord.GetCount() > 0) { + FX_POSITION sPos; + sPos = m_rgProposedContainerRecord.GetHeadPosition(); + while(sPos) { + CXFA_ContainerRecord* pRecord = (CXFA_ContainerRecord*)m_rgProposedContainerRecord.GetNext(sPos); + delete pRecord; + } + m_rgProposedContainerRecord.RemoveAll(); + } + m_pCurrentContainerRecord = NULL; + m_pCurPageArea = NULL; + m_nCurPageCount = 0; + m_bCreateOverFlowPage = FALSE; + m_pPageSetMap.RemoveAll(); +} +CXFA_LayoutItemImpl* CXFA_LayoutPageMgr::FindOrCreateLayoutItem(CXFA_Node* pFormNode) +{ +#if defined(_XFA_LAYOUTITEM_MAPCACHE_) + if (m_NodeToContent.GetCount() > 0) { + CXFA_ContentLayoutItemImpl* pLayoutItem = NULL; + if (m_NodeToContent.Lookup(pFormNode, (void*&)pLayoutItem)) { + if (pLayoutItem->m_pNext) { + m_NodeToContent.SetAt(pFormNode, pLayoutItem->m_pNext); + pLayoutItem->m_pNext->m_pPrev = NULL; + pLayoutItem->m_pNext = NULL; + } else { + m_NodeToContent.RemoveKey(pFormNode); + } + pLayoutItem->m_pFormNode = pFormNode; + return pLayoutItem; + } + } +#endif + return (CXFA_LayoutItemImpl*)pFormNode->GetDocument()->GetParser()->GetNotify()->OnCreateLayoutItem(pFormNode); +} +#if defined(_XFA_LAYOUTITEM_MAPCACHE_) +void CXFA_LayoutPageMgr::SaveLayoutItem(CXFA_LayoutItemImpl* pParentLayoutItem) +{ + CXFA_LayoutItemImpl *pNextLayoutItem, *pCurLayoutItem = pParentLayoutItem->m_pFirstChild; + while (pCurLayoutItem) { + pNextLayoutItem = pCurLayoutItem->m_pNextSibling; + if (pCurLayoutItem->m_pFirstChild) { + SaveLayoutItem(pCurLayoutItem); + } + if (pCurLayoutItem->IsContentLayoutItem()) { + if (m_NodeToContent.GetValueAt(pCurLayoutItem->m_pFormNode) == NULL) { + pCurLayoutItem->m_pFormNode->SetUserData(XFA_LAYOUTITEMKEY, NULL); + m_NodeToContent.SetAt(pCurLayoutItem->m_pFormNode, pCurLayoutItem); + } + } else if (pCurLayoutItem->m_pFormNode->GetClassID() != XFA_ELEMENT_PageArea) { + delete pCurLayoutItem; + pCurLayoutItem = NULL; + } + if (pCurLayoutItem) { + pCurLayoutItem->m_pParent = NULL; + pCurLayoutItem->m_pNextSibling = NULL; + pCurLayoutItem->m_pFirstChild = NULL; + } + pCurLayoutItem = pNextLayoutItem; + } +} +#elif defined(_XFA_LAYOUTITEM_ProcessCACHE_) +static void XFA_SyncRemoveLayoutItem(CXFA_LayoutItemImpl* pParentLayoutItem, IXFA_Notify* pNotify, IXFA_DocLayout* pDocLayout) +{ + CXFA_LayoutItemImpl *pNextLayoutItem, *pCurLayoutItem = pParentLayoutItem->m_pFirstChild; + while (pCurLayoutItem) { + pNextLayoutItem = pCurLayoutItem->m_pNextSibling; + if (pCurLayoutItem->m_pFirstChild) { + XFA_SyncRemoveLayoutItem(pCurLayoutItem, pNotify, pDocLayout); + } + pNotify->OnLayoutEvent(pDocLayout, (CXFA_LayoutItem*)pCurLayoutItem, XFA_LAYOUTEVENT_ItemRemoving); + delete pCurLayoutItem; + pCurLayoutItem = pNextLayoutItem; + } +} +void CXFA_LayoutPageMgr::SaveLayoutItem(CXFA_LayoutItemImpl* pParentLayoutItem) +{ + CXFA_LayoutItemImpl *pNextLayoutItem, *pCurLayoutItem = pParentLayoutItem->m_pFirstChild; + while (pCurLayoutItem) { + pNextLayoutItem = pCurLayoutItem->m_pNextSibling; + if (pCurLayoutItem->IsContentLayoutItem()) { + FX_DWORD dwFlag = pCurLayoutItem->m_pFormNode->GetFlag(); + if (dwFlag & (XFA_NODEFLAG_HasRemoved)) { + IXFA_Notify* pNotify = m_pTemplatePageSetRoot->GetDocument()->GetParser()->GetNotify(); + IXFA_DocLayout* pDocLayout = m_pTemplatePageSetRoot->GetDocument()->GetDocLayout(); + if (pCurLayoutItem->m_pFirstChild) { + XFA_SyncRemoveLayoutItem(pCurLayoutItem, pNotify, pDocLayout); + } + pNotify->OnLayoutEvent(pDocLayout, (CXFA_LayoutItem*)pCurLayoutItem, XFA_LAYOUTEVENT_ItemRemoving); + delete pCurLayoutItem; + pCurLayoutItem = pNextLayoutItem; + continue; + } + if (dwFlag & XFA_NODEFLAG_LayoutGeneratedNode) { + CXFA_NodeIteratorTemplate sIterator(pCurLayoutItem->m_pFormNode); + for(CXFA_Node *pNode = sIterator.GetCurrent(); pNode; pNode = sIterator.MoveToNext()) { + pNode->SetFlag(XFA_NODEFLAG_UnusedNode, TRUE, FALSE); + } + } + } + if (pCurLayoutItem->m_pFirstChild) { + SaveLayoutItem(pCurLayoutItem); + } + pCurLayoutItem->m_pParent = NULL; + pCurLayoutItem->m_pNextSibling = NULL; + pCurLayoutItem->m_pFirstChild = NULL; + if (!pCurLayoutItem->IsContentLayoutItem() && pCurLayoutItem->m_pFormNode->GetClassID() != XFA_ELEMENT_PageArea) { + delete pCurLayoutItem; + } + pCurLayoutItem = pNextLayoutItem; + } +} +#endif +CXFA_Node* CXFA_LayoutPageMgr::QueryOverflow(CXFA_Node* pFormNode, CXFA_LayoutContext* pLayoutContext) +{ + for(CXFA_Node* pCurNode = pFormNode->GetNodeItem(XFA_NODEITEM_FirstChild); pCurNode; pCurNode = pCurNode->GetNodeItem((XFA_NODEITEM_NextSibling))) { + if(pCurNode->GetClassID() == XFA_ELEMENT_Break) { + CFX_WideStringC wsOverflowLeader; + CFX_WideStringC wsOverflowTarget; + CFX_WideStringC wsOverflowTrailer; + pCurNode->TryCData(XFA_ATTRIBUTE_OverflowLeader, wsOverflowLeader); + pCurNode->TryCData(XFA_ATTRIBUTE_OverflowTrailer, wsOverflowTrailer); + pCurNode->TryCData(XFA_ATTRIBUTE_OverflowTarget, wsOverflowTarget); + if (!wsOverflowLeader.IsEmpty() || !wsOverflowTrailer.IsEmpty() || !wsOverflowTarget.IsEmpty()) { + return pCurNode; + } + return NULL; + } else if(pCurNode->GetClassID() == XFA_ELEMENT_Overflow) { + return pCurNode; + } + } + return NULL; +} +void CXFA_LayoutPageMgr::MergePageSetContents() +{ + CXFA_Document *pDocument = m_pTemplatePageSetRoot->GetDocument(); + IXFA_Notify* pNotify = pDocument->GetParser()->GetNotify(); + IXFA_DocLayout* pDocLayout = pDocument->GetDocLayout(); + CXFA_ContainerLayoutItemImpl* pRootLayout = this->GetRootLayoutItem(); + { + for(FX_INT32 iIndex = 0; iIndex < pDocument->m_pPendingPageSet.GetSize(); iIndex ++) { + CXFA_NodeIteratorTemplate sIterator(pDocument->m_pPendingPageSet.GetAt(iIndex)); + for(CXFA_Node *pNode = sIterator.GetCurrent(); pNode; pNode = sIterator.MoveToNext()) { + if(pNode->IsContainerNode()) { + CXFA_Node* pBindNode = pNode->GetBindData(); + if (pBindNode) { + pBindNode->RemoveBindItem(pNode); + pNode->SetObject(XFA_ATTRIBUTE_BindingNode, NULL); + } + } + pNode->SetFlag(XFA_NODEFLAG_UnusedNode); + } + } + } + FX_INT32 iIndex = 0; + CXFA_Node* pPendingPageSet = NULL; + for(; pRootLayout; pRootLayout = (CXFA_ContainerLayoutItemImpl* )pRootLayout->m_pNextSibling) { + pPendingPageSet = NULL; + CXFA_NodeIteratorTemplate iterator(pRootLayout); + CXFA_ContainerLayoutItemImpl* pRootPageSetContainerItem = iterator.GetCurrent(); + ASSERT(pRootPageSetContainerItem->m_pFormNode->GetClassID() == XFA_ELEMENT_PageSet); + if(iIndex < pDocument->m_pPendingPageSet.GetSize()) { + pPendingPageSet = pDocument->m_pPendingPageSet.GetAt(iIndex); + iIndex ++; + } + if(!pPendingPageSet) { + if(pRootPageSetContainerItem->m_pFormNode->GetPacketID() == XFA_XDPPACKET_Template) { + pPendingPageSet = pRootPageSetContainerItem->m_pFormNode->CloneTemplateToForm(FALSE); + } else { + pPendingPageSet = pRootPageSetContainerItem->m_pFormNode; + } + } + if (pRootPageSetContainerItem->m_pFormNode->GetUserData(XFA_LAYOUTITEMKEY) == pRootPageSetContainerItem) { + pRootPageSetContainerItem->m_pFormNode->SetUserData(XFA_LAYOUTITEMKEY, NULL); + } + pRootPageSetContainerItem->m_pFormNode = pPendingPageSet; + pPendingPageSet->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE); + for(CXFA_ContainerLayoutItemImpl* pContainerItem = iterator.MoveToNext(); pContainerItem; pContainerItem = iterator.MoveToNext()) { + CXFA_Node* pNode = pContainerItem->m_pFormNode; + if(pNode->GetPacketID() != XFA_XDPPACKET_Template) { + continue; + } + switch(pNode->GetClassID()) { + case XFA_ELEMENT_PageSet: { + CXFA_Node* pParentNode = pContainerItem->m_pParent->m_pFormNode; + pContainerItem->m_pFormNode = XFA_NodeMerge_CloneOrMergeContainer(pDocument, pParentNode, pContainerItem->m_pFormNode, TRUE); + } + break; + case XFA_ELEMENT_PageArea: { + CXFA_ContainerLayoutItemImpl* pFormLayout = pContainerItem; + CXFA_Node* pParentNode = pContainerItem->m_pParent->m_pFormNode; + FX_BOOL bIsExistForm = TRUE; + for(FX_INT32 iLevel = 0; iLevel < 3; iLevel ++) { + pFormLayout = (CXFA_ContainerLayoutItemImpl*)pFormLayout->m_pFirstChild; + if(iLevel == 2) { + while(pFormLayout && !XFA_ItemLayoutProcessor_IsTakingSpace(pFormLayout->m_pFormNode)) { + pFormLayout = (CXFA_ContainerLayoutItemImpl*)pFormLayout->m_pNextSibling; + } + } + if(pFormLayout == NULL) { + bIsExistForm = FALSE; + break; + } + } + if(bIsExistForm) { + CXFA_Node* pNewSubform = pFormLayout->m_pFormNode; + if( pContainerItem->m_pOldSubform != NULL && pContainerItem->m_pOldSubform != pNewSubform) { + CXFA_Node* pExistingNode = XFA_DataMerge_FindFormDOMInstance(pDocument, pContainerItem->m_pFormNode->GetClassID(), pContainerItem->m_pFormNode->GetNameHash(), pParentNode); + CXFA_ContainerIterator sIterator(pExistingNode); + for(CXFA_Node *pNode = sIterator.GetCurrent(); pNode; pNode = sIterator.MoveToNext()) { + if(pNode->GetClassID() != XFA_ELEMENT_ContentArea) { + CXFA_LayoutItemImpl* pLayoutItem = (CXFA_LayoutItemImpl*)pNode->GetUserData(XFA_LAYOUTITEMKEY); + if(pLayoutItem) { + pNotify->OnLayoutEvent(pDocLayout, (CXFA_LayoutItem*)pLayoutItem, XFA_LAYOUTEVENT_ItemRemoving); + delete pLayoutItem; + } + } + } + if(pExistingNode) { + pParentNode->RemoveChild(pExistingNode); + } + } + pContainerItem->m_pOldSubform = pNewSubform; + } + pContainerItem->m_pFormNode = pDocument->DataMerge_CopyContainer(pContainerItem->m_pFormNode, pParentNode, (CXFA_Node*)pDocument->GetXFANode(XFA_HASHCODE_Record), TRUE); + } + break; + case XFA_ELEMENT_ContentArea: { + CXFA_Node* pParentNode = pContainerItem->m_pParent->m_pFormNode; + for(CXFA_Node* pChildNode = pParentNode->GetNodeItem(XFA_NODEITEM_FirstChild); pChildNode; pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if(pChildNode->GetTemplateNode() != pContainerItem->m_pFormNode) { + continue; + } + pContainerItem->m_pFormNode = pChildNode; + break; + } + } + break; + default: + break; + } + } + if(!pPendingPageSet->GetNodeItem(XFA_NODEITEM_Parent)) { + CXFA_Node* pFormToplevelSubform = ((CXFA_Node*)pDocument->GetXFANode(XFA_HASHCODE_Form))->GetFirstChildByClass(XFA_ELEMENT_Subform); + pFormToplevelSubform->InsertChild(pPendingPageSet); + } + pDocument->DataMerge_UpdateBindingRelations(pPendingPageSet); + pPendingPageSet->SetFlag(XFA_NODEFLAG_Initialized); + } + pPendingPageSet = GetRootLayoutItem()->m_pFormNode; + while(pPendingPageSet) { + CXFA_Node* pNextPendingPageSet = pPendingPageSet->GetNextSameClassSibling(XFA_ELEMENT_PageSet); + CXFA_NodeIteratorTemplate sIterator(pPendingPageSet); + CXFA_Node *pNode = sIterator.GetCurrent(); + while(pNode) { + if(pNode->HasFlag(XFA_NODEFLAG_UnusedNode)) { + if(pNode->GetObjectType() == XFA_OBJECTTYPE_ContainerNode) { + XFA_ELEMENT eCurId = pNode->GetClassID(); + if (eCurId == XFA_ELEMENT_PageArea || eCurId == XFA_ELEMENT_PageSet) { + CXFA_ContainerIterator iteChild(pNode); + CXFA_Node* pChildNode = iteChild.MoveToNext(); + for (; pChildNode; pChildNode = iteChild.MoveToNext()) { + CXFA_LayoutItemImpl* pLayoutItem = (CXFA_LayoutItemImpl*)pChildNode->GetUserData(XFA_LAYOUTITEMKEY); + if(pLayoutItem) { + pNotify->OnLayoutEvent(pDocLayout, (CXFA_LayoutItem*)pLayoutItem, XFA_LAYOUTEVENT_ItemRemoving); + delete pLayoutItem; + } + } + } else if (eCurId != XFA_ELEMENT_ContentArea) { + CXFA_LayoutItemImpl* pLayoutItem = (CXFA_LayoutItemImpl*)pNode->GetUserData(XFA_LAYOUTITEMKEY); + if(pLayoutItem) { + pNotify->OnLayoutEvent(pDocLayout, (CXFA_LayoutItem*)pLayoutItem, XFA_LAYOUTEVENT_ItemRemoving); + delete pLayoutItem; + } + } + CXFA_Node* pNext = sIterator.SkipChildrenAndMoveToNext(); + pNode->GetNodeItem(XFA_NODEITEM_Parent)->RemoveChild(pNode); + pNode = pNext; + } else { + pNode->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE); + pNode->SetFlag(XFA_NODEFLAG_Initialized); + pNode = sIterator.MoveToNext(); + } + } else { + pNode->SetFlag(XFA_NODEFLAG_Initialized); + pNode = sIterator.MoveToNext(); + } + } + pPendingPageSet = pNextPendingPageSet; + } +} +void CXFA_LayoutPageMgr::LayoutPageSetContents() +{ + CXFA_ContainerLayoutItemImpl* pRootLayoutItem = this->GetRootLayoutItem(); + for(; pRootLayoutItem; pRootLayoutItem = (CXFA_ContainerLayoutItemImpl*)pRootLayoutItem->m_pNextSibling) { + CXFA_NodeIteratorTemplate iterator(pRootLayoutItem); + for(CXFA_ContainerLayoutItemImpl* pContainerItem = iterator.GetCurrent(); pContainerItem; pContainerItem = iterator.MoveToNext()) { + CXFA_Node* pNode = pContainerItem->m_pFormNode; + switch(pNode->GetClassID()) { + case XFA_ELEMENT_PageArea: + m_pLayoutProcessor->GetRootRootItemLayoutProcessor()->DoLayoutPageArea(pContainerItem); + break; + default: + break; + } + } + } +} +void XFA_SyncContainer(IXFA_Notify* pNotify, IXFA_DocLayout* pDocLayout, CXFA_LayoutItemImpl* pContainerItem, FX_DWORD dwRelevant, FX_BOOL bVisible, FX_INT32 nPageIndex) +{ + FX_BOOL bVisibleItem = FALSE; + FX_DWORD dwStatus = 0; + FX_DWORD dwRelevantContainer = 0; + if (bVisible) { + XFA_ATTRIBUTEENUM eAttributeValue = pContainerItem->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Presence); + if(eAttributeValue == XFA_ATTRIBUTEENUM_Visible || eAttributeValue == XFA_ATTRIBUTEENUM_Unknown) { + bVisibleItem = TRUE; + } + dwRelevantContainer = XFA_GetRelevant(pContainerItem->m_pFormNode, dwRelevant); + dwStatus = (bVisibleItem ? XFA_LAYOUTSTATUS_Visible : 0) | dwRelevantContainer; + } + pNotify->OnLayoutEvent(pDocLayout, (CXFA_LayoutItem*)pContainerItem, XFA_LAYOUTEVENT_ItemAdded, (FX_LPVOID)(FX_UINTPTR)nPageIndex, (FX_LPVOID)(FX_UINTPTR)dwStatus); + CXFA_LayoutItemImpl *pChild = pContainerItem->m_pFirstChild; + while (pChild) { + if (!pChild->IsContentLayoutItem()) { + pChild = pChild->m_pNextSibling; + continue; + } + XFA_SyncContainer(pNotify, pDocLayout, pChild, dwRelevantContainer, bVisibleItem, nPageIndex); + pChild = pChild->m_pNextSibling; + } +} +void CXFA_LayoutPageMgr::SyncLayoutData() +{ + MergePageSetContents(); + LayoutPageSetContents(); + IXFA_Notify* pNotify = m_pTemplatePageSetRoot->GetDocument()->GetParser()->GetNotify(); + FX_INT32 nPageIdx = -1; + CXFA_ContainerLayoutItemImpl* pRootLayoutItem = this->GetRootLayoutItem(); + for(; pRootLayoutItem; pRootLayoutItem = (CXFA_ContainerLayoutItemImpl*)pRootLayoutItem->m_pNextSibling) { + CXFA_NodeIteratorTemplate iteratorParent(pRootLayoutItem); + for(CXFA_ContainerLayoutItemImpl* pContainerItem = iteratorParent.GetCurrent(); pContainerItem; pContainerItem = iteratorParent.MoveToNext()) { + switch(pContainerItem->m_pFormNode->GetClassID()) { + case XFA_ELEMENT_PageArea: { + nPageIdx++; + FX_DWORD dwRelevant = XFA_LAYOUTSTATUS_Viewable | XFA_LAYOUTSTATUS_Printable; + CXFA_NodeIteratorTemplate iterator((CXFA_LayoutItem*)pContainerItem); + for(CXFA_LayoutItem* pChildLayoutItem = iterator.GetCurrent(); pChildLayoutItem;) { + if (!((CXFA_LayoutItemImpl*)pChildLayoutItem)->IsContentLayoutItem()) { + pChildLayoutItem = iterator.MoveToNext(); + continue; + } + CXFA_ContentLayoutItemImpl* pContentItem = (CXFA_ContentLayoutItemImpl*)pChildLayoutItem; + FX_BOOL bVisible = (pContentItem->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Presence) == XFA_ATTRIBUTEENUM_Visible); + FX_DWORD dwRelevantChild = XFA_GetRelevant(pContentItem->m_pFormNode, dwRelevant); + XFA_SyncContainer(pNotify, m_pLayoutProcessor, pContentItem, dwRelevantChild, bVisible, nPageIdx); + pChildLayoutItem = iterator.SkipChildrenAndMoveToNext(); + } + } + break; + default: + break; + } + } + } + FX_INT32 nPage = m_PageArray.GetSize(); + for (FX_INT32 i = nPage - 1; i >= m_nAvailPages; i--) { + CXFA_ContainerLayoutItemImpl* pPage = m_PageArray[i]; + m_PageArray.RemoveAt(i); + pNotify->OnPageEvent((IXFA_LayoutPage*)pPage, XFA_PAGEEVENT_PageRemoved); + delete pPage; + } + ClearRecordList(); +} +void XFA_ReleaseLayoutItem_NoPageArea(CXFA_LayoutItemImpl *pLayoutItem) +{ + CXFA_LayoutItemImpl *pNext, *pNode = pLayoutItem->m_pFirstChild; + while (pNode) { + pNext = pNode->m_pNextSibling; + pNode->m_pParent = NULL; + XFA_ReleaseLayoutItem_NoPageArea(pNode); + pNode = pNext; + } + if (pLayoutItem->m_pFormNode->GetClassID() != XFA_ELEMENT_PageArea) { + delete pLayoutItem; + } +} +void CXFA_LayoutPageMgr::PrepareLayout() +{ + m_pPageSetCurRoot = NULL; + m_ePageSetMode = XFA_ATTRIBUTEENUM_OrderedOccurrence; + m_nAvailPages = 0; + ClearRecordList(); + if (!m_pPageSetLayoutItemRoot) { + return; + } + CXFA_ContainerLayoutItemImpl* pRootLayoutItem = m_pPageSetLayoutItemRoot; + if(pRootLayoutItem && pRootLayoutItem->m_pFormNode->GetPacketID() == XFA_XDPPACKET_Form) { + CXFA_Node* pPageSetFormNode = pRootLayoutItem->m_pFormNode; + pRootLayoutItem->m_pFormNode->GetDocument()->m_pPendingPageSet.RemoveAll(); + if (pPageSetFormNode->HasFlag(XFA_NODEFLAG_HasRemoved)) { + XFA_ReleaseLayoutItem(pRootLayoutItem); + m_pPageSetLayoutItemRoot = NULL; + pRootLayoutItem = NULL; + pPageSetFormNode = NULL; + m_PageArray.RemoveAll(); + } + while(pPageSetFormNode) { + CXFA_Node* pNextPageSet = pPageSetFormNode->GetNextSameClassSibling(XFA_ELEMENT_PageSet); + pPageSetFormNode->GetNodeItem(XFA_NODEITEM_Parent)->RemoveChild(pPageSetFormNode, FALSE); + pRootLayoutItem->m_pFormNode->GetDocument()->m_pPendingPageSet.Add(pPageSetFormNode); + pPageSetFormNode = pNextPageSet; + } + } +#if defined(_XFA_LAYOUTITEM_MAPCACHE_) || defined(_XFA_LAYOUTITEM_ProcessCACHE_) + pRootLayoutItem = m_pPageSetLayoutItemRoot; + CXFA_ContainerLayoutItemImpl* pNextLayout = NULL; + for(; pRootLayoutItem; pRootLayoutItem = pNextLayout) { + pNextLayout = (CXFA_ContainerLayoutItemImpl*)pRootLayoutItem->m_pNextSibling; + SaveLayoutItem(pRootLayoutItem); + delete pRootLayoutItem; + } + m_pPageSetLayoutItemRoot = NULL; +#else + IXFA_Notify* pNotify = m_pLayoutProcessor->GetDocument()->GetParser()->GetNotify(); + pRootLayoutItem = m_pPageSetLayoutItemRoot; + for(; pRootLayoutItem; pRootLayoutItem = (CXFA_ContainerLayoutItemImpl*)pRootLayoutItem->m_pNextSibling) { + CXFA_NodeIteratorTemplate iterator(pRootLayoutItem); + for(CXFA_ContainerLayoutItemImpl* pContainerItem = iterator.GetCurrent(); pContainerItem; pContainerItem = iterator.MoveToNext()) { + if(pContainerItem->m_pFormNode->GetClassID() != XFA_ELEMENT_PageArea) { + continue; + } + CXFA_NodeIteratorTemplate iterator((CXFA_LayoutItem*)pContainerItem); + for(CXFA_LayoutItemImpl* pLayoutItem = (CXFA_LayoutItemImpl*)iterator.GetCurrent(); pLayoutItem; pLayoutItem = (CXFA_LayoutItemImpl*)iterator.MoveToNext()) { + if (!pLayoutItem->IsContentLayoutItem()) { + continue; + } + pNotify->OnLayoutEvent(m_pLayoutProcessor, (CXFA_LayoutItem*)pLayoutItem, XFA_LAYOUTEVENT_ItemRemoving); + } + pNotify->OnPageEvent((IXFA_LayoutPage*)pContainerItem, XFA_PAGEEVENT_PageRemoved); + } + } + pRootLayoutItem = m_pPageSetLayoutItemRoot; + CXFA_ContainerLayoutItemImpl* pNextLayout = NULL; + for(; pRootLayoutItem; pRootLayoutItem = pNextLayout) { + pNextLayout = (CXFA_ContainerLayoutItemImpl*)pRootLayoutItem->m_pNextSibling; + XFA_ReleaseLayoutItem_NoPageArea(pRootLayoutItem); + } + m_pPageSetLayoutItemRoot = NULL; +#endif +} diff --git a/xfa/src/fxfa/src/parser/xfa_layout_pagemgr_new.h b/xfa/src/fxfa/src/parser/xfa_layout_pagemgr_new.h new file mode 100644 index 0000000000..dcaf01c739 --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_layout_pagemgr_new.h @@ -0,0 +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 + +#ifndef _XFA_LAYOUT_PAGEMGR_H_ +#define _XFA_LAYOUT_PAGEMGR_H_ +class CXFA_ContainerRecord : public CFX_Object +{ +public: + CXFA_ContainerRecord(CXFA_ContainerLayoutItemImpl* pPageSet = NULL, CXFA_ContainerLayoutItemImpl* pPageArea = NULL, CXFA_ContainerLayoutItemImpl* pContentArea = NULL) + : pCurPageSet(pPageSet), pCurPageArea(pPageArea), pCurContentArea(pContentArea) + { + } + CXFA_ContainerLayoutItemImpl* pCurPageSet; + CXFA_ContainerLayoutItemImpl* pCurPageArea; + CXFA_ContainerLayoutItemImpl* pCurContentArea; +}; +class CXFA_LayoutPageMgr : public CFX_Object +{ +public: + CXFA_LayoutPageMgr(CXFA_LayoutProcessor* pLayoutProcessor); + ~CXFA_LayoutPageMgr(); + FX_BOOL InitLayoutPage(CXFA_Node* pFormNode); + FX_BOOL PrepareFirstPage(CXFA_Node* pRootSubform); + FX_FLOAT GetAvailHeight(); + FX_BOOL GetNextAvailContentHeight(FX_FLOAT fChildHeight); + void SubmitContentItem(CXFA_ContentLayoutItemImpl* pContentLayoutItem, XFA_ItemLayoutProcessorResult eStatus); + void FinishPaginatedPageSets(); + void SyncLayoutData(); + FX_INT32 GetPageCount() const; + IXFA_LayoutPage* GetPage(FX_INT32 index) const; + FX_INT32 GetPageIndex(IXFA_LayoutPage* pPage) const; + inline CXFA_ContainerLayoutItemImpl* GetRootLayoutItem() const + { + return m_pPageSetLayoutItemRoot; + } + FX_BOOL ProcessBreakBeforeOrAfter(CXFA_Node* pBreakNode, FX_BOOL bBefore, CXFA_Node* &pBreakLeaderNode, CXFA_Node* &pBreakTrailerNode, FX_BOOL& bCreatePage); + FX_BOOL ProcessOverflow(CXFA_Node* pFormNode, CXFA_Node* &pLeaderNode, CXFA_Node* &pTrailerNode, FX_BOOL bDataMerge = FALSE, FX_BOOL bCreatePage = TRUE); + CXFA_Node* QueryOverflow(CXFA_Node* pFormNode, CXFA_LayoutContext* pLayoutContext = NULL); + FX_BOOL ProcessBookendLeaderOrTrailer(CXFA_Node* pBookendNode, FX_BOOL bLeader, CXFA_Node* &pBookendAppendNode); + CXFA_LayoutItemImpl* FindOrCreateLayoutItem(CXFA_Node* pFormNode); +protected: + FX_BOOL AppendNewPage(FX_BOOL bFirstTemPage = FALSE); + void ReorderPendingLayoutRecordToTail(CXFA_ContainerRecord* pNewRecord, CXFA_ContainerRecord* pPrevRecord); + void RemoveLayoutRecord(CXFA_ContainerRecord* pNewRecord, CXFA_ContainerRecord* pPrevRecord); + inline CXFA_ContainerRecord* GetCurrentContainerRecord() + { + CXFA_ContainerRecord* result = ((CXFA_ContainerRecord*)m_rgProposedContainerRecord.GetAt(m_pCurrentContainerRecord)); + ASSERT(result); + return result; + } + CXFA_ContainerRecord* CreateContainerRecord(CXFA_Node* pPageNode = NULL, FX_BOOL bCreateNew = FALSE); + void AddPageAreaLayoutItem(CXFA_ContainerRecord* pNewRecord, CXFA_Node* pNewPageArea); + void AddContentAreaLayoutItem(CXFA_ContainerRecord* pNewRecord, CXFA_Node* pContentArea); + FX_BOOL RunBreak(XFA_ELEMENT eBreakType, XFA_ATTRIBUTEENUM eTargetType, CXFA_Node* pTarget, FX_BOOL bStartNew); + CXFA_Node* BreakOverflow(CXFA_Node* pOverflowNode, CXFA_Node*& pLeaderTemplate, CXFA_Node*& pTrailerTemplate, FX_BOOL bCreatePage = TRUE); + FX_BOOL ResolveBookendLeaderOrTrailer(CXFA_Node* pBookendNode, FX_BOOL bLeader, CXFA_Node* &pBookendAppendTemplate); + FX_BOOL ExecuteBreakBeforeOrAfter(CXFA_Node* pCurNode, FX_BOOL bBefore, CXFA_Node* &pBreakLeaderTemplate, CXFA_Node* &pBreakTrailerTemplate); + + FX_INT32 CreateMinPageRecord(CXFA_Node* pPageArea, FX_BOOL bTargetPageArea, FX_BOOL bCreateLast = FALSE); + void CreateMinPageSetRecord(CXFA_Node* pPageSet, FX_BOOL bCreateAll = FALSE); + void CreateNextMinRecord(CXFA_Node* pRecordNode); + FX_BOOL FindPageAreaFromPageSet(CXFA_Node* pPageSet, CXFA_Node* pStartChild, CXFA_Node* pTargetPageArea = NULL, CXFA_Node* pTargetContentArea = NULL, FX_BOOL bNewPage = FALSE, FX_BOOL bQuery = FALSE); + FX_BOOL FindPageAreaFromPageSet_Ordered(CXFA_Node* pPageSet, CXFA_Node* pStartChild, CXFA_Node* pTargetPageArea = NULL, CXFA_Node* pTargetContentArea = NULL, FX_BOOL bNewPage = FALSE, FX_BOOL bQuery = FALSE); + FX_BOOL FindPageAreaFromPageSet_SimplexDuplex(CXFA_Node* pPageSet, CXFA_Node* pStartChild, CXFA_Node* pTargetPageArea = NULL, CXFA_Node* pTargetContentArea = NULL, FX_BOOL bNewPage = FALSE, FX_BOOL bQuery = FALSE, XFA_ATTRIBUTEENUM ePreferredPosition = XFA_ATTRIBUTEENUM_First); + FX_BOOL MatchPageAreaOddOrEven(CXFA_Node* pPageArea, FX_BOOL bLastMatch); + CXFA_Node* GetNextAvailPageArea(CXFA_Node* pTargetPageArea, CXFA_Node* pTargetContentArea = NULL, FX_BOOL bNewPage = FALSE, FX_BOOL bQuery = FALSE); + FX_BOOL GetNextContentArea(CXFA_Node* pTargetContentArea); + void InitPageSetMap(); + void ProcessLastPageSet(); + inline FX_BOOL IsPageSetRootOrderedOccurrence() + { + return m_ePageSetMode == XFA_ATTRIBUTEENUM_OrderedOccurrence; + } + void ClearData(); + void ClearRecordList(); + void MergePageSetContents(); + void LayoutPageSetContents(); + void PrepareLayout(); + CXFA_LayoutProcessor* m_pLayoutProcessor; + CXFA_Node* m_pTemplatePageSetRoot; + CXFA_ContainerLayoutItemImpl* m_pPageSetLayoutItemRoot; + CXFA_ContainerLayoutItemImpl* m_pPageSetCurRoot; + FX_POSITION m_pCurrentContainerRecord; + CFX_PtrList m_rgProposedContainerRecord; + CXFA_Node* m_pCurPageArea; + FX_INT32 m_nAvailPages; + FX_INT32 m_nCurPageCount; + XFA_ATTRIBUTEENUM m_ePageSetMode; + FX_BOOL m_bCreateOverFlowPage; + CFX_MapPtrTemplate m_pPageSetMap; +#ifdef _XFA_LAYOUTITEM_MAPCACHE_ + void SaveLayoutItem(CXFA_LayoutItemImpl* pParentLayoutItem); + CFX_MapPtrToPtr m_NodeToContent; +#elif defined(_XFA_LAYOUTITEM_ProcessCACHE_) + void SaveLayoutItem(CXFA_LayoutItemImpl* pParentLayoutItem); +#endif + CFX_ArrayTemplate m_PageArray; +}; +#endif diff --git a/xfa/src/fxfa/src/parser/xfa_locale.cpp b/xfa/src/fxfa/src/parser/xfa_locale.cpp new file mode 100644 index 0000000000..d859905aa4 --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_locale.cpp @@ -0,0 +1,373 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_utils.h" +#include "../common/xfa_object.h" +#include "../common/xfa_document.h" +#include "../common/xfa_parser.h" +#include "../common/xfa_script.h" +#include "../common/xfa_docdata.h" +#include "../common/xfa_doclayout.h" +#include "../common/xfa_debug.h" +#include "../common/xfa_localemgr.h" +#include "../common/xfa_fm2jsapi.h" +#include "xfa_debug_parser.h" +#include "xfa_locale.h" +const static FX_LPCWSTR g_FX_Percent = (FX_LPCWSTR)L"z,zzz,zzz,zzz,zzz,zzz%"; +const static FX_LPCWSTR g_FX_Currency = (FX_LPCWSTR)L"$z,zzz,zzz,zzz,zzz,zz9.99"; +const static FX_LPCWSTR g_FX_Decimal = (FX_LPCWSTR)L"z,zzz,zzz,zzz,zzz,zz9.zzz"; +const static FX_LPCWSTR g_FX_Integer = (FX_LPCWSTR)L"z,zzz,zzz,zzz,zzz,zzz"; +CXFA_XMLLocale::CXFA_XMLLocale(CXML_Element* pLocaleData) +{ + m_pLocaleData = pLocaleData; +} +CXFA_XMLLocale::~CXFA_XMLLocale() +{ + if (m_pLocaleData) { + delete m_pLocaleData; + } +} +void CXFA_XMLLocale::Release() +{ + delete this; +} +CFX_WideString CXFA_XMLLocale::GetName() +{ + return m_pLocaleData ? m_pLocaleData->GetAttrValue(FX_BSTRC("name")) : CFX_WideString(); +} +void CXFA_XMLLocale::GetNumbericSymbol(FX_LOCALENUMSYMBOL eType, CFX_WideString& wsNumSymbol) const +{ + CFX_ByteString bsSymbols; + CFX_WideString wsName; + switch (eType) { + case FX_LOCALENUMSYMBOL_Decimal: + bsSymbols = FX_BSTRC("numberSymbols"); + wsName = FX_WSTRC(L"decimal"); + break; + case FX_LOCALENUMSYMBOL_Grouping: + bsSymbols = FX_BSTRC("numberSymbols"); + wsName = FX_WSTRC(L"grouping"); + break; + case FX_LOCALENUMSYMBOL_Percent: + bsSymbols = FX_BSTRC("numberSymbols"); + wsName = FX_WSTRC(L"percent"); + break; + case FX_LOCALENUMSYMBOL_Minus: + bsSymbols = (FX_BSTRC("numberSymbols")); + wsName = FX_WSTRC(L"minus"); + break; + case FX_LOCALENUMSYMBOL_Zero: + bsSymbols = (FX_BSTRC("numberSymbols")); + wsName = FX_WSTRC(L"zero"); + break; + case FX_LOCALENUMSYMBOL_CurrencySymbol: + bsSymbols = (FX_BSTRC("currencySymbols")); + wsName = FX_WSTRC(L"symbol"); + break; + case FX_LOCALENUMSYMBOL_CurrencyName: + bsSymbols = (FX_BSTRC("currencySymbols")); + wsName = FX_WSTRC(L"isoname"); + break; + default: + return; + } + CXML_Element* pElement = m_pLocaleData->GetElement(FX_BSTRC(""), bsSymbols); + if (!pElement) { + return; + } + GetPattern(pElement, CFX_ByteStringC((FX_LPCSTR)bsSymbols, bsSymbols.GetLength() - 1), wsName, wsNumSymbol); +} +void CXFA_XMLLocale::GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const +{ + if (!m_pLocaleData) { + return; + } + CFX_ByteString bsSpace; + CXML_Element* pNumberSymbols = m_pLocaleData->GetElement(bsSpace, FX_BSTRC("dateTimeSymbols")); + if (!pNumberSymbols) { + return; + } + wsDtSymbol = pNumberSymbols->GetContent(0); +} +void CXFA_XMLLocale::GetMonthName(FX_INT32 nMonth, CFX_WideString& wsMonthName, FX_BOOL bAbbr ) const +{ + wsMonthName = GetCalendarSymbol(FX_BSTRC("month"), nMonth, bAbbr); +} +void CXFA_XMLLocale::GetDayName(FX_INT32 nWeek, CFX_WideString& wsDayName, FX_BOOL bAbbr ) const +{ + wsDayName = GetCalendarSymbol(FX_BSTRC("day"), nWeek, bAbbr); +} +void CXFA_XMLLocale::GetMeridiemName(CFX_WideString& wsMeridiemName, FX_BOOL bAM ) const +{ + wsMeridiemName = GetCalendarSymbol(FX_BSTRC("meridiem"), bAM ? 0 : 1, FALSE); +} +void CXFA_XMLLocale::GetTimeZone(FX_TIMEZONE& tz) const +{ + IXFA_TimeZoneProvider* pProvider = IXFA_TimeZoneProvider::Get(); + pProvider->GetTimeZone(tz); +} +void CXFA_XMLLocale::GetEraName(CFX_WideString& wsEraName, FX_BOOL bAD ) const +{ + wsEraName = GetCalendarSymbol(FX_BSTRC("era"), bAD ? 1 : 0, FALSE); +} +CFX_WideString CXFA_XMLLocale::GetCalendarSymbol(FX_BSTR symbol, int index, FX_BOOL bAbbr) const +{ + CFX_ByteString pstrSymbolNames = symbol + "Names"; + CFX_WideString wsSymbolName = L""; + if (m_pLocaleData) { + CXML_Element *pChild = m_pLocaleData->GetElement("", FX_BSTRC("calendarSymbols")); + if (pChild) { + CXML_Element *pSymbolNames = pChild->GetElement("", pstrSymbolNames); + if (pSymbolNames) { + if (pSymbolNames->GetAttrInteger(FX_BSTRC("abbr")) != bAbbr) { + pSymbolNames = pChild->GetElement("", pstrSymbolNames, 1); + } + if (pSymbolNames && pSymbolNames->GetAttrInteger(FX_BSTRC("abbr")) == bAbbr) { + CXML_Element *pSymbolName = pSymbolNames->GetElement("", symbol, index); + if (pSymbolName) { + wsSymbolName = pSymbolName->GetContent(0); + } + } + } + } + } + return wsSymbolName; +} +void CXFA_XMLLocale::GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType, CFX_WideString& wsPattern) const +{ + CXML_Element* pElement = m_pLocaleData->GetElement(FX_BSTRC(""), FX_BSTRC("datePatterns")); + if (pElement == NULL) { + return; + } + CFX_WideString wsName; + switch (eType) { + case FX_LOCALEDATETIMESUBCATEGORY_Short: + wsName = L"short"; + break; + case FX_LOCALEDATETIMESUBCATEGORY_Default: + case FX_LOCALEDATETIMESUBCATEGORY_Medium: + wsName = L"med"; + break; + case FX_LOCALEDATETIMESUBCATEGORY_Full: + wsName = L"full"; + break; + case FX_LOCALEDATETIMESUBCATEGORY_Long: + wsName = L"long"; + break; + } + GetPattern(pElement, FX_BSTRC("datePattern"), wsName, wsPattern); +} +void CXFA_XMLLocale::GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType, CFX_WideString& wsPattern) const +{ + CXML_Element* pElement = m_pLocaleData->GetElement(FX_BSTRC(""), FX_BSTRC("timePatterns")); + if (pElement == NULL) { + return; + } + CFX_WideString wsName; + switch (eType) { + case FX_LOCALEDATETIMESUBCATEGORY_Short: + wsName = L"short"; + break; + case FX_LOCALEDATETIMESUBCATEGORY_Default: + case FX_LOCALEDATETIMESUBCATEGORY_Medium: + wsName = L"med"; + break; + case FX_LOCALEDATETIMESUBCATEGORY_Full: + wsName = L"full"; + break; + case FX_LOCALEDATETIMESUBCATEGORY_Long: + wsName = L"long"; + break; + } + GetPattern(pElement, FX_BSTRC("timePattern"), wsName, wsPattern); +} +void CXFA_XMLLocale::GetNumPattern(FX_LOCALENUMSUBCATEGORY eType, CFX_WideString& wsPattern) const +{ + CXML_Element* pElement = m_pLocaleData->GetElement(FX_BSTRC(""), FX_BSTRC("numberPatterns")); + if (pElement == NULL) { + return; + } + switch (eType) { + case FX_LOCALENUMPATTERN_Percent: + wsPattern = g_FX_Percent; + break; + case FX_LOCALENUMPATTERN_Currency: + wsPattern = g_FX_Currency; + break; + case FX_LOCALENUMPATTERN_Decimal: + wsPattern = g_FX_Decimal; + break; + case FX_LOCALENUMPATTERN_Integer: + wsPattern = g_FX_Integer; + break; + } +} +void CXFA_XMLLocale::GetPattern(CXML_Element* pElement, FX_BSTR bsTag, FX_WSTR wsName, CFX_WideString& wsPattern) const +{ + FX_INT32 iCount = pElement->CountElements(FX_BSTRC(""), bsTag); + for (FX_INT32 i = 0; i < iCount; i++) { + CXML_Element* pChild = pElement->GetElement(FX_BSTRC(""), bsTag, i); + if (pChild->GetAttrValue(FX_BSTRC("name")) == wsName) { + wsPattern = pChild->GetContent(0); + return; + } + } +} +CXFA_NodeLocale::CXFA_NodeLocale(CXFA_Node *pLocale) +{ + m_pLocale = pLocale; +} +CXFA_NodeLocale::~CXFA_NodeLocale() +{ +} +void CXFA_NodeLocale::Release() +{ + delete this; +} +CFX_WideString CXFA_NodeLocale::GetName() +{ + return m_pLocale ? m_pLocale->GetCData(XFA_ATTRIBUTE_Name) : NULL; +} +void CXFA_NodeLocale::GetNumbericSymbol(FX_LOCALENUMSYMBOL eType, CFX_WideString& wsNumSymbol) const +{ + switch (eType) { + case FX_LOCALENUMSYMBOL_Decimal: + wsNumSymbol = GetSymbol(XFA_ELEMENT_NumberSymbols, FX_WSTRC(L"decimal")); + break; + case FX_LOCALENUMSYMBOL_Grouping: + wsNumSymbol = GetSymbol(XFA_ELEMENT_NumberSymbols, FX_WSTRC(L"grouping")); + break; + case FX_LOCALENUMSYMBOL_Percent: + wsNumSymbol = GetSymbol(XFA_ELEMENT_NumberSymbols, FX_WSTRC(L"percent")); + break; + case FX_LOCALENUMSYMBOL_Minus: + wsNumSymbol = GetSymbol(XFA_ELEMENT_NumberSymbols, FX_WSTRC(L"minus")); + break; + case FX_LOCALENUMSYMBOL_Zero: + wsNumSymbol = GetSymbol(XFA_ELEMENT_NumberSymbols, FX_WSTRC(L"zero")); + break; + case FX_LOCALENUMSYMBOL_CurrencySymbol: + wsNumSymbol = GetSymbol(XFA_ELEMENT_CurrencySymbols, FX_WSTRC(L"symbol")); + break; + case FX_LOCALENUMSYMBOL_CurrencyName: + wsNumSymbol = GetSymbol(XFA_ELEMENT_CurrencySymbols, FX_WSTRC(L"isoname")); + break; + } +} +void CXFA_NodeLocale::GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const +{ + CXFA_Node *pSymbols = m_pLocale ? m_pLocale->GetChild(0, XFA_ELEMENT_DateTimeSymbols) : NULL; + wsDtSymbol = pSymbols ? pSymbols->GetContent() : CFX_WideString(); +} +void CXFA_NodeLocale::GetMonthName(FX_INT32 nMonth, CFX_WideString& wsMonthName, FX_BOOL bAbbr ) const +{ + wsMonthName = GetCalendarSymbol(XFA_ELEMENT_MonthNames, nMonth, bAbbr); +} +void CXFA_NodeLocale::GetDayName(FX_INT32 nWeek, CFX_WideString& wsDayName, FX_BOOL bAbbr ) const +{ + wsDayName = GetCalendarSymbol(XFA_ELEMENT_DayNames, nWeek, bAbbr); +} +void CXFA_NodeLocale::GetMeridiemName(CFX_WideString& wsMeridiemName, FX_BOOL bAM ) const +{ + wsMeridiemName = GetCalendarSymbol(XFA_ELEMENT_MeridiemNames, bAM ? 0 : 1, FALSE); +} +void CXFA_NodeLocale::GetTimeZone(FX_TIMEZONE& tz) const +{ + IXFA_TimeZoneProvider* pProvider = IXFA_TimeZoneProvider::Get(); + pProvider->GetTimeZone(tz); +} +void CXFA_NodeLocale::GetEraName(CFX_WideString& wsEraName, FX_BOOL bAD ) const +{ + wsEraName = GetCalendarSymbol(XFA_ELEMENT_EraNames, bAD ? 1 : 0, FALSE); +} +void CXFA_NodeLocale::GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType, CFX_WideString& wsPattern) const +{ + switch (eType) { + case FX_LOCALEDATETIMESUBCATEGORY_Short: + wsPattern = GetSymbol(XFA_ELEMENT_DatePatterns, FX_WSTRC(L"short")); + break; + case FX_LOCALEDATETIMESUBCATEGORY_Medium: + case FX_LOCALEDATETIMESUBCATEGORY_Default: + wsPattern = GetSymbol(XFA_ELEMENT_DatePatterns, FX_WSTRC(L"med")); + break; + case FX_LOCALEDATETIMESUBCATEGORY_Full: + wsPattern = GetSymbol(XFA_ELEMENT_DatePatterns, FX_WSTRC(L"full")); + break; + case FX_LOCALEDATETIMESUBCATEGORY_Long: + wsPattern = GetSymbol(XFA_ELEMENT_DatePatterns, FX_WSTRC(L"long")); + break; + } +} +void CXFA_NodeLocale::GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType, CFX_WideString& wsPattern) const +{ + switch (eType) { + case FX_LOCALEDATETIMESUBCATEGORY_Short: + wsPattern = GetSymbol(XFA_ELEMENT_TimePatterns, FX_WSTRC(L"short")); + break; + case FX_LOCALEDATETIMESUBCATEGORY_Medium: + case FX_LOCALEDATETIMESUBCATEGORY_Default: + wsPattern = GetSymbol(XFA_ELEMENT_TimePatterns, FX_WSTRC(L"med")); + break; + case FX_LOCALEDATETIMESUBCATEGORY_Full: + wsPattern = GetSymbol(XFA_ELEMENT_TimePatterns, FX_WSTRC(L"full")); + break; + case FX_LOCALEDATETIMESUBCATEGORY_Long: + wsPattern = GetSymbol(XFA_ELEMENT_TimePatterns, FX_WSTRC(L"long")); + break; + } +} +void CXFA_NodeLocale::GetNumPattern(FX_LOCALENUMSUBCATEGORY eType, CFX_WideString& wsPattern) const +{ + switch (eType) { + case FX_LOCALENUMPATTERN_Percent: + wsPattern = g_FX_Percent; + break; + case FX_LOCALENUMPATTERN_Currency: + wsPattern = g_FX_Currency; + break; + case FX_LOCALENUMPATTERN_Decimal: + wsPattern = g_FX_Decimal; + break; + case FX_LOCALENUMPATTERN_Integer: + wsPattern = g_FX_Integer; + break; + } +} +CXFA_Node* CXFA_NodeLocale::GetNodeByName(CXFA_Node *pParent, FX_WSTR wsName) const +{ + CXFA_Node *pChild = pParent ? pParent->GetNodeItem(XFA_NODEITEM_FirstChild) : NULL; + while (pChild) { + CFX_WideString wsChild; + if (pChild->GetAttribute(XFA_ATTRIBUTE_Name, wsChild)) { + if (wsChild == wsName) { + return pChild; + } + } + pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling); + } + return NULL; +} +CFX_WideString CXFA_NodeLocale::GetSymbol(XFA_ELEMENT eElement, FX_WSTR symbol_type) const +{ + CXFA_Node *pSymbols = m_pLocale ? m_pLocale->GetChild(0, eElement) : NULL; + CXFA_Node *pSymbol = GetNodeByName(pSymbols, symbol_type); + return pSymbol ? pSymbol->GetContent() : CFX_WideString(); +} +CFX_WideString CXFA_NodeLocale::GetCalendarSymbol(XFA_ELEMENT eElement, int index, FX_BOOL bAbbr) const +{ + CXFA_Node *pCalendar = m_pLocale ? m_pLocale->GetChild(0, XFA_ELEMENT_CalendarSymbols) : NULL; + if (pCalendar) { + CXFA_Node *pNode = pCalendar->GetFirstChildByClass(eElement); + for (; pNode; pNode = pNode->GetNextSameClassSibling(eElement)) { + if (pNode->GetBoolean(XFA_ATTRIBUTE_Abbr) == bAbbr) { + CXFA_Node *pSymbol = pNode->GetChild(index, XFA_ELEMENT_UNKNOWN); + return pSymbol ? pSymbol->GetContent() : CFX_WideString(); + } + } + } + return CFX_WideString(); +} diff --git a/xfa/src/fxfa/src/parser/xfa_locale.h b/xfa/src/fxfa/src/parser/xfa_locale.h new file mode 100644 index 0000000000..3f0b13a20d --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_locale.h @@ -0,0 +1,61 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FXFA_LOCALE_H +#define _FXFA_LOCALE_H +class CXFA_XMLLocale : public IFX_Locale, public CFX_Object +{ +public: + CXFA_XMLLocale(CXML_Element* pLocaleData); + virtual void Release(); + virtual CFX_WideString GetName(); + virtual void GetNumbericSymbol(FX_LOCALENUMSYMBOL eType, CFX_WideString& wsNumSymbol) const; + + virtual void GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const; + virtual void GetMonthName(FX_INT32 nMonth, CFX_WideString& wsMonthName, FX_BOOL bAbbr = TRUE) const; + virtual void GetDayName(FX_INT32 nWeek, CFX_WideString& wsDayName, FX_BOOL bAbbr = TRUE) const; + virtual void GetMeridiemName(CFX_WideString& wsMeridiemName, FX_BOOL bAM = TRUE) const; + virtual void GetTimeZone(FX_TIMEZONE& tz) const; + virtual void GetEraName(CFX_WideString& wsEraName, FX_BOOL bAD = TRUE) const; + + virtual void GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType, CFX_WideString& wsPattern) const; + virtual void GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType, CFX_WideString& wsPattern) const; + virtual void GetNumPattern(FX_LOCALENUMSUBCATEGORY eType, CFX_WideString& wsPattern) const; + +protected: + ~CXFA_XMLLocale(); + void GetPattern(CXML_Element* pElement, FX_BSTR bsTag, FX_WSTR wsName, CFX_WideString& wsPattern) const; + CFX_WideString GetCalendarSymbol(FX_BSTR symbol, int index, FX_BOOL bAbbr) const; +private: + CXML_Element* m_pLocaleData; +}; +class CXFA_NodeLocale : public IFX_Locale, public CFX_Object +{ +public: + CXFA_NodeLocale(CXFA_Node* pLocale); + virtual void Release(); + virtual CFX_WideString GetName(); + virtual void GetNumbericSymbol(FX_LOCALENUMSYMBOL eType, CFX_WideString& wsNumSymbol) const; + + virtual void GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const; + virtual void GetMonthName(FX_INT32 nMonth, CFX_WideString& wsMonthName, FX_BOOL bAbbr = TRUE) const; + virtual void GetDayName(FX_INT32 nWeek, CFX_WideString& wsDayName, FX_BOOL bAbbr = TRUE) const; + virtual void GetMeridiemName(CFX_WideString& wsMeridiemName, FX_BOOL bAM = TRUE) const; + virtual void GetTimeZone(FX_TIMEZONE& tz) const; + virtual void GetEraName(CFX_WideString& wsEraName, FX_BOOL bAD = TRUE) const; + + virtual void GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType, CFX_WideString& wsPattern) const; + virtual void GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType, CFX_WideString& wsPattern) const; + virtual void GetNumPattern(FX_LOCALENUMSUBCATEGORY eType, CFX_WideString& wsPattern) const; +protected: + ~CXFA_NodeLocale(); + CXFA_Node* GetNodeByName(CXFA_Node *pParent, FX_WSTR wsName) const; + CFX_WideString GetSymbol(XFA_ELEMENT eElement, FX_WSTR symbol_type) const; + CFX_WideString GetCalendarSymbol(XFA_ELEMENT eElement, int index, FX_BOOL bAbbr) const; + + CXFA_Node* m_pLocale; +}; +#endif diff --git a/xfa/src/fxfa/src/parser/xfa_localemgr.cpp b/xfa/src/fxfa/src/parser/xfa_localemgr.cpp new file mode 100644 index 0000000000..8c56c95dc9 --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_localemgr.cpp @@ -0,0 +1,934 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_utils.h" +#include "../common/xfa_object.h" +#include "../common/xfa_document.h" +#include "../common/xfa_parser.h" +#include "../common/xfa_script.h" +#include "../common/xfa_docdata.h" +#include "../common/xfa_doclayout.h" +#include "../common/xfa_debug.h" +#include "../common/xfa_localemgr.h" +#include "../common/xfa_fm2jsapi.h" +#include "xfa_debug_parser.h" +#include "xfa_locale.h" +const FX_BYTE g_enUS_Locale[] = { + 0x78, 0x9C, 0x95, 0x56, 0xD1, 0x6E, 0x9B, 0x30, 0x14, 0x7D, 0x9F, 0xB4, 0x7F, 0x40, 0xD6, 0x2A, 0xB5, 0x52, 0x56, 0x6F, + 0x8F, 0xA9, 0x88, 0xA5, 0x6C, 0x24, 0x9B, 0x3A, 0xD1, 0x55, 0x22, 0x55, 0xB5, 0xBE, 0x4C, 0x0E, 0xDC, 0x05, 0x34, 0xB0, + 0x23, 0x83, 0x37, 0x05, 0xED, 0xE3, 0x67, 0x07, 0xC3, 0xC0, 0xF6, 0x24, 0xC2, 0x4B, 0x7C, 0xCF, 0x3D, 0xE7, 0xE6, 0xDE, + 0x63, 0x30, 0x84, 0x25, 0x4F, 0x69, 0x09, 0x01, 0xA3, 0x15, 0xAC, 0x10, 0xB0, 0xEF, 0x4F, 0x09, 0x0A, 0x32, 0xA8, 0xD3, + 0x15, 0xDA, 0xB0, 0x43, 0x59, 0xD4, 0xF9, 0xF5, 0xBA, 0x02, 0x51, 0xA4, 0xF4, 0x06, 0x91, 0x50, 0x53, 0x59, 0x46, 0x45, + 0x72, 0xAA, 0xF6, 0xBC, 0xAC, 0x8D, 0xEA, 0x20, 0xE0, 0xC0, 0x45, 0x41, 0x99, 0x62, 0x54, 0x9C, 0x35, 0xF9, 0x83, 0x82, + 0x6B, 0xB3, 0x26, 0xF7, 0x94, 0x49, 0x2A, 0x4E, 0x21, 0xEE, 0xC2, 0xD7, 0xAF, 0x0C, 0xBE, 0x85, 0xBD, 0xF0, 0x26, 0x62, + 0x2A, 0xD2, 0xDC, 0x41, 0xD7, 0x47, 0x51, 0x94, 0x1E, 0xAE, 0xAB, 0xBF, 0x97, 0x0C, 0x3C, 0x60, 0xE9, 0x32, 0xD7, 0xF2, + 0x20, 0xEB, 0xC6, 0x81, 0x13, 0x38, 0x36, 0x50, 0xED, 0x41, 0x38, 0x99, 0xAF, 0x69, 0xC3, 0x7D, 0xF8, 0x03, 0xFF, 0xE5, + 0x17, 0x44, 0x90, 0xDA, 0x09, 0x3C, 0xB2, 0xA8, 0xE7, 0x9D, 0xA3, 0x80, 0xEE, 0xF7, 0x62, 0x85, 0xDE, 0xA3, 0x91, 0x73, + 0x3E, 0xD7, 0x7C, 0x86, 0xF9, 0xEC, 0x9A, 0x6B, 0x96, 0xCF, 0x2B, 0x9F, 0x55, 0x3E, 0x9F, 0x7C, 0x0E, 0xF9, 0xDC, 0xF1, + 0x19, 0xF3, 0x7F, 0x4F, 0x32, 0x7A, 0x32, 0xB7, 0x90, 0x5A, 0x91, 0x44, 0xAA, 0x5B, 0x4E, 0x75, 0xAE, 0xD7, 0x5D, 0x92, + 0xC4, 0xDC, 0x81, 0x76, 0x12, 0x6A, 0x1B, 0x7B, 0x86, 0x8C, 0xB9, 0xE8, 0x2E, 0x97, 0xC2, 0x01, 0xB7, 0xA2, 0xB0, 0xA1, + 0x84, 0x36, 0x52, 0x8C, 0x41, 0x3C, 0xF4, 0x35, 0xEA, 0x71, 0xB4, 0x6B, 0xA6, 0x59, 0xBB, 0x53, 0xBB, 0x4D, 0xBB, 0x45, + 0xBB, 0x39, 0xBB, 0x2F, 0xBB, 0x29, 0x7F, 0x3F, 0xFA, 0x21, 0xCD, 0x0A, 0xA8, 0xFA, 0x67, 0xCF, 0x84, 0x64, 0x1D, 0x2B, + 0x77, 0xFB, 0x60, 0xC4, 0x23, 0x8F, 0x56, 0x02, 0x4F, 0x2B, 0x28, 0x04, 0x04, 0x35, 0xD5, 0xD4, 0x8A, 0x7C, 0xF8, 0x18, + 0x62, 0xFD, 0xDB, 0x25, 0xC8, 0x3A, 0x1A, 0x42, 0x3C, 0x10, 0x75, 0x60, 0x9D, 0x11, 0x5D, 0xE3, 0x0D, 0x3C, 0xD2, 0xA6, + 0x01, 0xC1, 0xCE, 0x7B, 0x3A, 0x44, 0xE6, 0x00, 0xF9, 0x21, 0xCB, 0x12, 0x91, 0x8D, 0xBA, 0x16, 0x41, 0xAC, 0xAE, 0x20, + 0x5A, 0x04, 0xDF, 0xD4, 0xA5, 0x27, 0x1C, 0xB8, 0x56, 0x21, 0x23, 0x2D, 0x39, 0x3B, 0x20, 0x72, 0xA1, 0xA8, 0x82, 0xEC, + 0xAC, 0xB9, 0x40, 0x52, 0xE7, 0x5C, 0x34, 0x4A, 0x84, 0x23, 0xEC, 0xE1, 0xE3, 0xC9, 0x84, 0x0A, 0x68, 0x8A, 0x6A, 0x34, + 0xF1, 0x28, 0x9A, 0x4C, 0x9C, 0xDF, 0xC5, 0xF1, 0x5D, 0x92, 0x04, 0xEB, 0xE0, 0x25, 0xC4, 0x23, 0x92, 0x55, 0x61, 0x32, + 0xEA, 0x65, 0x9A, 0xF3, 0xA4, 0x83, 0x64, 0x86, 0xC0, 0xCC, 0xA9, 0x25, 0x1E, 0x3E, 0x9E, 0xCC, 0x65, 0x8C, 0xDA, 0x29, + 0xAC, 0xDF, 0xEC, 0x4F, 0xA7, 0x38, 0xFB, 0xF9, 0xB9, 0xAA, 0x93, 0x4D, 0xB4, 0xFD, 0xFD, 0x4C, 0xF3, 0x2F, 0xED, 0x4B, + 0x67, 0xCE, 0x98, 0xA4, 0x74, 0x4C, 0xEA, 0x53, 0xF1, 0x9F, 0x43, 0x93, 0xD8, 0xB4, 0xA2, 0x30, 0xFD, 0xE2, 0x41, 0xA4, + 0x5D, 0xB4, 0xED, 0xF2, 0xB6, 0x6D, 0xDB, 0x10, 0x4F, 0x78, 0x4E, 0x21, 0x23, 0x4C, 0xA5, 0x10, 0xC0, 0xD2, 0x13, 0x22, + 0x6F, 0x3A, 0xE9, 0x72, 0xF9, 0xE7, 0x7A, 0x58, 0xDE, 0xCC, 0xAC, 0x72, 0x04, 0x91, 0x02, 0x6B, 0xCC, 0xDF, 0x5F, 0x79, + 0x54, 0xD8, 0x9A, 0x62, 0x28, 0xD4, 0x0F, 0x3A, 0x09, 0x4D, 0xD9, 0x0C, 0xD2, 0xA2, 0xA2, 0x6A, 0xF3, 0x6F, 0x7B, 0x7D, + 0x97, 0xB6, 0xD5, 0xC3, 0xBB, 0x95, 0xCB, 0x63, 0xA1, 0x37, 0x7E, 0x31, 0x8B, 0x3F, 0x74, 0x7D, 0x35, 0x8B, 0x5E, 0x15, + 0x4C, 0xD6, 0x88, 0xBC, 0x9D, 0x45, 0x6E, 0x41, 0x70, 0x44, 0xDE, 0xB9, 0x5C, 0x3C, 0x1D, 0x5B, 0x21, 0xFD, 0x16, 0x0C, + 0x4E, 0x4C, 0x81, 0xFE, 0x66, 0x3B, 0x07, 0x6A, 0x9B, 0xD4, 0xA9, 0x31, 0xC9, 0xBB, 0x25, 0x8C, 0xA2, 0xA8, 0xB9, 0x5E, + 0x20, 0xF2, 0x94, 0x44, 0xB3, 0x45, 0x63, 0xCB, 0x5D, 0x09, 0xB6, 0x7B, 0xD5, 0x58, 0xF7, 0x55, 0xA4, 0x96, 0x7F, 0x01, + 0x75, 0x37, 0x1B, 0x8B, +}; +const FX_BYTE g_enGB_Locale[] = { + 0x78, 0x9C, 0x95, 0x56, 0xD1, 0x6E, 0xD3, 0x30, 0x14, 0x7D, 0x47, 0xE2, 0x1F, 0xA2, 0x88, 0x49, 0x20, 0x6D, 0x33, 0x3C, + 0x6E, 0xEA, 0x2C, 0x75, 0xEB, 0xD6, 0x32, 0xC8, 0xA8, 0x48, 0xC5, 0xC4, 0x5E, 0x90, 0x9B, 0x78, 0x8D, 0x59, 0x62, 0x57, + 0x4E, 0xCC, 0x94, 0xFC, 0x02, 0x9F, 0xC0, 0x23, 0xCF, 0x08, 0xF1, 0x01, 0xBC, 0xF0, 0x2F, 0x48, 0xFB, 0x0C, 0x6E, 0x1A, + 0x27, 0x4B, 0x1C, 0xAF, 0x64, 0x79, 0x89, 0xEF, 0xB9, 0xE7, 0xDC, 0xDE, 0x7B, 0x9C, 0xB8, 0x19, 0xC5, 0x22, 0x20, 0x31, + 0x75, 0x38, 0x49, 0xE8, 0x91, 0x4B, 0xF9, 0xA7, 0xE9, 0xB1, 0xEB, 0x84, 0x34, 0x0D, 0x8E, 0xDC, 0xBB, 0xAF, 0xBF, 0xEE, + 0x7E, 0xFE, 0x78, 0x0E, 0xB7, 0xBF, 0xDF, 0x7E, 0xBF, 0x70, 0xF1, 0xA8, 0x24, 0xF2, 0x90, 0x48, 0x3F, 0x4F, 0x96, 0x22, + 0x4E, 0xB5, 0x66, 0x25, 0xE9, 0x4A, 0x48, 0x46, 0x38, 0x30, 0x12, 0xC1, 0xB3, 0xE8, 0x02, 0xE0, 0x54, 0xAF, 0xF1, 0x39, + 0xE1, 0x8A, 0xC8, 0x7C, 0x84, 0xAA, 0xF0, 0xE9, 0x13, 0x8D, 0x9F, 0xD1, 0xA5, 0xB4, 0x26, 0x3C, 0x22, 0x83, 0xA8, 0x87, + 0x8E, 0xD7, 0x92, 0xC5, 0x16, 0x6E, 0x5F, 0x7F, 0xAE, 0x38, 0xB5, 0x80, 0x71, 0x9F, 0x39, 0x56, 0x2B, 0x95, 0x66, 0x3D, + 0xD8, 0xA7, 0xEB, 0x8C, 0x26, 0x4B, 0x2A, 0x7B, 0x99, 0x77, 0x41, 0x26, 0x6C, 0xF8, 0x85, 0xF8, 0x62, 0x17, 0x4C, 0x68, + 0x60, 0x26, 0x50, 0xCB, 0xA2, 0x9A, 0xB7, 0x89, 0x1C, 0xB2, 0x5C, 0xCA, 0x23, 0xF7, 0x95, 0xDB, 0x72, 0xCE, 0xE6, 0x9A, + 0xCD, 0x30, 0x9B, 0x5D, 0x43, 0xCD, 0xB2, 0x79, 0x65, 0xB3, 0xCA, 0xE6, 0x93, 0xCD, 0x21, 0x9B, 0x3B, 0x36, 0x63, 0x1E, + 0xF6, 0x24, 0x24, 0xB9, 0x7E, 0x84, 0x60, 0x85, 0x7D, 0x05, 0x8F, 0x1C, 0x74, 0x5E, 0xAE, 0xAB, 0x24, 0xF6, 0x44, 0x0F, + 0x5A, 0x28, 0x9A, 0x9A, 0xD8, 0x25, 0x0D, 0x79, 0x1F, 0x5D, 0x44, 0x4A, 0xF6, 0xC0, 0x33, 0xC9, 0x4C, 0xC8, 0x27, 0x99, + 0x92, 0x6D, 0x10, 0x35, 0x7D, 0xB5, 0x7A, 0x6C, 0xED, 0x9A, 0x6E, 0xD6, 0xEC, 0xD4, 0x6C, 0xD3, 0x6C, 0xD1, 0x6C, 0xCE, + 0xEC, 0xCB, 0x6C, 0xCA, 0xDE, 0x4F, 0x42, 0x61, 0x02, 0x46, 0x93, 0xFA, 0xDD, 0xD3, 0x21, 0x1E, 0x7B, 0xE0, 0x6E, 0x1D, + 0xB4, 0x78, 0x78, 0x6E, 0x24, 0x50, 0xB7, 0x02, 0x20, 0x54, 0x12, 0x5D, 0x0D, 0x56, 0xF8, 0xF8, 0x64, 0x84, 0xCA, 0x7B, + 0x95, 0xC0, 0xE3, 0x49, 0x13, 0xA2, 0x86, 0x58, 0x06, 0xC6, 0x19, 0x51, 0x35, 0x9E, 0xD1, 0x39, 0xC9, 0x32, 0x2A, 0xF9, + 0x66, 0x4F, 0x9B, 0x48, 0x1F, 0x20, 0xD7, 0x2A, 0x8E, 0x5D, 0x7C, 0x0A, 0xD7, 0xAE, 0x33, 0x71, 0x3C, 0xB8, 0x9C, 0x8F, + 0x70, 0x95, 0x03, 0x36, 0x54, 0xA3, 0x8E, 0x56, 0xC6, 0x82, 0xAF, 0x5C, 0xFC, 0x38, 0x4D, 0x42, 0x43, 0x2D, 0x19, 0xAA, + 0x48, 0x23, 0x21, 0x33, 0xD0, 0x4C, 0x90, 0xE7, 0x21, 0xAB, 0x06, 0x75, 0x46, 0x04, 0x20, 0x63, 0x49, 0x6B, 0xE4, 0x56, + 0xD4, 0x19, 0x79, 0x36, 0x3B, 0xF4, 0xBC, 0x43, 0xDF, 0x77, 0xAE, 0x46, 0xA8, 0xC5, 0x31, 0x0A, 0x74, 0x66, 0x7D, 0x94, + 0x64, 0x33, 0x6A, 0xAD, 0x18, 0xC0, 0xD7, 0x83, 0x6E, 0x14, 0x3D, 0x3A, 0xEA, 0xCC, 0xA4, 0x8D, 0x5A, 0x00, 0x56, 0xEF, + 0xF4, 0x34, 0xF7, 0xC2, 0x9B, 0x59, 0x92, 0xFA, 0xA7, 0x93, 0xB3, 0xDB, 0x4B, 0x12, 0xBD, 0x29, 0xAE, 0x2A, 0x63, 0xDA, + 0x24, 0xD0, 0x71, 0x55, 0x1E, 0x89, 0xF7, 0xEE, 0x74, 0x62, 0xDD, 0x09, 0x60, 0xF0, 0x38, 0x06, 0x2E, 0x2E, 0x76, 0x8B, + 0xE2, 0x60, 0xBF, 0x28, 0x8A, 0x11, 0xEA, 0xF0, 0x7A, 0x85, 0xB4, 0x30, 0x50, 0x52, 0x52, 0x1E, 0xE4, 0x2E, 0x7E, 0x56, + 0x49, 0x0F, 0x0E, 0x06, 0x2A, 0xD7, 0x54, 0x06, 0x94, 0x67, 0xFA, 0x27, 0x77, 0x2C, 0x2A, 0x64, 0x74, 0xDE, 0x14, 0xAA, + 0x87, 0xEB, 0x84, 0xBA, 0x6C, 0x48, 0x03, 0x96, 0x10, 0xD8, 0xEC, 0xFD, 0x5A, 0x5F, 0xA5, 0x4D, 0x75, 0xF3, 0x67, 0x2A, + 0xD4, 0x9A, 0x95, 0x3B, 0xBD, 0x3B, 0x88, 0xDF, 0x74, 0xBD, 0x33, 0x88, 0x9E, 0x30, 0xAE, 0x52, 0x17, 0xEF, 0x0D, 0x22, + 0x17, 0x54, 0x0A, 0x17, 0xBF, 0xEC, 0x73, 0x51, 0x77, 0x6C, 0x40, 0x6A, 0xDB, 0x1B, 0x27, 0xBA, 0x40, 0xFD, 0x7C, 0x6D, + 0x02, 0x17, 0xFF, 0xF9, 0x0E, 0xE7, 0x44, 0x87, 0xD0, 0xAF, 0xA1, 0x25, 0x2C, 0x15, 0xE5, 0xC2, 0xC5, 0xD3, 0xE3, 0xF9, + 0x60, 0x51, 0xDB, 0xF3, 0xBE, 0x04, 0x99, 0xCD, 0x96, 0xEF, 0x42, 0xBE, 0xA6, 0xD7, 0x24, 0x28, 0x0F, 0xBB, 0x7A, 0xA9, + 0x6B, 0x79, 0x39, 0x7C, 0xDA, 0x84, 0xCE, 0x1C, 0xAC, 0x40, 0x6D, 0x66, 0x9D, 0x66, 0x9C, 0x09, 0xFE, 0x60, 0xFA, 0x44, + 0x28, 0xC9, 0xA8, 0x74, 0xFC, 0x2C, 0xB4, 0xE6, 0xC7, 0x21, 0x7C, 0x50, 0x38, 0x73, 0xF6, 0x1F, 0xC2, 0x0C, 0x3E, 0x96, + 0xE8, 0xED, 0x16, 0xC2, 0x58, 0x92, 0x25, 0xBC, 0x2E, 0x0F, 0x13, 0x16, 0x11, 0x61, 0xD6, 0xF4, 0x1B, 0x51, 0xA8, 0x1B, + 0xE2, 0x4C, 0x45, 0x16, 0xB1, 0xA0, 0x9C, 0x63, 0xEF, 0xC3, 0x6B, 0xC7, 0xDB, 0x46, 0x85, 0x91, 0x83, 0x48, 0xD4, 0xD4, + 0xF7, 0x5B, 0x7E, 0x14, 0x98, 0xAB, 0x72, 0x32, 0xE7, 0xED, 0x16, 0x92, 0x2F, 0x06, 0x90, 0xBC, 0x5C, 0xF1, 0xD5, 0x67, + 0xB1, 0xE1, 0xE9, 0xE6, 0xD0, 0xFD, 0x9E, 0x95, 0x51, 0xF5, 0x19, 0x0B, 0xCB, 0x7F, 0x8E, 0x69, 0xAC, 0xD0 +}; +const FX_BYTE g_zhCN_Locale[] = { + 0x78, 0x9C, 0xED, 0x56, 0x41, 0x4F, 0xD4, 0x40, 0x14, 0xBE, 0x9B, 0xF8, 0x1F, 0x9A, 0x46, 0x52, 0x4D, 0x58, 0x46, 0x8F, + 0x90, 0xD2, 0x64, 0x03, 0x08, 0x06, 0xBB, 0x21, 0x96, 0x68, 0xE0, 0x62, 0xBA, 0xED, 0xB0, 0x2D, 0x6C, 0x3B, 0x64, 0xB6, + 0x0D, 0x6E, 0x4F, 0x18, 0x82, 0x82, 0xC2, 0x45, 0x89, 0x9A, 0x80, 0xE1, 0x64, 0x3C, 0x28, 0x9E, 0x8C, 0x01, 0x22, 0xF1, + 0xCF, 0xB0, 0xCB, 0x91, 0xBF, 0xE0, 0x9B, 0xED, 0xB4, 0xB4, 0xDD, 0xD9, 0xB5, 0x3F, 0xC0, 0x3D, 0xCD, 0xFB, 0xDE, 0xF7, + 0x7D, 0xF3, 0xDE, 0xEB, 0x74, 0xB6, 0x6A, 0x93, 0x58, 0x66, 0x13, 0x4B, 0xBE, 0xE9, 0xE1, 0x49, 0x39, 0x72, 0x9E, 0x4F, + 0xD5, 0x64, 0xC9, 0xC6, 0x2D, 0x6B, 0x52, 0xBE, 0x3C, 0x3D, 0xE9, 0x7E, 0x78, 0x7D, 0xF7, 0xEA, 0xC7, 0xE6, 0xE5, 0xC5, + 0xFB, 0xEB, 0xDF, 0x7B, 0x10, 0x77, 0x0E, 0x2F, 0xEE, 0xC9, 0x9A, 0xCA, 0x14, 0xBE, 0x6D, 0x52, 0xA3, 0xED, 0xD5, 0x49, + 0xB3, 0xC5, 0xC5, 0x0D, 0x8A, 0x1B, 0x84, 0xBA, 0xA6, 0x0F, 0x0C, 0x8F, 0xF8, 0x81, 0x53, 0x03, 0xB8, 0xC5, 0xD7, 0xDA, + 0xE5, 0xE9, 0x66, 0xF7, 0x68, 0x47, 0x45, 0x71, 0x74, 0xFB, 0x56, 0x02, 0x9F, 0xEF, 0x09, 0xE1, 0xD3, 0x5D, 0x11, 0xDC, + 0x39, 0x3C, 0x14, 0x9B, 0x1C, 0x08, 0xD9, 0xDB, 0x27, 0x62, 0xEF, 0x2D, 0x31, 0xFB, 0x9B, 0x90, 0x7D, 0xF6, 0x59, 0xC8, + 0xDE, 0x7F, 0x39, 0x00, 0x1E, 0xD0, 0x28, 0xCB, 0x14, 0x7B, 0x45, 0x99, 0x31, 0x25, 0xC4, 0x5E, 0x24, 0x99, 0xF5, 0x3A, + 0x9D, 0x94, 0x1F, 0xC8, 0xFF, 0xA7, 0x57, 0x7A, 0x7A, 0xB6, 0xD9, 0xE6, 0x07, 0x0E, 0x56, 0x5A, 0xF7, 0xD3, 0x71, 0xF7, + 0xE8, 0xB8, 0xFB, 0xF1, 0x8B, 0x8A, 0x58, 0x18, 0xE7, 0x39, 0x0A, 0x7B, 0x88, 0xD0, 0xF3, 0x3D, 0x21, 0x77, 0x57, 0x80, + 0xC2, 0x24, 0x85, 0x0E, 0x07, 0x22, 0xEE, 0xF6, 0x49, 0x8A, 0xA2, 0xB4, 0xC8, 0x4C, 0xC1, 0x99, 0x87, 0xDD, 0x53, 0x15, + 0x6A, 0x2E, 0x56, 0x5B, 0xAC, 0xB3, 0x58, 0x61, 0xB1, 0xB6, 0x62, 0x55, 0x03, 0xEB, 0xF1, 0x30, 0x75, 0x6D, 0x17, 0x7B, + 0xC9, 0x6B, 0xCB, 0x43, 0xD8, 0xE0, 0x4D, 0x67, 0x9F, 0x0D, 0x3E, 0x01, 0x32, 0x5C, 0x48, 0xBE, 0xED, 0x4B, 0xA2, 0xBC, + 0x13, 0x20, 0x98, 0x9A, 0xDC, 0x15, 0x56, 0x50, 0xC1, 0xF7, 0xCE, 0xF6, 0x56, 0x67, 0x77, 0x5F, 0x45, 0x2C, 0x8C, 0xF3, + 0x1C, 0x4D, 0x21, 0x94, 0x6A, 0x58, 0x50, 0xB8, 0x71, 0xE2, 0x5E, 0x02, 0xBC, 0x60, 0x06, 0x01, 0xA6, 0x7E, 0xEF, 0x99, + 0xA7, 0x11, 0xBF, 0x8E, 0x56, 0xC2, 0x66, 0x53, 0xD6, 0x96, 0xE0, 0xA7, 0x74, 0xCE, 0x7E, 0x2A, 0xBA, 0x02, 0xA7, 0x47, + 0x99, 0x56, 0x60, 0xBC, 0xCA, 0x0C, 0xFC, 0x58, 0xEF, 0xA9, 0xA4, 0xE0, 0xC7, 0x1D, 0x9A, 0xC4, 0x6F, 0x0C, 0x70, 0x28, + 0xA1, 0xF6, 0xB0, 0x1D, 0x8B, 0x2B, 0x7A, 0x65, 0xBA, 0x04, 0xBF, 0xE5, 0x10, 0x1A, 0x30, 0x85, 0x90, 0x8F, 0x72, 0xED, + 0x02, 0x10, 0xB8, 0x5E, 0xA6, 0xFD, 0x4C, 0x94, 0x6B, 0xBF, 0xEA, 0x38, 0x50, 0xEF, 0x2F, 0x45, 0xD7, 0x95, 0xCE, 0xCE, + 0x2B, 0xC5, 0x30, 0x94, 0xAB, 0xAF, 0xEF, 0x14, 0x69, 0x59, 0x45, 0x19, 0x45, 0xC1, 0x2E, 0xD7, 0xBD, 0xD8, 0xA0, 0x84, + 0xBC, 0xD7, 0x3E, 0xA8, 0x27, 0x74, 0x7D, 0xC2, 0x30, 0x4A, 0x08, 0x78, 0xFF, 0x55, 0xA6, 0xE8, 0xA3, 0xA3, 0x5C, 0xBB, + 0x7C, 0x7E, 0x8B, 0x80, 0x25, 0x07, 0x62, 0xD6, 0xF4, 0x57, 0xD7, 0xE6, 0xBC, 0x96, 0x31, 0x33, 0xFD, 0x70, 0xE3, 0xD9, + 0x0B, 0x67, 0x3E, 0x5A, 0x8E, 0x67, 0x96, 0x25, 0x81, 0xCE, 0x0F, 0xBD, 0x3A, 0xA6, 0x37, 0x83, 0xCB, 0xC5, 0xBC, 0x12, + 0xC0, 0xE0, 0x00, 0x5B, 0xB2, 0x16, 0x8D, 0x46, 0xD1, 0xF8, 0x58, 0x14, 0x45, 0x2A, 0xCA, 0xF1, 0xFA, 0x8C, 0xB8, 0xD0, + 0x0A, 0x29, 0xC5, 0xBE, 0xD5, 0x96, 0xB5, 0x3B, 0xB1, 0x74, 0x7C, 0xBC, 0xA4, 0x72, 0x1D, 0x53, 0x0B, 0xFB, 0x01, 0xDF, + 0x72, 0x44, 0xA0, 0x42, 0x85, 0xCA, 0x53, 0xA3, 0xA4, 0xB9, 0x5C, 0xC8, 0x6D, 0x6D, 0x6C, 0xB9, 0x9E, 0x09, 0xE7, 0x60, + 0x2C, 0xD1, 0xC7, 0xE9, 0xA2, 0x3A, 0xFD, 0x07, 0x27, 0xE1, 0xBA, 0xCB, 0x1E, 0xFB, 0x68, 0x29, 0x7E, 0x5A, 0xF5, 0x48, + 0x29, 0xBA, 0xE7, 0xFA, 0x61, 0x4B, 0xD6, 0x2A, 0xA5, 0xC8, 0x11, 0xA6, 0x44, 0xD6, 0xEE, 0xF7, 0x73, 0x51, 0xBE, 0x6D, + 0x40, 0x92, 0xB1, 0xA7, 0x93, 0xC8, 0x03, 0xC9, 0xF9, 0xEA, 0x05, 0xB2, 0x76, 0xFD, 0x07, 0xEE, 0xD7, 0x3C, 0xA3, 0xDF, + 0x84, 0x6B, 0xDC, 0x16, 0x61, 0x0B, 0x59, 0x9B, 0xAA, 0x2D, 0x95, 0x16, 0x65, 0x87, 0xDE, 0x2F, 0x41, 0xC5, 0x6A, 0xD9, + 0xCB, 0xD0, 0x5E, 0xC7, 0x2B, 0xA6, 0xC5, 0xEE, 0xC7, 0x64, 0xC9, 0xBD, 0xAA, 0x36, 0xA9, 0x63, 0xC9, 0x80, 0x57, 0x51, + 0x32, 0x02, 0x5B, 0x7A, 0x2C, 0xA3, 0x2C, 0x9F, 0x93, 0xF4, 0x36, 0x7C, 0x75, 0xD9, 0xD2, 0x02, 0x0C, 0x4C, 0x98, 0x76, + 0x7D, 0x97, 0xF8, 0x03, 0xD3, 0x53, 0x24, 0xA4, 0x2E, 0xA6, 0xCC, 0x5F, 0x98, 0x8F, 0x4B, 0x58, 0x70, 0xFF, 0x41, 0x98, + 0xC3, 0x75, 0x8A, 0x37, 0x86, 0x10, 0xAA, 0xD4, 0xAC, 0xC3, 0x4B, 0x35, 0x98, 0xB0, 0xE8, 0x98, 0xAE, 0x30, 0x3D, 0x4F, + 0xA2, 0x70, 0xCD, 0x94, 0x66, 0x49, 0xE0, 0xB8, 0x16, 0xEB, 0xA3, 0xF2, 0xF4, 0x91, 0xA4, 0x0F, 0xA3, 0x42, 0xCB, 0x96, + 0x43, 0x12, 0xEA, 0x93, 0x21, 0x9B, 0x02, 0x73, 0xD8, 0x68, 0x39, 0xA9, 0x1D, 0xFA, 0x8D, 0x55, 0xD2, 0xE3, 0xF1, 0x7D, + 0xD1, 0xCD, 0x33, 0x63, 0x51, 0xFC, 0x15, 0x0D, 0xCB, 0xBF, 0xC0, 0xE4, 0x3D, 0x40 +}; +const FX_BYTE g_zhTW_Locale[] = { + 0x78, 0x9C, 0xED, 0x57, 0xCD, 0x4F, 0xD4, 0x40, 0x14, 0x3F, 0x63, 0xE2, 0xFF, 0x30, 0x69, 0x20, 0xD5, 0x04, 0xA8, 0x1E, + 0x21, 0xA5, 0xC9, 0xC6, 0x45, 0x30, 0x58, 0x42, 0xEC, 0x46, 0x22, 0x17, 0x33, 0xDB, 0x0E, 0xDB, 0xC2, 0xB6, 0x43, 0x66, + 0xDB, 0xC0, 0xF6, 0x24, 0x12, 0x14, 0x14, 0x62, 0xA2, 0xC4, 0x8F, 0x80, 0xE1, 0x64, 0x3C, 0x28, 0x89, 0x07, 0x0F, 0x2C, + 0x51, 0xFF, 0x1A, 0x76, 0x39, 0xFA, 0x2F, 0x38, 0xD3, 0x2F, 0xFA, 0xB1, 0xB3, 0xD4, 0xC4, 0xA3, 0x7B, 0x9A, 0xF7, 0xDE, + 0xEF, 0xF7, 0xE6, 0xBD, 0xDF, 0xBC, 0x7D, 0xD9, 0x95, 0x9B, 0x58, 0x87, 0x4D, 0x04, 0x1C, 0x68, 0xA3, 0x29, 0xC1, 0x37, + 0x1F, 0xD7, 0x16, 0x05, 0x60, 0xA0, 0x96, 0x3E, 0x25, 0x9C, 0x9F, 0x9E, 0xF4, 0xDE, 0x3E, 0xBF, 0x71, 0xD1, 0xD9, 0x3C, + 0xFF, 0xF9, 0xE6, 0xF7, 0x8F, 0xBD, 0xEE, 0xAB, 0x6F, 0xBD, 0xCE, 0xAF, 0x9B, 0x82, 0x72, 0xFD, 0x1A, 0x00, 0x32, 0x63, + 0x39, 0x06, 0x24, 0x5A, 0xDB, 0xAE, 0xE3, 0x66, 0x2B, 0x4A, 0xD0, 0x20, 0xA8, 0x81, 0x89, 0x05, 0x1D, 0x86, 0x1A, 0x02, + 0xB2, 0x8D, 0x1D, 0xD7, 0x9C, 0xA7, 0xA1, 0x16, 0xB3, 0x87, 0x42, 0x5B, 0x39, 0x3F, 0x7D, 0xD2, 0x3B, 0xDA, 0x91, 0xA5, + 0xD0, 0x4A, 0x07, 0xCE, 0xF6, 0x38, 0x81, 0xD3, 0xDD, 0xFE, 0x81, 0xEE, 0xE1, 0x21, 0x2F, 0xD5, 0x01, 0x87, 0xB1, 0x7D, + 0xC2, 0xBB, 0x63, 0x8B, 0xC7, 0xF8, 0xC2, 0x61, 0x74, 0x3E, 0x72, 0x18, 0xFB, 0x9B, 0xDC, 0x00, 0xB7, 0x79, 0x16, 0xCB, + 0xF7, 0x0F, 0xA2, 0x73, 0x22, 0x61, 0x5A, 0x52, 0x00, 0xEB, 0x75, 0x32, 0x25, 0xDC, 0x16, 0xFE, 0x6B, 0xFB, 0x8F, 0xB4, + 0x35, 0x60, 0x3B, 0x35, 0xAC, 0xD4, 0x52, 0x7A, 0xEF, 0x8F, 0x7B, 0x47, 0xC7, 0xBD, 0x77, 0x9F, 0x64, 0x89, 0x99, 0x39, + 0x3F, 0xBD, 0xAF, 0xBF, 0xFF, 0x6C, 0x8F, 0x83, 0xDF, 0xED, 0xEB, 0xA7, 0x4A, 0x73, 0xF2, 0x1C, 0xF4, 0xC7, 0x6F, 0x9F, + 0x24, 0x7E, 0x10, 0x9C, 0xFA, 0x34, 0x91, 0x1B, 0x8F, 0x80, 0x5D, 0xE8, 0xA3, 0xD8, 0x41, 0xB1, 0xF6, 0x62, 0xD5, 0xC5, + 0x7A, 0x8B, 0x95, 0x0E, 0xAC, 0xD1, 0x46, 0xC4, 0x32, 0x2C, 0x64, 0xA7, 0x57, 0x43, 0xE4, 0xA2, 0xD7, 0xBD, 0xE8, 0xEE, + 0xB3, 0x87, 0x8A, 0x1D, 0xF9, 0xF0, 0xCB, 0x42, 0x18, 0x5C, 0x9A, 0xA9, 0x4B, 0x10, 0x81, 0xA9, 0xFC, 0xD4, 0xA2, 0x35, + 0x7D, 0xED, 0x6E, 0x6F, 0x75, 0x77, 0xF7, 0x65, 0x89, 0x99, 0x39, 0x7F, 0xE2, 0x04, 0xC1, 0x29, 0xE6, 0xD2, 0x65, 0x27, + 0xE5, 0xB6, 0x5D, 0xE8, 0x35, 0xA0, 0x8B, 0x16, 0xA0, 0xEB, 0x22, 0xE2, 0x24, 0xD2, 0x27, 0x9E, 0x68, 0x21, 0x2E, 0x7B, + 0xCD, 0xA6, 0xA0, 0x3C, 0xA2, 0x1F, 0xB1, 0xDB, 0xF9, 0x2E, 0xAA, 0x22, 0x9D, 0x41, 0xB1, 0x2A, 0xD2, 0x87, 0x10, 0xA7, + 0xE9, 0x87, 0xE9, 0x92, 0x50, 0x78, 0x39, 0x9A, 0xD8, 0x69, 0x70, 0x72, 0x94, 0xE2, 0xDB, 0xC8, 0x08, 0xE9, 0x92, 0x2A, + 0x55, 0x4B, 0x31, 0x5A, 0x26, 0x26, 0x2E, 0x9F, 0x03, 0x40, 0xC6, 0x13, 0xC9, 0xE1, 0x5A, 0x76, 0x4E, 0x8E, 0x94, 0x27, + 0x23, 0x47, 0xC5, 0x34, 0xC5, 0xDE, 0x87, 0xA7, 0xA2, 0xAA, 0x8A, 0xDD, 0x9D, 0x67, 0xA2, 0xA6, 0x89, 0x17, 0x9F, 0x5F, + 0x8B, 0x60, 0x49, 0x96, 0x52, 0x0C, 0x5E, 0x8A, 0x50, 0x8D, 0xFE, 0x29, 0x4A, 0x25, 0x08, 0xE4, 0xA8, 0x00, 0x73, 0x52, + 0x55, 0x27, 0x35, 0xAD, 0x14, 0x25, 0xD2, 0x23, 0x24, 0xE5, 0x19, 0x4C, 0x8D, 0x5C, 0xEF, 0xD1, 0x70, 0xD4, 0xA8, 0x37, + 0x9E, 0x98, 0x19, 0xE8, 0xAC, 0xAC, 0xCE, 0xDA, 0x2D, 0x6D, 0xBA, 0x7A, 0x77, 0x7D, 0x71, 0xC3, 0x9C, 0xF3, 0x97, 0x42, + 0x11, 0xD3, 0xA0, 0x80, 0xE9, 0x78, 0x76, 0x1D, 0x91, 0xAC, 0x92, 0x19, 0x5F, 0x54, 0x14, 0xF5, 0xD1, 0x99, 0xD7, 0x05, + 0xC5, 0x1F, 0xF5, 0xFD, 0x89, 0x71, 0xDF, 0xF7, 0x65, 0x29, 0x83, 0xE3, 0x53, 0x75, 0x8F, 0x10, 0xE4, 0xE8, 0x6D, 0x41, + 0x19, 0x0E, 0xC9, 0x13, 0x13, 0xA5, 0xB9, 0x6B, 0x88, 0xE8, 0xC8, 0x71, 0xA3, 0x6B, 0x47, 0x8A, 0x3C, 0xA6, 0x47, 0xA1, + 0x87, 0xA4, 0xAF, 0xCB, 0x56, 0x87, 0xB2, 0xAE, 0x28, 0xBD, 0x81, 0x74, 0xCB, 0x86, 0x74, 0x48, 0xC6, 0xE3, 0x2C, 0x61, + 0x98, 0x4B, 0x68, 0x10, 0xEC, 0xAD, 0x59, 0x6C, 0x26, 0x46, 0x4B, 0x32, 0x92, 0x0E, 0x46, 0x4A, 0x12, 0x6C, 0xCB, 0xF1, + 0x5A, 0x82, 0x32, 0x56, 0x12, 0xEE, 0x23, 0x82, 0x05, 0xE5, 0x56, 0x01, 0x7D, 0x29, 0x4C, 0xE6, 0xBD, 0xE3, 0xC7, 0xC8, + 0x28, 0x93, 0x75, 0xC6, 0x63, 0x18, 0x18, 0x82, 0x32, 0x5F, 0x1B, 0xA6, 0x2B, 0x29, 0x83, 0x18, 0xC0, 0xB2, 0x5A, 0x98, + 0x1D, 0x04, 0xA5, 0xB6, 0x58, 0xFD, 0x0B, 0x5A, 0xFA, 0x21, 0x0A, 0xA4, 0x60, 0x27, 0x16, 0xEA, 0x66, 0x4B, 0xA0, 0xBD, + 0x86, 0x96, 0xA1, 0x1E, 0xAF, 0xE0, 0xD8, 0x8C, 0x72, 0x56, 0x0C, 0x5C, 0x47, 0x40, 0xA5, 0xAF, 0x05, 0x34, 0xD7, 0x00, + 0xF7, 0x05, 0xA9, 0x2F, 0x4C, 0x6D, 0xD3, 0x9F, 0x90, 0x06, 0x58, 0xA0, 0x32, 0x72, 0x00, 0x96, 0x63, 0x61, 0x67, 0x00, + 0xE0, 0x0E, 0xF6, 0x88, 0x85, 0x08, 0xBB, 0x85, 0x83, 0x08, 0x4B, 0x59, 0xB0, 0xAE, 0x84, 0xCC, 0xA2, 0x3A, 0x41, 0xEB, + 0x03, 0x21, 0x15, 0x02, 0xEB, 0xF4, 0x8B, 0x38, 0x08, 0x52, 0x33, 0xA1, 0xC5, 0x01, 0xCC, 0x61, 0xDF, 0x5B, 0x85, 0x60, + 0x06, 0xBB, 0xA6, 0xA5, 0xB3, 0x9E, 0xC6, 0x1E, 0xDE, 0x03, 0xEA, 0x60, 0x30, 0x15, 0x40, 0x37, 0x71, 0x0C, 0x7E, 0x30, + 0xF0, 0x6A, 0x0D, 0x5F, 0x21, 0x77, 0xF4, 0x2A, 0x6D, 0xCF, 0x69, 0xAC, 0xE0, 0x00, 0x19, 0xDE, 0x1E, 0x2C, 0xB6, 0xD4, + 0x7B, 0xCA, 0x52, 0xF8, 0x67, 0x41, 0xF9, 0x03, 0x11, 0xC2, 0x4A, 0xC9 +}; +const FX_BYTE g_zhHK_Locale[] = { + 0x78, 0x9C, 0xA5, 0x57, 0x4D, 0x4F, 0x13, 0x41, 0x18, 0x3E, 0x63, 0xE2, 0x7F, 0x98, 0x6C, 0x20, 0x0B, 0x09, 0x50, 0x8A, + 0x9F, 0x25, 0xCB, 0x26, 0x44, 0x90, 0x9A, 0x5A, 0x43, 0x2C, 0xD1, 0xC8, 0xC5, 0x6C, 0x77, 0x87, 0xEE, 0x42, 0x77, 0x87, + 0x4C, 0xB7, 0xC1, 0x6E, 0x3C, 0x88, 0x04, 0xA5, 0x5A, 0x2E, 0x4A, 0x54, 0x02, 0x86, 0x78, 0x50, 0x0F, 0x48, 0xBC, 0x78, + 0x68, 0x89, 0xC6, 0x3F, 0x43, 0x8B, 0x9E, 0xFC, 0x0B, 0xCE, 0xEC, 0x17, 0xFB, 0x35, 0x6D, 0x8D, 0x3D, 0xCD, 0xFB, 0xBC, + 0xCF, 0xF3, 0xCE, 0xFB, 0x3E, 0x33, 0x3B, 0x01, 0xA1, 0x8C, 0x64, 0xA9, 0x0C, 0x81, 0x21, 0xE9, 0x70, 0x9A, 0xB3, 0xD4, + 0x87, 0xD9, 0x1C, 0x07, 0x14, 0x58, 0x91, 0xA7, 0xB9, 0xD3, 0xE6, 0x71, 0xE7, 0xCD, 0xF3, 0xE1, 0xB3, 0xD6, 0xC6, 0xE9, + 0x8F, 0xD7, 0x7F, 0xBE, 0x37, 0x7E, 0x7F, 0xDA, 0xEB, 0x34, 0xBF, 0x9E, 0xD5, 0x5B, 0xED, 0xED, 0xA3, 0x5F, 0x1F, 0x1A, + 0x9D, 0xDD, 0x9F, 0xED, 0xC6, 0xC9, 0x08, 0x27, 0x5E, 0xBC, 0x00, 0x80, 0x40, 0x8B, 0x18, 0x8A, 0x84, 0x0B, 0x35, 0xBD, + 0x88, 0xCA, 0x15, 0xB7, 0x5E, 0x09, 0xC3, 0x12, 0xC2, 0x9A, 0x64, 0x50, 0xD6, 0x00, 0x10, 0x74, 0x64, 0x98, 0xEA, 0x1D, + 0x92, 0xAA, 0xD0, 0x78, 0xC0, 0x89, 0xC5, 0xD3, 0xE6, 0x93, 0xCE, 0xC1, 0xB6, 0x90, 0x72, 0xA2, 0x60, 0xE2, 0xA4, 0xC1, + 0x48, 0x34, 0xEB, 0xC9, 0x89, 0xF6, 0xFE, 0x3E, 0xAB, 0xD4, 0x2E, 0x43, 0xB1, 0x75, 0xCC, 0xDA, 0x63, 0x93, 0xA5, 0x38, + 0x62, 0x28, 0x5A, 0xEF, 0x19, 0x8A, 0x9D, 0x0D, 0x66, 0x82, 0x39, 0x3C, 0xCD, 0x45, 0xE7, 0x07, 0xEE, 0xDA, 0xB7, 0x30, + 0x68, 0x29, 0x90, 0x8A, 0x45, 0x3C, 0xCD, 0xA5, 0xB9, 0x60, 0x95, 0x74, 0x72, 0xF1, 0xC9, 0x64, 0xF8, 0x52, 0x32, 0x7C, + 0x39, 0x19, 0xBE, 0x92, 0x0C, 0x5F, 0x4D, 0x86, 0xAF, 0x25, 0xC3, 0xD7, 0x93, 0xE1, 0x4C, 0x32, 0x9C, 0x9E, 0x60, 0xE0, + 0x8C, 0x39, 0xD3, 0x93, 0x3D, 0x0D, 0x54, 0xA4, 0x5A, 0xE0, 0x46, 0x92, 0x48, 0xEC, 0xBC, 0x3B, 0xEC, 0x1C, 0x1C, 0x76, + 0xDE, 0x7E, 0x14, 0x52, 0x34, 0x8C, 0xE0, 0xE4, 0xC0, 0x92, 0xF1, 0x93, 0x06, 0x83, 0x5F, 0x4F, 0xC4, 0xC9, 0x55, 0x65, + 0xD4, 0xD9, 0x4D, 0xE6, 0x6F, 0x1D, 0xFB, 0x38, 0xB0, 0x57, 0x09, 0x43, 0x44, 0xEE, 0x80, 0xAD, 0x8E, 0xCD, 0x11, 0x9F, + 0x20, 0xDE, 0x7B, 0xBC, 0xEB, 0x78, 0xBF, 0xF1, 0x4E, 0xBB, 0xF6, 0xA8, 0x43, 0xAC, 0x29, 0x1A, 0xD4, 0x83, 0xDF, 0xBF, + 0x0B, 0x91, 0xED, 0x5E, 0xB4, 0x77, 0xE8, 0x41, 0x79, 0x40, 0x34, 0xFD, 0x32, 0x96, 0x06, 0xE7, 0x61, 0x60, 0x13, 0x88, + 0xA5, 0x40, 0x7D, 0x12, 0x91, 0x9E, 0xBE, 0xB4, 0xB7, 0x36, 0xDB, 0xF5, 0x1D, 0x21, 0x45, 0xC3, 0x08, 0xEE, 0x83, 0xC0, + 0x5E, 0x79, 0x5A, 0xF2, 0xA2, 0xA5, 0x22, 0x4F, 0x9A, 0x83, 0x2A, 0x92, 0x09, 0x17, 0x24, 0xD3, 0x84, 0xD8, 0xF0, 0xAD, + 0xF7, 0x11, 0xF7, 0xD5, 0x5B, 0xAE, 0x96, 0xCB, 0x9C, 0xF8, 0x80, 0xFC, 0xF8, 0x76, 0xEB, 0x1B, 0x9F, 0xE7, 0xC9, 0x1D, + 0xE4, 0x67, 0x79, 0x72, 0x10, 0x3C, 0x98, 0x23, 0x3F, 0x6A, 0x8C, 0xAF, 0x61, 0x15, 0x29, 0x23, 0xA3, 0xC4, 0x28, 0xD2, + 0x97, 0x5E, 0x87, 0xCA, 0xFF, 0xC8, 0x2B, 0x2A, 0xC2, 0x26, 0x2D, 0xD0, 0x53, 0x0E, 0x40, 0x08, 0x71, 0x7D, 0x32, 0x35, + 0x3D, 0xE2, 0x53, 0x00, 0x09, 0xF9, 0x34, 0xA3, 0xAA, 0x7C, 0x67, 0xEF, 0x29, 0x9F, 0xCF, 0xF3, 0xED, 0xED, 0x67, 0x7C, + 0xA1, 0xC0, 0x9F, 0x7D, 0x7E, 0xC5, 0x83, 0x25, 0x21, 0x15, 0x50, 0xB0, 0x4A, 0x38, 0x2E, 0x25, 0x97, 0xE8, 0xAB, 0x80, + 0x6D, 0x13, 0xD1, 0x4F, 0xE5, 0xF3, 0x53, 0x85, 0x42, 0x5F, 0x12, 0xD7, 0x9A, 0x19, 0xAA, 0x89, 0x0A, 0xA8, 0x19, 0x91, + 0xD1, 0xDD, 0x4B, 0xB3, 0x48, 0x50, 0xEF, 0x26, 0xCD, 0x4B, 0xC6, 0xCA, 0x6A, 0x56, 0xAF, 0x14, 0xE6, 0x66, 0x6F, 0xAE, + 0xDF, 0x7F, 0xA4, 0xE6, 0xAC, 0x25, 0xC7, 0xC3, 0x20, 0xC9, 0x56, 0x1A, 0x55, 0xBD, 0x08, 0x71, 0xD8, 0xC8, 0x10, 0xE6, + 0xF6, 0x44, 0x30, 0xF2, 0x2D, 0xC8, 0x9C, 0x68, 0x8D, 0x5A, 0x56, 0x66, 0xDC, 0xB2, 0x2C, 0x21, 0x15, 0xE2, 0xB1, 0xA5, + 0x72, 0x15, 0x63, 0x68, 0xC8, 0x35, 0x4E, 0x1C, 0x74, 0xC4, 0x99, 0xCC, 0xE3, 0x61, 0x7F, 0x39, 0xD2, 0x77, 0x9D, 0x35, + 0x88, 0x65, 0x68, 0x98, 0x6E, 0x0B, 0x43, 0x71, 0x1D, 0xF5, 0x26, 0x36, 0x8F, 0x3F, 0xE3, 0xF9, 0xD8, 0x03, 0x61, 0xC8, + 0x2D, 0xAF, 0x40, 0x59, 0xD3, 0x25, 0x72, 0x5F, 0xC6, 0xBD, 0x2A, 0x4E, 0x9A, 0x29, 0x28, 0x61, 0x54, 0x5D, 0xD3, 0xE8, + 0xF5, 0x18, 0xED, 0x53, 0xE1, 0x4F, 0x30, 0xD4, 0xA7, 0x40, 0xD7, 0x8C, 0x6A, 0x85, 0x13, 0xC7, 0xFA, 0xA4, 0x5B, 0x10, + 0x23, 0x4E, 0x9C, 0x88, 0xB1, 0xCF, 0x8D, 0x09, 0x9D, 0xBD, 0x77, 0x30, 0x21, 0x67, 0xC2, 0xA0, 0x77, 0x23, 0xED, 0x80, + 0x13, 0xB3, 0xB9, 0x41, 0xF2, 0x6C, 0x85, 0x18, 0x5D, 0x54, 0x5A, 0x05, 0xD1, 0x05, 0x95, 0xCD, 0xFE, 0x83, 0x2C, 0x78, + 0x10, 0x31, 0x91, 0xFD, 0x6E, 0xC6, 0xFA, 0xA6, 0xEF, 0x41, 0x6D, 0x0D, 0x2E, 0x4B, 0xB2, 0xF7, 0x4C, 0x7B, 0xA1, 0x5B, + 0x73, 0x46, 0x41, 0x45, 0x08, 0xF2, 0xE4, 0xB4, 0x40, 0xC1, 0x54, 0xC0, 0x6D, 0x2E, 0x95, 0x48, 0xCB, 0xD7, 0xC8, 0xDF, + 0x92, 0x0A, 0x58, 0x20, 0x36, 0x32, 0x08, 0x9A, 0xA1, 0x21, 0xA3, 0x0B, 0xE1, 0x06, 0xAA, 0x62, 0x0D, 0x62, 0xBA, 0x0B, + 0x83, 0xE1, 0xB4, 0xB2, 0xA0, 0xF5, 0xA4, 0x64, 0x61, 0x11, 0xC3, 0xF5, 0xAE, 0x94, 0x19, 0x2C, 0x15, 0xC9, 0x47, 0xD9, + 0x8D, 0xB2, 0xA8, 0x4A, 0x1A, 0x83, 0x90, 0x43, 0x56, 0x75, 0x55, 0x02, 0xF3, 0xC8, 0x54, 0x35, 0x99, 0xCE, 0x34, 0x76, + 0xEF, 0x16, 0xC8, 0x77, 0x27, 0x13, 0x03, 0x64, 0x15, 0x79, 0xE4, 0xBB, 0x5D, 0xB7, 0x2E, 0xA0, 0x1E, 0x76, 0xBB, 0xA7, + 0x52, 0xAB, 0x1A, 0xA5, 0x15, 0x64, 0x33, 0x9D, 0xDD, 0xED, 0x47, 0x2E, 0x70, 0x9E, 0x42, 0xCA, 0xF9, 0x27, 0x42, 0xFC, + 0x0B, 0xD9, 0x0E, 0x4B, 0xED +}; +const FX_BYTE g_jaJP_Locale[] = { + 0x78, 0x9C, 0xED, 0x56, 0xCB, 0x6E, 0xD3, 0x40, 0x14, 0x5D, 0x17, 0x89, 0x7F, 0x18, 0x59, 0x20, 0x83, 0xD4, 0xD6, 0x0D, + 0xEF, 0x56, 0xAE, 0xA5, 0x8A, 0x96, 0x86, 0x16, 0xA3, 0x08, 0x57, 0xA0, 0x76, 0x83, 0x26, 0xF6, 0x34, 0x99, 0x36, 0x9E, + 0xA9, 0x26, 0xB6, 0x4A, 0xBC, 0xE2, 0x21, 0x20, 0x48, 0x74, 0x01, 0x1B, 0x04, 0x44, 0x62, 0x55, 0x40, 0x02, 0x04, 0x8B, + 0x6E, 0xD8, 0xD0, 0xAF, 0x49, 0x5A, 0x56, 0xFC, 0x02, 0x33, 0x7E, 0xC5, 0x8E, 0xED, 0xE0, 0xEE, 0xF1, 0x22, 0x99, 0x7B, + 0x7C, 0xCE, 0xF5, 0xBD, 0xE7, 0x8E, 0x47, 0x56, 0x5B, 0xD4, 0x84, 0x2D, 0x04, 0x08, 0xB4, 0xD1, 0xBC, 0xB4, 0x05, 0xEF, + 0xAF, 0xD4, 0x24, 0x60, 0xA1, 0xB6, 0x39, 0x2F, 0x0D, 0xDE, 0xEC, 0x1F, 0x7F, 0xFF, 0x76, 0x8E, 0xFF, 0x0D, 0x7A, 0x5F, + 0xCF, 0x4B, 0xDA, 0xE9, 0x53, 0x00, 0xA8, 0x82, 0x4C, 0x2C, 0xC8, 0x8C, 0x8E, 0x5D, 0xA7, 0xAD, 0x76, 0xA8, 0x6B, 0x30, + 0xD4, 0xA0, 0x0C, 0x43, 0x22, 0x58, 0x13, 0x40, 0xB5, 0x29, 0x71, 0x9A, 0xB7, 0xF9, 0xAD, 0xB6, 0x88, 0x27, 0x82, 0x58, + 0xAB, 0x0C, 0x7A, 0x5D, 0x55, 0x09, 0xD6, 0x09, 0xF8, 0x42, 0x3E, 0x7C, 0x31, 0x1F, 0xBE, 0x94, 0x0F, 0x5F, 0xCE, 0x87, + 0xAF, 0xE4, 0xC3, 0x57, 0xF3, 0xE1, 0x6B, 0xF9, 0xF0, 0x6C, 0x3E, 0x5C, 0x99, 0x29, 0xC0, 0x0B, 0xFA, 0xAC, 0x8C, 0x34, + 0x0A, 0xC2, 0x75, 0xEC, 0x53, 0xD2, 0x37, 0x00, 0xEB, 0x75, 0x36, 0x2F, 0x55, 0xA4, 0xFF, 0x06, 0x9E, 0xC4, 0x40, 0x0B, + 0x76, 0x12, 0xDB, 0x8E, 0x47, 0x9A, 0xD8, 0xBE, 0xEF, 0x7B, 0xFC, 0x57, 0x55, 0x44, 0x38, 0xC4, 0x7B, 0xDD, 0x5C, 0xFC, + 0xE8, 0xD1, 0x97, 0x7C, 0xFE, 0x8F, 0x83, 0x82, 0x3C, 0x9F, 0x73, 0xF1, 0xDF, 0xCF, 0x5F, 0xE5, 0xE2, 0xFD, 0xDE, 0x87, + 0x11, 0x1C, 0xF8, 0xAB, 0x9C, 0x26, 0x46, 0xF6, 0x40, 0xD8, 0x4D, 0xB6, 0x8F, 0x6C, 0x07, 0xD9, 0xDA, 0xB3, 0x55, 0x67, + 0xEB, 0xCD, 0x56, 0x5A, 0x5C, 0xA3, 0x8D, 0x18, 0xB6, 0x30, 0xB2, 0x93, 0x2F, 0x79, 0x08, 0x69, 0xFD, 0xBD, 0x6E, 0xFF, + 0xC5, 0x1E, 0x1F, 0x4E, 0x04, 0x64, 0x6F, 0xFF, 0x7A, 0x99, 0xBE, 0x0D, 0x86, 0x61, 0xE2, 0x21, 0x88, 0xC1, 0x44, 0x7E, + 0x1E, 0x69, 0x47, 0x07, 0x0F, 0xFB, 0x4F, 0x9F, 0xF8, 0xD9, 0x45, 0x18, 0xE3, 0xC7, 0xFB, 0x87, 0x83, 0x77, 0x1F, 0x63, + 0x10, 0xF8, 0xAB, 0x48, 0xCB, 0x8F, 0x2D, 0x65, 0xE4, 0xDC, 0x0A, 0x50, 0x0B, 0x3A, 0xA8, 0x06, 0x1D, 0x07, 0x31, 0x12, + 0x5B, 0x1F, 0x23, 0xE1, 0xD1, 0xB6, 0xE9, 0xB6, 0x5A, 0x92, 0xB6, 0xCE, 0x2F, 0xB9, 0xFF, 0xF3, 0x40, 0xD6, 0x65, 0x6E, + 0xB8, 0xBC, 0x28, 0xF3, 0x41, 0xC8, 0x4B, 0xFC, 0x12, 0xBE, 0xC4, 0x92, 0xA2, 0x1C, 0x2D, 0x4A, 0x1A, 0x05, 0x39, 0x4A, + 0xE9, 0x6D, 0x64, 0x05, 0x72, 0x45, 0xD7, 0x95, 0xC5, 0xC5, 0x52, 0x9A, 0x76, 0x93, 0x32, 0x47, 0xA8, 0xF2, 0x35, 0x00, + 0xA4, 0x90, 0xD0, 0x10, 0x07, 0xDB, 0x23, 0x86, 0x24, 0x90, 0x94, 0x21, 0x55, 0x79, 0xF0, 0xF6, 0xB1, 0xAC, 0xEB, 0x72, + 0xBF, 0xFB, 0x4C, 0x36, 0x0C, 0xF9, 0xE8, 0xD3, 0x6B, 0x79, 0x43, 0x55, 0x12, 0xF4, 0x22, 0x7D, 0x60, 0x46, 0x75, 0x4E, + 0xD7, 0xE7, 0x0C, 0x63, 0xAE, 0x9C, 0xC6, 0x37, 0x20, 0x94, 0x94, 0x12, 0x84, 0xDD, 0x0B, 0xC9, 0x28, 0x5F, 0x74, 0x3E, + 0xD2, 0x67, 0xB8, 0x15, 0xD6, 0x38, 0x1A, 0xED, 0x8F, 0x65, 0x48, 0xB6, 0xB6, 0xAB, 0x76, 0xDB, 0x58, 0x5A, 0xBC, 0xB1, + 0x7B, 0xEF, 0x41, 0x73, 0xD5, 0xDB, 0x08, 0x0C, 0x4B, 0x92, 0x7C, 0x25, 0x71, 0xED, 0x3A, 0x62, 0x69, 0xD7, 0x52, 0x58, + 0x58, 0x12, 0xC7, 0xF8, 0x0E, 0x37, 0x25, 0xCD, 0x9B, 0xF4, 0xBC, 0xD9, 0x69, 0xCF, 0xF3, 0x54, 0x25, 0xC5, 0x2B, 0x96, + 0x9A, 0x2E, 0x63, 0x88, 0x98, 0x1D, 0x49, 0x3B, 0xE3, 0x8B, 0x4B, 0x0B, 0x77, 0x10, 0x33, 0x11, 0x71, 0xC2, 0x67, 0x9E, + 0xCD, 0xEA, 0x84, 0x19, 0x99, 0x06, 0xE2, 0xA6, 0x86, 0x7D, 0x4E, 0xA4, 0xA1, 0x30, 0xBD, 0x85, 0x4C, 0x6C, 0x43, 0xBE, + 0x1B, 0xA6, 0xA3, 0x2C, 0xC1, 0xED, 0x42, 0x41, 0x83, 0x51, 0x77, 0x07, 0x8B, 0xF9, 0x4F, 0x96, 0x54, 0xC4, 0x1D, 0x9C, + 0x2D, 0x29, 0xB0, 0x31, 0x71, 0xDB, 0x92, 0x36, 0x55, 0x92, 0xEE, 0x21, 0x46, 0x25, 0x6D, 0x26, 0xC3, 0x1E, 0x1A, 0x93, + 0x1A, 0x76, 0x34, 0x89, 0x94, 0x33, 0x69, 0x30, 0xDA, 0x81, 0x7E, 0x20, 0x69, 0x7F, 0x0E, 0xF9, 0x89, 0x9D, 0x66, 0x8C, + 0x51, 0xE1, 0x36, 0x15, 0x0B, 0x49, 0x5B, 0xA9, 0xAD, 0x9F, 0x40, 0x96, 0x1C, 0x44, 0x46, 0xE4, 0x1F, 0x7F, 0x99, 0xBA, + 0xC5, 0xDB, 0xDE, 0xD9, 0x41, 0x9B, 0xD0, 0x8C, 0x4E, 0xDB, 0x28, 0x0C, 0x73, 0xAE, 0x52, 0xCF, 0xDD, 0x86, 0x60, 0x99, + 0x3A, 0x4D, 0x6C, 0x82, 0x1A, 0xA3, 0x53, 0x77, 0x6F, 0x02, 0x5D, 0x52, 0xC6, 0x91, 0x75, 0x4C, 0xCC, 0x26, 0x8D, 0xC8, + 0x77, 0x0A, 0xC8, 0x7A, 0x87, 0x7F, 0x2A, 0x5A, 0x82, 0x55, 0x44, 0xC0, 0x04, 0x53, 0x32, 0x86, 0x70, 0x9D, 0xBA, 0x0C, + 0x23, 0x06, 0x0C, 0xC7, 0x2A, 0x60, 0x2C, 0x58, 0xB4, 0x8E, 0x40, 0x0D, 0xFF, 0x93, 0x52, 0x45, 0x75, 0x86, 0x76, 0xC7, + 0x52, 0x16, 0x18, 0xAC, 0xF3, 0x17, 0x77, 0x1C, 0x65, 0xAD, 0x09, 0xF1, 0x58, 0x02, 0x6F, 0xA9, 0x21, 0x6A, 0x01, 0xB7, + 0xC6, 0xD2, 0x0C, 0x5A, 0x8A, 0xA6, 0x77, 0x5C, 0xD2, 0xD8, 0xA2, 0x3E, 0x33, 0x18, 0x89, 0x7F, 0xAA, 0x25, 0xE6, 0xA9, + 0x2A, 0xC1, 0x87, 0xBD, 0xF6, 0x17, 0x6C, 0x42, 0x08, 0x21 +}; +const FX_BYTE g_koKR_Locale[] = { + 0x78, 0x9C, 0xED, 0x56, 0x4D, 0x6B, 0xD4, 0x40, 0x18, 0x3E, 0x57, 0xF0, 0x3F, 0x0C, 0xC1, 0x12, 0x85, 0x76, 0xB7, 0xEB, + 0x77, 0x4B, 0x1A, 0x28, 0x6E, 0x6D, 0x65, 0x8D, 0x94, 0xA6, 0x58, 0xEC, 0x45, 0x66, 0x93, 0xE9, 0x26, 0xED, 0x26, 0x53, + 0x26, 0x09, 0x75, 0x73, 0xAE, 0x52, 0xF0, 0xE2, 0xA1, 0x87, 0xEA, 0x6E, 0xB1, 0x07, 0x11, 0x2A, 0x88, 0x22, 0x22, 0x1E, + 0x14, 0x7F, 0x8D, 0x62, 0x6D, 0x8A, 0x7F, 0xC1, 0xC9, 0xE7, 0xE6, 0x63, 0xB2, 0x4D, 0xEF, 0xEE, 0x61, 0x99, 0xF7, 0x99, + 0xE7, 0x79, 0xF3, 0xBE, 0xCF, 0x4C, 0x5E, 0x22, 0x74, 0xB1, 0x02, 0xBB, 0x08, 0x98, 0xD0, 0x40, 0xB3, 0xDC, 0x26, 0x7E, + 0xDC, 0x5A, 0xE6, 0x80, 0x8A, 0x2C, 0x65, 0x96, 0xFB, 0x35, 0x38, 0x38, 0xFE, 0x34, 0xF8, 0xFD, 0xE1, 0xFD, 0xE5, 0xE3, + 0xD7, 0x47, 0x3F, 0xFB, 0xDF, 0xAF, 0x70, 0xE2, 0xC5, 0x0B, 0x00, 0x08, 0x3E, 0xDF, 0x54, 0x21, 0x91, 0x7B, 0x46, 0x1B, + 0x77, 0xAD, 0x48, 0xDA, 0x21, 0xA8, 0x83, 0x89, 0x0E, 0x4D, 0x9F, 0x35, 0x06, 0x04, 0x03, 0x9B, 0xB6, 0xF6, 0x80, 0x6E, + 0x59, 0x7E, 0x3C, 0x16, 0xC6, 0x62, 0xC3, 0xEB, 0xEF, 0x09, 0xF5, 0x70, 0x9D, 0x82, 0xAF, 0xB2, 0xE1, 0x6B, 0x6C, 0xF8, + 0x3A, 0x1B, 0xBE, 0xC1, 0x86, 0x6F, 0xB2, 0xE1, 0x5B, 0x6C, 0xF8, 0x36, 0x1B, 0x9E, 0x66, 0xC3, 0x8D, 0xA9, 0x12, 0xBC, + 0xA4, 0xCF, 0x46, 0xAE, 0x51, 0x10, 0xAD, 0x13, 0x9F, 0xD2, 0xBE, 0x01, 0xD8, 0x6E, 0x93, 0x59, 0xAE, 0xC1, 0xFD, 0x37, + 0xF0, 0x3C, 0x06, 0xAA, 0xB0, 0x97, 0xBA, 0x76, 0x34, 0x12, 0xBD, 0x83, 0x6F, 0xDE, 0xAB, 0x3D, 0xFA, 0x2F, 0xD4, 0xFD, + 0x70, 0x88, 0xF7, 0xF7, 0x98, 0xF8, 0xE9, 0x4B, 0x36, 0xEE, 0xED, 0xEE, 0x33, 0xF1, 0x93, 0x77, 0x47, 0x4C, 0xFC, 0xCF, + 0xD7, 0x5D, 0x76, 0xFE, 0x67, 0x87, 0x39, 0x1C, 0x04, 0x2B, 0x46, 0x13, 0xB9, 0x3B, 0x10, 0x75, 0x53, 0xEC, 0xA3, 0xD8, + 0x41, 0xB1, 0xF6, 0x62, 0xD5, 0xC5, 0x7A, 0x8B, 0x95, 0x96, 0xD7, 0x68, 0x20, 0xA2, 0xAB, 0x3A, 0x32, 0xD2, 0x2F, 0x79, + 0x04, 0x89, 0xDE, 0xFE, 0x1B, 0xEF, 0x70, 0x87, 0x1E, 0x4E, 0x0C, 0x14, 0xB6, 0x4F, 0xFB, 0xB9, 0x6D, 0x30, 0x0C, 0x53, + 0x0F, 0x41, 0x04, 0xA6, 0xF2, 0xD3, 0x88, 0x56, 0xF9, 0xD1, 0xEB, 0xBF, 0x08, 0xB2, 0xFB, 0x61, 0x82, 0x7B, 0x3B, 0x03, + 0xBA, 0x95, 0x80, 0x20, 0x58, 0xC5, 0x5A, 0x3A, 0xB6, 0xEA, 0xB9, 0xB9, 0x15, 0xA2, 0x2A, 0xB4, 0xD1, 0x12, 0xB4, 0x6D, + 0x44, 0xCC, 0xC4, 0xFA, 0x04, 0x89, 0x46, 0xDB, 0xBA, 0xD3, 0xED, 0x72, 0xE2, 0x23, 0xFA, 0xE3, 0x4F, 0x9E, 0xEE, 0xF0, + 0x40, 0xE2, 0xA9, 0xE3, 0x3C, 0x68, 0xF2, 0xF4, 0x28, 0x78, 0x30, 0x4F, 0x7F, 0xBE, 0x35, 0x89, 0xAA, 0x2C, 0x4D, 0x17, + 0x9B, 0x9D, 0xD2, 0x34, 0x95, 0x32, 0x18, 0x48, 0x0D, 0x13, 0xD4, 0x80, 0x24, 0xD5, 0x40, 0xB3, 0x59, 0x49, 0x65, 0x69, + 0x98, 0xD8, 0xBE, 0xAE, 0x4C, 0x05, 0x40, 0x06, 0x89, 0x9C, 0xB1, 0x75, 0x23, 0xE7, 0x4C, 0x0A, 0xC9, 0x38, 0x33, 0x07, + 0x34, 0x8D, 0xF7, 0x9E, 0x0F, 0x68, 0x4B, 0x12, 0x7F, 0xF2, 0x85, 0xB6, 0x26, 0xCB, 0xBC, 0xF7, 0x79, 0x97, 0x07, 0x6B, + 0x42, 0x3D, 0x25, 0x2A, 0xCB, 0x12, 0x1A, 0x53, 0x9A, 0xA5, 0x52, 0x8E, 0xC0, 0x1A, 0x9A, 0x62, 0x46, 0x92, 0x66, 0x64, + 0xB9, 0x92, 0x24, 0xF2, 0x25, 0x14, 0xE5, 0x15, 0xBE, 0x27, 0x39, 0x07, 0xA2, 0xDB, 0xB2, 0x42, 0xD1, 0xF8, 0x0A, 0x2D, + 0x40, 0x73, 0x63, 0x73, 0xD1, 0xB0, 0xE4, 0xF9, 0xE6, 0xDD, 0xED, 0xD5, 0x27, 0x5A, 0xCB, 0x5D, 0x0B, 0xAD, 0x4C, 0x93, + 0x02, 0xA5, 0xE9, 0x18, 0x6D, 0x44, 0xB2, 0x7E, 0x66, 0xB0, 0xA8, 0x28, 0x8A, 0xD1, 0x97, 0x40, 0xE1, 0x44, 0x77, 0xC2, + 0x75, 0xA7, 0x6B, 0xAE, 0xEB, 0x0A, 0xF5, 0x0C, 0xAF, 0x5C, 0xAA, 0x38, 0x84, 0x20, 0x53, 0xE9, 0x71, 0xE2, 0xA5, 0x40, + 0x5C, 0x59, 0xB8, 0x85, 0x88, 0x82, 0x4C, 0x3B, 0x7A, 0xE6, 0x78, 0x51, 0xE7, 0x9B, 0x51, 0x68, 0x20, 0x69, 0x6A, 0xD8, + 0xE7, 0x58, 0x16, 0x8A, 0xD2, 0xAB, 0x48, 0xD1, 0x0D, 0x48, 0xEF, 0x49, 0x2D, 0xCE, 0x12, 0x6E, 0x97, 0x0A, 0x3A, 0x04, + 0x3B, 0x5B, 0xBA, 0x7F, 0x27, 0x26, 0x2A, 0x2A, 0x92, 0x0E, 0xC6, 0x2B, 0x0A, 0x0C, 0xDD, 0x74, 0x2C, 0x4E, 0x9C, 0xAC, + 0x48, 0x77, 0x11, 0xC1, 0x9C, 0x38, 0x55, 0x60, 0x0F, 0x8D, 0xC9, 0x1C, 0x76, 0x7C, 0x12, 0x19, 0x67, 0xB2, 0x60, 0x7C, + 0x07, 0x83, 0x80, 0x13, 0xFF, 0xFE, 0x78, 0x4B, 0x07, 0x54, 0x86, 0x31, 0x42, 0xA5, 0x5B, 0xD8, 0x5F, 0x70, 0x62, 0x6B, + 0x79, 0xF5, 0x1C, 0xB2, 0xF4, 0x41, 0x14, 0x44, 0xC1, 0x84, 0x2C, 0xD4, 0xED, 0xCF, 0x81, 0xDE, 0x16, 0x5A, 0x87, 0x4A, + 0x3C, 0x90, 0xE3, 0x30, 0xCA, 0x39, 0xA7, 0xE2, 0x36, 0x02, 0x52, 0xCF, 0x31, 0x3B, 0x1B, 0x18, 0xC8, 0xB6, 0x0A, 0x24, + 0xAE, 0xCE, 0x64, 0x4A, 0x3D, 0xFA, 0x75, 0xA8, 0x82, 0x25, 0xEA, 0x64, 0x09, 0x41, 0x37, 0x75, 0x6C, 0x8E, 0x20, 0xDC, + 0xC1, 0x0E, 0xD1, 0x11, 0xF1, 0x9F, 0x52, 0xC2, 0x08, 0xAB, 0x59, 0xD2, 0xCF, 0xA4, 0x2C, 0xA2, 0x36, 0x41, 0xDB, 0x23, + 0x29, 0x73, 0x04, 0xB6, 0xE9, 0x8B, 0x38, 0x8A, 0xB2, 0xA2, 0x41, 0xBD, 0x84, 0xD0, 0xC2, 0xAE, 0xB3, 0x09, 0xC1, 0x02, + 0xB6, 0x35, 0x5D, 0xF1, 0x7B, 0x9A, 0x7C, 0x78, 0xAF, 0xD4, 0x9A, 0x88, 0x4C, 0x0D, 0x50, 0x34, 0x1C, 0x93, 0x97, 0x47, + 0x3E, 0x9A, 0x72, 0x3B, 0x81, 0xDD, 0xF7, 0x47, 0xD2, 0x64, 0x9C, 0xA1, 0x05, 0x53, 0x2D, 0x75, 0x9E, 0x42, 0x3D, 0xFC, + 0xFC, 0x17, 0xFF, 0x01, 0xDC, 0xF1, 0x18, 0xD3 +}; +const FX_BYTE g_esES_Locale[] = { + 0x78, 0x9C, 0x9D, 0x56, 0xCF, 0x6B, 0xD4, 0x40, 0x14, 0xBE, 0x0B, 0xFE, 0x0F, 0x21, 0x58, 0x56, 0xA1, 0xDD, 0xD1, 0x63, + 0xCB, 0x36, 0x50, 0xDA, 0xDA, 0x95, 0x1A, 0x59, 0x9A, 0xAA, 0xD8, 0x8B, 0x4C, 0x92, 0xE9, 0xEE, 0xB4, 0xC9, 0xCC, 0x32, + 0x49, 0x2C, 0x9B, 0xA3, 0xE0, 0x41, 0x10, 0x0B, 0xDE, 0x8A, 0x27, 0x0F, 0x1E, 0x04, 0x8B, 0x77, 0x51, 0x3C, 0xF4, 0x3F, + 0x11, 0x6A, 0xEB, 0xC9, 0x7F, 0xC1, 0x37, 0x9B, 0x49, 0x36, 0x3F, 0x66, 0xD7, 0x60, 0x4E, 0xF3, 0xBE, 0xF7, 0x7D, 0x2F, + 0xEF, 0x7D, 0x93, 0x4C, 0xD2, 0x0B, 0xB8, 0x87, 0x03, 0x62, 0x30, 0x1C, 0x92, 0x75, 0x93, 0x44, 0xCF, 0xB7, 0x1D, 0xD3, + 0xF0, 0x49, 0xE4, 0xAD, 0x9B, 0xD7, 0x1F, 0x7F, 0x5C, 0x9D, 0x9E, 0x5F, 0xBD, 0x3E, 0xBB, 0xFE, 0x72, 0x7E, 0xBB, 0x08, + 0xFE, 0x7C, 0x7B, 0x73, 0xF9, 0xFE, 0xFB, 0xEF, 0xB3, 0x57, 0xBF, 0xDE, 0xBE, 0xBB, 0xFC, 0x7A, 0x7A, 0xC7, 0xB4, 0x7A, + 0xB2, 0x00, 0xF3, 0xB1, 0x70, 0x26, 0xA1, 0xCB, 0x83, 0x48, 0xD5, 0x1A, 0x0A, 0x32, 0xE4, 0x82, 0x62, 0x06, 0x8C, 0x90, + 0xB3, 0x78, 0xF4, 0x08, 0xE0, 0x48, 0xAD, 0x2D, 0xC2, 0x88, 0xE0, 0x3D, 0x94, 0x05, 0x37, 0x6F, 0x28, 0xF4, 0x90, 0xB8, + 0x42, 0x87, 0x87, 0x58, 0xA4, 0x4D, 0x14, 0xBB, 0x82, 0x06, 0x1A, 0xEE, 0xA4, 0x49, 0x3D, 0x4A, 0x18, 0xD5, 0xA1, 0x81, + 0x06, 0xC5, 0x43, 0x1E, 0xC5, 0x4D, 0x38, 0x22, 0xE3, 0x98, 0x92, 0x10, 0x1A, 0x6C, 0xA4, 0xB8, 0x17, 0x27, 0x3A, 0x9C, + 0xF1, 0x17, 0x73, 0x14, 0x3E, 0xF5, 0x1A, 0x19, 0x54, 0x72, 0x29, 0x27, 0x4E, 0x23, 0x03, 0xBB, 0xAE, 0x58, 0x37, 0xEF, + 0x99, 0x25, 0xF3, 0x74, 0xD6, 0xE9, 0x6C, 0xD3, 0x99, 0xA6, 0xB3, 0x4C, 0xE7, 0x98, 0xCE, 0x2F, 0x9D, 0x5B, 0x3A, 0xAB, + 0x74, 0x1E, 0xE9, 0xFC, 0xD1, 0x39, 0x33, 0xDF, 0x13, 0x1F, 0x4F, 0xD4, 0x53, 0x04, 0x2B, 0xCB, 0xE7, 0x21, 0x65, 0xF2, + 0xF6, 0x32, 0xC8, 0xB2, 0x56, 0x90, 0x30, 0x12, 0x55, 0x10, 0x30, 0x21, 0xAE, 0x43, 0xF4, 0xE2, 0x93, 0xF0, 0x78, 0x50, + 0x83, 0x8F, 0x12, 0xF2, 0xA2, 0x06, 0xC1, 0xFE, 0x89, 0x7A, 0xC1, 0xE8, 0xE2, 0x83, 0x8B, 0xFD, 0xD9, 0x6D, 0x51, 0xD1, + 0x55, 0xA9, 0xC3, 0xD2, 0x9E, 0xA9, 0x56, 0xEB, 0x6D, 0xD6, 0x9B, 0x6C, 0x74, 0x58, 0xEF, 0xAD, 0xDE, 0x58, 0xA3, 0x29, + 0x7D, 0x47, 0x21, 0x11, 0xD4, 0x87, 0x87, 0x2D, 0x7F, 0xFD, 0x54, 0x68, 0x6D, 0xD8, 0xE0, 0x6E, 0x1E, 0x94, 0x78, 0xD6, + 0xA0, 0x96, 0x40, 0xD5, 0x0A, 0x80, 0x10, 0x81, 0x55, 0x35, 0x58, 0x59, 0xB8, 0xBB, 0xD9, 0xED, 0x21, 0xB9, 0xCA, 0x52, + 0x96, 0x5F, 0x06, 0x50, 0x41, 0x96, 0x41, 0xED, 0xA8, 0xC8, 0xBA, 0x8F, 0xC9, 0x00, 0xC7, 0x31, 0x18, 0x3D, 0xDD, 0xD7, + 0x22, 0x52, 0xE7, 0xC8, 0x61, 0x12, 0x04, 0xA6, 0xB5, 0x0D, 0x97, 0xB1, 0xD5, 0x81, 0xA3, 0xC9, 0xE8, 0xD8, 0x70, 0x65, + 0xAB, 0x67, 0x70, 0xC9, 0x69, 0x0B, 0x4D, 0xAD, 0xA0, 0x2A, 0x11, 0x70, 0x36, 0x34, 0xAD, 0xFF, 0x55, 0x87, 0xC4, 0x07, + 0xF1, 0x16, 0xB2, 0x6D, 0xD4, 0x52, 0x11, 0x8D, 0xB8, 0x88, 0x67, 0x9A, 0x86, 0x02, 0x55, 0x66, 0x06, 0x20, 0xA6, 0x61, + 0xC9, 0x83, 0x52, 0x54, 0xF1, 0xA0, 0xDF, 0xEF, 0xF4, 0xA1, 0xFD, 0x0E, 0x5C, 0x0E, 0x9C, 0xD2, 0x07, 0x3D, 0x54, 0x62, + 0xD6, 0xCA, 0x54, 0x26, 0xEF, 0xF7, 0xD7, 0x6C, 0x7B, 0xCD, 0x71, 0x5A, 0x49, 0xA6, 0xE3, 0x2A, 0x41, 0x0B, 0xBA, 0x9A, + 0x55, 0x0A, 0x1A, 0x6C, 0x54, 0x99, 0x4B, 0x59, 0xB5, 0x0F, 0x58, 0xBE, 0xFD, 0x3B, 0x89, 0x1D, 0x1F, 0x8F, 0xC2, 0xC8, + 0xD9, 0xDE, 0xBA, 0x7F, 0xF2, 0x14, 0x8F, 0x76, 0xD3, 0x83, 0xCC, 0x9C, 0x32, 0x09, 0x74, 0x2C, 0x09, 0x5D, 0x22, 0x66, + 0x0E, 0x55, 0x62, 0xD5, 0x08, 0x60, 0xF0, 0x9C, 0x7A, 0xA6, 0x95, 0x2E, 0xA7, 0xE9, 0x6A, 0x37, 0x4D, 0xD3, 0x1E, 0xAA, + 0xF0, 0x1A, 0x85, 0x94, 0xD0, 0x4B, 0x84, 0x20, 0xCC, 0x9B, 0xE4, 0xCA, 0xD5, 0x55, 0xE3, 0x56, 0x4B, 0xE9, 0x98, 0x08, + 0x8F, 0xB0, 0x58, 0x29, 0x97, 0x34, 0x2A, 0x54, 0x6B, 0xBD, 0x28, 0x94, 0x4F, 0x57, 0x09, 0x55, 0x59, 0x9F, 0x78, 0x34, + 0xC4, 0xB0, 0xE3, 0xCB, 0xB9, 0x3E, 0x4B, 0xD7, 0xD5, 0xC5, 0x97, 0x96, 0x27, 0x63, 0x2A, 0x37, 0xBA, 0xDB, 0x8A, 0x5F, + 0x74, 0xBD, 0xD4, 0x8A, 0x0E, 0x87, 0x6C, 0x12, 0x99, 0xD6, 0x4A, 0x2B, 0x72, 0x0A, 0x9F, 0x6F, 0xD3, 0xBA, 0xDB, 0xE4, + 0xA2, 0xEA, 0xD8, 0x80, 0xE4, 0xBE, 0x17, 0x4E, 0x54, 0x81, 0xFC, 0xF9, 0x9A, 0x06, 0xA6, 0xF5, 0xF3, 0xE5, 0x67, 0x38, + 0x3E, 0x2A, 0x8C, 0x66, 0x11, 0xA5, 0xA1, 0x11, 0x97, 0x0B, 0x38, 0x35, 0x1E, 0xEF, 0xB5, 0x16, 0x95, 0x4D, 0x6F, 0x4A, + 0x50, 0xBD, 0x5B, 0xF9, 0x32, 0x4C, 0xC6, 0xE4, 0x10, 0x7B, 0xF2, 0x1C, 0xCC, 0x97, 0xAA, 0x96, 0x3D, 0x81, 0x1F, 0x1F, + 0xDF, 0x18, 0x80, 0x17, 0xA8, 0xCC, 0xCC, 0xD3, 0x14, 0xFE, 0x46, 0xD8, 0xDC, 0xF4, 0x26, 0x4F, 0x04, 0x7C, 0x77, 0x0C, + 0x27, 0xF6, 0xB5, 0xF9, 0x0D, 0x9F, 0xBB, 0xC4, 0x18, 0xD0, 0x7F, 0x10, 0xFA, 0xF2, 0x67, 0xEA, 0x64, 0x01, 0x61, 0x43, + 0x60, 0x17, 0x5E, 0x98, 0xF9, 0x84, 0xFD, 0x11, 0xA6, 0xDA, 0xF4, 0x2E, 0x4F, 0x93, 0x63, 0x6C, 0xEC, 0xF0, 0x78, 0x44, + 0x3D, 0x39, 0xC7, 0xCA, 0x93, 0x07, 0x86, 0xBD, 0x88, 0x0A, 0x23, 0x7B, 0x23, 0x9E, 0x53, 0xF7, 0x16, 0xDC, 0x14, 0x98, + 0x43, 0x39, 0x99, 0xF1, 0x70, 0x01, 0xC9, 0xE1, 0x2D, 0x48, 0xF6, 0x24, 0x61, 0xC3, 0x23, 0x3E, 0xE5, 0xA9, 0xE6, 0xD0, + 0x6C, 0xCF, 0x64, 0x94, 0xFD, 0xFC, 0xC2, 0xF2, 0x2F, 0x7C, 0xDC, 0xCC, 0x2F, +}; +const FX_BYTE g_esLA_Locale[] = { + 0x78, 0x9C, 0x9D, 0x56, 0xCD, 0x4E, 0xDC, 0x30, 0x10, 0x3E, 0x53, 0xA9, 0xEF, 0x60, 0x45, 0x45, 0x80, 0x04, 0x9B, 0xF6, + 0xB8, 0x28, 0x44, 0x5A, 0x01, 0xA5, 0x15, 0x0D, 0x5A, 0x75, 0x51, 0x4B, 0xB9, 0x54, 0x4E, 0x62, 0x36, 0x86, 0xC4, 0x5E, + 0x39, 0x09, 0x68, 0xA3, 0xBE, 0x40, 0x4F, 0x3D, 0xF4, 0xD4, 0x63, 0x2B, 0x21, 0xB5, 0x07, 0xD4, 0x47, 0xE8, 0x81, 0x67, + 0x41, 0xF0, 0x18, 0x9D, 0xFC, 0x6E, 0x12, 0x3B, 0xE9, 0xD2, 0x9C, 0x3C, 0xDF, 0x7C, 0x9F, 0x77, 0xE6, 0xB3, 0x33, 0x1B, + 0xC3, 0xE7, 0x0E, 0xF6, 0x09, 0x62, 0x38, 0x20, 0x3B, 0x1A, 0x09, 0x3F, 0x5A, 0x27, 0x1A, 0x72, 0x49, 0xE8, 0xEC, 0x68, + 0x0F, 0xD7, 0x7F, 0xEE, 0xBF, 0xDC, 0xDC, 0x7F, 0xFE, 0xF6, 0xF0, 0xFB, 0x66, 0xFD, 0xEE, 0xC7, 0x4F, 0x88, 0xEF, 0xBE, + 0x5E, 0x6F, 0x68, 0xE6, 0xD3, 0x27, 0x08, 0x19, 0xA9, 0x8A, 0xB9, 0x58, 0x4C, 0xE6, 0x81, 0xCD, 0xFD, 0xB0, 0xD8, 0x60, + 0x2A, 0xC8, 0x94, 0x0B, 0x8A, 0x59, 0xCA, 0x5A, 0x41, 0x46, 0xC0, 0x59, 0xE4, 0x1D, 0x41, 0x2A, 0x4C, 0xE3, 0x95, 0x3C, + 0x36, 0x09, 0x23, 0x82, 0x1B, 0x7A, 0x1E, 0xD4, 0xF0, 0x33, 0x62, 0x0B, 0x75, 0x26, 0xC0, 0x22, 0x51, 0xE1, 0xD8, 0x16, + 0xD4, 0x57, 0xF2, 0xE7, 0x2A, 0xFA, 0x79, 0xCC, 0xA8, 0x1A, 0xF7, 0x95, 0x38, 0x9E, 0xF2, 0x30, 0x52, 0x25, 0x42, 0x32, + 0x8B, 0x28, 0x09, 0xA0, 0x5C, 0x45, 0x92, 0x3B, 0x51, 0xAC, 0xCE, 0x30, 0x7E, 0xD9, 0xA9, 0x72, 0xA9, 0x23, 0xE5, 0x50, + 0xB1, 0xAE, 0x1C, 0xAC, 0x3B, 0x8A, 0xB0, 0x6D, 0x8B, 0x1D, 0xED, 0x85, 0xD6, 0xB2, 0x56, 0x6D, 0xAC, 0xDA, 0x54, 0xB5, + 0xA5, 0x6A, 0x43, 0xD5, 0x7E, 0xAA, 0xDD, 0x54, 0x7B, 0xA9, 0x36, 0x52, 0xED, 0xA0, 0xDA, 0x3D, 0xB5, 0x6F, 0xFD, 0x8E, + 0xB9, 0x78, 0x5E, 0xBB, 0x81, 0x10, 0x99, 0x2E, 0x0F, 0x28, 0x4B, 0xCB, 0x49, 0x83, 0x0A, 0xF5, 0x63, 0x46, 0xC2, 0x16, + 0x06, 0x16, 0x45, 0x32, 0x48, 0x6F, 0x7F, 0x09, 0x87, 0xFB, 0x52, 0xE2, 0x3C, 0x26, 0x97, 0x12, 0x08, 0x27, 0x2E, 0xE4, + 0x8D, 0xC3, 0xDB, 0xEF, 0x36, 0x76, 0x17, 0x25, 0xA0, 0x6C, 0xA5, 0xA8, 0xBA, 0x75, 0xCA, 0x45, 0xF9, 0x72, 0xE9, 0x72, + 0xE1, 0x8A, 0xAA, 0xE5, 0x7A, 0xE5, 0x62, 0x15, 0x85, 0x76, 0x57, 0x19, 0x10, 0x41, 0x5D, 0xB8, 0xB6, 0xF5, 0x57, 0xBC, + 0x80, 0xCC, 0x91, 0x05, 0x67, 0x51, 0x06, 0xCD, 0xD4, 0xB8, 0x95, 0x42, 0x8B, 0xB0, 0xB6, 0x39, 0x11, 0xB8, 0xB6, 0x2F, + 0x44, 0x26, 0x1E, 0xEC, 0x0E, 0x0C, 0x3D, 0x5D, 0x55, 0x90, 0x5B, 0x87, 0x50, 0xB6, 0x2A, 0x45, 0x30, 0xA5, 0xF4, 0xD6, + 0x98, 0xCA, 0x51, 0x17, 0x47, 0x64, 0x8C, 0xA3, 0x08, 0x0E, 0xA6, 0x72, 0xBB, 0x42, 0x8A, 0x49, 0x76, 0x16, 0xFB, 0xBE, + 0x66, 0xEE, 0xC3, 0x83, 0xF6, 0xD6, 0x60, 0x22, 0xA2, 0x35, 0x0B, 0x9E, 0x7C, 0xF5, 0x01, 0x9E, 0xD4, 0x89, 0x4A, 0xD3, + 0xB5, 0x89, 0xCF, 0xD9, 0x54, 0x33, 0xFF, 0x5F, 0x1F, 0x10, 0x17, 0xE4, 0x7B, 0xBA, 0x65, 0xE9, 0x4B, 0x6B, 0x42, 0x8F, + 0x8B, 0x68, 0xA1, 0x6A, 0x6B, 0x10, 0x6A, 0x20, 0x85, 0x23, 0x11, 0x0D, 0x5A, 0x8E, 0xD4, 0x90, 0x86, 0x23, 0x9E, 0xB7, + 0x6D, 0x59, 0xDB, 0x93, 0x09, 0x1A, 0xA1, 0x53, 0x43, 0xAF, 0xB1, 0xBA, 0x64, 0xB9, 0x07, 0x8F, 0x96, 0x65, 0xAD, 0x2F, + 0x54, 0x4B, 0x69, 0x8A, 0xD6, 0x33, 0x95, 0x2C, 0x49, 0x3B, 0x6F, 0xF5, 0x59, 0xDC, 0x85, 0x63, 0x40, 0xCB, 0x0B, 0x72, + 0x10, 0x5B, 0xD1, 0x85, 0x17, 0x84, 0x93, 0xFD, 0xBD, 0x97, 0x57, 0xEF, 0xB1, 0x77, 0x98, 0x9C, 0xE6, 0x86, 0xD5, 0x49, + 0x99, 0x92, 0xC5, 0x81, 0x4D, 0x44, 0xD3, 0xB5, 0x06, 0x56, 0x54, 0x05, 0x18, 0xDC, 0x6D, 0x47, 0x33, 0x93, 0xCD, 0x24, + 0x19, 0x0E, 0x92, 0x24, 0x31, 0xF4, 0x06, 0xAF, 0x5B, 0xEA, 0xC4, 0x42, 0x10, 0xE6, 0xCC, 0x35, 0xF3, 0x59, 0x2E, 0x1E, + 0x0E, 0x3F, 0xAD, 0x57, 0xCB, 0x8D, 0xA5, 0xF7, 0x99, 0x11, 0xE1, 0x10, 0x16, 0x15, 0x25, 0xAC, 0xCA, 0xBA, 0xD4, 0x1B, + 0xA9, 0x9F, 0xAA, 0xC7, 0x45, 0xDB, 0x2B, 0x4D, 0xA8, 0xD8, 0xDE, 0x25, 0x0E, 0x0D, 0x30, 0x5C, 0x8E, 0x41, 0xB9, 0x4B, + 0x9E, 0xEE, 0x14, 0x4C, 0x05, 0x8F, 0x67, 0x34, 0xBD, 0x17, 0x9B, 0x4B, 0x2A, 0xAA, 0x0E, 0x56, 0x97, 0x14, 0xC0, 0x84, + 0x8F, 0x43, 0xCD, 0xDC, 0x5A, 0x92, 0x9E, 0xC0, 0x77, 0x87, 0x66, 0x3E, 0x97, 0xD8, 0x0B, 0x63, 0x1A, 0x67, 0x5F, 0x1E, + 0x4C, 0xC3, 0x99, 0x26, 0x58, 0xDE, 0xC9, 0x2C, 0x80, 0x03, 0x84, 0x59, 0xD4, 0xC8, 0xF7, 0x68, 0x68, 0xC8, 0xD3, 0x85, + 0x66, 0x5A, 0x27, 0x47, 0x8F, 0x90, 0xD5, 0x8F, 0x41, 0x12, 0x65, 0xC3, 0x50, 0xAA, 0x3A, 0x7D, 0xF5, 0xE7, 0x33, 0x72, + 0x86, 0x9D, 0x72, 0xE8, 0x96, 0x61, 0xB1, 0xA7, 0x35, 0x87, 0xAF, 0x39, 0x17, 0x8D, 0xC1, 0x1D, 0x5D, 0x4D, 0xA0, 0xF0, + 0x49, 0xC5, 0x7A, 0x08, 0xBB, 0x3C, 0x16, 0xF0, 0x17, 0x88, 0x26, 0x91, 0xDB, 0xC1, 0x18, 0xB9, 0xDC, 0x26, 0x68, 0x4C, + 0xFF, 0x49, 0x79, 0x95, 0x7E, 0x1F, 0x5E, 0xF5, 0x52, 0x46, 0x02, 0xDB, 0xF0, 0xAE, 0xF5, 0x51, 0x8E, 0x3D, 0x4C, 0x3B, + 0x08, 0x87, 0x3C, 0x89, 0x2F, 0x30, 0x3A, 0xE0, 0x91, 0x47, 0x9D, 0xB4, 0xA7, 0xAD, 0x77, 0xAF, 0x91, 0xD5, 0x4F, 0x06, + 0x03, 0x1C, 0x8F, 0x97, 0xE4, 0xB7, 0xBD, 0x3F, 0x0D, 0xDC, 0x69, 0xDA, 0x25, 0x7A, 0xD3, 0x4B, 0x9B, 0xF0, 0xA5, 0x68, + 0xD6, 0x3C, 0x66, 0xD3, 0x73, 0x9E, 0x31, 0xF3, 0x22, 0xB3, 0x11, 0x57, 0x3B, 0x4F, 0x43, 0xCF, 0x3F, 0xEF, 0xCD, 0xBF, + 0xC4, 0xB5, 0xD4, 0x04 +}; +const FX_BYTE g_deDE_Loacale[] = { + 0x78, 0x9C, 0x95, 0x56, 0x4D, 0x6F, 0xD4, 0x30, 0x10, 0xBD, 0x23, 0xF1, 0x1F, 0xAC, 0x88, 0xAA, 0x20, 0xB5, 0x1B, 0x38, + 0xB6, 0xDA, 0x46, 0x5A, 0x75, 0xFB, 0x41, 0x4B, 0xCA, 0xAA, 0x69, 0x41, 0xF4, 0x82, 0xBC, 0x89, 0xBB, 0x71, 0x9B, 0xD8, + 0x2B, 0xC7, 0x69, 0xB5, 0x39, 0xF2, 0x37, 0xB8, 0x72, 0x04, 0x71, 0xE4, 0x04, 0x17, 0xFE, 0x09, 0x52, 0x25, 0x7E, 0x06, + 0x93, 0x8D, 0x93, 0x26, 0xB6, 0xBB, 0x0D, 0xB9, 0xAC, 0xE7, 0xCD, 0x7B, 0xB3, 0x33, 0xCF, 0x89, 0x93, 0x61, 0xC2, 0x43, + 0x9C, 0x10, 0xC4, 0x70, 0x4A, 0x76, 0x9C, 0x88, 0x7C, 0x1C, 0xEF, 0x39, 0x28, 0x22, 0x59, 0xB8, 0xE3, 0xDC, 0xFD, 0xFA, + 0xF1, 0xF7, 0xFB, 0xB7, 0xE7, 0xF0, 0x73, 0xF7, 0xF9, 0xE7, 0x0B, 0xC7, 0x1B, 0x96, 0x44, 0x16, 0x61, 0x11, 0x2C, 0xD2, + 0x29, 0x4F, 0x32, 0xA5, 0x99, 0x09, 0x32, 0xE3, 0x82, 0x62, 0x06, 0x8C, 0x94, 0x33, 0x19, 0x9F, 0x00, 0x9C, 0xA9, 0xB5, + 0x77, 0x84, 0x59, 0x8E, 0xC5, 0xD0, 0xAD, 0xA2, 0xA7, 0x4F, 0x14, 0xBC, 0x4F, 0xA6, 0xC2, 0x86, 0xFB, 0xBF, 0xBF, 0x88, + 0xC2, 0x40, 0x47, 0x73, 0x41, 0x13, 0x93, 0x8B, 0xA9, 0x81, 0x1D, 0xE5, 0xCC, 0x06, 0x26, 0x26, 0x38, 0xCA, 0x67, 0x79, + 0x26, 0x0D, 0x38, 0x20, 0x73, 0x49, 0xD2, 0x29, 0x31, 0x5B, 0x7B, 0x7B, 0x2D, 0xB9, 0x0D, 0x3F, 0xE1, 0x37, 0x76, 0xC1, + 0x98, 0x14, 0x7A, 0xC2, 0x6D, 0x19, 0x54, 0xF3, 0x96, 0x11, 0xC2, 0xD3, 0xA9, 0xD8, 0x71, 0x5E, 0x39, 0x2D, 0xDF, 0x6C, + 0xA6, 0x99, 0x26, 0xD8, 0xED, 0xEA, 0x6B, 0x96, 0xCD, 0x2B, 0x9B, 0x55, 0x36, 0x9F, 0x6C, 0x0E, 0xD9, 0xDC, 0xB1, 0x19, + 0xF3, 0xB0, 0x27, 0x11, 0x5E, 0xA8, 0x1B, 0x08, 0x56, 0x5E, 0xC0, 0x19, 0x93, 0x18, 0xFE, 0xBE, 0x0C, 0xAA, 0xAC, 0xE7, + 0x73, 0x03, 0x1A, 0x53, 0xC2, 0x32, 0x83, 0x47, 0xA5, 0xBC, 0xE5, 0x61, 0xDC, 0x65, 0x42, 0x41, 0x22, 0x0C, 0xEE, 0xBE, + 0x20, 0x54, 0xC7, 0x02, 0x9C, 0x76, 0x78, 0x6E, 0xD3, 0x5A, 0xAB, 0xCD, 0xD6, 0xC6, 0x55, 0xFD, 0x6A, 0xAD, 0x6A, 0x6D, + 0x6A, 0x0D, 0x6A, 0xAD, 0x69, 0x2D, 0x69, 0xDD, 0xD8, 0x1B, 0x49, 0x89, 0xA0, 0x11, 0x25, 0x69, 0xFD, 0xD4, 0xA9, 0xD0, + 0x1B, 0xF9, 0xE0, 0x6C, 0x1D, 0xB4, 0x78, 0xDE, 0x44, 0x4B, 0xB8, 0xDD, 0x0A, 0x80, 0x10, 0x81, 0x55, 0x35, 0x58, 0x79, + 0x37, 0x03, 0xB4, 0x1B, 0x8B, 0xC1, 0xD0, 0x2D, 0x83, 0x2A, 0xEB, 0x31, 0x0D, 0x73, 0x1B, 0x49, 0x19, 0x68, 0xE7, 0x44, + 0x35, 0x81, 0x24, 0x13, 0x2C, 0x25, 0x11, 0x6C, 0xB9, 0xB3, 0x4D, 0xA4, 0x0E, 0x91, 0xCB, 0x3C, 0x49, 0x1C, 0x6F, 0x0F, + 0xAE, 0x0D, 0x34, 0x1E, 0x20, 0x1F, 0x2E, 0xF4, 0x01, 0xAE, 0x72, 0xD6, 0x86, 0xAB, 0x15, 0x52, 0xD2, 0x84, 0xB3, 0x99, + 0xE3, 0xFD, 0xA7, 0x28, 0x25, 0x11, 0x68, 0xC6, 0x03, 0xDF, 0x1F, 0xF4, 0x54, 0x64, 0x31, 0x17, 0xF2, 0x5E, 0x63, 0x28, + 0xDC, 0xCE, 0x88, 0x00, 0x48, 0x9A, 0xB6, 0x46, 0x6E, 0x45, 0x9D, 0x91, 0x0F, 0xB7, 0x7D, 0x7F, 0x1D, 0x9D, 0xC7, 0x02, + 0xAD, 0x5F, 0x0C, 0xDD, 0x16, 0x4B, 0x2B, 0xD1, 0x19, 0xF6, 0xB0, 0x54, 0x6D, 0x07, 0x01, 0xEA, 0x23, 0x59, 0x8E, 0x5A, + 0x2B, 0x7A, 0xF0, 0xD5, 0xA0, 0x4B, 0x85, 0x41, 0x77, 0x3B, 0x53, 0x29, 0xA3, 0xCE, 0x00, 0xAB, 0xF7, 0xFA, 0xE0, 0xCA, + 0x97, 0xD7, 0x87, 0x69, 0x16, 0xEC, 0x8D, 0xF7, 0x6F, 0xDF, 0xE3, 0xF8, 0xB8, 0xB8, 0xA8, 0xAC, 0x69, 0x93, 0x40, 0xC7, + 0xF2, 0xF2, 0x68, 0xBC, 0xF7, 0xA7, 0x13, 0xAB, 0x4E, 0x00, 0x83, 0x5B, 0x33, 0x74, 0xBC, 0x62, 0xA3, 0x28, 0xB6, 0x06, + 0x45, 0x01, 0xC7, 0x46, 0x87, 0x67, 0x14, 0x52, 0xC2, 0x30, 0x17, 0x82, 0xB0, 0x70, 0x51, 0x2B, 0xB7, 0xB6, 0xD0, 0xB3, + 0x9E, 0xD2, 0x39, 0x11, 0x21, 0x61, 0x52, 0x29, 0xD7, 0x2C, 0x2A, 0x57, 0x6B, 0xBD, 0x29, 0x54, 0x4F, 0xD7, 0x09, 0x9B, + 0x17, 0x6B, 0x48, 0x53, 0x0C, 0xFB, 0xBD, 0x51, 0xEB, 0xAB, 0xB4, 0xAE, 0x6E, 0xDE, 0xA9, 0x3C, 0x9F, 0xD3, 0x72, 0xAB, + 0x07, 0xBD, 0xF8, 0x4D, 0xD7, 0x6B, 0xBD, 0xE8, 0x29, 0x65, 0x79, 0xE6, 0x78, 0x9B, 0xBD, 0xC8, 0x05, 0x11, 0xDC, 0xF1, + 0x5E, 0x9A, 0x5C, 0xB7, 0x3B, 0x36, 0x20, 0xB5, 0xEF, 0x8D, 0x13, 0x5D, 0xA0, 0xBE, 0xC1, 0x96, 0x81, 0xE3, 0xFD, 0xF9, + 0xF4, 0x15, 0xCE, 0x8A, 0x0E, 0xC3, 0x2C, 0xA2, 0x34, 0x34, 0xE3, 0xE5, 0x02, 0x8E, 0x88, 0xF3, 0xD3, 0xDE, 0xA2, 0xB6, + 0xE9, 0xA6, 0xC4, 0xD5, 0xBB, 0x2D, 0x9F, 0x86, 0xC5, 0x9C, 0x5C, 0xE2, 0xB0, 0x3C, 0xFA, 0xEA, 0xA5, 0xAA, 0xE5, 0x2F, + 0xE0, 0x13, 0x27, 0x42, 0x13, 0xF0, 0xC2, 0x6D, 0x33, 0xEB, 0x34, 0x65, 0x94, 0xB3, 0x07, 0xD3, 0xBB, 0x3C, 0x17, 0x94, + 0x08, 0x14, 0xC8, 0xC8, 0x9A, 0x1F, 0x45, 0xF0, 0x69, 0x81, 0x26, 0xF4, 0x11, 0xC2, 0x21, 0x7C, 0x35, 0x91, 0xDB, 0x15, + 0x84, 0x91, 0xC0, 0x53, 0x78, 0x60, 0x1E, 0x26, 0x9C, 0xC5, 0x98, 0x5A, 0xD3, 0xC7, 0xBC, 0xC8, 0xAF, 0x31, 0x3A, 0xE0, + 0x32, 0xA6, 0x61, 0x39, 0xC7, 0xE6, 0xBB, 0xD7, 0xC8, 0x5F, 0x45, 0x85, 0x91, 0xC3, 0x98, 0xD7, 0xD4, 0xD3, 0x15, 0x7F, + 0x0A, 0xCC, 0x59, 0x39, 0x19, 0x7A, 0xB3, 0x82, 0x04, 0x6F, 0xFA, 0xC7, 0x49, 0xFE, 0x22, 0x67, 0xB3, 0x2B, 0xBE, 0xE4, + 0xA9, 0xE6, 0xDC, 0xFB, 0x3D, 0x2B, 0xA3, 0xEA, 0x73, 0x16, 0x96, 0xFF, 0x00, 0x29, 0x27, 0xAF, 0x17, +}; +const FX_BYTE g_frFR_Locale[] = { + 0x78, 0x9C, 0x95, 0x56, 0x4D, 0x6F, 0xD3, 0x40, 0x10, 0xBD, 0x23, 0xF1, 0x1F, 0x56, 0x16, 0x55, 0x41, 0x6A, 0xBD, 0x70, + 0x4C, 0x95, 0x5A, 0xAA, 0xFA, 0x15, 0x28, 0x46, 0x51, 0x53, 0x40, 0xF4, 0x82, 0x36, 0xF6, 0x36, 0xDE, 0xD4, 0xDE, 0x8D, + 0xD6, 0x76, 0x4A, 0x7C, 0xE4, 0x3F, 0x70, 0xE2, 0xC2, 0xB5, 0x12, 0x88, 0x03, 0x47, 0xC4, 0x85, 0xFE, 0x13, 0x24, 0x10, + 0x3F, 0x83, 0x71, 0xBC, 0x76, 0xED, 0x5D, 0x27, 0xB8, 0xBE, 0x64, 0xE7, 0xCD, 0x7B, 0xE3, 0x99, 0xB7, 0xF6, 0xC6, 0xFD, + 0x50, 0x78, 0x24, 0xA4, 0x88, 0x93, 0x88, 0xEE, 0x5A, 0x17, 0xF2, 0xED, 0xD1, 0xA9, 0x85, 0x7C, 0x1A, 0x7B, 0xBB, 0xD6, + 0x9F, 0x6F, 0x1F, 0xFE, 0x7E, 0xFD, 0xF2, 0x10, 0x7E, 0x7E, 0x7F, 0xFC, 0xF1, 0xC8, 0x72, 0xFA, 0x39, 0x91, 0xFB, 0x44, + 0x8E, 0x16, 0xD1, 0x58, 0x84, 0xB1, 0xD2, 0x4C, 0x24, 0x9D, 0x08, 0xC9, 0x08, 0x07, 0x46, 0x24, 0x78, 0x12, 0xBC, 0x00, + 0x38, 0x56, 0x6B, 0x67, 0x4A, 0xF8, 0x9C, 0x51, 0xD9, 0xC7, 0x45, 0x78, 0xFF, 0x9E, 0xC2, 0x2F, 0x6E, 0xAE, 0xE7, 0xB2, + 0x2D, 0x11, 0x11, 0x19, 0x1B, 0x20, 0x01, 0x6E, 0xD8, 0x42, 0x65, 0x06, 0x36, 0x4D, 0x19, 0x6F, 0x03, 0xC3, 0x90, 0x26, + 0x66, 0x59, 0x71, 0xF3, 0xDD, 0x44, 0x63, 0x3A, 0x4B, 0x68, 0x34, 0x96, 0xD4, 0xC8, 0x08, 0x2F, 0x11, 0x6D, 0x38, 0x17, + 0xF3, 0x76, 0x81, 0x7F, 0x73, 0xED, 0xE9, 0x19, 0x5C, 0x33, 0xA9, 0x24, 0x2E, 0x23, 0x44, 0xC6, 0x63, 0xB9, 0x6B, 0x3D, + 0xB1, 0xEA, 0xDE, 0xD9, 0xED, 0xCE, 0x99, 0xF0, 0x2A, 0xDF, 0xDA, 0x98, 0x77, 0xB0, 0xCD, 0x94, 0xAF, 0x36, 0xCD, 0xE4, + 0x82, 0x61, 0x26, 0x08, 0x6E, 0x99, 0x60, 0xEE, 0x94, 0xBD, 0xDA, 0x25, 0x9F, 0x2C, 0xD4, 0x63, 0x05, 0x2B, 0xC7, 0x67, + 0x11, 0xE1, 0x5E, 0x00, 0xAE, 0xE6, 0x51, 0x91, 0x76, 0xC2, 0x94, 0xFB, 0xAC, 0x81, 0x80, 0x25, 0x3A, 0x42, 0xA5, 0x27, + 0xA9, 0x06, 0x4E, 0x69, 0xAA, 0x21, 0x73, 0x78, 0xCC, 0x0D, 0x5A, 0x0C, 0xF7, 0xAF, 0x41, 0xB8, 0x6A, 0xA9, 0xD6, 0x5E, + 0x6D, 0x0B, 0x55, 0x9F, 0xB6, 0xDE, 0xA3, 0xAD, 0xB7, 0x68, 0xEB, 0x1D, 0xDA, 0x7A, 0x77, 0xB6, 0xDE, 0x9C, 0xAD, 0x37, + 0x66, 0xB7, 0xB7, 0x05, 0xC5, 0x98, 0xCF, 0x68, 0x54, 0xBE, 0x91, 0x2A, 0x74, 0xF6, 0x5C, 0xF0, 0xB7, 0x0C, 0x6A, 0x3C, + 0x67, 0xA8, 0x25, 0x70, 0xB3, 0x02, 0x20, 0x54, 0x12, 0x55, 0x0D, 0x56, 0xF0, 0x7C, 0xD9, 0xE8, 0x99, 0xBD, 0xBD, 0x0F, + 0xF7, 0xCF, 0xC3, 0x22, 0xEF, 0x90, 0x99, 0x8E, 0xE2, 0x4A, 0x96, 0x07, 0xDA, 0x39, 0x52, 0xCC, 0x91, 0xD0, 0x21, 0x49, + 0x12, 0x2A, 0xF9, 0x72, 0x8F, 0xAB, 0xA8, 0x3C, 0x98, 0xD2, 0x30, 0xB4, 0x9C, 0x43, 0xB8, 0xD0, 0x01, 0x72, 0xE1, 0x42, + 0x6F, 0xE0, 0xCA, 0xA7, 0xAD, 0x98, 0x5A, 0x19, 0x25, 0x0C, 0x05, 0x9F, 0x58, 0xCE, 0xDD, 0x34, 0xB0, 0xCF, 0x4A, 0x82, + 0x3A, 0xF1, 0xE3, 0x40, 0xC8, 0x04, 0x14, 0x07, 0xD8, 0x75, 0x71, 0x8B, 0x02, 0x37, 0xA6, 0x03, 0x20, 0x61, 0x51, 0x6D, + 0xDA, 0x5A, 0xD4, 0x98, 0x76, 0x30, 0xD8, 0x44, 0x01, 0xDA, 0x84, 0x2E, 0xCE, 0xFB, 0xB8, 0x46, 0xD2, 0x2A, 0x34, 0x06, + 0x1D, 0x0C, 0x76, 0x5C, 0x77, 0x67, 0x34, 0xEA, 0x24, 0x59, 0xCE, 0x59, 0x2A, 0x3A, 0xF0, 0xD5, 0x9C, 0x4B, 0x85, 0x41, + 0xC7, 0x8D, 0xA1, 0x94, 0x4F, 0x67, 0x80, 0x95, 0xBB, 0x7C, 0x4C, 0xDC, 0xE9, 0xE5, 0x20, 0x8A, 0x47, 0x87, 0x07, 0x47, + 0x57, 0xAF, 0xDF, 0x05, 0x27, 0xD9, 0x79, 0xE1, 0x4C, 0x9D, 0x04, 0x3A, 0x9E, 0x46, 0x63, 0x2A, 0x6F, 0xED, 0x69, 0xC4, + 0xAA, 0x13, 0xC0, 0xE0, 0xC1, 0xF4, 0x2C, 0x27, 0xDB, 0xCA, 0xB2, 0x9E, 0x9D, 0x65, 0x59, 0x1F, 0x37, 0x78, 0x46, 0x21, + 0x25, 0xF4, 0x52, 0x29, 0x29, 0xF7, 0x16, 0xA5, 0xB2, 0xD7, 0x43, 0x0F, 0x3A, 0x4A, 0x67, 0x70, 0x76, 0x50, 0x9E, 0x28, + 0xE5, 0x46, 0x8B, 0x0A, 0x6B, 0xAD, 0x57, 0x85, 0xCA, 0xE9, 0x1A, 0xA1, 0x2A, 0xEB, 0x53, 0x0F, 0x4E, 0x33, 0xD8, 0xEE, + 0xAD, 0x52, 0x5F, 0xA4, 0x75, 0x75, 0xF5, 0x6F, 0x2B, 0xD2, 0x19, 0xCB, 0xB7, 0xFA, 0xE7, 0xA7, 0x4E, 0x82, 0xAA, 0xED, + 0x8D, 0x4E, 0xF4, 0x88, 0xF1, 0x34, 0xB6, 0x9C, 0xED, 0x4E, 0xE4, 0x8C, 0x4A, 0x61, 0x39, 0x8F, 0x4D, 0x2E, 0x6E, 0xCE, + 0x0D, 0x48, 0x69, 0x7C, 0x65, 0x45, 0x13, 0x28, 0x9F, 0xB0, 0x65, 0x60, 0x39, 0xBF, 0xDE, 0x7F, 0x86, 0x63, 0xA2, 0xC1, + 0x30, 0x8B, 0x28, 0x0D, 0x8B, 0x45, 0xBE, 0x80, 0xD3, 0xE1, 0xE5, 0x69, 0x67, 0x51, 0xDD, 0x75, 0x53, 0x82, 0xF5, 0x6E, + 0xF3, 0xD7, 0x61, 0x31, 0xA3, 0x17, 0xC4, 0xCB, 0x4F, 0xBE, 0x72, 0xA9, 0x6A, 0xB9, 0x0B, 0xF8, 0xFA, 0xF1, 0xD1, 0x10, + 0xBC, 0xC0, 0x75, 0x66, 0x99, 0x66, 0x9C, 0x09, 0xBE, 0x32, 0xBD, 0x2F, 0xD2, 0xFC, 0x3B, 0x08, 0x8D, 0x12, 0xBF, 0x35, + 0xBF, 0xE7, 0x8B, 0x31, 0x45, 0x43, 0xF6, 0x1F, 0xC2, 0x80, 0xC2, 0x57, 0xC6, 0xD5, 0x1A, 0xC2, 0x9E, 0x24, 0x63, 0x78, + 0x63, 0x56, 0x13, 0xCE, 0x02, 0xC2, 0x5A, 0xD3, 0x27, 0x22, 0x4B, 0x2F, 0x09, 0x3A, 0x16, 0x49, 0xC0, 0xBC, 0x7C, 0x8E, + 0xED, 0x57, 0x4F, 0x91, 0xBB, 0x8E, 0x0A, 0x23, 0x7B, 0x81, 0x28, 0xA9, 0xA7, 0x6B, 0x6E, 0x0A, 0xCC, 0x49, 0x3E, 0x19, + 0x7A, 0xBE, 0x86, 0x34, 0x12, 0x1D, 0x48, 0xEE, 0x22, 0xE5, 0x93, 0xA9, 0x58, 0xF2, 0x54, 0x73, 0xF8, 0x76, 0xCF, 0xF2, + 0xA8, 0xF8, 0xD2, 0x85, 0xE5, 0x3F, 0x5D, 0x49, 0xBE, 0x1B +}; +const FX_BYTE g_itIT_Locale[] = { + 0x78, 0x9C, 0x95, 0x56, 0xD1, 0x6A, 0xD4, 0x40, 0x14, 0x7D, 0x17, 0xFC, 0x87, 0x21, 0x58, 0x50, 0x68, 0x3B, 0xFA, 0xD8, + 0x92, 0x06, 0x4A, 0x5B, 0xBB, 0xA5, 0x46, 0x96, 0xEE, 0xAA, 0xD8, 0x17, 0x99, 0x64, 0xA6, 0xD9, 0xB1, 0xC9, 0xCC, 0x32, + 0x49, 0x5A, 0x92, 0x47, 0xF1, 0xC1, 0x37, 0x7F, 0x42, 0x10, 0x41, 0xF1, 0x23, 0xFC, 0x13, 0xA1, 0xE2, 0x67, 0x78, 0xB3, + 0x99, 0xA4, 0xC9, 0x64, 0xBA, 0xA6, 0x79, 0xD9, 0xB9, 0xE7, 0x9E, 0x73, 0x73, 0xEF, 0x99, 0x64, 0x36, 0x6E, 0x2C, 0x43, + 0x12, 0x33, 0x24, 0x48, 0xC2, 0xF6, 0x1C, 0x9E, 0xBD, 0x3B, 0x99, 0x3B, 0x88, 0xB2, 0x34, 0xDC, 0x73, 0xFE, 0x7C, 0xFC, + 0x7C, 0xF3, 0xE5, 0xEB, 0xCD, 0xA7, 0x6F, 0x7F, 0x7F, 0xFE, 0x78, 0xDC, 0x06, 0x4F, 0x1C, 0xCF, 0xAD, 0x14, 0x82, 0x12, + 0x35, 0x2B, 0x92, 0x40, 0xC6, 0xA9, 0x16, 0x47, 0x8A, 0x45, 0x52, 0x71, 0x22, 0x80, 0x91, 0x48, 0x91, 0x2D, 0x5E, 0x02, + 0x9C, 0xEA, 0xB5, 0x17, 0x31, 0x21, 0x08, 0x97, 0x2E, 0xAE, 0xC3, 0x87, 0x0F, 0x34, 0x7E, 0xC1, 0x82, 0x40, 0xD9, 0x12, + 0x09, 0x51, 0xE5, 0x10, 0x25, 0x4B, 0xC5, 0x63, 0x66, 0x21, 0x47, 0x91, 0xA5, 0x46, 0xC4, 0xF3, 0x48, 0x0C, 0xE1, 0x38, + 0x8F, 0x62, 0x0B, 0x9B, 0x44, 0x32, 0xCD, 0x86, 0x70, 0xCA, 0xB2, 0x8C, 0x25, 0x81, 0x1A, 0xDE, 0x55, 0x66, 0x99, 0xB4, + 0xE1, 0x42, 0x5E, 0xD9, 0x05, 0x94, 0x87, 0x66, 0x02, 0x77, 0xAC, 0x6A, 0x78, 0xAB, 0x08, 0x11, 0x30, 0x66, 0xCF, 0x79, + 0xE6, 0x74, 0x1C, 0xB4, 0xB9, 0x67, 0x33, 0xCE, 0x66, 0x9B, 0xCD, 0x33, 0x9B, 0x61, 0x36, 0xB7, 0x6C, 0x56, 0xD9, 0x7C, + 0xB2, 0x39, 0x64, 0x73, 0xC7, 0x66, 0xCC, 0xDD, 0x9E, 0x50, 0x52, 0xE8, 0x47, 0x09, 0x56, 0x1E, 0x95, 0x09, 0x13, 0x3C, + 0x24, 0x2E, 0xAE, 0xA2, 0x3A, 0x0D, 0x3D, 0x0A, 0x46, 0x7F, 0x7D, 0xEF, 0x61, 0xE0, 0x43, 0x36, 0x04, 0x99, 0x0A, 0x65, + 0x3C, 0x80, 0xE1, 0xE1, 0xB9, 0x1A, 0x80, 0x57, 0x4C, 0x30, 0x65, 0x82, 0x29, 0x09, 0x48, 0xF5, 0x90, 0x68, 0x08, 0xB7, + 0xCD, 0x75, 0x1A, 0xED, 0x6C, 0x9D, 0xEE, 0xD8, 0x6C, 0xD6, 0x6C, 0xD4, 0xEC, 0xD1, 0x6C, 0xCE, 0xEC, 0xCB, 0x6C, 0xC9, + 0xDE, 0x0F, 0x14, 0xE2, 0x94, 0xB3, 0xA4, 0x79, 0x11, 0x75, 0xE8, 0xED, 0xFB, 0x60, 0x71, 0x13, 0x74, 0x78, 0xDE, 0xD4, + 0x48, 0xE0, 0x7E, 0x05, 0x40, 0x98, 0x22, 0xBA, 0x1A, 0xAC, 0x3C, 0x72, 0xE0, 0xE2, 0xEA, 0xB7, 0x4E, 0x78, 0xF4, 0x36, + 0xC4, 0x2D, 0xB1, 0x0A, 0x8C, 0x03, 0xA3, 0x6E, 0x3C, 0x63, 0x53, 0x02, 0x6F, 0x96, 0x12, 0xAB, 0x8D, 0x6D, 0x23, 0x7D, + 0x9A, 0x5C, 0xE4, 0x71, 0xEC, 0x78, 0x47, 0x70, 0xA1, 0x43, 0xE4, 0xC3, 0x85, 0xDE, 0xC2, 0x55, 0xCD, 0xD7, 0x32, 0x8D, + 0x32, 0x5A, 0x18, 0x4B, 0x11, 0x39, 0xDE, 0xE1, 0xFD, 0x44, 0x09, 0xA3, 0x95, 0x06, 0x83, 0x04, 0x8F, 0x12, 0xA4, 0x0B, + 0xA9, 0x32, 0x2D, 0xB1, 0x29, 0x70, 0x6F, 0x3E, 0x00, 0x32, 0x9E, 0x74, 0xE6, 0xED, 0x44, 0xBD, 0x79, 0x27, 0x93, 0x5D, + 0xDF, 0xDF, 0x9D, 0xCD, 0xD0, 0xB9, 0x8B, 0x3B, 0x1C, 0xA3, 0x40, 0x6F, 0xD2, 0xFB, 0x28, 0x56, 0x63, 0x36, 0xF7, 0x18, + 0xC1, 0xD7, 0x53, 0xAE, 0x14, 0x03, 0x3A, 0xEE, 0x8D, 0xA4, 0x5D, 0x9A, 0x03, 0xD6, 0xEC, 0xF2, 0x71, 0xE1, 0xD3, 0xCB, + 0x49, 0x92, 0xCE, 0x8E, 0x0E, 0x9F, 0x5F, 0xBF, 0x21, 0x8B, 0xD3, 0xF2, 0xBC, 0xF6, 0xA5, 0x4B, 0x02, 0x9D, 0xC8, 0x93, + 0x80, 0xA9, 0x5B, 0x73, 0x7A, 0xB1, 0xEE, 0x04, 0x30, 0x78, 0x14, 0x43, 0xC7, 0x2B, 0x37, 0xCB, 0x72, 0x67, 0xBB, 0x2C, + 0x4B, 0x17, 0xF7, 0x78, 0x83, 0x42, 0x5A, 0x18, 0xE6, 0x4A, 0x31, 0x11, 0x16, 0x8E, 0xF7, 0x08, 0xD5, 0xDA, 0x9D, 0x9D, + 0x91, 0xD2, 0x25, 0x9C, 0x15, 0x4C, 0x64, 0xFA, 0x9E, 0x1B, 0x16, 0x15, 0x36, 0x5A, 0x6F, 0x0B, 0x35, 0xD3, 0xF5, 0x42, + 0x5D, 0x96, 0xB2, 0x90, 0x27, 0x04, 0x36, 0x7B, 0xB3, 0xD1, 0xD7, 0x69, 0x53, 0xDD, 0xFE, 0xAD, 0xCA, 0x7C, 0xC9, 0xAB, + 0x9D, 0xDE, 0x1E, 0xC5, 0x6F, 0xBB, 0xDE, 0x18, 0x45, 0x4F, 0xB8, 0xC8, 0x53, 0xC7, 0xDB, 0x1A, 0x45, 0x2E, 0x99, 0x92, + 0x8E, 0xF7, 0x74, 0xC8, 0xC5, 0xFD, 0xB1, 0x01, 0x69, 0x7C, 0x6F, 0x9D, 0xE8, 0x03, 0xCD, 0x03, 0xB6, 0x0A, 0x1C, 0xEF, + 0xF7, 0x07, 0x38, 0x65, 0xFB, 0x8C, 0x61, 0x91, 0xE6, 0x23, 0x25, 0x95, 0xD5, 0x02, 0x0E, 0x87, 0x57, 0x67, 0xA3, 0x45, + 0x5D, 0xD3, 0x87, 0x12, 0x6C, 0x76, 0x5B, 0xBD, 0x0D, 0xC5, 0x92, 0x5D, 0x90, 0xB0, 0x3A, 0xEA, 0x9A, 0xA5, 0xAE, 0xE5, + 0x17, 0xF0, 0x95, 0x43, 0xD1, 0x14, 0xBC, 0xC0, 0x5D, 0x66, 0x93, 0xE6, 0x82, 0x4B, 0x71, 0x67, 0xFA, 0x40, 0xE6, 0x8A, + 0x33, 0x85, 0x66, 0x19, 0xB5, 0xE6, 0xF7, 0xA9, 0x0C, 0x18, 0x9A, 0xF2, 0xFF, 0x10, 0x26, 0x0C, 0xBE, 0x23, 0xAE, 0xD7, + 0x10, 0xF6, 0x15, 0x09, 0xE0, 0x85, 0xB9, 0x9B, 0x30, 0x5F, 0x10, 0x6E, 0x4D, 0x9F, 0xCA, 0x32, 0xBF, 0x24, 0xE8, 0x58, + 0x66, 0x0B, 0x1E, 0x56, 0x73, 0x6C, 0xBD, 0x3E, 0x41, 0xFE, 0x3A, 0x2A, 0x8C, 0x1C, 0x2E, 0x64, 0x43, 0x3D, 0x5B, 0x73, + 0x53, 0x60, 0x46, 0xD5, 0x64, 0xE8, 0xC5, 0x1A, 0xD2, 0x4C, 0x8E, 0x20, 0xF9, 0x45, 0x2E, 0xA2, 0xF7, 0x72, 0xC5, 0xD3, + 0xCD, 0xE1, 0xDB, 0x3D, 0xAB, 0xA2, 0xFA, 0xD3, 0x16, 0x96, 0xFF, 0x00, 0x20, 0x8B, 0xBE, 0xF7 +}; +const FX_BYTE g_ptBR_Locale[] = { + 0x78, 0x9C, 0x9D, 0x56, 0x3D, 0x6F, 0xD4, 0x40, 0x10, 0xAD, 0x83, 0xC4, 0x7F, 0x58, 0x59, 0x89, 0x0E, 0xA4, 0x24, 0x86, + 0x92, 0xC8, 0x67, 0xE9, 0x92, 0x0B, 0x39, 0x94, 0x18, 0x9D, 0xCE, 0x11, 0x88, 0x34, 0x68, 0x6D, 0xEF, 0xD9, 0x9B, 0xD8, + 0xBB, 0xC7, 0xDA, 0x4E, 0xB0, 0x6B, 0x1A, 0x3A, 0x28, 0x29, 0x53, 0x20, 0x2A, 0x44, 0x83, 0x44, 0x49, 0x91, 0xDF, 0x82, + 0xB8, 0x9F, 0xC1, 0xFA, 0xF3, 0xFC, 0xB1, 0x36, 0x06, 0x37, 0xDE, 0x99, 0x79, 0x6F, 0x3D, 0xF3, 0x76, 0x76, 0x64, 0xC5, + 0xA5, 0x26, 0x74, 0x11, 0x20, 0xD0, 0x43, 0x63, 0x69, 0x15, 0xBC, 0x3E, 0x5C, 0x48, 0xC0, 0x42, 0xBE, 0x39, 0x96, 0xD6, + 0x1F, 0x6F, 0xD7, 0x1F, 0xDE, 0xFD, 0x7E, 0xFF, 0x69, 0xFD, 0xED, 0xEB, 0x83, 0x5F, 0x3F, 0xBE, 0xAF, 0x3F, 0xFF, 0x7C, + 0x28, 0xA9, 0xF7, 0xEF, 0x01, 0xA0, 0x24, 0x14, 0x62, 0x41, 0xA6, 0x47, 0x9E, 0x41, 0x5D, 0x3F, 0x67, 0xDB, 0x0C, 0xD9, + 0x94, 0x61, 0x48, 0x12, 0xD4, 0x16, 0x50, 0x3C, 0x4A, 0x02, 0xE7, 0x39, 0x0F, 0xF9, 0x89, 0xBD, 0x95, 0xD9, 0xEA, 0x25, + 0x24, 0x08, 0x33, 0xAA, 0xC8, 0x99, 0x59, 0x89, 0x2C, 0xD1, 0x35, 0x62, 0x1D, 0x31, 0x0F, 0xB2, 0xBB, 0x2F, 0xA2, 0x00, + 0x34, 0x18, 0x76, 0x85, 0x04, 0x2C, 0x82, 0x5F, 0x86, 0xC4, 0x11, 0xFB, 0x5D, 0xA1, 0x1F, 0xDA, 0xD4, 0x0F, 0x44, 0x01, + 0x1F, 0x05, 0xC8, 0x33, 0x84, 0xB9, 0xD2, 0x30, 0x08, 0xC5, 0x11, 0x42, 0xAF, 0xBB, 0x48, 0x16, 0x8A, 0x9B, 0x21, 0x90, + 0xAF, 0x4B, 0x09, 0xAB, 0x92, 0x02, 0x68, 0x18, 0x6C, 0x2C, 0x3D, 0x96, 0x1A, 0xDA, 0x8A, 0x75, 0x15, 0x2B, 0x2A, 0x96, + 0x53, 0x2C, 0xA6, 0x58, 0x4B, 0xB1, 0x92, 0x62, 0x1D, 0xC5, 0x22, 0x8A, 0xF5, 0x13, 0x6B, 0x27, 0x96, 0xAD, 0x5F, 0x31, + 0x0B, 0x46, 0x95, 0x16, 0xE4, 0x96, 0x6A, 0x51, 0x0F, 0x93, 0x24, 0x9D, 0xC4, 0x28, 0xBD, 0x3E, 0xB2, 0x43, 0xDE, 0xD2, + 0x7B, 0x4B, 0xDE, 0x80, 0xB0, 0x11, 0x0B, 0x10, 0x6F, 0x3E, 0x71, 0xE8, 0x4D, 0x08, 0x59, 0xD0, 0x15, 0xC2, 0xA4, 0x23, + 0xE4, 0xA3, 0xB7, 0x5D, 0x91, 0xBB, 0x5B, 0x03, 0x5A, 0x9B, 0xE4, 0x40, 0xBA, 0x12, 0xD4, 0xD3, 0x38, 0xFF, 0xBC, 0xB0, + 0x76, 0x51, 0xED, 0x52, 0xDA, 0x15, 0xB4, 0x13, 0x6F, 0xE7, 0x2B, 0xC8, 0xB3, 0x3B, 0x49, 0x0F, 0x31, 0x6C, 0x61, 0xE4, + 0x55, 0x2F, 0x7F, 0xEE, 0x52, 0x27, 0x1A, 0x3F, 0xA4, 0xC2, 0xA8, 0x87, 0xE6, 0x8D, 0x10, 0xD8, 0x98, 0x95, 0xCD, 0x11, + 0x83, 0x95, 0x7D, 0xB9, 0xA5, 0x1E, 0x1E, 0x29, 0x72, 0xF2, 0x2E, 0x1D, 0x93, 0x69, 0xE9, 0x00, 0xE9, 0xAA, 0x20, 0xF0, + 0xD9, 0x25, 0x37, 0x86, 0x57, 0xE6, 0xB5, 0x60, 0x80, 0xE6, 0x30, 0xE0, 0xF2, 0x90, 0x52, 0xE8, 0xD2, 0x93, 0xCF, 0xB7, + 0x65, 0xE8, 0xBA, 0x92, 0x7A, 0xCC, 0x9F, 0x5D, 0x30, 0x1D, 0xF1, 0x29, 0x09, 0x46, 0x1A, 0x7F, 0xB2, 0xD5, 0x2B, 0xFE, + 0x24, 0x32, 0x94, 0xA4, 0xAE, 0x5D, 0x5C, 0x4A, 0x6C, 0x49, 0xFD, 0x7F, 0xBE, 0x87, 0x2C, 0x4E, 0x9F, 0xCA, 0x9A, 0x26, + 0x0F, 0xE6, 0xF8, 0x0E, 0x65, 0xC1, 0x86, 0xD5, 0xE4, 0x00, 0x50, 0xF3, 0xE4, 0x92, 0x04, 0xD8, 0x6B, 0x48, 0x52, 0xF1, + 0xD4, 0x24, 0x99, 0xCD, 0x46, 0x0E, 0x2F, 0x65, 0xC4, 0xEF, 0xD5, 0x48, 0xD7, 0x47, 0xFE, 0x08, 0x5C, 0x28, 0x72, 0x05, + 0xDC, 0xC5, 0xCE, 0xA4, 0x48, 0xC9, 0x19, 0x77, 0x38, 0x35, 0x55, 0x61, 0x36, 0x3B, 0xD0, 0xB4, 0x03, 0x5D, 0x1F, 0xC4, + 0xC8, 0x35, 0x48, 0x39, 0x4D, 0x42, 0x22, 0x40, 0xA3, 0xDC, 0xBC, 0x27, 0xCE, 0xB9, 0xB7, 0x68, 0x94, 0x93, 0x48, 0xB3, + 0xAE, 0x66, 0x9E, 0xAF, 0x1F, 0x4F, 0x9F, 0xDE, 0xBC, 0x84, 0xCE, 0x69, 0x7C, 0x91, 0xE9, 0x56, 0x05, 0xA5, 0x4C, 0x12, + 0x7A, 0x06, 0x62, 0x75, 0xF1, 0x6A, 0xBE, 0x3C, 0x27, 0xEE, 0xE3, 0xFD, 0x6D, 0x4A, 0x6A, 0xBC, 0x1B, 0xC7, 0x4F, 0xF6, + 0xE3, 0x98, 0x0F, 0xB3, 0x1A, 0xAE, 0x9B, 0x6A, 0x86, 0x8C, 0x21, 0x62, 0x46, 0x92, 0xBA, 0x0D, 0x0A, 0xF6, 0x60, 0xF2, + 0x0A, 0x31, 0x13, 0x91, 0x20, 0xFF, 0xEE, 0x4E, 0x9B, 0x97, 0x08, 0xD2, 0x2A, 0xA2, 0x2C, 0x6C, 0x53, 0xEB, 0x56, 0xDD, + 0x95, 0x6F, 0x6F, 0x21, 0x13, 0x7B, 0x90, 0x37, 0xC6, 0x6E, 0xB1, 0x4B, 0x16, 0xEE, 0x24, 0xD8, 0x8C, 0x86, 0x2B, 0x9C, + 0x34, 0xC3, 0xFE, 0x40, 0x46, 0x59, 0xC1, 0xCE, 0x40, 0x02, 0xEF, 0xAF, 0xD0, 0x97, 0xD4, 0xBD, 0x81, 0xF0, 0x18, 0x31, + 0x2A, 0xA9, 0x8F, 0x5A, 0xE8, 0x8D, 0x30, 0xB5, 0x03, 0x2F, 0x4E, 0xA3, 0xA6, 0x4C, 0xDD, 0x59, 0xB4, 0x61, 0x6A, 0x48, + 0xEA, 0x62, 0x9B, 0x4F, 0xA2, 0x1A, 0xA0, 0x87, 0x84, 0x7D, 0x9A, 0x2C, 0x24, 0xF5, 0x70, 0x71, 0xF6, 0x0F, 0xB4, 0xEA, + 0x39, 0xB4, 0x48, 0xE9, 0x28, 0x6C, 0xA5, 0x9D, 0xDC, 0xFB, 0x68, 0x85, 0x96, 0xD0, 0x2C, 0xC6, 0x6D, 0x61, 0xE6, 0x7B, + 0x6A, 0x11, 0xFF, 0xC3, 0xB3, 0xC0, 0x9C, 0xCB, 0x23, 0x8B, 0x01, 0x98, 0x60, 0x4A, 0x7A, 0x00, 0x47, 0x34, 0x64, 0x18, + 0x31, 0xA0, 0x07, 0x56, 0x07, 0x62, 0x62, 0x51, 0x03, 0x81, 0x39, 0xFE, 0x2B, 0x64, 0x86, 0x0C, 0x86, 0x6E, 0x7A, 0x21, + 0x13, 0x06, 0x0D, 0x7E, 0xC3, 0xFA, 0x20, 0xE7, 0x0E, 0xC4, 0x1D, 0x80, 0x53, 0x1A, 0x87, 0x57, 0x10, 0x9C, 0xD0, 0xC0, + 0xC1, 0x66, 0x52, 0xD3, 0xDE, 0x8B, 0x67, 0x40, 0xEB, 0x07, 0x73, 0x01, 0x4C, 0x87, 0x16, 0xE0, 0x45, 0xEF, 0xA7, 0x39, + 0xD6, 0x4E, 0xAA, 0x04, 0x67, 0xBD, 0x30, 0x9D, 0x0E, 0x82, 0x69, 0x51, 0x48, 0xEC, 0x4B, 0x9A, 0x22, 0xB3, 0x24, 0xD3, + 0xC1, 0x56, 0x39, 0x4F, 0x45, 0xCE, 0xFE, 0xF7, 0xD5, 0x3F, 0x30, 0xBB, 0xD9, 0x9B +}; +const FX_BYTE g_nlNL_Locale[] = { + 0x78, 0x9C, 0x95, 0x56, 0x4D, 0x4F, 0xDC, 0x30, 0x10, 0x3D, 0x53, 0xA9, 0xFF, 0xC1, 0x8A, 0x8A, 0x68, 0x25, 0x96, 0x2D, + 0x47, 0x50, 0x88, 0xB4, 0x05, 0x0A, 0x15, 0x04, 0xAD, 0x58, 0xDA, 0xAA, 0x5C, 0x2A, 0x6F, 0x62, 0x76, 0xBD, 0x24, 0xF6, + 0xCA, 0x89, 0x41, 0xC9, 0xB1, 0x52, 0x8F, 0xFD, 0x27, 0xAD, 0xDA, 0x5B, 0xFF, 0x4F, 0xA5, 0x4A, 0xFC, 0x8C, 0x8E, 0xF3, + 0x45, 0x12, 0x3B, 0x69, 0xC8, 0x05, 0xCF, 0x9B, 0xF7, 0xBC, 0x33, 0xCF, 0xCE, 0x10, 0x3B, 0xE0, 0x1E, 0x0E, 0x08, 0x62, + 0x38, 0x24, 0x07, 0x16, 0x0B, 0x3E, 0x5F, 0x9C, 0x5B, 0xC8, 0x27, 0x91, 0x77, 0x60, 0x3D, 0x7C, 0xFB, 0xFD, 0xF7, 0xEB, + 0xAF, 0x87, 0x9F, 0x3F, 0x5E, 0xE6, 0xAB, 0x57, 0x96, 0xF3, 0xFC, 0x19, 0x42, 0xB6, 0xE2, 0x33, 0x1F, 0x8B, 0x59, 0x12, + 0xCE, 0x79, 0x10, 0x15, 0xD2, 0x85, 0x20, 0x0B, 0x2E, 0x28, 0x66, 0x8A, 0xB5, 0x81, 0xEC, 0x90, 0xB3, 0x78, 0x79, 0x01, + 0xA9, 0x48, 0xC5, 0x1B, 0x79, 0xEC, 0xAC, 0x30, 0x93, 0x58, 0x50, 0x7B, 0x9C, 0x87, 0xB5, 0xCC, 0x0D, 0x99, 0x8B, 0x8E, + 0x54, 0x88, 0xB1, 0x88, 0x0D, 0x38, 0x5E, 0x0B, 0x1A, 0x98, 0xF8, 0xC4, 0xB4, 0xCB, 0x4A, 0x32, 0x33, 0x1C, 0x98, 0x60, + 0x2C, 0x17, 0x32, 0x8A, 0x65, 0x64, 0x48, 0x45, 0x64, 0x1D, 0x93, 0x70, 0x4E, 0x84, 0x21, 0xC7, 0x6F, 0x63, 0x6E, 0xCE, + 0x30, 0x7E, 0xD7, 0x25, 0xF2, 0x89, 0xD7, 0x4E, 0xA1, 0x62, 0x5D, 0x19, 0x58, 0x37, 0x14, 0xE1, 0xF9, 0x5C, 0x1C, 0x58, + 0xBB, 0x56, 0xCB, 0x59, 0xB3, 0xAB, 0x26, 0x83, 0xBA, 0xEC, 0x7C, 0x8A, 0x99, 0x66, 0x2F, 0xCD, 0x56, 0x9A, 0x5D, 0x34, + 0xFB, 0x67, 0xF6, 0xCE, 0x6C, 0x5B, 0xBF, 0x63, 0x3E, 0x4E, 0x6A, 0x17, 0x10, 0x22, 0x27, 0xE5, 0x70, 0x71, 0xA1, 0x1A, + 0xB5, 0xAE, 0x40, 0xB8, 0x5E, 0x06, 0xD4, 0xA7, 0x2C, 0xD2, 0xD1, 0x7B, 0x4E, 0x4C, 0xB0, 0x0F, 0xFB, 0x12, 0xA1, 0xE3, + 0x77, 0x82, 0xAE, 0x74, 0x34, 0xC5, 0x71, 0x93, 0x8C, 0xB2, 0x95, 0xA1, 0xF2, 0xD6, 0x49, 0xE7, 0x2D, 0x68, 0xE5, 0x6B, + 0x95, 0x6B, 0x45, 0x6B, 0xE5, 0x6A, 0x75, 0x6A, 0x25, 0x76, 0x17, 0x17, 0x12, 0x41, 0x7D, 0x4A, 0xC2, 0xFA, 0xCB, 0x5D, + 0x40, 0xCE, 0xC4, 0x85, 0x63, 0x28, 0x83, 0x66, 0x6A, 0xDA, 0x4A, 0xA1, 0xC7, 0xB0, 0xB6, 0x39, 0x11, 0xB8, 0xB6, 0x2F, + 0x44, 0xCE, 0x9B, 0x43, 0x7B, 0xAC, 0xFE, 0x56, 0xC0, 0xE4, 0xA8, 0x02, 0x50, 0xB6, 0x2A, 0x05, 0x30, 0x9B, 0xC6, 0xAD, + 0xE1, 0x94, 0xA3, 0x3E, 0x18, 0x3E, 0xC5, 0x31, 0xB8, 0xCE, 0x2A, 0x83, 0x2B, 0xA4, 0x98, 0x5F, 0x37, 0x32, 0x08, 0x2C, + 0xE7, 0x18, 0x1E, 0x74, 0x84, 0x5C, 0x78, 0xD0, 0x27, 0x78, 0x54, 0xEF, 0x15, 0xB3, 0x4B, 0x1A, 0x70, 0xB6, 0xB0, 0x9C, + 0xA7, 0xAA, 0x42, 0xE2, 0x83, 0x68, 0x04, 0x9A, 0xD1, 0x60, 0x4D, 0xB4, 0xE4, 0x22, 0xCE, 0x54, 0x23, 0x5D, 0x81, 0x50, + 0x03, 0x29, 0x7A, 0x8F, 0x69, 0xD8, 0xEA, 0xBD, 0x86, 0x34, 0x7A, 0x3F, 0xDD, 0x77, 0xDD, 0xFD, 0xD9, 0x6C, 0x0B, 0x49, + 0x29, 0xB6, 0xD0, 0xB5, 0x3D, 0xAE, 0x11, 0xBB, 0x94, 0x79, 0xEB, 0x85, 0x72, 0xA0, 0x26, 0x6B, 0xBC, 0x90, 0x0C, 0x12, + 0x14, 0x5D, 0x2B, 0x49, 0x9B, 0xAF, 0x7A, 0x6E, 0x75, 0x58, 0x9C, 0xF7, 0x15, 0xA0, 0xE5, 0x25, 0x38, 0x49, 0x5C, 0xFF, + 0xF6, 0x34, 0x8C, 0x66, 0xC7, 0x47, 0x6F, 0xEF, 0x3F, 0xE2, 0xE5, 0x59, 0x7A, 0x9D, 0x5B, 0x55, 0x27, 0x65, 0x4A, 0x26, + 0xD5, 0x20, 0x6E, 0xFA, 0xD5, 0xC0, 0xCA, 0x7F, 0x94, 0x52, 0xDD, 0x5D, 0xCF, 0x72, 0xD2, 0xED, 0x34, 0xDD, 0xDB, 0x49, + 0xD3, 0xD4, 0x1E, 0x37, 0x78, 0xDD, 0x52, 0x4F, 0x0A, 0x41, 0x98, 0x97, 0x58, 0xCE, 0x0B, 0x94, 0xAB, 0xF7, 0xF6, 0xA2, + 0xC1, 0xEA, 0x35, 0x11, 0x1E, 0x61, 0x71, 0xF1, 0xC3, 0x9B, 0xBA, 0x4E, 0x39, 0xA2, 0x75, 0x51, 0x75, 0xF6, 0xD8, 0xEC, + 0x46, 0x13, 0x2A, 0xB6, 0x87, 0x99, 0x4A, 0x43, 0x0C, 0x97, 0x61, 0xBB, 0xDC, 0x25, 0x4F, 0x77, 0x0A, 0x16, 0x82, 0xCB, + 0x35, 0x55, 0x97, 0x60, 0x67, 0xA0, 0xA2, 0xEA, 0x60, 0x73, 0xA0, 0x20, 0xA4, 0x4C, 0x46, 0x96, 0x33, 0x1A, 0x48, 0x4F, + 0x89, 0xE0, 0x96, 0xF3, 0x5A, 0x63, 0x3F, 0x1A, 0xD3, 0x38, 0xF1, 0xF2, 0x38, 0x1A, 0xCE, 0x34, 0xC1, 0xF2, 0x1A, 0x66, + 0x81, 0xE5, 0xFC, 0xF9, 0xF2, 0x1D, 0xE6, 0x4C, 0x83, 0xD1, 0xA3, 0xA2, 0x11, 0x57, 0x0B, 0x18, 0x2D, 0xEF, 0x2F, 0x9F, + 0x20, 0xAB, 0x1F, 0x84, 0x26, 0xCA, 0x06, 0x9D, 0x56, 0xB7, 0x7A, 0xD9, 0x93, 0x35, 0xB9, 0xC1, 0x5E, 0x39, 0x4C, 0xCB, + 0xB0, 0xD8, 0xD3, 0x4D, 0xE0, 0xFB, 0xCC, 0x47, 0x53, 0xF0, 0x67, 0x6C, 0x26, 0x50, 0x46, 0x39, 0xEB, 0x21, 0x1C, 0x72, + 0x29, 0x28, 0x11, 0x68, 0x16, 0xFB, 0x1D, 0x8C, 0x89, 0x0F, 0xDF, 0x3F, 0x68, 0x4A, 0xFF, 0x4B, 0x39, 0x85, 0xEF, 0x3D, + 0x72, 0xDF, 0x4B, 0x99, 0x08, 0x3C, 0x87, 0x77, 0xAC, 0x8F, 0x72, 0xB5, 0xC4, 0xB4, 0x83, 0x70, 0xC6, 0x53, 0x79, 0x8B, + 0xD1, 0x09, 0x8F, 0x97, 0xD4, 0x53, 0x3D, 0x8D, 0x3E, 0xBC, 0x43, 0x6E, 0x3F, 0x19, 0x0C, 0xF0, 0x96, 0xBC, 0x24, 0x5F, + 0xF6, 0xFE, 0x34, 0x70, 0x17, 0xAA, 0x4B, 0x74, 0xDE, 0x4B, 0x9B, 0xF1, 0x41, 0x34, 0x37, 0x91, 0x6C, 0xB1, 0xE2, 0x19, + 0x33, 0x2F, 0x32, 0x1B, 0x6D, 0xB5, 0xF3, 0xB4, 0xC7, 0xF9, 0xA7, 0xBA, 0xF3, 0x0F, 0xD5, 0xFA, 0xC0, 0xFA +}; +const FX_BYTE g_ruRU_Locale[] = { + 0x78, 0x9C, 0xAD, 0x57, 0x4D, 0x4F, 0x13, 0x41, 0x18, 0x3E, 0x63, 0xE2, 0x7F, 0x98, 0x6C, 0x24, 0x68, 0x02, 0xAD, 0x1E, + 0x25, 0x65, 0x13, 0x22, 0x0A, 0x06, 0xD7, 0x90, 0x16, 0x34, 0x72, 0x31, 0xDB, 0xDD, 0xA1, 0x5D, 0xE8, 0xEE, 0x90, 0xE9, + 0x6E, 0xB0, 0x7B, 0x2A, 0x85, 0xE8, 0x05, 0x25, 0xE1, 0xA0, 0x47, 0xF4, 0xE4, 0xC9, 0x50, 0xBE, 0x12, 0x82, 0xB6, 0x24, + 0xFE, 0x82, 0xD9, 0xFF, 0x60, 0xD4, 0x9F, 0xE1, 0x3B, 0xFB, 0xD1, 0xEE, 0xB7, 0xC5, 0xD8, 0x1E, 0x3A, 0xF3, 0x3E, 0xCF, + 0xF3, 0xCE, 0xFB, 0xB5, 0xD3, 0xB6, 0xD4, 0x20, 0x8A, 0xDC, 0xC0, 0xC8, 0x90, 0x75, 0x3C, 0x23, 0x50, 0xEB, 0x65, 0x79, + 0x45, 0x40, 0x2A, 0x6E, 0x2A, 0x33, 0xC2, 0x8F, 0xAB, 0xDD, 0xDF, 0x47, 0x5F, 0x6E, 0xC3, 0xC7, 0xAF, 0xDE, 0x87, 0x9F, + 0xEF, 0x8F, 0xEE, 0x08, 0xE2, 0xCD, 0x1B, 0x08, 0x95, 0x38, 0xDF, 0x50, 0x65, 0x5A, 0x69, 0xE9, 0x55, 0xD2, 0x68, 0xFA, + 0xD2, 0x1A, 0xC5, 0x35, 0x42, 0x35, 0xD9, 0xE0, 0xAC, 0x31, 0x54, 0xD2, 0x89, 0x61, 0xD6, 0x9F, 0x02, 0xD4, 0xE4, 0xFB, + 0x31, 0x6F, 0x2F, 0x3A, 0xFB, 0xAC, 0xC7, 0x4E, 0x58, 0xD7, 0x69, 0x3B, 0xFB, 0xA5, 0xA2, 0x67, 0x0B, 0xC3, 0xBB, 0xEC, + 0x9C, 0x9D, 0x38, 0x6D, 0xD6, 0x65, 0x5F, 0x53, 0x09, 0xEC, 0x9B, 0xAB, 0xED, 0xB0, 0x6E, 0x1A, 0xD8, 0x65, 0x57, 0xA0, + 0x3D, 0xCF, 0xD3, 0xA6, 0x02, 0x17, 0xCE, 0x3B, 0xD6, 0xCB, 0x86, 0x32, 0xDC, 0x75, 0x21, 0x91, 0x53, 0x67, 0xC7, 0xD9, + 0xCE, 0x08, 0xC7, 0xD9, 0x86, 0x50, 0x7A, 0x4E, 0x07, 0x72, 0x3E, 0xCE, 0xC8, 0x97, 0xF5, 0xD9, 0x65, 0x3E, 0xA1, 0xC7, + 0xFA, 0x79, 0xF0, 0x19, 0x1C, 0x71, 0x09, 0x91, 0xC4, 0x09, 0xC8, 0x5F, 0x0F, 0x1A, 0x10, 0x6E, 0x08, 0x92, 0xAB, 0x55, + 0x3A, 0x23, 0xDC, 0x13, 0x92, 0x9D, 0x29, 0xE4, 0x34, 0x25, 0x0D, 0x1B, 0xA1, 0x1F, 0x99, 0xB2, 0xFF, 0xDD, 0x8A, 0xD4, + 0xD8, 0xFD, 0x1E, 0xA4, 0x06, 0xE1, 0x16, 0x3F, 0x15, 0xF1, 0xAB, 0x9E, 0x8A, 0xB9, 0x25, 0x2F, 0xE4, 0xD7, 0x5A, 0x95, + 0x5B, 0xA1, 0xD1, 0x87, 0x9D, 0x08, 0x01, 0xF6, 0x21, 0x98, 0x4B, 0x3E, 0x9F, 0x7E, 0x50, 0x7B, 0xEC, 0xBC, 0x54, 0xE4, + 0xD8, 0x90, 0x74, 0x05, 0x31, 0xF5, 0x00, 0x3C, 0x73, 0x87, 0x78, 0x0F, 0xD6, 0x17, 0xEC, 0x32, 0x4E, 0x3A, 0x81, 0x72, + 0xF7, 0xC1, 0x4F, 0x1A, 0x08, 0xC3, 0xD8, 0x76, 0xF5, 0xDD, 0x38, 0xF0, 0x06, 0xCE, 0xED, 0x40, 0x14, 0xE7, 0x40, 0x38, + 0x4D, 0x9C, 0xEB, 0xEC, 0x03, 0x08, 0x0E, 0x9D, 0xD7, 0x49, 0xE5, 0xB6, 0xB3, 0xC3, 0x8E, 0xE1, 0xDD, 0xF7, 0xDA, 0xEC, + 0x83, 0xC8, 0x5D, 0xA5, 0xE4, 0x1C, 0x9B, 0x2E, 0xD7, 0xFF, 0x81, 0xB3, 0x1D, 0x3F, 0xF2, 0x90, 0xF5, 0xE2, 0xA6, 0x03, + 0xA7, 0x13, 0x37, 0x7D, 0x72, 0xDA, 0x71, 0xD3, 0xE7, 0x24, 0xEB, 0x30, 0x45, 0xC8, 0x8E, 0xB3, 0x43, 0xD5, 0x31, 0xD5, + 0x54, 0x0D, 0xEB, 0xE1, 0xEB, 0xC9, 0x37, 0x89, 0xB3, 0x12, 0xB4, 0x33, 0xD8, 0x44, 0xA1, 0xA5, 0x18, 0x84, 0x86, 0xDB, + 0x90, 0x73, 0x4C, 0xE5, 0x90, 0x5F, 0xD8, 0xF1, 0x91, 0xE9, 0x23, 0xD6, 0x2B, 0x38, 0x6F, 0x61, 0x6C, 0xB8, 0x61, 0x88, + 0x44, 0x8D, 0xC8, 0x5D, 0x05, 0x6A, 0xB8, 0x6A, 0x8B, 0xB1, 0xBB, 0xD6, 0xB3, 0xAA, 0xB2, 0x89, 0x97, 0x64, 0xD3, 0xC4, + 0xD4, 0x18, 0xD4, 0x7E, 0x60, 0xF1, 0xAF, 0xE3, 0x35, 0xAB, 0xD1, 0x10, 0xC4, 0x39, 0x24, 0xC1, 0x0B, 0xBD, 0x80, 0x17, + 0x9A, 0x80, 0x27, 0x64, 0x82, 0x57, 0x62, 0x40, 0xCD, 0xD2, 0x36, 0x88, 0x51, 0xFB, 0x57, 0xAD, 0x8E, 0x55, 0x90, 0xCE, + 0x15, 0x24, 0xA9, 0xC0, 0x95, 0x23, 0x69, 0x9A, 0x75, 0x42, 0xCD, 0xA1, 0x2A, 0xAE, 0x41, 0x28, 0x62, 0xF1, 0x8B, 0x60, + 0x6A, 0x7A, 0xAC, 0x08, 0x21, 0x4B, 0xA4, 0x08, 0x0B, 0xD3, 0x92, 0x34, 0x5D, 0xA9, 0xA0, 0xD5, 0x52, 0x31, 0x44, 0xC9, + 0xD2, 0x78, 0xC9, 0x5F, 0x4F, 0xE3, 0x26, 0xED, 0x4B, 0x46, 0x12, 0xF8, 0x19, 0x73, 0x49, 0x9C, 0xCF, 0xB3, 0x8D, 0xE5, + 0xE6, 0xB7, 0x7C, 0x19, 0xAC, 0xC1, 0x1C, 0xCC, 0xCB, 0xC6, 0xFA, 0xC6, 0x82, 0xDE, 0xAC, 0x3C, 0x9C, 0x7B, 0xB4, 0xF5, + 0xFC, 0x55, 0x7D, 0xD1, 0x5E, 0xF5, 0x8A, 0x14, 0x26, 0xB9, 0x4A, 0xC3, 0xD2, 0xAB, 0x98, 0x46, 0x2B, 0x15, 0xB1, 0xF9, + 0x21, 0x81, 0x0D, 0x66, 0x59, 0x11, 0x44, 0x7B, 0xD2, 0xB6, 0xEF, 0x17, 0x6C, 0xDB, 0x2E, 0x15, 0x23, 0xBC, 0x6C, 0xA9, + 0x62, 0x51, 0x8A, 0x0D, 0xA5, 0x35, 0xD4, 0xDE, 0x1A, 0x59, 0xBB, 0x89, 0xA9, 0x82, 0x0D, 0xD3, 0x97, 0x8E, 0x27, 0x75, + 0xBC, 0x1E, 0x89, 0x1C, 0x06, 0x79, 0x0D, 0x53, 0x1D, 0x8B, 0x9A, 0x7C, 0xF7, 0x2A, 0x56, 0x34, 0x5D, 0x86, 0x21, 0x98, + 0x0C, 0xBC, 0x78, 0x70, 0xA6, 0xA0, 0x46, 0x89, 0xB5, 0xA9, 0xF1, 0x11, 0xF8, 0xFE, 0x71, 0x44, 0xC9, 0x20, 0x85, 0xF1, + 0x11, 0x05, 0xBA, 0x66, 0x58, 0x4D, 0x41, 0x9C, 0x1A, 0x91, 0x6E, 0x63, 0x4A, 0x04, 0xF1, 0x6E, 0x82, 0x3D, 0xAC, 0x4C, + 0xA4, 0xE1, 0x41, 0x37, 0x22, 0xA5, 0x89, 0x1A, 0x83, 0x29, 0x74, 0x37, 0x82, 0xE8, 0x7E, 0x47, 0x47, 0x19, 0x39, 0x2A, + 0xAD, 0x49, 0xF8, 0x42, 0x10, 0xCB, 0x2B, 0xE5, 0x6B, 0xC8, 0xC2, 0x9D, 0x48, 0x88, 0xDC, 0xAB, 0x2E, 0x11, 0x37, 0x7F, + 0xCA, 0x5B, 0x9B, 0x78, 0x4D, 0x56, 0x82, 0xBB, 0x35, 0xD8, 0xFA, 0x3E, 0xA5, 0x16, 0xFC, 0xE0, 0x54, 0xD1, 0x12, 0xD4, + 0xA7, 0x98, 0x4E, 0xD0, 0x0C, 0x8D, 0x18, 0x39, 0x84, 0x07, 0xC4, 0xA2, 0x1A, 0xA6, 0xA8, 0x62, 0xAA, 0x19, 0x8C, 0x59, + 0x95, 0x54, 0x31, 0x5A, 0xD2, 0xFE, 0x4A, 0x59, 0xC0, 0x55, 0x8A, 0xB7, 0x72, 0x29, 0xB3, 0x54, 0xAE, 0xC2, 0x23, 0x96, + 0x47, 0x59, 0xAE, 0xCB, 0x5A, 0x06, 0x61, 0x91, 0xD8, 0xD6, 0x86, 0x8C, 0xE6, 0x89, 0x59, 0xD7, 0x14, 0x9E, 0xD3, 0xD4, + 0xB3, 0xC7, 0x48, 0xCA, 0x27, 0x43, 0x01, 0x94, 0x3A, 0x09, 0xC8, 0xE5, 0xDC, 0xA3, 0x81, 0x5B, 0xE3, 0x59, 0xA2, 0x27, + 0xB9, 0xB4, 0x0A, 0x19, 0x89, 0x26, 0xB5, 0x2C, 0xA3, 0xB6, 0x4E, 0x5C, 0xA6, 0x17, 0xA4, 0x7B, 0xB3, 0x85, 0xFA, 0x59, + 0x2A, 0x7A, 0xFF, 0x3D, 0xC4, 0x3F, 0xDE, 0xCB, 0x8B, 0xC4 +}; +static IFX_Locale* XFA_GetLocaleFromBuffer(FX_LPCBYTE pBuf, int nBufLen) +{ + if (pBuf == NULL || nBufLen <= 0) { + return NULL; + } + CFX_GEModule* pGeModule = CFX_GEModule::Get(); + if (!pGeModule) { + return NULL; + } + CCodec_ModuleMgr* pCodecMgr = pGeModule->GetCodecModule(); + if (!pCodecMgr) { + return NULL; + } + CXML_Element* pLocale = NULL; + FX_LPBYTE pOut = NULL; + FX_DWORD dwSize; + pCodecMgr->GetFlateModule()->FlateOrLZWDecode(FALSE, + pBuf, nBufLen, TRUE, 0, 0, 0, 0, 0, pOut, dwSize); + if (pOut) { + pLocale = CXML_Element::Parse(pOut, dwSize); + FX_Free(pOut); + } + if (pLocale) { + return FX_NEW CXFA_XMLLocale(pLocale); + } + return NULL; +} +static FX_WORD XFA_GetLanguage(CFX_WideString wsLanguage) +{ + FX_WORD dwLangueID = XFA_LANGID_en_US; + if (wsLanguage.GetLength() < 2) { + return dwLangueID; + } + wsLanguage.MakeLower(); + FX_DWORD dwIDFirst = wsLanguage.GetAt(0) << 8 | wsLanguage.GetAt(1); + FX_DWORD dwIDSecond = wsLanguage.GetLength() >= 5 ? wsLanguage.GetAt(3) << 8 | wsLanguage.GetAt(4) : 0; + switch (dwIDFirst) { + case FXBSTR_ID(0, 0, 'z', 'h'): { + if (dwIDSecond == FXBSTR_ID(0, 0, 'c', 'n')) { + dwLangueID = XFA_LANGID_zh_CN; + } else if (dwIDSecond == FXBSTR_ID(0, 0, 't', 'w')) { + dwLangueID = XFA_LANGID_zh_TW; + } else if (dwIDSecond == FXBSTR_ID(0, 0, 'h', 'k')) { + dwLangueID = XFA_LANGID_zh_HK; + } + } + break; + case FXBSTR_ID(0, 0, 'j', 'a'): + dwLangueID = XFA_LANGID_ja_JP; + break; + case FXBSTR_ID(0, 0, 'k', 'o'): + dwLangueID = XFA_LANGID_ko_KR; + break; + case FXBSTR_ID(0, 0, 'e', 'n'): { + if (dwIDSecond == FXBSTR_ID(0, 0, 'g', 'b')) { + dwLangueID = XFA_LANGID_en_GB; + } else { + dwLangueID = XFA_LANGID_en_US; + } + } + break; + case FXBSTR_ID(0, 0, 'd', 'e'): + dwLangueID = XFA_LANGID_de_DE; + break; + case FXBSTR_ID(0, 0, 'f', 'r'): + dwLangueID = XFA_LANGID_fr_FR; + break; + case FXBSTR_ID(0, 0, 'e', 's'): { + if (dwIDSecond == FXBSTR_ID(0, 0, 'e', 's')) { + dwLangueID = XFA_LANGID_es_ES; + } else { + dwLangueID = XFA_LANGID_es_LA; + } + } + break; + case FXBSTR_ID(0, 0, 'i', 't'): + dwLangueID = XFA_LANGID_it_IT; + break; + case FXBSTR_ID(0, 0, 'p', 't'): + dwLangueID = XFA_LANGID_pt_BR; + break; + case FXBSTR_ID(0, 0, 'n', 'l'): + dwLangueID = XFA_LANGID_nl_NL; + break; + case FXBSTR_ID(0, 0, 'r', 'u'): + dwLangueID = XFA_LANGID_ru_RU; + break; + } + return dwLangueID; +} +CXFA_LocaleMgr::CXFA_LocaleMgr(CXFA_Node* pLocaleSet, CFX_WideString wsDeflcid) + : m_dwLocaleFlags(0x00) +{ + m_dwDeflcid = XFA_GetLanguage(wsDeflcid); + CXFA_Node* pNodeLocale = NULL; + if (pLocaleSet && (pNodeLocale = pLocaleSet->GetNodeItem(XFA_NODEITEM_FirstChild))) { + while (pNodeLocale) { + m_LocaleArray.Add(FX_NEW CXFA_NodeLocale(pNodeLocale)); + pNodeLocale = pNodeLocale->GetNodeItem(XFA_NODEITEM_NextSibling); + } + } + m_pDefLocale = GetLocaleByName(wsDeflcid); +} +CXFA_LocaleMgr::~CXFA_LocaleMgr() +{ + FX_INT32 iCount = m_LocaleArray.GetSize(); + for (FX_INT32 i = 0; i < iCount; i++) { + ((IFX_Locale*)m_LocaleArray[i])->Release(); + } + FX_INT32 iXmls = m_XMLLocaleArray.GetSize(); + for (FX_INT32 j = 0; j < iXmls; j++) { + ((IFX_Locale*)m_XMLLocaleArray[j])->Release(); + } +} +void CXFA_LocaleMgr::Release() +{ + delete this; +} +FX_WORD CXFA_LocaleMgr::GetDefLocaleID() +{ + return m_dwDeflcid; +} +IFX_Locale* CXFA_LocaleMgr::GetDefLocale() +{ + if (m_pDefLocale) { + return m_pDefLocale; + } else if (m_LocaleArray.GetSize()) { + return (IFX_Locale*)m_LocaleArray[0]; + } else if (m_XMLLocaleArray.GetSize()) { + return (IFX_Locale*)m_XMLLocaleArray[0]; + } + m_pDefLocale = GetLocale(m_dwDeflcid); + if (m_pDefLocale != NULL) { + m_XMLLocaleArray.Add(m_pDefLocale); + } + return m_pDefLocale; +} +IFX_Locale* CXFA_LocaleMgr::GetLocale(FX_WORD lcid) +{ + IFX_Locale* pLocal = NULL; + switch (lcid) { + case XFA_LANGID_zh_CN: + pLocal = XFA_GetLocaleFromBuffer(g_zhCN_Locale, sizeof(g_zhCN_Locale)); + break; + case XFA_LANGID_zh_TW: + pLocal = XFA_GetLocaleFromBuffer(g_zhTW_Locale, sizeof(g_zhTW_Locale)); + break; + case XFA_LANGID_zh_HK: + pLocal = XFA_GetLocaleFromBuffer(g_zhHK_Locale, sizeof(g_zhHK_Locale)); + break; + case XFA_LANGID_ja_JP: + pLocal = XFA_GetLocaleFromBuffer(g_jaJP_Locale, sizeof(g_jaJP_Locale)); + break; + case XFA_LANGID_ko_KR: + pLocal = XFA_GetLocaleFromBuffer(g_koKR_Locale, sizeof(g_koKR_Locale)); + break; + case XFA_LANGID_en_GB: + pLocal = XFA_GetLocaleFromBuffer(g_enGB_Locale, sizeof(g_enGB_Locale)); + break; + case XFA_LANGID_es_LA: + pLocal = XFA_GetLocaleFromBuffer(g_esLA_Locale, sizeof(g_esLA_Locale)); + break; + case XFA_LANGID_es_ES: + pLocal = XFA_GetLocaleFromBuffer(g_esES_Locale, sizeof(g_esES_Locale)); + break; + case XFA_LANGID_de_DE: + pLocal = XFA_GetLocaleFromBuffer(g_deDE_Loacale, sizeof(g_deDE_Loacale)); + break; + case XFA_LANGID_fr_FR: + pLocal = XFA_GetLocaleFromBuffer(g_frFR_Locale, sizeof(g_frFR_Locale)); + break; + case XFA_LANGID_it_IT: + pLocal = XFA_GetLocaleFromBuffer(g_itIT_Locale, sizeof(g_itIT_Locale)); + break; + case XFA_LANGID_pt_BR: + pLocal = XFA_GetLocaleFromBuffer(g_ptBR_Locale, sizeof(g_ptBR_Locale)); + break; + case XFA_LANGID_nl_NL: + pLocal = XFA_GetLocaleFromBuffer(g_nlNL_Locale, sizeof(g_nlNL_Locale)); + break; + case XFA_LANGID_ru_RU: + pLocal = XFA_GetLocaleFromBuffer(g_ruRU_Locale, sizeof(g_ruRU_Locale)); + break; + case XFA_LANGID_en_US: + default: + pLocal = XFA_GetLocaleFromBuffer(g_enUS_Locale, sizeof(g_enUS_Locale)); + break; + } + return pLocal; +} +IFX_Locale* CXFA_LocaleMgr::GetLocaleByName(FX_WSTR wsLocaleName) +{ + FX_INT32 iCount = m_LocaleArray.GetSize(); + FX_INT32 i = 0; + for (i = 0; i < iCount; i++) { + IFX_Locale* pLocale = ((IFX_Locale*)m_LocaleArray[i]); + if (pLocale->GetName() == wsLocaleName) { + return pLocale; + } + } + FX_INT32 iLen = wsLocaleName.GetLength(); + if (iLen < 2) { + return NULL; + } + iCount = m_XMLLocaleArray.GetSize(); + for (i = 0; i < iCount; i++) { + IFX_Locale* pLocale = ((IFX_Locale*)m_XMLLocaleArray[i]); + if (pLocale->GetName() == wsLocaleName) { + return pLocale; + } + } + FX_WORD dwLangueID = XFA_GetLanguage(wsLocaleName); + IFX_Locale* pLocale = GetLocale(dwLangueID); + if (pLocale != NULL) { + m_XMLLocaleArray.Add(pLocale); + } + return pLocale; +} +void CXFA_LocaleMgr::SetDefLocale(IFX_Locale* pLocale) +{ + m_pDefLocale = pLocale; +} +CFX_WideStringC CXFA_LocaleMgr::GetConfigLocaleName(CXFA_Node* pConfig) +{ + if (!(m_dwLocaleFlags & 0x01)) { + m_wsConfigLocale.Empty(); + if (pConfig) { + CXFA_Node* pChildfConfig = pConfig->GetFirstChildByClass(XFA_ELEMENT_Acrobat); + if (!pChildfConfig) { + pChildfConfig = pConfig->GetFirstChildByClass(XFA_ELEMENT_Present); + } + CXFA_Node* pCommon = pChildfConfig ? pChildfConfig->GetFirstChildByClass(XFA_ELEMENT_Common) : NULL; + CXFA_Node* pLocale = pCommon ? pCommon->GetFirstChildByClass(XFA_ELEMENT_Locale) : NULL; + if (pLocale) { + pLocale->TryCData(XFA_ATTRIBUTE_Value, m_wsConfigLocale, FALSE); + } + } + m_dwLocaleFlags |= 0x01; + } + return m_wsConfigLocale; +} +static CXFA_TimeZoneProvider *g_pProvider = NULL; +IXFA_TimeZoneProvider* IXFA_TimeZoneProvider::Create() +{ + FXSYS_assert(!g_pProvider); + g_pProvider = FX_NEW CXFA_TimeZoneProvider(); + return g_pProvider; +} +IXFA_TimeZoneProvider* IXFA_TimeZoneProvider::Get() +{ + if (!g_pProvider) { + g_pProvider = FX_NEW CXFA_TimeZoneProvider(); + } + return g_pProvider; +} +void IXFA_TimeZoneProvider::Destroy() +{ + delete g_pProvider; + g_pProvider = NULL; +} +#include +CXFA_TimeZoneProvider::CXFA_TimeZoneProvider() +{ +#if _FXM_PLATFORM_==_FXM_PLATFORM_WINDOWS_ + _tzset(); + m_tz.tzHour = (FX_INT8)(_timezone / 3600 * -1); + m_tz.tzMinute = (FX_INT8)((FXSYS_abs(_timezone) % 3600) / 60); +#else + tzset(); + m_tz.tzHour = (FX_INT8)(timezone / 3600 * -1); + m_tz.tzMinute = (FX_INT8)((FXSYS_abs((int)timezone) % 3600) / 60); +#endif +} +CXFA_TimeZoneProvider::~CXFA_TimeZoneProvider() +{ +} +void CXFA_TimeZoneProvider::SetTimeZone(FX_TIMEZONE& tz) +{ + m_tz = tz; +} +void CXFA_TimeZoneProvider::GetTimeZone(FX_TIMEZONE& tz) +{ + tz = m_tz; +} diff --git a/xfa/src/fxfa/src/parser/xfa_localevalue.cpp b/xfa/src/fxfa/src/parser/xfa_localevalue.cpp new file mode 100644 index 0000000000..469589bad8 --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_localevalue.cpp @@ -0,0 +1,976 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_utils.h" +#include "../common/xfa_object.h" +#include "../common/xfa_document.h" +#include "../common/xfa_parser.h" +#include "../common/xfa_script.h" +#include "../common/xfa_docdata.h" +#include "../common/xfa_doclayout.h" +#include "../common/xfa_debug.h" +#include "../common/xfa_localemgr.h" +#include "../common/xfa_fm2jsapi.h" +#include "xfa_debug_parser.h" +static const FX_DOUBLE fraction_scales[] = {0.1, 0.01, 0.001, 0.0001, 0.00001, 0.000001, + 0.0000001, 0.00000001, 0.000000001, 0.0000000001, 0.00000000001, 0.000000000001, + 0.0000000000001, 0.00000000000001, 0.000000000000001, 0.0000000000000001 + }; +static FX_BOOL IsAlpha(FX_WCHAR c) +{ + return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); +} +CXFA_LocaleValue::CXFA_LocaleValue() +{ + m_dwType = XFA_VT_NULL; + m_bValid = TRUE; + m_pLocaleMgr = NULL; +} +CXFA_LocaleValue::CXFA_LocaleValue(const CXFA_LocaleValue& value) +{ + m_dwType = XFA_VT_NULL; + m_bValid = TRUE; + m_pLocaleMgr = NULL; + *this = value; +} +CXFA_LocaleValue::CXFA_LocaleValue(FX_DWORD dwType, CXFA_LocaleMgr* pLocaleMgr) +{ + m_dwType = dwType; + m_bValid = (m_dwType != XFA_VT_NULL); + m_pLocaleMgr = pLocaleMgr; +} +CXFA_LocaleValue::CXFA_LocaleValue(FX_DWORD dwType, const CFX_WideString& wsValue, CXFA_LocaleMgr* pLocaleMgr) +{ + m_wsValue = wsValue; + m_dwType = dwType; + m_pLocaleMgr = pLocaleMgr; + m_bValid = ValidateCanonicalValue(wsValue, dwType); +} +CXFA_LocaleValue::CXFA_LocaleValue(FX_DWORD dwType, const CFX_WideString& wsValue, const CFX_WideString& wsFormat, IFX_Locale* pLocale, CXFA_LocaleMgr* pLocaleMgr) +{ + m_pLocaleMgr = pLocaleMgr; + m_bValid = TRUE; + m_dwType = dwType; + m_bValid = ParsePatternValue(wsValue, wsFormat, pLocale); +} +CXFA_LocaleValue& CXFA_LocaleValue::operator = (const CXFA_LocaleValue& value) +{ + m_wsValue = value.m_wsValue; + m_dwType = value.m_dwType; + m_bValid = value.m_bValid; + m_pLocaleMgr = value.m_pLocaleMgr; + return *this; +} +CXFA_LocaleValue::~CXFA_LocaleValue() +{ +} +static FX_LOCALECATEGORY XFA_ValugeCategory(FX_LOCALECATEGORY eCategory, FX_DWORD dwValueType) +{ + if (eCategory == FX_LOCALECATEGORY_Unknown) { + switch (dwValueType) { + case XFA_VT_BOOLEAN: + case XFA_VT_INTEGER: + case XFA_VT_DECIMAL: + case XFA_VT_FLOAT: + return FX_LOCALECATEGORY_Num; + case XFA_VT_TEXT: + return FX_LOCALECATEGORY_Text; + case XFA_VT_DATE: + return FX_LOCALECATEGORY_Date; + case XFA_VT_TIME: + return FX_LOCALECATEGORY_Time; + case XFA_VT_DATETIME: + return FX_LOCALECATEGORY_DateTime; + } + } + return eCategory; +} +FX_BOOL CXFA_LocaleValue::ValidateValue(const CFX_WideString& wsValue, const CFX_WideString& wsPattern, IFX_Locale* pLocale, CFX_WideString* pMatchFormat ) +{ + CFX_WideString wsOutput; + IFX_Locale* locale = m_pLocaleMgr->GetDefLocale(); + if (pLocale) { + m_pLocaleMgr->SetDefLocale(pLocale); + } + IFX_FormatString* pFormat = IFX_FormatString::Create(m_pLocaleMgr, FALSE); + CFX_WideStringArray wsPatterns; + pFormat->SplitFormatString(wsPattern, wsPatterns); + FX_BOOL bRet = FALSE; + FX_INT32 iCount = wsPatterns.GetSize(); + FX_INT32 i = 0; + for (; i < iCount && !bRet; i++) { + CFX_WideString wsFormat = wsPatterns[i]; + FX_LOCALECATEGORY eCategory = pFormat->GetCategory(wsFormat); + eCategory = XFA_ValugeCategory(eCategory, m_dwType); + switch (eCategory) { + case FX_LOCALECATEGORY_Null: + bRet = pFormat->ParseNull(wsValue, wsFormat); + if (!bRet) { + bRet = wsValue.IsEmpty(); + } + break; + case FX_LOCALECATEGORY_Zero: + bRet = pFormat->ParseZero(wsValue, wsFormat); + if (!bRet) { + bRet = wsValue == FX_WSTRC(L"0"); + } + break; + case FX_LOCALECATEGORY_Num: { + CFX_WideString fNum; + bRet = pFormat->ParseNum(wsValue, wsFormat, fNum); + if (!bRet) { + bRet = pFormat->FormatNum(wsValue, wsFormat, wsOutput); + } + break; + } + case FX_LOCALECATEGORY_Text: + bRet = pFormat->ParseText(wsValue, wsFormat, wsOutput); + wsOutput.Empty(); + if (!bRet) { + bRet = pFormat->FormatText(wsValue, wsFormat, wsOutput); + } + break; + case FX_LOCALECATEGORY_Date: { + CFX_Unitime dt; + bRet = ValidateCanonicalDate(wsValue, dt); + if (!bRet) { + bRet = pFormat->ParseDateTime(wsValue, wsFormat, FX_DATETIMETYPE_Date, dt); + if (!bRet) { + bRet = pFormat->FormatDateTime(wsValue, wsFormat, wsOutput, FX_DATETIMETYPE_Date); + } + } + break; + } + case FX_LOCALECATEGORY_Time: { + CFX_Unitime dt; + bRet = pFormat->ParseDateTime(wsValue, wsFormat, FX_DATETIMETYPE_Time, dt); + if (!bRet) { + bRet = pFormat->FormatDateTime(wsValue, wsFormat, wsOutput, FX_DATETIMETYPE_Time); + } + break; + } + case FX_LOCALECATEGORY_DateTime: { + CFX_Unitime dt; + bRet = pFormat->ParseDateTime(wsValue, wsFormat, FX_DATETIMETYPE_DateTime, dt); + if (!bRet) { + bRet = pFormat->FormatDateTime(wsValue, wsFormat, wsOutput, FX_DATETIMETYPE_DateTime); + } + break; + } + default: + bRet = FALSE; + break; + } + } + if (bRet && pMatchFormat) { + *pMatchFormat = wsPatterns[i - 1]; + } + pFormat->Release(); + if (pLocale) { + m_pLocaleMgr->SetDefLocale(locale); + } + return bRet; +} +CFX_WideString CXFA_LocaleValue::GetValue() const +{ + return m_wsValue; +} +FX_DWORD CXFA_LocaleValue::GetType() const +{ + return m_dwType; +} +void CXFA_LocaleValue::SetValue(const CFX_WideString& wsValue, FX_DWORD dwType) +{ + m_wsValue = wsValue; + m_dwType = dwType; +} +CFX_WideString CXFA_LocaleValue::GetText() const +{ + if (m_bValid && m_dwType == XFA_VT_TEXT) { + return m_wsValue; + } + return CFX_WideString(); +} +FX_FLOAT CXFA_LocaleValue::GetNum() const +{ + if (m_bValid && (m_dwType == XFA_VT_BOOLEAN || m_dwType == XFA_VT_INTEGER || + m_dwType == XFA_VT_DECIMAL || m_dwType == XFA_VT_FLOAT)) { + FX_INT64 nIntegral = 0; + FX_DWORD dwFractional = 0; + FX_INT32 nExponent = 0; + int cc = 0; + FX_BOOL bNegative = FALSE, bExpSign = FALSE; + FX_LPCWSTR str = (FX_LPCWSTR)m_wsValue; + int len = m_wsValue.GetLength(); + while (XFA_IsSpace(str[cc]) && cc < len) { + cc++; + } + if (cc >= len) { + return 0; + } + if (str[0] == '+') { + cc++; + } else if (str[0] == '-') { + bNegative = TRUE; + cc++; + } + int nIntegralLen = 0; + while (cc < len) { + if (str[cc] == '.' || !XFA_IsDigit(str[cc]) || nIntegralLen > 17) { + break; + } + nIntegral = nIntegral * 10 + str[cc] - '0'; + cc ++; + nIntegralLen++; + } + nIntegral = bNegative ? -nIntegral : nIntegral; + int scale = 0; + double fraction = 0.0; + if (cc < len && str[cc] == '.') { + cc ++; + while (cc < len) { + fraction += fraction_scales[scale] * (str[cc] - '0'); + scale ++; + cc ++; + if (scale == sizeof fraction_scales / sizeof(double) + || !XFA_IsDigit(str[cc])) { + break; + } + } + dwFractional = (FX_DWORD)(fraction * 4294967296.0); + } + if (cc < len && (str[cc] == 'E' || str[cc] == 'e')) { + cc ++; + if (cc < len) { + if (str[cc] == '+') { + cc++; + } else if (str[cc] == '-') { + bExpSign = TRUE; + cc++; + } + } + while (cc < len) { + if (str[cc] == '.' || !XFA_IsDigit(str[cc])) { + break; + } + nExponent = nExponent * 10 + str[cc] - '0'; + cc ++; + } + nExponent = bExpSign ? -nExponent : nExponent; + } + FX_FLOAT fValue = (FX_FLOAT)(dwFractional / 4294967296.0); + fValue = nIntegral + (nIntegral >= 0 ? fValue : -fValue); + if (nExponent != 0) { + fValue *= FXSYS_pow(10, (FX_FLOAT)nExponent); + } + return fValue; + } + return 0; +} +FX_DOUBLE CXFA_LocaleValue::GetDoubleNum() const +{ + if (m_bValid && (m_dwType == XFA_VT_BOOLEAN || m_dwType == XFA_VT_INTEGER || + m_dwType == XFA_VT_DECIMAL || m_dwType == XFA_VT_FLOAT)) { + FX_INT64 nIntegral = 0; + FX_DWORD dwFractional = 0; + FX_INT32 nExponent = 0; + FX_INT32 cc = 0; + FX_BOOL bNegative = FALSE, bExpSign = FALSE; + FX_LPCWSTR str = (FX_LPCWSTR)m_wsValue; + int len = m_wsValue.GetLength(); + while (XFA_IsSpace(str[cc]) && cc < len) { + cc++; + } + if (cc >= len) { + return 0; + } + if (str[0] == '+') { + cc++; + } else if (str[0] == '-') { + bNegative = TRUE; + cc++; + } + FX_INT32 nIntegralLen = 0; + while (cc < len) { + if (str[cc] == '.' || !XFA_IsDigit(str[cc]) || nIntegralLen > 17) { + break; + } + nIntegral = nIntegral * 10 + str[cc] - '0'; + cc ++; + nIntegralLen++; + } + nIntegral = bNegative ? -nIntegral : nIntegral; + FX_INT32 scale = 0; + FX_DOUBLE fraction = 0.0; + if (cc < len && str[cc] == '.') { + cc ++; + while (cc < len) { + fraction += fraction_scales[scale] * (str[cc] - '0'); + scale ++; + cc ++; + if (scale == sizeof fraction_scales / sizeof(FX_DOUBLE) + || !XFA_IsDigit(str[cc])) { + break; + } + } + dwFractional = (FX_DWORD)(fraction * 4294967296.0); + } + if (cc < len && (str[cc] == 'E' || str[cc] == 'e')) { + cc ++; + if (cc < len) { + if (str[cc] == '+') { + cc++; + } else if (str[cc] == '-') { + bExpSign = TRUE; + cc++; + } + } + while (cc < len) { + if (str[cc] == '.' || !XFA_IsDigit(str[cc])) { + break; + } + nExponent = nExponent * 10 + str[cc] - '0'; + cc ++; + } + nExponent = bExpSign ? -nExponent : nExponent; + } + FX_DOUBLE dValue = (dwFractional / 4294967296.0); + dValue = nIntegral + (nIntegral >= 0 ? dValue : -dValue); + if (nExponent != 0) { + dValue *= FXSYS_pow(10, (FX_FLOAT)nExponent); + } + return dValue; + } + return 0; +} +CFX_Unitime CXFA_LocaleValue::GetDate() const +{ + if (m_bValid && m_dwType == XFA_VT_DATE) { + CFX_Unitime dt; + FX_DateFromCanonical(m_wsValue, dt); + return dt; + } + return CFX_Unitime(); +} +CFX_Unitime CXFA_LocaleValue::GetTime() const +{ + if (m_bValid && m_dwType == XFA_VT_TIME) { + CFX_Unitime dt(0); + FXSYS_assert(m_pLocaleMgr); + FX_TimeFromCanonical(m_wsValue, dt, m_pLocaleMgr->GetDefLocale()); + return dt; + } + return CFX_Unitime(); +} +CFX_Unitime CXFA_LocaleValue::GetDateTime() const +{ + if (m_bValid && m_dwType == XFA_VT_DATETIME) { + FX_INT32 index = m_wsValue.Find('T'); + CFX_Unitime dt; + FX_DateFromCanonical(m_wsValue.Left(index), dt); + FXSYS_assert(m_pLocaleMgr); + FX_TimeFromCanonical(m_wsValue.Right(m_wsValue.GetLength() - index - 1), dt, m_pLocaleMgr->GetDefLocale()); + return dt; + } + return CFX_Unitime(); +} +FX_BOOL CXFA_LocaleValue::SetText(const CFX_WideString& wsText) +{ + m_dwType = XFA_VT_TEXT; + m_wsValue = wsText; + return TRUE; +} +FX_BOOL CXFA_LocaleValue::SetText(const CFX_WideString& wsText, const CFX_WideString& wsFormat, IFX_Locale* pLocale) +{ + m_dwType = XFA_VT_TEXT; + return m_bValid = ParsePatternValue(wsText, wsFormat, pLocale); +} +FX_BOOL CXFA_LocaleValue::SetNum(FX_FLOAT fNum) +{ + m_dwType = XFA_VT_FLOAT; + m_wsValue.Format((FX_LPCWSTR)L"%.8g", (FX_DOUBLE)fNum); + return TRUE; +} +FX_BOOL CXFA_LocaleValue::SetNum(const CFX_WideString& wsNum, const CFX_WideString& wsFormat, + IFX_Locale* pLocale) +{ + m_dwType = XFA_VT_FLOAT; + return m_bValid = ParsePatternValue(wsNum, wsFormat, pLocale); +} +FX_BOOL CXFA_LocaleValue::SetDate(const CFX_Unitime& d) +{ + m_dwType = XFA_VT_DATE; + m_wsValue.Format((FX_LPCWSTR)L"%04d-%02d-%02d", d.GetYear(), d.GetMonth(), d.GetDay()); + return TRUE; +} +FX_BOOL CXFA_LocaleValue::SetDate(const CFX_WideString& wsDate, const CFX_WideString& wsFormat, IFX_Locale* pLocale) +{ + m_dwType = XFA_VT_DATE; + return m_bValid = ParsePatternValue(wsDate, wsFormat, pLocale); +} +FX_BOOL CXFA_LocaleValue::SetTime(const CFX_Unitime& t) +{ + m_dwType = XFA_VT_TIME; + m_wsValue.Format((FX_LPCWSTR)L"%02d:%02d:%02d", t.GetHour(), t.GetMinute(), t.GetSecond()); + if (t.GetMillisecond() > 0) { + CFX_WideString wsTemp; + wsTemp.Format((FX_LPCWSTR)L"%:03d", t.GetMillisecond()); + m_wsValue += wsTemp; + } + return TRUE; +} +FX_BOOL CXFA_LocaleValue::SetTime(const CFX_WideString& wsTime, const CFX_WideString& wsFormat, IFX_Locale* pLocale) +{ + m_dwType = XFA_VT_TIME; + return m_bValid = ParsePatternValue(wsTime, wsFormat, pLocale); +} +FX_BOOL CXFA_LocaleValue::SetDateTime(const CFX_Unitime& dt) +{ + m_dwType = XFA_VT_DATETIME; + m_wsValue.Format((FX_LPCWSTR)L"%04d-%02d-%02dT%02d:%02d:%02d", dt.GetYear(), dt.GetMonth(), dt.GetDay(), + dt.GetHour(), dt.GetMinute(), dt.GetSecond()); + if (dt.GetMillisecond() > 0) { + CFX_WideString wsTemp; + wsTemp.Format((FX_LPCWSTR)L"%:03d", dt.GetMillisecond()); + m_wsValue += wsTemp; + } + return TRUE; +} +FX_BOOL CXFA_LocaleValue::SetDateTime(const CFX_WideString& wsDateTime, + const CFX_WideString& wsFormat, IFX_Locale* pLocale) +{ + m_dwType = XFA_VT_DATETIME; + return m_bValid = ParsePatternValue(wsDateTime, wsFormat, pLocale); +} +FX_BOOL CXFA_LocaleValue::FormatPatterns(CFX_WideString& wsResult, const CFX_WideString& wsFormat, IFX_Locale* pLocale, + XFA_VALUEPICTURE eValueType) const +{ + wsResult.Empty(); + FX_BOOL bRet = FALSE; + IFX_FormatString* pFormat = IFX_FormatString::Create(m_pLocaleMgr, FALSE); + CFX_WideStringArray wsPatterns; + pFormat->SplitFormatString(wsFormat, wsPatterns); + FX_INT32 iCount = wsPatterns.GetSize(); + for (FX_INT32 i = 0; i < iCount; i++) { + bRet = FormatSinglePattern(wsResult, wsPatterns[i], pLocale, eValueType); + if (bRet) { + break; + } + } + pFormat->Release(); + return bRet; +} +FX_BOOL CXFA_LocaleValue::FormatSinglePattern(CFX_WideString& wsResult, const CFX_WideString& wsFormat, IFX_Locale* pLocale, + XFA_VALUEPICTURE eValueType) const +{ + IFX_Locale* locale = m_pLocaleMgr->GetDefLocale(); + if (pLocale) { + m_pLocaleMgr->SetDefLocale(pLocale); + } + wsResult.Empty(); + FX_BOOL bRet = FALSE; + IFX_FormatString* pFormat = IFX_FormatString::Create(m_pLocaleMgr, FALSE); + FX_LOCALECATEGORY eCategory = pFormat->GetCategory(wsFormat); + eCategory = XFA_ValugeCategory(eCategory, m_dwType); + switch (eCategory) { + case FX_LOCALECATEGORY_Null: + if (m_wsValue.IsEmpty()) { + bRet = pFormat->FormatNull(wsFormat, wsResult); + } + break; + case FX_LOCALECATEGORY_Zero: + if (m_wsValue == FX_WSTRC(L"0")) { + bRet = pFormat->FormatZero(wsFormat, wsResult); + } + break; + case FX_LOCALECATEGORY_Num: + bRet = pFormat->FormatNum(m_wsValue, wsFormat, wsResult); + break; + case FX_LOCALECATEGORY_Text: + bRet = pFormat->FormatText(m_wsValue, wsFormat, wsResult); + break; + case FX_LOCALECATEGORY_Date: + bRet = pFormat->FormatDateTime(m_wsValue, wsFormat, wsResult, FX_DATETIMETYPE_Date); + break; + case FX_LOCALECATEGORY_Time: + bRet = pFormat->FormatDateTime(m_wsValue, wsFormat, wsResult, FX_DATETIMETYPE_Time); + break; + case FX_LOCALECATEGORY_DateTime: + bRet = pFormat->FormatDateTime(m_wsValue, wsFormat, wsResult, FX_DATETIMETYPE_DateTime); + break; + default: + wsResult = m_wsValue; + bRet = TRUE; + } + pFormat->Release(); + if (!bRet && (eCategory != FX_LOCALECATEGORY_Num || eValueType != XFA_VALUEPICTURE_Display)) { + wsResult = m_wsValue; + } + if (pLocale) { + m_pLocaleMgr->SetDefLocale(locale); + } + return bRet; +} +static FX_BOOL XFA_ValueSplitDateTime(const CFX_WideString& wsDateTime, CFX_WideString& wsDate, CFX_WideString& wsTime) +{ + wsDate = L""; + wsTime = L""; + if (wsDateTime.IsEmpty()) { + return FALSE; + } + int nSplitIndex = -1; + nSplitIndex = wsDateTime.Find('T'); + if (nSplitIndex < 0) { + nSplitIndex = wsDateTime.Find(' '); + } + if (nSplitIndex < 0) { + return FALSE; + } + wsDate = wsDateTime.Left(nSplitIndex); + wsTime = wsDateTime.Right(wsDateTime.GetLength() - nSplitIndex - 1); + return TRUE; +} +FX_BOOL CXFA_LocaleValue::ValidateCanonicalValue(const CFX_WideString& wsValue, FX_DWORD dwVType) +{ + if (wsValue.IsEmpty()) { + return TRUE; + } + CFX_Unitime dt; + switch (dwVType) { + case XFA_VT_DATE: { + if (ValidateCanonicalDate(wsValue, dt)) { + return TRUE; + } + CFX_WideString wsDate, wsTime; + if (XFA_ValueSplitDateTime(wsValue, wsDate, wsTime) && ValidateCanonicalDate(wsDate, dt)) { + return TRUE; + } + return FALSE; + } + case XFA_VT_TIME: { + if (ValidateCanonicalTime(wsValue)) { + return TRUE; + } + CFX_WideString wsDate, wsTime; + if (XFA_ValueSplitDateTime(wsValue, wsDate, wsTime) && ValidateCanonicalTime(wsTime)) { + return TRUE; + } + return FALSE; + } + case XFA_VT_DATETIME: { + CFX_WideString wsDate, wsTime; + if (XFA_ValueSplitDateTime(wsValue, wsDate, wsTime) && ValidateCanonicalDate(wsDate, dt) && ValidateCanonicalTime(wsTime)) { + return TRUE; + } + } + break; + } + return TRUE; +} +FX_BOOL CXFA_LocaleValue::ValidateCanonicalDate(const CFX_WideString& wsDate, CFX_Unitime& unDate) +{ + const FX_WORD LastDay[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + const FX_WORD wCountY = 4, wCountM = 2, wCountD = 2; + int nLen = wsDate.GetLength(); + if (nLen < wCountY || nLen > wCountY + wCountM + wCountD + 2) { + return FALSE; + } + FX_BOOL bSymbol = (wsDate.Find(0x2D) == -1) ? FALSE : TRUE; + FX_WORD wYear = 0, wMonth = 0, wDay = 0; + FX_LPCWSTR pDate = (FX_LPCWSTR)wsDate; + int nIndex = 0, nStart = 0; + while (pDate[nIndex] != '\0' && nIndex < wCountY) { + if (!XFA_IsDigit(pDate[nIndex])) { + return FALSE; + } + wYear = (pDate[nIndex] - '0') + wYear * 10; + nIndex++; + } + if (bSymbol) { + if (pDate[nIndex] != 0x2D) { + return FALSE; + } + nIndex++; + } + nStart = nIndex; + while (pDate[nIndex] != '\0' && nIndex - nStart < wCountM && nIndex < nLen) { + if (!XFA_IsDigit(pDate[nIndex])) { + return FALSE; + } + wMonth = (pDate[nIndex] - '0') + wMonth * 10; + nIndex++; + } + if (bSymbol) { + if (pDate[nIndex] != 0x2D) { + return FALSE; + } + nIndex++; + } + nStart = nIndex; + while (pDate[nIndex] != '\0' && nIndex - nStart < wCountD && nIndex < nLen) { + if (!XFA_IsDigit(pDate[nIndex])) { + return FALSE; + } + wDay = (pDate[nIndex] - '0') + wDay * 10; + nIndex++; + } + if (nIndex != nLen) { + return FALSE; + } + if (wYear < 1900 || wYear > 2029) { + return FALSE; + } + if (wMonth < 1 || wMonth > 12) { + if (wMonth == 0 && nLen == wCountY) { + return TRUE; + } + return FALSE; + } + if (wDay < 1) { + if (wDay == 0 && (nLen == wCountY + wCountM)) { + return TRUE; + } + return FALSE; + } + if (wMonth == 2) { + if (wYear % 400 == 0 || (wYear % 100 != 0 && wYear % 4 == 0)) { + if (wDay > 29) { + return FALSE; + } + } else { + if (wDay > 28) { + return FALSE; + } + } + } else if (wDay > LastDay[wMonth - 1]) { + return FALSE; + } + CFX_Unitime ut; + ut.Set(wYear, wMonth, wDay); + unDate = unDate + ut; + return TRUE; +} +FX_BOOL CXFA_LocaleValue::ValidateCanonicalTime(const CFX_WideString& wsTime) +{ + int nLen = wsTime.GetLength(); + if (nLen < 2) { + return FALSE; + } + const FX_WORD wCountH = 2, wCountM = 2, wCountS = 2, wCountF = 3; + FX_BOOL bSymbol = (wsTime.Find(':') == -1) ? FALSE : TRUE; + FX_WORD wHour = 0, wMinute = 0, wSecond = 0, wFraction = 0; + FX_LPCWSTR pTime = (FX_LPCWSTR)wsTime; + int nIndex = 0, nStart = 0; + while (pTime[nIndex] != '\0' && nIndex - nStart < wCountH) { + if (!XFA_IsDigit(pTime[nIndex])) { + return FALSE; + } + wHour = (pTime[nIndex] - '0') + wHour * 10; + nIndex++; + } + if (bSymbol) { + if (nIndex < nLen && pTime[nIndex] != ':') { + return FALSE; + } + nIndex++; + } + nStart = nIndex; + while (pTime[nIndex] != '\0' && nIndex - nStart < wCountM && nIndex < nLen) { + if (!XFA_IsDigit(pTime[nIndex])) { + return FALSE; + } + wMinute = (pTime[nIndex] - '0') + wMinute * 10; + nIndex++; + } + if (bSymbol) { + if (nIndex < nLen && pTime[nIndex] != ':') { + return FALSE; + } + nIndex++; + } + nStart = nIndex; + while (pTime[nIndex] != '\0' && nIndex - nStart < wCountS && nIndex < nLen) { + if (!XFA_IsDigit(pTime[nIndex])) { + return FALSE; + } + wSecond = (pTime[nIndex] - '0') + wSecond * 10; + nIndex++; + } + if (wsTime.Find('.') > 0) { + if (pTime[nIndex] != '.') { + return FALSE; + } + nIndex++; + nStart = nIndex; + while (pTime[nIndex] != '\0' && nIndex - nStart < wCountF && nIndex < nLen) { + if (!XFA_IsDigit(pTime[nIndex])) { + return FALSE; + } + wFraction = (pTime[nIndex] - '0') + wFraction * 10; + nIndex++; + } + } + if (nIndex < nLen) { + if (pTime[nIndex] == 'Z') { + nIndex++; + } else if (pTime[nIndex] == '-' || pTime[nIndex] == '+') { + FX_SHORT nOffsetH = 0, nOffsetM = 0; + nIndex++; + nStart = nIndex; + while (pTime[nIndex] != '\0' && nIndex - nStart < wCountH && nIndex < nLen) { + if (!XFA_IsDigit(pTime[nIndex])) { + return FALSE; + } + nOffsetH = (pTime[nIndex] - '0') + nOffsetH * 10; + nIndex++; + } + if (bSymbol) { + if (nIndex < nLen && pTime[nIndex] != ':') { + return FALSE; + } + nIndex++; + } + nStart = nIndex; + while (pTime[nIndex] != '\0' && nIndex - nStart < wCountM && nIndex < nLen) { + if (!XFA_IsDigit(pTime[nIndex])) { + return FALSE; + } + nOffsetM = (pTime[nIndex] - '0') + nOffsetM * 10; + nIndex++; + } + if (nOffsetH > 12) { + return FALSE; + } + if (nOffsetM >= 60) { + return FALSE; + } + } + } + if (nIndex != nLen) { + return FALSE; + } + if (wHour >= 24) { + return FALSE; + } + if (wMinute >= 60) { + return FALSE; + } + if (wSecond >= 60) { + return FALSE; + } + if (wFraction > 999) { + return FALSE; + } + return TRUE; +} +FX_BOOL CXFA_LocaleValue::ValidateCanonicalDateTime(const CFX_WideString& wsDateTime) +{ + CFX_WideString wsDate, wsTime; + if (wsDateTime.IsEmpty()) { + return FALSE; + } + int nSplitIndex = -1; + nSplitIndex = wsDateTime.Find('T'); + if (nSplitIndex < 0) { + nSplitIndex = wsDateTime.Find(' '); + } + if (nSplitIndex < 0) { + return FALSE; + } + wsDate = wsDateTime.Left(nSplitIndex); + wsTime = wsDateTime.Right(wsDateTime.GetLength() - nSplitIndex - 1); + CFX_Unitime dt; + return ValidateCanonicalDate(wsDate, dt) && ValidateCanonicalTime(wsTime); +} +FX_BOOL CXFA_LocaleValue::ParsePatternValue(const CFX_WideString& wsValue, const CFX_WideString& wsPattern, IFX_Locale* pLocale) +{ + IFX_Locale* locale = m_pLocaleMgr->GetDefLocale(); + if (pLocale) { + m_pLocaleMgr->SetDefLocale(pLocale); + } + IFX_FormatString* pFormat = IFX_FormatString::Create(m_pLocaleMgr, FALSE); + CFX_WideStringArray wsPatterns; + pFormat->SplitFormatString(wsPattern, wsPatterns); + FX_BOOL bRet = FALSE; + FX_INT32 iCount = wsPatterns.GetSize(); + for (FX_INT32 i = 0; i < iCount && !bRet; i++) { + CFX_WideString wsFormat = wsPatterns[i]; + FX_LOCALECATEGORY eCategory = pFormat->GetCategory(wsFormat); + eCategory = XFA_ValugeCategory(eCategory, m_dwType); + switch (eCategory) { + case FX_LOCALECATEGORY_Null: + bRet = pFormat->ParseNull(wsValue, wsFormat); + if (bRet) { + m_wsValue.Empty(); + } + break; + case FX_LOCALECATEGORY_Zero: + bRet = pFormat->ParseZero(wsValue, wsFormat); + if (bRet) { + m_wsValue = FX_WSTRC(L"0"); + } + break; + case FX_LOCALECATEGORY_Num: { + CFX_WideString fNum; + bRet = pFormat->ParseNum(wsValue, wsFormat, fNum); + if (bRet) { + m_wsValue = fNum; + } + break; + } + case FX_LOCALECATEGORY_Text: + bRet = pFormat->ParseText(wsValue, wsFormat, m_wsValue); + break; + case FX_LOCALECATEGORY_Date: { + CFX_Unitime dt; + bRet = ValidateCanonicalDate(wsValue, dt); + if (!bRet) { + bRet = pFormat->ParseDateTime(wsValue, wsFormat, FX_DATETIMETYPE_Date, dt); + } + if (bRet) { + SetDate(dt); + } + break; + } + case FX_LOCALECATEGORY_Time: { + CFX_Unitime dt; + bRet = pFormat->ParseDateTime(wsValue, wsFormat, FX_DATETIMETYPE_Time, dt); + if (bRet) { + SetTime(dt); + } + break; + } + case FX_LOCALECATEGORY_DateTime: { + CFX_Unitime dt; + bRet = pFormat->ParseDateTime(wsValue, wsFormat, FX_DATETIMETYPE_DateTime, dt); + if (bRet) { + SetDateTime(dt); + } + break; + } + default: + m_wsValue = wsValue; + bRet = TRUE; + break; + } + } + if (!bRet) { + m_wsValue = wsValue; + } + pFormat->Release(); + if (pLocale) { + m_pLocaleMgr->SetDefLocale(locale); + } + return bRet; +} +void CXFA_LocaleValue::GetNumbericFormat(CFX_WideString &wsFormat, FX_INT32 nIntLen, FX_INT32 nDecLen, FX_BOOL bSign ) +{ + FXSYS_assert(wsFormat.IsEmpty()); + FXSYS_assert(nIntLen >= -1 && nDecLen >= -1); + FX_INT32 nTotalLen \ + = (nIntLen >= 0 ? nIntLen : 2) \ + + (bSign ? 1 : 0) \ + + (nDecLen >= 0 ? nDecLen : 2) \ + + (nDecLen == 0 ? 0 : 1); + FX_LPWSTR lpBuf = wsFormat.GetBuffer(nTotalLen); + FX_INT32 nPos = 0; + if (bSign) { + lpBuf[nPos++] = L's'; + } + if (nIntLen == -1) { + lpBuf[nPos++] = L'z'; + lpBuf[nPos++] = L'*'; + } else { + while (nIntLen) { + lpBuf[nPos++] = L'z'; + nIntLen --; + } + } + if (nDecLen != 0) { + lpBuf[nPos++] = L'.'; + } + if (nDecLen == -1) { + lpBuf[nPos++] = L'z'; + lpBuf[nPos++] = L'*'; + } else { + while (nDecLen) { + lpBuf[nPos++] = L'z'; + nDecLen --; + } + } + wsFormat.ReleaseBuffer(nTotalLen); +} +FX_BOOL CXFA_LocaleValue::ValidateNumericTemp(CFX_WideString& wsNumeric, CFX_WideString& wsFormat, IFX_Locale* pLocale , FX_INT32* pos ) +{ + if (wsFormat.IsEmpty() || wsNumeric.IsEmpty()) { + return TRUE; + } + FX_LPCWSTR pNum = FX_LPCWSTR(wsNumeric); + FX_LPCWSTR pFmt = FX_LPCWSTR(wsFormat); + FX_INT32 n = 0, nf = 0; + FX_WCHAR c = pNum[n]; + FX_WCHAR cf = pFmt[nf]; + if (cf == L's') { + if (c == L'-' || c == L'+') { + ++n; + } + ++nf; + } + FX_BOOL bLimit = TRUE; + FX_INT32 nCount = wsNumeric.GetLength(); + FX_INT32 nCountFmt = wsFormat.GetLength(); + while (n < nCount && (bLimit ? nf < nCountFmt : TRUE) && XFA_IsDigit(c = pNum[n])) { + if (bLimit == TRUE) { + if ((cf = pFmt[nf]) == L'*') { + bLimit = FALSE; + } else if (cf == L'z') { + nf ++; + } else { + return FALSE; + } + } + n ++; + } + if (n == nCount) { + return TRUE; + } + if (nf == nCountFmt) { + return FALSE; + } + while (nf < nCountFmt && (cf = pFmt[nf]) != L'.') { + FXSYS_assert(cf == L'z' || cf == L'*'); + ++nf; + } + CFX_WideString wsDecimalSymbol; + if (pLocale) { + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsDecimalSymbol); + } else { + wsDecimalSymbol = CFX_WideString(L'.'); + } + if (pFmt[nf] != L'.') { + return FALSE; + } + if (wsDecimalSymbol != CFX_WideStringC(c) && c != L'.') { + return FALSE; + } + ++ nf; + ++ n; + bLimit = TRUE; + while (n < nCount && (bLimit ? nf < nCountFmt : TRUE) && XFA_IsDigit(c = pNum[n])) { + if (bLimit == TRUE) { + if ((cf = pFmt[nf]) == L'*') { + bLimit = FALSE; + } else if (cf == L'z') { + nf ++; + } else { + return FALSE; + } + } + n ++; + } + return n == nCount; +} diff --git a/xfa/src/fxfa/src/parser/xfa_object_imp.cpp b/xfa/src/fxfa/src/parser/xfa_object_imp.cpp new file mode 100644 index 0000000000..54f29a5c94 --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_object_imp.cpp @@ -0,0 +1,5125 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_utils.h" +#include "../common/xfa_object.h" +#include "../common/xfa_document.h" +#include "../common/xfa_parser.h" +#include "../common/xfa_script.h" +#include "../common/xfa_docdata.h" +#include "../common/xfa_doclayout.h" +#include "../common/xfa_debug.h" +#include "../common/xfa_localemgr.h" +#include "../common/xfa_fm2jsapi.h" +#include "xfa_debug_parser.h" +#include "xfa_basic_imp.h" +#include "xfa_document_layout_imp.h" +CXFA_Object::CXFA_Object(CXFA_Document* pDocument, FX_DWORD uFlags) + : m_pDocument(pDocument) + , m_uFlags(uFlags) +{ +} +void CXFA_Object::GetClassName(CFX_WideStringC &wsName) const +{ + XFA_LPCELEMENTINFO pElement = XFA_GetElementByID(GetClassID()); + ASSERT(pElement != NULL); + wsName = pElement->pName; +} +FX_UINT32 CXFA_Object::GetClassHashCode() const +{ + XFA_LPCELEMENTINFO pElement = XFA_GetElementByID(GetClassID()); + ASSERT(pElement != NULL); + return pElement->uHash; +} +XFA_ELEMENT CXFA_Object::GetClassID() const +{ + if (IsNode()) { + return ((const CXFA_Node*)this)->GetClassID(); + } else if(IsOrdinaryObject()) { + return ((const CXFA_OrdinaryObject*)this)->GetClassID(); + } else if(IsNodeList()) { + return ((const CXFA_NodeList*)this)->GetClassID(); + } else if(IsOrdinaryList()) { + return XFA_ELEMENT_List; + } + ASSERT(FALSE); + return (XFA_ELEMENT)0; +} +void CXFA_Object::Script_ObjectClass_ClassName(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (!bSetting) { + CFX_WideStringC className; + GetClassName(className); + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(className.GetPtr(), className.GetLength())); + } else { + ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); + } +} +void CXFA_Object::ThrowScriptErrorMessage(FX_INT32 iStringID, ...) +{ + IXFA_AppProvider* pAppProvider = m_pDocument->GetNotify()->GetAppProvider(); + FXSYS_assert(pAppProvider); + CFX_WideString wsFormat; + pAppProvider->LoadString(iStringID, wsFormat); + CFX_WideString wsMessage; + va_list arg_ptr; + va_start(arg_ptr, iStringID); + wsMessage.FormatV((FX_LPCWSTR)wsFormat, arg_ptr); + va_end(arg_ptr); + FXJSE_ThrowMessage(FX_BSTRC(""), FX_UTF8Encode(wsMessage, wsMessage.GetLength())); +} +static void XFA_DeleteWideString(FX_LPVOID pData) +{ + if (pData) { + delete (CFX_WideString*)pData; + } +} +static void XFA_CopyWideString(FX_LPVOID& pData) +{ + if (pData) { + CFX_WideString* pNewData = FX_NEW CFX_WideString(*(CFX_WideString*)pData); + pData = pNewData; + } +} +static XFA_MAPDATABLOCKCALLBACKINFO deleteWideStringCallBack = {XFA_DeleteWideString, XFA_CopyWideString}; +static XFA_OBJECTTYPE XFA_GetElementObjectType(XFA_ELEMENT eElement) +{ + XFA_LPCELEMENTINFO pElement = XFA_GetElementByID(eElement); + ASSERT(pElement != NULL); + return (XFA_OBJECTTYPE)pElement->eObjectType; +} +CXFA_Node::CXFA_Node(CXFA_Document *pDoc, FX_WORD ePacket, XFA_ELEMENT eElement) + : CXFA_Object(pDoc, XFA_GetElementObjectType(eElement)) + , m_pParent(NULL) + , m_pNext(NULL) + , m_pChild(NULL) + , m_pLastChild(NULL) + , m_pXMLNode(NULL) + , m_ePacket(ePacket) + , m_eNodeClass(eElement) + , m_dwNameHash(0) + , m_pAuxNode(NULL) + , m_pMapModuleData(NULL) +{ + ASSERT(m_pDocument != NULL); +} +CXFA_Node::~CXFA_Node() +{ + FXSYS_assert(m_pParent == NULL); + RemoveMapModuleKey(); + CXFA_Node *pNext, *pNode = m_pChild; + while (pNode) { + pNext = pNode->m_pNext; + pNode->m_pParent = NULL; + delete pNode; + pNode = pNext; + } + if (m_pXMLNode && HasFlag(XFA_NODEFLAG_OwnXMLNode)) { + m_pXMLNode->Release(); + } +} +CXFA_Node* CXFA_Node::Clone(FX_BOOL bRecursive) +{ + IXFA_ObjFactory *pFactory = m_pDocument->GetParser()->GetFactory(); + CXFA_Node *pClone = pFactory->CreateNode(m_ePacket, m_eNodeClass); + if(!pClone) { + return NULL; + } + MergeAllData(pClone); + pClone->UpdateNameHash(); + if (IsNeedSavingXMLNode()) { + IFDE_XMLNode* pCloneXML = NULL; + if (IsAttributeInXML()) { + CFX_WideString wsName; + this->GetAttribute(XFA_ATTRIBUTE_Name, wsName, FALSE); + IFDE_XMLElement* pCloneXMLElement = IFDE_XMLElement::Create(wsName); + CFX_WideStringC wsValue = this->GetCData(XFA_ATTRIBUTE_Value); + if (!wsValue.IsEmpty()) { + pCloneXMLElement->SetTextData(wsValue); + } + pCloneXML = pCloneXMLElement; + pCloneXMLElement = NULL; + pClone->SetEnum(XFA_ATTRIBUTE_Contains, XFA_ATTRIBUTEENUM_Unknown); + } else { + pCloneXML = m_pXMLNode->Clone(FALSE); + } + pClone->SetXMLMappingNode(pCloneXML); + pClone->SetFlag(XFA_NODEFLAG_OwnXMLNode, TRUE, FALSE); + } + if (bRecursive) { + for(CXFA_Node* pChild = GetNodeItem(XFA_NODEITEM_FirstChild); pChild; pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { + pClone->InsertChild(pChild->Clone(bRecursive)); + } + } + pClone->SetFlag(XFA_NODEFLAG_Initialized); + pClone->SetObject(XFA_ATTRIBUTE_BindingNode, NULL); + return pClone; +} +CXFA_Node* CXFA_Node::GetNodeItem(XFA_NODEITEM eItem) const +{ + switch (eItem) { + case XFA_NODEITEM_NextSibling: + return m_pNext; + case XFA_NODEITEM_FirstChild: + return m_pChild; + case XFA_NODEITEM_Parent: + return m_pParent; + case XFA_NODEITEM_PrevSibling: + if (m_pParent) { + CXFA_Node *pSibling = m_pParent->m_pChild; + CXFA_Node *pPrev = NULL; + while (pSibling && pSibling != this) { + pPrev = pSibling; + pSibling = pSibling->m_pNext; + } + return pPrev; + } + return NULL; + default: + break; + } + return NULL; +} +CXFA_Node* CXFA_Node::GetNodeItem(XFA_NODEITEM eItem, XFA_OBJECTTYPE eType) const +{ + CXFA_Node *pNode = NULL; + switch (eItem) { + case XFA_NODEITEM_NextSibling: + pNode = m_pNext; + if (eType != XFA_OBJECTTYPEMASK) + while (pNode && pNode->GetObjectType() != eType) { + pNode = pNode->m_pNext; + } + break; + case XFA_NODEITEM_FirstChild: + pNode = m_pChild; + if (eType != XFA_OBJECTTYPEMASK) + while (pNode && pNode->GetObjectType() != eType) { + pNode = pNode->m_pNext; + } + break; + case XFA_NODEITEM_Parent: + pNode = m_pParent; + if (eType != XFA_OBJECTTYPEMASK) + while (pNode && pNode->GetObjectType() != eType) { + pNode = pNode->m_pParent; + } + break; + case XFA_NODEITEM_PrevSibling: + if (m_pParent) { + CXFA_Node *pSibling = m_pParent->m_pChild; + while (pSibling && pSibling != this) { + if (eType == XFA_OBJECTTYPEMASK || eType == pSibling->GetObjectType()) { + pNode = pSibling; + } + pSibling = pSibling->m_pNext; + } + } + break; + default: + break; + } + return pNode; +} +FX_INT32 CXFA_Node::GetNodeList(CXFA_NodeArray &nodes, FX_DWORD dwTypeFilter , XFA_ELEMENT eElementFilter , FX_INT32 iLevel ) +{ + if (--iLevel < 0) { + return nodes.GetSize(); + } + if (eElementFilter != XFA_ELEMENT_UNKNOWN) { + CXFA_Node *pChild = m_pChild; + while (pChild) { + if (pChild->GetClassID() == eElementFilter) { + nodes.Add(pChild); + if (iLevel > 0) { + GetNodeList(nodes, dwTypeFilter, eElementFilter, iLevel); + } + } + pChild = pChild->m_pNext; + } + } else if (dwTypeFilter == (XFA_NODEFILTER_Children | XFA_NODEFILTER_Properties)) { + CXFA_Node *pChild = m_pChild; + while (pChild) { + nodes.Add(pChild); + if (iLevel > 0) { + GetNodeList(nodes, dwTypeFilter, eElementFilter, iLevel); + } + pChild = pChild->m_pNext; + } + } else if (dwTypeFilter != 0) { + FX_BOOL bFilterChildren = (dwTypeFilter & XFA_NODEFILTER_Children) != 0; + FX_BOOL bFilterProperties = (dwTypeFilter & XFA_NODEFILTER_Properties) != 0; + FX_BOOL bFilterOneOfProperties = (dwTypeFilter & XFA_NODEFILTER_OneOfProperty) != 0; + CXFA_Node *pChild = m_pChild; + while (pChild) { + XFA_LPCPROPERTY pPropert = XFA_GetPropertyOfElement(GetClassID(), pChild->GetClassID(), XFA_XDPPACKET_UNKNOWN); + if (pPropert) { + if (bFilterProperties) { + nodes.Add(pChild); + } else if (bFilterOneOfProperties && (pPropert->uFlags & XFA_PROPERTYFLAG_OneOf)) { + nodes.Add(pChild); + } else if(bFilterChildren && (pChild->GetClassID() == XFA_ELEMENT_Variables || pChild->GetClassID() == XFA_ELEMENT_PageSet)) { + nodes.Add(pChild); + } + } else { + if (bFilterChildren) { + nodes.Add(pChild); + } + } + pChild = pChild->m_pNext; + } + if (bFilterOneOfProperties && nodes.GetSize() < 1) { + FX_INT32 iProperties = 0; + XFA_LPCPROPERTY pProperty = XFA_GetElementProperties(GetClassID(), iProperties); + if (pProperty == NULL || iProperties < 1) { + return 0; + } + for (FX_INT32 i = 0; i < iProperties; i++) { + if (pProperty[i].uFlags & XFA_PROPERTYFLAG_DefaultOneOf) { + IXFA_ObjFactory *pFactory = m_pDocument->GetParser()->GetFactory(); + XFA_LPCPACKETINFO pPacket = XFA_GetPacketByID(GetPacketID()); + CXFA_Node* pNewNode = pFactory->CreateNode(pPacket, (XFA_ELEMENT)pProperty[i].eName); + if(!pNewNode) { + break; + } + InsertChild(pNewNode, NULL); + pNewNode->SetFlag(XFA_NODEFLAG_Initialized); + nodes.Add(pNewNode); + break; + } + } + } + } + return nodes.GetSize(); +} +CXFA_Node* CXFA_Node::CreateSamePacketNode(XFA_ELEMENT eElement, FX_DWORD dwFlags) +{ + IXFA_ObjFactory *pFactory = m_pDocument->GetParser()->GetFactory(); + CXFA_Node* pNode = pFactory->CreateNode(m_ePacket, eElement); + pNode->SetFlag(dwFlags); + return pNode; +} +CXFA_Node* CXFA_Node::CloneTemplateToForm(FX_BOOL bRecursive) +{ + FXSYS_assert(m_ePacket == XFA_XDPPACKET_Template); + IXFA_ObjFactory *pFactory = m_pDocument->GetParser()->GetFactory(); + CXFA_Node *pClone = pFactory->CreateNode(XFA_XDPPACKET_Form, m_eNodeClass); + if(!pClone) { + return NULL; + } + pClone->SetTemplateNode(this); + pClone->UpdateNameHash(); + pClone->SetXMLMappingNode(GetXMLMappingNode()); + if (bRecursive) { + for(CXFA_Node* pChild = GetNodeItem(XFA_NODEITEM_FirstChild); pChild; pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { + pClone->InsertChild(pChild->CloneTemplateToForm(bRecursive)); + } + } + pClone->SetFlag(XFA_NODEFLAG_Initialized); + return pClone; +} +CXFA_Node* CXFA_Node::GetTemplateNode() +{ + return m_pAuxNode; +} +void CXFA_Node::SetTemplateNode(CXFA_Node* pTemplateNode) +{ + m_pAuxNode = pTemplateNode; +} +CXFA_Node* CXFA_Node::GetBindData() +{ + ASSERT(GetPacketID() == XFA_XDPPACKET_Form); + return (CXFA_Node*)GetObject(XFA_ATTRIBUTE_BindingNode); +} +FX_INT32 CXFA_Node::GetBindItems(CXFA_NodeArray& formItems) +{ + if (m_uFlags & XFA_NODEFLAG_BindFormItems) { + CXFA_NodeArray* pItems = NULL; + TryObject(XFA_ATTRIBUTE_BindingNode, (FX_LPVOID&)pItems); + formItems.Copy(*pItems); + return formItems.GetSize(); + } + CXFA_Node* pFormNode = (CXFA_Node*)GetObject(XFA_ATTRIBUTE_BindingNode); + if (pFormNode) { + formItems.Add(pFormNode); + } + return formItems.GetSize(); +} +static void XFA_DataNodeDeleteBindItem(FX_LPVOID pData) +{ + if (pData) { + delete ((CXFA_NodeArray*)pData); + } +} +static XFA_MAPDATABLOCKCALLBACKINFO deleteBindItemCallBack = {XFA_DataNodeDeleteBindItem, NULL}; +FX_INT32 CXFA_Node::AddBindItem(CXFA_Node* pFormNode) +{ + ASSERT(pFormNode); + if (m_uFlags & XFA_NODEFLAG_BindFormItems) { + CXFA_NodeArray* pItems = NULL; + TryObject(XFA_ATTRIBUTE_BindingNode, (FX_LPVOID&)pItems); + ASSERT(pItems); + if (pItems->Find(pFormNode) < 0) { + pItems->Add(pFormNode); + } + return pItems->GetSize(); + } + CXFA_Node* pOldFormItem = (CXFA_Node*)GetObject(XFA_ATTRIBUTE_BindingNode); + if (!pOldFormItem) { + SetObject(XFA_ATTRIBUTE_BindingNode, pFormNode); + return 1; + } else if (pOldFormItem == pFormNode) { + return 1; + } + CXFA_NodeArray* pItems = FX_NEW CXFA_NodeArray; + SetObject(XFA_ATTRIBUTE_BindingNode, pItems, &deleteBindItemCallBack); + pItems->Add(pOldFormItem); + pItems->Add(pFormNode); + m_uFlags |= XFA_NODEFLAG_BindFormItems; + return 2; +} +FX_INT32 CXFA_Node::RemoveBindItem(CXFA_Node* pFormNode) +{ + if (m_uFlags & XFA_NODEFLAG_BindFormItems) { + CXFA_NodeArray* pItems = NULL; + TryObject(XFA_ATTRIBUTE_BindingNode, (FX_LPVOID&)pItems); + ASSERT(pItems); + FX_INT32 iIndex = pItems->Find(pFormNode); + FX_INT32 iCount = pItems->GetSize(); + if (iIndex >= 0) { + if (iIndex != iCount - 1) { + pItems->SetAt(iIndex, pItems->GetAt(iCount - 1)); + } + pItems->RemoveAt(iCount - 1); + if (iCount == 2) { + CXFA_Node* pLastFormNode = pItems->GetAt(0); + SetObject(XFA_ATTRIBUTE_BindingNode, pLastFormNode); + m_uFlags &= ~XFA_NODEFLAG_BindFormItems; + } + iCount--; + } + return iCount; + } + CXFA_Node* pOldFormItem = (CXFA_Node*)GetObject(XFA_ATTRIBUTE_BindingNode); + if(pOldFormItem == pFormNode) { + SetObject(XFA_ATTRIBUTE_BindingNode, NULL); + pOldFormItem = NULL; + } + return pOldFormItem == NULL ? 0 : 1; +} +FX_BOOL CXFA_Node::HasBindItem() +{ + return (GetPacketID() == XFA_XDPPACKET_Datasets) && GetObject(XFA_ATTRIBUTE_BindingNode) != NULL; +} +CXFA_WidgetData* CXFA_Node::GetWidgetData() +{ + return (CXFA_WidgetData*)GetObject(XFA_ATTRIBUTE_WidgetData); +} +CXFA_WidgetData* CXFA_Node::GetContainerWidgetData() +{ + if (GetPacketID() != XFA_XDPPACKET_Form) { + return NULL; + } + XFA_ELEMENT classID = GetClassID(); + if (classID == XFA_ELEMENT_ExclGroup) { + return NULL; + } + CXFA_Node* pParentNode = GetNodeItem(XFA_NODEITEM_Parent); + if (pParentNode && pParentNode->GetClassID() == XFA_ELEMENT_ExclGroup) { + return NULL; + } + if (classID == XFA_ELEMENT_Field) { + CXFA_WidgetData* pFieldWidgetData = this->GetWidgetData(); + if (pFieldWidgetData && pFieldWidgetData->GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) { + return NULL; + } else { + CFX_WideString wsPicture; + if (pFieldWidgetData) { + pFieldWidgetData->GetPictureContent(wsPicture, XFA_VALUEPICTURE_DataBind); + } + if (!wsPicture.IsEmpty()) { + return pFieldWidgetData; + } + CXFA_Node* pDataNode = this->GetBindData(); + if (!pDataNode) { + return NULL; + } + pFieldWidgetData = NULL; + CXFA_NodeArray formNodes; + pDataNode->GetBindItems(formNodes); + for (FX_INT32 i = 0; i < formNodes.GetSize(); i++) { + CXFA_Node* pFormNode = formNodes.GetAt(i); + if (!pFormNode || pFormNode->HasFlag(XFA_NODEFLAG_HasRemoved)) { + continue; + } + pFieldWidgetData = pFormNode->GetWidgetData(); + if (pFieldWidgetData) { + pFieldWidgetData->GetPictureContent(wsPicture, XFA_VALUEPICTURE_DataBind); + } + if (!wsPicture.IsEmpty()) { + break; + } + pFieldWidgetData = NULL; + } + return pFieldWidgetData; + } + } + CXFA_Node* pGrandNode = pParentNode ? pParentNode->GetNodeItem(XFA_NODEITEM_Parent) : NULL; + CXFA_Node* pValueNode = (pParentNode && pParentNode->GetClassID() == XFA_ELEMENT_Value) ? pParentNode : NULL; + if (!pValueNode) { + pValueNode = (pGrandNode && pGrandNode->GetClassID() == XFA_ELEMENT_Value) ? pGrandNode : NULL; + } + CXFA_Node* pParentOfValueNode = pValueNode ? pValueNode->GetNodeItem(XFA_NODEITEM_Parent) : NULL; + return pParentOfValueNode ? pParentOfValueNode->GetContainerWidgetData() : NULL; +} +FX_BOOL CXFA_Node::GetLocaleName(CFX_WideString& wsLocaleName) +{ + CXFA_Node* pForm = (CXFA_Node*)GetDocument()->GetXFANode(XFA_HASHCODE_Form); + CXFA_Node* pTopSubform = pForm->GetFirstChildByClass(XFA_ELEMENT_Subform); + FXSYS_assert(pTopSubform); + CXFA_Node* pLocaleNode = this; + FX_BOOL bLocale = FALSE; + do { + bLocale = pLocaleNode->TryCData(XFA_ATTRIBUTE_Locale, wsLocaleName, FALSE); + if (!bLocale) { + pLocaleNode = pLocaleNode->GetNodeItem(XFA_NODEITEM_Parent); + } + } while (pLocaleNode && pLocaleNode != pTopSubform && !bLocale); + if (bLocale) { + return bLocale; + } + CXFA_Node* pConfig = (CXFA_Node*)GetDocument()->GetXFANode(XFA_HASHCODE_Config); + wsLocaleName = GetDocument()->GetLocalMgr()->GetConfigLocaleName(pConfig); + if (!wsLocaleName.IsEmpty()) { + bLocale = TRUE; + } + if (bLocale) { + return bLocale; + } + if (pTopSubform) { + bLocale = pTopSubform->TryCData(XFA_ATTRIBUTE_Locale, wsLocaleName, FALSE); + } + if (bLocale) { + return bLocale; + } + IFX_Locale* pLocale = GetDocument()->GetLocalMgr()->GetDefLocale(); + if (pLocale) { + wsLocaleName = pLocale->GetName(); + bLocale = TRUE; + } + return bLocale; +} +XFA_ATTRIBUTEENUM CXFA_Node::GetIntact() +{ + XFA_ELEMENT eElement = GetClassID(); + CXFA_Node* pKeep = GetFirstChildByClass(XFA_ELEMENT_Keep); + XFA_ATTRIBUTEENUM eLayoutType = GetEnum(XFA_ATTRIBUTE_Layout); + if (pKeep) { + XFA_ATTRIBUTEENUM eIntact; + if (pKeep->TryEnum(XFA_ATTRIBUTE_Intact, eIntact, FALSE)) { + if(eIntact == XFA_ATTRIBUTEENUM_None && eLayoutType == XFA_ATTRIBUTEENUM_Row && m_pDocument->GetCurVersionMode() < XFA_VERSION_208) { + CXFA_Node* pPreviewRow = GetNodeItem(XFA_NODEITEM_PrevSibling, XFA_OBJECTTYPE_ContainerNode); + if(pPreviewRow && pPreviewRow->GetEnum(XFA_ATTRIBUTE_Layout) == XFA_ATTRIBUTEENUM_Row) { + XFA_ATTRIBUTEENUM eValue; + if(pKeep->TryEnum(XFA_ATTRIBUTE_Previous, eValue, FALSE)) { + if(eValue == XFA_ATTRIBUTEENUM_ContentArea || eValue == XFA_ATTRIBUTEENUM_PageArea) { + return XFA_ATTRIBUTEENUM_ContentArea; + } + } + CXFA_Node* pKeep = pPreviewRow->GetFirstChildByClass(XFA_ELEMENT_Keep); + if (pKeep) { + if (pKeep->TryEnum(XFA_ATTRIBUTE_Next, eValue, FALSE)) { + if(eValue == XFA_ATTRIBUTEENUM_ContentArea || eValue == XFA_ATTRIBUTEENUM_PageArea) { + return XFA_ATTRIBUTEENUM_ContentArea; + } + } + } + } + } + return eIntact; + } + } + switch (eElement) { + case XFA_ELEMENT_Subform: + switch (eLayoutType) { + case XFA_ATTRIBUTEENUM_Position: + case XFA_ATTRIBUTEENUM_Row: + return XFA_ATTRIBUTEENUM_ContentArea; + case XFA_ATTRIBUTEENUM_Tb: + case XFA_ATTRIBUTEENUM_Table: + case XFA_ATTRIBUTEENUM_Lr_tb: + case XFA_ATTRIBUTEENUM_Rl_tb: + return XFA_ATTRIBUTEENUM_None; + default: + break; + } + break; + case XFA_ELEMENT_Field: { + CXFA_Node* pParentNode = this->GetNodeItem(XFA_NODEITEM_Parent); + if (!pParentNode || pParentNode->GetClassID() == XFA_ELEMENT_PageArea) { + return XFA_ATTRIBUTEENUM_ContentArea; + } + if (pParentNode->GetIntact() == XFA_ATTRIBUTEENUM_None) { + XFA_ATTRIBUTEENUM eParLayout = pParentNode->GetEnum(XFA_ATTRIBUTE_Layout); + if (eParLayout == XFA_ATTRIBUTEENUM_Position || eParLayout == XFA_ATTRIBUTEENUM_Row || eParLayout == XFA_ATTRIBUTEENUM_Table) { + return XFA_ATTRIBUTEENUM_None; + } + XFA_VERSION version = m_pDocument->GetCurVersionMode(); + if (eParLayout == XFA_ATTRIBUTEENUM_Tb && version < XFA_VERSION_208) { + CXFA_Measurement measureH; + if (this->TryMeasure(XFA_ATTRIBUTE_H, measureH, FALSE)) { + return XFA_ATTRIBUTEENUM_ContentArea; + } + } + return XFA_ATTRIBUTEENUM_None; + } + return XFA_ATTRIBUTEENUM_ContentArea; + } + case XFA_ELEMENT_Draw: + return XFA_ATTRIBUTEENUM_ContentArea; + default: + break; + } + return XFA_ATTRIBUTEENUM_None; +} +CXFA_Node* CXFA_Node::GetDataDescriptionNode() +{ + if(m_ePacket == XFA_XDPPACKET_Datasets) { + return m_pAuxNode; + } + return NULL; +} +void CXFA_Node::SetDataDescriptionNode(CXFA_Node* pDataDescriptionNode) +{ + FXSYS_assert(m_ePacket == XFA_XDPPACKET_Datasets); + m_pAuxNode = pDataDescriptionNode; +} +void CXFA_Node::Script_TreeClass_ResolveNode(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength != 1) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"resolveNode")); + return; + } + CFX_WideString wsExpression; + CFX_ByteString bsExpression = pArguments->GetUTF8String(0); + wsExpression = CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength()); + IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext(); + if (!pScriptContext) { + return; + } + CXFA_Node* refNode = this; + if(refNode->GetClassID() == XFA_ELEMENT_Xfa) { + refNode = (CXFA_Node*)pScriptContext->GetThisObject(); + } + FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Attributes | XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings; + XFA_RESOLVENODE_RS resoveNodeRS; + FX_INT32 iRet = pScriptContext->ResolveObjects(refNode, wsExpression, resoveNodeRS, dwFlag); + if (iRet < 1) { + return FXJSE_Value_SetNull(pArguments->GetReturnValue()); + } + FXJSE_HVALUE hValue = NULL; + if (resoveNodeRS.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) { + CXFA_Object* pNode = resoveNodeRS.nodes[0]; + hValue = pScriptContext->GetJSValueFromMap(pNode); + FXJSE_Value_Set(pArguments->GetReturnValue(), hValue); + } else { + XFA_LPCSCRIPTATTRIBUTEINFO lpAttributeInfo = resoveNodeRS.pScriptAttribute; + if (lpAttributeInfo && lpAttributeInfo->eValueType == XFA_SCRIPT_Object) { + hValue = FXJSE_Value_Create(pScriptContext->GetRuntime()); + (resoveNodeRS.nodes[0]->*(lpAttributeInfo->lpfnCallback))(hValue, FALSE, (XFA_ATTRIBUTE)lpAttributeInfo->eAttribute); + FXJSE_Value_Set(pArguments->GetReturnValue(), hValue); + FXJSE_Value_Release(hValue); + } else { + FXJSE_Value_SetNull(pArguments->GetReturnValue()); + } + } +} +void CXFA_Node::Script_TreeClass_ResolveNodes(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength != 1) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"resolveNodes")); + return; + } + CFX_WideString wsExpression; + CFX_ByteString bsExpression = pArguments->GetUTF8String(0); + wsExpression = CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength()); + FXJSE_HVALUE hValue = pArguments->GetReturnValue(); + if (!hValue) { + return; + } + FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Attributes | XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings; + CXFA_Node* refNode = this; + if(refNode->GetClassID() == XFA_ELEMENT_Xfa) { + refNode = (CXFA_Node*)m_pDocument->GetScriptContext()->GetThisObject(); + } + Script_Som_ResolveNodeList(hValue, wsExpression, dwFlag, refNode); +} +void CXFA_Node::Script_Som_ResolveNodeList(FXJSE_HVALUE hValue, CFX_WideString wsExpression, FX_DWORD dwFlag, CXFA_Node* refNode) +{ + IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext(); + if (!pScriptContext) { + return; + } + XFA_RESOLVENODE_RS resoveNodeRS; + if(refNode == NULL) { + refNode = this; + } + FX_INT32 iRet = pScriptContext->ResolveObjects(refNode, wsExpression, resoveNodeRS, dwFlag); + CXFA_ArrayNodeList* pNodeList = FX_NEW CXFA_ArrayNodeList(m_pDocument); + if (resoveNodeRS.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) { + for (FX_INT32 i = 0; i < resoveNodeRS.nodes.GetSize(); i++) { + if (resoveNodeRS.nodes[i]->IsNode()) { + pNodeList->Append((CXFA_Node*)resoveNodeRS.nodes[i]); + } + } + } else { + CXFA_HVALUEArray hValueArray(pScriptContext->GetRuntime()); + if (resoveNodeRS.GetAttributeResult(hValueArray) > 0) { + CXFA_ObjArray objectArray; + hValueArray.GetAttributeObject(objectArray); + for (FX_INT32 i = 0; i < objectArray.GetSize(); i++) { + if (objectArray[i]->IsNode()) { + pNodeList->Append((CXFA_Node*)objectArray[i]); + } + } + } + } + FXJSE_Value_SetObject(hValue, (CXFA_Object*)pNodeList, pScriptContext->GetJseNormalClass()); +} +void CXFA_Node::Script_TreeClass_All(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (bSetting) { + ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); + } else { + FX_DWORD dwFlag = XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_ALL; + CFX_WideString wsName; + GetAttribute(XFA_ATTRIBUTE_Name, wsName); + CFX_WideString wsExpression = wsName + FX_WSTRC(L"[*]"); + Script_Som_ResolveNodeList(hValue, wsExpression, dwFlag); + } +} +void CXFA_Node::Script_TreeClass_Nodes(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext(); + if (!pScriptContext) { + return; + } + if (bSetting) { + IXFA_AppProvider* pAppProvider = m_pDocument->GetNotify()->GetAppProvider(); + FXSYS_assert(pAppProvider); + CFX_WideString wsMessage; + pAppProvider->LoadString(XFA_IDS_Unable_TO_SET, wsMessage); + FXJSE_ThrowMessage(FX_BSTRC(""), FX_UTF8Encode(wsMessage, wsMessage.GetLength())); + } else { + CXFA_AttachNodeList* pNodeList = FX_NEW CXFA_AttachNodeList(m_pDocument, this); + FXJSE_Value_SetObject(hValue, (CXFA_Object*)pNodeList, pScriptContext->GetJseNormalClass()); + } +} +void CXFA_Node::Script_TreeClass_ClassAll(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (bSetting) { + ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); + } else { + FX_DWORD dwFlag = XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_ALL; + CFX_WideStringC wsName; + this->GetClassName(wsName); + CFX_WideString wsExpression = FX_WSTRC(L"#") + wsName + FX_WSTRC(L"[*]"); + Script_Som_ResolveNodeList(hValue, wsExpression, dwFlag); + } +} +void CXFA_Node::Script_TreeClass_Parent(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (bSetting) { + ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); + } else { + CXFA_Node* pParent = this->GetNodeItem(XFA_NODEITEM_Parent); + if (pParent) { + FXJSE_Value_Set(hValue, m_pDocument->GetScriptContext()->GetJSValueFromMap(pParent)); + } else { + FXJSE_Value_SetNull(hValue); + } + } +} +void CXFA_Node::Script_TreeClass_Index(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (bSetting) { + ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); + } else { + FXJSE_Value_SetInteger(hValue, GetNodeSameNameIndex()); + } +} +void CXFA_Node::Script_TreeClass_ClassIndex(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (bSetting) { + ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); + } else { + FXJSE_Value_SetInteger(hValue, GetNodeSameClassIndex()); + } +} +void CXFA_Node::Script_TreeClass_SomExpression(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (bSetting) { + ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); + } else { + CFX_WideString wsSOMExpression; + GetSOMExpression(wsSOMExpression); + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsSOMExpression)); + } +} +void CXFA_Node::Script_NodeClass_ApplyXSL(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength != 1) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"applyXSL")); + return; + } + CFX_WideString wsExpression; + CFX_ByteString bsExpression = pArguments->GetUTF8String(0); + wsExpression = CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength()); +} +void CXFA_Node::Script_NodeClass_AssignNode(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength < 1 || iLength > 3) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"assignNode")); + return; + } + CFX_WideString wsExpression; + CFX_WideString wsValue; + FX_INT32 iAction = 0; + if (iLength >= 1) { + CFX_ByteString bsExpression = pArguments->GetUTF8String(0); + wsExpression = CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength()); + } + if (iLength >= 2) { + CFX_ByteString bsValue = pArguments->GetUTF8String(1); + wsValue = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()); + } + if (iLength >= 3) { + iAction = pArguments->GetInt32(2); + } +} +void CXFA_Node::Script_NodeClass_Clone(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength != 1) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"clone")); + return; + } + FX_BOOL bClone = TRUE; + bClone = pArguments->GetInt32(0) == 0 ? FALSE : TRUE; + CXFA_Node* pCloneNode = this->Clone(bClone); + FXJSE_Value_Set(pArguments->GetReturnValue(), m_pDocument->GetScriptContext()->GetJSValueFromMap(pCloneNode)); +} +void CXFA_Node::Script_NodeClass_GetAttribute(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength != 1) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"getAttribute")); + return; + } + CFX_WideString wsExpression; + CFX_ByteString bsExpression = pArguments->GetUTF8String(0); + wsExpression = CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength()); + CFX_WideString wsValue; + this->GetAttribute(wsExpression, wsValue); + FXJSE_HVALUE hValue = pArguments->GetReturnValue(); + if (hValue) { + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue)); + } +} +void CXFA_Node::Script_NodeClass_GetElement(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength < 1 || iLength > 2) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"getElement")); + return; + } + CFX_WideString wsExpression; + FX_INT32 iValue = 0; + if (iLength >= 1) { + CFX_ByteString bsExpression = pArguments->GetUTF8String(0); + wsExpression = CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength()); + } + if (iLength >= 2) { + iValue = pArguments->GetInt32(1); + } + XFA_LPCELEMENTINFO pElementInfo = XFA_GetElementByName(wsExpression); + CXFA_Node* pNode = this->GetProperty(iValue, pElementInfo->eName); + FXJSE_Value_Set(pArguments->GetReturnValue(), m_pDocument->GetScriptContext()->GetJSValueFromMap(pNode)); +} +void CXFA_Node::Script_NodeClass_IsPropertySpecified(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength < 1 || iLength > 3) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"isPropertySpecified")); + return; + } + CFX_WideString wsExpression; + FX_BOOL bParent = TRUE; + FX_INT32 iIndex = 0; + if (iLength >= 1) { + CFX_ByteString bsExpression = pArguments->GetUTF8String(0); + wsExpression = CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength()); + } + if (iLength >= 2) { + bParent = pArguments->GetInt32(1) == 0 ? FALSE : TRUE; + } + if (iLength >= 3) { + iIndex = pArguments->GetInt32(2); + } + FX_BOOL bHas = FALSE; + XFA_LPCATTRIBUTEINFO pAttributeInfo = XFA_GetAttributeByName(wsExpression); + CFX_WideString wsValue; + if(pAttributeInfo) { + bHas = this->HasAttribute(pAttributeInfo->eName); + } + if (!bHas) { + XFA_LPCELEMENTINFO pElementInfo = XFA_GetElementByName(wsExpression); + bHas = (this->GetProperty(iIndex, pElementInfo->eName) != NULL); + } + FXJSE_HVALUE hValue = pArguments->GetReturnValue(); + if (hValue) { + FXJSE_Value_SetBoolean(hValue, bHas); + } +} +void CXFA_Node::Script_NodeClass_LoadXML(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength < 1 || iLength > 3) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"loadXML")); + return; + } + CFX_WideString wsExpression; + FX_BOOL bIgnoreRoot = TRUE; + FX_BOOL bOverwrite = 0; + if (iLength >= 1) { + CFX_ByteString bsExpression = pArguments->GetUTF8String(0); + wsExpression = CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength()); + if (wsExpression.IsEmpty()) { + return; + } + } + if (iLength >= 2) { + bIgnoreRoot = pArguments->GetInt32(1) == 0 ? FALSE : TRUE; + } + if (iLength >= 3) { + bOverwrite = pArguments->GetInt32(2) == 0 ? FALSE : TRUE; + } + IXFA_Parser* pParser = IXFA_Parser::Create(m_pDocument); + if (!pParser) { + return; + } + IFDE_XMLNode* pXMLNode = NULL; + FX_INT32 iParserStatus = pParser->ParseXMLData(wsExpression, pXMLNode, NULL); + if (iParserStatus != XFA_PARSESTATUS_Done || !pXMLNode) { + pParser->Release(); + pParser = NULL; + return; + } + if (bIgnoreRoot && (pXMLNode->GetType() != FDE_XMLNODE_Element || XFA_RecognizeRichText((IFDE_XMLElement*)pXMLNode))) { + bIgnoreRoot = FALSE; + } + CXFA_Node* pFakeRoot = this->Clone(FALSE); + CFX_WideStringC wsContentType = this->GetCData(XFA_ATTRIBUTE_ContentType); + if (!wsContentType.IsEmpty()) { + pFakeRoot->SetCData(XFA_ATTRIBUTE_ContentType, wsContentType); + } + IFDE_XMLNode* pFakeXMLRoot = pFakeRoot->GetXMLMappingNode(); + if (!pFakeXMLRoot) { + IFDE_XMLNode* pThisXMLRoot = this->GetXMLMappingNode(); + pFakeXMLRoot = pThisXMLRoot ? pThisXMLRoot->Clone(FALSE) : NULL; + } + if (!pFakeXMLRoot) { + CFX_WideStringC wsClassName; + this->GetClassName(wsClassName); + pFakeXMLRoot = IFDE_XMLElement::Create(wsClassName); + } + if (bIgnoreRoot) { + IFDE_XMLNode *pXMLChild = pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild); + while (pXMLChild) { + IFDE_XMLNode * pXMLSibling = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling); + pXMLNode->RemoveChildNode(pXMLChild); + pFakeXMLRoot->InsertChildNode(pXMLChild); + pXMLChild = pXMLSibling; + } + } else { + IFDE_XMLNode *pXMLParent = pXMLNode->GetNodeItem(IFDE_XMLNode::Parent); + if (pXMLParent) { + pXMLParent->RemoveChildNode(pXMLNode); + } + pFakeXMLRoot->InsertChildNode(pXMLNode); + } + pParser->ConstructXFANode(pFakeRoot, pFakeXMLRoot); + pFakeRoot = pParser->GetRootNode(); + if (pFakeRoot) { + if (bOverwrite) { + CXFA_Node *pChild = this->GetNodeItem(XFA_NODEITEM_FirstChild); + CXFA_Node* pNewChild = pFakeRoot->GetNodeItem(XFA_NODEITEM_FirstChild); + FX_INT32 index = 0; + while (pNewChild) { + CXFA_Node* pItem = pNewChild->GetNodeItem(XFA_NODEITEM_NextSibling); + pFakeRoot->RemoveChild(pNewChild); + this->InsertChild(index++, pNewChild); + pNewChild->SetFlag(XFA_NODEFLAG_Initialized); + pNewChild = pItem; + } + while (pChild) { + CXFA_Node *pItem = pChild->GetNodeItem(XFA_NODEITEM_NextSibling); + this->RemoveChild(pChild); + pFakeRoot->InsertChild(pChild); + pChild = pItem; + } + if (GetPacketID() == XFA_XDPPACKET_Form && GetClassID() == XFA_ELEMENT_ExData) { + IFDE_XMLNode* pTempXMLNode = this->GetXMLMappingNode(); + this->SetXMLMappingNode(pFakeXMLRoot); + this->SetFlag(XFA_NODEFLAG_OwnXMLNode, TRUE, FALSE); + if (pTempXMLNode && pTempXMLNode->GetNodeItem(IFDE_XMLNode::Parent) == NULL) { + pFakeXMLRoot = pTempXMLNode; + } else { + pFakeXMLRoot = NULL; + } + } + MoveBufferMapData(pFakeRoot, this, XFA_CalcData, TRUE); + } else { + CXFA_Node* pChild = pFakeRoot->GetNodeItem(XFA_NODEITEM_FirstChild); + while (pChild) { + CXFA_Node *pItem = pChild->GetNodeItem(XFA_NODEITEM_NextSibling); + pFakeRoot->RemoveChild(pChild); + this->InsertChild(pChild); + pChild->SetFlag(XFA_NODEFLAG_Initialized); + pChild = pItem; + } + } + if (pFakeXMLRoot) { + pFakeRoot->SetXMLMappingNode(pFakeXMLRoot); + pFakeRoot->SetFlag(XFA_NODEFLAG_OwnXMLNode, TRUE, FALSE); + } + pFakeRoot->SetFlag(XFA_NODEFLAG_HasRemoved, TRUE, FALSE); + } else { + if (pFakeXMLRoot) { + pFakeXMLRoot->Release(); + pFakeXMLRoot = NULL; + } + } + pParser->Release(); + pParser = NULL; +} +void CXFA_Node::Script_NodeClass_SaveFilteredXML(CFXJSE_Arguments* pArguments) +{ +} +void CXFA_Node::Script_NodeClass_SaveXML(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength < 0 || iLength > 1) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"saveXML")); + return; + } + FX_BOOL bPrettyMode = FALSE; + if (iLength == 1) { + CFX_ByteString bsPretty = pArguments->GetUTF8String(0); + if (bsPretty.Equal(FX_BSTRC("pretty"))) { + bPrettyMode = TRUE; + } else { + ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); + return; + } + } + CFX_ByteStringC bsXMLHeader = FX_BSTRC("\n"); + if (GetPacketID() == XFA_XDPPACKET_Form) { + IFX_MemoryStream* pMemoryStream = FX_CreateMemoryStream(TRUE); + if (!pMemoryStream) { + FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), bsXMLHeader); + return; + } + IFX_Stream *pStream = IFX_Stream::CreateStream((IFX_FileWrite*)pMemoryStream, FX_STREAMACCESS_Text | FX_STREAMACCESS_Write | FX_STREAMACCESS_Append); + if (!pStream) { + FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), bsXMLHeader); + pMemoryStream->Release(); + pMemoryStream = NULL; + return; + } + pStream->SetCodePage(FX_CODEPAGE_UTF8); + pStream->WriteData(bsXMLHeader, bsXMLHeader.GetLength()); + XFA_DataExporter_RegenerateFormFile(this, pStream, NULL, TRUE); + FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), CFX_ByteStringC(pMemoryStream->GetBuffer(), pMemoryStream->GetSize())); + pStream->Release(); + pStream = NULL; + if (pMemoryStream) { + pMemoryStream->Release(); + pMemoryStream = NULL; + } + return; + } else if (GetPacketID() == XFA_XDPPACKET_Datasets) { + IFDE_XMLNode* pElement = this->GetXMLMappingNode(); + if(!pElement || pElement->GetType() != FDE_XMLNODE_Element) { + FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), bsXMLHeader); + return; + } + XFA_DataExporter_DealWithDataGroupNode(this); + IFX_MemoryStream* pMemoryStream = FX_CreateMemoryStream(TRUE); + if (!pMemoryStream) { + FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), bsXMLHeader); + return; + } + if (pMemoryStream) { + IFX_Stream *pStream = IFX_Stream::CreateStream((IFX_FileWrite*)pMemoryStream, FX_STREAMACCESS_Text | FX_STREAMACCESS_Write | FX_STREAMACCESS_Append); + if (pStream) { + pStream->SetCodePage(FX_CODEPAGE_UTF8); + pStream->WriteData(bsXMLHeader, bsXMLHeader.GetLength()); + pElement->SaveXMLNode(pStream); + FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), CFX_ByteStringC(pMemoryStream->GetBuffer(), pMemoryStream->GetSize())); + pStream->Release(); + pStream = NULL; + } + if (pMemoryStream) { + pMemoryStream->Release(); + pMemoryStream = NULL; + } + return; + } + } else { + FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), FX_BSTRC("")); + } +} +void CXFA_Node::Script_NodeClass_SetAttribute(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength != 2) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"setAttribute")); + return; + } + CFX_WideString wsAttribute; + CFX_WideString wsAttributeValue; + CFX_ByteString bsAttributeValue = pArguments->GetUTF8String(0); + CFX_ByteString bsAttribute = pArguments->GetUTF8String(1); + wsAttributeValue = CFX_WideString::FromUTF8(bsAttributeValue, bsAttributeValue.GetLength()); + wsAttribute = CFX_WideString::FromUTF8(bsAttribute, bsAttribute.GetLength()); + this->SetAttribute(wsAttribute, wsAttributeValue, TRUE); +} +void CXFA_Node::Script_NodeClass_SetElement(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength != 1 && iLength != 2) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"setElement")); + return; + } + CXFA_Node* pNode = NULL; + CFX_WideString wsName; + if (iLength >= 1) { + pNode = (CXFA_Node*)pArguments->GetObject(0); + } + if (iLength >= 2) { + CFX_ByteString bsName = pArguments->GetUTF8String(1); + wsName = CFX_WideString::FromUTF8(bsName, bsName.GetLength()); + } +} +void CXFA_Node::Script_NodeClass_Ns(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (bSetting) { + ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); + } else { + CFX_WideString wsNameSpace; + this->TryNamespace(wsNameSpace); + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsNameSpace)); + } +} +void CXFA_Node::Script_NodeClass_Model(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (bSetting) { + ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); + } else { + FXJSE_Value_Set(hValue, m_pDocument->GetScriptContext()->GetJSValueFromMap(this->GetModelNode())); + } +} +void CXFA_Node::Script_NodeClass_IsContainer(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (bSetting) { + ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); + } else { + FXJSE_Value_SetBoolean(hValue, this->IsContainerNode()); + } +} +void CXFA_Node::Script_NodeClass_IsNull(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (bSetting) { + ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); + } else { + if (this->GetClassID() == XFA_ELEMENT_Subform) { + FXJSE_Value_SetBoolean(hValue, FALSE); + return; + } + CFX_WideString strValue; + FXJSE_Value_SetBoolean(hValue, !TryContent(strValue) || strValue.IsEmpty()); + } +} +void CXFA_Node::Script_NodeClass_OneOfChild(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (bSetting) { + ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); + } else { + CXFA_NodeArray properts; + FX_INT32 iSize = this->GetNodeList(properts, XFA_NODEFILTER_OneOfProperty); + if (iSize > 0) { + FXJSE_Value_Set(hValue, m_pDocument->GetScriptContext()->GetJSValueFromMap(properts[0])); + } + } +} +void CXFA_Node::Script_ContainerClass_GetDelta(CFXJSE_Arguments* pArguments) +{ +} +void CXFA_Node::Script_ContainerClass_GetDeltas(CFXJSE_Arguments* pArguments) +{ + CXFA_ArrayNodeList* pFormNodes = FX_NEW CXFA_ArrayNodeList(m_pDocument); + FXJSE_Value_SetObject(pArguments->GetReturnValue(), (CXFA_Object*)pFormNodes, m_pDocument->GetScriptContext()->GetJseNormalClass()); +} +void CXFA_Node::Script_ModelClass_ClearErrorList(CFXJSE_Arguments* pArguments) +{ +} +void CXFA_Node::Script_ModelClass_CreateNode(CFXJSE_Arguments* pArguments) +{ + Script_Template_CreateNode(pArguments); +} +void CXFA_Node::Script_ModelClass_IsCompatibleNS(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength < 1) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"isCompatibleNS")); + return; + } + CFX_WideString wsNameSpace; + if (iLength >= 1) { + CFX_ByteString bsNameSpace = pArguments->GetUTF8String(0); + wsNameSpace = CFX_WideString::FromUTF8(bsNameSpace, bsNameSpace.GetLength()); + } + CFX_WideString wsNodeNameSpace; + this->TryNamespace(wsNodeNameSpace); + FXJSE_HVALUE hValue = pArguments->GetReturnValue(); + if (hValue) { + FXJSE_Value_SetBoolean(hValue, wsNodeNameSpace.Equal(wsNameSpace)); + } +} +void CXFA_Node::Script_ModelClass_Context(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ +} +void CXFA_Node::Script_ModelClass_AliasNode(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ +} +void CXFA_Node::Script_Attribute_Integer(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (bSetting) { + SetInteger(eAttribute, FXJSE_Value_ToInteger(hValue), TRUE); + } else { + FXJSE_Value_SetInteger(hValue, GetInteger(eAttribute)); + } +} +void CXFA_Node::Script_Attribute_IntegerRead(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (!bSetting) { + FXJSE_Value_SetInteger(hValue, GetInteger(eAttribute)); + } else { + ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); + } +} +void CXFA_Node::Script_Attribute_BOOL(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (bSetting) { + SetBoolean(eAttribute, FXJSE_Value_ToBoolean(hValue), TRUE); + } else { + FXJSE_Value_SetUTF8String(hValue, GetBoolean(eAttribute) ? FX_BSTRC("1") : FX_BSTRC("0")); + } +} +void CXFA_Node::Script_Attribute_BOOLRead(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (!bSetting) { + FXJSE_Value_SetUTF8String(hValue, GetBoolean(eAttribute) ? FX_BSTRC("1") : FX_BSTRC("0")); + } else { + ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); + } +} +void CXFA_Node::Script_Attribute_SendAttributeChangeMessage(FX_LPVOID eAttribute, FX_LPVOID eValue, FX_BOOL bScriptModify) +{ + CXFA_LayoutProcessor* pLayoutPro = m_pDocument->GetLayoutProcessor(); + if (!pLayoutPro) { + return; + } + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + FX_DWORD dwPacket = this->GetPacketID(); + if (dwPacket & XFA_XDPPACKET_Form) { + FX_BOOL bNeedFindContainer = FALSE; + XFA_ELEMENT eType = this->GetClassID(); + switch (eType) { + case XFA_ELEMENT_Caption: + bNeedFindContainer = TRUE; + pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute, eValue, this, this->GetNodeItem(XFA_NODEITEM_Parent)); + break; + case XFA_ELEMENT_Font: + case XFA_ELEMENT_Para: { + bNeedFindContainer = TRUE; + CXFA_Node* pParentNode = this->GetNodeItem(XFA_NODEITEM_Parent); + if (pParentNode->GetClassID() == XFA_ELEMENT_Caption) { + pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute, eValue, pParentNode, pParentNode->GetNodeItem(XFA_NODEITEM_Parent)); + } else { + pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute, eValue, this, pParentNode); + } + } + break; + case XFA_ELEMENT_Margin: { + bNeedFindContainer = TRUE; + CXFA_Node* pParentNode = this->GetNodeItem(XFA_NODEITEM_Parent); + XFA_ELEMENT eParentType = pParentNode->GetClassID(); + if (pParentNode->IsContainerNode()) { + pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute, eValue, this, pParentNode); + } else if (eParentType == XFA_ELEMENT_Caption) { + pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute, eValue, pParentNode, pParentNode->GetNodeItem(XFA_NODEITEM_Parent)); + } else { + CXFA_Node* pNode = pParentNode->GetNodeItem(XFA_NODEITEM_Parent); + if (pNode && pNode->GetClassID() == XFA_ELEMENT_Ui) { + pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute, eValue, pNode, pNode->GetNodeItem(XFA_NODEITEM_Parent)); + } + } + } + break; + case XFA_ELEMENT_Comb: { + CXFA_Node* pEditNode = this->GetNodeItem(XFA_NODEITEM_Parent); + XFA_ELEMENT eUIType = pEditNode->GetClassID(); + if (pEditNode && (eUIType == XFA_ELEMENT_DateTimeEdit || eUIType == XFA_ELEMENT_NumericEdit || eUIType == XFA_ELEMENT_TextEdit)) { + CXFA_Node* pUINode = pEditNode->GetNodeItem(XFA_NODEITEM_Parent); + if (pUINode) { + pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute, eValue, pUINode, pUINode->GetNodeItem(XFA_NODEITEM_Parent)); + } + } + } + break; + case XFA_ELEMENT_Button: + case XFA_ELEMENT_Barcode: + case XFA_ELEMENT_ChoiceList: + case XFA_ELEMENT_DateTimeEdit: + case XFA_ELEMENT_NumericEdit: + case XFA_ELEMENT_PasswordEdit: + case XFA_ELEMENT_TextEdit: { + CXFA_Node* pUINode = this->GetNodeItem(XFA_NODEITEM_Parent); + if (pUINode) { + pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute, eValue, pUINode, pUINode->GetNodeItem(XFA_NODEITEM_Parent)); + } + } + break; + case XFA_ELEMENT_CheckButton: { + bNeedFindContainer = TRUE; + CXFA_Node* pUINode = this->GetNodeItem(XFA_NODEITEM_Parent); + if (pUINode) { + pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute, eValue, pUINode, pUINode->GetNodeItem(XFA_NODEITEM_Parent)); + } + } + break; + case XFA_ELEMENT_Keep: + case XFA_ELEMENT_Bookend: + case XFA_ELEMENT_Break: + case XFA_ELEMENT_BreakAfter: + case XFA_ELEMENT_BreakBefore: + case XFA_ELEMENT_Overflow: + bNeedFindContainer = TRUE; + break; + case XFA_ELEMENT_Area: + case XFA_ELEMENT_Draw: + case XFA_ELEMENT_ExclGroup: + case XFA_ELEMENT_Field: + case XFA_ELEMENT_Subform: + case XFA_ELEMENT_SubformSet: + pLayoutPro->AddChangedContainer(this); + pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute, eValue, this, this); + break; + case XFA_ELEMENT_Sharptext: + case XFA_ELEMENT_Sharpxml: + case XFA_ELEMENT_SharpxHTML: { + CXFA_Node* pTextNode = this->GetNodeItem(XFA_NODEITEM_Parent); + if (!pTextNode) { + return; + } + CXFA_Node* pValueNode = pTextNode->GetNodeItem(XFA_NODEITEM_Parent); + if (!pValueNode) { + return; + } + XFA_ELEMENT eType = pValueNode->GetClassID(); + if (eType == XFA_ELEMENT_Value) { + bNeedFindContainer = TRUE; + CXFA_Node* pNode = pValueNode->GetNodeItem(XFA_NODEITEM_Parent); + if (pNode && pNode->IsContainerNode()) { + if (bScriptModify) { + pValueNode = pNode; + } + pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute, eValue, pValueNode, pNode); + } else { + pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute, eValue, pNode, pNode->GetNodeItem(XFA_NODEITEM_Parent)); + } + } else { + if (eType == XFA_ELEMENT_Items) { + CXFA_Node* pNode = pValueNode->GetNodeItem(XFA_NODEITEM_Parent); + if (pNode && pNode->IsContainerNode()) { + pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute, eValue, pValueNode, pNode); + } + } + } + } + break; + default: + break; + } + if (bNeedFindContainer) { + CXFA_Node* pParent = this; + while (pParent) { + if (pParent->IsContainerNode()) { + break; + } + pParent = pParent->GetNodeItem(XFA_NODEITEM_Parent); + } + if (pParent) { + pLayoutPro->AddChangedContainer(pParent); + } + } + } else { + pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute, eValue, this, this); + } +} +void CXFA_Node::Script_Attribute_String(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (bSetting) { + CFX_ByteString szValue; + FXJSE_Value_ToUTF8String(hValue, szValue); + CFX_WideString wsValue = CFX_WideString::FromUTF8(szValue, szValue.GetLength()); + SetAttribute(eAttribute, wsValue, TRUE); + if(eAttribute == XFA_ATTRIBUTE_Use && this->GetClassID() == XFA_ELEMENT_Desc) { + CFX_WideString wsUseVal = wsValue, wsID, wsSOM; + CXFA_Node* pTemplateNode = (CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_Template); + CXFA_Node* pProtoRoot = pTemplateNode->GetFirstChildByClass(XFA_ELEMENT_Subform)->GetFirstChildByClass(XFA_ELEMENT_Proto); + if(!wsUseVal.IsEmpty()) { + if(wsUseVal[0] == '#') { + wsID = CFX_WideString((FX_LPCWSTR)wsUseVal + 1, wsUseVal.GetLength() - 1); + } else { + wsSOM = CFX_WideString((FX_LPCWSTR)wsUseVal, wsUseVal.GetLength()); + } + } + CXFA_Node* pProtoNode = NULL; + if(!wsSOM.IsEmpty()) { + FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Attributes | XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings; + XFA_RESOLVENODE_RS resoveNodeRS; + FX_INT32 iRet = m_pDocument->GetScriptContext()->ResolveObjects(pProtoRoot, wsSOM, resoveNodeRS, dwFlag); + if(iRet > 0 && resoveNodeRS.nodes[0]->IsNode()) { + pProtoNode = (CXFA_Node*)resoveNodeRS.nodes[0]; + } + } else if(!wsID.IsEmpty()) { + pProtoNode = m_pDocument->GetNodeByID(pProtoRoot, wsID); + } + if(pProtoNode) { + CXFA_Node* pHeadChild = GetNodeItem(XFA_NODEITEM_FirstChild); + while (pHeadChild) { + CXFA_Node* pSibling = pHeadChild->GetNodeItem(XFA_NODEITEM_NextSibling); + RemoveChild(pHeadChild); + pHeadChild = pSibling; + } + CXFA_Node* pProtoForm = pProtoNode->CloneTemplateToForm(TRUE); + pHeadChild = pProtoForm->GetNodeItem(XFA_NODEITEM_FirstChild); + while (pHeadChild) { + CXFA_Node* pSibling = pHeadChild->GetNodeItem(XFA_NODEITEM_NextSibling); + pProtoForm->RemoveChild(pHeadChild); + InsertChild(pHeadChild); + pHeadChild = pSibling; + } + m_pDocument->RemovePurgeNode(pProtoForm); + delete pProtoForm; + } + } + } else { + CFX_WideString wsValue; + GetAttribute(eAttribute, wsValue); + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue, wsValue.GetLength())); + } +} +void CXFA_Node::Script_Attribute_StringRead(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (!bSetting) { + CFX_WideString wsValue; + GetAttribute(eAttribute, wsValue); + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue, wsValue.GetLength())); + } else { + ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); + } +} +void CXFA_Node::Script_WsdlConnection_Execute(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if ((argc == 0) || (argc == 1)) { + FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE); + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"execute")); + } +} +void CXFA_Node::Script_Delta_Restore(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"restore")); + } +} +void CXFA_Node::Script_Delta_CurrentValue(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ +} +void CXFA_Node::Script_Delta_SavedValue(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ +} +void CXFA_Node::Script_Delta_Target(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ +} +void CXFA_Node::Script_Som_Message(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_SOM_MESSAGETYPE iMessageType) +{ + CXFA_WidgetData *pWidgetData = GetWidgetData(); + if (!pWidgetData) { + return; + } + FX_BOOL bNew = FALSE; + CXFA_Validate validate = pWidgetData->GetValidate(); + if (!validate) { + validate = pWidgetData->GetValidate(TRUE); + bNew = TRUE; + } + if (bSetting) { + CFX_ByteString bsMessage; + FXJSE_Value_ToUTF8String(hValue, bsMessage); + switch (iMessageType) { + case XFA_SOM_ValidationMessage: + validate.SetScriptMessageText(CFX_WideString::FromUTF8(bsMessage, bsMessage.GetLength())); + break; + case XFA_SOM_FormatMessage: + validate.SetFormatMessageText(CFX_WideString::FromUTF8(bsMessage, bsMessage.GetLength())); + break; + case XFA_SOM_MandatoryMessage: + validate.SetNullMessageText(CFX_WideString::FromUTF8(bsMessage, bsMessage.GetLength())); + break; + default: + break; + } + if (!bNew) { + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + pNotify->AddCalcValidate(this); + } + } else { + CFX_WideString wsMessage; + switch (iMessageType) { + case XFA_SOM_ValidationMessage: + validate.GetScriptMessageText(wsMessage); + break; + case XFA_SOM_FormatMessage: + validate.GetFormatMessageText(wsMessage); + break; + case XFA_SOM_MandatoryMessage: + validate.GetNullMessageText(wsMessage); + break; + default: + break; + } + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsMessage)); + } +} +void CXFA_Node::Script_Som_ValidationMessage(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + Script_Som_Message(hValue, bSetting, XFA_SOM_ValidationMessage); +} +void CXFA_Node::Script_Field_Length(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (bSetting) { + ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); + } else { + CXFA_WidgetData *pWidgetData = GetWidgetData(); + if (!pWidgetData) { + FXJSE_Value_SetInteger(hValue, 0); + return; + } + FXJSE_Value_SetInteger(hValue, pWidgetData->CountChoiceListItems(TRUE)); + } +} +void CXFA_Node::Script_Som_DefaultValue(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + XFA_ELEMENT classID = GetClassID(); + if(classID == XFA_ELEMENT_Field) { + Script_Field_DefaultValue(hValue, bSetting, eAttribute); + return; + } else if(classID == XFA_ELEMENT_Draw) { + Script_Draw_DefaultValue(hValue, bSetting, eAttribute); + return; + } else if (classID == XFA_ELEMENT_Boolean) { + Script_Boolean_Value(hValue, bSetting, eAttribute); + return; + } + if (bSetting) { + CFX_ByteString newValue; + if (!(FXJSE_Value_IsNull(hValue) || FXJSE_Value_IsUndefined(hValue))) { + FXJSE_Value_ToUTF8String(hValue, newValue); + } + CFX_WideString wsNewValue = CFX_WideString::FromUTF8(newValue, newValue.GetLength()); + CFX_WideString wsFormatValue(wsNewValue); + CXFA_WidgetData* pContainerWidgetData = NULL; + if (GetPacketID() == XFA_XDPPACKET_Datasets) { + CXFA_NodeArray formNodes; + this->GetBindItems(formNodes); + CFX_WideString wsPicture; + for (FX_INT32 i = 0; i < formNodes.GetSize(); i++) { + CXFA_Node* pFormNode = formNodes.GetAt(i); + if (!pFormNode || pFormNode->HasFlag(XFA_NODEFLAG_HasRemoved)) { + continue; + } + pContainerWidgetData = pFormNode->GetContainerWidgetData(); + if (pContainerWidgetData) { + pContainerWidgetData->GetPictureContent(wsPicture, XFA_VALUEPICTURE_DataBind); + } + if (!wsPicture.IsEmpty()) { + break; + } + pContainerWidgetData = NULL; + } + } else if (GetPacketID() == XFA_XDPPACKET_Form) { + pContainerWidgetData = GetContainerWidgetData(); + } + if (pContainerWidgetData) { + pContainerWidgetData->GetFormatDataValue(wsNewValue, wsFormatValue); + } + SetScriptContent(wsNewValue, wsFormatValue, TRUE, TRUE); + } else { + CFX_WideString content = GetScriptContent(TRUE); + if(content.IsEmpty() && classID != XFA_ELEMENT_Text && classID != XFA_ELEMENT_SubmitUrl) { + FXJSE_Value_SetNull(hValue); + } else if (classID == XFA_ELEMENT_Integer) { + FXJSE_Value_SetInteger(hValue, FXSYS_wtoi(content)) ; + } else if (classID == XFA_ELEMENT_Float || classID == XFA_ELEMENT_Decimal) { + CFX_Decimal decimal(content); + FXJSE_Value_SetFloat(hValue, (FX_FLOAT)(double)decimal); + } else { + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(content, content.GetLength())); + } + } +} +void CXFA_Node::Script_Som_DefaultValue_Read(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (bSetting) { + ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); + return; + } + CFX_WideString content = GetScriptContent(TRUE); + if (content.IsEmpty()) { + FXJSE_Value_SetNull(hValue); + } else { + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(content, content.GetLength())); + } +} +void CXFA_Node::Script_Boolean_Value(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (bSetting) { + CFX_ByteString newValue; + if (!(FXJSE_Value_IsNull(hValue) || FXJSE_Value_IsUndefined(hValue))) { + FXJSE_Value_ToUTF8String(hValue, newValue); + } + FX_INT32 iValue = FXSYS_atoi(newValue); + CFX_WideString wsNewValue = (iValue == 0) ? FX_WSTRC(L"0") : FX_WSTRC(L"1"); + CFX_WideString wsFormatValue(wsNewValue); + CXFA_WidgetData* pContainerWidgetData = GetContainerWidgetData(); + if (pContainerWidgetData) { + pContainerWidgetData->GetFormatDataValue(wsNewValue, wsFormatValue); + } + SetScriptContent(wsNewValue, wsFormatValue, TRUE, TRUE); + } else { + CFX_WideString wsValue = GetScriptContent(TRUE); + FXJSE_Value_SetBoolean(hValue, wsValue.Equal(FX_WSTRC(L"1")) ? TRUE : FALSE); + } +} +struct XFA_ExecEventParaInfo { +public: + FX_UINT32 m_uHash; + FX_LPCWSTR m_lpcEventName; + XFA_EVENTTYPE m_eventType; + FX_UINT32 m_validFlags; +}; +static const XFA_ExecEventParaInfo gs_eventParaInfos[] = { + {0x02a6c55a, (FX_LPCWSTR)L"postSubmit", XFA_EVENT_PostSubmit, 0}, + {0x0ab466bb, (FX_LPCWSTR)L"preSubmit", XFA_EVENT_PreSubmit, 0}, + {0x109d7ce7, (FX_LPCWSTR)L"mouseEnter", XFA_EVENT_MouseEnter, 5}, + {0x17fad373, (FX_LPCWSTR)L"postPrint", XFA_EVENT_PostPrint, 0}, + {0x1bfc72d9, (FX_LPCWSTR)L"preOpen", XFA_EVENT_PreOpen, 7}, + {0x2196a452, (FX_LPCWSTR)L"initialize", XFA_EVENT_Initialize, 1}, + {0x27410f03, (FX_LPCWSTR)L"mouseExit", XFA_EVENT_MouseExit, 5}, + {0x33c43dec, (FX_LPCWSTR)L"docClose", XFA_EVENT_DocClose, 0}, + {0x361fa1b6, (FX_LPCWSTR)L"preSave", XFA_EVENT_PreSave, 0}, + {0x36f1c6d8, (FX_LPCWSTR)L"preSign", XFA_EVENT_PreSign, 6}, + {0x4731d6ba, (FX_LPCWSTR)L"exit", XFA_EVENT_Exit, 2}, + {0x56bf456b, (FX_LPCWSTR)L"docReady", XFA_EVENT_DocReady, 0}, + {0x7233018a, (FX_LPCWSTR)L"validate", XFA_EVENT_Validate, 1}, + {0x8808385e, (FX_LPCWSTR)L"indexChange", XFA_EVENT_IndexChange, 3}, + {0x891f4606, (FX_LPCWSTR)L"change", XFA_EVENT_Change, 4}, + {0x9528a7b4, (FX_LPCWSTR)L"prePrint", XFA_EVENT_PrePrint, 0}, + {0x9f693b21, (FX_LPCWSTR)L"mouseDown", XFA_EVENT_MouseDown, 5}, + {0xcdce56b3, (FX_LPCWSTR)L"full", XFA_EVENT_Full, 4}, + {0xd576d08e, (FX_LPCWSTR)L"mouseUp", XFA_EVENT_MouseUp, 5}, + {0xd95657a6, (FX_LPCWSTR)L"click", XFA_EVENT_Click, 4}, + {0xdbfbe02e, (FX_LPCWSTR)L"calculate", XFA_EVENT_Calculate, 1}, + {0xe25fa7b8, (FX_LPCWSTR)L"postOpen", XFA_EVENT_PostOpen, 7}, + {0xe28dce7e, (FX_LPCWSTR)L"enter", XFA_EVENT_Enter, 2}, + {0xfc82d695, (FX_LPCWSTR)L"postSave", XFA_EVENT_PostSave, 0}, + {0xfd54fbb7, (FX_LPCWSTR)L"postSign", XFA_EVENT_PostSign, 6}, +}; +const XFA_ExecEventParaInfo* GetEventParaInfoByName(FX_WSTR wsEventName) +{ + FX_INT32 iLength = wsEventName.GetLength(); + FX_UINT32 uHash = FX_HashCode_String_GetW(wsEventName.GetPtr(), iLength); + const XFA_ExecEventParaInfo* eventParaInfo = NULL; + FX_INT32 iStart = 0, iEnd = (sizeof(gs_eventParaInfos) / sizeof(gs_eventParaInfos[0])) - 1; + FX_INT32 iMid = (iStart + iEnd) / 2; + do { + iMid = (iStart + iEnd) / 2; + eventParaInfo = &gs_eventParaInfos[iMid]; + if (uHash == eventParaInfo->m_uHash) { + return eventParaInfo; + } else if (uHash < eventParaInfo->m_uHash) { + iEnd = iMid - 1; + } else { + iStart = iMid + 1; + } + } while (iStart <= iEnd); + return NULL; +} +void XFA_STRING_TO_RGB(CFX_WideString &strRGB, FX_INT32 &r, FX_INT32 &g, FX_INT32 &b) +{ + r = 0; + g = 0; + b = 0; + FX_WCHAR zero = '0'; + FX_INT32 iIndex = 0; + FX_INT32 iLen = strRGB.GetLength(); + for (FX_INT32 i = 0; i < iLen; ++i) { + FX_WCHAR ch = strRGB.GetAt(i); + if (ch == L',') { + ++iIndex; + } + if (iIndex > 2) { + break; + } + FX_INT32 iValue = ch - zero; + if (iValue >= 0 && iValue <= 9) { + switch (iIndex) { + case 0: + r = r * 10 + iValue; + break; + case 1: + g = g * 10 + iValue; + break; + default: + b = b * 10 + iValue; + break; + } + } + } +} +void CXFA_Node::Script_Som_BorderColor(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + CXFA_WidgetData* pWidgetData = GetWidgetData(); + if (!pWidgetData) { + return; + } + CXFA_Border border = pWidgetData->GetBorder(TRUE); + FX_INT32 iSize = border.CountEdges(); + CFX_WideString strColor; + if (bSetting) { + CFX_ByteString bsValue; + FXJSE_Value_ToUTF8String(hValue, bsValue); + strColor = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()); + FX_INT32 r = 0, g = 0, b = 0; + XFA_STRING_TO_RGB(strColor, r, g, b); + FX_ARGB rgb = ArgbEncode(100, r, g, b); + for (FX_INT32 i = 0; i < iSize; ++i) { + CXFA_Edge edge = border.GetEdge(i); + edge.SetColor(rgb); + } + } else { + CXFA_Edge edge = border.GetEdge(0); + FX_ARGB color = edge.GetColor(); + FX_INT32 a, r, g, b; + ArgbDecode(color, a, r, g, b); + strColor.Format((FX_LPCWSTR)L"%d,%d,%d", r, g, b); + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(strColor)); + } +} +void CXFA_Node::Script_Som_BorderWidth(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + CXFA_WidgetData* pWidgetData = GetWidgetData(); + if (!pWidgetData) { + return; + } + CXFA_Border border = pWidgetData->GetBorder(TRUE); + FX_INT32 iSize = border.CountEdges(); + CFX_WideString wsThickness; + if (bSetting) { + CFX_ByteString bsValue; + FXJSE_Value_ToUTF8String(hValue, bsValue); + wsThickness = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()); + for (FX_INT32 i = 0; i < iSize; ++i) { + CXFA_Edge edge = border.GetEdge(i); + CXFA_Measurement thickness(wsThickness); + edge.SetMSThickness(thickness); + } + } else { + CXFA_Edge edge = border.GetEdge(0); + CXFA_Measurement thickness = edge.GetMSThickness(); + thickness.ToString(wsThickness); + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsThickness)); + } +} +void CXFA_Node::Script_Som_FillColor(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + CXFA_WidgetData* pWidgetData = GetWidgetData(); + if (!pWidgetData) { + return; + } + CXFA_Border border = pWidgetData->GetBorder(TRUE); + CXFA_Fill borderfill = border.GetFill(TRUE); + CXFA_Node *pNode = (CXFA_Node*)borderfill; + if (!pNode) { + return; + } + CFX_WideString wsColor; + if (bSetting) { + CFX_ByteString bsValue; + FXJSE_Value_ToUTF8String(hValue, bsValue); + wsColor = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()); + FX_INT32 r, g, b; + XFA_STRING_TO_RGB(wsColor, r, g, b); + FX_ARGB color = ArgbEncode(0xff, r, g, b); + borderfill.SetColor(color); + } else { + FX_ARGB color = borderfill.GetColor(); + FX_INT32 a, r, g, b; + ArgbDecode(color, a, r, g, b); + wsColor.Format((FX_LPCWSTR)L"%d,%d,%d", r, g, b); + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsColor)); + } +} +void CXFA_Node::Script_Som_DataNode(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (!bSetting) { + CXFA_Node *pDataNode = GetBindData(); + if (pDataNode) { + FXJSE_Value_Set(hValue, m_pDocument->GetScriptContext()->GetJSValueFromMap(pDataNode)); + } else { + FXJSE_Value_SetNull(hValue); + } + } else { + ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); + } +} +void CXFA_Node::Script_Draw_DefaultValue(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (bSetting) { + if (FXJSE_Value_IsUTF8String(hValue)) { + CXFA_WidgetData *pWidgetData = GetWidgetData(); + FXSYS_assert(pWidgetData); + XFA_ELEMENT uiType = pWidgetData->GetUIType(); + if (uiType == XFA_ELEMENT_Text) { + CFX_ByteString newValue; + FXJSE_Value_ToUTF8String(hValue, newValue); + CFX_WideString wsNewValue = CFX_WideString::FromUTF8(newValue, newValue.GetLength()); + CFX_WideString wsFormatValue(wsNewValue); + SetScriptContent(wsNewValue, wsFormatValue, TRUE, TRUE); + } else if(uiType != XFA_ELEMENT_Image) { + } + } + } else { + CFX_WideString content = GetScriptContent(TRUE); + if(content.IsEmpty()) { + FXJSE_Value_SetNull(hValue); + } else { + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(content, content.GetLength())); + } + } +} +void CXFA_Node::Script_Field_DefaultValue(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + CXFA_WidgetData* pWidgetData = GetWidgetData(); + if (!pWidgetData) { + return; + } + if (bSetting) { + if (FXJSE_Value_IsNull(hValue)) { + pWidgetData->m_bPreNull = pWidgetData->m_bIsNull; + pWidgetData->m_bIsNull = TRUE; + } else { + pWidgetData->m_bPreNull = pWidgetData->m_bIsNull; + pWidgetData->m_bIsNull = FALSE; + } + CFX_ByteString newValue; + if (!(FXJSE_Value_IsNull(hValue) || FXJSE_Value_IsUndefined(hValue))) { + FXJSE_Value_ToUTF8String(hValue, newValue); + } + CFX_WideString wsNewText = CFX_WideString::FromUTF8(newValue, newValue.GetLength()); + CXFA_Node *pUIChild = pWidgetData->GetUIChild(); + if (pUIChild->GetClassID() == XFA_ELEMENT_NumericEdit) { + FX_INT32 iLeadDigits = 0; + FX_INT32 iFracDigits = 0; + pWidgetData->GetLeadDigits(iLeadDigits); + pWidgetData->GetFracDigits(iFracDigits); + wsNewText = XFA_NumericLimit(wsNewText, iLeadDigits, iFracDigits); + } + CXFA_WidgetData* pContainerWidgetData = GetContainerWidgetData(); + CFX_WideString wsFormatText(wsNewText); + if (pContainerWidgetData) { + pContainerWidgetData->GetFormatDataValue(wsNewText, wsFormatText); + } + SetScriptContent(wsNewText, wsFormatText, TRUE, TRUE); + } else { + CFX_WideString content = GetScriptContent(TRUE); + if(content.IsEmpty()) { + FXJSE_Value_SetNull(hValue); + } else { + CXFA_Node *pUIChild = pWidgetData->GetUIChild(); + XFA_ELEMENT eUI = pUIChild->GetClassID(); + CXFA_Value defVal = pWidgetData->GetFormValue(); + CXFA_Node* pNode = defVal.GetNode()->GetNodeItem(XFA_NODEITEM_FirstChild); + if (pNode && pNode->GetClassID() == XFA_ELEMENT_Decimal) { + if(eUI == XFA_ELEMENT_NumericEdit && (pNode->GetInteger(XFA_ATTRIBUTE_FracDigits) == -1)) { + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(content, content.GetLength())); + } else { + CFX_Decimal decimal(content); + FXJSE_Value_SetFloat(hValue, (FX_FLOAT)(double)decimal); + } + } else if (pNode && pNode->GetClassID() == XFA_ELEMENT_Integer) { + FXJSE_Value_SetInteger(hValue, FXSYS_wtoi(content)) ; + } else if (pNode && pNode->GetClassID() == XFA_ELEMENT_Boolean) { + FXJSE_Value_SetBoolean(hValue, FXSYS_wtoi(content) == 0 ? FALSE : TRUE); + } else if (pNode && pNode->GetClassID() == XFA_ELEMENT_Float) { + CFX_Decimal decimal(content); + FXJSE_Value_SetFloat(hValue, (FX_FLOAT)(double)decimal); + } else { + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(content, content.GetLength())); + } + } + } +} +void CXFA_Node::Script_Field_EditValue(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + CXFA_WidgetData* pWidgetData = GetWidgetData(); + if (!pWidgetData) { + return; + } + CFX_WideString wsValue; + if (bSetting) { + CFX_ByteString bsValue; + FXJSE_Value_ToUTF8String(hValue, bsValue); + wsValue = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()); + pWidgetData->SetValue(wsValue, XFA_VALUEPICTURE_Edit); + } else { + pWidgetData->GetValue(wsValue, XFA_VALUEPICTURE_Edit); + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue)); + } +} +void CXFA_Node::Script_Som_FontColor(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + CXFA_WidgetData* pWidgetData = GetWidgetData(); + if (!pWidgetData) { + return; + } + CXFA_Font font = pWidgetData->GetFont(TRUE); + CXFA_Node *pNode = (CXFA_Node*)font; + if (!pNode) { + return; + } + CFX_WideString wsColor; + if (bSetting) { + CFX_ByteString bsValue; + FXJSE_Value_ToUTF8String(hValue, bsValue); + wsColor = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()); + FX_INT32 r, g, b; + XFA_STRING_TO_RGB(wsColor, r, g, b); + FX_ARGB color = ArgbEncode(0xff, r, g, b); + font.SetColor(color); + } else { + FX_ARGB color = font.GetColor(); + FX_INT32 a, r, g, b; + ArgbDecode(color, a, r, g, b); + wsColor.Format((FX_LPCWSTR)L"%d,%d,%d", r, g, b); + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsColor)); + } +} +void CXFA_Node::Script_Field_FormatMessage(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + Script_Som_Message(hValue, bSetting, XFA_SOM_FormatMessage); +} +void CXFA_Node::Script_Field_FormattedValue(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + CXFA_WidgetData* pWidgetData = GetWidgetData(); + if (!pWidgetData) { + return; + } + CFX_WideString wsValue; + if (bSetting) { + CFX_ByteString bsValue; + FXJSE_Value_ToUTF8String(hValue, bsValue); + wsValue = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()); + pWidgetData->SetValue(wsValue, XFA_VALUEPICTURE_Display); + } else { + pWidgetData->GetValue(wsValue, XFA_VALUEPICTURE_Display); + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue)); + } +} +void CXFA_Node::Script_Som_Mandatory(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + CXFA_WidgetData* pWidgetData = GetWidgetData(); + if (!pWidgetData) { + return; + } + CXFA_Validate validate = pWidgetData->GetValidate(TRUE); + CFX_WideString wsValue; + if (bSetting) { + CFX_ByteString bsValue; + FXJSE_Value_ToUTF8String(hValue, bsValue); + wsValue = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()); + validate.SetNullTest(wsValue); + } else { + FX_INT32 iValue = validate.GetNullTest(); + XFA_LPCATTRIBUTEENUMINFO pInfo = XFA_GetAttributeEnumByID((XFA_ATTRIBUTEENUM)iValue); + if (pInfo) { + wsValue = pInfo->pName; + } + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue)); + } +} +void CXFA_Node::Script_Som_MandatoryMessage(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + Script_Som_Message(hValue, bSetting, XFA_SOM_MandatoryMessage); +} +void CXFA_Node::Script_Field_ParentSubform(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (bSetting) { + ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); + } else { + FXJSE_Value_SetNull(hValue); + } +} +void CXFA_Node::Script_Field_SelectedIndex(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + CXFA_WidgetData* pWidgetData = GetWidgetData(); + if (!pWidgetData) { + return; + } + if (bSetting) { + FX_INT32 iIndex = FXJSE_Value_ToInteger(hValue); + if (iIndex == -1) { + pWidgetData->ClearAllSelections(); + return; + } + pWidgetData->SetItemState(iIndex, TRUE, TRUE, TRUE); + } else { + FXJSE_Value_SetInteger(hValue, pWidgetData->GetSelectedItem()); + } +} +void CXFA_Node::Script_Field_ClearItems(CFXJSE_Arguments* pArguments) +{ + CXFA_WidgetData* pWidgetData = GetWidgetData(); + if (!pWidgetData) { + return; + } + pWidgetData->DeleteItem(-1, TRUE); +} +void CXFA_Node::Script_Field_ExecEvent(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 1) { + CFX_ByteString eventString = pArguments->GetUTF8String(0); + FX_INT32 iRet = execSingleEventByName(CFX_WideString::FromUTF8(eventString, eventString.GetLength()), XFA_ELEMENT_Field); + if (eventString == FX_BSTRC("validate")) { + FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), ((iRet == XFA_EVENTERROR_Error) ? FALSE : TRUE)); + } + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"execEvent")); + } +} +void CXFA_Node::Script_Field_ExecInitialize(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Initialize, FALSE, FALSE); + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"execInitialize")); + } +} +void CXFA_Node::Script_Field_DeleteItem(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength != 1) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"deleteItem")); + return; + } + CXFA_WidgetData* pWidgetData = GetWidgetData(); + if (!pWidgetData) { + return; + } + FX_INT32 iIndex = pArguments->GetInt32(0); + FX_BOOL bValue = pWidgetData->DeleteItem(iIndex, TRUE, TRUE); + FXJSE_HVALUE hValue = pArguments->GetReturnValue(); + if (hValue) { + FXJSE_Value_SetBoolean(hValue, bValue); + } +} +void CXFA_Node::Script_Field_GetSaveItem(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength != 1) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"getSaveItem")); + return; + } + FX_INT32 iIndex = pArguments->GetInt32(0); + if (iIndex < 0) { + FXJSE_Value_SetNull(pArguments->GetReturnValue()); + return; + } + CXFA_WidgetData* pWidgetData = GetWidgetData(); + if (!pWidgetData) { + FXJSE_Value_SetNull(pArguments->GetReturnValue()); + return; + } + CFX_WideString wsValue; + FX_BOOL bHasItem = pWidgetData->GetChoiceListItem(wsValue, iIndex, TRUE); + if (bHasItem) { + FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), FX_UTF8Encode(wsValue, wsValue.GetLength())); + } else { + FXJSE_Value_SetNull(pArguments->GetReturnValue()); + } +} +void CXFA_Node::Script_Field_BoundItem(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength != 1) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"boundItem")); + return; + } + CXFA_WidgetData* pWidgetData = GetWidgetData(); + if (!pWidgetData) { + return; + } + CFX_ByteString bsValue = pArguments->GetUTF8String(0); + CFX_WideString wsValue = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()); + CFX_WideString wsBoundValue; + pWidgetData->GetItemValue(wsValue, wsBoundValue); + FXJSE_HVALUE hValue = pArguments->GetReturnValue(); + if (hValue) { + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsBoundValue)); + } +} +void CXFA_Node::Script_Field_GetItemState(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength != 1) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"getItemState")); + return; + } + CXFA_WidgetData* pWidgetData = GetWidgetData(); + if (!pWidgetData) { + return; + } + FX_INT32 iIndex = pArguments->GetInt32(0); + FX_BOOL bValue = pWidgetData->GetItemState(iIndex); + FXJSE_HVALUE hValue = pArguments->GetReturnValue(); + if (hValue) { + FXJSE_Value_SetBoolean(hValue, bValue); + } +} +void CXFA_Node::Script_Field_ExecCalculate(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate, FALSE, FALSE); + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"execCalculate")); + } +} +void CXFA_Node::Script_Field_SetItems(CFXJSE_Arguments* pArguments) +{ +} +void CXFA_Node::Script_Field_GetDisplayItem(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength != 1) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"getDisplayItem")); + return; + } + FX_INT32 iIndex = pArguments->GetInt32(0); + if (iIndex < 0) { + FXJSE_Value_SetNull(pArguments->GetReturnValue()); + return; + } + CXFA_WidgetData* pWidgetData = GetWidgetData(); + if (!pWidgetData) { + FXJSE_Value_SetNull(pArguments->GetReturnValue()); + return; + } + CFX_WideString wsValue; + FX_BOOL bHasItem = pWidgetData->GetChoiceListItem(wsValue, iIndex, FALSE); + if (bHasItem) { + FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), FX_UTF8Encode(wsValue, wsValue.GetLength())); + } else { + FXJSE_Value_SetNull(pArguments->GetReturnValue()); + } +} +void CXFA_Node::Script_Field_SetItemState(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength != 2) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"setItemState")); + return; + } + CXFA_WidgetData* pWidgetData = GetWidgetData(); + if (!pWidgetData) { + return; + } + FX_INT32 iIndex = pArguments->GetInt32(0); + FX_BOOL bAdd = pArguments->GetInt32(1) == 0 ? FALSE : TRUE; + if (bAdd) { + pWidgetData->SetItemState(iIndex, TRUE, TRUE, TRUE); + } else { + if (pWidgetData->GetItemState(iIndex)) { + pWidgetData->SetItemState(iIndex, FALSE, TRUE, TRUE); + } + } +} +void CXFA_Node::Script_Field_AddItem(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength < 1 || iLength > 2) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"addItem")); + return; + } + CXFA_WidgetData* pWidgetData = GetWidgetData(); + if (!pWidgetData) { + return; + } + CFX_WideString wsLabel; + CFX_WideString wsValue; + if (iLength >= 1) { + CFX_ByteString bsLable = pArguments->GetUTF8String(0); + wsLabel = CFX_WideString::FromUTF8(bsLable, bsLable.GetLength()); + } + if (iLength >= 2) { + CFX_ByteString bsValue = pArguments->GetUTF8String(1); + wsValue = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()); + } + pWidgetData->InsertItem(wsLabel, wsValue, -1, TRUE); +} +void CXFA_Node::Script_Field_ExecValidate(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE); + } else { + FX_INT32 iRet = pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate, FALSE, FALSE); + FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), ((iRet == XFA_EVENTERROR_Error) ? FALSE : TRUE)); + } + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"execValidate")); + } +} +void CXFA_Node::Script_ExclGroup_ErrorText(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (!bSetting) { + } else { + ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); + } +} +void CXFA_Node::Script_ExclGroup_DefaultAndRawValue(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + CXFA_WidgetData* pWidgetData = GetWidgetData(); + if(!pWidgetData) { + return; + } + if (bSetting) { + CFX_ByteString bsValue; + FXJSE_Value_ToUTF8String(hValue, bsValue); + pWidgetData->SetSelectedMemberByValue(CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()), TRUE, TRUE); + } else { + CFX_WideString wsValue = GetScriptContent(TRUE); + XFA_VERSION curVersion = GetDocument()->GetCurVersionMode(); + if (wsValue.IsEmpty() && curVersion >= XFA_VERSION_300) { + FXJSE_Value_SetNull(hValue); + } else { + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue)); + } + } +} +void CXFA_Node::Script_ExclGroup_Transient(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ +} +void CXFA_Node::Script_ExclGroup_ExecEvent(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 1) { + CFX_ByteString eventString = pArguments->GetUTF8String(0); + execSingleEventByName(CFX_WideString::FromUTF8(eventString, eventString.GetLength()), XFA_ELEMENT_ExclGroup); + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"execEvent")); + } +} +void CXFA_Node::Script_ExclGroup_SelectedMember(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if ((argc == 0) || (argc == 1)) { + CXFA_WidgetData* pWidgetData = GetWidgetData(); + if (!pWidgetData) { + FXJSE_Value_SetNull(pArguments->GetReturnValue()); + } else { + CXFA_Node * pReturnNode = NULL; + if (argc == 0) { + pReturnNode = pWidgetData->GetSelectedMember(); + } else { + CFX_ByteString szName; + szName = pArguments->GetUTF8String(0); + pReturnNode = pWidgetData->SetSelectedMember(CFX_WideString::FromUTF8(szName, szName.GetLength())); + } + if (pReturnNode) { + FXJSE_Value_Set(pArguments->GetReturnValue(), m_pDocument->GetScriptContext()->GetJSValueFromMap(pReturnNode)); + } else { + FXJSE_Value_SetNull(pArguments->GetReturnValue()); + } + } + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"selectedMember")); + } +} +void CXFA_Node::Script_ExclGroup_ExecInitialize(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Initialize); + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"execInitialize")); + } +} +void CXFA_Node::Script_ExclGroup_ExecCalculate(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate); + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"execCalculate")); + } +} +void CXFA_Node::Script_ExclGroup_ExecValidate(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE); + } else { + FX_INT32 iRet = pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate); + FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), ((iRet == XFA_EVENTERROR_Error) ? FALSE : TRUE)); + } + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"execValidate")); + } +} +static CXFA_Node* XFA_ScriptInstanceManager_GetItem(CXFA_Node *pInstMgrNode, FX_INT32 iIndex) +{ + ASSERT(pInstMgrNode); + FX_INT32 iCount = 0; + FX_DWORD dwNameHash = 0; + for(CXFA_Node* pNode = pInstMgrNode->GetNodeItem(XFA_NODEITEM_NextSibling); pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + XFA_ELEMENT eCurType = pNode->GetClassID(); + if (eCurType == XFA_ELEMENT_InstanceManager) { + break; + } + if ((eCurType != XFA_ELEMENT_Subform) && (eCurType != XFA_ELEMENT_SubformSet)) { + continue; + } + if (iCount == 0) { + CFX_WideStringC wsName = pNode->GetCData(XFA_ATTRIBUTE_Name); + CFX_WideStringC wsInstName = pInstMgrNode->GetCData(XFA_ATTRIBUTE_Name); + if (wsInstName.GetLength() < 1 || wsInstName.GetAt(0) != '_' || wsInstName.Mid(1) != wsName) { + return NULL; + } + dwNameHash = pNode->GetNameHash(); + } + if (dwNameHash != pNode->GetNameHash()) { + break; + } + iCount ++; + if (iCount > iIndex) { + return pNode; + } + } + return NULL; +} +void CXFA_Node::Script_Som_InstanceIndex(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (bSetting) { + FX_INT32 iTo = FXJSE_Value_ToInteger(hValue); + FX_INT32 iFrom = Subform_and_SubformSet_InstanceIndex(); + CXFA_Node *pManagerNode = NULL; + for (CXFA_Node *pNode = GetNodeItem(XFA_NODEITEM_PrevSibling); pNode != NULL; pNode = pNode->GetNodeItem(XFA_NODEITEM_PrevSibling)) { + if (pNode->GetClassID() == XFA_ELEMENT_InstanceManager) { + pManagerNode = pNode; + break; + } + } + if (pManagerNode) { + pManagerNode->InstanceManager_MoveInstance(iTo, iFrom); + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + CXFA_Node* pToInstance = XFA_ScriptInstanceManager_GetItem(pManagerNode, iTo); + if (pToInstance && pToInstance->GetClassID() == XFA_ELEMENT_Subform) { + pNotify->RunSubformIndexChange(pToInstance); + } + CXFA_Node* pFromInstance = XFA_ScriptInstanceManager_GetItem(pManagerNode, iFrom); + if (pFromInstance && pFromInstance->GetClassID() == XFA_ELEMENT_Subform) { + pNotify->RunSubformIndexChange(pFromInstance); + } + } + } else { + FXJSE_Value_SetInteger(hValue, Subform_and_SubformSet_InstanceIndex()); + } +} +void CXFA_Node::Script_Subform_InstanceManager(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (!bSetting) { + CFX_WideStringC wsName = this->GetCData(XFA_ATTRIBUTE_Name); + CXFA_Node* pInstanceMgr = NULL; + for (CXFA_Node *pNode = GetNodeItem(XFA_NODEITEM_PrevSibling); pNode != NULL; pNode = pNode->GetNodeItem(XFA_NODEITEM_PrevSibling)) { + if (pNode->GetClassID() == XFA_ELEMENT_InstanceManager) { + CFX_WideStringC wsInstMgrName = pNode->GetCData(XFA_ATTRIBUTE_Name); + if (wsInstMgrName.GetLength() >= 1 && wsInstMgrName.GetAt(0) == '_' && wsInstMgrName.Mid(1) == wsName) { + pInstanceMgr = pNode; + } + break; + } + } + if (pInstanceMgr) { + FXJSE_Value_Set(hValue, m_pDocument->GetScriptContext()->GetJSValueFromMap(pInstanceMgr)); + } else { + FXJSE_Value_SetNull(hValue); + } + } else { + ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); + } +} +void CXFA_Node::Script_Subform_Locale(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (bSetting) { + CFX_ByteString bsLocaleName; + FXJSE_Value_ToUTF8String(hValue, bsLocaleName); + this->SetCData(XFA_ATTRIBUTE_Locale, CFX_WideString::FromUTF8(bsLocaleName, bsLocaleName.GetLength()), TRUE, TRUE); + } else { + CFX_WideString wsLocaleName; + GetLocaleName(wsLocaleName); + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsLocaleName, wsLocaleName.GetLength())); + } +} +void CXFA_Node::Script_Subform_ExecEvent(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 1) { + CFX_ByteString eventString = pArguments->GetUTF8String(0); + execSingleEventByName(CFX_WideString::FromUTF8(eventString, eventString.GetLength()), XFA_ELEMENT_Subform); + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"execEvent")); + } +} +void CXFA_Node::Script_Subform_ExecInitialize(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Initialize); + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"execInitialize")); + } +} +void CXFA_Node::Script_Subform_ExecCalculate(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate); + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"execCalculate")); + } +} +void CXFA_Node::Script_Subform_ExecValidate(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE); + } else { + FX_INT32 iRet = pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate); + FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), ((iRet == XFA_EVENTERROR_Error) ? FALSE : TRUE)); + } + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"execValidate")); + } +} +void CXFA_Node::Script_Subform_GetInvalidObjects(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"getInvalidObjects")); + } +} +FX_INT32 CXFA_Node::Subform_and_SubformSet_InstanceIndex() +{ + FX_INT32 index = 0; + for (CXFA_Node *pNode = GetNodeItem(XFA_NODEITEM_PrevSibling); pNode != NULL; pNode = pNode->GetNodeItem(XFA_NODEITEM_PrevSibling)) { + if ((pNode->GetClassID() == XFA_ELEMENT_Subform) || (pNode->GetClassID() == XFA_ELEMENT_SubformSet)) { + index++; + } else { + break; + } + } + return index; +} +void CXFA_Node::Script_Template_FormNodes(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 1) { + FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), TRUE); + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"formNodes")); + } +} +void CXFA_Node::Script_Template_Remerge(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + m_pDocument->DoDataRemerge(TRUE); + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"remerge")); + } +} +void CXFA_Node::Script_Template_ExecInitialize(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + CXFA_WidgetData* pWidgetData = GetWidgetData(); + if (!pWidgetData) { + FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE); + } else { + FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), TRUE); + } + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"execInitialize")); + } +} +void CXFA_Node::Script_Template_CreateNode(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if ((argc > 0) && (argc < 4)) { + CFX_WideString strTagName; + CFX_WideString strName; + CFX_WideString strNameSpace; + CFX_ByteString bsTagName = pArguments->GetUTF8String(0); + strTagName = CFX_WideString::FromUTF8(bsTagName, bsTagName.GetLength()); + if (argc > 1) { + CFX_ByteString bsName = pArguments->GetUTF8String(1); + strName = CFX_WideString::FromUTF8(bsName, bsName.GetLength()); + if (argc == 3) { + CFX_ByteString bsNameSpace = pArguments->GetUTF8String(2); + strNameSpace = CFX_WideString::FromUTF8(bsNameSpace, bsNameSpace.GetLength()); + } + } + XFA_LPCELEMENTINFO pElement = XFA_GetElementByName(strTagName); + CXFA_Node *pNewNode = CreateSamePacketNode(pElement->eName); + if (!pNewNode) { + FXJSE_Value_SetNull(pArguments->GetReturnValue()); + } else { + if (!strName.IsEmpty()) { + if ( XFA_GetAttributeOfElement(pElement->eName, XFA_ATTRIBUTE_Name, XFA_XDPPACKET_UNKNOWN)) { + pNewNode->SetAttribute(XFA_ATTRIBUTE_Name, strName, TRUE); + if (pNewNode->GetPacketID() == XFA_XDPPACKET_Datasets) { + pNewNode->CreateXMLMappingNode(); + } + FXJSE_Value_Set(pArguments->GetReturnValue(), m_pDocument->GetScriptContext()->GetJSValueFromMap(pNewNode)); + } else { + ThrowScriptErrorMessage(XFA_IDS_NOT_HAVE_PROPERTY, (FX_LPCWSTR)strTagName, (FX_LPCWSTR)(L"name")); + } + } else { + FXJSE_Value_Set(pArguments->GetReturnValue(), m_pDocument->GetScriptContext()->GetJSValueFromMap(pNewNode)); + } + } + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"createNode")); + } +} +void CXFA_Node::Script_Template_Recalculate(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 1) { + FX_BOOL bScriptFlags = pArguments->GetInt32(0) == 0 ? FALSE : TRUE; + FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), TRUE); + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"recalculate")); + } +} +void CXFA_Node::Script_Template_ExecCalculate(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + CXFA_WidgetData* pWidgetData = GetWidgetData(); + if (!pWidgetData) { + FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE); + } else { + FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), TRUE); + } + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"execCalculate")); + } +} +void CXFA_Node::Script_Template_ExecValidate(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + CXFA_WidgetData* pWidgetData = GetWidgetData(); + if (!pWidgetData) { + FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE); + } else { + FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), TRUE); + } + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"execValidate")); + } +} +void CXFA_Node::Script_Manifest_Evaluate(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + CXFA_WidgetData* pWidgetData = GetWidgetData(); + if (!pWidgetData) { + FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE); + } else { + FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), TRUE); + } + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"evaluate")); + } +} +void CXFA_Node::Script_InstanceManager_Max(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (bSetting) { + ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); + return; + } else { + CXFA_Occur nodeOccur = GetOccurNode(); + FXJSE_Value_SetInteger(hValue, nodeOccur.GetMax()); + } +} +void CXFA_Node::Script_InstanceManager_Min(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (bSetting) { + ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); + return; + } else { + CXFA_Occur nodeOccur = GetOccurNode(); + FXJSE_Value_SetInteger(hValue, nodeOccur.GetMin()); + } +} +static FX_INT32 XFA_ScriptInstanceManager_GetCount(CXFA_Node *pInstMgrNode) +{ + ASSERT(pInstMgrNode); + FX_INT32 iCount = 0; + FX_DWORD dwNameHash = 0; + for(CXFA_Node* pNode = pInstMgrNode->GetNodeItem(XFA_NODEITEM_NextSibling); pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + XFA_ELEMENT eCurType = pNode->GetClassID(); + if (eCurType == XFA_ELEMENT_InstanceManager) { + break; + } + if ((eCurType != XFA_ELEMENT_Subform) && (eCurType != XFA_ELEMENT_SubformSet)) { + continue; + } + if (iCount == 0) { + CFX_WideStringC wsName = pNode->GetCData(XFA_ATTRIBUTE_Name); + CFX_WideStringC wsInstName = pInstMgrNode->GetCData(XFA_ATTRIBUTE_Name); + if (wsInstName.GetLength() < 1 || wsInstName.GetAt(0) != '_' || wsInstName.Mid(1) != wsName) { + return iCount; + } + dwNameHash = pNode->GetNameHash(); + } + if (dwNameHash != pNode->GetNameHash()) { + break; + } + iCount ++; + } + return iCount; +} +static void XFA_ScriptInstanceManager_ReorderDataNodes_SortNodeArrayByDocumentIdx(const CXFA_NodeSet& rgNodeSet, CXFA_NodeArray& rgNodeArray, CFX_ArrayTemplate& rgIdxArray) +{ + FX_INT32 iCount = rgNodeSet.GetCount(); + rgNodeArray.SetSize(iCount); + rgIdxArray.SetSize(iCount); + if(iCount == 0) { + return; + } + FX_INT32 iIndex = -1, iTotalIndex = -1; + CXFA_Node* pNode = NULL; + FX_POSITION pos = rgNodeSet.GetStartPosition(); + rgNodeSet.GetNextAssoc(pos, pNode); + for(pNode = pNode->GetNodeItem(XFA_NODEITEM_Parent)->GetNodeItem(XFA_NODEITEM_FirstChild); + pNode && iIndex < iCount; + pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + iTotalIndex++; + if(rgNodeSet.Lookup(pNode)) { + iIndex ++; + rgNodeArray[iIndex] = pNode; + rgIdxArray[iIndex] = iTotalIndex; + } + } +} +struct CXFA_DualNodeArray : CFX_Object { + CXFA_NodeSet firstNodeList; + CXFA_NodeSet secondNodeList; +}; +static void XFA_ScriptInstanceManager_ReorderDataNodes(CXFA_NodeSet& sSet1, CXFA_NodeSet& sSet2, FX_BOOL bInsertBefore) +{ + CFX_MapPtrTemplate*> rgNodeListMap; + FX_POSITION pos; + pos = sSet1.GetStartPosition(); + while(pos) { + CXFA_Node* pNode = NULL; + sSet1.GetNextAssoc(pos, pNode); + CXFA_Node* pParentNode = pNode->GetNodeItem(XFA_NODEITEM_Parent); + FX_DWORD dwNameHash = pNode->GetNameHash(); + if(!pParentNode || !dwNameHash) { + continue; + } + CFX_MapPtrTemplate* pNodeListChildMap = rgNodeListMap[pParentNode]; + if(!pNodeListChildMap) { + rgNodeListMap[pParentNode] = pNodeListChildMap = FX_NEW CFX_MapPtrTemplate; + } + CXFA_DualNodeArray* pDualNodeArray = (*pNodeListChildMap)[dwNameHash]; + if(!pDualNodeArray) { + (*pNodeListChildMap)[dwNameHash] = pDualNodeArray = FX_NEW CXFA_DualNodeArray; + } + pDualNodeArray->firstNodeList.Add(pNode); + } + pos = sSet2.GetStartPosition(); + while(pos) { + CXFA_Node* pNode = NULL; + sSet2.GetNextAssoc(pos, pNode); + CXFA_Node* pParentNode = pNode->GetNodeItem(XFA_NODEITEM_Parent); + FX_DWORD dwNameHash = pNode->GetNameHash(); + if(!pParentNode || !dwNameHash) { + continue; + } + CFX_MapPtrTemplate* pNodeListChildMap = rgNodeListMap[pParentNode]; + if(!pNodeListChildMap) { + rgNodeListMap[pParentNode] = pNodeListChildMap = FX_NEW CFX_MapPtrTemplate; + } + CXFA_DualNodeArray* pDualNodeArray = (*pNodeListChildMap)[dwNameHash]; + if(!pDualNodeArray) { + (*pNodeListChildMap)[dwNameHash] = pDualNodeArray = FX_NEW CXFA_DualNodeArray; + } + if(pDualNodeArray->firstNodeList.Lookup(pNode)) { + pDualNodeArray->firstNodeList.RemoveKey(pNode); + } else { + pDualNodeArray->secondNodeList.Add(pNode); + } + } + pos = rgNodeListMap.GetStartPosition(); + while (pos) { + CXFA_Node* pParentNode = NULL; + CFX_MapPtrTemplate* pNodeListChildMap = NULL; + rgNodeListMap.GetNextAssoc(pos, pParentNode, pNodeListChildMap); + if(!pNodeListChildMap) { + continue; + } + FX_POSITION childpos = pNodeListChildMap->GetStartPosition(); + while(childpos) { + FX_DWORD dwNameHash = 0; + CXFA_DualNodeArray* pDualNodeArray = NULL; + pNodeListChildMap->GetNextAssoc(childpos, dwNameHash, pDualNodeArray); + if(!pDualNodeArray) { + continue; + } + if(pDualNodeArray->firstNodeList.GetCount() != 0 && pDualNodeArray->secondNodeList.GetCount() != 0) { + CXFA_NodeArray rgNodeArray1, rgNodeArray2; + CFX_ArrayTemplate rgIdxArray1, rgIdxArray2; + XFA_ScriptInstanceManager_ReorderDataNodes_SortNodeArrayByDocumentIdx(pDualNodeArray->firstNodeList, rgNodeArray1, rgIdxArray1); + XFA_ScriptInstanceManager_ReorderDataNodes_SortNodeArrayByDocumentIdx(pDualNodeArray->secondNodeList, rgNodeArray2, rgIdxArray2); + FX_INT32 iLimit; + CXFA_Node *pParentNode = NULL, *pBeforeNode = NULL; + if(bInsertBefore) { + iLimit = rgIdxArray2[0]; + pBeforeNode = rgNodeArray2[0]; + pParentNode = pBeforeNode->GetNodeItem(XFA_NODEITEM_Parent); + } else { + iLimit = rgIdxArray2[rgIdxArray2.GetSize() - 1]; + CXFA_Node *pLastNode = rgNodeArray2[rgIdxArray2.GetSize() - 1]; + pParentNode = pLastNode->GetNodeItem(XFA_NODEITEM_Parent); + pBeforeNode = pLastNode->GetNodeItem(XFA_NODEITEM_NextSibling); + } + for(FX_INT32 iIdx = 0, iCount = rgIdxArray1.GetSize(); iIdx < iCount; iIdx++) { + CXFA_Node* pCurNode = rgNodeArray1[iIdx]; + pParentNode->RemoveChild(pCurNode); + pParentNode->InsertChild(pCurNode, pBeforeNode); + } + } + delete pDualNodeArray; + } + pNodeListChildMap->RemoveAll(); + } + rgNodeListMap.RemoveAll(); +} +static void XFA_ScriptInstanceManager_InsertItem(CXFA_Node *pInstMgrNode, CXFA_Node *pNewInstance, FX_INT32 iPos, FX_INT32 iCount = -1, FX_BOOL bMoveDataBindingNodes = TRUE) +{ + if(iCount < 0) { + iCount = XFA_ScriptInstanceManager_GetCount(pInstMgrNode); + } + if(iPos < 0) { + iPos = iCount; + } + if(iPos == iCount) { + CXFA_Node* pNextSibling = iCount > 0 ? XFA_ScriptInstanceManager_GetItem(pInstMgrNode, iCount - 1)->GetNodeItem(XFA_NODEITEM_NextSibling) + : pInstMgrNode->GetNodeItem(XFA_NODEITEM_NextSibling); + pInstMgrNode->GetNodeItem(XFA_NODEITEM_Parent)->InsertChild(pNewInstance, pNextSibling); + if(bMoveDataBindingNodes) { + CXFA_NodeSet sNew, sAfter; + CXFA_NodeIteratorTemplate sIteratorNew(pNewInstance); + for(CXFA_Node *pNode = sIteratorNew.GetCurrent(); pNode; pNode = sIteratorNew.MoveToNext()) { + CXFA_Node *pDataNode = pNode->GetBindData(); + if(!pDataNode) { + continue; + } + sNew.Add(pDataNode); + } + CXFA_NodeIteratorTemplate sIteratorAfter(pNextSibling); + for(CXFA_Node *pNode = sIteratorAfter.GetCurrent(); pNode; pNode = sIteratorAfter.MoveToNext()) { + CXFA_Node *pDataNode = pNode->GetBindData(); + if(!pDataNode) { + continue; + } + sAfter.Add(pDataNode); + } + XFA_ScriptInstanceManager_ReorderDataNodes(sNew, sAfter, FALSE); + } + } else { + CXFA_Node * pBeforeInstance = XFA_ScriptInstanceManager_GetItem(pInstMgrNode, iPos); + pInstMgrNode->GetNodeItem(XFA_NODEITEM_Parent)->InsertChild(pNewInstance, pBeforeInstance); + if(bMoveDataBindingNodes) { + CXFA_NodeSet sNew, sBefore; + CXFA_NodeIteratorTemplate sIteratorNew(pNewInstance); + for(CXFA_Node *pNode = sIteratorNew.GetCurrent(); pNode; pNode = sIteratorNew.MoveToNext()) { + CXFA_Node *pDataNode = pNode->GetBindData(); + if(!pDataNode) { + continue; + } + sNew.Add(pDataNode); + } + CXFA_NodeIteratorTemplate sIteratorBefore(pBeforeInstance); + for(CXFA_Node *pNode = sIteratorBefore.GetCurrent(); pNode; pNode = sIteratorBefore.MoveToNext()) { + CXFA_Node *pDataNode = pNode->GetBindData(); + if(!pDataNode) { + continue; + } + sBefore.Add(pDataNode); + } + XFA_ScriptInstanceManager_ReorderDataNodes(sNew, sBefore, TRUE); + } + } +} +static void XFA_ScriptInstanceManager_RemoveItem(CXFA_Node *pInstMgrNode, CXFA_Node *pRemoveInstance, FX_BOOL bRemoveDataBinding = TRUE) +{ + pInstMgrNode->GetNodeItem(XFA_NODEITEM_Parent)->RemoveChild(pRemoveInstance); + if(!bRemoveDataBinding) { + return; + } + CXFA_NodeIteratorTemplate sIterator(pRemoveInstance); + for(CXFA_Node* pFormNode = sIterator.GetCurrent(); pFormNode; pFormNode = sIterator.MoveToNext()) { + CXFA_Node* pDataNode = pFormNode->GetBindData(); + if(!pDataNode) { + continue; + } + if(pDataNode->RemoveBindItem(pFormNode) == 0) { + if(CXFA_Node* pDataParent = pDataNode->GetNodeItem(XFA_NODEITEM_Parent)) { + pDataParent->RemoveChild(pDataNode); + } + } + pFormNode->SetObject(XFA_ATTRIBUTE_BindingNode, NULL); + } +} +static CXFA_Node* XFA_ScriptInstanceManager_CreateInstance(CXFA_Node *pInstMgrNode, FX_BOOL bDataMerge) +{ + CXFA_Document* pDocument = pInstMgrNode->GetDocument(); + CXFA_Node* pTemplateNode = pInstMgrNode->GetTemplateNode(); + CXFA_Node* pFormParent = pInstMgrNode->GetNodeItem(XFA_NODEITEM_Parent); + CXFA_Node* pDataScope = NULL; + for(CXFA_Node* pRootBoundNode = pFormParent; pRootBoundNode && pRootBoundNode->GetObjectType() == XFA_OBJECTTYPE_ContainerNode; pRootBoundNode = pRootBoundNode->GetNodeItem(XFA_NODEITEM_Parent)) { + pDataScope = pRootBoundNode->GetBindData(); + if(pDataScope) { + break; + } + } + if(!pDataScope) { + pDataScope = (CXFA_Node*)pDocument->GetXFANode(XFA_HASHCODE_Record); + ASSERT(pDataScope); + } + CXFA_Node *pInstance = pDocument->DataMerge_CopyContainer(pTemplateNode, pFormParent, pDataScope, TRUE, bDataMerge); + if(pInstance) { + pDocument->DataMerge_UpdateBindingRelations(pInstance); + pFormParent->RemoveChild(pInstance); + } + return pInstance; +} +void CXFA_Node::Script_InstanceManager_Count(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (bSetting) { + FX_INT32 iDesired = FXJSE_Value_ToInteger(hValue); + InstanceManager_SetInstances(iDesired); + } else { + FXJSE_Value_SetInteger(hValue, XFA_ScriptInstanceManager_GetCount(this)); + } +} +void CXFA_Node::Script_InstanceManager_MoveInstance(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc != 2) { + FXJSE_Value_SetUndefined(pArguments->GetReturnValue()); + return; + } + FX_INT32 iFrom = pArguments->GetInt32(0); + FX_INT32 iTo = pArguments->GetInt32(1); + InstanceManager_MoveInstance(iTo, iFrom); + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + CXFA_Node* pToInstance = XFA_ScriptInstanceManager_GetItem(this, iTo); + if (pToInstance && pToInstance->GetClassID() == XFA_ELEMENT_Subform) { + pNotify->RunSubformIndexChange(pToInstance); + } + CXFA_Node* pFromInstance = XFA_ScriptInstanceManager_GetItem(this, iFrom); + if (pFromInstance && pFromInstance->GetClassID() == XFA_ELEMENT_Subform) { + pNotify->RunSubformIndexChange(pFromInstance); + } +} +void CXFA_Node::Script_InstanceManager_RemoveInstance(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc != 1) { + FXJSE_Value_SetUndefined(pArguments->GetReturnValue()); + return; + } + FX_INT32 iIndex = pArguments->GetInt32(0); + FX_INT32 iCount = XFA_ScriptInstanceManager_GetCount(this); + if (iIndex < 0 || iIndex >= iCount) { + ThrowScriptErrorMessage(XFA_IDS_INDEX_OUT_OF_BOUNDS); + return; + } + CXFA_Occur nodeOccur = GetOccurNode(); + FX_INT32 iMin = nodeOccur.GetMin(); + if (iCount - 1 < iMin) { + ThrowScriptErrorMessage(XFA_IDS_VIOLATE_BOUNDARY, (FX_LPCWSTR)(L"min")); + return; + } + CXFA_Node *pRemoveInstance = XFA_ScriptInstanceManager_GetItem(this, iIndex); + XFA_ScriptInstanceManager_RemoveItem(this, pRemoveInstance); + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (pNotify) { + for (FX_INT32 i = iIndex; i < iCount - 1; i++) { + CXFA_Node *pSubformInstance = XFA_ScriptInstanceManager_GetItem(this, i); + if (pSubformInstance && pSubformInstance->GetClassID() == XFA_ELEMENT_Subform) { + pNotify->RunSubformIndexChange(pSubformInstance); + } + } + } + CXFA_LayoutProcessor* pLayoutPro = m_pDocument->GetLayoutProcessor(); + if (!pLayoutPro) { + return; + } + pLayoutPro->AddChangedContainer((CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_Form)); +} +void CXFA_Node::Script_InstanceManager_SetInstances(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc != 1) { + FXJSE_Value_SetUndefined(pArguments->GetReturnValue()); + return; + } + FX_INT32 iDesired = pArguments->GetInt32(0); + InstanceManager_SetInstances(iDesired); +} +void CXFA_Node::Script_InstanceManager_AddInstance(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if ((argc != 0) && (argc != 1)) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"addInstance")); + return; + } + FX_BOOL fFlags = TRUE; + if (argc == 1) { + fFlags = pArguments->GetInt32(0) == 0 ? FALSE : TRUE; + } + FX_INT32 iCount = XFA_ScriptInstanceManager_GetCount(this); + CXFA_Occur nodeOccur = GetOccurNode(); + FX_INT32 iMax = nodeOccur.GetMax(); + if (iMax >= 0 && iCount >= iMax) { + ThrowScriptErrorMessage(XFA_IDS_VIOLATE_BOUNDARY, (FX_LPCWSTR)(L"max")); + return; + } + CXFA_Node* pNewInstance = XFA_ScriptInstanceManager_CreateInstance(this, fFlags); + XFA_ScriptInstanceManager_InsertItem(this, pNewInstance, iCount, iCount, FALSE); + FXJSE_Value_Set(pArguments->GetReturnValue(), m_pDocument->GetScriptContext()->GetJSValueFromMap(pNewInstance)); + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + pNotify->RunNodeInitialize(pNewInstance); + CXFA_LayoutProcessor* pLayoutPro = m_pDocument->GetLayoutProcessor(); + if (!pLayoutPro) { + return; + } + pLayoutPro->AddChangedContainer((CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_Form)); +} +void CXFA_Node::Script_InstanceManager_InsertInstance(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if ((argc != 1) && (argc != 2)) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"insertInstance")); + return; + } + FX_INT32 iIndex = pArguments->GetInt32(0); + FX_BOOL bBind = FALSE; + if (argc == 2) { + bBind = pArguments->GetInt32(1) == 0 ? FALSE : TRUE; + } + CXFA_Occur nodeOccur = GetOccurNode(); + FX_INT32 iCount = XFA_ScriptInstanceManager_GetCount(this); + if (iIndex < 0 || iIndex > iCount) { + ThrowScriptErrorMessage(XFA_IDS_INDEX_OUT_OF_BOUNDS); + return; + } + FX_INT32 iMax = nodeOccur.GetMax(); + if (iMax >= 0 && iCount >= iMax) { + ThrowScriptErrorMessage(XFA_IDS_VIOLATE_BOUNDARY, (FX_LPCWSTR)(L"max")); + return; + } + CXFA_Node* pNewInstance = XFA_ScriptInstanceManager_CreateInstance(this, bBind); + XFA_ScriptInstanceManager_InsertItem(this, pNewInstance, iIndex, iCount, TRUE); + FXJSE_Value_Set(pArguments->GetReturnValue(), m_pDocument->GetScriptContext()->GetJSValueFromMap(pNewInstance)); + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + pNotify->RunNodeInitialize(pNewInstance); + CXFA_LayoutProcessor* pLayoutPro = m_pDocument->GetLayoutProcessor(); + if (!pLayoutPro) { + return; + } + pLayoutPro->AddChangedContainer((CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_Form)); +} +FX_INT32 CXFA_Node::InstanceManager_SetInstances(FX_INT32 iDesired) +{ + CXFA_Occur nodeOccur = GetOccurNode(); + FX_INT32 iMax = nodeOccur.GetMax(); + FX_INT32 iMin = nodeOccur.GetMin(); + if (iDesired < iMin) { + ThrowScriptErrorMessage(XFA_IDS_VIOLATE_BOUNDARY, (FX_LPCWSTR)(L"min")); + return 1; + } + if ((iMax >= 0) && (iDesired > iMax)) { + ThrowScriptErrorMessage(XFA_IDS_VIOLATE_BOUNDARY, (FX_LPCWSTR)(L"max")); + return 2; + } + FX_INT32 iCount = XFA_ScriptInstanceManager_GetCount(this); + if (iDesired == iCount) { + return 0; + } + if(iDesired < iCount) { + CFX_WideStringC wsInstManagerName = this->GetCData(XFA_ATTRIBUTE_Name); + CFX_WideString wsInstanceName = wsInstManagerName.IsEmpty() ? wsInstManagerName : wsInstManagerName.Mid(1); + FX_DWORD dInstanceNameHash = wsInstanceName.IsEmpty() ? 0 : FX_HashCode_String_GetW(wsInstanceName, wsInstanceName.GetLength()); + CXFA_Node* pPrevSibling = (iDesired == 0) ? this : XFA_ScriptInstanceManager_GetItem(this, iDesired - 1); + while(iCount > iDesired) { + CXFA_Node* pRemoveInstance = pPrevSibling->GetNodeItem(XFA_NODEITEM_NextSibling); + if (pRemoveInstance->GetClassID() != XFA_ELEMENT_Subform && pRemoveInstance->GetClassID() != XFA_ELEMENT_SubformSet) { + continue; + } + if (pRemoveInstance->GetClassID() == XFA_ELEMENT_InstanceManager) { + FXSYS_assert(FALSE); + break; + } + if (pRemoveInstance->GetNameHash() == dInstanceNameHash) { + XFA_ScriptInstanceManager_RemoveItem(this, pRemoveInstance); + iCount--; + } + } + } else if (iDesired > iCount) { + CXFA_Node* pTemplateNode = GetTemplateNode(); + CXFA_Node* pFormNode = GetNodeItem(XFA_NODEITEM_NextSibling); + while (iCount < iDesired) { + CXFA_Node* pNewInstance = XFA_ScriptInstanceManager_CreateInstance(this, TRUE); + XFA_ScriptInstanceManager_InsertItem(this, pNewInstance, iCount, iCount, FALSE); + iCount ++; + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return 0; + } + pNotify->RunNodeInitialize(pNewInstance); + } + } + CXFA_LayoutProcessor* pLayoutPro = m_pDocument->GetLayoutProcessor(); + if (!pLayoutPro) { + return 0; + } + pLayoutPro->AddChangedContainer((CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_Form)); + return 0; +} +FX_INT32 CXFA_Node::InstanceManager_MoveInstance(FX_INT32 iTo, FX_INT32 iFrom) +{ + FX_INT32 iCount = XFA_ScriptInstanceManager_GetCount(this); + if (iFrom > iCount || iTo > iCount - 1) { + ThrowScriptErrorMessage(XFA_IDS_INDEX_OUT_OF_BOUNDS); + return 1; + } + if (iFrom < 0 || iTo < 0 || iFrom == iTo) { + return 0; + } + CXFA_Node * pMoveInstance = XFA_ScriptInstanceManager_GetItem(this, iFrom); + XFA_ScriptInstanceManager_RemoveItem(this, pMoveInstance, FALSE); + XFA_ScriptInstanceManager_InsertItem(this, pMoveInstance, iTo, iCount - 1, TRUE); + CXFA_LayoutProcessor* pLayoutPro = m_pDocument->GetLayoutProcessor(); + if (!pLayoutPro) { + return 0; + } + pLayoutPro->AddChangedContainer((CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_Form)); + return 0; +} +void CXFA_Node::Script_Occur_Max(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + CXFA_Occur occur(this); + if (bSetting) { + FX_INT32 iMax = FXJSE_Value_ToInteger(hValue); + occur.SetMax(iMax); + } else { + FXJSE_Value_SetInteger(hValue, occur.GetMax()); + } +} +void CXFA_Node::Script_Occur_Min(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + CXFA_Occur occur(this); + if (bSetting) { + FX_INT32 iMin = FXJSE_Value_ToInteger(hValue); + occur.SetMin(iMin); + } else { + FXJSE_Value_SetInteger(hValue, occur.GetMin()); + } +} +void CXFA_Node::Script_Desc_Metadata(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if ((argc == 0) || (argc == 1)) { + FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), FX_BSTRC("")); + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"metadata")); + } +} +void CXFA_Node::Script_Form_FormNodes(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 1) { + CXFA_Node * pDataNode = (CXFA_Node *)pArguments->GetObject(0); + if (pDataNode) { + CXFA_NodeArray formItems; + FX_INT32 iSize = pDataNode->GetBindItems(formItems); + CXFA_ArrayNodeList *pFormNodes = FX_NEW CXFA_ArrayNodeList(m_pDocument); + pFormNodes->SetArrayNodeList(formItems); + FXJSE_Value_SetObject(pArguments->GetReturnValue(), (CXFA_Object*)pFormNodes, m_pDocument->GetScriptContext()->GetJseNormalClass()); + } else { + ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); + } + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"formNodes")); + } +} +void CXFA_Node::Script_Form_Remerge(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + m_pDocument->DoDataRemerge(TRUE); + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"remerge")); + } +} +void CXFA_Node::Script_Form_ExecInitialize(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Initialize); + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"execInitialize")); + } +} +void CXFA_Node::Script_Form_Recalculate(CFXJSE_Arguments* pArguments) +{ + CXFA_EventParam* pEventParam = m_pDocument->GetScriptContext()->GetEventParam(); + if (pEventParam->m_eType == XFA_EVENT_Calculate || pEventParam->m_eType == XFA_EVENT_InitCalculate) { + return; + } + FX_INT32 argc = pArguments->GetLength(); + if (argc == 1) { + FX_BOOL bScriptFlags = pArguments->GetInt32(0) == 0 ? FALSE : TRUE; + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + if (bScriptFlags) { + pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate); + pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate); + pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Ready, TRUE); + } else { + } + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"recalculate")); + } +} +void CXFA_Node::Script_Form_ExecCalculate(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate); + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"execCalculate")); + } +} +void CXFA_Node::Script_Form_ExecValidate(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE); + } else { + FX_INT32 iRet = pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate); + FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), ((iRet == XFA_EVENTERROR_Error) ? FALSE : TRUE)); + } + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"execValidate")); + } +} +void CXFA_Node::Script_Form_Checksum(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (bSetting) { + CFX_ByteString bsChecksum; + FXJSE_Value_ToUTF8String(hValue, bsChecksum); + SetAttribute(XFA_ATTRIBUTE_Checksum, CFX_WideString::FromUTF8(bsChecksum, bsChecksum.GetLength())); + } else { + CFX_WideString wsChecksum; + GetAttribute(XFA_ATTRIBUTE_Checksum, wsChecksum, FALSE); + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsChecksum, wsChecksum.GetLength())); + } +} +void CXFA_Node::Script_Packet_GetAttribute(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 1) { + CFX_ByteString bsAttributeName = pArguments->GetUTF8String(0); + CFX_WideString wsAttributeValue; + IFDE_XMLNode* pXMLNode = GetXMLMappingNode(); + if (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) { + ((IFDE_XMLElement *)pXMLNode)->GetString(CFX_WideString::FromUTF8(bsAttributeName, bsAttributeName.GetLength()), wsAttributeValue); + } + FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), FX_UTF8Encode(wsAttributeValue, wsAttributeValue.GetLength())); + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"getAttribute")); + } +} +void CXFA_Node::Script_Packet_SetAttribute(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 2) { + CFX_ByteString bsValue = pArguments->GetUTF8String(0); + CFX_ByteString bsName = pArguments->GetUTF8String(1); + IFDE_XMLNode* pXMLNode = GetXMLMappingNode(); + if (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) { + ((IFDE_XMLElement *)pXMLNode)->SetString(CFX_WideString::FromUTF8(bsName, bsName.GetLength()), CFX_WideString::FromUTF8(bsValue, bsValue.GetLength())); + } + FXJSE_Value_SetNull(pArguments->GetReturnValue()); + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"setAttribute")); + } +} +void CXFA_Node::Script_Packet_RemoveAttribute(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 1) { + CFX_ByteString bsName = pArguments->GetUTF8String(0); + CFX_WideString wsName = CFX_WideString::FromUTF8(bsName, bsName.GetLength()); + IFDE_XMLNode* pXMLNode = GetXMLMappingNode(); + if (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) { + IFDE_XMLElement *pXMLElement = (IFDE_XMLElement *)pXMLNode; + if (pXMLElement->HasAttribute(wsName)) { + pXMLElement->RemoveAttribute(wsName); + } + } + FXJSE_Value_SetNull(pArguments->GetReturnValue()); + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"removeAttribute")); + } +} +void CXFA_Node::Script_Packet_Content(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (bSetting) { + CFX_ByteString bsNewContent; + FXJSE_Value_ToUTF8String(hValue, bsNewContent); + IFDE_XMLNode* pXMLNode = GetXMLMappingNode(); + if (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) { + IFDE_XMLElement *pXMLElement = (IFDE_XMLElement *)pXMLNode; + pXMLElement->SetTextData(CFX_WideString::FromUTF8(bsNewContent, bsNewContent.GetLength())); + } + } else { + CFX_WideString wsTextData; + IFDE_XMLNode* pXMLNode = GetXMLMappingNode(); + if (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) { + IFDE_XMLElement *pXMLElement = (IFDE_XMLElement *)pXMLNode; + pXMLElement->GetTextData(wsTextData); + } + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsTextData, wsTextData.GetLength())); + } +} +void CXFA_Node::Script_Source_Next(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"next")); + } +} +void CXFA_Node::Script_Source_CancelBatch(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"cancelBatch")); + } +} +void CXFA_Node::Script_Source_First(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"first")); + } +} +void CXFA_Node::Script_Source_UpdateBatch(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"updateBatch")); + } +} +void CXFA_Node::Script_Source_Previous(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"previous")); + } +} +void CXFA_Node::Script_Source_IsBOF(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"isBOF")); + } +} +void CXFA_Node::Script_Source_IsEOF(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"isEOF")); + } +} +void CXFA_Node::Script_Source_Cancel(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"cancel")); + } +} +void CXFA_Node::Script_Source_Update(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"update")); + } +} +void CXFA_Node::Script_Source_Open(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"open")); + } +} +void CXFA_Node::Script_Source_Delete(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"delete")); + } +} +void CXFA_Node::Script_Source_AddNew(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"addNew")); + } +} +void CXFA_Node::Script_Source_Requery(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"requery")); + } +} +void CXFA_Node::Script_Source_Resync(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"resync")); + } +} +void CXFA_Node::Script_Source_Close(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"close")); + } +} +void CXFA_Node::Script_Source_Last(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"last")); + } +} +void CXFA_Node::Script_Source_HasDataChanged(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if (argc == 0) { + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"hasDataChanged")); + } +} +void CXFA_Node::Script_Source_Db(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ +} +void CXFA_Node::Script_Xfa_This(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (!bSetting) { + CXFA_Object* pThis = m_pDocument->GetScriptContext()->GetThisObject(); + FXSYS_assert(pThis); + FXJSE_Value_Set(hValue, m_pDocument->GetScriptContext()->GetJSValueFromMap(pThis)); + } +} +void CXFA_Node::Script_Handler_Version(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ +} +void CXFA_Node::Script_SubmitFormat_Mode(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ +} +void CXFA_Node::Script_Extras_Type(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ +} +void CXFA_Node::Script_Script_Stateless(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (bSetting) { + ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); + return; + } + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(FX_WSTRC(L"0"))); +} +void CXFA_Node::Script_Encrypt_Format(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ +} +enum XFA_KEYTYPE { + XFA_KEYTYPE_Custom, + XFA_KEYTYPE_Element, +}; +FX_LPVOID XFA_GetMapKey_Custom(FX_WSTR wsKey) +{ + FX_DWORD dwKey = FX_HashCode_String_GetW(wsKey.GetPtr(), wsKey.GetLength()); + return (FX_LPVOID)(FX_UINTPTR)((dwKey << 1) | XFA_KEYTYPE_Custom); +} +FX_LPVOID XFA_GetMapKey_Element(XFA_ELEMENT eElement, XFA_ATTRIBUTE eAttribute) +{ + return (FX_LPVOID)(FX_UINTPTR)((eElement << 16) | (eAttribute << 8) | XFA_KEYTYPE_Element); +} +static inline FX_BOOL XFA_NodeData_PrepareKey(XFA_ELEMENT eElem, XFA_ATTRIBUTE eAttr, FX_LPVOID &pKey) +{ + pKey = XFA_GetMapKey_Element(eElem, eAttr); + return TRUE; +} +FX_BOOL CXFA_Node::HasAttribute(XFA_ATTRIBUTE eAttr, FX_BOOL bCanInherit ) +{ + FX_LPVOID pKey = NULL; + if (!XFA_NodeData_PrepareKey(GetClassID(), eAttr, pKey)) { + return FALSE; + } + return HasMapModuleKey(pKey, bCanInherit); +} +FX_BOOL CXFA_Node::SetAttribute(XFA_ATTRIBUTE eAttr, FX_WSTR wsValue, FX_BOOL bNotify ) +{ + XFA_LPCATTRIBUTEINFO pAttr = XFA_GetAttributeByID(eAttr); + if (pAttr == NULL) { + return FALSE; + } + XFA_ATTRIBUTETYPE eType = pAttr->eType; + if (eType == XFA_ATTRIBUTETYPE_NOTSURE) { + XFA_LPCNOTSUREATTRIBUTE pNotsure = XFA_GetNotsureAttribute(GetClassID(), pAttr->eName); + eType = pNotsure ? pNotsure->eType : XFA_ATTRIBUTETYPE_Cdata; + } + switch (eType) { + case XFA_ATTRIBUTETYPE_Enum: { + XFA_LPCATTRIBUTEENUMINFO pEnum = XFA_GetAttributeEnumByName(wsValue); + return SetEnum(pAttr->eName, pEnum ? pEnum->eName : (XFA_ATTRIBUTEENUM)(FX_INTPTR)(pAttr->pDefValue), bNotify); + } + break; + case XFA_ATTRIBUTETYPE_Cdata: + return SetCData(pAttr->eName, wsValue, bNotify); + case XFA_ATTRIBUTETYPE_Boolean: + return SetBoolean(pAttr->eName, wsValue != FX_WSTRC(L"0"), bNotify); + case XFA_ATTRIBUTETYPE_Integer: + return SetInteger(pAttr->eName, FXSYS_round(FX_wcstof(wsValue.GetPtr(), wsValue.GetLength())), bNotify); + case XFA_ATTRIBUTETYPE_Measure: + return SetMeasure(pAttr->eName, CXFA_Measurement(wsValue), bNotify); + default: + break; + } + return FALSE; +} +FX_BOOL CXFA_Node::GetAttribute(XFA_ATTRIBUTE eAttr, CFX_WideString &wsValue, FX_BOOL bUseDefault ) +{ + XFA_LPCATTRIBUTEINFO pAttr = XFA_GetAttributeByID(eAttr); + if (pAttr == NULL) { + return FALSE; + } + XFA_ATTRIBUTETYPE eType = pAttr->eType; + if (eType == XFA_ATTRIBUTETYPE_NOTSURE) { + XFA_LPCNOTSUREATTRIBUTE pNotsure = XFA_GetNotsureAttribute(GetClassID(), pAttr->eName); + eType = pNotsure ? pNotsure->eType : XFA_ATTRIBUTETYPE_Cdata; + } + switch (eType) { + case XFA_ATTRIBUTETYPE_Enum: { + XFA_ATTRIBUTEENUM eValue; + if (!TryEnum(pAttr->eName, eValue, bUseDefault)) { + return FALSE; + } + wsValue = XFA_GetAttributeEnumByID(eValue)->pName; + return TRUE; + } + break; + case XFA_ATTRIBUTETYPE_Cdata: { + CFX_WideStringC wsValueC; + if (!TryCData(pAttr->eName, wsValueC, bUseDefault)) { + return FALSE; + } + wsValue = wsValueC; + return TRUE; + } + break; + case XFA_ATTRIBUTETYPE_Boolean: { + FX_BOOL bValue; + if (!TryBoolean(pAttr->eName, bValue, bUseDefault)) { + return FALSE; + } + wsValue = bValue ? FX_WSTRC(L"1") : FX_WSTRC(L"0"); + return TRUE; + } + break; + case XFA_ATTRIBUTETYPE_Integer: { + FX_INT32 iValue; + if (!TryInteger(pAttr->eName, iValue, bUseDefault)) { + return FALSE; + } + wsValue.Format((FX_LPCWSTR)L"%d", iValue); + return TRUE; + } + break; + case XFA_ATTRIBUTETYPE_Measure: { + CXFA_Measurement mValue; + if (!TryMeasure(pAttr->eName, mValue, bUseDefault)) { + return FALSE; + } + mValue.ToString(wsValue); + return TRUE; + } + break; + default: + break; + } + return FALSE; +} +FX_BOOL CXFA_Node::SetAttribute(FX_WSTR wsAttr, FX_WSTR wsValue, FX_BOOL bNotify) +{ + XFA_LPCATTRIBUTEINFO pAttributeInfo = XFA_GetAttributeByName(wsValue); + if (pAttributeInfo) { + return SetAttribute(pAttributeInfo->eName, wsValue, bNotify); + } + FX_LPVOID pKey = XFA_GetMapKey_Custom(wsAttr); + SetMapModuleString(pKey, wsValue); + return TRUE; +} +FX_BOOL CXFA_Node::GetAttribute(FX_WSTR wsAttr, CFX_WideString &wsValue, FX_BOOL bUseDefault) +{ + XFA_LPCATTRIBUTEINFO pAttributeInfo = XFA_GetAttributeByName(wsAttr); + if (pAttributeInfo) { + return GetAttribute(pAttributeInfo->eName, wsValue, bUseDefault); + } + FX_LPVOID pKey = XFA_GetMapKey_Custom(wsAttr); + CFX_WideStringC wsValueC; + if (GetMapModuleString(pKey, wsValueC)) { + wsValue = wsValueC; + } + return TRUE; +} +FX_BOOL CXFA_Node::RemoveAttribute(FX_WSTR wsAttr) +{ + FX_LPVOID pKey = XFA_GetMapKey_Custom(wsAttr); + RemoveMapModuleKey(pKey); + return TRUE; +} +FX_BOOL CXFA_Node::TryBoolean(XFA_ATTRIBUTE eAttr, FX_BOOL &bValue, FX_BOOL bUseDefault ) +{ + FX_LPVOID pValue = NULL; + if (!GetValue(eAttr, XFA_ATTRIBUTETYPE_Boolean, bUseDefault, pValue)) { + return FALSE; + } + bValue = (FX_BOOL)(FX_UINTPTR)pValue; + return TRUE; +} +FX_BOOL CXFA_Node::TryInteger(XFA_ATTRIBUTE eAttr, FX_INT32 &iValue, FX_BOOL bUseDefault) +{ + FX_LPVOID pValue = NULL; + if (!GetValue(eAttr, XFA_ATTRIBUTETYPE_Integer, bUseDefault, pValue)) { + return FALSE; + } + iValue = (FX_INT32)(FX_UINTPTR)pValue; + return TRUE; +} +FX_BOOL CXFA_Node::TryEnum(XFA_ATTRIBUTE eAttr, XFA_ATTRIBUTEENUM &eValue, FX_BOOL bUseDefault) +{ + FX_LPVOID pValue = NULL; + if (!GetValue(eAttr, XFA_ATTRIBUTETYPE_Enum, bUseDefault, pValue)) { + return FALSE; + } + eValue = (XFA_ATTRIBUTEENUM)(FX_UINTPTR)pValue; + return TRUE; +} +FX_BOOL CXFA_Node::SetMeasure(XFA_ATTRIBUTE eAttr, CXFA_Measurement mValue, FX_BOOL bNotify ) +{ + FX_LPVOID pKey = NULL; + if (!XFA_NodeData_PrepareKey(GetClassID(), eAttr, pKey)) { + return FALSE; + } + OnChanging(eAttr, &mValue, bNotify); + SetMapModuleBuffer(pKey, &mValue, sizeof(CXFA_Measurement)); + OnChanged(eAttr, &mValue, bNotify); + return TRUE; +} +FX_BOOL CXFA_Node::TryMeasure(XFA_ATTRIBUTE eAttr, CXFA_Measurement &mValue, FX_BOOL bUseDefault) +{ + FX_LPVOID pKey = NULL; + if (!XFA_NodeData_PrepareKey(GetClassID(), eAttr, pKey)) { + return FALSE; + } + FX_LPVOID pValue; + FX_INT32 iBytes; + if(GetMapModuleBuffer(pKey, pValue, iBytes) && iBytes == sizeof(mValue)) { + FX_memcpy(&mValue, pValue, sizeof(mValue)); + return TRUE; + } + if(bUseDefault && XFA_GetAttributeDefaultValue(pValue, GetClassID(), eAttr, XFA_ATTRIBUTETYPE_Measure, m_ePacket)) { + FX_memcpy(&mValue, pValue, sizeof(mValue)); + return TRUE; + } + return FALSE; +} +FX_BOOL CXFA_Node::SetCData(XFA_ATTRIBUTE eAttr, const CFX_WideString& wsValue, FX_BOOL bNotify, FX_BOOL bScriptModify) +{ + FX_LPVOID pKey = NULL; + if (!XFA_NodeData_PrepareKey(GetClassID(), eAttr, pKey)) { + return FALSE; + } + OnChanging(eAttr, (FX_LPVOID)(FX_LPCWSTR)wsValue, bNotify); + if (eAttr == XFA_ATTRIBUTE_Value) { + CFX_WideString *pClone = FX_NEW CFX_WideString(wsValue); + if (pClone == NULL) { + return FALSE; + } + SetUserData(pKey, pClone, &deleteWideStringCallBack); + } else { + SetMapModuleString(pKey, wsValue); + if(eAttr == XFA_ATTRIBUTE_Name) { + UpdateNameHash(); + if (XFA_LPCJSBUILTININFO pBuiltin = XFA_GetJSBuiltinByHash(m_dwNameHash)) { + m_pDocument->GetScriptContext()->AddJSBuiltinObject(pBuiltin); + } + } + } + OnChanged(eAttr, (FX_LPVOID)(FX_LPCWSTR)wsValue, bNotify, bScriptModify); + if (IsNeedSavingXMLNode() && eAttr != XFA_ATTRIBUTE_QualifiedName && eAttr != XFA_ATTRIBUTE_BindingNode) { + if (eAttr == XFA_ATTRIBUTE_Name && (m_eNodeClass == XFA_ELEMENT_DataValue || m_eNodeClass == XFA_ELEMENT_DataGroup)) { + return TRUE; + } + if (eAttr == XFA_ATTRIBUTE_Value) { + FDE_XMLNODETYPE eXMLType = m_pXMLNode->GetType(); + switch (eXMLType) { + case FDE_XMLNODE_Element: + if (IsAttributeInXML()) { + ((IFDE_XMLElement*)m_pXMLNode)->SetString(GetCData(XFA_ATTRIBUTE_QualifiedName), wsValue); + } else { + FX_BOOL bDeleteChildren = TRUE; + if (GetPacketID() == XFA_XDPPACKET_Datasets) { + for (CXFA_Node* pChildDataNode = this->GetNodeItem(XFA_NODEITEM_FirstChild); pChildDataNode; pChildDataNode = pChildDataNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + CXFA_NodeArray formNodes; + if (pChildDataNode->GetBindItems(formNodes) > 0) { + bDeleteChildren = FALSE; + break; + } + } + } + if (bDeleteChildren) { + ((IFDE_XMLElement*)m_pXMLNode)->DeleteChildren(); + } + ((IFDE_XMLElement*)m_pXMLNode)->SetTextData(wsValue); + } + break; + case FDE_XMLNODE_Text: + ((IFDE_XMLText*)m_pXMLNode)->SetText(wsValue); + break; + default: + FXSYS_assert(0); + } + return TRUE; + } + XFA_LPCATTRIBUTEINFO pInfo = XFA_GetAttributeByID(eAttr); + if (pInfo) { + FXSYS_assert(m_pXMLNode->GetType() == FDE_XMLNODE_Element); + CFX_WideString wsAttrName = pInfo->pName; + if(pInfo->eName == XFA_ATTRIBUTE_ContentType) { + wsAttrName = FX_WSTRC(L"xfa:") + wsAttrName; + } + ((IFDE_XMLElement*)m_pXMLNode)->SetString(wsAttrName, wsValue); + } + } + return TRUE; +} +FX_BOOL CXFA_Node::SetAttributeValue(const CFX_WideString& wsValue, const CFX_WideString& wsXMLValue, FX_BOOL bNotify, FX_BOOL bScriptModify) +{ + FX_LPVOID pKey = NULL; + if (!XFA_NodeData_PrepareKey(GetClassID(), XFA_ATTRIBUTE_Value, pKey)) { + return FALSE; + } + OnChanging(XFA_ATTRIBUTE_Value, (FX_LPVOID)(FX_LPCWSTR)wsValue, bNotify); + CFX_WideString *pClone = FX_NEW CFX_WideString(wsValue); + if (pClone == NULL) { + return FALSE; + } + SetUserData(pKey, pClone, &deleteWideStringCallBack); + OnChanged(XFA_ATTRIBUTE_Value, (FX_LPVOID)(FX_LPCWSTR)wsValue, bNotify, bScriptModify); + if (IsNeedSavingXMLNode()) { + FDE_XMLNODETYPE eXMLType = m_pXMLNode->GetType(); + switch (eXMLType) { + case FDE_XMLNODE_Element: + if (IsAttributeInXML()) { + ((IFDE_XMLElement*)m_pXMLNode)->SetString(GetCData(XFA_ATTRIBUTE_QualifiedName), wsXMLValue); + } else { + FX_BOOL bDeleteChildren = TRUE; + if (GetPacketID() == XFA_XDPPACKET_Datasets) { + for (CXFA_Node* pChildDataNode = this->GetNodeItem(XFA_NODEITEM_FirstChild); pChildDataNode; pChildDataNode = pChildDataNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + CXFA_NodeArray formNodes; + if (pChildDataNode->GetBindItems(formNodes) > 0) { + bDeleteChildren = FALSE; + break; + } + } + } + if (bDeleteChildren) { + ((IFDE_XMLElement*)m_pXMLNode)->DeleteChildren(); + } + ((IFDE_XMLElement*)m_pXMLNode)->SetTextData(wsXMLValue); + } + break; + case FDE_XMLNODE_Text: + ((IFDE_XMLText*)m_pXMLNode)->SetText(wsXMLValue); + break; + default: + FXSYS_assert(0); + } + } + return TRUE; +} +FX_BOOL CXFA_Node::TryCData(XFA_ATTRIBUTE eAttr, CFX_WideString &wsValue, FX_BOOL bUseDefault, FX_BOOL bProto) +{ + FX_LPVOID pKey = NULL; + if (!XFA_NodeData_PrepareKey(GetClassID(), eAttr, pKey)) { + return FALSE; + } + if (eAttr == XFA_ATTRIBUTE_Value) { + CFX_WideString *pStr = (CFX_WideString*)GetUserData(pKey, bProto); + if (pStr) { + wsValue = *pStr; + return TRUE; + } + } else { + CFX_WideStringC wsValueC; + if (GetMapModuleString(pKey, wsValueC)) { + wsValue = wsValueC; + return TRUE; + } + } + if (!bUseDefault) { + return FALSE; + } + FX_LPVOID pValue = NULL; + if (XFA_GetAttributeDefaultValue(pValue, GetClassID(), eAttr, XFA_ATTRIBUTETYPE_Cdata, m_ePacket)) { + wsValue = (FX_LPCWSTR)pValue; + return TRUE; + } + return FALSE; +} +FX_BOOL CXFA_Node::TryCData(XFA_ATTRIBUTE eAttr, CFX_WideStringC &wsValue, FX_BOOL bUseDefault, FX_BOOL bProto) +{ + FX_LPVOID pKey = NULL; + if (!XFA_NodeData_PrepareKey(GetClassID(), eAttr, pKey)) { + return FALSE; + } + if (eAttr == XFA_ATTRIBUTE_Value) { + CFX_WideString *pStr = (CFX_WideString*)GetUserData(pKey, bProto); + if (pStr) { + wsValue = *pStr; + return TRUE; + } + } else { + if (GetMapModuleString(pKey, wsValue)) { + return TRUE; + } + } + if (!bUseDefault) { + return FALSE; + } + FX_LPVOID pValue = NULL; + if (XFA_GetAttributeDefaultValue(pValue, GetClassID(), eAttr, XFA_ATTRIBUTETYPE_Cdata, m_ePacket)) { + wsValue = (CFX_WideStringC)(FX_LPCWSTR)pValue; + return TRUE; + } + return FALSE; +} +FX_BOOL CXFA_Node::SetObject(XFA_ATTRIBUTE eAttr, FX_LPVOID pData, XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo ) +{ + FX_LPVOID pKey = NULL; + if (!XFA_NodeData_PrepareKey(GetClassID(), eAttr, pKey)) { + return FALSE; + } + return SetUserData(pKey, pData, pCallbackInfo); +} +FX_BOOL CXFA_Node::TryObject(XFA_ATTRIBUTE eAttr, FX_LPVOID &pData) +{ + FX_LPVOID pKey = NULL; + if (!XFA_NodeData_PrepareKey(GetClassID(), eAttr, pKey)) { + return FALSE; + } + pData = GetUserData(pKey); + return pData != NULL; +} +FX_BOOL CXFA_Node::SetValue(XFA_ATTRIBUTE eAttr, XFA_ATTRIBUTETYPE eType, FX_LPVOID pValue, FX_BOOL bNotify) +{ + FX_LPVOID pKey = NULL; + if (!XFA_NodeData_PrepareKey(GetClassID(), eAttr, pKey)) { + return FALSE; + } + OnChanging(eAttr, pValue, bNotify); + SetMapModuleValue(pKey, pValue); + OnChanged(eAttr, pValue, bNotify); + if (IsNeedSavingXMLNode()) { + FXSYS_assert(m_pXMLNode->GetType() == FDE_XMLNODE_Element); + XFA_LPCATTRIBUTEINFO pInfo = XFA_GetAttributeByID(eAttr); + if (pInfo) { + switch (eType) { + case XFA_ATTRIBUTETYPE_Enum: + ((IFDE_XMLElement*)m_pXMLNode)->SetString(pInfo->pName, XFA_GetAttributeEnumByID((XFA_ATTRIBUTEENUM)(FX_UINTPTR)pValue)->pName); + break; + case XFA_ATTRIBUTETYPE_Boolean: + ((IFDE_XMLElement*)m_pXMLNode)->SetString(pInfo->pName, pValue ? FX_WSTRC(L"1") : FX_WSTRC(L"0")); + break; + case XFA_ATTRIBUTETYPE_Integer: + ((IFDE_XMLElement*)m_pXMLNode)->SetInteger(pInfo->pName, (FX_INT32)(FX_UINTPTR)pValue); + break; + default: + FXSYS_assert(0); + } + } + } + return TRUE; +} +FX_BOOL CXFA_Node::GetValue(XFA_ATTRIBUTE eAttr, XFA_ATTRIBUTETYPE eType, FX_BOOL bUseDefault, FX_LPVOID &pValue) +{ + FX_LPVOID pKey = NULL; + if (!XFA_NodeData_PrepareKey(GetClassID(), eAttr, pKey)) { + return FALSE; + } + if(GetMapModuleValue(pKey, pValue)) { + return TRUE; + } + if (!bUseDefault) { + return FALSE; + } + return XFA_GetAttributeDefaultValue(pValue, GetClassID(), eAttr, eType, m_ePacket); +} +static void XFA_DefaultFreeData(FX_LPVOID pData) +{ +} +static XFA_MAPDATABLOCKCALLBACKINFO gs_XFADefaultFreeData = {XFA_DefaultFreeData, NULL}; +FX_BOOL CXFA_Node::SetUserData(FX_LPVOID pKey, FX_LPVOID pData, XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo ) +{ + SetMapModuleBuffer(pKey, &pData, sizeof(FX_LPVOID), pCallbackInfo ? pCallbackInfo : &gs_XFADefaultFreeData); + return TRUE; +} +FX_BOOL CXFA_Node::TryUserData(FX_LPVOID pKey, FX_LPVOID &pData, FX_BOOL bProtoAlso) +{ + FX_INT32 iBytes = 0; + if (!GetMapModuleBuffer(pKey, pData, iBytes, bProtoAlso)) { + return FALSE; + } + return iBytes == sizeof(FX_LPVOID) && FXSYS_memcpy(&pData, pData, iBytes); +} +FX_BOOL CXFA_Node::SetScriptContent(const CFX_WideString& wsContent, const CFX_WideString& wsXMLValue, FX_BOOL bNotify, FX_BOOL bScriptModify, FX_BOOL bSyncData) +{ + CXFA_Node* pNode = NULL; + CXFA_Node* pBindNode = NULL; + switch (GetObjectType()) { + case XFA_OBJECTTYPE_ContainerNode: { + if (XFA_FieldIsMultiListBox(this)) { + CXFA_Node* pValue = GetProperty(0, XFA_ELEMENT_Value); + CXFA_Node* pChildValue = pValue->GetNodeItem(XFA_NODEITEM_FirstChild); + FXSYS_assert(pChildValue); + pChildValue->SetCData(XFA_ATTRIBUTE_ContentType, FX_WSTRC(L"text/xml")); + pChildValue->SetScriptContent(wsContent, wsContent, bNotify, bScriptModify, FALSE); + CXFA_Node *pBind = GetBindData(); + if (bSyncData && pBind) { + CFX_WideStringArray wsSaveTextArray; + FX_INT32 iSize = 0; + if (!wsContent.IsEmpty()) { + FX_INT32 iStart = 0; + FX_INT32 iLength = wsContent.GetLength(); + FX_INT32 iEnd = wsContent.Find(L'\n', iStart); + iEnd = (iEnd == -1) ? iLength : iEnd; + while (iEnd >= iStart) { + wsSaveTextArray.Add(wsContent.Mid(iStart, iEnd - iStart)); + iStart = iEnd + 1; + if (iStart >= iLength) { + break; + } + iEnd = wsContent.Find(L'\n', iStart); + if (iEnd < 0) { + wsSaveTextArray.Add(wsContent.Mid(iStart, iLength - iStart)); + } + } + iSize = wsSaveTextArray.GetSize(); + } + if(iSize == 0) { + while (CXFA_Node* pChildNode = pBind->GetNodeItem(XFA_NODEITEM_FirstChild)) { + pBind->RemoveChild(pChildNode); + } + } else { + CXFA_NodeArray valueNodes; + FX_INT32 iDatas = pBind->GetNodeList(valueNodes, XFA_NODEFILTER_Children, XFA_ELEMENT_DataValue); + if (iDatas < iSize) { + FX_INT32 iAddNodes = iSize - iDatas; + CXFA_Node *pValueNodes = NULL; + while (iAddNodes-- > 0) { + pValueNodes = pBind->CreateSamePacketNode(XFA_ELEMENT_DataValue); + pValueNodes->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L"value")); + pValueNodes->CreateXMLMappingNode(); + pBind->InsertChild(pValueNodes); + } + pValueNodes = NULL; + } else if (iDatas > iSize) { + FX_INT32 iDelNodes = iDatas - iSize; + while (iDelNodes-- > 0) { + pBind->RemoveChild(pBind->GetNodeItem(XFA_NODEITEM_FirstChild)); + } + } + FX_INT32 i = 0; + for (CXFA_Node *pValueNode = pBind->GetNodeItem(XFA_NODEITEM_FirstChild); pValueNode; pValueNode = pValueNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + pValueNode->SetAttributeValue(wsSaveTextArray[i], wsSaveTextArray[i], FALSE); + i++; + } + } + CXFA_NodeArray nodeArray; + pBind->GetBindItems(nodeArray); + for (FX_INT32 i = 0; i < nodeArray.GetSize(); i++) { + CXFA_Node* pNode = nodeArray[i]; + if (pNode == this) { + continue; + } + pNode->SetScriptContent(wsContent, wsContent, bNotify, bScriptModify, FALSE); + } + } + break; + } else if (GetClassID() == XFA_ELEMENT_ExclGroup) { + pNode = this; + } else { + CXFA_Node* pValue = GetProperty(0, XFA_ELEMENT_Value); + CXFA_Node* pChildValue = pValue->GetNodeItem(XFA_NODEITEM_FirstChild); + FXSYS_assert(pChildValue); + pChildValue->SetScriptContent(wsContent, wsContent, bNotify, bScriptModify, FALSE); + } + pBindNode = GetBindData(); + if (pBindNode && bSyncData) { + pBindNode->SetScriptContent(wsContent, wsXMLValue, bNotify, bScriptModify, FALSE); + CXFA_NodeArray nodeArray; + pBindNode->GetBindItems(nodeArray); + for (FX_INT32 i = 0; i < nodeArray.GetSize(); i++) { + CXFA_Node* pNode = nodeArray[i]; + if (pNode == this) { + continue; + } + pNode->SetScriptContent(wsContent, wsContent, bNotify, TRUE, FALSE); + } + } + pBindNode = NULL; + break; + } + case XFA_OBJECTTYPE_ContentNode: { + CFX_WideString wsContentType; + if (GetClassID() == XFA_ELEMENT_ExData) { + GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType, FALSE); + if (wsContentType.Equal(FX_WSTRC(L"text/html"))) { + wsContentType = FX_WSTRC(L""); + SetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType); + } + } + CXFA_Node *pContentRawDataNode = GetNodeItem(XFA_NODEITEM_FirstChild); + if (!pContentRawDataNode) { + pContentRawDataNode = CreateSamePacketNode((wsContentType.Equal(FX_WSTRC(L"text/xml"))) ? XFA_ELEMENT_Sharpxml : XFA_ELEMENT_Sharptext); + InsertChild(pContentRawDataNode); + } + return pContentRawDataNode->SetScriptContent(wsContent, wsXMLValue, bNotify, bScriptModify, bSyncData); + } + break; + case XFA_OBJECTTYPE_NodeC: + case XFA_OBJECTTYPE_TextNode: + pNode = this; + break; + case XFA_OBJECTTYPE_NodeV: + pNode = this; + if (bSyncData && GetPacketID() == XFA_XDPPACKET_Form) { + CXFA_Node* pParent = GetNodeItem(XFA_NODEITEM_Parent); + if (pParent) { + pParent = pParent->GetNodeItem(XFA_NODEITEM_Parent); + } + if (pParent && pParent->GetClassID() == XFA_ELEMENT_Value) { + pParent = pParent->GetNodeItem(XFA_NODEITEM_Parent); + if (pParent && pParent->IsContainerNode()) { + pBindNode = pParent->GetBindData(); + if (pBindNode) { + pBindNode->SetScriptContent(wsContent, wsXMLValue, bNotify, bScriptModify, FALSE); + } + } + } + } + break; + default: + if (GetClassID() == XFA_ELEMENT_DataValue) { + pNode = this; + pBindNode = this; + } + break; + } + if (pNode) { + SetAttributeValue(wsContent, wsXMLValue, bNotify, bScriptModify); + if (pBindNode && bSyncData) { + CXFA_NodeArray nodeArray; + pBindNode->GetBindItems(nodeArray); + for (FX_INT32 i = 0; i < nodeArray.GetSize(); i++) { + CXFA_Node* pNode = nodeArray[i]; + pNode->SetScriptContent(wsContent, wsContent, bNotify, bScriptModify, FALSE); + } + } + return TRUE; + } + return FALSE; +} +FX_BOOL CXFA_Node::SetContent(const CFX_WideString& wsContent, const CFX_WideString& wsXMLValue, FX_BOOL bNotify, FX_BOOL bScriptModify, FX_BOOL bSyncData) +{ + return SetScriptContent(wsContent, wsXMLValue, bNotify, bScriptModify, bSyncData); +} +CFX_WideString CXFA_Node::GetScriptContent(FX_BOOL bScriptModify) +{ + CFX_WideString wsContent; + return TryContent(wsContent, bScriptModify) ? wsContent : CFX_WideString(); +} +CFX_WideString CXFA_Node::GetContent() +{ + return GetScriptContent(); +} +FX_BOOL CXFA_Node::TryContent(CFX_WideString& wsContent, FX_BOOL bScriptModify, FX_BOOL bProto) +{ + CXFA_Node* pNode = NULL; + switch (GetObjectType()) { + case XFA_OBJECTTYPE_ContainerNode: + if (GetClassID() == XFA_ELEMENT_ExclGroup) { + pNode = this; + } else { + CXFA_Node* pValue = GetChild(0, XFA_ELEMENT_Value); + if (!pValue) { + return FALSE; + } + CXFA_Node* pChildValue = pValue->GetNodeItem(XFA_NODEITEM_FirstChild); + if (pChildValue && XFA_FieldIsMultiListBox(this)) { + pChildValue->SetAttribute(XFA_ATTRIBUTE_ContentType, FX_WSTRC(L"text/xml")); + } + return pChildValue ? pChildValue->TryContent(wsContent, bScriptModify, bProto) : FALSE; + } + break; + case XFA_OBJECTTYPE_ContentNode: { + CXFA_Node *pContentRawDataNode = GetNodeItem(XFA_NODEITEM_FirstChild); + if (!pContentRawDataNode) { + XFA_ELEMENT element = XFA_ELEMENT_Sharptext; + if (GetClassID() == XFA_ELEMENT_ExData) { + CFX_WideString wsContentType; + GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType, FALSE); + if (wsContentType.Equal(FX_WSTRC(L"text/html"))) { + element = XFA_ELEMENT_SharpxHTML; + } else if (wsContentType.Equal(FX_WSTRC(L"text/xml"))) { + element = XFA_ELEMENT_Sharpxml; + } + } + pContentRawDataNode = CreateSamePacketNode(element); + InsertChild(pContentRawDataNode); + } + return pContentRawDataNode->TryContent(wsContent, bScriptModify, bProto); + } + case XFA_OBJECTTYPE_NodeC: + case XFA_OBJECTTYPE_NodeV: + case XFA_OBJECTTYPE_TextNode: + pNode = this; + default: + if (GetClassID() == XFA_ELEMENT_DataValue) { + pNode = this; + } + break; + } + if (pNode) { + if (bScriptModify) { + IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext(); + if (pScriptContext) { + m_pDocument->GetScriptContext()->AddNodesOfRunScript(this); + } + } + return TryCData(XFA_ATTRIBUTE_Value, wsContent, FALSE, bProto); + } + return FALSE; +} +CXFA_Node* CXFA_Node::GetModelNode() +{ + switch(GetPacketID()) { + case XFA_XDPPACKET_XDP: + return m_pDocument->GetRoot(); + case XFA_XDPPACKET_Config: + return (CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_Config); + case XFA_XDPPACKET_Template: + return (CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_Template); + case XFA_XDPPACKET_Form: + return (CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_Form); + case XFA_XDPPACKET_Datasets: + return (CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_Datasets); + case XFA_XDPPACKET_LocaleSet: + return (CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_LocaleSet); + case XFA_XDPPACKET_ConnectionSet: + return (CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_ConnectionSet); + case XFA_XDPPACKET_SourceSet: + return (CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_SourceSet); + case XFA_XDPPACKET_Xdc: + return (CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_Xdc); + default: + return this; + } +} +FX_BOOL CXFA_Node::TryNamespace(CFX_WideString& wsNamespace) +{ + wsNamespace.Empty(); + if(this->GetObjectType() == XFA_OBJECTTYPE_ModelNode || this->GetClassID() == XFA_ELEMENT_Packet) { + IFDE_XMLNode* pXMLNode = this->GetXMLMappingNode(); + if(!pXMLNode || pXMLNode->GetType() != FDE_XMLNODE_Element) { + return FALSE; + } + ((IFDE_XMLElement*)pXMLNode)->GetNamespaceURI(wsNamespace); + return TRUE; + } else if(this->GetPacketID() == XFA_XDPPACKET_Datasets) { + IFDE_XMLNode* pXMLNode = this->GetXMLMappingNode(); + if(!pXMLNode) { + return FALSE; + } + if(pXMLNode->GetType() != FDE_XMLNODE_Element) { + return TRUE; + } + if(this->GetClassID() == XFA_ELEMENT_DataValue && this->GetEnum(XFA_ATTRIBUTE_Contains) == XFA_ATTRIBUTEENUM_MetaData) { + return XFA_FDEExtension_ResolveNamespaceQualifier((IFDE_XMLElement*)pXMLNode, this->GetCData(XFA_ATTRIBUTE_QualifiedName), wsNamespace); + } + ((IFDE_XMLElement*)pXMLNode)->GetNamespaceURI(wsNamespace); + return TRUE; + } else { + CXFA_Node *pModelNode = GetModelNode(); + return pModelNode->TryNamespace(wsNamespace); + } +} +CXFA_Node* CXFA_Node::GetProperty(FX_INT32 index, XFA_ELEMENT eProperty, FX_BOOL bCreateProperty ) +{ + XFA_ELEMENT eElement = GetClassID(); + FX_DWORD dwPacket = GetPacketID(); + XFA_LPCPROPERTY pProperty = XFA_GetPropertyOfElement(eElement, eProperty, dwPacket); + if (pProperty == NULL || index >= pProperty->uOccur) { + return NULL; + } + CXFA_Node *pNode = m_pChild; + FX_INT32 iCount = 0; + for(; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if (pNode->GetClassID() == eProperty) { + iCount ++; + if (iCount > index) { + return pNode; + } + } + } + if (!bCreateProperty) { + return NULL; + } + if (pProperty->uFlags & XFA_PROPERTYFLAG_OneOf) { + pNode = m_pChild; + for(; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + XFA_LPCPROPERTY pExistProterty = XFA_GetPropertyOfElement(eElement, pNode->GetClassID(), dwPacket); + if (pExistProterty && (pExistProterty->uFlags & XFA_PROPERTYFLAG_OneOf)) { + return NULL; + } + } + } + IXFA_ObjFactory *pFactory = m_pDocument->GetParser()->GetFactory(); + XFA_LPCPACKETINFO pPacket = XFA_GetPacketByID(dwPacket); + CXFA_Node *pNewNode; + for (; iCount <= index ; iCount ++) { + pNewNode = pFactory->CreateNode(pPacket, eProperty); + if(!pNewNode) { + return NULL; + } + this->InsertChild(pNewNode, NULL); + pNewNode->SetFlag(XFA_NODEFLAG_Initialized); + } + return pNewNode; +} +FX_INT32 CXFA_Node::CountChildren(XFA_ELEMENT eElement, FX_BOOL bOnlyChild) +{ + CXFA_Node *pNode = m_pChild; + FX_INT32 iCount = 0; + for(; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if (pNode->GetClassID() == eElement || eElement == XFA_ELEMENT_UNKNOWN) { + if(bOnlyChild) { + XFA_LPCPROPERTY pPropert = XFA_GetPropertyOfElement(GetClassID(), pNode->GetClassID(), XFA_XDPPACKET_UNKNOWN); + if(pPropert) { + continue; + } + } + iCount ++; + } + } + return iCount; +} +CXFA_Node* CXFA_Node::GetChild(FX_INT32 index, XFA_ELEMENT eElement, FX_BOOL bOnlyChild) +{ + FXSYS_assert(index > -1); + CXFA_Node *pNode = m_pChild; + FX_INT32 iCount = 0; + for(; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if (pNode->GetClassID() == eElement || eElement == XFA_ELEMENT_UNKNOWN) { + if(bOnlyChild) { + XFA_LPCPROPERTY pPropert = XFA_GetPropertyOfElement(GetClassID(), pNode->GetClassID(), XFA_XDPPACKET_UNKNOWN); + if(pPropert) { + continue; + } + } + iCount ++; + if (iCount > index) { + return pNode; + } + } + } + return NULL; +} +FX_INT32 CXFA_Node::InsertChild(FX_INT32 index, CXFA_Node *pNode) +{ + ASSERT(pNode != NULL && pNode->m_pNext == NULL); + pNode->m_pParent = this; + FX_BOOL bWasPurgeNode = m_pDocument->RemovePurgeNode(pNode); + FXSYS_assert(bWasPurgeNode == TRUE); + if (m_pChild == NULL || index == 0) { + if (index > 0) { + return -1; + } + pNode->m_pNext = m_pChild; + m_pChild = pNode; + index = 0; + } else if (index < 0) { + m_pLastChild->m_pNext = pNode; + } else { + CXFA_Node *pPrev = m_pChild; + FX_INT32 iCount = 0; + while (++iCount != index && pPrev->m_pNext) { + pPrev = pPrev->m_pNext; + } + if (index > 0 && index != iCount) { + return -1; + } + pNode->m_pNext = pPrev->m_pNext; + pPrev->m_pNext = pNode; + index = iCount; + } + if (pNode->m_pNext == NULL) { + m_pLastChild = pNode; + } + ASSERT(m_pLastChild != NULL && m_pLastChild->m_pNext == NULL); + pNode->SetFlag(XFA_NODEFLAG_HasRemoved, FALSE); + IXFA_Notify *pNotify = m_pDocument->GetParser()->GetNotify(); + if (pNotify) { + pNotify->OnNodeEvent(this, XFA_NODEEVENT_ChildAdded, pNode); + } + if (IsNeedSavingXMLNode() && pNode->m_pXMLNode) { + FXSYS_assert(pNode->m_pXMLNode->GetNodeItem(IFDE_XMLNode::Parent) == NULL); + m_pXMLNode->InsertChildNode(pNode->m_pXMLNode, index); + pNode->SetFlag(XFA_NODEFLAG_OwnXMLNode, FALSE, FALSE); + } + return index; +} +FX_BOOL CXFA_Node::InsertChild(CXFA_Node *pNode, CXFA_Node *pBeforeNode) +{ + if (!pNode || pNode->m_pParent != NULL || (pBeforeNode && pBeforeNode->m_pParent != this)) { + FXSYS_assert(FALSE); + return FALSE; + } + FX_BOOL bWasPurgeNode = m_pDocument->RemovePurgeNode(pNode); + FXSYS_assert(bWasPurgeNode == TRUE); + FX_INT32 nIndex = -1; + pNode->m_pParent = this; + if (m_pChild == NULL || pBeforeNode == m_pChild) { + pNode->m_pNext = m_pChild; + m_pChild = pNode; + nIndex = 0; + } else if (!pBeforeNode) { + pNode->m_pNext = m_pLastChild->m_pNext; + m_pLastChild->m_pNext = pNode; + } else { + nIndex = 1; + CXFA_Node *pPrev = m_pChild; + while (pPrev->m_pNext != pBeforeNode) { + pPrev = pPrev->m_pNext; + nIndex++; + } + pNode->m_pNext = pPrev->m_pNext; + pPrev->m_pNext = pNode; + } + if (pNode->m_pNext == NULL) { + m_pLastChild = pNode; + } + ASSERT(m_pLastChild != NULL && m_pLastChild->m_pNext == NULL); + pNode->SetFlag(XFA_NODEFLAG_HasRemoved, FALSE); + IXFA_Notify *pNotify = m_pDocument->GetParser()->GetNotify(); + if (pNotify) { + pNotify->OnNodeEvent(this, XFA_NODEEVENT_ChildAdded, pNode); + } + if (IsNeedSavingXMLNode() && pNode->m_pXMLNode) { + FXSYS_assert(pNode->m_pXMLNode->GetNodeItem(IFDE_XMLNode::Parent) == NULL); + m_pXMLNode->InsertChildNode(pNode->m_pXMLNode, nIndex); + pNode->SetFlag(XFA_NODEFLAG_OwnXMLNode, FALSE, FALSE); + } + return TRUE; +} +CXFA_Node* CXFA_Node::Deprecated_GetPrevSibling() +{ + if(!m_pParent) { + return NULL; + } + for (CXFA_Node *pSibling = m_pParent->m_pChild; pSibling; pSibling = pSibling->m_pNext) { + if(pSibling->m_pNext == this) { + return pSibling; + } + } + return NULL; +} +FX_BOOL CXFA_Node::RemoveChild(CXFA_Node *pNode, FX_BOOL bNotify) +{ + if (pNode == NULL || pNode->m_pParent != this) { + FXSYS_assert(FALSE); + return FALSE; + } + if (m_pChild == pNode) { + m_pChild = pNode->m_pNext; + if (m_pLastChild == pNode) { + m_pLastChild = pNode->m_pNext; + } + pNode->m_pNext = NULL; + pNode->m_pParent = NULL; + } else { + CXFA_Node *pPrev = pNode->Deprecated_GetPrevSibling(); + pPrev->m_pNext = pNode->m_pNext; + if (m_pLastChild == pNode) { + m_pLastChild = pNode->m_pNext ? pNode->m_pNext : pPrev; + } + pNode->m_pNext = NULL; + pNode->m_pParent = NULL; + } + ASSERT(m_pLastChild == NULL || m_pLastChild->m_pNext == NULL); + OnRemoved(this, pNode, bNotify); + pNode->SetFlag(XFA_NODEFLAG_HasRemoved); + m_pDocument->AddPurgeNode(pNode); + if (IsNeedSavingXMLNode() && pNode->m_pXMLNode) { + if (pNode->IsAttributeInXML()) { + FXSYS_assert(pNode->m_pXMLNode == m_pXMLNode && m_pXMLNode->GetType() == FDE_XMLNODE_Element); + if (pNode->m_pXMLNode->GetType() == FDE_XMLNODE_Element) { + IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)(pNode->m_pXMLNode); + CFX_WideStringC wsAttributeName = pNode->GetCData(XFA_ATTRIBUTE_QualifiedName); + pXMLElement->RemoveAttribute(wsAttributeName.GetPtr()); + } + CFX_WideString wsName; + pNode->GetAttribute(XFA_ATTRIBUTE_Name, wsName, FALSE); + IFDE_XMLElement* pNewXMLElement = IFDE_XMLElement::Create(wsName); + CFX_WideStringC wsValue = this->GetCData(XFA_ATTRIBUTE_Value); + if (!wsValue.IsEmpty()) { + pNewXMLElement->SetTextData(wsValue); + } + pNode->m_pXMLNode = pNewXMLElement; + pNode->SetEnum(XFA_ATTRIBUTE_Contains, XFA_ATTRIBUTEENUM_Unknown); + } else { + m_pXMLNode->RemoveChildNode(pNode->m_pXMLNode); + } + pNode->SetFlag(XFA_NODEFLAG_OwnXMLNode, TRUE, FALSE); + } + return TRUE; +} +CXFA_Node* CXFA_Node::GetFirstChildByName(FX_WSTR wsName) const +{ + return GetFirstChildByName(wsName.IsEmpty() ? 0 : FX_HashCode_String_GetW(wsName.GetPtr(), wsName.GetLength())); +} +CXFA_Node* CXFA_Node::GetFirstChildByName(FX_DWORD dwNameHash) const +{ + for(CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_FirstChild); pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if(pNode->GetNameHash() == dwNameHash) { + return pNode; + } + } + return NULL; +} +CXFA_Node* CXFA_Node::GetFirstChildByClass(XFA_ELEMENT eElement) const +{ + for(CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_FirstChild); pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if(pNode->GetClassID() == eElement) { + return pNode; + } + } + return NULL; +} +CXFA_Node* CXFA_Node::GetNextSameNameSibling(FX_DWORD dwNameHash) const +{ + for(CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_NextSibling); pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if(pNode->GetNameHash() == dwNameHash) { + return pNode; + } + } + return NULL; +} +CXFA_Node* CXFA_Node::GetNextSameNameSibling(FX_WSTR wsNodeName) const +{ + return GetNextSameNameSibling(wsNodeName.IsEmpty() ? 0 : FX_HashCode_String_GetW(wsNodeName.GetPtr(), wsNodeName.GetLength())); +} +CXFA_Node* CXFA_Node::GetNextSameClassSibling(XFA_ELEMENT eElement) const +{ + for(CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_NextSibling); pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if(pNode->GetClassID() == eElement) { + return pNode; + } + } + return NULL; +} +FX_INT32 CXFA_Node::GetNodeSameNameIndex() const +{ + IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext(); + if (!pScriptContext) { + return -1; + } + return pScriptContext->GetIndexByName((CXFA_Node*)this); +} +FX_INT32 CXFA_Node::GetNodeSameClassIndex() const +{ + IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext(); + if (!pScriptContext) { + return -1; + } + return pScriptContext->GetIndexByClassName((CXFA_Node*)this); +} +void CXFA_Node::GetSOMExpression(CFX_WideString& wsSOMExpression) +{ + IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext(); + if (!pScriptContext) { + return; + } + pScriptContext->GetSomExpression(this, wsSOMExpression); +} +CXFA_Node* CXFA_Node::GetInstanceMgrOfSubform() +{ + CXFA_Node* pInstanceMgr = NULL; + if (m_ePacket == XFA_XDPPACKET_Form) { + CXFA_Node* pParentNode = GetNodeItem(XFA_NODEITEM_Parent); + if (!pParentNode || pParentNode->GetClassID() == XFA_ELEMENT_Area) { + return pInstanceMgr; + } + for (CXFA_Node *pNode = GetNodeItem(XFA_NODEITEM_PrevSibling); pNode != NULL; pNode = pNode->GetNodeItem(XFA_NODEITEM_PrevSibling)) { + XFA_ELEMENT eType = pNode->GetClassID(); + if ((eType == XFA_ELEMENT_Subform || eType == XFA_ELEMENT_SubformSet) && pNode->m_dwNameHash != m_dwNameHash) { + break; + } + if (eType == XFA_ELEMENT_InstanceManager) { + CFX_WideStringC wsName = GetCData(XFA_ATTRIBUTE_Name); + CFX_WideStringC wsInstName = pNode->GetCData(XFA_ATTRIBUTE_Name); + if (wsInstName.GetLength() > 0 && wsInstName.GetAt(0) == '_' && wsInstName.Mid(1) == wsName) { + pInstanceMgr = pNode; + } + break; + } + } + } + return pInstanceMgr; +} +CXFA_Node* CXFA_Node::GetOccurNode() +{ + return GetFirstChildByClass(XFA_ELEMENT_Occur); +} +FX_BOOL CXFA_Node::HasFlag(FX_DWORD dwFlag) const +{ + if (m_uFlags & dwFlag) { + return TRUE; + } + switch (dwFlag) { + case XFA_NODEFLAG_HasRemoved: + return m_pParent && m_pParent->HasFlag(dwFlag); + default: + break; + } + return FALSE; +} +void CXFA_Node::SetFlag(FX_DWORD dwFlag, FX_BOOL bOn , FX_BOOL bNotify ) +{ + if (bOn) { + switch (dwFlag) { + case XFA_NODEFLAG_Initialized: + if (bNotify && !HasFlag(XFA_NODEFLAG_Initialized)) { + IXFA_Notify *pNotify = m_pDocument->GetParser()->GetNotify(); + if (pNotify) { + pNotify->OnNodeEvent(this, XFA_NODEEVENT_Ready); + } + } + break; + default: + break; + } + m_uFlags |= dwFlag; + } else { + m_uFlags &= ~dwFlag; + } +} +FX_BOOL CXFA_Node::IsAttributeInXML() +{ + return GetEnum(XFA_ATTRIBUTE_Contains) == XFA_ATTRIBUTEENUM_MetaData; +} +void CXFA_Node::OnRemoved(CXFA_Node *pParent, CXFA_Node *pRemoved, FX_BOOL bNotify) +{ + if (bNotify && (pParent != NULL)) { + IXFA_Notify *pNotify = m_pDocument->GetParser()->GetNotify(); + if (pNotify) { + pNotify->OnNodeEvent(pParent, XFA_NODEEVENT_ChildRemoved, pRemoved); + } + } +} +void CXFA_Node::OnChanging(XFA_ATTRIBUTE eAttr, FX_LPVOID pNewValue, FX_BOOL bNotify) +{ + if (bNotify && HasFlag(XFA_NODEFLAG_Initialized)) { + IXFA_Notify *pNotify = m_pDocument->GetParser()->GetNotify(); + if (pNotify) { + pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanging, (FX_LPVOID)(FX_UINTPTR)eAttr, pNewValue); + } + } +} +void CXFA_Node::OnChanged(XFA_ATTRIBUTE eAttr, FX_LPVOID pNewValue, FX_BOOL bNotify, FX_BOOL bScriptModify) +{ + if (bNotify && HasFlag(XFA_NODEFLAG_Initialized)) { + Script_Attribute_SendAttributeChangeMessage((FX_LPVOID)(FX_UINTPTR)eAttr, pNewValue, bScriptModify); + } +} +FX_INT32 CXFA_Node::execSingleEventByName(FX_WSTR wsEventName, XFA_ELEMENT eElementType) +{ + FX_INT32 iRet = XFA_EVENTERROR_NotExist; + const XFA_ExecEventParaInfo* eventParaInfo = GetEventParaInfoByName(wsEventName); + if (eventParaInfo) { + FX_UINT32 validFlags = eventParaInfo->m_validFlags; + IXFA_Notify * pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return iRet; + } + if (validFlags == 1) { + iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType); + } else if (validFlags == 2) { + iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType, FALSE, FALSE); + } else if (validFlags == 3) { + if (eElementType == XFA_ELEMENT_Subform) { + iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType, FALSE, FALSE); + } + } else if (validFlags == 4) { + if (eElementType == XFA_ELEMENT_ExclGroup || eElementType == XFA_ELEMENT_Field) { + CXFA_Node *pParentNode = GetNodeItem(XFA_NODEITEM_Parent); + if (pParentNode && pParentNode->GetClassID() == XFA_ELEMENT_ExclGroup) { + iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType, FALSE, FALSE); + } + iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType, FALSE, FALSE); + } + } else if (validFlags == 5) { + if (eElementType == XFA_ELEMENT_Field) { + iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType, FALSE, FALSE); + } + } else if (validFlags == 6) { + CXFA_WidgetData * pWidgetData = GetWidgetData(); + if (pWidgetData) { + CXFA_Node * pUINode = pWidgetData->GetUIChild(); + if (pUINode->m_eNodeClass == XFA_ELEMENT_Signature) { + iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType, FALSE, FALSE); + } + } + } else if (validFlags == 7) { + CXFA_WidgetData * pWidgetData = GetWidgetData(); + if (pWidgetData) { + CXFA_Node * pUINode = pWidgetData->GetUIChild(); + if ((pUINode->m_eNodeClass == XFA_ELEMENT_ChoiceList) && (!pWidgetData->IsListBox())) { + iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType, FALSE, FALSE); + } + } + } + } + return iRet; +} +void CXFA_Node::UpdateNameHash() +{ + XFA_LPCNOTSUREATTRIBUTE pNotsure = XFA_GetNotsureAttribute(GetClassID(), XFA_ATTRIBUTE_Name); + if(!pNotsure || pNotsure->eType == XFA_ATTRIBUTETYPE_Cdata) { + CFX_WideStringC wsName = GetCData(XFA_ATTRIBUTE_Name); + m_dwNameHash = wsName.IsEmpty() ? 0 : FX_HashCode_String_GetW(wsName.GetPtr(), wsName.GetLength()); + } else if (pNotsure->eType == XFA_ATTRIBUTETYPE_Enum) { + CFX_WideStringC wsName = XFA_GetAttributeEnumByID(GetEnum(XFA_ATTRIBUTE_Name))->pName; + m_dwNameHash = wsName.IsEmpty() ? 0 : FX_HashCode_String_GetW(wsName.GetPtr(), wsName.GetLength()); + } +} +IFDE_XMLNode* CXFA_Node::CreateXMLMappingNode() +{ + if (!m_pXMLNode) { + CFX_WideStringC wsTag = GetCData(XFA_ATTRIBUTE_Name); + m_pXMLNode = IFDE_XMLElement::Create(wsTag); + SetFlag(XFA_NODEFLAG_OwnXMLNode, TRUE, FALSE); + } + return m_pXMLNode; +} +FX_BOOL CXFA_Node::IsNeedSavingXMLNode() +{ + return m_pXMLNode && (GetPacketID() == XFA_XDPPACKET_Datasets || GetClassID() == XFA_ELEMENT_Xfa ); +} +XFA_LPMAPMODULEDATA CXFA_Node::GetMapModuleData(FX_BOOL bCreateNew) +{ + if (!m_pMapModuleData && bCreateNew) { + m_pMapModuleData = FX_NEW XFA_MAPMODULEDATA; + } + return m_pMapModuleData; +} +void CXFA_Node::SetMapModuleValue(FX_LPVOID pKey, FX_LPVOID pValue) +{ + XFA_LPMAPMODULEDATA pMoudle = this->GetMapModuleData(TRUE); + if (!pMoudle) { + return; + } + pMoudle->m_ValueMap.SetAt(pKey, pValue); +} +FX_BOOL CXFA_Node::GetMapModuleValue(FX_LPVOID pKey, FX_LPVOID &pValue) +{ + CXFA_Node* pNode = this; + while (pNode) { + XFA_LPMAPMODULEDATA pMoudle = pNode->GetMapModuleData(FALSE); + if (pMoudle && pMoudle->m_ValueMap.Lookup(pKey, pValue)) { + return TRUE; + } + pNode = pNode->GetPacketID() != XFA_XDPPACKET_Datasets ? pNode->GetTemplateNode() : NULL; + } + return FALSE; +} +void CXFA_Node::SetMapModuleString(FX_LPVOID pKey, FX_WSTR wsValue) +{ + SetMapModuleBuffer(pKey, (FX_LPVOID)wsValue.GetPtr(), wsValue.GetLength() * sizeof(FX_WCHAR)); +} +FX_BOOL CXFA_Node::GetMapModuleString(FX_LPVOID pKey, CFX_WideStringC &wsValue) +{ + FX_LPVOID pValue; + FX_INT32 iBytes; + if (!GetMapModuleBuffer(pKey, pValue, iBytes)) { + return FALSE; + } + wsValue = CFX_WideStringC((FX_LPCWSTR)pValue, iBytes / sizeof(FX_WCHAR)); + return TRUE; +} +void CXFA_Node::SetMapModuleBuffer(FX_LPVOID pKey, FX_LPVOID pValue, FX_INT32 iBytes, XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo ) +{ + XFA_LPMAPMODULEDATA pMoudle = this->GetMapModuleData(TRUE); + if (!pMoudle) { + return; + } + XFA_LPMAPDATABLOCK &pBuffer = pMoudle->m_BufferMap[pKey]; + if (pBuffer == NULL) { + pBuffer = (XFA_LPMAPDATABLOCK)FX_Alloc(FX_BYTE, sizeof(XFA_MAPDATABLOCK) + iBytes); + } else if (pBuffer->iBytes != iBytes) { + if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) { + pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData()); + } + pBuffer = (XFA_LPMAPDATABLOCK)FX_Realloc(FX_BYTE, pBuffer, sizeof(XFA_MAPDATABLOCK) + iBytes); + } else if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) { + pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData()); + } + if (pBuffer == NULL) { + return; + } + pBuffer->pCallbackInfo = pCallbackInfo; + pBuffer->iBytes = iBytes; + FXSYS_memcpy(pBuffer->GetData(), pValue, iBytes); +} +FX_BOOL CXFA_Node::GetMapModuleBuffer(FX_LPVOID pKey, FX_LPVOID &pValue, FX_INT32 &iBytes, FX_BOOL bProtoAlso) +{ + XFA_LPMAPDATABLOCK pBuffer = NULL; + CXFA_Node* pNode = this; + while (pNode) { + XFA_LPMAPMODULEDATA pMoudle = pNode->GetMapModuleData(FALSE); + if (pMoudle && pMoudle->m_BufferMap.Lookup(pKey, pBuffer)) { + break; + } + pNode = (bProtoAlso && pNode->GetPacketID() != XFA_XDPPACKET_Datasets) ? pNode->GetTemplateNode() : NULL; + } + if (pBuffer == NULL) { + return FALSE; + } + pValue = pBuffer->GetData(); + iBytes = pBuffer->iBytes; + return TRUE; +} +FX_BOOL CXFA_Node::HasMapModuleKey(FX_LPVOID pKey, FX_BOOL bProtoAlso) +{ + CXFA_Node* pNode = this; + while (pNode) { + FX_LPVOID pVal; + XFA_LPMAPMODULEDATA pMoudle = pNode->GetMapModuleData(FALSE); + if (pMoudle && (pMoudle->m_ValueMap.Lookup(pKey, pVal) || pMoudle->m_BufferMap.Lookup(pKey, (XFA_LPMAPDATABLOCK&)pVal))) { + return TRUE; + } + pNode = (bProtoAlso && pNode->GetPacketID() != XFA_XDPPACKET_Datasets) ? pNode->GetTemplateNode() : NULL; + } + return FALSE; +} +void CXFA_Node::RemoveMapModuleKey(FX_LPVOID pKey ) +{ + XFA_LPMAPMODULEDATA pMoudle = this->GetMapModuleData(FALSE); + if (!pMoudle) { + return; + } + if (pKey) { + XFA_LPMAPDATABLOCK pBuffer = NULL; + pMoudle->m_BufferMap.Lookup(pKey, pBuffer); + if (pBuffer) { + if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) { + pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData()); + } + FX_Free(pBuffer); + } + pMoudle->m_BufferMap.RemoveKey(pKey); + pMoudle->m_ValueMap.RemoveKey(pKey); + } else { + XFA_LPMAPDATABLOCK pBuffer; + FX_POSITION posBuffer = pMoudle->m_BufferMap.GetStartPosition(); + while (posBuffer) { + pMoudle->m_BufferMap.GetNextAssoc(posBuffer, pKey, pBuffer); + if (pBuffer) { + if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) { + pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData()); + } + FX_Free(pBuffer); + } + } + pMoudle->m_BufferMap.RemoveAll(); + pMoudle->m_ValueMap.RemoveAll(); + if (pMoudle) { + delete pMoudle; + pMoudle = NULL; + } + } +} +void CXFA_Node::MergeAllData(FX_LPVOID pDstModule, FX_BOOL bUseSrcAttr ) +{ + XFA_LPMAPMODULEDATA pDstModuleData = ((CXFA_Node*)pDstModule)->GetMapModuleData(TRUE); + if (!pDstModuleData) { + return; + } + XFA_LPMAPMODULEDATA pSrcModuleData = this->GetMapModuleData(FALSE); + if (!pSrcModuleData) { + return; + } + FX_POSITION psValue = pSrcModuleData->m_ValueMap.GetStartPosition(); + while (psValue) { + FX_LPVOID pKey; + FX_LPVOID pValue; + pSrcModuleData->m_ValueMap.GetNextAssoc(psValue, pKey, pValue); + if (bUseSrcAttr || !pDstModuleData->m_ValueMap.GetValueAt(pKey)) { + pDstModuleData->m_ValueMap.SetAt(pKey, pValue); + } + } + FX_POSITION psBuffer = pSrcModuleData->m_BufferMap.GetStartPosition(); + while (psBuffer) { + FX_LPVOID pKey; + XFA_LPMAPDATABLOCK pSrcBuffer; + pSrcModuleData->m_BufferMap.GetNextAssoc(psBuffer, pKey, pSrcBuffer); + XFA_LPMAPDATABLOCK &pBuffer = pDstModuleData->m_BufferMap[pKey]; + if (pBuffer && !bUseSrcAttr) { + continue; + } + if (pSrcBuffer->pCallbackInfo && pSrcBuffer->pCallbackInfo->pFree && !pSrcBuffer->pCallbackInfo->pCopy) { + if (pBuffer) { + pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData()); + pDstModuleData->m_BufferMap.RemoveKey(pKey); + } + continue; + } + if (pBuffer == NULL) { + pBuffer = (XFA_LPMAPDATABLOCK)FX_Alloc(FX_BYTE, sizeof(XFA_MAPDATABLOCK) + pSrcBuffer->iBytes); + } else if (pBuffer->iBytes != pSrcBuffer->iBytes) { + if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) { + pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData()); + } + pBuffer = (XFA_LPMAPDATABLOCK)FX_Realloc(FX_BYTE, pBuffer, sizeof(XFA_MAPDATABLOCK) + pSrcBuffer->iBytes); + } else if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) { + pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData()); + } + if (pBuffer == NULL) { + continue; + } + pBuffer->pCallbackInfo = pSrcBuffer->pCallbackInfo; + pBuffer->iBytes = pSrcBuffer->iBytes; + FXSYS_memcpy(pBuffer->GetData(), pSrcBuffer->GetData(), pSrcBuffer->iBytes); + if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pCopy) { + pBuffer->pCallbackInfo->pCopy(*(void**)pBuffer->GetData()); + } + } +} +void CXFA_Node::MoveBufferMapData(CXFA_Node* pDstModule, FX_LPVOID pKey) +{ + if (!pDstModule) { + return; + } + FX_BOOL bNeedMove = TRUE; + if (!pKey) { + bNeedMove = FALSE; + } + if (pDstModule->GetClassID() != this->GetClassID()) { + bNeedMove = FALSE; + } + XFA_LPMAPMODULEDATA pSrcModuleData = NULL; + XFA_LPMAPMODULEDATA pDstModuleData = NULL; + if (bNeedMove) { + pSrcModuleData = this->GetMapModuleData(FALSE); + if (!pSrcModuleData) { + bNeedMove = FALSE; + } + pDstModuleData = pDstModule->GetMapModuleData(TRUE); + if (!pDstModuleData) { + bNeedMove = FALSE; + } + } + if (bNeedMove) { + FX_LPVOID pBufferBlockData = pSrcModuleData->m_BufferMap.GetValueAt(pKey); + if (pBufferBlockData) { + pSrcModuleData->m_BufferMap.RemoveKey(pKey); + pDstModuleData->m_BufferMap.RemoveKey(pKey); + pDstModuleData->m_BufferMap.SetAt(pKey, (XFA_LPMAPDATABLOCK)pBufferBlockData); + } + } + if (pDstModule->GetObjectType() == XFA_OBJECTTYPE_NodeV) { + CFX_WideString wsValue = pDstModule->GetScriptContent(FALSE); + CFX_WideString wsFormatValue(wsValue); + CXFA_WidgetData* pWidgetData = pDstModule->GetContainerWidgetData(); + if (pWidgetData) { + pWidgetData->GetFormatDataValue(wsValue, wsFormatValue); + } + pDstModule->SetScriptContent(wsValue, wsFormatValue, TRUE, TRUE); + } +} +void CXFA_Node::MoveBufferMapData(CXFA_Node* pSrcModule, CXFA_Node* pDstModule, FX_LPVOID pKey, FX_BOOL bRecursive ) +{ + if (!pSrcModule || !pDstModule || !pKey) { + return; + } + if (bRecursive) { + CXFA_Node* pSrcChild = pSrcModule->GetNodeItem(XFA_NODEITEM_FirstChild); + CXFA_Node* pDstChild = pDstModule->GetNodeItem(XFA_NODEITEM_FirstChild); + for ( ; pSrcChild && pDstChild; pSrcChild = pSrcChild->GetNodeItem(XFA_NODEITEM_NextSibling), pDstChild = pDstChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { + MoveBufferMapData(pSrcChild, pDstChild, pKey, TRUE); + } + } + pSrcModule->MoveBufferMapData(pDstModule, pKey); +} +CXFA_NodeList::CXFA_NodeList(CXFA_Document* pDocument) + : CXFA_Object(pDocument, XFA_OBJECTTYPE_NodeList) +{ + m_pDocument->GetScriptContext()->CacheList(this); +} +CXFA_Node* CXFA_NodeList::NamedItem(FX_WSTR wsName) +{ + FX_INT32 iCount = GetLength(); + FX_DWORD dwHashCode = FX_HashCode_String_GetW(wsName.GetPtr(), wsName.GetLength()); + for (FX_INT32 i = 0; i < iCount; i++) { + CXFA_Node* ret = Item(i); + if (dwHashCode == ret->GetNameHash()) { + return ret; + } + } + return NULL; +} +void CXFA_NodeList::Script_ListClass_Append(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if(argc == 1) { + CXFA_Node *pNode = (CXFA_Node *)pArguments->GetObject(0); + if(pNode) { + Append(pNode); + } else { + ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); + } + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"append")); + } +} +void CXFA_NodeList::Script_ListClass_Insert(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if(argc == 2) { + CXFA_Node *pNewNode = (CXFA_Node *)pArguments->GetObject(0); + CXFA_Node *pBeforeNode = (CXFA_Node *)pArguments->GetObject(1); + if(pNewNode) { + Insert(pNewNode, pBeforeNode); + } else { + ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); + } + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"insert")); + } +} +void CXFA_NodeList::Script_ListClass_Remove(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if(argc == 1) { + CXFA_Node *pNode = (CXFA_Node *)pArguments->GetObject(0); + if(pNode) { + Remove(pNode); + } else { + ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); + } + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"remove")); + } +} +void CXFA_NodeList::Script_ListClass_Item(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if(argc == 1) { + FX_INT32 iIndex = pArguments->GetInt32(0); + if((iIndex >= 0) && (iIndex + 1 <= GetLength())) { + FXJSE_Value_Set(pArguments->GetReturnValue(), m_pDocument->GetScriptContext()->GetJSValueFromMap(Item(iIndex))); + } else { + ThrowScriptErrorMessage(XFA_IDS_INDEX_OUT_OF_BOUNDS); + } + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"item")); + } +} +void CXFA_NodeList::Script_TreelistClass_NamedItem(CFXJSE_Arguments* pArguments) +{ + FX_INT32 argc = pArguments->GetLength(); + if(argc == 1) { + CFX_ByteString szName = pArguments->GetUTF8String(0); + CXFA_Node* pNode = NamedItem(CFX_WideString::FromUTF8(szName, szName.GetLength())); + if (!pNode) { + return; + } + FXJSE_Value_Set(pArguments->GetReturnValue(), m_pDocument->GetScriptContext()->GetJSValueFromMap(pNode)); + } else { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"namedItem")); + } +} +void CXFA_NodeList::Script_ListClass_Length(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if(!bSetting) { + FXJSE_Value_SetInteger(hValue, GetLength()); + } else { + ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); + } +} +CXFA_ArrayNodeList::CXFA_ArrayNodeList(CXFA_Document* pDocument) + : CXFA_NodeList(pDocument) +{ +} +void CXFA_ArrayNodeList::SetArrayNodeList(const CXFA_NodeArray &srcArray) +{ + if (srcArray.GetSize() > 0) { + m_array.Copy(srcArray); + } +} +FX_INT32 CXFA_ArrayNodeList::GetLength() +{ + return m_array.GetSize(); +} +FX_BOOL CXFA_ArrayNodeList::Append(CXFA_Node* pNode) +{ + m_array.Add(pNode); + return TRUE; +} +FX_BOOL CXFA_ArrayNodeList::Insert(CXFA_Node* pNewNode, CXFA_Node* pBeforeNode) +{ + if (pBeforeNode == NULL) { + m_array.Add(pNewNode); + } else { + FX_INT32 iSize = m_array.GetSize(); + for (FX_INT32 i = 0; i < iSize; ++i) { + if (m_array[i] == pBeforeNode) { + m_array.InsertAt(i, pNewNode); + break; + } + } + } + return TRUE; +} +FX_BOOL CXFA_ArrayNodeList::Remove(CXFA_Node* pNode) +{ + FX_INT32 iSize = m_array.GetSize(); + for (FX_INT32 i = 0; i < iSize; ++i) { + if (m_array[i] == pNode) { + m_array.RemoveAt(i); + break; + } + } + return TRUE; +} +CXFA_Node* CXFA_ArrayNodeList::Item(FX_INT32 iIndex) +{ + FX_INT32 iSize = m_array.GetSize(); + if (iIndex >= 0 && iIndex < iSize) { + return m_array[iIndex]; + } + return NULL; +} +CXFA_AttachNodeList::CXFA_AttachNodeList(CXFA_Document* pDocument, CXFA_Node* pAttachNode) + : CXFA_NodeList(pDocument) +{ + m_pAttachNode = pAttachNode; +} +FX_INT32 CXFA_AttachNodeList::GetLength() +{ + return m_pAttachNode->CountChildren(XFA_ELEMENT_UNKNOWN, m_pAttachNode->GetClassID() == XFA_ELEMENT_Subform ? TRUE : FALSE); +} +FX_BOOL CXFA_AttachNodeList::Append(CXFA_Node* pNode) +{ + CXFA_Node* pParent = pNode->GetNodeItem(XFA_NODEITEM_Parent); + if (pParent) { + pParent->RemoveChild(pNode); + } + return m_pAttachNode->InsertChild(pNode); +} +FX_BOOL CXFA_AttachNodeList::Insert(CXFA_Node* pNewNode, CXFA_Node* pBeforeNode) +{ + CXFA_Node* pParent = pNewNode->GetNodeItem(XFA_NODEITEM_Parent); + if (pParent) { + pParent->RemoveChild(pNewNode); + } + return m_pAttachNode->InsertChild(pNewNode, pBeforeNode); +} +FX_BOOL CXFA_AttachNodeList::Remove(CXFA_Node* pNode) +{ + return m_pAttachNode->RemoveChild(pNode); +} +CXFA_Node* CXFA_AttachNodeList::Item(FX_INT32 iIndex) +{ + return m_pAttachNode->GetChild(iIndex, XFA_ELEMENT_UNKNOWN, m_pAttachNode->GetClassID() == XFA_ELEMENT_Subform ? TRUE : FALSE); +} diff --git a/xfa/src/fxfa/src/parser/xfa_objectacc_imp.cpp b/xfa/src/fxfa/src/parser/xfa_objectacc_imp.cpp new file mode 100644 index 0000000000..a390d62592 --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_objectacc_imp.cpp @@ -0,0 +1,4161 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_utils.h" +#include "../common/xfa_object.h" +#include "../common/xfa_document.h" +#include "../common/xfa_parser.h" +#include "../common/xfa_script.h" +#include "../common/xfa_docdata.h" +#include "../common/xfa_doclayout.h" +#include "../common/xfa_debug.h" +#include "../common/xfa_localemgr.h" +#include "../common/xfa_fm2jsapi.h" +#include "xfa_debug_parser.h" +static FX_ARGB XFA_WStringToColor(FX_WSTR wsValue) +{ + FX_BYTE r = 0, g = 0, b = 0; + if (wsValue.GetLength() == 0) { + return 0xff000000; + } + int cc = 0; + FX_LPCWSTR str = wsValue.GetPtr(); + int len = wsValue.GetLength(); + while (XFA_IsSpace(str[cc]) && cc < len) { + cc++; + } + if (cc >= len) { + return 0xff000000; + } + while (cc < len) { + if (str[cc] == ',' || !XFA_IsDigit(str[cc])) { + break; + } + r = r * 10 + str[cc] - '0'; + cc ++; + } + if (cc < len && str[cc] == ',') { + cc ++; + while (XFA_IsSpace(str[cc]) && cc < len) { + cc++; + } + while (cc < len) { + if (str[cc] == ',' || !XFA_IsDigit(str[cc])) { + break; + } + g = g * 10 + str[cc] - '0'; + cc ++; + } + if (cc < len && str[cc] == ',') { + cc ++; + while (XFA_IsSpace(str[cc]) && cc < len) { + cc++; + } + while (cc < len) { + if (str[cc] == ',' || !XFA_IsDigit(str[cc])) { + break; + } + b = b * 10 + str[cc] - '0'; + cc ++; + } + } + } + return (0xff << 24) | (r << 16) | (g << 8) | b; +} +XFA_ELEMENT CXFA_Data::GetClassID() const +{ + return m_pNode ? m_pNode->GetClassID() : XFA_ELEMENT_UNKNOWN; +} +FX_BOOL CXFA_Data::TryMeasure(XFA_ATTRIBUTE eAttr, FX_FLOAT &fValue, FX_BOOL bUseDefault ) const +{ + CXFA_Measurement ms; + if (m_pNode->TryMeasure(eAttr, ms, bUseDefault)) { + fValue = ms.ToUnit(XFA_UNIT_Pt); + return TRUE; + } + return FALSE; +} +FX_BOOL CXFA_Data::SetMeasure(XFA_ATTRIBUTE eAttr, FX_FLOAT fValue) +{ + CXFA_Measurement ms(fValue, XFA_UNIT_Pt); + return m_pNode->SetMeasure(eAttr, ms); +} +CXFA_Fill::CXFA_Fill(CXFA_Node* pNode) + : CXFA_Data(pNode) +{ +} +CXFA_Fill::~CXFA_Fill() +{ +} +FX_INT32 CXFA_Fill::GetPresence() +{ + return m_pNode->GetEnum(XFA_ATTRIBUTE_Presence); +} +void CXFA_Fill::SetColor(FX_ARGB color) +{ + CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Color); + CFX_WideString wsColor; + int a, r, g, b; + ArgbDecode(color, a, r, g, b); + wsColor.Format((FX_LPCWSTR)L"%d,%d,%d", r, g, b); + pNode->SetCData(XFA_ATTRIBUTE_Value, wsColor); +} +FX_ARGB CXFA_Fill::GetColor(FX_BOOL bText) +{ + if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Color)) { + CFX_WideStringC wsColor; + if (pNode->TryCData(XFA_ATTRIBUTE_Value, wsColor, FALSE)) { + return XFA_WStringToColor(wsColor); + } + } + if (bText) { + return 0xFF000000; + } + return 0xFFFFFFFF; +} +FX_INT32 CXFA_Fill::GetFillType() +{ + CXFA_Node* pChild = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild); + while (pChild) { + FX_INT32 eType = pChild->GetClassID(); + if (eType != XFA_ELEMENT_Color && eType != XFA_ELEMENT_Extras) { + return eType; + } + pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling); + } + return XFA_ELEMENT_Solid; +} +FX_INT32 CXFA_Fill::GetPattern(FX_ARGB& foreColor) +{ + CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Pattern); + if (CXFA_Node* pColor = pNode->GetChild(0, XFA_ELEMENT_Color)) { + CFX_WideStringC wsColor; + pColor->TryCData(XFA_ATTRIBUTE_Value, wsColor, FALSE); + foreColor = XFA_WStringToColor(wsColor); + } else { + foreColor = 0xFF000000; + } + return pNode->GetEnum(XFA_ATTRIBUTE_Type); +} +FX_INT32 CXFA_Fill::GetStipple(FX_ARGB& stippleColor) +{ + CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Stipple); + FX_INT32 eAttr = 50; + pNode->TryInteger(XFA_ATTRIBUTE_Rate, eAttr); + if (CXFA_Node* pColor = pNode->GetChild(0, XFA_ELEMENT_Color)) { + CFX_WideStringC wsColor; + pColor->TryCData(XFA_ATTRIBUTE_Value, wsColor, FALSE); + stippleColor = XFA_WStringToColor(wsColor); + } else { + stippleColor = 0xFF000000; + } + return eAttr; +} +FX_INT32 CXFA_Fill::GetLinear(FX_ARGB& endColor) +{ + CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Linear); + XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_ToRight; + pNode->TryEnum(XFA_ATTRIBUTE_Type, eAttr); + if (CXFA_Node* pColor = pNode->GetChild(0, XFA_ELEMENT_Color)) { + CFX_WideStringC wsColor; + pColor->TryCData(XFA_ATTRIBUTE_Value, wsColor, FALSE); + endColor = XFA_WStringToColor(wsColor); + } else { + endColor = 0xFF000000; + } + return eAttr; +} +FX_INT32 CXFA_Fill::GetRadial(FX_ARGB& endColor) +{ + CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Radial); + XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_ToEdge; + pNode->TryEnum(XFA_ATTRIBUTE_Type, eAttr); + if (CXFA_Node* pColor = pNode->GetChild(0, XFA_ELEMENT_Color)) { + CFX_WideStringC wsColor; + pColor->TryCData(XFA_ATTRIBUTE_Value, wsColor, FALSE); + endColor = XFA_WStringToColor(wsColor); + } else { + endColor = 0xFF000000; + } + return eAttr; +} +FX_BOOL CXFA_Fill::SetPresence(FX_INT32 iPresence) +{ + return m_pNode->SetEnum(XFA_ATTRIBUTE_Presence, (XFA_ATTRIBUTEENUM)iPresence); +} +FX_BOOL CXFA_Fill::SetFillType(FX_INT32 iType) +{ + return FALSE; +} +FX_BOOL CXFA_Fill::SetPattern(FX_INT32 iPattern, FX_ARGB foreColor) +{ + CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Pattern); + CXFA_Node* pColor = pNode->GetProperty(0, XFA_ELEMENT_Color); + CFX_WideString wsColor; + int a, r, g, b; + ArgbDecode(foreColor, a, r, g, b); + wsColor.Format((FX_LPCWSTR)L"%d,%d,%d", r, g, b); + pColor->SetCData(XFA_ATTRIBUTE_Value, wsColor); + return pNode->SetEnum(XFA_ATTRIBUTE_Type, (XFA_ATTRIBUTEENUM)iPattern); +} +FX_BOOL CXFA_Fill::SetStipple(FX_INT32 iStipple, FX_ARGB stippleColor) +{ + CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Stipple); + CXFA_Node* pColor = pNode->GetProperty(0, XFA_ELEMENT_Color); + CFX_WideString wsColor; + int a, r, g, b; + ArgbDecode(stippleColor, a, r, g, b); + wsColor.Format((FX_LPCWSTR)L"%d,%d,%d", r, g, b); + pColor->SetCData(XFA_ATTRIBUTE_Value, wsColor); + return pNode->SetEnum(XFA_ATTRIBUTE_Rate, (XFA_ATTRIBUTEENUM)iStipple); +} +FX_BOOL CXFA_Fill::SetLinear(FX_INT32 iLinear, FX_ARGB endColor) +{ + CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Linear); + CXFA_Node* pColor = pNode->GetProperty(0, XFA_ELEMENT_Color); + CFX_WideString wsColor; + int a, r, g, b; + ArgbDecode(endColor, a, r, g, b); + wsColor.Format((FX_LPCWSTR)L"%d,%d,%d", r, g, b); + pColor->SetCData(XFA_ATTRIBUTE_Value, wsColor); + return pNode->SetEnum(XFA_ATTRIBUTE_Type, (XFA_ATTRIBUTEENUM)iLinear); +} +FX_BOOL CXFA_Fill::SetRadial(FX_INT32 iRadial, FX_ARGB endColor) +{ + CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Radial); + CXFA_Node* pColor = pNode->GetProperty(0, XFA_ELEMENT_Color); + CFX_WideString wsColor; + int a, r, g, b; + ArgbDecode(endColor, a, r, g, b); + wsColor.Format((FX_LPCWSTR)L"%d,%d,%d", r, g, b); + pColor->SetCData(XFA_ATTRIBUTE_Value, wsColor); + return pNode->SetEnum(XFA_ATTRIBUTE_Type, (XFA_ATTRIBUTEENUM)iRadial); +} +CXFA_Margin::CXFA_Margin(CXFA_Node* pNode) + : CXFA_Data(pNode) +{ +} +FX_BOOL CXFA_Margin::GetLeftInset(FX_FLOAT &fInset, FX_FLOAT fDefInset ) const +{ + fInset = fDefInset; + return TryMeasure(XFA_ATTRIBUTE_LeftInset, fInset); +} +FX_BOOL CXFA_Margin::GetTopInset(FX_FLOAT &fInset, FX_FLOAT fDefInset ) const +{ + fInset = fDefInset; + return TryMeasure(XFA_ATTRIBUTE_TopInset, fInset); +} +FX_BOOL CXFA_Margin::GetRightInset(FX_FLOAT &fInset, FX_FLOAT fDefInset ) const +{ + fInset = fDefInset; + return TryMeasure(XFA_ATTRIBUTE_RightInset, fInset); +} +FX_BOOL CXFA_Margin::GetBottomInset(FX_FLOAT &fInset, FX_FLOAT fDefInset ) const +{ + fInset = fDefInset; + return TryMeasure(XFA_ATTRIBUTE_BottomInset, fInset); +} +FX_BOOL CXFA_Margin::SetLeftInset(FX_FLOAT fInset) +{ + return SetMeasure(XFA_ATTRIBUTE_LeftInset, fInset); +} +FX_BOOL CXFA_Margin::SetTopInset(FX_FLOAT fInset) +{ + return SetMeasure(XFA_ATTRIBUTE_TopInset, fInset); +} +FX_BOOL CXFA_Margin::SetRightInset(FX_FLOAT fInset) +{ + return SetMeasure(XFA_ATTRIBUTE_RightInset, fInset); +} +FX_BOOL CXFA_Margin::SetBottomInset(FX_FLOAT fInset) +{ + return SetMeasure(XFA_ATTRIBUTE_BottomInset, fInset); +} +CXFA_Font::CXFA_Font(CXFA_Node* pNode) + : CXFA_Data(pNode) +{ +} +FX_FLOAT CXFA_Font::GetBaselineShift() +{ + return m_pNode->GetMeasure(XFA_ATTRIBUTE_BaselineShift).ToUnit(XFA_UNIT_Pt); +} +FX_FLOAT CXFA_Font::GetHorizontalScale() +{ + CFX_WideString wsValue; + m_pNode->TryCData(XFA_ATTRIBUTE_FontHorizontalScale, wsValue); + FX_INT32 iScale = FXSYS_wtoi((FX_LPCWSTR)wsValue); + return iScale > 0 ? (FX_FLOAT)iScale : 100.0f; +} +FX_FLOAT CXFA_Font::GetVerticalScale() +{ + CFX_WideString wsValue; + m_pNode->TryCData(XFA_ATTRIBUTE_FontVerticalScale, wsValue); + FX_INT32 iScale = FXSYS_wtoi((FX_LPCWSTR)wsValue); + return iScale > 0 ? (FX_FLOAT)iScale : 100.0f; +} +FX_FLOAT CXFA_Font::GetLetterSpacing() +{ + CFX_WideStringC wsValue; + if (!m_pNode->TryCData(XFA_ATTRIBUTE_LetterSpacing, wsValue)) { + return 0; + } + CXFA_Measurement ms(wsValue); + if (ms.GetUnit() == XFA_UNIT_Em) { + return ms.GetValue() * GetFontSize(); + } + return ms.ToUnit(XFA_UNIT_Pt); +} +FX_INT32 CXFA_Font::GetLineThrough() +{ + FX_INT32 iValue = 0; + m_pNode->TryInteger(XFA_ATTRIBUTE_LineThrough, iValue); + return iValue; +} +FX_INT32 CXFA_Font::GetLineThroughPeriod() +{ + XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_All; + m_pNode->TryEnum(XFA_ATTRIBUTE_LineThroughPeriod, eAttr); + return eAttr; +} +FX_INT32 CXFA_Font::GetOverline() +{ + FX_INT32 iValue = 0; + m_pNode->TryInteger(XFA_ATTRIBUTE_Overline, iValue); + return iValue; +} +FX_INT32 CXFA_Font::GetOverlinePeriod() +{ + XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_All; + m_pNode->TryEnum(XFA_ATTRIBUTE_OverlinePeriod, eAttr); + return eAttr; +} +FX_INT32 CXFA_Font::GetUnderline() +{ + FX_INT32 iValue = 0; + m_pNode->TryInteger(XFA_ATTRIBUTE_Underline, iValue); + return iValue; +} +FX_INT32 CXFA_Font::GetUnderlinePeriod() +{ + XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_All; + m_pNode->TryEnum(XFA_ATTRIBUTE_UnderlinePeriod, eAttr); + return eAttr; +} +FX_FLOAT CXFA_Font::GetFontSize() +{ + CXFA_Measurement ms; + m_pNode->TryMeasure(XFA_ATTRIBUTE_Size, ms); + return ms.ToUnit(XFA_UNIT_Pt); +} +void CXFA_Font::GetTypeface(CFX_WideStringC &wsTypeFace) +{ + m_pNode->TryCData(XFA_ATTRIBUTE_Typeface, wsTypeFace); +} +FX_BOOL CXFA_Font::IsBold() +{ + XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Normal; + m_pNode->TryEnum(XFA_ATTRIBUTE_Weight, eAttr); + return eAttr == XFA_ATTRIBUTEENUM_Bold; +} +FX_BOOL CXFA_Font::IsItalic() +{ + XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Normal; + m_pNode->TryEnum(XFA_ATTRIBUTE_Posture, eAttr); + return eAttr == XFA_ATTRIBUTEENUM_Italic; +} +FX_BOOL CXFA_Font::IsUseKerning() +{ + XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_None; + m_pNode->TryEnum(XFA_ATTRIBUTE_KerningMode, eAttr); + return eAttr == XFA_ATTRIBUTEENUM_Pair; +} +void CXFA_Font::SetColor(FX_ARGB color) +{ + CXFA_Fill fill = m_pNode->GetProperty(0, XFA_ELEMENT_Fill); + fill.SetColor(color); +} +FX_ARGB CXFA_Font::GetColor() +{ + if (CXFA_Fill fill = m_pNode->GetChild(0, XFA_ELEMENT_Fill)) { + return fill.GetColor(TRUE); + } + return 0xFF000000; +} +FX_BOOL CXFA_Font::SetBaselineShift(FX_FLOAT fBaselineShift) +{ + CXFA_Measurement ms(fBaselineShift, XFA_UNIT_Pt); + return m_pNode->SetMeasure(XFA_ATTRIBUTE_BaselineShift, ms); +} +FX_BOOL CXFA_Font::SetHorizontalScale(FX_FLOAT fHorizontalScale) +{ + CFX_WideString wsValue; + wsValue.Format((FX_LPCWSTR)L"%d", (FX_INT32)fHorizontalScale); + return m_pNode->SetCData(XFA_ATTRIBUTE_FontHorizontalScale, wsValue); +} +FX_BOOL CXFA_Font::SetVerticalScale(FX_FLOAT fVerticalScale) +{ + CFX_WideString wsValue; + wsValue.Format((FX_LPCWSTR)L"%d", (FX_INT32)fVerticalScale); + return m_pNode->SetCData(XFA_ATTRIBUTE_FontVerticalScale, wsValue); +} +FX_BOOL CXFA_Font::SetLetterSpacing(FX_FLOAT fLetterSpacing, XFA_UNIT eUnit) +{ + return FALSE; +} +FX_BOOL CXFA_Font::SetLineThrough(FX_INT32 iLineThrough) +{ + return m_pNode->SetInteger(XFA_ATTRIBUTE_LineThrough, iLineThrough); +} +FX_BOOL CXFA_Font::SetLineThroughPeriod(FX_INT32 iLineThroughPeriod) +{ + return m_pNode->SetEnum(XFA_ATTRIBUTE_LineThroughPeriod, (XFA_ATTRIBUTEENUM)iLineThroughPeriod); +} +FX_BOOL CXFA_Font::SetOverline(FX_INT32 iOverline) +{ + return m_pNode->SetInteger(XFA_ATTRIBUTE_Overline, iOverline); +} +FX_BOOL CXFA_Font::SetOverlinePeriod(FX_INT32 iOverlinePeriod) +{ + return m_pNode->SetEnum(XFA_ATTRIBUTE_OverlinePeriod, (XFA_ATTRIBUTEENUM)iOverlinePeriod); +} +FX_BOOL CXFA_Font::SetUnderline(FX_INT32 iUnderline) +{ + return m_pNode->SetInteger(XFA_ATTRIBUTE_Underline, iUnderline); +} +FX_BOOL CXFA_Font::SetUnderlinePeriod(FX_INT32 iUnderlinePeriod) +{ + return m_pNode->SetEnum(XFA_ATTRIBUTE_UnderlinePeriod, (XFA_ATTRIBUTEENUM)iUnderlinePeriod); +} +CXFA_Caption::CXFA_Caption(CXFA_Node* pNode) + : CXFA_Data(pNode) +{ +} +FX_INT32 CXFA_Caption::GetPresence() +{ + XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Visible; + m_pNode->TryEnum(XFA_ATTRIBUTE_Presence, eAttr); + return eAttr; +} +FX_INT32 CXFA_Caption::GetPlacementType() +{ + XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Left; + m_pNode->TryEnum(XFA_ATTRIBUTE_Placement, eAttr); + return eAttr; +} +FX_FLOAT CXFA_Caption::GetReserve() +{ + CXFA_Measurement ms; + m_pNode->TryMeasure(XFA_ATTRIBUTE_Reserve, ms); + return ms.ToUnit(XFA_UNIT_Pt); +} +CXFA_Margin CXFA_Caption::GetMargin() +{ + return CXFA_Margin(m_pNode ? m_pNode->GetChild(0, XFA_ELEMENT_Margin) : NULL); +} +CXFA_Font CXFA_Caption::GetFont() +{ + return CXFA_Font(m_pNode ? m_pNode->GetChild(0, XFA_ELEMENT_Font) : NULL); +} +CXFA_Value CXFA_Caption::GetValue() +{ + return CXFA_Value(m_pNode ? m_pNode->GetChild(0, XFA_ELEMENT_Value) : NULL); +} +CXFA_Para CXFA_Caption::GetPara() +{ + return CXFA_Para(m_pNode ? m_pNode->GetChild(0, XFA_ELEMENT_Para) : NULL); +} +FX_BOOL CXFA_Caption::SetPresence(FX_INT32 iPresence) +{ + return m_pNode->SetEnum(XFA_ATTRIBUTE_Presence, (XFA_ATTRIBUTEENUM)iPresence); +} +FX_BOOL CXFA_Caption::SetPlacementType(FX_INT32 iType) +{ + return m_pNode->SetEnum(XFA_ATTRIBUTE_Placement, (XFA_ATTRIBUTEENUM)iType); +} +FX_BOOL CXFA_Caption::SetReserve(FX_FLOAT fReserve) +{ + CXFA_Measurement ms(fReserve, XFA_UNIT_Pt); + return m_pNode->SetMeasure(XFA_ATTRIBUTE_Reserve, ms); +} +CXFA_Para::CXFA_Para(CXFA_Node* pNode) + : CXFA_Data(pNode) +{ +} +FX_INT32 CXFA_Para::GetHorizontalAlign() +{ + XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Left; + m_pNode->TryEnum(XFA_ATTRIBUTE_HAlign, eAttr); + return eAttr; +} +FX_INT32 CXFA_Para::GetVerticalAlign() +{ + XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Top; + m_pNode->TryEnum(XFA_ATTRIBUTE_VAlign, eAttr); + return eAttr; +} +FX_FLOAT CXFA_Para::GetLineHeight() +{ + CXFA_Measurement ms; + m_pNode->TryMeasure(XFA_ATTRIBUTE_LineHeight, ms); + return ms.ToUnit(XFA_UNIT_Pt); +} +FX_FLOAT CXFA_Para::GetMarginLeft() +{ + CXFA_Measurement ms; + m_pNode->TryMeasure(XFA_ATTRIBUTE_MarginLeft, ms); + return ms.ToUnit(XFA_UNIT_Pt); +} +FX_FLOAT CXFA_Para::GetMarginRight() +{ + CXFA_Measurement ms; + m_pNode->TryMeasure(XFA_ATTRIBUTE_MarginRight, ms); + return ms.ToUnit(XFA_UNIT_Pt); +} +FX_INT32 CXFA_Para::GetOrphans() +{ + FX_INT32 iValue = 0; + m_pNode->TryInteger(XFA_ATTRIBUTE_Orphans, iValue); + return iValue; +} +FX_FLOAT CXFA_Para::GetRadixOffset() +{ + CXFA_Measurement ms; + m_pNode->TryMeasure(XFA_ATTRIBUTE_RadixOffset, ms); + return ms.ToUnit(XFA_UNIT_Pt); +} +FX_FLOAT CXFA_Para::GetSpaceAbove() +{ + CXFA_Measurement ms; + m_pNode->TryMeasure(XFA_ATTRIBUTE_SpaceAbove, ms); + return ms.ToUnit(XFA_UNIT_Pt); +} +FX_FLOAT CXFA_Para::GetSpaceBelow() +{ + CXFA_Measurement ms; + m_pNode->TryMeasure(XFA_ATTRIBUTE_SpaceBelow, ms); + return ms.ToUnit(XFA_UNIT_Pt); +} +FX_FLOAT CXFA_Para::GetTextIndent() +{ + CXFA_Measurement ms; + m_pNode->TryMeasure(XFA_ATTRIBUTE_TextIndent, ms); + return ms.ToUnit(XFA_UNIT_Pt); +} +FX_INT32 CXFA_Para::GetWidows() +{ + FX_INT32 iValue = 0; + m_pNode->TryInteger(XFA_ATTRIBUTE_Widows, iValue); + return iValue; +} +FX_BOOL CXFA_Para::SetHorizontalAlign(FX_INT32 iHorizontalAlign) +{ + return m_pNode->SetEnum(XFA_ATTRIBUTE_HAlign, (XFA_ATTRIBUTEENUM)iHorizontalAlign); +} +FX_BOOL CXFA_Para::SetVerticalAlign(FX_INT32 iVerticalAlign) +{ + return m_pNode->SetEnum(XFA_ATTRIBUTE_VAlign, (XFA_ATTRIBUTEENUM)iVerticalAlign); +} +FX_BOOL CXFA_Para::SetLineHeight(FX_FLOAT fLineHeight) +{ + CXFA_Measurement ms; + return m_pNode->SetMeasure(XFA_ATTRIBUTE_LineHeight, ms); +} +FX_BOOL CXFA_Para::SetMarginLeft(FX_FLOAT fMarginLeft) +{ + CXFA_Measurement ms(fMarginLeft, XFA_UNIT_Pt); + return m_pNode->SetMeasure(XFA_ATTRIBUTE_MarginLeft, ms); +} +FX_BOOL CXFA_Para::SetMarginRight(FX_FLOAT fMarginRight) +{ + CXFA_Measurement ms(fMarginRight, XFA_UNIT_Pt); + return m_pNode->SetMeasure(XFA_ATTRIBUTE_MarginRight, ms); +} +FX_BOOL CXFA_Para::SetOrphans(FX_INT32 iOrphans) +{ + return m_pNode->SetInteger(XFA_ATTRIBUTE_Orphans, iOrphans); +} +FX_BOOL CXFA_Para::SetRadixOffset(FX_FLOAT fRadixOffset) +{ + CXFA_Measurement ms(fRadixOffset, XFA_UNIT_Pt); + return m_pNode->SetMeasure(XFA_ATTRIBUTE_RadixOffset, ms); +} +FX_BOOL CXFA_Para::SetSpaceAbove(FX_FLOAT fSpaceAbove) +{ + CXFA_Measurement ms(fSpaceAbove, XFA_UNIT_Pt); + return m_pNode->SetMeasure(XFA_ATTRIBUTE_SpaceAbove, ms); +} +FX_BOOL CXFA_Para::SetSpaceBelow(FX_FLOAT fSpaceBelow) +{ + CXFA_Measurement ms(fSpaceBelow, XFA_UNIT_Pt); + return m_pNode->SetMeasure(XFA_ATTRIBUTE_SpaceBelow, ms); +} +FX_BOOL CXFA_Para::SetTextIndent(FX_FLOAT fTextIndent) +{ + CXFA_Measurement ms(fTextIndent, XFA_UNIT_Pt); + return m_pNode->SetMeasure(XFA_ATTRIBUTE_TextIndent, ms); +} +FX_BOOL CXFA_Para::SetWidows(FX_INT32 iWidows) +{ + return m_pNode->SetInteger(XFA_ATTRIBUTE_Widows, iWidows); +} +CXFA_Keep::CXFA_Keep(CXFA_Node *pNode, CXFA_Node *pParent) + : CXFA_Data(pNode) + , m_pParent(pParent) +{ +} +FX_INT32 CXFA_Keep::GetIntact() +{ + XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_None; + switch (m_pParent->GetClassID()) { + case XFA_ELEMENT_Subform: { + XFA_ATTRIBUTEENUM eAttrSubForm; + m_pParent->TryEnum(XFA_ATTRIBUTE_Layout, eAttrSubForm); + if (eAttrSubForm == XFA_ATTRIBUTEENUM_Position || eAttrSubForm == XFA_ATTRIBUTEENUM_Row) { + eAttr = XFA_ATTRIBUTEENUM_ContentArea; + } + } + break; + case XFA_ELEMENT_Draw: + eAttr = XFA_ATTRIBUTEENUM_ContentArea; + break; + default: + break; + } + m_pNode->TryEnum(XFA_ATTRIBUTE_Intact, eAttr, FALSE); + return eAttr; +} +FX_INT32 CXFA_Keep::GetNext() +{ + XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_None; + m_pNode->TryEnum(XFA_ATTRIBUTE_Next, eAttr); + return eAttr; +} +FX_INT32 CXFA_Keep::GetPrevious() +{ + XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_None; + m_pNode->TryEnum(XFA_ATTRIBUTE_Previous, eAttr); + return eAttr; +} +FX_BOOL CXFA_Keep::SetIntact(FX_INT32 iIntact) +{ + return m_pNode->SetEnum(XFA_ATTRIBUTE_Intact, (XFA_ATTRIBUTEENUM)iIntact); +} +FX_BOOL CXFA_Keep::SetNext(FX_INT32 iNext) +{ + return m_pNode->SetEnum(XFA_ATTRIBUTE_Next, (XFA_ATTRIBUTEENUM)iNext); +} +FX_BOOL CXFA_Keep::SetPrevious(FX_INT32 iPrevious) +{ + return m_pNode->SetEnum(XFA_ATTRIBUTE_Previous, (XFA_ATTRIBUTEENUM)iPrevious); +} +CXFA_Event::CXFA_Event(CXFA_Node* pNode) + : CXFA_Data(pNode) +{ +} +FX_INT32 CXFA_Event::GetActivity() +{ + return m_pNode->GetEnum(XFA_ATTRIBUTE_Activity); +} +FX_INT32 CXFA_Event::GetEventType() +{ + CXFA_Node* pChild = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild); + while (pChild) { + FX_INT32 eType = pChild->GetClassID(); + if (eType != XFA_ELEMENT_Extras) { + return eType; + } + pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling); + } + return XFA_ELEMENT_UNKNOWN; +} +void CXFA_Event::GetRef(CFX_WideStringC &wsRef) +{ + m_pNode->TryCData(XFA_ATTRIBUTE_Ref, wsRef); +} +FX_INT32 CXFA_Event::GetExecuteRunAt() +{ + CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Execute); + return pNode->GetEnum(XFA_ATTRIBUTE_RunAt); +} +FX_INT32 CXFA_Event::GetExecuteType() +{ + CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Execute); + return pNode->GetEnum(XFA_ATTRIBUTE_ExecuteType); +} +void CXFA_Event::GetExecuteConnection(CFX_WideString &wsConnection) +{ + CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Execute); + CFX_WideStringC cData; + pNode->TryCData(XFA_ATTRIBUTE_Connection, cData); + wsConnection = cData; +} +CXFA_Script CXFA_Event::GetScript() +{ + return m_pNode->GetChild(0, XFA_ELEMENT_Script); +} +CXFA_Submit CXFA_Event::GetSubmit() +{ + return m_pNode->GetChild(0, XFA_ELEMENT_Submit); +} +FX_INT32 CXFA_Event::GetSignDataOperation() +{ + CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_SignData); + return pNode->GetEnum(XFA_ATTRIBUTE_Operation); +} +void CXFA_Event::GetSignDataTarget(CFX_WideString &wsTarget) +{ + if (CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_SignData)) { + CFX_WideStringC wsCData; + pNode->TryCData(XFA_ATTRIBUTE_Target, wsCData); + wsTarget = wsCData; + } +} +FX_BOOL CXFA_Event::SetActivity(FX_INT32 iActivity) +{ + return m_pNode->SetEnum(XFA_ATTRIBUTE_Activity, (XFA_ATTRIBUTEENUM)iActivity); +} +FX_BOOL CXFA_Event::SetEventType(FX_INT32 iEventType) +{ + return FALSE; +} +FX_BOOL CXFA_Event::SetExecuteRunAt(FX_INT32 iExecuteRunAt) +{ + CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Execute); + return pNode->SetEnum(XFA_ATTRIBUTE_RunAt, (XFA_ATTRIBUTEENUM)iExecuteRunAt); +} +FX_BOOL CXFA_Event::SetExecuteType(FX_INT32 iExecuteType) +{ + CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Execute); + return pNode->SetEnum(XFA_ATTRIBUTE_ExecuteType, (XFA_ATTRIBUTEENUM)iExecuteType); +} +FX_BOOL CXFA_Event::SetExecuteConnection(const CFX_WideString& wsConnection) +{ + CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Execute); + return pNode->SetCData(XFA_ATTRIBUTE_Connection, wsConnection); +} +FX_BOOL CXFA_Event::SetSignDataOperation(FX_INT32 iOperation) +{ + CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_SignData); + return pNode->SetEnum(XFA_ATTRIBUTE_Operation, (XFA_ATTRIBUTEENUM)iOperation); +} +FX_BOOL CXFA_Event::SetSignDataTarget(const CFX_WideString& wsTarget) +{ + if (CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_SignData)) { + return pNode->SetCData(XFA_ATTRIBUTE_Target, wsTarget); + } + return FALSE; +} +CXFA_Script::CXFA_Script(CXFA_Node* pNode) + : CXFA_Data(pNode) +{ +} +void CXFA_Script::GetBinding(CFX_WideString &wsBinding) +{ + CFX_WideStringC cData; + m_pNode->TryCData(XFA_ATTRIBUTE_Binding, cData); + wsBinding = cData; +} +XFA_SCRIPTTYPE CXFA_Script::GetContentType() +{ + CFX_WideStringC cData; + if (m_pNode->TryCData(XFA_ATTRIBUTE_ContentType, cData, FALSE)) { + if (cData == FX_WSTRC(L"application/x-javascript")) { + return XFA_SCRIPTTYPE_Javascript; + } else if (cData == FX_WSTRC(L"application/x-formcalc")) { + return XFA_SCRIPTTYPE_Formcalc; + } else { + return XFA_SCRIPTTYPE_Unkown; + } + } + return XFA_SCRIPTTYPE_Formcalc; +} +FX_INT32 CXFA_Script::GetRunAt() +{ + return m_pNode->GetEnum(XFA_ATTRIBUTE_RunAt); +} +void CXFA_Script::GetExpression(CFX_WideString &wsExpression) +{ + m_pNode->TryContent(wsExpression); +} +FX_BOOL CXFA_Script::SetBinding(const CFX_WideString& wsBinding) +{ + return m_pNode->SetCData(XFA_ATTRIBUTE_Binding, wsBinding); +} +FX_BOOL CXFA_Script::SetContentType(XFA_SCRIPTTYPE eType) +{ + CFX_WideString wsType; + switch (eType) { + case XFA_SCRIPTTYPE_Javascript: + wsType = L"application/x-javascript"; + break; + case XFA_SCRIPTTYPE_Formcalc: + wsType = L"application/x-formcalc"; + break; + default: + break; + } + return m_pNode->SetCData(XFA_ATTRIBUTE_ContentType, wsType); +} +FX_BOOL CXFA_Script::SetRunAt(FX_INT32 iRunAt) +{ + return m_pNode->SetEnum(XFA_ATTRIBUTE_RunAt, (XFA_ATTRIBUTEENUM)iRunAt); +} +FX_BOOL CXFA_Script::SetExpression(const CFX_WideString& wsExpression) +{ + return m_pNode->SetContent(wsExpression, wsExpression); +} +CXFA_Submit::CXFA_Submit(CXFA_Node* pNode) + : CXFA_Data (pNode) +{ +} +FX_BOOL CXFA_Submit::IsSubmitEmbedPDF() +{ + return m_pNode->GetBoolean(XFA_ATTRIBUTE_EmbedPDF); +} +FX_INT32 CXFA_Submit::GetSubmitFormat() +{ + return m_pNode->GetEnum(XFA_ATTRIBUTE_Format); +} +void CXFA_Submit::GetSubmitTarget(CFX_WideStringC &wsTarget) +{ + m_pNode->TryCData(XFA_ATTRIBUTE_Target, wsTarget); +} +XFA_TEXTENCODING CXFA_Submit::GetSubmitTextEncoding() +{ + CFX_WideStringC wsCData; + if (!m_pNode->TryCData(XFA_ATTRIBUTE_TextEncoding, wsCData)) { + return XFA_TEXTENCODING_None; + } + CFX_WideString wsValue(wsCData); + if (wsValue == L"Big-Five") { + return XFA_TEXTENCODING_Big5; + } else if (wsValue == L"fontSpecific") { + return XFA_TEXTENCODING_FontSpecific; + } else if (wsValue == L"GBK") { + return XFA_TEXTENCODING_GBK; + } else if (wsValue == L"GB-18030") { + return XFA_TEXTENCODING_GB18030; + } else if (wsValue == L"GB-2312") { + return XFA_TEXTENCODING_GB2312; + } else if (wsValue == L"ISO-8859-NN") { + return XFA_TEXTENCODING_ISO8859NN; + } else if (wsValue == L"KSC-5601") { + return XFA_TEXTENCODING_KSC5601; + } else if (wsValue == L"Shift-JIS") { + return XFA_TEXTENCODING_ShiftJIS; + } else if (wsValue == L"UCS-2") { + return XFA_TEXTENCODING_UCS2; + } else if (wsValue == L"UTF-16") { + return XFA_TEXTENCODING_UTF16; + } else if (wsValue == L"UTF-8") { + return XFA_TEXTENCODING_UTF8; + } + return XFA_TEXTENCODING_None; +} +void CXFA_Submit::GetSubmitXDPContent(CFX_WideStringC &wsContent) +{ + m_pNode->TryCData(XFA_ATTRIBUTE_XdpContent, wsContent); +} +FX_BOOL CXFA_Submit::SetSubmitFormat(FX_INT32 iSubmitFormat) +{ + return m_pNode->SetEnum(XFA_ATTRIBUTE_Format, (XFA_ATTRIBUTEENUM)iSubmitFormat); +} +FX_BOOL CXFA_Submit::SetSubmitTarget(const CFX_WideString& wsTarget) +{ + return m_pNode->SetCData(XFA_ATTRIBUTE_Target, wsTarget); +} +FX_BOOL CXFA_Submit::SetSubmitTextEncoding(XFA_TEXTENCODING eTextEncoding) +{ + CFX_WideString wsValue; + switch (eTextEncoding) { + case XFA_TEXTENCODING_Big5: + wsValue = L"Big-Five"; + break; + case XFA_TEXTENCODING_FontSpecific: + wsValue = L"fontSpecific"; + break; + case XFA_TEXTENCODING_GBK: + wsValue = L"GBK"; + break; + case XFA_TEXTENCODING_GB18030: + wsValue = L"GB-18030"; + break; + case XFA_TEXTENCODING_GB2312: + wsValue = L"GB-2312"; + break; + case XFA_TEXTENCODING_ISO8859NN: + wsValue = L"ISO-8859-NN"; + break; + case XFA_TEXTENCODING_KSC5601: + wsValue = L"KSC-5601"; + break; + case XFA_TEXTENCODING_ShiftJIS: + wsValue = L"Shift-JIS"; + break; + case XFA_TEXTENCODING_UCS2: + wsValue = L"UCS-2"; + break; + case XFA_TEXTENCODING_UTF16: + wsValue = L"UTF-16"; + break; + case XFA_TEXTENCODING_UTF8: + wsValue = L"UTF-8"; + break; + default: + break; + } + return m_pNode->SetCData(XFA_ATTRIBUTE_TextEncoding, wsValue); +} +FX_BOOL CXFA_Submit::SetSubmitXDPContent(const CFX_WideString& wsContent) +{ + return m_pNode->SetCData(XFA_ATTRIBUTE_XdpContent, wsContent); +} +XFA_ELEMENT CXFA_Value::GetChildValueClassID() +{ + if (!m_pNode) { + return XFA_ELEMENT_UNKNOWN; + } + if (CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) { + return pNode->GetClassID(); + } + return XFA_ELEMENT_UNKNOWN; +} +FX_BOOL CXFA_Value::GetChildValueContent(CFX_WideString &wsContent) +{ + if (!m_pNode) { + return FALSE; + } + if (CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) { + return pNode->TryContent(wsContent); + } + return FALSE; +} +CXFA_Arc CXFA_Value::GetArc() +{ + return m_pNode ? CXFA_Arc(m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) : NULL; +} +CXFA_Line CXFA_Value::GetLine() +{ + return m_pNode ? CXFA_Line(m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) : NULL; +} +CXFA_Rectangle CXFA_Value::GetRectangle() +{ + return m_pNode ? CXFA_Rectangle(m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) : NULL; +} +CXFA_Text CXFA_Value::GetText() +{ + return m_pNode ? CXFA_Text(m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) : NULL; +} +CXFA_ExData CXFA_Value::GetExData() +{ + return m_pNode ? CXFA_ExData(m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) : NULL; +} +CXFA_Image CXFA_Value::GetImage() +{ + return CXFA_Image(m_pNode ? (m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) : NULL, TRUE); +} +FX_BOOL CXFA_Value::SetChildValueContent(const CFX_WideString& wsContent, FX_BOOL bNotify , XFA_ELEMENT iType ) +{ + if (!m_pNode) { + return FALSE; + } + CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild); + if (!pNode) { + if (iType == XFA_ELEMENT_UNKNOWN) { + return FALSE; + } + pNode = m_pNode->GetProperty(0, iType); + } + CFX_WideString wsFormatContent(wsContent); + CXFA_WidgetData* pContainerWidgetData = pNode->GetContainerWidgetData(); + if (pContainerWidgetData) { + pContainerWidgetData->GetFormatDataValue(wsContent, wsFormatContent); + } + return pNode->SetContent(wsContent, wsFormatContent, bNotify); +} +FX_INT32 CXFA_Line::GetHand() +{ + return m_pNode->GetEnum(XFA_ATTRIBUTE_Hand); +} +FX_BOOL CXFA_Line::GetSlop() +{ + XFA_ATTRIBUTEENUM eSlop = m_pNode->GetEnum(XFA_ATTRIBUTE_Slope); + return (eSlop == XFA_ATTRIBUTEENUM_Slash) ? TRUE : FALSE; +} +CXFA_Edge CXFA_Line::GetEdge() +{ + return CXFA_Edge(m_pNode->GetChild(0, XFA_ELEMENT_Edge)); +} +FX_BOOL CXFA_Line::SetHand(FX_INT32 iHand) +{ + return m_pNode->SetEnum(XFA_ATTRIBUTE_Hand, (XFA_ATTRIBUTEENUM)iHand); +} +FX_BOOL CXFA_Line::SetSlop(FX_INT32 iSlop) +{ + return m_pNode->SetEnum(XFA_ATTRIBUTE_Slope, (XFA_ATTRIBUTEENUM)iSlop); +} +CXFA_Text::CXFA_Text(CXFA_Node* pNode) + : CXFA_Data(pNode) +{ +} +void CXFA_Text::GetName(CFX_WideStringC &wsName) +{ + m_pNode->TryCData(XFA_ATTRIBUTE_Name, wsName); +} +FX_INT32 CXFA_Text::GetMaxChars() +{ + return m_pNode->GetInteger(XFA_ATTRIBUTE_MaxChars); +} +void CXFA_Text::GetRid(CFX_WideStringC &wsRid) +{ + m_pNode->TryCData(XFA_ATTRIBUTE_Rid, wsRid); +} +void CXFA_Text::GetContent(CFX_WideString &wsText) +{ + m_pNode->TryContent(wsText); +} +void CXFA_Text::SetContent(CFX_WideString wsText, FX_BOOL bNotify ) +{ + CFX_WideString wsFormatValue(wsText); + CXFA_WidgetData* pContainerWidgetData = m_pNode->GetContainerWidgetData(); + if (pContainerWidgetData) { + pContainerWidgetData->GetFormatDataValue(wsText, wsFormatValue); + } + m_pNode->SetContent(wsText, wsFormatValue, bNotify); +} +FX_BOOL CXFA_Text::SetName(const CFX_WideString& wsName) +{ + return m_pNode->SetCData(XFA_ATTRIBUTE_Name, wsName); +} +FX_BOOL CXFA_Text::SetMaxChars(FX_INT32 iMaxChars) +{ + return m_pNode->SetInteger(XFA_ATTRIBUTE_MaxChars, iMaxChars); +} +FX_BOOL CXFA_Text::SetRid(const CFX_WideString& wsRid) +{ + return m_pNode->SetCData(XFA_ATTRIBUTE_Rid, wsRid); +} +CXFA_ExData::CXFA_ExData(CXFA_Node* pNode) + : CXFA_Data(pNode) +{ +} +void CXFA_ExData::GetContentType(CFX_WideStringC &wsContentType) +{ + m_pNode->TryCData(XFA_ATTRIBUTE_ContentType, wsContentType); +} +void CXFA_ExData::GetHref(CFX_WideStringC &wsHref) +{ + m_pNode->TryCData(XFA_ATTRIBUTE_Href, wsHref); +} +FX_INT32 CXFA_ExData::GetMaxLength() +{ + return m_pNode->GetInteger(XFA_ATTRIBUTE_MaxLength); +} +void CXFA_ExData::GetRid(CFX_WideStringC &wsRid) +{ + m_pNode->TryCData(XFA_ATTRIBUTE_Rid, wsRid); +} +FX_INT32 CXFA_ExData::GetTransferEncoding() +{ + return m_pNode->GetEnum(XFA_ATTRIBUTE_TransferEncoding); +} +void CXFA_ExData::GetContent(CFX_WideString &wsText) +{ + m_pNode->TryContent(wsText); +} +FX_BOOL CXFA_ExData::SetContentType(const CFX_WideString& wsContentType) +{ + return m_pNode->SetCData(XFA_ATTRIBUTE_ContentType, wsContentType); +} +FX_BOOL CXFA_ExData::SetHref(const CFX_WideString& wsHref) +{ + return m_pNode->SetCData(XFA_ATTRIBUTE_Href, wsHref); +} +FX_BOOL CXFA_ExData::SetMaxLength(FX_INT32 iMaxLength) +{ + return m_pNode->SetInteger(XFA_ATTRIBUTE_MaxLength, iMaxLength); +} +FX_BOOL CXFA_ExData::SetRid(const CFX_WideString& wsRid) +{ + return m_pNode->SetCData(XFA_ATTRIBUTE_Rid, wsRid); +} +FX_BOOL CXFA_ExData::SetTransferEncoding(FX_INT32 iTransferEncoding) +{ + return m_pNode->SetEnum(XFA_ATTRIBUTE_TransferEncoding, (XFA_ATTRIBUTEENUM)iTransferEncoding); +} +FX_BOOL CXFA_ExData::SetContent(const CFX_WideString& wsText, FX_BOOL bNotify , FX_BOOL bScriptModify, FX_BOOL bSyncData ) +{ + CFX_WideString wsFormatValue(wsText); + CXFA_WidgetData* pContainerWidgetData = m_pNode->GetContainerWidgetData(); + if (pContainerWidgetData) { + pContainerWidgetData->GetFormatDataValue(wsText, wsFormatValue); + } + return m_pNode->SetContent(wsText, wsFormatValue, bNotify, bScriptModify, bSyncData); +} +CXFA_Image::CXFA_Image(CXFA_Node* pNode, FX_BOOL bDefValue) + : CXFA_Data(pNode) + , m_bDefValue(bDefValue) +{ +} +FX_INT32 CXFA_Image::GetAspect() +{ + return m_pNode->GetEnum(XFA_ATTRIBUTE_Aspect); +} +FX_BOOL CXFA_Image::GetContentType(CFX_WideString &wsContentType) +{ + return m_pNode->TryCData(XFA_ATTRIBUTE_ContentType, wsContentType); +} +FX_BOOL CXFA_Image::GetHref(CFX_WideString &wsHref) +{ + if (m_bDefValue) { + return m_pNode->TryCData(XFA_ATTRIBUTE_Href, wsHref); + } + return m_pNode->GetAttribute(FX_WSTRC(L"href"), wsHref); +} +FX_INT32 CXFA_Image::GetTransferEncoding() +{ + if (m_bDefValue) { + return m_pNode->GetEnum(XFA_ATTRIBUTE_TransferEncoding); + } + return XFA_ATTRIBUTEENUM_Base64; +} +FX_BOOL CXFA_Image::GetContent(CFX_WideString &wsText) +{ + return m_pNode->TryContent(wsText); +} +FX_BOOL CXFA_Image::SetAspect(FX_INT32 iAspect) +{ + return m_pNode->SetEnum(XFA_ATTRIBUTE_Aspect, (XFA_ATTRIBUTEENUM)iAspect); +} +FX_BOOL CXFA_Image::SetContentType(const CFX_WideString& wsContentType) +{ + return m_pNode->SetCData(XFA_ATTRIBUTE_ContentType, wsContentType); +} +FX_BOOL CXFA_Image::SetHref(const CFX_WideString& wsHref) +{ + if (m_bDefValue) { + return m_pNode->SetCData(XFA_ATTRIBUTE_Href, wsHref); + } + return m_pNode->SetAttribute(XFA_ATTRIBUTE_Href, wsHref); +} +FX_BOOL CXFA_Image::SetTransferEncoding(FX_INT32 iTransferEncoding) +{ + if (m_bDefValue) { + return m_pNode->SetEnum(XFA_ATTRIBUTE_TransferEncoding, (XFA_ATTRIBUTEENUM)iTransferEncoding); + } + return TRUE; +} +FX_BOOL CXFA_Image::SetContent(const CFX_WideString& wsText) +{ + CFX_WideString wsFormatValue(wsText); + CXFA_WidgetData* pContainerWidgetData = m_pNode->GetContainerWidgetData(); + if (pContainerWidgetData) { + pContainerWidgetData->GetFormatDataValue(wsText, wsFormatValue); + } + return m_pNode->SetContent(wsText, wsFormatValue); +} +CXFA_Calculate::CXFA_Calculate(CXFA_Node* pNode) + : CXFA_Data(pNode) +{ +} +FX_INT32 CXFA_Calculate::GetOverride() +{ + XFA_ATTRIBUTEENUM eAtt = XFA_ATTRIBUTEENUM_Error; + m_pNode->TryEnum(XFA_ATTRIBUTE_Override, eAtt, FALSE); + return eAtt; +} +CXFA_Script CXFA_Calculate::GetScript() +{ + return m_pNode->GetChild(0, XFA_ELEMENT_Script); +} +void CXFA_Calculate::GetMessageText(CFX_WideString &wsMessage) +{ + if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Message)) { + CXFA_Text text(pNode->GetChild(0, XFA_ELEMENT_Text)); + if (text) { + text.GetContent(wsMessage); + } + } +} +FX_BOOL CXFA_Calculate::SetOverride(FX_INT32 iOverride) +{ + return m_pNode->SetEnum(XFA_ATTRIBUTE_Override, (XFA_ATTRIBUTEENUM)iOverride); +} +FX_BOOL CXFA_Calculate::SetMessageText(const CFX_WideString& wsMessage) +{ + if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Message)) { + CXFA_Node* pChildNode = pNode->GetProperty(0, XFA_ELEMENT_Text); + return pChildNode->SetContent(wsMessage, wsMessage); + } + return FALSE; +} +CXFA_Validate::CXFA_Validate(CXFA_Node* pNode) + : CXFA_Data(pNode) +{ +} +FX_INT32 CXFA_Validate::GetFormatTest() +{ + return m_pNode->GetEnum(XFA_ATTRIBUTE_FormatTest); +} +FX_BOOL CXFA_Validate::SetTestValue(FX_INT32 iType, CFX_WideString &wsValue, XFA_ATTRIBUTEENUM eName) +{ + XFA_LPCATTRIBUTEENUMINFO pInfo = XFA_GetAttributeEnumByName(wsValue); + if (pInfo) { + eName = pInfo->eName; + } + m_pNode->SetEnum((XFA_ATTRIBUTE)iType, eName, FALSE); + return TRUE; +} +FX_BOOL CXFA_Validate::SetFormatTest(CFX_WideString wsValue) +{ + return SetTestValue(XFA_ATTRIBUTE_FormatTest, wsValue, XFA_ATTRIBUTEENUM_Warning); +} +FX_BOOL CXFA_Validate::SetNullTest(CFX_WideString wsValue) +{ + return SetTestValue(XFA_ATTRIBUTE_NullTest, wsValue, XFA_ATTRIBUTEENUM_Disabled); +} +FX_INT32 CXFA_Validate::GetNullTest() +{ + return m_pNode->GetEnum(XFA_ATTRIBUTE_NullTest); +} +FX_INT32 CXFA_Validate::GetScriptTest() +{ + return m_pNode->GetEnum(XFA_ATTRIBUTE_ScriptTest); +} +void CXFA_Validate::GetMessageText(CFX_WideString &wsMessage, FX_WSTR wsMessageType) +{ + if (CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Message, FALSE)) { + CXFA_Node *pItemNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild); + for (; pItemNode; pItemNode = pItemNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if (pItemNode->GetClassID() != XFA_ELEMENT_Text) { + continue; + } + CFX_WideStringC wsName; + pItemNode->TryCData(XFA_ATTRIBUTE_Name, wsName); + if (wsName.IsEmpty() || wsName == wsMessageType) { + pItemNode->TryContent(wsMessage); + return; + } + } + } +} +void CXFA_Validate::SetFormatMessageText(CFX_WideString wsMessage) +{ + SetMessageText(wsMessage, FX_WSTRC(L"formatTest")); +} +void CXFA_Validate::GetFormatMessageText(CFX_WideString &wsMessage) +{ + GetMessageText(wsMessage, FX_WSTRC(L"formatTest")); +} +void CXFA_Validate::SetNullMessageText(CFX_WideString wsMessage) +{ + SetMessageText(wsMessage, FX_WSTRC(L"nullTest")); +} +void CXFA_Validate::GetNullMessageText(CFX_WideString &wsMessage) +{ + GetMessageText(wsMessage, FX_WSTRC(L"nullTest")); +} +void CXFA_Validate::SetMessageText(CFX_WideString &wsMessage, FX_WSTR wsMessageType) +{ + if (CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Message, TRUE)) { + CXFA_Node *pItemNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild); + for (; pItemNode; pItemNode = pItemNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if (pItemNode->GetClassID() != XFA_ELEMENT_Text) { + continue; + } + CFX_WideStringC wsName; + pItemNode->TryCData(XFA_ATTRIBUTE_Name, wsName); + if (wsName.IsEmpty() || wsName == wsMessageType) { + pItemNode->SetContent(wsMessage, wsMessage, FALSE); + return; + } + } + CXFA_Node* pTextNode = pNode->CreateSamePacketNode(XFA_ELEMENT_Text); + pNode->InsertChild(pTextNode); + pTextNode->SetCData(XFA_ATTRIBUTE_Name, wsMessageType, FALSE); + pTextNode->SetContent(wsMessage, wsMessage, FALSE); + } +} +void CXFA_Validate::GetScriptMessageText(CFX_WideString &wsMessage) +{ + GetMessageText(wsMessage, FX_WSTRC(L"scriptTest")); +} +void CXFA_Validate::SetScriptMessageText(CFX_WideString wsMessage) +{ + SetMessageText(wsMessage, FX_WSTRC(L"scriptTest")); +} +void CXFA_Validate::GetPicture(CFX_WideString &wsPicture) +{ + if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Picture)) { + pNode->TryContent(wsPicture); + } +} +CXFA_Script CXFA_Validate::GetScript() +{ + return m_pNode->GetChild(0, XFA_ELEMENT_Script); +} +CXFA_Variables::CXFA_Variables(CXFA_Node* pNode) + : CXFA_Data(pNode) +{ +} +FX_INT32 CXFA_Variables::CountScripts() +{ + return m_pNode->CountChildren(XFA_ELEMENT_Script); +} +CXFA_Script CXFA_Variables::GetScript(FX_INT32 nIndex) +{ + return m_pNode->GetChild(nIndex, XFA_ELEMENT_Script); +} +CXFA_Bind::CXFA_Bind(CXFA_Node* pNode) + : CXFA_Data(pNode) +{ +} +FX_INT32 CXFA_Bind::GetMatch() +{ + return m_pNode->GetEnum(XFA_ATTRIBUTE_Match); +} +void CXFA_Bind::GetRef(CFX_WideStringC &wsRef) +{ + m_pNode->TryCData(XFA_ATTRIBUTE_Ref, wsRef); +} +void CXFA_Bind::GetPicture(CFX_WideString &wsPicture) +{ + if (CXFA_Node* pPicture = m_pNode->GetChild(0, XFA_ELEMENT_Picture)) { + pPicture->TryContent(wsPicture); + } +} +FX_BOOL CXFA_Bind::SetMatch(FX_INT32 iMatch) +{ + return m_pNode->SetEnum(XFA_ATTRIBUTE_Match, (XFA_ATTRIBUTEENUM)iMatch); +} +FX_BOOL CXFA_Bind::SetRef(const CFX_WideString& wsRef) +{ + return m_pNode->SetCData(XFA_ATTRIBUTE_Ref, wsRef); +} +FX_BOOL CXFA_Bind::SetPicture(const CFX_WideString& wsPicture) +{ + if (CXFA_Node* pPicture = m_pNode->GetChild(0, XFA_ELEMENT_Picture)) { + return pPicture->SetContent(wsPicture, wsPicture); + } + return FALSE; +} +CXFA_Assist::CXFA_Assist(CXFA_Node* pNode) + : CXFA_Data(pNode) +{ +} +CXFA_ToolTip CXFA_Assist::GetToolTip() +{ + return m_pNode->GetChild(0, XFA_ELEMENT_ToolTip); +} +CXFA_ToolTip::CXFA_ToolTip(CXFA_Node* pNode) + : CXFA_Data(pNode) +{ +} +FX_BOOL CXFA_ToolTip::GetTip(CFX_WideString &wsTip) +{ + return m_pNode->TryContent(wsTip); +} +FX_BOOL CXFA_ToolTip::SetTip(const CFX_WideString& wsTip) +{ + return m_pNode->SetContent(wsTip, wsTip); +} +CXFA_BindItems::CXFA_BindItems(CXFA_Node* pNode) + : CXFA_Data(pNode) +{ +} +void CXFA_BindItems::GetConnection(CFX_WideStringC &wsConnection) +{ + m_pNode->TryCData(XFA_ATTRIBUTE_Connection, wsConnection); +} +void CXFA_BindItems::GetLabelRef(CFX_WideStringC &wsLabelRef) +{ + m_pNode->TryCData(XFA_ATTRIBUTE_LabelRef, wsLabelRef); +} +void CXFA_BindItems::GetValueRef(CFX_WideStringC &wsValueRef) +{ + m_pNode->TryCData(XFA_ATTRIBUTE_ValueRef, wsValueRef); +} +void CXFA_BindItems::GetRef(CFX_WideStringC &wsRef) +{ + m_pNode->TryCData(XFA_ATTRIBUTE_Ref, wsRef); +} +FX_BOOL CXFA_BindItems::SetConnection(const CFX_WideString& wsConnection) +{ + return m_pNode->SetCData(XFA_ATTRIBUTE_Connection, wsConnection); +} +FX_BOOL CXFA_BindItems::SetLabelRef(const CFX_WideString& wsLabelRef) +{ + return m_pNode->SetCData(XFA_ATTRIBUTE_LabelRef, wsLabelRef); +} +FX_BOOL CXFA_BindItems::SetValueRef(const CFX_WideString& wsValueRef) +{ + return m_pNode->SetCData(XFA_ATTRIBUTE_ValueRef, wsValueRef); +} +FX_BOOL CXFA_BindItems::SetRef(const CFX_WideString& wsRef) +{ + return m_pNode->SetCData(XFA_ATTRIBUTE_Ref, wsRef); +} +FX_INT32 CXFA_Box::GetBreak() const +{ + if (!m_pNode) { + return XFA_ATTRIBUTEENUM_Close; + } + return m_pNode->GetEnum(XFA_ATTRIBUTE_Break); +} +FX_INT32 CXFA_Box::GetHand() const +{ + if (!m_pNode) { + return XFA_ATTRIBUTEENUM_Even; + } + return m_pNode->GetEnum(XFA_ATTRIBUTE_Hand); +} +FX_INT32 CXFA_Box::GetPresence() const +{ + if (!m_pNode) { + return XFA_ATTRIBUTEENUM_Hidden; + } + return m_pNode->GetEnum(XFA_ATTRIBUTE_Presence); +} +FX_INT32 CXFA_Box::CountCorners() const +{ + if (!m_pNode) { + return 0; + } + return m_pNode->CountChildren(XFA_ELEMENT_Corner); +} +CXFA_Corner CXFA_Box::GetCorner(FX_INT32 nIndex) const +{ + if (!m_pNode) { + return NULL; + } + return CXFA_Corner(m_pNode->GetProperty(nIndex, XFA_ELEMENT_Corner, nIndex == 0)); +} +FX_INT32 CXFA_Box::CountEdges() const +{ + if (!m_pNode) { + return 0; + } + return m_pNode->CountChildren(XFA_ELEMENT_Edge); +} +CXFA_Edge CXFA_Box::GetEdge(FX_INT32 nIndex) const +{ + if (!m_pNode) { + return NULL; + } + return CXFA_Edge(m_pNode->GetProperty(nIndex, XFA_ELEMENT_Edge, nIndex == 0)); +} +static void XFA_BOX_GetStrokes(CXFA_Node *pNode, CXFA_StrokeArray &strokes, FX_BOOL bNULL) +{ + strokes.RemoveAll(); + if (!pNode) { + return; + } + strokes.SetSize(8); + FX_INT32 i, j; + for (i = 0, j = 0; i < 4; i ++) { + CXFA_Corner corner = CXFA_Corner(pNode->GetProperty(i, XFA_ELEMENT_Corner, i == 0)); + if (corner.IsExistInXML() || i == 0) { + strokes.SetAt(j, corner); + } else if (bNULL) { + strokes.SetAt(j, NULL); + } else if (i == 1) { + strokes.SetAt(j, strokes[0]); + } else if (i == 2) { + strokes.SetAt(j, strokes[0]); + } else { + strokes.SetAt(j, strokes[2]); + } + j ++; + CXFA_Edge edge = CXFA_Edge(pNode->GetProperty(i, XFA_ELEMENT_Edge, i == 0)); + if (edge.IsExistInXML() || i == 0) { + strokes.SetAt(j, edge); + } else if (bNULL) { + strokes.SetAt(j, NULL); + } else if (i == 1) { + strokes.SetAt(j, strokes[1]); + } else if (i == 2) { + strokes.SetAt(j, strokes[1]); + } else { + strokes.SetAt(j, strokes[3]); + } + j ++; + } +} +void CXFA_Box::GetStrokes(CXFA_StrokeArray &strokes) const +{ + XFA_BOX_GetStrokes(m_pNode, strokes, FALSE); +} +FX_BOOL CXFA_Box::IsCircular() const +{ + if (!m_pNode) { + return FALSE; + } + return m_pNode->GetBoolean(XFA_ATTRIBUTE_Circular); +} +FX_BOOL CXFA_Box::GetStartAngle(FX_FLOAT &fStartAngle) const +{ + fStartAngle = 0; + if (!m_pNode) { + return FALSE; + } + CXFA_Measurement ms; + FX_BOOL bRet = m_pNode->TryMeasure(XFA_ATTRIBUTE_StartAngle, ms, FALSE); + if (bRet) { + fStartAngle = ms.GetValue(); + } + return bRet; +} +FX_BOOL CXFA_Box::GetSweepAngle(FX_FLOAT &fSweepAngle) const +{ + fSweepAngle = 360; + if (!m_pNode) { + return FALSE; + } + CXFA_Measurement ms; + FX_BOOL bRet = m_pNode->TryMeasure(XFA_ATTRIBUTE_SweepAngle, ms, FALSE); + if (bRet) { + fSweepAngle = ms.GetValue(); + } + return bRet; +} +CXFA_Fill CXFA_Box::GetFill(FX_BOOL bModified) const +{ + if (!m_pNode) { + return NULL; + } + CXFA_Node *pFillNode = m_pNode->GetProperty(0, XFA_ELEMENT_Fill, bModified); + return CXFA_Fill(pFillNode); +} +CXFA_Margin CXFA_Box::GetMargin() const +{ + if (!m_pNode) { + return NULL; + } + return CXFA_Margin(m_pNode->GetChild(0, XFA_ELEMENT_Margin)); +} +static FX_BOOL XFA_BOX_SameStyles(const CXFA_StrokeArray &strokes) +{ + FX_INT32 iCount = strokes.GetSize(); + if (iCount < 1) { + return TRUE; + } + CXFA_Stroke stroke1 = strokes[0]; + for (FX_INT32 i = 1; i < iCount; i ++) { + CXFA_Stroke stroke2 = strokes[i]; + if (!stroke2.IsExistInXML()) { + continue; + } + if (!stroke1.IsExistInXML()) { + stroke1 = stroke2; + } else if (!stroke1.SameStyles(stroke2)) { + return FALSE; + } + } + return TRUE; +} +FX_BOOL CXFA_Box::SameStyles() const +{ + if (IsArc()) { + return TRUE; + } + CXFA_StrokeArray strokes; + XFA_BOX_GetStrokes(m_pNode, strokes, TRUE); + return XFA_BOX_SameStyles(strokes); +} +static FX_INT32 XFA_BOX_3DStyle(const CXFA_StrokeArray &strokes, CXFA_Stroke &stroke) +{ + FX_INT32 iCount = strokes.GetSize(); + if (iCount < 1) { + return 0; + } + stroke = strokes[0]; + for (FX_INT32 i = 1; i < iCount; i ++) { + CXFA_Stroke find = strokes[i]; + if (!find.IsExistInXML()) { + continue; + } + if (!stroke.IsExistInXML()) { + stroke = find; + } else if (stroke.GetStrokeType() != find.GetStrokeType()) { + stroke = find; + break; + } + } + FX_INT32 iType = stroke.GetStrokeType(); + if (iType == XFA_ATTRIBUTEENUM_Lowered || iType == XFA_ATTRIBUTEENUM_Raised || + iType == XFA_ATTRIBUTEENUM_Etched || iType == XFA_ATTRIBUTEENUM_Embossed) { + return iType; + } + return 0; +} +FX_INT32 CXFA_Box::Get3DStyle(FX_BOOL &bVisible, FX_FLOAT &fThickness) const +{ + if (IsArc()) { + return 0; + } + CXFA_StrokeArray strokes; + XFA_BOX_GetStrokes(m_pNode, strokes, TRUE); + CXFA_Stroke stroke(NULL); + FX_INT32 iType = XFA_BOX_3DStyle(strokes, stroke); + if (iType) { + bVisible = stroke.IsVisible(); + fThickness = stroke.GetThickness(); + } + return iType; +} +FX_INT32 CXFA_Stroke::GetPresence() const +{ + return m_pNode ? m_pNode->GetEnum(XFA_ATTRIBUTE_Presence) : XFA_ATTRIBUTEENUM_Invisible; +} +FX_INT32 CXFA_Stroke::GetCapType() const +{ + if (!m_pNode) { + return XFA_ATTRIBUTEENUM_Square; + } + return m_pNode->GetEnum(XFA_ATTRIBUTE_Cap); +} +FX_INT32 CXFA_Stroke::GetStrokeType() const +{ + return m_pNode ? m_pNode->GetEnum(XFA_ATTRIBUTE_Stroke) : XFA_ATTRIBUTEENUM_Solid; +} +FX_FLOAT CXFA_Stroke::GetThickness() const +{ + return GetMSThickness().ToUnit(XFA_UNIT_Pt); +} +CXFA_Measurement CXFA_Stroke::GetMSThickness() const +{ + return m_pNode ? m_pNode->GetMeasure(XFA_ATTRIBUTE_Thickness) : XFA_GetAttributeDefaultValue_Measure(XFA_ELEMENT_Edge, XFA_ATTRIBUTE_Thickness, XFA_XDPPACKET_Form); +} +void CXFA_Stroke::SetThickness(FX_FLOAT fThickness) +{ + if (!m_pNode) { + return; + } + CXFA_Measurement thickness(fThickness, XFA_UNIT_Pt); + m_pNode->SetMeasure(XFA_ATTRIBUTE_Thickness, thickness); +} +void CXFA_Stroke::SetMSThickness(CXFA_Measurement msThinkness) +{ + if (!m_pNode) { + return; + } + m_pNode->SetMeasure(XFA_ATTRIBUTE_Thickness, msThinkness); +} +FX_ARGB CXFA_Stroke::GetColor() const +{ + if (!m_pNode) { + return 0xFF000000; + } + CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Color); + if (!pNode) { + return 0xFF000000; + } + CFX_WideStringC wsColor; + pNode->TryCData(XFA_ATTRIBUTE_Value, wsColor); + return XFA_WStringToColor(wsColor); +} +void CXFA_Stroke::SetColor(FX_ARGB argb) +{ + if (!m_pNode) { + return; + } + CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Color); + CFX_WideString wsColor; + int a, r, g, b; + ArgbDecode(argb, a, r, g, b); + wsColor.Format((FX_LPCWSTR)L"%d,%d,%d", r, g, b); + pNode->SetCData(XFA_ATTRIBUTE_Value, wsColor); +} +FX_INT32 CXFA_Stroke::GetJoinType() const +{ + return m_pNode ? m_pNode->GetEnum(XFA_ATTRIBUTE_Join) : XFA_ATTRIBUTEENUM_Square; +} +FX_BOOL CXFA_Stroke::IsInverted() const +{ + return m_pNode ? m_pNode->GetBoolean(XFA_ATTRIBUTE_Inverted) : FALSE; +} +FX_FLOAT CXFA_Stroke::GetRadius() const +{ + return m_pNode ? m_pNode->GetMeasure(XFA_ATTRIBUTE_Radius).ToUnit(XFA_UNIT_Pt) : 0; +} +FX_BOOL CXFA_Stroke::SameStyles(CXFA_Stroke stroke, FX_DWORD dwFlags) const +{ + if (m_pNode == (CXFA_Node*)stroke) { + return TRUE; + } + if (FXSYS_fabs(GetThickness() - stroke.GetThickness()) >= 0.01f) { + return FALSE; + } + if ((dwFlags & XFA_STROKE_SAMESTYLE_NoPresence) == 0 && IsVisible() != stroke.IsVisible()) { + return FALSE; + } + if (GetStrokeType() != stroke.GetStrokeType()) { + return FALSE; + } + if (GetColor() != stroke.GetColor()) { + return FALSE; + } + if ((dwFlags & XFA_STROKE_SAMESTYLE_Corner) != 0 && FXSYS_fabs(GetRadius() - stroke.GetRadius()) >= 0.01f) { + return FALSE; + } + return TRUE; +} +FX_FLOAT XFA_GetEdgeThickness(const CXFA_StrokeArray &strokes, FX_BOOL b3DStyle, FX_INT32 nIndex) +{ + FX_FLOAT fThickness = 0; + { + if (strokes[nIndex * 2 + 1].GetPresence() == XFA_ATTRIBUTEENUM_Visible) { + if (nIndex == 0) { + fThickness += 2.5f; + } + fThickness += strokes[nIndex * 2 + 1].GetThickness() * (b3DStyle ? 4 : 2); + } + } + return fThickness; +} +CXFA_WidgetData::CXFA_WidgetData(CXFA_Node *pNode) + : CXFA_Data(pNode) + , m_bIsNull(TRUE) + , m_bPreNull(TRUE) + , m_pUiChildNode(NULL) + , m_eUIType(XFA_ELEMENT_UNKNOWN) +{ +} +CXFA_Node* CXFA_WidgetData::GetUIChild() +{ + if (m_eUIType == XFA_ELEMENT_UNKNOWN) { + m_pUiChildNode = XFA_CreateUIChild(m_pNode, m_eUIType); + } + return m_pUiChildNode; +} +XFA_ELEMENT CXFA_WidgetData::GetUIType() +{ + GetUIChild(); + return m_eUIType; +} +CFX_WideString CXFA_WidgetData::GetRawValue() +{ + return m_pNode->GetContent(); +} +FX_INT32 CXFA_WidgetData::GetAccess(FX_BOOL bTemplate) +{ + if (bTemplate) { + CXFA_Node* pNode = m_pNode->GetTemplateNode(); + if (pNode) { + return pNode->GetEnum(XFA_ATTRIBUTE_Access); + } + return XFA_ATTRIBUTEENUM_Open; + } + CXFA_Node* pNode = m_pNode; + while (pNode) { + FX_INT32 iAcc = pNode->GetEnum(XFA_ATTRIBUTE_Access); + if (iAcc != XFA_ATTRIBUTEENUM_Open) { + return iAcc; + } + pNode = pNode->GetNodeItem(XFA_NODEITEM_Parent, XFA_OBJECTTYPE_ContainerNode); + } + return XFA_ATTRIBUTEENUM_Open; +} +FX_BOOL CXFA_WidgetData::GetAccessKey(CFX_WideStringC &wsAccessKey) +{ + return m_pNode->TryCData(XFA_ATTRIBUTE_AccessKey, wsAccessKey); +} +FX_INT32 CXFA_WidgetData::GetAnchorType() +{ + return m_pNode->GetEnum(XFA_ATTRIBUTE_AnchorType); +} +FX_INT32 CXFA_WidgetData::GetColSpan() +{ + return m_pNode->GetInteger(XFA_ATTRIBUTE_ColSpan); +} +FX_INT32 CXFA_WidgetData::GetPresence() +{ + return m_pNode->GetEnum(XFA_ATTRIBUTE_Presence); + CXFA_Node* pNode = m_pNode; + while (pNode && pNode->GetObjectType() == XFA_OBJECTTYPE_ContainerNode) { + FX_INT32 iAcc = pNode->GetEnum(XFA_ATTRIBUTE_Presence); + if ( iAcc != XFA_ATTRIBUTEENUM_Visible) { + return iAcc; + } + pNode = pNode->GetNodeItem(XFA_NODEITEM_Parent); + } + return XFA_ATTRIBUTEENUM_Visible; +} +FX_INT32 CXFA_WidgetData::GetRotate() +{ + CXFA_Measurement ms; + if (!m_pNode->TryMeasure(XFA_ATTRIBUTE_Rotate, ms, FALSE)) { + return 0; + } + FX_INT32 iRotate = FXSYS_round(ms.GetValue()); + iRotate = (iRotate < 0 ? (iRotate % 360) + 360 : iRotate % 360); + return iRotate / 90 * 90; +} +CXFA_Border CXFA_WidgetData::GetBorder(FX_BOOL bModified) +{ + return CXFA_Border(m_pNode->GetProperty(0, XFA_ELEMENT_Border, bModified)); +} +CXFA_Caption CXFA_WidgetData::GetCaption(FX_BOOL bModified ) +{ + return CXFA_Caption(m_pNode->GetProperty(0, XFA_ELEMENT_Caption, bModified)); +} +CXFA_Font CXFA_WidgetData::GetFont(FX_BOOL bModified ) +{ + return CXFA_Font(m_pNode->GetProperty(0, XFA_ELEMENT_Font, bModified)); +} +CXFA_Margin CXFA_WidgetData::GetMargin(FX_BOOL bModified ) +{ + return CXFA_Margin(m_pNode->GetProperty(0, XFA_ELEMENT_Margin, bModified)); +} +CXFA_Para CXFA_WidgetData::GetPara(FX_BOOL bModified ) +{ + return CXFA_Para(m_pNode->GetProperty(0, XFA_ELEMENT_Para, bModified)); +} +CXFA_Keep CXFA_WidgetData::GetKeep(FX_BOOL bModified ) +{ + return CXFA_Keep(m_pNode->GetProperty(0, XFA_ELEMENT_Keep, bModified), m_pNode); +} +void CXFA_WidgetData::GetEventList(CXFA_NodeArray &events) +{ + m_pNode->GetNodeList(events, 0, XFA_ELEMENT_Event); +} +FX_INT32 CXFA_WidgetData::GetEventByActivity(FX_INT32 iActivity, CXFA_NodeArray &events, FX_BOOL bIsFormReady) +{ + CXFA_NodeArray allEvents; + GetEventList(allEvents); + FX_INT32 iCount = allEvents.GetSize(); + for (FX_INT32 i = 0; i < iCount; i++) { + CXFA_Event event(allEvents[i]); + if (event.GetActivity() == iActivity) { + if (iActivity == XFA_ATTRIBUTEENUM_Ready) { + CFX_WideStringC wsRef; + event.GetRef(wsRef); + if (bIsFormReady) { + if (wsRef == CFX_WideStringC(L"$form")) { + events.Add(allEvents[i]); + } + } else { + if (wsRef == CFX_WideStringC(L"$layout")) { + events.Add(allEvents[i]); + } + } + } else { + events.Add(allEvents[i]); + } + } + } + return events.GetSize(); +} +CXFA_Value CXFA_WidgetData::GetDefaultValue(FX_BOOL bModified ) +{ + CXFA_Node* pTemNode = m_pNode->GetTemplateNode(); + return pTemNode ? pTemNode->GetProperty(0, XFA_ELEMENT_Value, bModified) : NULL; +} +CXFA_Value CXFA_WidgetData::GetFormValue(FX_BOOL bModified ) +{ + return m_pNode->GetProperty(0, XFA_ELEMENT_Value, bModified); +} +CXFA_Calculate CXFA_WidgetData::GetCalculate(FX_BOOL bModified ) +{ + return m_pNode->GetProperty(0, XFA_ELEMENT_Calculate, bModified); +} +CXFA_Validate CXFA_WidgetData::GetValidate(FX_BOOL bModified) +{ + return m_pNode->GetProperty(0, XFA_ELEMENT_Validate, bModified); +} +CXFA_Variables CXFA_WidgetData::GetVariables(FX_BOOL bModified ) +{ + return m_pNode->GetProperty(0, XFA_ELEMENT_Variables, bModified); +} +CXFA_Bind CXFA_WidgetData::GetBind(FX_BOOL bModified ) +{ + return m_pNode->GetProperty(0, XFA_ELEMENT_Bind, bModified); +} +CXFA_Assist CXFA_WidgetData::GetAssist(FX_BOOL bModified ) +{ + return m_pNode->GetProperty(0, XFA_ELEMENT_Assist, bModified); +} +void CXFA_WidgetData::GetRelevant(CFX_WideStringC &wsRelevant) +{ + m_pNode->TryCData(XFA_ATTRIBUTE_Relevant, wsRelevant); +} +FX_BOOL CXFA_WidgetData::GetWidth(FX_FLOAT &fWidth) +{ + return TryMeasure(XFA_ATTRIBUTE_W, fWidth); +} +FX_BOOL CXFA_WidgetData::GetHeight(FX_FLOAT &fHeight) +{ + return TryMeasure(XFA_ATTRIBUTE_H, fHeight); +} +FX_BOOL CXFA_WidgetData::GetMinWidth(FX_FLOAT &fMinWidth) +{ + return TryMeasure(XFA_ATTRIBUTE_MinW, fMinWidth); +} +FX_BOOL CXFA_WidgetData::GetMinHeight(FX_FLOAT &fMinHeight) +{ + return TryMeasure(XFA_ATTRIBUTE_MinH, fMinHeight); +} +FX_BOOL CXFA_WidgetData::GetMaxWidth(FX_FLOAT &fMaxWidth) +{ + return TryMeasure(XFA_ATTRIBUTE_MaxW, fMaxWidth); +} +FX_BOOL CXFA_WidgetData::GetMaxHeight(FX_FLOAT &fMaxHeight) +{ + return TryMeasure(XFA_ATTRIBUTE_MaxH, fMaxHeight); +} +CXFA_BindItems CXFA_WidgetData::GetBindItems() +{ + return m_pNode->GetChild(0, XFA_ELEMENT_BindItems); +} +FX_BOOL CXFA_WidgetData::SetAccess(FX_INT32 iAccess, FX_BOOL bNotify) +{ + return m_pNode->SetEnum(XFA_ATTRIBUTE_Access, (XFA_ATTRIBUTEENUM)iAccess, bNotify); +} +FX_BOOL CXFA_WidgetData::SetAccessKey(const CFX_WideString& wsAccessKey) +{ + return m_pNode->SetCData(XFA_ATTRIBUTE_AccessKey, wsAccessKey); +} +FX_BOOL CXFA_WidgetData::SetAnchorType(FX_INT32 iType) +{ + return m_pNode->SetEnum(XFA_ATTRIBUTE_AnchorType, (XFA_ATTRIBUTEENUM)iType); +} +FX_BOOL CXFA_WidgetData::SetColSpan(FX_INT32 iColSpan) +{ + return m_pNode->SetInteger(XFA_ATTRIBUTE_ColSpan, (XFA_ATTRIBUTEENUM)iColSpan); +} +FX_BOOL CXFA_WidgetData::SetPresence(FX_INT32 iPresence) +{ + return m_pNode->SetEnum(XFA_ATTRIBUTE_Presence, (XFA_ATTRIBUTEENUM)iPresence); +} +FX_BOOL CXFA_WidgetData::SetRotate(FX_INT32 iRotate) +{ + while (iRotate < 0) { + iRotate += 360; + } + while (iRotate >= 360) { + iRotate -= 360; + } + CXFA_Measurement ms((FX_FLOAT)iRotate, XFA_UNIT_Angle); + return m_pNode->SetMeasure(XFA_ATTRIBUTE_Rotate, ms); +} +FX_BOOL CXFA_WidgetData::SetRelevant(const CFX_WideString& wsRelevant) +{ + return m_pNode->SetCData(XFA_ATTRIBUTE_Relevant, wsRelevant); +} +FX_BOOL CXFA_WidgetData::SetStatus(FX_DWORD dwStatus) +{ + return FALSE; +} +FX_BOOL CXFA_WidgetData::SetWidth(FX_FLOAT fWidth) +{ + return SetMeasure(XFA_ATTRIBUTE_W, fWidth); +} +FX_BOOL CXFA_WidgetData::SetHeight(FX_FLOAT fHeight) +{ + return SetMeasure(XFA_ATTRIBUTE_H, fHeight); +} +FX_BOOL CXFA_WidgetData::SetMinWidth(FX_FLOAT fMinWidth) +{ + return SetMeasure(XFA_ATTRIBUTE_MinW, fMinWidth); +} +FX_BOOL CXFA_WidgetData::SetMinHeight(FX_FLOAT fMinHeight) +{ + return SetMeasure(XFA_ATTRIBUTE_MinH, fMinHeight); +} +FX_BOOL CXFA_WidgetData::SetMaxWidth(FX_FLOAT fMaxWidth) +{ + return SetMeasure(XFA_ATTRIBUTE_MaxW, fMaxWidth); +} +FX_BOOL CXFA_WidgetData::SetMaxHeight(FX_FLOAT fMaxHeight) +{ + return SetMeasure(XFA_ATTRIBUTE_MaxH, fMaxHeight); +} +FX_BOOL CXFA_WidgetData::SetPos(FX_FLOAT x, FX_FLOAT y) +{ + return SetMeasure(XFA_ATTRIBUTE_X, x) && SetMeasure(XFA_ATTRIBUTE_Y, y); +} +FX_BOOL CXFA_WidgetData::SetName(const CFX_WideString& wsName) +{ + return m_pNode->SetCData(XFA_ATTRIBUTE_Name, wsName); +} +FX_BOOL CXFA_WidgetData::SetButtonHighlight(FX_INT32 iButtonHighlight) +{ + CXFA_Node* pUiChildNode = GetUIChild(); + return pUiChildNode->SetEnum(XFA_ATTRIBUTE_Highlight, (XFA_ATTRIBUTEENUM)iButtonHighlight); +} +FX_BOOL CXFA_WidgetData::SetButtonRollover(const CFX_WideString &wsRollover, FX_BOOL bRichText) +{ + return FALSE; +} +FX_BOOL CXFA_WidgetData::SetButtonDown(const CFX_WideString& wsDown, FX_BOOL bRichText) +{ + return FALSE; +} +FX_BOOL CXFA_WidgetData::SetCheckButtonShape(FX_INT32 iCheckButtonShape) +{ + CXFA_Node* pUiChildNode = GetUIChild(); + return pUiChildNode->SetEnum(XFA_ATTRIBUTE_Shape, (XFA_ATTRIBUTEENUM)iCheckButtonShape); +} +FX_BOOL CXFA_WidgetData::SetCheckButtonMark(FX_INT32 iCheckButtonMark) +{ + CXFA_Node* pUiChildNode = GetUIChild(); + return pUiChildNode->SetEnum(XFA_ATTRIBUTE_Mark, (XFA_ATTRIBUTEENUM)iCheckButtonMark); +} +FX_BOOL CXFA_WidgetData::SetCheckButtonSize(FX_FLOAT fCheckButtonMark) +{ + CXFA_Node* pUiChildNode = GetUIChild(); + if (pUiChildNode) { + CXFA_Measurement ms(fCheckButtonMark, XFA_UNIT_Pt); + return pUiChildNode->SetMeasure(XFA_ATTRIBUTE_Size, ms); + } + return FALSE; +} +CXFA_Border CXFA_WidgetData::GetUIBorder(FX_BOOL bModified ) +{ + CXFA_Node* pUIChild = GetUIChild(); + return pUIChild ? pUIChild->GetProperty(0, XFA_ELEMENT_Border, bModified) : NULL; +} +CXFA_Margin CXFA_WidgetData::GetUIMargin(FX_BOOL bModified ) +{ + CXFA_Node* pUIChild = GetUIChild(); + return pUIChild ? pUIChild->GetProperty(0, XFA_ELEMENT_Margin, bModified) : NULL; +} +void CXFA_WidgetData::GetUIMargin(CFX_RectF &rtUIMargin) +{ + rtUIMargin.Reset(); + CXFA_Margin mgUI = GetUIMargin(); + if (!mgUI) { + return; + } + CXFA_Border border = GetUIBorder(); + if (border && border.GetPresence() != XFA_ATTRIBUTEENUM_Visible) { + return; + } + FX_FLOAT fLeftInset, fTopInset, fRightInset, fBottomInset; + FX_BOOL bLeft = mgUI.GetLeftInset(fLeftInset); + FX_BOOL bTop = mgUI.GetTopInset(fTopInset); + FX_BOOL bRight = mgUI.GetRightInset(fRightInset); + FX_BOOL bBottom = mgUI.GetBottomInset(fBottomInset); + if (border) { + FX_BOOL bVisible = FALSE; + FX_FLOAT fThickness = 0; + border.Get3DStyle(bVisible, fThickness); + if (!bLeft || !bTop || !bRight || !bBottom) { + CXFA_StrokeArray strokes; + border.GetStrokes(strokes); + if (!bTop) { + fTopInset = XFA_GetEdgeThickness(strokes, bVisible, 0); + } + if (!bRight) { + fRightInset = XFA_GetEdgeThickness(strokes, bVisible, 1); + } + if (!bBottom) { + fBottomInset = XFA_GetEdgeThickness(strokes, bVisible, 2); + } + if (!bLeft) { + fLeftInset = XFA_GetEdgeThickness(strokes, bVisible, 3); + } + } + } + rtUIMargin.Set(fLeftInset, fTopInset, fRightInset, fBottomInset); +} +FX_INT32 CXFA_WidgetData::GetButtonHighlight() +{ + CXFA_Node* pUIChild = GetUIChild(); + if (pUIChild) { + return pUIChild->GetEnum(XFA_ATTRIBUTE_Highlight); + } + return XFA_GetAttributeDefaultValue_Enum(XFA_ELEMENT_Button, XFA_ATTRIBUTE_Highlight, XFA_XDPPACKET_Form); +} +FX_BOOL CXFA_WidgetData::GetButtonRollover(CFX_WideString &wsRollover, FX_BOOL &bRichText) +{ + if (CXFA_Node* pItems = m_pNode->GetChild(0, XFA_ELEMENT_Items)) { + CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild); + while (pText) { + CFX_WideStringC wsName; + pText->TryCData(XFA_ATTRIBUTE_Name, wsName); + if (wsName == FX_WSTRC(L"rollover")) { + pText->TryContent(wsRollover); + bRichText = pText->GetClassID() == XFA_ELEMENT_ExData; + return !wsRollover.IsEmpty(); + } + pText = pText->GetNodeItem(XFA_NODEITEM_NextSibling); + } + } + return FALSE; +} +FX_BOOL CXFA_WidgetData::GetButtonDown(CFX_WideString &wsDown, FX_BOOL &bRichText) +{ + if (CXFA_Node* pItems = m_pNode->GetChild(0, XFA_ELEMENT_Items)) { + CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild); + while(pText) { + CFX_WideStringC wsName; + pText->TryCData(XFA_ATTRIBUTE_Name, wsName); + if (wsName == FX_WSTRC(L"down")) { + pText->TryContent(wsDown); + bRichText = pText->GetClassID() == XFA_ELEMENT_ExData; + return !wsDown.IsEmpty(); + } + pText = pText->GetNodeItem(XFA_NODEITEM_NextSibling); + } + } + return FALSE; +} +FX_INT32 CXFA_WidgetData::GetCheckButtonShape() +{ + CXFA_Node* pUIChild = GetUIChild(); + if (pUIChild) { + return pUIChild->GetEnum(XFA_ATTRIBUTE_Shape); + } + return XFA_GetAttributeDefaultValue_Enum(XFA_ELEMENT_CheckButton, XFA_ATTRIBUTE_Shape, XFA_XDPPACKET_Form); +} +FX_INT32 CXFA_WidgetData::GetCheckButtonMark() +{ + CXFA_Node* pUIChild = GetUIChild(); + if (pUIChild) { + return pUIChild->GetEnum(XFA_ATTRIBUTE_Mark); + } + return XFA_GetAttributeDefaultValue_Enum(XFA_ELEMENT_CheckButton, XFA_ATTRIBUTE_Mark, XFA_XDPPACKET_Form); +} +FX_BOOL CXFA_WidgetData::IsRadioButton() +{ + if (CXFA_Node* pParent = m_pNode->GetNodeItem(XFA_NODEITEM_Parent)) { + return pParent->GetClassID() == XFA_ELEMENT_ExclGroup; + } + return FALSE; +} +FX_FLOAT CXFA_WidgetData::GetCheckButtonSize() +{ + CXFA_Node* pUIChild = GetUIChild(); + if (pUIChild) { + return pUIChild->GetMeasure(XFA_ATTRIBUTE_Size).ToUnit(XFA_UNIT_Pt); + } + return XFA_GetAttributeDefaultValue_Measure(XFA_ELEMENT_CheckButton, XFA_ATTRIBUTE_Size, XFA_XDPPACKET_Form).ToUnit(XFA_UNIT_Pt); +} +FX_BOOL CXFA_WidgetData::IsAllowNeutral() +{ + CXFA_Node* pUIChild = GetUIChild(); + if (pUIChild) { + return pUIChild->GetBoolean(XFA_ATTRIBUTE_AllowNeutral); + } + return XFA_GetAttributeDefaultValue_Boolean(XFA_ELEMENT_CheckButton, XFA_ATTRIBUTE_AllowNeutral, XFA_XDPPACKET_Form); +} +XFA_CHECKSTATE CXFA_WidgetData::GetCheckState() +{ + CFX_WideString wsValue = GetRawValue(); + if (wsValue.IsEmpty()) { + return XFA_CHECKSTATE_Off; + } + if (CXFA_Node* pItems = m_pNode->GetChild(0, XFA_ELEMENT_Items)) { + CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild); + FX_INT32 i = 0; + while(pText) { + CFX_WideString wsContent; + if (pText->TryContent(wsContent) && (wsContent == wsValue)) { + return (XFA_CHECKSTATE)i; + } + i++; + pText = pText->GetNodeItem(XFA_NODEITEM_NextSibling); + } + } + return XFA_CHECKSTATE_Off; +} +void CXFA_WidgetData::SetCheckState(XFA_CHECKSTATE eCheckState, FX_BOOL bNotify) +{ + if (CXFA_WidgetData exclGroup = GetExclGroupNode()) { + CFX_WideString wsValue; + if (eCheckState != XFA_CHECKSTATE_Off) { + if (CXFA_Node* pItems = m_pNode->GetChild(0, XFA_ELEMENT_Items)) { + CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild); + if (pText) { + pText->TryContent(wsValue); + } + } + } + CXFA_Node* pChild = ((CXFA_Node*)exclGroup)->GetNodeItem(XFA_NODEITEM_FirstChild); + for (; pChild; pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if (pChild->GetClassID() != XFA_ELEMENT_Field) { + continue; + } + CXFA_Node* pItem = pChild->GetChild(0, XFA_ELEMENT_Items); + if (!pItem) { + continue; + } + CXFA_Node* pItemchild = pItem->GetNodeItem(XFA_NODEITEM_FirstChild); + if (!pItemchild) { + continue; + } + CFX_WideString text = pItemchild->GetContent(); + CFX_WideString wsChildValue = text; + if (wsValue != text) { + pItemchild = pItemchild->GetNodeItem(XFA_NODEITEM_NextSibling); + if (pItemchild) { + wsChildValue = pItemchild->GetContent(); + } else { + wsChildValue.Empty(); + } + } + CXFA_WidgetData ch(pChild); + ch.SyncValue(wsChildValue, bNotify); + } + exclGroup.SyncValue(wsValue, bNotify); + } else { + CXFA_Node* pItems = m_pNode->GetChild(0, XFA_ELEMENT_Items); + if (!pItems) { + return; + } + FX_INT32 i = -1; + CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild); + CFX_WideString wsContent; + while (pText) { + i++; + if (i == eCheckState) { + pText->TryContent(wsContent); + break; + } + pText = pText->GetNodeItem(XFA_NODEITEM_NextSibling); + } + SyncValue(wsContent, bNotify); + } +} +CXFA_Node* CXFA_WidgetData::GetExclGroupNode() +{ + CXFA_Node* pExcl = (CXFA_Node*)m_pNode->GetNodeItem(XFA_NODEITEM_Parent); + if (!pExcl || pExcl->GetClassID() != XFA_ELEMENT_ExclGroup) { + return NULL; + } + return pExcl; +} +CXFA_Node* CXFA_WidgetData::GetSelectedMember() +{ + CXFA_Node *pSelectedMember = NULL; + CFX_WideString wsState = GetRawValue(); + if (wsState.IsEmpty()) { + return pSelectedMember; + } + for (CXFA_Node *pNode = (CXFA_Node*)m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild); pNode != NULL; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + CXFA_WidgetData widgetData(pNode); + if (widgetData.GetCheckState() == XFA_CHECKSTATE_On) { + pSelectedMember = pNode; + break; + } + } + return pSelectedMember; +} +CXFA_Node* CXFA_WidgetData::SetSelectedMember(FX_WSTR wsName, FX_BOOL bNotify) +{ + CXFA_Node *pSelectedMember = NULL; + FX_DWORD nameHash = FX_HashCode_String_GetW(wsName.GetPtr(), wsName.GetLength()); + for (CXFA_Node *pNode = (CXFA_Node*)m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild); pNode != NULL; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if (pNode->GetNameHash() == nameHash) { + CXFA_WidgetData widgetData(pNode); + widgetData.SetCheckState(XFA_CHECKSTATE_On, bNotify); + pSelectedMember = pNode; + break; + } + } + return pSelectedMember; +} +void CXFA_WidgetData::SetSelectedMemberByValue(FX_WSTR wsValue, FX_BOOL bNotify, FX_BOOL bScriptModify, FX_BOOL bSyncData) +{ + CFX_WideString wsExclGroup; + for (CXFA_Node *pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild); pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if (pNode->GetClassID() != XFA_ELEMENT_Field) { + continue; + } + CXFA_Node* pItem = pNode->GetChild(0, XFA_ELEMENT_Items); + if (!pItem) { + continue; + } + CXFA_Node* pItemchild = pItem->GetNodeItem(XFA_NODEITEM_FirstChild); + if (!pItemchild) { + continue; + } + CFX_WideString wsChildValue = pItemchild->GetContent(); + if (wsValue != wsChildValue) { + pItemchild = pItemchild->GetNodeItem(XFA_NODEITEM_NextSibling); + if (pItemchild) { + wsChildValue = pItemchild->GetContent(); + } else { + wsChildValue.Empty(); + } + } else { + wsExclGroup = wsValue; + } + pNode->SetContent(wsChildValue, wsChildValue, bNotify, bScriptModify, FALSE); + } + if (m_pNode) { + m_pNode->SetContent(wsExclGroup, wsExclGroup, bNotify, bScriptModify, bSyncData); + } +} +CXFA_Node* CXFA_WidgetData::GetExclGroupFirstMember() +{ + CXFA_Node* pExcl = GetNode(); + if (!pExcl) { + return NULL; + } + CXFA_Node* pNode = pExcl->GetNodeItem(XFA_NODEITEM_FirstChild); + while (pNode) { + if (pNode->GetClassID() == XFA_ELEMENT_Field) { + return pNode; + } + pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling); + } + return NULL; +} +CXFA_Node* CXFA_WidgetData::GetExclGroupNextMember(CXFA_Node* pNode) +{ + if (!pNode) { + return NULL; + } + CXFA_Node* pNodeField = pNode->GetNodeItem(XFA_NODEITEM_NextSibling); + while (pNodeField) { + if (pNodeField->GetClassID() == XFA_ELEMENT_Field) { + return pNodeField; + } + pNodeField = pNodeField->GetNodeItem(XFA_NODEITEM_NextSibling); + } + return NULL; +} +FX_INT32 CXFA_WidgetData::GetChoiceListCommitOn() +{ + CXFA_Node* pUIChild = GetUIChild(); + if (pUIChild) { + return pUIChild->GetEnum(XFA_ATTRIBUTE_CommitOn); + } + return XFA_GetAttributeDefaultValue_Enum(XFA_ELEMENT_ChoiceList, XFA_ATTRIBUTE_CommitOn, XFA_XDPPACKET_Form); +} +FX_BOOL CXFA_WidgetData::IsChoiceListAllowTextEntry() +{ + CXFA_Node* pUIChild = GetUIChild(); + if (pUIChild) { + return pUIChild->GetBoolean(XFA_ATTRIBUTE_TextEntry); + } + return XFA_GetAttributeDefaultValue_Boolean(XFA_ELEMENT_ChoiceList, XFA_ATTRIBUTE_TextEntry, XFA_XDPPACKET_Form); +} +FX_INT32 CXFA_WidgetData::GetChoiceListOpen() +{ + CXFA_Node* pUIChild = GetUIChild(); + if (pUIChild) { + return pUIChild->GetEnum(XFA_ATTRIBUTE_Open); + } + return XFA_GetAttributeDefaultValue_Enum(XFA_ELEMENT_ChoiceList, XFA_ATTRIBUTE_Open, XFA_XDPPACKET_Form); +} +FX_BOOL CXFA_WidgetData::IsListBox() +{ + FX_INT32 iOpenMode = GetChoiceListOpen(); + return (iOpenMode == XFA_ATTRIBUTEENUM_Always || iOpenMode == XFA_ATTRIBUTEENUM_MultiSelect); +} +FX_INT32 CXFA_WidgetData::CountChoiceListItems(FX_BOOL bSaveValue) +{ + CXFA_NodeArray pItems; + CXFA_Node* pItem = NULL; + FX_INT32 iCount = 0; + CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild); + for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if (pNode->GetClassID() != XFA_ELEMENT_Items) { + continue; + } + iCount++; + pItems.Add(pNode); + if (iCount == 2) { + break; + } + } + if(iCount == 0) { + return 0; + } + pItem = pItems[0]; + if (iCount > 1) { + FX_BOOL bItemOneHasSave = pItems[0]->GetBoolean(XFA_ATTRIBUTE_Save); + FX_BOOL bItemTwoHasSave = pItems[1]->GetBoolean(XFA_ATTRIBUTE_Save); + if (bItemOneHasSave != bItemTwoHasSave && bSaveValue == bItemTwoHasSave) { + pItem = pItems[1]; + } + } + pItems.RemoveAll(); + return pItem->CountChildren(XFA_ELEMENT_UNKNOWN); +} +FX_BOOL CXFA_WidgetData::GetChoiceListItem(CFX_WideString &wsText, FX_INT32 nIndex, FX_BOOL bSaveValue ) +{ + wsText.Empty(); + CXFA_NodeArray pItemsArray; + CXFA_Node* pItems = NULL; + FX_INT32 iCount = 0; + CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild); + for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if (pNode->GetClassID() != XFA_ELEMENT_Items) { + continue; + } + iCount++; + pItemsArray.Add(pNode); + if (iCount == 2) { + break; + } + } + if (iCount == 0) { + return FALSE; + } + pItems = pItemsArray[0]; + if (iCount > 1) { + FX_BOOL bItemOneHasSave = pItemsArray[0]->GetBoolean(XFA_ATTRIBUTE_Save); + FX_BOOL bItemTwoHasSave = pItemsArray[1]->GetBoolean(XFA_ATTRIBUTE_Save); + if (bItemOneHasSave != bItemTwoHasSave && bSaveValue == bItemTwoHasSave) { + pItems = pItemsArray[1]; + } + } + if (pItems) { + CXFA_Node *pItem = pItems->GetChild(nIndex, XFA_ELEMENT_UNKNOWN); + if(pItem != NULL) { + pItem->TryContent(wsText); + return TRUE; + } + } + return FALSE; +} +void CXFA_WidgetData::GetChoiceListItems(CFX_WideStringArray &wsTextArray, FX_BOOL bSaveValue ) +{ + CXFA_NodeArray pItems; + CXFA_Node* pItem = NULL; + FX_INT32 iCount = 0; + CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild); + for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if (pNode->GetClassID() != XFA_ELEMENT_Items) { + continue; + } + iCount++; + pItems.Add(pNode); + if (iCount == 2) { + break; + } + } + if(iCount == 0) { + return; + } + pItem = pItems[0]; + if (iCount > 1) { + FX_BOOL bItemOneHasSave = pItems[0]->GetBoolean(XFA_ATTRIBUTE_Save); + FX_BOOL bItemTwoHasSave = pItems[1]->GetBoolean(XFA_ATTRIBUTE_Save); + if (bItemOneHasSave != bItemTwoHasSave && bSaveValue == bItemTwoHasSave) { + pItem = pItems[1]; + } + } + pItems.RemoveAll(); + pNode = pItem->GetNodeItem(XFA_NODEITEM_FirstChild); + for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + pNode->TryContent(wsTextArray.Add()); + } +} +FX_INT32 CXFA_WidgetData::CountSelectedItems() +{ + CFX_WideStringArray wsValueArray; + GetSelectedItemsValue(wsValueArray); + if (IsListBox() || !IsChoiceListAllowTextEntry()) { + return wsValueArray.GetSize(); + } + FX_INT32 iSelected = 0; + CFX_WideStringArray wsSaveTextArray; + GetChoiceListItems(wsSaveTextArray, TRUE); + FX_INT32 iValues = wsValueArray.GetSize(); + for (FX_INT32 i = 0; i < iValues; i++) { + FX_INT32 iSaves = wsSaveTextArray.GetSize(); + for (FX_INT32 j = 0; j < iSaves; j++) { + if (wsValueArray[i] == wsSaveTextArray[j]) { + iSelected++; + break; + } + } + } + return iSelected; +} +FX_INT32 CXFA_WidgetData::GetSelectedItem(FX_INT32 nIndex ) +{ + CFX_WideStringArray wsValueArray; + GetSelectedItemsValue(wsValueArray); + FX_INT32 iSelected = 0; + CFX_WideStringArray wsSaveTextArray; + GetChoiceListItems(wsSaveTextArray, TRUE); + FX_INT32 iSaves = wsSaveTextArray.GetSize(); + for (FX_INT32 j = 0; j < iSaves; j++) { + if (wsValueArray[nIndex] == wsSaveTextArray[j]) { + return j; + } + } + return -1; +} +void CXFA_WidgetData::GetSelectedItems(CFX_Int32Array &iSelArray) +{ + CFX_WideStringArray wsValueArray; + GetSelectedItemsValue(wsValueArray); + FX_INT32 iValues = wsValueArray.GetSize(); + if (iValues < 1) { + return; + } + CFX_WideStringArray wsSaveTextArray; + GetChoiceListItems(wsSaveTextArray, TRUE); + FX_INT32 iSaves = wsSaveTextArray.GetSize(); + for (FX_INT32 i = 0; i < iValues; i++) { + for (FX_INT32 j = 0; j < iSaves; j++) { + if (wsValueArray[i] == wsSaveTextArray[j]) { + iSelArray.Add(j); + break; + } + } + } +} +void CXFA_WidgetData::GetSelectedItemsValue(CFX_WideStringArray &wsSelTextArray) +{ + CFX_WideString wsValue = GetRawValue(); + if (GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) { + if (!wsValue.IsEmpty()) { + FX_INT32 iStart = 0; + FX_INT32 iLength = wsValue.GetLength(); + FX_INT32 iEnd = wsValue.Find(L'\n', iStart); + iEnd = (iEnd == -1) ? iLength : iEnd; + while (iEnd >= iStart) { + wsSelTextArray.Add(wsValue.Mid(iStart, iEnd - iStart)); + iStart = iEnd + 1; + if (iStart >= iLength) { + break; + } + iEnd = wsValue.Find(L'\n', iStart); + if (iEnd < 0) { + wsSelTextArray.Add(wsValue.Mid(iStart, iLength - iStart)); + } + } + } + } else { + wsSelTextArray.Add(wsValue); + } +} +FX_BOOL CXFA_WidgetData::GetItemState(FX_INT32 nIndex) +{ + if (nIndex < 0) { + return FALSE; + } + CFX_WideStringArray wsSaveTextArray; + GetChoiceListItems(wsSaveTextArray, TRUE); + if (wsSaveTextArray.GetSize() <= nIndex) { + return FALSE; + } + CFX_WideStringArray wsValueArray; + GetSelectedItemsValue(wsValueArray); + FX_INT32 iValues = wsValueArray.GetSize(); + for (FX_INT32 j = 0; j < iValues; j++) { + if (wsValueArray[j] == wsSaveTextArray[nIndex]) { + return TRUE; + } + } + return FALSE; +} +void CXFA_WidgetData::SetItemState(FX_INT32 nIndex, FX_BOOL bSelected, FX_BOOL bNotify, FX_BOOL bScriptModify, FX_BOOL bSyncData) +{ + if (nIndex < 0) { + return; + } + CFX_WideStringArray wsSaveTextArray; + GetChoiceListItems(wsSaveTextArray, TRUE); + if (wsSaveTextArray.GetSize() <= nIndex) { + return; + } + FX_INT32 iSel = -1; + CFX_WideStringArray wsValueArray; + GetSelectedItemsValue(wsValueArray); + FX_INT32 iValues = wsValueArray.GetSize(); + for (FX_INT32 j = 0; j < iValues; j++) { + if (wsValueArray[j] == wsSaveTextArray[nIndex]) { + iSel = j; + break; + } + } + if (GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) { + if (bSelected) { + if (iSel < 0) { + CFX_WideString wsValue = GetRawValue(); + if (!wsValue.IsEmpty()) { + wsValue += L"\n"; + } + wsValue += wsSaveTextArray[nIndex]; + m_pNode->SetContent(wsValue, wsValue, bNotify, bScriptModify, bSyncData); + } + } else if (iSel >= 0) { + CFX_Int32Array iSelArray; + GetSelectedItems(iSelArray); + for (FX_INT32 i = 0; i < iSelArray.GetSize(); i++) { + if (iSelArray[i] == nIndex) { + iSelArray.RemoveAt(i); + break; + } + } + SetSelectdItems(iSelArray, bNotify, bScriptModify, bSyncData); + } + } else { + if (bSelected) { + if (iSel < 0) { + CFX_WideString wsSaveText = wsSaveTextArray[nIndex]; + CFX_WideString wsFormatText(wsSaveText); + GetFormatDataValue(wsSaveText, wsFormatText); + m_pNode->SetContent(wsSaveText, wsFormatText, bNotify, bScriptModify, bSyncData); + } + } else if (iSel >= 0) { + m_pNode->SetContent(CFX_WideString(), CFX_WideString(), bNotify, bScriptModify, bSyncData); + } + } +} +void CXFA_WidgetData::SetSelectdItems(CFX_Int32Array &iSelArray, FX_BOOL bNotify, FX_BOOL bScriptModify, FX_BOOL bSyncData) +{ + CFX_WideString wsValue; + FX_INT32 iSize = iSelArray.GetSize(); + if (iSize >= 1) { + CFX_WideStringArray wsSaveTextArray; + GetChoiceListItems(wsSaveTextArray, TRUE); + CFX_WideString wsItemValue; + for (FX_INT32 i = 0; i < iSize; i++) { + wsItemValue = (iSize == 1) ? wsSaveTextArray[iSelArray[i]] : wsSaveTextArray[iSelArray[i]] + FX_WSTRC(L"\n"); + wsValue += wsItemValue; + } + } + CFX_WideString wsFormat(wsValue); + if (GetChoiceListOpen() != XFA_ATTRIBUTEENUM_MultiSelect) { + GetFormatDataValue(wsValue, wsFormat); + } + m_pNode->SetContent(wsValue, wsFormat, bNotify, bScriptModify, bSyncData); +} +void CXFA_WidgetData::ClearAllSelections() +{ + CXFA_Node* pBind = m_pNode->GetBindData(); + if (pBind && GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) { + while (CXFA_Node* pChildNode = pBind->GetNodeItem(XFA_NODEITEM_FirstChild)) { + pBind->RemoveChild(pChildNode); + } + } else { + SyncValue(CFX_WideString(), FALSE); + } +} +void CXFA_WidgetData::InsertItem(const CFX_WideString &wsLabel, const CFX_WideString &wsValue, FX_INT32 nIndex , FX_BOOL bNotify ) +{ + CFX_WideString wsNewValue(wsValue); + if (wsNewValue.IsEmpty()) { + wsNewValue = wsLabel; + } + CXFA_NodeArray listitems; + FX_INT32 iCount = 0; + CXFA_Node *pItemNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild); + for (; pItemNode; pItemNode = pItemNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if (pItemNode->GetClassID() != XFA_ELEMENT_Items) { + continue; + } + listitems.Add(pItemNode); + iCount ++; + } + if (iCount < 1) { + CXFA_Node* pItems = m_pNode->CreateSamePacketNode(XFA_ELEMENT_Items); + m_pNode->InsertChild(-1, pItems); + InsertListTextItem(pItems, wsLabel, nIndex); + CXFA_Node* pSaveItems = m_pNode->CreateSamePacketNode(XFA_ELEMENT_Items); + m_pNode->InsertChild(-1, pSaveItems); + pSaveItems->SetBoolean(XFA_ATTRIBUTE_Save, TRUE); + InsertListTextItem(pSaveItems, wsNewValue, nIndex); + } else if (iCount > 1) { + for (FX_INT32 i = 0; i < 2; i++) { + CXFA_Node* pNode = listitems[i]; + FX_BOOL bHasSave = pNode->GetBoolean(XFA_ATTRIBUTE_Save); + if (bHasSave) { + InsertListTextItem(pNode, wsNewValue, nIndex); + } else { + InsertListTextItem(pNode, wsLabel, nIndex); + } + } + } else { + CXFA_Node* pNode = listitems[0]; + pNode->SetBoolean(XFA_ATTRIBUTE_Save, FALSE); + pNode->SetEnum(XFA_ATTRIBUTE_Presence, XFA_ATTRIBUTEENUM_Visible); + CXFA_Node* pSaveItems = m_pNode->CreateSamePacketNode(XFA_ELEMENT_Items); + m_pNode->InsertChild(-1, pSaveItems); + pSaveItems->SetBoolean(XFA_ATTRIBUTE_Save, TRUE); + pSaveItems->SetEnum(XFA_ATTRIBUTE_Presence, XFA_ATTRIBUTEENUM_Hidden); + listitems.RemoveAll(); + CXFA_Node *pListNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild); + FX_INT32 i = 0; + while(pListNode) { + CFX_WideString wsOldValue; + pListNode->TryContent(wsOldValue); + InsertListTextItem(pSaveItems, wsOldValue, i); + i++; + pListNode = pListNode->GetNodeItem(XFA_NODEITEM_NextSibling); + } + InsertListTextItem(pNode, wsLabel, nIndex); + InsertListTextItem(pSaveItems, wsNewValue, nIndex); + } + if(!bNotify) { + return; + } + m_pNode->GetDocument()->GetNotify()->OnWidgetDataEvent(this, XFA_WIDGETEVENT_ListItemAdded, (FX_LPVOID)(FX_LPCWSTR)wsLabel, (FX_LPVOID)(FX_LPCWSTR)wsValue, (FX_LPVOID)(FX_UINTPTR)nIndex); +} +void CXFA_WidgetData::GetItemLabel(FX_WSTR wsValue, CFX_WideString &wsLabel) +{ + FX_INT32 iCount = 0; + CXFA_NodeArray listitems; + CXFA_Node* pItems = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild); + for (; pItems; pItems = pItems->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if (pItems->GetClassID() != XFA_ELEMENT_Items) { + continue; + } + iCount++; + listitems.Add(pItems); + } + if (iCount <= 1) { + wsLabel = wsValue; + } else { + CXFA_Node* pLabelItems = listitems[0]; + FX_BOOL bSave = pLabelItems->GetBoolean(XFA_ATTRIBUTE_Save); + CXFA_Node* pSaveItems = NULL; + if (bSave) { + pSaveItems = pLabelItems; + pLabelItems = listitems[1]; + } else { + pSaveItems = listitems[1]; + } + iCount = 0; + FX_INT32 iSearch = -1; + CFX_WideString wsContent; + CXFA_Node* pChildItem = pSaveItems->GetNodeItem(XFA_NODEITEM_FirstChild); + for (; pChildItem; pChildItem = pChildItem->GetNodeItem(XFA_NODEITEM_NextSibling)) { + pChildItem->TryContent(wsContent); + if (wsContent == wsValue) { + iSearch = iCount; + break; + } + iCount ++; + } + if (iSearch < 0) { + return; + } + if (CXFA_Node* pText = pLabelItems->GetChild(iSearch, XFA_ELEMENT_UNKNOWN)) { + pText->TryContent(wsLabel); + } + } +} +void CXFA_WidgetData::GetItemValue(FX_WSTR wsLabel, CFX_WideString &wsValue) +{ + FX_INT32 iCount = 0; + CXFA_NodeArray listitems; + CXFA_Node* pItems = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild); + for (; pItems; pItems = pItems->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if (pItems->GetClassID() != XFA_ELEMENT_Items) { + continue; + } + iCount++; + listitems.Add(pItems); + } + if (iCount <= 1) { + wsValue = wsLabel; + } else { + CXFA_Node* pLabelItems = listitems[0]; + FX_BOOL bSave = pLabelItems->GetBoolean(XFA_ATTRIBUTE_Save); + CXFA_Node* pSaveItems = NULL; + if (bSave) { + pSaveItems = pLabelItems; + pLabelItems = listitems[1]; + } else { + pSaveItems = listitems[1]; + } + iCount = 0; + FX_INT32 iSearch = -1; + CFX_WideString wsContent; + CXFA_Node* pChildItem = pLabelItems->GetNodeItem(XFA_NODEITEM_FirstChild); + for (; pChildItem; pChildItem = pChildItem->GetNodeItem(XFA_NODEITEM_NextSibling)) { + pChildItem->TryContent(wsContent); + if (wsContent == wsLabel) { + iSearch = iCount; + break; + } + iCount ++; + } + if (iSearch < 0) { + return; + } + if (CXFA_Node* pText = pSaveItems->GetChild(iSearch, XFA_ELEMENT_UNKNOWN)) { + pText->TryContent(wsValue); + } + } +} +FX_BOOL CXFA_WidgetData::DeleteItem(FX_INT32 nIndex, FX_BOOL bNotify, FX_BOOL bScriptModify, FX_BOOL bSyncData) +{ + FX_BOOL bSetValue = FALSE; + CXFA_Node* pItems = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild); + for (; pItems; pItems = pItems->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if (pItems->GetClassID() != XFA_ELEMENT_Items) { + continue; + } + if (nIndex < 0) { + while (CXFA_Node* pNode = pItems->GetNodeItem(XFA_NODEITEM_FirstChild)) { + pItems->RemoveChild(pNode); + } + } else { + if (!bSetValue && pItems->GetBoolean(XFA_ATTRIBUTE_Save)) { + SetItemState(nIndex, FALSE, TRUE, bScriptModify, bSyncData); + bSetValue = TRUE; + } + FX_INT32 i = 0; + CXFA_Node* pNode = pItems->GetNodeItem(XFA_NODEITEM_FirstChild); + while (pNode) { + if (i == nIndex) { + pItems->RemoveChild(pNode); + break; + } + i++; + pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling); + } + } + } + if(!bNotify) { + return TRUE; + } + m_pNode->GetDocument()->GetNotify()->OnWidgetDataEvent(this, XFA_WIDGETEVENT_ListItemRemoved, (FX_LPVOID)(FX_UINTPTR)nIndex); + return TRUE; +} +FX_INT32 CXFA_WidgetData::GetHorizontalScrollPolicy() +{ + CXFA_Node* pUIChild = GetUIChild(); + if (pUIChild) { + return pUIChild->GetEnum(XFA_ATTRIBUTE_HScrollPolicy); + } + return XFA_ATTRIBUTEENUM_Auto; +} +FX_INT32 CXFA_WidgetData::GetNumberOfCells() +{ + CXFA_Node* pUIChild = GetUIChild(); + if (!pUIChild) { + return -1; + } + if (CXFA_Node* pNode = pUIChild->GetChild(0, XFA_ELEMENT_Comb)) { + return pNode->GetInteger(XFA_ATTRIBUTE_NumberOfCells); + } + return -1; +} +FX_BOOL CXFA_WidgetData::IsDateTimeEditUsePicker() +{ + return TRUE; +} +CFX_WideString CXFA_WidgetData::GetBarcodeType() +{ + CXFA_Node* pUIChild = GetUIChild(); + return pUIChild ? pUIChild->GetCData(XFA_ATTRIBUTE_Type) : NULL; +} +FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_CharEncoding(FX_INT32& val) +{ + CXFA_Node* pUIChild = GetUIChild(); + CFX_WideString wsCharEncoding; + if(pUIChild->TryCData(XFA_ATTRIBUTE_CharEncoding, wsCharEncoding)) { + if (wsCharEncoding.CompareNoCase((FX_LPCWSTR)(L"UTF-16"))) { + val = CHAR_ENCODING_UNICODE; + return TRUE; + } else if (wsCharEncoding.CompareNoCase((FX_LPCWSTR)(L"UTF-8"))) { + val = CHAR_ENCODING_UTF8; + return TRUE; + } + } + return FALSE; +} +FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_Checksum(FX_INT32& val) +{ + CXFA_Node* pUIChild = GetUIChild(); + XFA_ATTRIBUTEENUM eChecksum; + if (pUIChild->TryEnum(XFA_ATTRIBUTE_Checksum, eChecksum)) { + switch (eChecksum) { + case XFA_ATTRIBUTEENUM_None: + val = 0; + return TRUE; + case XFA_ATTRIBUTEENUM_Auto: + val = 1; + return TRUE; + case XFA_ATTRIBUTEENUM_1mod10: + break; + case XFA_ATTRIBUTEENUM_1mod10_1mod11: + break; + case XFA_ATTRIBUTEENUM_2mod10: + break; + default: + break; + } + } + return FALSE; +} +FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_DataLength(FX_INT32& val) +{ + CXFA_Node* pUIChild = GetUIChild(); + CFX_WideString wsDataLength; + if(pUIChild->TryCData(XFA_ATTRIBUTE_DataLength, wsDataLength)) { + val = FXSYS_wtoi(wsDataLength); + return TRUE; + } + return FALSE; +} +FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_StartChar(FX_CHAR& val) +{ + CXFA_Node* pUIChild = GetUIChild(); + CFX_WideStringC wsStartEndChar; + if(pUIChild->TryCData(XFA_ATTRIBUTE_StartChar, wsStartEndChar)) { + if(wsStartEndChar.GetLength()) { + val = (FX_CHAR)wsStartEndChar.GetAt(0); + return TRUE; + } + } + return FALSE; +} +FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_EndChar(FX_CHAR& val) +{ + CXFA_Node* pUIChild = GetUIChild(); + CFX_WideStringC wsStartEndChar; + if(pUIChild->TryCData(XFA_ATTRIBUTE_EndChar, wsStartEndChar)) { + if(wsStartEndChar.GetLength()) { + val = (FX_CHAR)wsStartEndChar.GetAt(0); + return TRUE; + } + } + return FALSE; +} +FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_ECLevel(FX_INT32& val) +{ + CXFA_Node* pUIChild = GetUIChild(); + CFX_WideString wsECLevel; + if(pUIChild->TryCData(XFA_ATTRIBUTE_ErrorCorrectionLevel, wsECLevel)) { + val = FXSYS_wtoi(wsECLevel); + return TRUE; + } + return FALSE; +} +FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_ModuleWidth(FX_INT32& val) +{ + CXFA_Node* pUIChild = GetUIChild(); + CXFA_Measurement mModuleWidthHeight; + if (pUIChild->TryMeasure(XFA_ATTRIBUTE_ModuleWidth, mModuleWidthHeight)) { + val = (FX_INT32)mModuleWidthHeight.ToUnit(XFA_UNIT_Pt); + return TRUE; + } + return FALSE; +} +FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_ModuleHeight(FX_INT32& val) +{ + CXFA_Node* pUIChild = GetUIChild(); + CXFA_Measurement mModuleWidthHeight; + if (pUIChild->TryMeasure(XFA_ATTRIBUTE_ModuleHeight, mModuleWidthHeight)) { + val = (FX_INT32)mModuleWidthHeight.ToUnit(XFA_UNIT_Pt); + return TRUE; + } + return FALSE; +} +FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_PrintChecksum(FX_BOOL& val) +{ + CXFA_Node* pUIChild = GetUIChild(); + FX_BOOL bPrintCheckDigit; + if(pUIChild->TryBoolean(XFA_ATTRIBUTE_PrintCheckDigit, bPrintCheckDigit)) { + val = bPrintCheckDigit; + return TRUE; + } + return FALSE; +} +FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_TextLocation(FX_INT32& val) +{ + CXFA_Node* pUIChild = GetUIChild(); + XFA_ATTRIBUTEENUM eTextLocation; + if (pUIChild->TryEnum(XFA_ATTRIBUTE_TextLocation, eTextLocation)) { + switch(eTextLocation) { + case XFA_ATTRIBUTEENUM_None: + val = BC_TEXT_LOC_NONE; + return TRUE; + case XFA_ATTRIBUTEENUM_Above: + val = BC_TEXT_LOC_ABOVE; + return TRUE; + case XFA_ATTRIBUTEENUM_Below: + val = BC_TEXT_LOC_BELOW; + return TRUE; + case XFA_ATTRIBUTEENUM_AboveEmbedded: + val = BC_TEXT_LOC_ABOVEEMBED; + return TRUE; + case XFA_ATTRIBUTEENUM_BelowEmbedded: + val = BC_TEXT_LOC_BELOWEMBED; + return TRUE; + default: + break; + } + } + return FALSE; +} +FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_Truncate(FX_BOOL& val) +{ + CXFA_Node* pUIChild = GetUIChild(); + FX_BOOL bTruncate; + if(pUIChild->TryBoolean(XFA_ATTRIBUTE_Truncate, bTruncate)) { + val = bTruncate; + return TRUE; + } + return FALSE; +} +FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_WideNarrowRatio(FX_FLOAT& val) +{ + CXFA_Node* pUIChild = GetUIChild(); + CFX_WideString wsWideNarrowRatio; + if (pUIChild->TryCData(XFA_ATTRIBUTE_WideNarrowRatio, wsWideNarrowRatio)) { + FX_STRSIZE ptPos = wsWideNarrowRatio.Find(':'); + FX_FLOAT fRatio = 0; + if(ptPos >= 0) { + fRatio = (FX_FLOAT)FXSYS_wtoi(wsWideNarrowRatio); + } else { + FX_INT32 fA, fB; + fA = FXSYS_wtoi(wsWideNarrowRatio.Left(ptPos)); + fB = FXSYS_wtoi(wsWideNarrowRatio.Mid(ptPos + 1)); + if(fB) { + fRatio = (FX_FLOAT)fA / fB; + } + } + val = fRatio; + return TRUE; + } + return FALSE; +} +void CXFA_WidgetData::GetPasswordChar(CFX_WideString &wsPassWord) +{ + CXFA_Node* pUIChild = GetUIChild(); + if (pUIChild) { + pUIChild->TryCData(XFA_ATTRIBUTE_PasswordChar, wsPassWord); + } else { + wsPassWord = XFA_GetAttributeDefaultValue_Cdata(XFA_ELEMENT_PasswordEdit, XFA_ATTRIBUTE_PasswordChar, XFA_XDPPACKET_Form); + } +} +FX_BOOL CXFA_WidgetData::IsAllowRichText() +{ + CXFA_Node* pUIChild = GetUIChild(); + FX_BOOL bValue = FALSE; + if (pUIChild && pUIChild->TryBoolean(XFA_ATTRIBUTE_AllowRichText, bValue, FALSE)) { + return bValue; + } + if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Value)) { + if (CXFA_Node* pChild = pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) { + return pChild->GetClassID() == XFA_ELEMENT_ExData; + } + } + return FALSE; +} +FX_BOOL CXFA_WidgetData::IsMultiLine() +{ + CXFA_Node* pUIChild = GetUIChild(); + if (pUIChild) { + return pUIChild->GetBoolean(XFA_ATTRIBUTE_MultiLine); + } + return XFA_GetAttributeDefaultValue_Boolean(XFA_ELEMENT_TextEdit, XFA_ATTRIBUTE_MultiLine, XFA_XDPPACKET_Form); +} +FX_INT32 CXFA_WidgetData::GetVerticalScrollPolicy() +{ + CXFA_Node* pUIChild = GetUIChild(); + if (pUIChild) { + return pUIChild->GetEnum(XFA_ATTRIBUTE_VScrollPolicy); + } + return XFA_GetAttributeDefaultValue_Enum(XFA_ELEMENT_TextEdit, XFA_ATTRIBUTE_VScrollPolicy, XFA_XDPPACKET_Form); +} +FX_INT32 CXFA_WidgetData::GetMaxChars(XFA_ELEMENT& eType) +{ + if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Value)) { + if (CXFA_Node* pChild = pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) { + switch(pChild->GetClassID()) { + case XFA_ELEMENT_Text: + eType = XFA_ELEMENT_Text; + return pChild->GetInteger(XFA_ATTRIBUTE_MaxChars); + case XFA_ELEMENT_ExData: { + eType = XFA_ELEMENT_ExData; + FX_INT32 iMax = pChild->GetInteger(XFA_ATTRIBUTE_MaxLength); + return iMax < 0 ? 0 : iMax; + } + default: + break; + } + } + } + return 0; +} +FX_BOOL CXFA_WidgetData::GetFracDigits(FX_INT32 &iFracDigits) +{ + if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Value)) { + if (CXFA_Node* pChild = pNode->GetChild(0, XFA_ELEMENT_Decimal)) { + return pChild->TryInteger(XFA_ATTRIBUTE_FracDigits, iFracDigits); + } + } + iFracDigits = -1; + return FALSE; +} +FX_BOOL CXFA_WidgetData::GetLeadDigits(FX_INT32 &iLeadDigits) +{ + if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Value)) { + if (CXFA_Node* pChild = pNode->GetChild(0, XFA_ELEMENT_Decimal)) { + return pChild->TryInteger(XFA_ATTRIBUTE_LeadDigits, iLeadDigits); + } + } + iLeadDigits = -1; + return FALSE; +} +static CFX_WideString XFA_NumericNormalize(const CFX_WideString &wsValue, IFX_Locale* pLocale) +{ + CFX_WideString wsDecimalSymbol; + if (pLocale) { + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsDecimalSymbol); + } + if (wsDecimalSymbol.IsEmpty()) { + wsDecimalSymbol = '.'; + } + CFX_WideString wsNewValue(wsValue); + wsNewValue.TrimLeft(L" "); + wsNewValue.TrimLeft(L"0"); + wsNewValue.TrimRight(L" "); + FX_INT32 iCount = wsNewValue.GetLength(); + if (iCount == 0) { + return FX_WSTRC(L"0"); + } + FX_INT32 iIndex = 0; + CFX_WideString wsRet; + FX_LPWSTR pRetBuffer = wsRet.GetBuffer(iCount); + FX_INT32 iDestCount = 0; + FX_INT32 i = 0; + if (wsNewValue[i] == L'-') { + pRetBuffer[iIndex++] = '-'; + } else if (wsNewValue[i] == L'+') { + i++; + } + FX_BOOL bHasPoint = FALSE; + FX_INT32 nCharStart = -1; + for ( ; i < iCount; i ++) { + FX_WCHAR wc = wsNewValue[i]; + if (XFA_IsDigit(wc)) { + if (nCharStart != -1) { + CFX_WideStringC wsChar((FX_LPCWSTR)wsNewValue + nCharStart, i - nCharStart); + if (wsChar == '.' || wsChar == wsDecimalSymbol) { + bHasPoint = TRUE; + nCharStart = -1; + } else { + pRetBuffer[0] = '0'; + iCount = 1; + break; + } + } + pRetBuffer[iIndex++] = wc; + continue; + } + if (bHasPoint) { + pRetBuffer[0] = '0'; + iCount = 1; + break; + } + if (nCharStart == -1) { + nCharStart = i; + pRetBuffer[iIndex++] = wc; + } + } + wsRet.ReleaseBuffer(iCount); + return wsRet; +} +CFX_WideString XFA_NumericLimit(const CFX_WideString &wsValue, FX_INT32 iLead, FX_INT32 iTread) +{ + if ((iLead == - 1) && (iTread == -1)) { + return wsValue; + } + CFX_WideString wsRet; + FX_INT32 iLead_ = 0, iTread_ = -1; + FX_INT32 iCount = wsValue.GetLength(); + if (iCount == 0) { + return wsValue; + } + FX_INT32 i = 0; + if (wsValue[i] == L'-') { + wsRet += L'-'; + i++; + } + for (; i < iCount; i ++) { + FX_WCHAR wc = wsValue[i]; + if (XFA_IsDigit(wc)) { + if (iLead >= 0) { + iLead_ ++; + if (iLead_ > iLead) { + return L"0"; + } + } else if (iTread_ >= 0) { + iTread_ ++; + if (iTread_ > iTread) { + if (iTread != -1) { + CFX_Decimal wsDeci = CFX_Decimal(wsValue); + wsDeci.SetScale(iTread); + wsRet = wsDeci; + } + return wsRet; + } + } + } else if (wc == L'.') { + iTread_ = 0; + iLead = -1; + } + wsRet += wc; + } + return wsRet; +} +FX_BOOL CXFA_WidgetData::SetValue(const CFX_WideString& wsValue, XFA_VALUEPICTURE eValueType) +{ + if (wsValue.IsEmpty()) { + SyncValue(wsValue, TRUE); + return TRUE; + } + CFX_WideString wsNewText(wsValue); + CFX_WideString wsPicture; + GetPictureContent(wsPicture, eValueType); + FX_BOOL bNormalizeNum = TRUE; + CXFA_Node* pNode = GetUIChild(); + if (!pNode) { + return TRUE; + } + XFA_ELEMENT uiType = pNode->GetClassID(); + if (!wsPicture.IsEmpty()) { + CXFA_LocaleMgr* pLocalMgr = m_pNode->GetDocument()->GetLocalMgr(); + IFX_Locale* pLocale = GetLocal(); + CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(this); + if (!widgetValue.ValidateValue(wsValue, wsPicture, pLocale, &wsPicture)) { + return FALSE; + } + widgetValue = CXFA_LocaleValue(widgetValue.GetType(), wsNewText, wsPicture, pLocale, pLocalMgr); + wsNewText = widgetValue.GetValue(); + if (uiType == XFA_ELEMENT_NumericEdit) { + FX_INT32 iLeadDigits = 0; + FX_INT32 iFracDigits = 0; + GetLeadDigits(iLeadDigits); + GetFracDigits(iFracDigits); + wsNewText = XFA_NumericLimit(wsNewText, iLeadDigits, iFracDigits); + bNormalizeNum = FALSE; + } + } + if (uiType == XFA_ELEMENT_NumericEdit && bNormalizeNum) { + if (wsNewText != FX_WSTRC(L"0")) { + FX_INT32 iLeadDigits = 0; + FX_INT32 iFracDigits = 0; + GetLeadDigits(iLeadDigits); + GetFracDigits(iFracDigits); + wsNewText = XFA_NumericLimit(wsNewText, iLeadDigits, iFracDigits); + } + } + SyncValue(wsNewText, TRUE); + return TRUE; +} +FX_BOOL CXFA_WidgetData::GetPictureContent(CFX_WideString &wsPicture, XFA_VALUEPICTURE ePicture) +{ + if (ePicture == XFA_VALUEPICTURE_Raw) { + return FALSE; + } + CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(this); + switch(ePicture) { + case XFA_VALUEPICTURE_Display: { + if (CXFA_Node* pFormat = m_pNode->GetChild(0, XFA_ELEMENT_Format)) { + if (CXFA_Node* pPicture = pFormat->GetChild(0, XFA_ELEMENT_Picture)) { + if (pPicture->TryContent(wsPicture)) { + return TRUE; + } + } + } + CFX_WideString wsDataPicture, wsTimePicture; + IFX_Locale* pLocale = GetLocal(); + if (!pLocale) { + return FALSE; + } + FX_DWORD dwType = widgetValue.GetType(); + switch (dwType) { + case XFA_VT_DATE: + pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium, wsPicture); + break; + case XFA_VT_TIME: + pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium, wsPicture); + break; + case XFA_VT_DATETIME: + pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium, wsDataPicture); + pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium, wsTimePicture); + wsPicture = wsDataPicture + FX_WSTRC(L"T") + wsTimePicture; + break; + case XFA_VT_DECIMAL: + case XFA_VT_FLOAT: + break; + default: + break; + } + } + return TRUE; + case XFA_VALUEPICTURE_Edit: { + CXFA_Node* pUI = m_pNode->GetChild(0, XFA_ELEMENT_Ui); + if (pUI) { + if (CXFA_Node* pPicture = pUI->GetChild(0, XFA_ELEMENT_Picture)) { + if (pPicture->TryContent(wsPicture)) { + return TRUE; + } + } + } + { + CFX_WideString wsDataPicture, wsTimePicture; + IFX_Locale* pLocale = GetLocal(); + if (!pLocale) { + return FALSE; + } + FX_DWORD dwType = widgetValue.GetType(); + switch (dwType) { + case XFA_VT_DATE: + pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Short, wsPicture); + break; + case XFA_VT_TIME: + pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Short, wsPicture); + break; + case XFA_VT_DATETIME: + pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Short, wsDataPicture); + pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Short, wsTimePicture); + wsPicture = wsDataPicture + L"T" + wsTimePicture; + break; + default: + break; + } + } + } + return TRUE; + case XFA_VALUEPICTURE_DataBind: { + if (CXFA_Bind bind = GetBind()) { + bind.GetPicture(wsPicture); + return TRUE; + } + } + break; + default: + break; + } + return FALSE; +} +IFX_Locale* CXFA_WidgetData::GetLocal() +{ + IFX_Locale* pLocale = NULL; + if (!m_pNode) { + return pLocale; + } + FX_BOOL bLocale = FALSE; + CFX_WideString wsLocaleName; + bLocale = m_pNode->GetLocaleName(wsLocaleName); + if (bLocale) { + if (wsLocaleName.Equal(FX_WSTRC(L"ambient"))) { + pLocale = m_pNode->GetDocument()->GetLocalMgr()->GetDefLocale(); + } else { + pLocale = m_pNode->GetDocument()->GetLocalMgr()->GetLocaleByName(wsLocaleName); + } + } + return pLocale; +} +static FX_BOOL XFA_SplitDateTime(const CFX_WideString& wsDateTime, CFX_WideString& wsDate, CFX_WideString& wsTime) +{ + wsDate = L""; + wsTime = L""; + if (wsDateTime.IsEmpty()) { + return FALSE; + } + int nSplitIndex = -1; + nSplitIndex = wsDateTime.Find('T'); + if (nSplitIndex < 0) { + nSplitIndex = wsDateTime.Find(' '); + } + if (nSplitIndex < 0) { + return FALSE; + } + wsDate = wsDateTime.Left(nSplitIndex); + if (!wsDate.IsEmpty()) { + FX_INT32 iCount = wsDate.GetLength(); + FX_INT32 i = 0; + for (i = 0; i < iCount; i++) { + if (wsDate[i] >= '0' && wsDate[i] <= '9') { + break; + } + } + if (i == iCount) { + return FALSE; + } + } + wsTime = wsDateTime.Right(wsDateTime.GetLength() - nSplitIndex - 1); + if (!wsTime.IsEmpty()) { + FX_INT32 iCount = wsTime.GetLength(); + FX_INT32 i = 0; + for (i = 0; i < iCount; i++) { + if (wsTime[i] >= '0' && wsTime[i] <= '9') { + break; + } + } + if (i == iCount) { + return FALSE; + } + } + return TRUE; +} +#ifndef XFA_PARSE_HAS_LINEIDENTIFIER +FX_BOOL CXFA_FieldNode_IsRichTextEdit(CXFA_Node *pFieldNode, IFDE_XMLNode *&pXMLNode) +{ + FX_BOOL bRichTextEdit = FALSE; + pXMLNode = NULL; + if (pFieldNode->GetClassID() == XFA_ELEMENT_Field) { + CXFA_Node* pValue = pFieldNode->GetChild(0, XFA_ELEMENT_Value); + if (!pValue) { + return bRichTextEdit; + } + CXFA_Node* pChildValue = pValue->GetNodeItem(XFA_NODEITEM_FirstChild); + if (!pChildValue) { + return bRichTextEdit; + } + if (pChildValue->GetClassID() == XFA_ELEMENT_ExData) { + CFX_WideString wsContentType; + pChildValue->GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType, FALSE); + bRichTextEdit = wsContentType.Equal(FX_WSTRC(L"text/html")); + if(bRichTextEdit) { + FX_BOOL bXMLInData = FALSE; + CXFA_Node *pDataNode = pFieldNode->GetBindData(); + if (pDataNode) { + IFDE_XMLNode *pBindXML = pDataNode->GetXMLMappingNode(); + FXSYS_assert(pBindXML); + IFDE_XMLNode *pValueXML = pBindXML->GetNodeItem(IFDE_XMLNode::FirstChild); + if (pValueXML && pValueXML->GetType() == FDE_XMLNODE_Element) { + pXMLNode = pValueXML; + bXMLInData = TRUE; + } + } + if (!bXMLInData) { + pXMLNode = pChildValue->GetXMLMappingNode(); + } + } + } + } + return bRichTextEdit; +} +#endif +FX_BOOL CXFA_WidgetData::GetValue(CFX_WideString &wsValue, XFA_VALUEPICTURE eValueType) +{ +#ifdef XFA_PARSE_HAS_LINEIDENTIFIER + wsValue = m_pNode->GetContent(); +#else + IFDE_XMLNode *pXMLNode = NULL; + FX_BOOL bRichTextEdit = CXFA_FieldNode_IsRichTextEdit(m_pNode, pXMLNode); + if (bRichTextEdit) { + XFA_GetPlainTextFromRichText(pXMLNode, wsValue); + } else { + wsValue = m_pNode->GetContent(); + } +#endif + if (eValueType == XFA_VALUEPICTURE_Display) { + GetItemLabel(wsValue, wsValue); + } + CFX_WideString wsPicture; + GetPictureContent(wsPicture, eValueType); + CXFA_Node* pNode = GetUIChild(); + if (!pNode) { + return TRUE; + } + XFA_ELEMENT uiType = GetUIChild()->GetClassID(); + switch(uiType) { + case XFA_ELEMENT_ChoiceList: { + if (eValueType == XFA_VALUEPICTURE_Display) { + FX_INT32 iSelItemIndex = GetSelectedItem(0); + if (iSelItemIndex >= 0) { + GetChoiceListItem(wsValue, iSelItemIndex); + wsPicture.Empty(); + } + } + } + break; + case XFA_ELEMENT_NumericEdit: + if(eValueType != XFA_VALUEPICTURE_Raw && wsPicture.IsEmpty()) { + IFX_Locale* pLocale = GetLocal(); + if (eValueType == XFA_VALUEPICTURE_Display && pLocale) { + CFX_WideString wsOutput; + NormalizeNumStr(wsValue, wsOutput); + FormatNumStr(wsOutput, pLocale, wsOutput); + wsValue = wsOutput; + } + } + break; + default: + break; + } + if(wsPicture.IsEmpty()) { + return TRUE; + } + if (IFX_Locale* pLocale = GetLocal()) { + CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(this); + CXFA_LocaleMgr *pLocalMgr = m_pNode->GetDocument()->GetLocalMgr(); + switch (widgetValue.GetType()) { + case XFA_VT_DATE: { + CFX_WideString wsDate, wsTime; + if (XFA_SplitDateTime(wsValue, wsDate, wsTime)) { + CXFA_LocaleValue date(XFA_VT_DATE, wsDate, pLocalMgr); + if (date.FormatPatterns(wsValue, wsPicture, pLocale, eValueType)) { + return TRUE; + } + } + break; + } + case XFA_VT_TIME: { + CFX_WideString wsDate, wsTime; + if (XFA_SplitDateTime(wsValue, wsDate, wsTime)) { + CXFA_LocaleValue time(XFA_VT_TIME, wsTime, pLocalMgr); + if (time.FormatPatterns(wsValue, wsPicture, pLocale, eValueType)) { + return TRUE; + } + } + break; + } + default: + break; + } + widgetValue.FormatPatterns(wsValue, wsPicture, pLocale, eValueType); + } + return TRUE; +} +FX_BOOL CXFA_WidgetData::GetNormalizeDataValue(FX_WSTR wsValue, CFX_WideString &wsNormalizeValue) +{ + wsNormalizeValue = wsValue; + if (wsValue.IsEmpty()) { + return TRUE; + } + CFX_WideString wsPicture; + GetPictureContent(wsPicture, XFA_VALUEPICTURE_DataBind); + if (wsPicture.IsEmpty()) { + return TRUE; + } + FXSYS_assert(GetNode()); + CXFA_LocaleMgr* pLocalMgr = GetNode()->GetDocument()->GetLocalMgr(); + IFX_Locale* pLocale = GetLocal(); + CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(this); + if (widgetValue.ValidateValue(wsValue, wsPicture, pLocale, &wsPicture)) { + widgetValue = CXFA_LocaleValue(widgetValue.GetType(), wsNormalizeValue, wsPicture, pLocale, pLocalMgr); + wsNormalizeValue = widgetValue.GetValue(); + return TRUE; + } + return FALSE; +} +FX_BOOL CXFA_WidgetData::GetFormatDataValue(FX_WSTR wsValue, CFX_WideString &wsFormatedValue) +{ + wsFormatedValue = wsValue; + if (wsValue.IsEmpty()) { + return TRUE; + } + CFX_WideString wsPicture; + GetPictureContent(wsPicture, XFA_VALUEPICTURE_DataBind); + if (wsPicture.IsEmpty()) { + return TRUE; + } + if (IFX_Locale* pLocale = GetLocal()) { + FXSYS_assert(GetNode()); + CXFA_Node* pNodeValue = GetNode()->GetChild(0, XFA_ELEMENT_Value); + if (!pNodeValue) { + return FALSE; + } + CXFA_Node* pValueChild = pNodeValue->GetNodeItem(XFA_NODEITEM_FirstChild); + if (!pValueChild) { + return FALSE; + } + FX_INT32 iVTType = XFA_VT_NULL; + XFA_ELEMENT eType = pValueChild->GetClassID(); + switch (eType) { + case XFA_ELEMENT_Decimal: + iVTType = XFA_VT_DECIMAL; + break; + case XFA_ELEMENT_Float: + iVTType = XFA_VT_FLOAT; + break; + case XFA_ELEMENT_Date: + iVTType = XFA_VT_DATE; + break; + case XFA_ELEMENT_Time: + iVTType = XFA_VT_TIME; + break; + case XFA_ELEMENT_DateTime: + iVTType = XFA_VT_DATETIME; + break; + case XFA_ELEMENT_Boolean: + iVTType = XFA_VT_BOOLEAN; + break; + case XFA_ELEMENT_Integer: + iVTType = XFA_VT_INTEGER; + break; + case XFA_ELEMENT_Text: + iVTType = XFA_VT_TEXT; + break; + default: + iVTType = XFA_VT_NULL; + break; + } + CXFA_LocaleMgr *pLocalMgr = GetNode()->GetDocument()->GetLocalMgr(); + CXFA_LocaleValue widgetValue(iVTType, wsValue, pLocalMgr); + switch (widgetValue.GetType()) { + case XFA_VT_DATE: { + CFX_WideString wsDate, wsTime; + if (XFA_SplitDateTime(wsValue, wsDate, wsTime)) { + CXFA_LocaleValue date(XFA_VT_DATE, wsDate, pLocalMgr); + if (date.FormatPatterns(wsFormatedValue, wsPicture, pLocale, XFA_VALUEPICTURE_DataBind)) { + return TRUE; + } + } + break; + } + case XFA_VT_TIME: { + CFX_WideString wsDate, wsTime; + if (XFA_SplitDateTime(wsValue, wsDate, wsTime)) { + CXFA_LocaleValue time(XFA_VT_TIME, wsTime, pLocalMgr); + if (time.FormatPatterns(wsFormatedValue, wsPicture, pLocale, XFA_VALUEPICTURE_DataBind)) { + return TRUE; + } + } + break; + } + default: + break; + } + widgetValue.FormatPatterns(wsFormatedValue, wsPicture, pLocale, XFA_VALUEPICTURE_DataBind); + } + return FALSE; +} +void CXFA_WidgetData::NormalizeNumStr(const CFX_WideString& wsValue, CFX_WideString& wsOutput) +{ + if (wsValue.IsEmpty()) { + return; + } + wsOutput = wsValue; + wsOutput.TrimLeft('0'); + FX_INT32 dot_index = wsOutput.Find('.'); + FX_INT32 iFracDigits = 0; + if (!wsOutput.IsEmpty() && dot_index >= 0 && (!GetFracDigits(iFracDigits) || iFracDigits != -1)) { + wsOutput.TrimRight((FX_LPCWSTR)L"0"); + wsOutput.TrimRight((FX_LPCWSTR)L"."); + } + if (wsOutput.IsEmpty() || wsOutput[0] == '.') { + wsOutput.Insert(0, '0'); + } +} +void CXFA_WidgetData::FormatNumStr(const CFX_WideString& wsValue, IFX_Locale* pLocale, CFX_WideString& wsOutput) +{ + if (wsValue.IsEmpty()) { + return; + } + CFX_WideString wsSrcNum = wsValue; + CFX_WideString wsGroupSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Grouping, wsGroupSymbol); + FX_BOOL bNeg = FALSE; + if (wsSrcNum[0] == '-') { + bNeg = TRUE; + wsSrcNum.Delete(0, 1); + } + FX_INT32 len = wsSrcNum.GetLength(); + FX_INT32 dot_index = wsSrcNum.Find('.'); + if (dot_index == -1) { + dot_index = len; + } + FX_INT32 cc = dot_index - 1; + if (cc >= 0) { + int nPos = dot_index % 3; + wsOutput.Empty(); + for (FX_INT32 i = 0; i < dot_index; i++) { + if (i % 3 == nPos && i != 0) { + wsOutput += wsGroupSymbol; + } + wsOutput += wsSrcNum[i]; + } + if (dot_index < len) { + CFX_WideString wsSymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsSymbol); + wsOutput += wsSymbol; + wsOutput += wsSrcNum.Right(len - dot_index - 1); + } + if (bNeg) { + CFX_WideString wsMinusymbol; + pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusymbol); + wsOutput = wsMinusymbol + wsOutput; + } + } +} +void CXFA_WidgetData::SyncValue(const CFX_WideString& wsValue, FX_BOOL bNotify) +{ + if (!m_pNode) { + return; + } + CFX_WideString wsFormatValue(wsValue); + CXFA_WidgetData* pContainerWidgetData = m_pNode->GetContainerWidgetData(); + if (pContainerWidgetData) { + pContainerWidgetData->GetFormatDataValue(wsValue, wsFormatValue); + } + m_pNode->SetContent(wsValue, wsFormatValue, bNotify); +} +void CXFA_WidgetData::InsertListTextItem(CXFA_Node* pItems, FX_WSTR wsText, FX_INT32 nIndex ) +{ + CXFA_Node* pText = pItems->CreateSamePacketNode(XFA_ELEMENT_Text); + pItems->InsertChild(nIndex, pText); + pText->SetContent(wsText, wsText, FALSE, FALSE, FALSE); +} +CXFA_Filter CXFA_WidgetData::GetFilter(FX_BOOL bModified) +{ + if (!m_pUiChildNode) { + return CXFA_Filter(NULL); + } + return m_pUiChildNode->GetProperty(0, XFA_ELEMENT_Filter, bModified); +} +CXFA_Manifest CXFA_WidgetData::GetManifest(FX_BOOL bModified) +{ + if (!m_pUiChildNode) { + return CXFA_Manifest(NULL); + } + return m_pUiChildNode->GetProperty(0, XFA_ELEMENT_Manifest, bModified); +} +CXFA_Occur::CXFA_Occur(CXFA_Node *pNode) : CXFA_Data(pNode) +{ } +FX_INT32 CXFA_Occur::GetMax() +{ + FX_INT32 iMax = 1; + if (m_pNode) { + if(!m_pNode->TryInteger(XFA_ATTRIBUTE_Max, iMax, TRUE)) { + iMax = GetMin(); + } + } + return iMax; +} +FX_INT32 CXFA_Occur::GetMin() +{ + FX_INT32 iMin = 1; + if (m_pNode) { + if(!m_pNode->TryInteger(XFA_ATTRIBUTE_Min, iMin, TRUE) || iMin < 0) { + iMin = 1; + } + } + return iMin; +} +FX_INT32 CXFA_Occur::GetInitial() +{ + FX_INT32 iInit = 1; + if (m_pNode) { + FX_INT32 iMin = GetMin(); + if(!m_pNode->TryInteger(XFA_ATTRIBUTE_Initial, iInit, TRUE) || iInit < iMin) { + iInit = iMin; + } + } + return iInit; +} +FX_BOOL CXFA_Occur::GetOccurInfo(FX_INT32& iMin, FX_INT32& iMax, FX_INT32& iInit) +{ + if(!m_pNode) { + return FALSE; + } + if(!m_pNode->TryInteger(XFA_ATTRIBUTE_Min, iMin, FALSE) || iMin < 0) { + iMin = 1; + } + if(!m_pNode->TryInteger(XFA_ATTRIBUTE_Max, iMax, FALSE)) { + if(iMin == 0) { + iMax = 1; + } else { + iMax = iMin; + } + } + if(!m_pNode->TryInteger(XFA_ATTRIBUTE_Initial, iInit, FALSE) || iInit < iMin) { + iInit = iMin; + } + return TRUE; +} +void CXFA_Occur::SetMax(FX_INT32 iMax) +{ + iMax = (iMax != -1 && iMax < 1) ? 1 : iMax; + m_pNode->SetInteger(XFA_ATTRIBUTE_Max, iMax, FALSE); + FX_INT32 iMin = GetMin(); + if (iMax != -1 && iMax < iMin) { + iMin = iMax; + m_pNode->SetInteger(XFA_ATTRIBUTE_Min, iMin, FALSE); + } +} +void CXFA_Occur::SetMin(FX_INT32 iMin) +{ + iMin = (iMin < 0) ? 1 : iMin; + m_pNode->SetInteger(XFA_ATTRIBUTE_Min, iMin, FALSE); + FX_INT32 iMax = GetMax(); + if (iMax > 0 && iMax < iMin) { + iMax = iMin; + m_pNode->SetInteger(XFA_ATTRIBUTE_Max, iMax, FALSE); + } +} +XFA_ATTRIBUTEENUM XFA_GetEnumTypeAttribute(CXFA_Node* pNode, XFA_ATTRIBUTE attributeValue = XFA_ATTRIBUTE_Type, XFA_ATTRIBUTEENUM eDefaultValue = XFA_ATTRIBUTEENUM_Optional) +{ + XFA_ATTRIBUTEENUM eType = eDefaultValue; + if (pNode) { + if (!pNode->TryEnum(attributeValue, eType, TRUE)) { + eType = eDefaultValue; + } + } + return eType; +} +CFX_WideString CXFA_Filter::GetFilterString(XFA_ATTRIBUTE eAttribute) +{ + CFX_WideString wsStringValue; + if (m_pNode) { + m_pNode->GetAttribute(eAttribute, wsStringValue, FALSE); + } + return wsStringValue; +} +XFA_ATTRIBUTEENUM CXFA_Filter::GetAppearanceFilterType() +{ + if (!m_pNode) { + return XFA_ATTRIBUTEENUM_Optional; + } + CXFA_Node* pAppearanceFilterNode = m_pNode->GetProperty(0, XFA_ELEMENT_AppearanceFilter); + return XFA_GetEnumTypeAttribute(pAppearanceFilterNode); +} +CFX_WideString CXFA_Filter::GetAppearanceFilterContent() +{ + CFX_WideString wsContent; + if (m_pNode) { + CXFA_Node* pAppearanceFilterNode = m_pNode->GetProperty(0, XFA_ELEMENT_AppearanceFilter); + pAppearanceFilterNode->TryContent(wsContent); + } + return wsContent; +} +XFA_ATTRIBUTEENUM CXFA_Filter::GetCertificatesCredentialServerPolicy() +{ + if (!m_pNode) { + return XFA_ATTRIBUTEENUM_Optional; + } + CXFA_Node* pCertsNode = m_pNode->GetProperty(0, XFA_ELEMENT_Certificates); + return XFA_GetEnumTypeAttribute(pCertsNode, XFA_ATTRIBUTE_CredentialServerPolicy); +} +CFX_WideString CXFA_Filter::GetCertificatesURL() +{ + CFX_WideString wsURL; + if (m_pNode) { + CXFA_Node* pCertsNode = m_pNode->GetProperty(0, XFA_ELEMENT_Certificates); + pCertsNode->GetAttribute(XFA_ATTRIBUTE_Url, wsURL, FALSE); + } + return wsURL; +} +CFX_WideString CXFA_Filter::GetCertificatesURLPolicy() +{ + CFX_WideString wsURLPolicy; + if (m_pNode) { + CXFA_Node* pCertsNode = m_pNode->GetProperty(0, XFA_ELEMENT_Certificates); + pCertsNode->GetAttribute(XFA_ATTRIBUTE_UrlPolicy, wsURLPolicy, FALSE); + } + return wsURLPolicy; +} +CXFA_WrapCertificate CXFA_Filter::GetCertificatesEncryption(FX_BOOL bModified) +{ + if (!m_pNode) { + return CXFA_WrapCertificate(NULL); + } + CXFA_Node* pCertsNode = m_pNode->GetProperty(0, XFA_ELEMENT_Certificates, bModified); + return CXFA_WrapCertificate(pCertsNode ? pCertsNode->GetProperty(0, XFA_ELEMENT_Encryption, bModified) : NULL); +} +CXFA_WrapCertificate CXFA_Filter::GetCertificatesIssuers(FX_BOOL bModified ) +{ + if (!m_pNode) { + return CXFA_WrapCertificate(NULL); + } + CXFA_Node* pCertsNode = m_pNode->GetProperty(0, XFA_ELEMENT_Certificates, bModified); + return CXFA_WrapCertificate(pCertsNode ? pCertsNode->GetProperty(0, XFA_ELEMENT_Issuers, bModified) : NULL); +} +CFX_WideString CXFA_Filter::GetCertificatesKeyUsageString(XFA_ATTRIBUTE eAttribute) +{ + if (!m_pNode) { + return FX_WSTRC(L""); + } + CXFA_Node* pCertsNode = m_pNode->GetProperty(0, XFA_ELEMENT_Certificates); + CXFA_Node* pKeyUsageNode = pCertsNode->GetProperty(0, XFA_ELEMENT_KeyUsage); + CFX_WideString wsAttributeValue; + pKeyUsageNode->GetAttribute(eAttribute, wsAttributeValue, FALSE); + return wsAttributeValue; +} +CXFA_Oids CXFA_Filter::GetCertificatesOids() +{ + if (!m_pNode) { + return CXFA_Oids(NULL); + } + CXFA_Node* pCertsNode = m_pNode->GetProperty(0, XFA_ELEMENT_Certificates); + return CXFA_Oids(pCertsNode ? pCertsNode->GetProperty(0, XFA_ELEMENT_Oids) : NULL); +} +CXFA_WrapCertificate CXFA_Filter::GetCertificatesSigning(FX_BOOL bModified ) +{ + if (!m_pNode) { + return CXFA_WrapCertificate(NULL); + } + CXFA_Node* pCertsNode = m_pNode->GetProperty(0, XFA_ELEMENT_Certificates, bModified); + return CXFA_WrapCertificate(pCertsNode ? pCertsNode->GetProperty(0, XFA_ELEMENT_Signing, bModified) : NULL); +} +CXFA_DigestMethods CXFA_Filter::GetDigestMethods(FX_BOOL bModified ) +{ + return CXFA_DigestMethods(m_pNode ? m_pNode->GetProperty(0, XFA_ELEMENT_DigestMethods, bModified) : NULL); +} +CXFA_Encodings CXFA_Filter::GetEncodings(FX_BOOL bModified ) +{ + return CXFA_Encodings(m_pNode ? m_pNode->GetProperty(0, XFA_ELEMENT_Encodings, bModified) : NULL); +} +CXFA_EncryptionMethods CXFA_Filter::GetEncryptionMethods(FX_BOOL bModified ) +{ + return CXFA_EncryptionMethods(m_pNode ? m_pNode->GetProperty(0, XFA_ELEMENT_EncryptionMethods, bModified) : NULL); +} +XFA_ATTRIBUTEENUM CXFA_Filter::GetHandlerType() +{ + if (!m_pNode) { + return XFA_ATTRIBUTEENUM_Optional; + } + CXFA_Node* pHandlerNode = m_pNode->GetProperty(0, XFA_ELEMENT_Handler); + return XFA_GetEnumTypeAttribute(pHandlerNode); +} +CFX_WideString CXFA_Filter::GetHandlerContent() +{ + CFX_WideString wsContent; + if (m_pNode) { + CXFA_Node* pHandlerNode = m_pNode->GetProperty(0, XFA_ELEMENT_Handler); + pHandlerNode->TryContent(wsContent); + } + return wsContent; +} +XFA_ATTRIBUTEENUM CXFA_Filter::GetlockDocumentType() +{ + if (!m_pNode) { + return XFA_ATTRIBUTEENUM_Optional; + } + CXFA_Node* pLockDocNode = m_pNode->GetProperty(0, XFA_ELEMENT_LockDocument); + return XFA_GetEnumTypeAttribute(pLockDocNode); +} +CFX_WideString CXFA_Filter::GetlockDocumentContent() +{ + CFX_WideString wsContent = FX_WSTRC(L"auto"); + if (m_pNode) { + CXFA_Node* pLockDocNode = m_pNode->GetProperty(0, XFA_ELEMENT_LockDocument); + pLockDocNode->TryContent(wsContent); + } + return wsContent; +} +FX_INT32 CXFA_Filter::GetMDPPermissions() +{ + FX_INT32 iPermissions = 2; + if (m_pNode) { + CXFA_Node* pMDPNode = m_pNode->GetProperty(0, XFA_ELEMENT_Mdp); + if (!pMDPNode->TryInteger(XFA_ATTRIBUTE_Permissions, iPermissions, TRUE)) { + iPermissions = 2; + } + } + return iPermissions; +} +XFA_ATTRIBUTEENUM CXFA_Filter::GetMDPSignatureType() +{ + if (!m_pNode) { + return XFA_ATTRIBUTEENUM_Filter; + } + CXFA_Node* pMDPNode = m_pNode->GetProperty(0, XFA_ELEMENT_Mdp); + return XFA_GetEnumTypeAttribute(pMDPNode, XFA_ATTRIBUTE_SignatureType, XFA_ATTRIBUTEENUM_Filter); +} +CXFA_Reasons CXFA_Filter::GetReasons(FX_BOOL bModified ) +{ + return CXFA_Reasons(m_pNode ? m_pNode->GetProperty(0, XFA_ELEMENT_Reasons) : NULL); +} +CFX_WideString CXFA_Filter::GetTimeStampServer() +{ + CFX_WideString wsServerURI; + if (m_pNode) { + CXFA_Node* pTimeStampNode = m_pNode->GetProperty(0, XFA_ELEMENT_TimeStamp); + pTimeStampNode->GetAttribute(XFA_ATTRIBUTE_Server, wsServerURI, FALSE); + } + return wsServerURI; +} +XFA_ATTRIBUTEENUM CXFA_Filter::GetTimeStampType() +{ + if (!m_pNode) { + return XFA_ATTRIBUTEENUM_Optional; + } + CXFA_Node* pTimeStampNode = m_pNode->GetProperty(0, XFA_ELEMENT_TimeStamp); + return XFA_GetEnumTypeAttribute(pTimeStampNode); +} +CFX_WideString CXFA_Certificate::GetCertificateName() +{ + CFX_WideString wsName; + if (m_pNode) { + m_pNode->GetAttribute(XFA_ATTRIBUTE_Name, wsName, FALSE); + } + return wsName; +} +CFX_WideString CXFA_Certificate::GetCertificateContent() +{ + CFX_WideString wsContent; + if (m_pNode) { + m_pNode->TryContent(wsContent); + } + return wsContent; +} +XFA_ATTRIBUTEENUM CXFA_WrapCertificate::GetType() +{ + return XFA_GetEnumTypeAttribute(m_pNode); +} +FX_INT32 CXFA_WrapCertificate::CountCertificates() +{ + return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_Certificate) : 0; +} +CXFA_Certificate CXFA_WrapCertificate::GetCertificate(FX_INT32 nIndex) +{ + return CXFA_Certificate((nIndex > -1 && m_pNode) ? m_pNode->GetChild(nIndex, XFA_ELEMENT_Certificate) : NULL); +} +XFA_ATTRIBUTEENUM CXFA_Oids::GetOidsType() +{ + return XFA_GetEnumTypeAttribute(m_pNode); +} +FX_INT32 CXFA_Oids::CountOids() +{ + return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_Oid) : 0; +} +CFX_WideString CXFA_Oids::GetOidContent(FX_INT32 nIndex) +{ + if (nIndex <= -1 || !m_pNode) { + return FX_WSTRC(L""); + } + CXFA_Node* pOidNode = m_pNode->GetChild(nIndex, XFA_ELEMENT_Oid); + if (!pOidNode) { + return FX_WSTRC(L""); + } + CFX_WideString wsContent; + pOidNode->TryContent(wsContent); + return wsContent; +} +XFA_ATTRIBUTEENUM CXFA_SubjectDNs::GetSubjectDNsType() +{ + return XFA_GetEnumTypeAttribute(m_pNode); +} +FX_INT32 CXFA_SubjectDNs::CountSubjectDNs() +{ + return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_SubjectDN) : 0; +} +CFX_WideString CXFA_SubjectDNs::GetSubjectDNString(FX_INT32 nIndex, XFA_ATTRIBUTE eAttribute) +{ + if (nIndex <= -1 || !m_pNode) { + return FX_WSTRC(L""); + } + CXFA_Node* pSubjectDNNode = m_pNode->GetChild(nIndex, XFA_ELEMENT_SubjectDN); + if (!pSubjectDNNode) { + return FX_WSTRC(L""); + } + CFX_WideString wsAttributeValue; + pSubjectDNNode->GetAttribute(eAttribute, wsAttributeValue, FALSE); + return wsAttributeValue; +} +CFX_WideString CXFA_SubjectDNs::GetSubjectDNContent(FX_INT32 nIndex) +{ + if (nIndex <= -1 || !m_pNode) { + return FX_WSTRC(L""); + } + CXFA_Node* pSubjectDNNode = m_pNode->GetChild(nIndex, XFA_ELEMENT_SubjectDN); + if (!pSubjectDNNode) { + return FX_WSTRC(L""); + } + CFX_WideString wsContent; + pSubjectDNNode->TryContent(wsContent); + return wsContent; +} +XFA_ATTRIBUTEENUM CXFA_DigestMethods::GetDigestMethodsType() +{ + return XFA_GetEnumTypeAttribute(m_pNode); +} +FX_INT32 CXFA_DigestMethods::CountDigestMethods() +{ + return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_DigestMethod) : 0; +} +CFX_WideString CXFA_DigestMethods::GetDigestMethodContent(FX_INT32 nIndex) +{ + if (nIndex <= -1 || !m_pNode) { + return FX_WSTRC(L""); + } + CXFA_Node* pDigestMethodNode = m_pNode->GetChild(nIndex, XFA_ELEMENT_DigestMethod); + if (!pDigestMethodNode) { + return FX_WSTRC(L""); + } + CFX_WideString wsContent; + pDigestMethodNode->TryContent(wsContent); + return wsContent; +} +XFA_ATTRIBUTEENUM CXFA_Encodings::GetEncodingsType() +{ + return XFA_GetEnumTypeAttribute(m_pNode); +} +FX_INT32 CXFA_Encodings::CountEncodings() +{ + return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_Encoding) : 0; +} +CFX_WideString CXFA_Encodings::GetEncodingContent(FX_INT32 nIndex) +{ + if (nIndex <= -1 || !m_pNode) { + return FX_WSTRC(L""); + } + CXFA_Node* pEncodingNode = m_pNode->GetChild(nIndex, XFA_ELEMENT_Encoding); + if (!pEncodingNode) { + return FX_WSTRC(L""); + } + CFX_WideString wsContent; + pEncodingNode->TryContent(wsContent); + return wsContent; +} +XFA_ATTRIBUTEENUM CXFA_EncryptionMethods::GetEncryptionMethodsType() +{ + return XFA_GetEnumTypeAttribute(m_pNode); +} +FX_INT32 CXFA_EncryptionMethods::CountEncryptionMethods() +{ + return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_EncryptionMethod) : 0; +} +CFX_WideString CXFA_EncryptionMethods::GetEncryptionMethodContent(FX_INT32 nIndex) +{ + if (nIndex <= -1 || !m_pNode) { + return FX_WSTRC(L""); + } + CXFA_Node* pEncryMethodNode = m_pNode->GetChild(nIndex, XFA_ELEMENT_EncryptionMethod); + if (!pEncryMethodNode) { + return FX_WSTRC(L""); + } + CFX_WideString wsContent; + pEncryMethodNode->TryContent(wsContent); + return wsContent; +} +XFA_ATTRIBUTEENUM CXFA_Reasons::GetReasonsType() +{ + return XFA_GetEnumTypeAttribute(m_pNode); +} +FX_INT32 CXFA_Reasons::CountReasons() +{ + return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_Reason) : 0; +} +CFX_WideString CXFA_Reasons::GetReasonContent(FX_INT32 nIndex) +{ + if (nIndex <= -1 || !m_pNode) { + return FX_WSTRC(L""); + } + CXFA_Node* pReasonNode = m_pNode->GetChild(nIndex, XFA_ELEMENT_Reason); + if (!pReasonNode) { + return FX_WSTRC(L""); + } + CFX_WideString wsContent; + pReasonNode->TryContent(wsContent); + return wsContent; +} +XFA_ATTRIBUTEENUM CXFA_Manifest::GetAction() +{ + return XFA_GetEnumTypeAttribute(m_pNode, XFA_ATTRIBUTE_Action, XFA_ATTRIBUTEENUM_Include); +} +FX_INT32 CXFA_Manifest::CountReives() +{ + return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_Ref) : 0; +} +CFX_WideString CXFA_Manifest::GetRefContent(FX_INT32 nIndex) +{ + if (nIndex <= -1 || !m_pNode) { + return FX_WSTRC(L""); + } + CXFA_Node* pRefNode = m_pNode->GetChild(nIndex, XFA_ELEMENT_Ref); + if (!pRefNode) { + return FX_WSTRC(L""); + } + CFX_WideString wsContent; + pRefNode->TryContent(wsContent); + return wsContent; +} diff --git a/xfa/src/fxfa/src/parser/xfa_parser_imp.cpp b/xfa/src/fxfa/src/parser/xfa_parser_imp.cpp new file mode 100644 index 0000000000..14c3e669a1 --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_parser_imp.cpp @@ -0,0 +1,1421 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_utils.h" +#include "../common/xfa_object.h" +#include "../common/xfa_document.h" +#include "../common/xfa_parser.h" +#include "../common/xfa_script.h" +#include "../common/xfa_docdata.h" +#include "../common/xfa_doclayout.h" +#include "../common/xfa_debug.h" +#include "../common/xfa_localemgr.h" +#include "../common/xfa_fm2jsapi.h" +#include "xfa_debug_parser.h" +#include "xfa_basic_imp.h" +#include "xfa_parser_imp.h" +IXFA_Parser* IXFA_Parser::Create(IXFA_ObjFactory *pFactory, FX_BOOL bDocumentParser) +{ + return FX_NEW CXFA_SimpleParser(pFactory, bDocumentParser); +} +CXFA_SimpleParser::CXFA_SimpleParser(IXFA_ObjFactory *pFactory, FX_BOOL bDocumentParser ) + : m_pXMLParser(NULL) + , m_pXMLDoc(NULL) + , m_pStream(NULL) + , m_pFactory(pFactory) + , m_ePacketID(XFA_XDPPACKET_UNKNOWN) + , m_pRootNode(NULL) + , m_bDocumentParser(bDocumentParser) +{ +} +CXFA_SimpleParser::~CXFA_SimpleParser() +{ + CloseParser(); +} +void CXFA_SimpleParser::SetFactory(IXFA_ObjFactory* pFactory) +{ + m_pFactory = pFactory; +} +static IFDE_XMLNode* XFA_FDEExtension_GetDocumentNode(IFDE_XMLDoc *pXMLDoc, FX_BOOL bVerifyWellFormness = FALSE) +{ + if(!pXMLDoc) { + return NULL; + } + IFDE_XMLNode* pXMLFakeRoot = pXMLDoc->GetRoot(); + for(IFDE_XMLNode* pXMLNode = pXMLFakeRoot->GetNodeItem(IFDE_XMLNode::FirstChild); pXMLNode; pXMLNode = pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling)) { + if(pXMLNode->GetType() == FDE_XMLNODE_Element) { + if(bVerifyWellFormness) { + for(IFDE_XMLNode* pNextNode = pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling); pNextNode; pNextNode = pNextNode->GetNodeItem(IFDE_XMLNode::NextSibling)) { + if(pNextNode->GetType() == FDE_XMLNODE_Element) { + return FALSE; + } + } + } + return pXMLNode; + } + } + return NULL; +} +FX_INT32 CXFA_SimpleParser::StartParse(IFX_FileRead *pStream, XFA_XDPPACKET ePacketID) +{ + CloseParser(); + m_pFileRead = pStream; + m_pStream = IFX_Stream::CreateStream(pStream, FX_STREAMACCESS_Read | FX_STREAMACCESS_Text); + if (m_pStream == NULL) { + return XFA_PARSESTATUS_StreamErr; + } + FX_WORD wCodePage = m_pStream->GetCodePage(); + if (wCodePage != FX_CODEPAGE_UTF16LE && wCodePage != FX_CODEPAGE_UTF16BE && wCodePage != FX_CODEPAGE_UTF8) { + m_pStream->SetCodePage(FX_CODEPAGE_UTF8); + } + m_pXMLDoc = IFDE_XMLDoc::Create(); + if (m_pXMLDoc == NULL) { + return XFA_PARSESTATUS_StatusErr; + } + m_pXMLParser = FX_NEW CXFA_XMLParser(m_pXMLDoc->GetRoot(), m_pStream); + if (m_pXMLParser == NULL) { + return XFA_PARSESTATUS_StatusErr; + } + if (!m_pXMLDoc->LoadXML(m_pXMLParser)) { + return XFA_PARSESTATUS_StatusErr; + } + m_ePacketID = ePacketID; + return XFA_PARSESTATUS_Ready; +} +FX_INT32 CXFA_SimpleParser::DoParse(IFX_Pause *pPause) +{ + if (m_pXMLDoc == NULL || m_ePacketID == XFA_XDPPACKET_UNKNOWN) { + return XFA_PARSESTATUS_StatusErr; + } + FX_INT32 iRet = m_pXMLDoc->DoLoad(pPause); + if (iRet < 0) { + return XFA_PARSESTATUS_SyntaxErr; + } + if (iRet < 100) { + return iRet / 2; + } + m_pRootNode = ParseAsXDPPacket(XFA_FDEExtension_GetDocumentNode(m_pXMLDoc), m_ePacketID); + m_pXMLDoc->CloseXML(); + if (m_pStream) { + m_pStream->Release(); + m_pStream = NULL; + } + if(!m_pRootNode) { + return XFA_PARSESTATUS_StatusErr; + } + return XFA_PARSESTATUS_Done; +} +FX_INT32 CXFA_SimpleParser::ParseXMLData(const CFX_WideString &wsXML, IFDE_XMLNode* &pXMLNode, IFX_Pause *pPause) +{ + CloseParser(); + pXMLNode = NULL; + IFX_Stream* pStream = XFA_CreateWideTextRead(wsXML); + if (!pStream) { + return XFA_PARSESTATUS_StreamErr; + } + m_pStream = pStream; + m_pXMLDoc = IFDE_XMLDoc::Create(); + if (m_pXMLDoc == NULL) { + return XFA_PARSESTATUS_StatusErr; + } + CXFA_XMLParser *pParser = FX_NEW CXFA_XMLParser(m_pXMLDoc->GetRoot(), m_pStream); + if (pParser == NULL) { + return XFA_PARSESTATUS_StatusErr; + } +#ifdef _XFA_VERIFY_Checksum_ + pParser->m_dwCheckStatus = 0x03; +#endif + if (!m_pXMLDoc->LoadXML(pParser)) { + return XFA_PARSESTATUS_StatusErr; + } + FX_INT32 iRet = m_pXMLDoc->DoLoad(pPause); + if (iRet < 0 || iRet >= 100) { + m_pXMLDoc->CloseXML(); + } + if (iRet < 0) { + return XFA_PARSESTATUS_SyntaxErr; + } + if (iRet < 100) { + return iRet / 2; + } + if (m_pStream) { + m_pStream->Release(); + m_pStream = NULL; + } + pXMLNode = XFA_FDEExtension_GetDocumentNode(m_pXMLDoc); + return XFA_PARSESTATUS_Done; +} +void CXFA_SimpleParser::ConstructXFANode(CXFA_Node* pXFANode, IFDE_XMLNode* pXMLNode) +{ + XFA_XDPPACKET ePacketID = (XFA_XDPPACKET)pXFANode->GetPacketID(); + if (ePacketID == XFA_XDPPACKET_Datasets) { + if (pXFANode->GetClassID() == XFA_ELEMENT_DataValue) { + for (IFDE_XMLNode *pXMLChild = pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild); pXMLChild; pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) { + FDE_XMLNODETYPE eNodeType = pXMLChild->GetType(); + if(eNodeType == FDE_XMLNODE_Instruction) { + continue; + } + if (eNodeType == FDE_XMLNODE_Element) { + CXFA_Node *pXFAChild = m_pFactory->CreateNode(XFA_XDPPACKET_Datasets, XFA_ELEMENT_DataValue); + if (pXFAChild == NULL) { + return; + } + CFX_WideString wsNodeStr; + ((IFDE_XMLElement*)pXMLChild)->GetLocalTagName(wsNodeStr); + pXFAChild->SetCData(XFA_ATTRIBUTE_Name, wsNodeStr); + CFX_WideString wsChildValue; +#ifdef XFA_PARSE_HAS_LINEIDENTIFIER + XFA_GetPlainTextFromRichText((IFDE_XMLElement*)pXMLChild, wsChildValue); +#else + XFA_ConvertRichTextToPlainText((IFDE_XMLElement*)pXMLChild, wsChildValue); +#endif + if (!wsChildValue.IsEmpty()) { + pXFAChild->SetCData(XFA_ATTRIBUTE_Value, wsChildValue); + } + pXFANode->InsertChild(pXFAChild); + pXFAChild->SetXMLMappingNode(pXMLChild); + pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE); + break; + } + } + m_pRootNode = pXFANode; + } else { + m_pRootNode = DataLoader(pXFANode, pXMLNode, TRUE); + } + } else { + if (pXFANode->GetObjectType() == XFA_OBJECTTYPE_ContentNode) { + ParseContentNode(pXFANode, pXMLNode, ePacketID); + m_pRootNode = pXFANode; + } else { + m_pRootNode = NormalLoader(pXFANode, pXMLNode, ePacketID); + } + } +} +FX_BOOL XFA_FDEExtension_ResolveNamespaceQualifier(IFDE_XMLElement* pNode, FX_WSTR wsQualifier, CFX_WideString& wsNamespaceURI) +{ + if(!pNode) { + return FALSE; + } + IFDE_XMLNode* pFakeRoot = pNode->GetNodeItem(IFDE_XMLNode::Root); + CFX_WideString wsNSAttribute; + FX_BOOL bRet = FALSE; + if(wsQualifier.IsEmpty()) { + wsNSAttribute = FX_WSTRC(L"xmlns"); + bRet = TRUE; + } else { + wsNSAttribute = FX_WSTRC(L"xmlns:") + wsQualifier; + } + for(; pNode != pFakeRoot; pNode = (IFDE_XMLElement*)pNode->GetNodeItem(IFDE_XMLNode::Parent)) { + if(pNode->GetType() != FDE_XMLNODE_Element) { + continue; + } + if(pNode->HasAttribute(wsNSAttribute)) { + pNode->GetString(wsNSAttribute, wsNamespaceURI); + return TRUE; + } + } + wsNamespaceURI.Empty(); + return bRet; +} +static inline void XFA_FDEExtension_GetElementTagNamespaceURI(IFDE_XMLElement* pElement, CFX_WideString& wsNamespaceURI) +{ + CFX_WideString wsNodeStr; + pElement->GetNamespacePrefix(wsNodeStr); + if(!XFA_FDEExtension_ResolveNamespaceQualifier(pElement, wsNodeStr, wsNamespaceURI)) { + wsNamespaceURI.Empty(); + } +} +static FX_BOOL XFA_FDEExtension_MatchNodeName(IFDE_XMLNode* pNode, FX_WSTR wsLocalTagName, FX_WSTR wsNamespaceURIPrefix, FX_DWORD eMatchFlags = XFA_XDPPACKET_FLAGS_NOMATCH) +{ + if(!pNode || pNode->GetType() != FDE_XMLNODE_Element) { + return FALSE; + } + IFDE_XMLElement* pElement = reinterpret_cast(pNode); + CFX_WideString wsNodeStr; + pElement->GetLocalTagName(wsNodeStr); + if(wsNodeStr != wsLocalTagName) { + return FALSE; + } + XFA_FDEExtension_GetElementTagNamespaceURI(pElement, wsNodeStr); + if (eMatchFlags & XFA_XDPPACKET_FLAGS_NOMATCH) { + return TRUE; + } + if(eMatchFlags & XFA_XDPPACKET_FLAGS_PREFIXMATCH) { + return wsNodeStr.Left(wsNamespaceURIPrefix.GetLength()) == wsNamespaceURIPrefix; + } + return wsNodeStr == wsNamespaceURIPrefix; +} +static FX_BOOL XFA_FDEExtension_GetAttributeLocalName(FX_WSTR wsAttributeName, CFX_WideString& wsLocalAttrName) +{ + CFX_WideString wsAttrName(wsAttributeName); + FX_STRSIZE iFind = wsAttrName.Find(L':', 0); + if (iFind < 0) { + wsLocalAttrName = wsAttrName; + return FALSE; + } else { + wsLocalAttrName = wsAttrName.Right(wsAttrName.GetLength() - iFind - 1); + return TRUE; + } +} +static FX_BOOL XFA_FDEExtension_ResolveAttribute(IFDE_XMLElement *pElement, FX_WSTR wsAttributeName, CFX_WideString& wsLocalAttrName, CFX_WideString& wsNamespaceURI) +{ + CFX_WideString wsAttrName(wsAttributeName); + CFX_WideString wsNSPrefix; + if(XFA_FDEExtension_GetAttributeLocalName(wsAttributeName, wsLocalAttrName)) { + wsNSPrefix = wsAttrName.Left(wsAttributeName.GetLength() - wsLocalAttrName.GetLength() - 1); + } + if(wsLocalAttrName == FX_WSTRC(L"xmlns") || wsNSPrefix == FX_WSTRC(L"xmlns") || wsNSPrefix == FX_WSTRC(L"xml")) { + return FALSE; + } + if(!XFA_FDEExtension_ResolveNamespaceQualifier(pElement, wsNSPrefix, wsNamespaceURI)) { + wsNamespaceURI.Empty(); + return FALSE; + } + return TRUE; +} +static FX_BOOL XFA_FDEExtension_FindAttributeWithNS(IFDE_XMLElement *pElement, FX_WSTR wsLocalAttributeName, FX_WSTR wsNamespaceURIPrefix, CFX_WideString& wsValue, FX_BOOL bMatchNSAsPrefix = FALSE) +{ + if(!pElement) { + return FALSE; + } + CFX_WideString wsAttrName; + CFX_WideString wsAttrValue; + CFX_WideString wsAttrNS; + for(FX_INT32 iAttrCount = pElement->CountAttributes(), i = 0; i < iAttrCount; i ++) { + pElement->GetAttribute(i, wsAttrName, wsAttrValue); + FX_STRSIZE iFind = wsAttrName.Find(L':', 0); + CFX_WideString wsNSPrefix; + if (iFind < 0) { + if(wsLocalAttributeName != wsAttrName) { + continue; + } + } else { + if(wsLocalAttributeName != wsAttrName.Right(wsAttrName.GetLength() - iFind - 1)) { + continue; + } + wsNSPrefix = wsAttrName.Left(iFind); + } + if(!XFA_FDEExtension_ResolveNamespaceQualifier(pElement, wsNSPrefix, wsAttrNS)) { + continue; + } + if(bMatchNSAsPrefix) { + if(wsAttrNS.Left(wsNamespaceURIPrefix.GetLength()) != wsNamespaceURIPrefix) { + continue; + } + } else { + if(wsAttrNS != wsNamespaceURIPrefix) { + continue; + } + } + wsValue = wsAttrValue; + return TRUE; + } + return FALSE; +} +CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket(IFDE_XMLNode* pXMLDocumentNode, XFA_XDPPACKET ePacketID) +{ + switch(ePacketID) { + case XFA_XDPPACKET_UNKNOWN: + return NULL; + case XFA_XDPPACKET_XDP: + return ParseAsXDPPacket_XDP(pXMLDocumentNode, ePacketID); + case XFA_XDPPACKET_Config: + return ParseAsXDPPacket_Config(pXMLDocumentNode, ePacketID); + case XFA_XDPPACKET_Template: + case XFA_XDPPACKET_Form: + return ParseAsXDPPacket_TemplateForm(pXMLDocumentNode, ePacketID); + case XFA_XDPPACKET_Datasets: + return ParseAsXDPPacket_Data(pXMLDocumentNode, ePacketID); + case XFA_XDPPACKET_Xdc: + return ParseAsXDPPacket_Xdc(pXMLDocumentNode, ePacketID); + case XFA_XDPPACKET_LocaleSet: + case XFA_XDPPACKET_ConnectionSet: + case XFA_XDPPACKET_SourceSet: + return ParseAsXDPPacket_LocaleConnectionSourceSet(pXMLDocumentNode, ePacketID); + default: + return ParseAsXDPPacket_User(pXMLDocumentNode, ePacketID); + } + return NULL; +} +CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_XDP(IFDE_XMLNode* pXMLDocumentNode, XFA_XDPPACKET ePacketID) +{ + if(!XFA_FDEExtension_MatchNodeName(pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_XDP)->pName, XFA_GetPacketByIndex(XFA_PACKET_XDP)->pURI, XFA_GetPacketByIndex(XFA_PACKET_XDP)->eFlags)) { + return NULL; + } + CXFA_Node* pXFARootNode = m_pFactory->CreateNode(XFA_XDPPACKET_XDP, XFA_ELEMENT_Xfa); + if(!pXFARootNode) { + return NULL; + } + m_pRootNode = pXFARootNode; + pXFARootNode->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L"xfa")); + { + IFDE_XMLElement* pElement = (IFDE_XMLElement*)pXMLDocumentNode; + FX_INT32 iAttributeCount = pElement->CountAttributes(); + for(FX_INT32 i = 0; i < iAttributeCount; i++) { + CFX_WideString wsAttriName, wsAttriValue; + pElement->GetAttribute(i, wsAttriName, wsAttriValue); + if(wsAttriName == FX_WSTRC(L"uuid")) { + pXFARootNode->SetCData(XFA_ATTRIBUTE_Uuid, wsAttriValue); + } else if(wsAttriName == FX_WSTRC(L"timeStamp")) { + pXFARootNode->SetCData(XFA_ATTRIBUTE_TimeStamp, wsAttriValue); + } + } + } + IFDE_XMLNode* pXMLConfigDOMRoot = NULL; + CXFA_Node* pXFAConfigDOMRoot = NULL; + { + for (IFDE_XMLNode* pChildItem = pXMLDocumentNode->GetNodeItem(IFDE_XMLNode::FirstChild); pChildItem; pChildItem = pChildItem->GetNodeItem(IFDE_XMLNode::NextSibling)) { + XFA_LPCPACKETINFO pPacketInfo = XFA_GetPacketByIndex(XFA_PACKET_Config); + if(!XFA_FDEExtension_MatchNodeName(pChildItem, pPacketInfo->pName, pPacketInfo->pURI, pPacketInfo->eFlags)) { + continue; + } + if (CXFA_Node * pChildNode = pXFARootNode->GetFirstChildByName(pPacketInfo->uHash)) { + return NULL; + } + pXMLConfigDOMRoot = pChildItem; + pXFAConfigDOMRoot = ParseAsXDPPacket_Config(pXMLConfigDOMRoot, XFA_XDPPACKET_Config); + pXFARootNode->InsertChild(pXFAConfigDOMRoot, NULL); + } + } + IFDE_XMLNode* pXMLDatasetsDOMRoot = NULL; + IFDE_XMLNode* pXMLFormDOMRoot = NULL; + { + for (IFDE_XMLNode* pChildItem = pXMLDocumentNode->GetNodeItem(IFDE_XMLNode::FirstChild); pChildItem; pChildItem = pChildItem->GetNodeItem(IFDE_XMLNode::NextSibling)) { + if(!pChildItem || pChildItem->GetType() != FDE_XMLNODE_Element) { + continue; + } + if(pChildItem == pXMLConfigDOMRoot) { + continue; + } + IFDE_XMLElement* pElement = reinterpret_cast(pChildItem); + CFX_WideString wsPacketName; + pElement->GetLocalTagName(wsPacketName); + XFA_LPCPACKETINFO pPacketInfo = XFA_GetPacketByName(wsPacketName); + if (pPacketInfo && pPacketInfo->pURI) { + if(!XFA_FDEExtension_MatchNodeName(pElement, pPacketInfo->pName, pPacketInfo->pURI, pPacketInfo->eFlags)) { + pPacketInfo = NULL; + } + } + XFA_XDPPACKET ePacket = pPacketInfo ? pPacketInfo->eName : XFA_XDPPACKET_USER; + if(ePacket == XFA_XDPPACKET_XDP) { + continue; + } + if(ePacket == XFA_XDPPACKET_Datasets) { + if (pXMLDatasetsDOMRoot) { + pXMLDatasetsDOMRoot = NULL; + return NULL; + } + pXMLDatasetsDOMRoot = pElement; + } else if(ePacket == XFA_XDPPACKET_Form) { + if (pXMLFormDOMRoot) { + pXMLFormDOMRoot = NULL; + return NULL; + } + pXMLFormDOMRoot = pElement; + } else { + CXFA_Node* pPacketNode = ParseAsXDPPacket(pElement, ePacket); + if(pPacketNode) { + if (pPacketInfo && (pPacketInfo->eFlags & XFA_XDPPACKET_FLAGS_SUPPORTONE) && pXFARootNode->GetFirstChildByName(pPacketInfo->uHash)) { + return NULL; + } + pXFARootNode->InsertChild(pPacketNode); + } + } + } + } + if(pXMLDatasetsDOMRoot) { + CXFA_Node* pPacketNode = ParseAsXDPPacket(pXMLDatasetsDOMRoot, XFA_XDPPACKET_Datasets); + if (pPacketNode) { + pXFARootNode->InsertChild(pPacketNode); + } + } + if(pXMLFormDOMRoot) { + CXFA_Node* pPacketNode = ParseAsXDPPacket(pXMLFormDOMRoot, XFA_XDPPACKET_Form); + if (pPacketNode) { + pXFARootNode->InsertChild(pPacketNode); + } + } + pXFARootNode->SetXMLMappingNode(pXMLDocumentNode); + return pXFARootNode; +} +CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_Config(IFDE_XMLNode* pXMLDocumentNode, XFA_XDPPACKET ePacketID) +{ + if(!XFA_FDEExtension_MatchNodeName(pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_Config)->pName, XFA_GetPacketByIndex(XFA_PACKET_Config)->pURI, XFA_GetPacketByIndex(XFA_PACKET_Config)->eFlags)) { + return NULL; + } + CXFA_Node* pNode = m_pFactory->CreateNode(XFA_XDPPACKET_Config, XFA_ELEMENT_Config); + if(!pNode) { + return NULL; + } + pNode->SetCData(XFA_ATTRIBUTE_Name, XFA_GetPacketByIndex(XFA_PACKET_Config)->pName); + if(!NormalLoader(pNode, pXMLDocumentNode, ePacketID)) { + return NULL; + } + pNode->SetXMLMappingNode(pXMLDocumentNode); + return pNode; +} +CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_TemplateForm(IFDE_XMLNode* pXMLDocumentNode, XFA_XDPPACKET ePacketID) +{ + CXFA_Node* pNode = NULL; + if (ePacketID == XFA_XDPPACKET_Template) { + if(XFA_FDEExtension_MatchNodeName(pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_Template)->pName, XFA_GetPacketByIndex(XFA_PACKET_Template)->pURI, XFA_GetPacketByIndex(XFA_PACKET_Template)->eFlags)) { + pNode = m_pFactory->CreateNode(XFA_XDPPACKET_Template, XFA_ELEMENT_Template); + if(!pNode) { + return NULL; + } + pNode->SetCData(XFA_ATTRIBUTE_Name, XFA_GetPacketByIndex(XFA_PACKET_Template)->pName); + if(m_bDocumentParser) { + CFX_WideString wsNamespaceURI; + IFDE_XMLElement* pXMLDocumentElement = (IFDE_XMLElement*)pXMLDocumentNode; + pXMLDocumentElement->GetNamespaceURI(wsNamespaceURI); + if (wsNamespaceURI.IsEmpty()) { + pXMLDocumentElement->GetString((FX_LPCWSTR)(L"xmlns:xfa"), wsNamespaceURI); + } + pNode->GetDocument()->RecognizeXFAVersionNumber(wsNamespaceURI); + } + if(!NormalLoader(pNode, pXMLDocumentNode, ePacketID)) { + return NULL; + } + } + } else if (ePacketID == XFA_XDPPACKET_Form) { + if(XFA_FDEExtension_MatchNodeName(pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_Form)->pName, XFA_GetPacketByIndex(XFA_PACKET_Form)->pURI, XFA_GetPacketByIndex(XFA_PACKET_Form)->eFlags)) { + IFDE_XMLElement* pXMLDocumentElement = (IFDE_XMLElement*)pXMLDocumentNode; + CFX_WideString wsChecksum; + pXMLDocumentElement->GetString((FX_LPCWSTR)L"checksum", wsChecksum); +#ifdef _XFA_VERIFY_Checksum_ + if (wsChecksum.GetLength() != 28 || m_pXMLParser->m_dwCheckStatus != 0x03) { + return NULL; + } + IXFA_ChecksumContext *pChecksum = XFA_Checksum_Create(); + pChecksum->StartChecksum(); + pChecksum->UpdateChecksum(m_pFileRead, m_pXMLParser->m_nStart[0], m_pXMLParser->m_nSize[0]); + pChecksum->UpdateChecksum(m_pFileRead, m_pXMLParser->m_nStart[1], m_pXMLParser->m_nSize[1]); + pChecksum->FinishChecksum(); + CFX_ByteString bsCheck; + pChecksum->GetChecksum(bsCheck); + pChecksum->Release(); + if (bsCheck != wsChecksum.UTF8Encode()) { + return NULL; + } +#endif + pNode = m_pFactory->CreateNode(XFA_XDPPACKET_Form, XFA_ELEMENT_Form); + if(!pNode) { + return NULL; + } + pNode->SetCData(XFA_ATTRIBUTE_Name, XFA_GetPacketByIndex(XFA_PACKET_Form)->pName); + pNode->SetAttribute(XFA_ATTRIBUTE_Checksum, wsChecksum); + CXFA_Node* pTemplateRoot = m_pRootNode->GetFirstChildByClass(XFA_ELEMENT_Template); + CXFA_Node* pTemplateChosen = pTemplateRoot ? pTemplateRoot->GetFirstChildByClass(XFA_ELEMENT_Subform) : NULL; + FX_BOOL bUseAttribute = TRUE; + if (pTemplateChosen && pTemplateChosen->GetEnum(XFA_ATTRIBUTE_RestoreState) != XFA_ATTRIBUTEENUM_Auto) { + bUseAttribute = FALSE; + } + if(!NormalLoader(pNode, pXMLDocumentNode, ePacketID, bUseAttribute)) { + return NULL; + } + } + } + if (pNode) { + pNode->SetXMLMappingNode(pXMLDocumentNode); + } + return pNode; +} +static IFDE_XMLNode* XFA_GetDataSetsFromXDP(IFDE_XMLNode* pXMLDocumentNode) +{ + if (XFA_FDEExtension_MatchNodeName(pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_Datasets)->pName, XFA_GetPacketByIndex(XFA_PACKET_Datasets)->pURI, XFA_GetPacketByIndex(XFA_PACKET_Datasets)->eFlags)) { + return pXMLDocumentNode; + } + if (!XFA_FDEExtension_MatchNodeName(pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_XDP)->pName, XFA_GetPacketByIndex(XFA_PACKET_XDP)->pURI, XFA_GetPacketByIndex(XFA_PACKET_XDP)->eFlags)) { + return NULL; + } + for(IFDE_XMLNode* pDatasetsNode = pXMLDocumentNode->GetNodeItem(IFDE_XMLNode::FirstChild); pDatasetsNode; pDatasetsNode = pDatasetsNode->GetNodeItem(IFDE_XMLNode::NextSibling)) { + if(!XFA_FDEExtension_MatchNodeName(pDatasetsNode, XFA_GetPacketByIndex(XFA_PACKET_Datasets)->pName, XFA_GetPacketByIndex(XFA_PACKET_Datasets)->pURI, XFA_GetPacketByIndex(XFA_PACKET_Datasets)->eFlags)) { + continue; + } + return pDatasetsNode; + } + return NULL; +} +CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_Data(IFDE_XMLNode* pXMLDocumentNode, XFA_XDPPACKET ePacketID) +{ + IFDE_XMLNode* pDatasetsXMLNode = XFA_GetDataSetsFromXDP(pXMLDocumentNode); + if(pDatasetsXMLNode) { + CXFA_Node* pNode = m_pFactory->CreateNode(XFA_XDPPACKET_Datasets, XFA_ELEMENT_DataModel); + if(!pNode) { + return NULL; + } + pNode->SetCData(XFA_ATTRIBUTE_Name, XFA_GetPacketByIndex(XFA_PACKET_Datasets)->pName); + if(!DataLoader(pNode, pDatasetsXMLNode, FALSE)) { + return NULL; + } + pNode->SetXMLMappingNode(pDatasetsXMLNode); + return pNode; + } + IFDE_XMLNode* pDataXMLNode = NULL; + if (XFA_FDEExtension_MatchNodeName(pXMLDocumentNode, FX_WSTRC(L"data"), XFA_GetPacketByIndex(XFA_PACKET_Datasets)->pURI, XFA_GetPacketByIndex(XFA_PACKET_Datasets)->eFlags)) { + ((IFDE_XMLElement*)pXMLDocumentNode)->RemoveAttribute((FX_LPCWSTR)(L"xmlns:xfa")); + pDataXMLNode = pXMLDocumentNode; + } else { + IFDE_XMLElement* pDataElement = IFDE_XMLElement::Create(FX_WSTRC(L"xfa:data")); + IFDE_XMLNode* pParentXMLNode = pXMLDocumentNode->GetNodeItem(IFDE_XMLNode::Parent); + if (pParentXMLNode) { + pParentXMLNode->RemoveChildNode(pXMLDocumentNode); + } + FXSYS_assert(pXMLDocumentNode->GetType() == FDE_XMLNODE_Element); + if (pXMLDocumentNode->GetType() == FDE_XMLNODE_Element) { + ((IFDE_XMLElement*)pXMLDocumentNode)->RemoveAttribute((FX_LPCWSTR)(L"xmlns:xfa")); + } + pDataElement->InsertChildNode(pXMLDocumentNode); + pDataXMLNode = pDataElement; + } + if(pDataXMLNode) { + CXFA_Node* pNode = m_pFactory->CreateNode(XFA_XDPPACKET_Datasets, XFA_ELEMENT_DataGroup); + if(!pNode) { + if (pDataXMLNode != pXMLDocumentNode) { + pDataXMLNode->Release(); + } + return NULL; + } + CFX_WideString wsLocalName; + ((IFDE_XMLElement*)pDataXMLNode)->GetLocalTagName(wsLocalName); + pNode->SetCData(XFA_ATTRIBUTE_Name, wsLocalName); + if(!DataLoader(pNode, pDataXMLNode, TRUE)) { + return NULL; + } + pNode->SetXMLMappingNode(pDataXMLNode); + if (pDataXMLNode != pXMLDocumentNode) { + pNode->SetFlag(XFA_NODEFLAG_OwnXMLNode, TRUE, FALSE); + } + return pNode; + } + return NULL; +} +CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_LocaleConnectionSourceSet(IFDE_XMLNode* pXMLDocumentNode, XFA_XDPPACKET ePacketID) +{ + CXFA_Node* pNode = NULL; + if (ePacketID == XFA_XDPPACKET_LocaleSet) { + if(XFA_FDEExtension_MatchNodeName(pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_LocaleSet)->pName, XFA_GetPacketByIndex(XFA_PACKET_LocaleSet)->pURI, XFA_GetPacketByIndex(XFA_PACKET_LocaleSet)->eFlags)) { + pNode = m_pFactory->CreateNode(XFA_XDPPACKET_LocaleSet, XFA_ELEMENT_LocaleSet); + if(!pNode) { + return NULL; + } + pNode->SetCData(XFA_ATTRIBUTE_Name, XFA_GetPacketByIndex(XFA_PACKET_LocaleSet)->pName); + if(!NormalLoader(pNode, pXMLDocumentNode, ePacketID)) { + return NULL; + } + } + } else if(ePacketID == XFA_XDPPACKET_ConnectionSet) { + if(XFA_FDEExtension_MatchNodeName(pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_ConnectionSet)->pName, XFA_GetPacketByIndex(XFA_PACKET_ConnectionSet)->pURI, XFA_GetPacketByIndex(XFA_PACKET_ConnectionSet)->eFlags)) { + pNode = m_pFactory->CreateNode(XFA_XDPPACKET_ConnectionSet, XFA_ELEMENT_ConnectionSet); + if(!pNode) { + return NULL; + } + pNode->SetCData(XFA_ATTRIBUTE_Name, XFA_GetPacketByIndex(XFA_PACKET_ConnectionSet)->pName); + if(!NormalLoader(pNode, pXMLDocumentNode, ePacketID)) { + return NULL; + } + } + } else if(ePacketID == XFA_XDPPACKET_SourceSet) { + if(XFA_FDEExtension_MatchNodeName(pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_SourceSet)->pName, XFA_GetPacketByIndex(XFA_PACKET_SourceSet)->pURI, XFA_GetPacketByIndex(XFA_PACKET_SourceSet)->eFlags)) { + pNode = m_pFactory->CreateNode(XFA_XDPPACKET_SourceSet, XFA_ELEMENT_SourceSet); + if(!pNode) { + return NULL; + } + pNode->SetCData(XFA_ATTRIBUTE_Name, XFA_GetPacketByIndex(XFA_PACKET_SourceSet)->pName); + if(!NormalLoader(pNode, pXMLDocumentNode, ePacketID)) { + return NULL; + } + } + } + if (pNode) { + pNode->SetXMLMappingNode(pXMLDocumentNode); + } + return pNode; +} +CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_Xdc(IFDE_XMLNode* pXMLDocumentNode, XFA_XDPPACKET ePacketID) +{ + if(XFA_FDEExtension_MatchNodeName(pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_Xdc)->pName, XFA_GetPacketByIndex(XFA_PACKET_Xdc)->pURI, XFA_GetPacketByIndex(XFA_PACKET_Xdc)->eFlags)) { + CXFA_Node* pNode = m_pFactory->CreateNode(XFA_XDPPACKET_Xdc, XFA_ELEMENT_Xdc); + if(!pNode) { + return NULL; + } + pNode->SetCData(XFA_ATTRIBUTE_Name, XFA_GetPacketByIndex(XFA_PACKET_Xdc)->pName); + pNode->SetXMLMappingNode(pXMLDocumentNode); + return pNode; + } + return NULL; +} +CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_User(IFDE_XMLNode* pXMLDocumentNode, XFA_XDPPACKET ePacketID) +{ + CXFA_Node* pNode = m_pFactory->CreateNode(XFA_XDPPACKET_XDP, XFA_ELEMENT_Packet); + if(!pNode) { + return NULL; + } + CFX_WideString wsName; + ((IFDE_XMLElement*)pXMLDocumentNode)->GetLocalTagName(wsName); + pNode->SetCData(XFA_ATTRIBUTE_Name, wsName); + if(!UserPacketLoader(pNode, pXMLDocumentNode)) { + return NULL; + } + pNode->SetXMLMappingNode(pXMLDocumentNode); + return pNode; +} +CXFA_Node* CXFA_SimpleParser::UserPacketLoader(CXFA_Node* pXFANode, IFDE_XMLNode* pXMLDoc) +{ + return pXFANode; +} +static FX_BOOL XFA_FDEExtension_IsStringAllWhitespace(CFX_WideString wsText) +{ + wsText.TrimRight(L"\x20\x9\xD\xA"); + return wsText.IsEmpty(); +} +CXFA_Node* CXFA_SimpleParser::DataLoader(CXFA_Node* pXFANode, IFDE_XMLNode* pXMLDoc, FX_BOOL bDoTransform ) +{ + ParseDataGroup(pXFANode, pXMLDoc, XFA_XDPPACKET_Datasets); + return pXFANode; +} +CXFA_Node* CXFA_SimpleParser::NormalLoader(CXFA_Node* pXFANode, IFDE_XMLNode* pXMLDoc, XFA_XDPPACKET ePacketID, FX_BOOL bUseAttribute) +{ + FX_BOOL bOneOfPropertyFound = FALSE; + for (IFDE_XMLNode *pXMLChild = pXMLDoc->GetNodeItem(IFDE_XMLNode::FirstChild); pXMLChild; pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) { + switch (pXMLChild->GetType()) { + case FDE_XMLNODE_Element: { + IFDE_XMLElement *pXMLElement = (IFDE_XMLElement*)pXMLChild; + CFX_WideString wsTagName; + pXMLElement->GetLocalTagName(wsTagName); + XFA_LPCELEMENTINFO pElemInfo = XFA_GetElementByName(wsTagName); + if(!pElemInfo) { + continue; + } + XFA_LPCPROPERTY pPropertyInfo = XFA_GetPropertyOfElement(pXFANode->GetClassID(), pElemInfo->eName, ePacketID); + if (pPropertyInfo && ((pPropertyInfo->uFlags & (XFA_PROPERTYFLAG_OneOf | XFA_PROPERTYFLAG_DefaultOneOf)) != 0)) { + if (bOneOfPropertyFound) { + break; + } + bOneOfPropertyFound = TRUE; + } + CXFA_Node *pXFAChild = m_pFactory->CreateNode(ePacketID, pElemInfo->eName); + if (pXFAChild == NULL) { + return NULL; + } + if (ePacketID == XFA_XDPPACKET_Config) { + pXFAChild->SetAttribute(XFA_ATTRIBUTE_Name, wsTagName); + } + FX_BOOL IsNeedValue = TRUE; + for(FX_INT32 i = 0, count = pXMLElement->CountAttributes(); i < count; i++) { + CFX_WideString wsAttrQualifiedName; + CFX_WideString wsAttrName; + CFX_WideString wsAttrValue; + pXMLElement->GetAttribute(i, wsAttrQualifiedName, wsAttrValue); + XFA_FDEExtension_GetAttributeLocalName(wsAttrQualifiedName, wsAttrName); + if(wsAttrName == FX_WSTRC(L"nil") && wsAttrValue == FX_WSTRC(L"true")) { + IsNeedValue = FALSE; + } + XFA_LPCATTRIBUTEINFO lpAttrInfo = XFA_GetAttributeByName(wsAttrName); + if(!lpAttrInfo) { + continue; + } + if (!bUseAttribute && lpAttrInfo->eName != XFA_ATTRIBUTE_Name && lpAttrInfo->eName != XFA_ATTRIBUTE_Save) { + continue; + } + pXFAChild->SetAttribute(lpAttrInfo->eName, wsAttrValue); + } + pXFANode->InsertChild(pXFAChild); + if (pElemInfo->eName == XFA_ELEMENT_Validate || pElemInfo->eName == XFA_ELEMENT_Locale) { + if (ePacketID == XFA_XDPPACKET_Config) { + ParseContentNode(pXFAChild, pXMLElement, ePacketID); + } else { + NormalLoader(pXFAChild, pXMLElement, ePacketID, bUseAttribute); + } + break; + } + switch(pXFAChild->GetObjectType()) { + case XFA_OBJECTTYPE_ContentNode: + case XFA_OBJECTTYPE_TextNode: + case XFA_OBJECTTYPE_NodeC: + case XFA_OBJECTTYPE_NodeV: + if(IsNeedValue) { + ParseContentNode(pXFAChild, pXMLElement, ePacketID); + } + break; + default: + NormalLoader(pXFAChild, pXMLElement, ePacketID, bUseAttribute); + break; + } + } + break; + case FDE_XMLNODE_Instruction: + ParseInstruction(pXFANode, (IFDE_XMLInstruction*)pXMLChild, ePacketID); + break; + default: + break; + } + } + return pXFANode; +} +FX_BOOL XFA_RecognizeRichText(IFDE_XMLElement* pRichTextXMLNode) +{ + if (pRichTextXMLNode) { + CFX_WideString wsNamespaceURI; + XFA_FDEExtension_GetElementTagNamespaceURI(pRichTextXMLNode, wsNamespaceURI); + if (wsNamespaceURI == FX_WSTRC(L"http://www.w3.org/1999/xhtml")) { + return TRUE; + } + } + return FALSE; +} +class RichTextNodeVisitor +{ +public: + static inline IFDE_XMLNode* GetFirstChild(IFDE_XMLNode* pNode) + { + return pNode->GetNodeItem(IFDE_XMLNode::FirstChild); + } + static inline IFDE_XMLNode* GetNextSibling(IFDE_XMLNode* pNode) + { + return pNode->GetNodeItem(IFDE_XMLNode::NextSibling); + } + static inline IFDE_XMLNode* GetParent(IFDE_XMLNode* pNode) + { + return pNode->GetNodeItem(IFDE_XMLNode::Parent); + } +}; +#ifndef XFA_PARSE_HAS_LINEIDENTIFIER +void XFA_ConvertRichTextToPlainText(IFDE_XMLElement* pRichTextXMLNode, CFX_WideString& wsOutput) +{ + CXFA_NodeIteratorTemplate sIterator(pRichTextXMLNode); + CFX_WideTextBuf wsPlainTextBuf; + for(IFDE_XMLNode* pNode = sIterator.GetCurrent(); pNode; pNode = sIterator.MoveToNext()) { + switch(pNode->GetType()) { + case FDE_XMLNODE_Text: { + CFX_WideString wsText; + ((IFDE_XMLText*)pNode)->GetText(wsText); + wsPlainTextBuf << wsText; + } + break; + case FDE_XMLNODE_CharData: { + CFX_WideString wsText; + ((IFDE_XMLCharData*)pNode)->GetCharData(wsText); + wsPlainTextBuf << wsText; + } + break; + default: + break; + } + } + wsOutput = wsPlainTextBuf.GetWideString(); +} +#endif +void XFA_ConvertXMLToPlainText(IFDE_XMLElement* pRootXMLNode, CFX_WideString& wsOutput) +{ + for (IFDE_XMLNode *pXMLChild = pRootXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild); pXMLChild; pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) { +#ifdef _DEBUG + FDE_XMLNODETYPE nodeType = pXMLChild->GetType(); +#endif + switch(pXMLChild->GetType()) { + case FDE_XMLNODE_Element: { + CFX_WideString wsTextData; + ((IFDE_XMLElement*)pXMLChild)->GetTextData(wsTextData); + wsTextData += FX_WSTRC(L"\n"); + wsOutput += wsTextData; + } + break; + case FDE_XMLNODE_Text: { + CFX_WideString wsText; + ((IFDE_XMLText*)pXMLChild)->GetText(wsText); + if (XFA_FDEExtension_IsStringAllWhitespace(wsText)) { + continue; + } else { + wsOutput = wsText; + } + } + break; + case FDE_XMLNODE_CharData: { + CFX_WideString wsCharData; + ((IFDE_XMLCharData*)pXMLChild)->GetCharData(wsCharData); + if (XFA_FDEExtension_IsStringAllWhitespace(wsCharData)) { + continue; + } else { + wsOutput = wsCharData; + } + } + break; + default: + FXSYS_assert(FALSE); + break; + } + } +} +void CXFA_SimpleParser::ParseContentNode(CXFA_Node* pXFANode, IFDE_XMLNode* pXMLNode, XFA_XDPPACKET ePacketID) +{ + XFA_ELEMENT element = XFA_ELEMENT_Sharptext; + if (pXFANode->GetClassID() == XFA_ELEMENT_ExData) { + CFX_WideStringC wsContentType = pXFANode->GetCData(XFA_ATTRIBUTE_ContentType); + if (wsContentType == FX_WSTRC(L"text/html")) { + element = XFA_ELEMENT_SharpxHTML; + } else if (wsContentType == FX_WSTRC(L"text/xml")) { + element = XFA_ELEMENT_Sharpxml; + } + } + if (element == XFA_ELEMENT_SharpxHTML) { + pXFANode->SetXMLMappingNode(pXMLNode); + } + CFX_WideString wsValue; + for (IFDE_XMLNode *pXMLChild = pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild); pXMLChild; pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) { + FDE_XMLNODETYPE eNodeType = pXMLChild->GetType(); + if(eNodeType == FDE_XMLNODE_Instruction) { + continue; + } + if(element == XFA_ELEMENT_SharpxHTML) { + if(eNodeType != FDE_XMLNODE_Element) { + break; + } + if (XFA_RecognizeRichText((IFDE_XMLElement*)pXMLChild)) { +#ifdef XFA_PARSE_HAS_LINEIDENTIFIER + XFA_GetPlainTextFromRichText((IFDE_XMLElement*)pXMLChild, wsValue); +#else + XFA_ConvertRichTextToPlainText((IFDE_XMLElement*)pXMLChild, wsValue); +#endif + } + } else if (element == XFA_ELEMENT_Sharpxml) { + if(eNodeType != FDE_XMLNODE_Element) { + break; + } + XFA_ConvertXMLToPlainText((IFDE_XMLElement*)pXMLChild, wsValue); + } else { + if(eNodeType == FDE_XMLNODE_Element) { + break; + } + if(eNodeType == FDE_XMLNODE_Text) { + ((IFDE_XMLText*)pXMLChild)->GetText(wsValue); + } else if(eNodeType == FDE_XMLNODE_CharData) { + ((IFDE_XMLCharData*)pXMLChild)->GetCharData(wsValue); + } + } + break; + } + if(!wsValue.IsEmpty()) { + if (pXFANode->GetObjectType() == XFA_OBJECTTYPE_ContentNode) { + CXFA_Node *pContentRawDataNode = m_pFactory->CreateNode(ePacketID, element); + FXSYS_assert(pContentRawDataNode); + pContentRawDataNode->SetCData(XFA_ATTRIBUTE_Value, wsValue); + pXFANode->InsertChild(pContentRawDataNode); + } else { + pXFANode->SetCData(XFA_ATTRIBUTE_Value, wsValue); + } + } +} +void CXFA_SimpleParser::ParseDataGroup(CXFA_Node* pXFANode, IFDE_XMLNode* pXMLNode, XFA_XDPPACKET ePacketID) +{ + for (IFDE_XMLNode *pXMLChild = pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild); pXMLChild; pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) { + switch (pXMLChild->GetType()) { + case FDE_XMLNODE_Element: { + IFDE_XMLElement *pXMLElement = (IFDE_XMLElement*)pXMLChild; + { + CFX_WideString wsNamespaceURI; + XFA_FDEExtension_GetElementTagNamespaceURI(pXMLElement, wsNamespaceURI); + if(wsNamespaceURI == FX_WSTRC(L"http://www.xfa.com/schema/xfa-package/") || + wsNamespaceURI == FX_WSTRC(L"http://www.xfa.org/schema/xfa-package/") || + wsNamespaceURI == FX_WSTRC(L"http://www.w3.org/2001/XMLSchema-instance")) { + continue; + } + if(0) { + continue; + } + } + XFA_ELEMENT eNodeType = XFA_ELEMENT_DataModel; + if (eNodeType == XFA_ELEMENT_DataModel) { + CFX_WideString wsDataNodeAttr; + if(XFA_FDEExtension_FindAttributeWithNS(pXMLElement, FX_WSTRC(L"dataNode"), FX_WSTRC(L"http://www.xfa.org/schema/xfa-data/1.0/"), wsDataNodeAttr)) { + if (wsDataNodeAttr == FX_WSTRC(L"dataGroup")) { + eNodeType = XFA_ELEMENT_DataGroup; + } else if (wsDataNodeAttr == FX_WSTRC(L"dataValue")) { + eNodeType = XFA_ELEMENT_DataValue; + } + } + } + CFX_WideString wsContentType; + if (eNodeType == XFA_ELEMENT_DataModel) { + if(XFA_FDEExtension_FindAttributeWithNS(pXMLElement, FX_WSTRC(L"contentType"), FX_WSTRC(L"http://www.xfa.org/schema/xfa-data/1.0/"), wsContentType)) { + if (!wsContentType.IsEmpty()) { + eNodeType = XFA_ELEMENT_DataValue; + } + } + } + if (eNodeType == XFA_ELEMENT_DataModel) { + for (IFDE_XMLNode *pXMLDataChild = pXMLElement->GetNodeItem(IFDE_XMLNode::FirstChild); pXMLDataChild; pXMLDataChild = pXMLDataChild->GetNodeItem(IFDE_XMLNode::NextSibling)) { + if(pXMLDataChild->GetType() == FDE_XMLNODE_Element) { + if (!XFA_RecognizeRichText((IFDE_XMLElement*)pXMLDataChild)) { + eNodeType = XFA_ELEMENT_DataGroup; + break; + } + } + } + } + if (eNodeType == XFA_ELEMENT_DataModel) { + eNodeType = XFA_ELEMENT_DataValue; + } + CXFA_Node *pXFAChild = m_pFactory->CreateNode(XFA_XDPPACKET_Datasets, eNodeType); + if (pXFAChild == NULL) { + return; + } + CFX_WideString wsNodeName; + pXMLElement->GetLocalTagName(wsNodeName); + pXFAChild->SetCData(XFA_ATTRIBUTE_Name, wsNodeName); + FX_BOOL bNeedValue = TRUE; + if (1) { + for(FX_INT32 i = 0, count = pXMLElement->CountAttributes(); i < count; i++) { + CFX_WideString wsAttrQualifiedName; + CFX_WideString wsAttrValue; + CFX_WideString wsAttrName; + CFX_WideString wsAttrNamespaceURI; + pXMLElement->GetAttribute(i, wsAttrQualifiedName, wsAttrValue); + if(!XFA_FDEExtension_ResolveAttribute(pXMLElement, wsAttrQualifiedName, wsAttrName, wsAttrNamespaceURI)) { + continue; + } + if(wsAttrName == FX_WSTRC(L"nil") && wsAttrValue == FX_WSTRC(L"true")) { + bNeedValue = FALSE; + continue; + } + if(wsAttrNamespaceURI == FX_WSTRC(L"http://www.xfa.com/schema/xfa-package/") || + wsAttrNamespaceURI == FX_WSTRC(L"http://www.xfa.org/schema/xfa-package/") || + wsAttrNamespaceURI == FX_WSTRC(L"http://www.w3.org/2001/XMLSchema-instance") || + wsAttrNamespaceURI == FX_WSTRC(L"http://www.xfa.org/schema/xfa-data/1.0/")) { + continue; + } + if(0) { + continue; + } + CXFA_Node *pXFAMetaData = m_pFactory->CreateNode(XFA_XDPPACKET_Datasets, XFA_ELEMENT_DataValue); + if (pXFAMetaData == NULL) { + return; + } + pXFAMetaData->SetCData(XFA_ATTRIBUTE_Name, wsAttrName); + pXFAMetaData->SetCData(XFA_ATTRIBUTE_QualifiedName, wsAttrQualifiedName); + pXFAMetaData->SetCData(XFA_ATTRIBUTE_Value, wsAttrValue); + pXFAMetaData->SetEnum(XFA_ATTRIBUTE_Contains, XFA_ATTRIBUTEENUM_MetaData); + pXFAChild->InsertChild(pXFAMetaData); + pXFAMetaData->SetXMLMappingNode(pXMLElement); + pXFAMetaData->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE); + } + if(!bNeedValue) { + CFX_WideString wsNilName = FX_WSTRC(L"xsi:nil"); + pXMLElement->RemoveAttribute(wsNilName); + } + } + pXFANode->InsertChild(pXFAChild); + if (eNodeType == XFA_ELEMENT_DataGroup) { + ParseDataGroup(pXFAChild, pXMLElement, ePacketID); + } else { + if(bNeedValue) { + ParseDataValue(pXFAChild, pXMLChild, XFA_XDPPACKET_Datasets); + } + } + pXFAChild->SetXMLMappingNode(pXMLElement); + pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE); + } + continue; + case FDE_XMLNODE_CharData: { + IFDE_XMLCharData *pXMLCharData = (IFDE_XMLCharData*)pXMLChild; + CFX_WideString wsCharData; + pXMLCharData->GetCharData(wsCharData); + if (XFA_FDEExtension_IsStringAllWhitespace(wsCharData)) { + continue; + } + CXFA_Node *pXFAChild = m_pFactory->CreateNode(XFA_XDPPACKET_Datasets, XFA_ELEMENT_DataValue); + if (pXFAChild == NULL) { + return; + } + pXFAChild->SetCData(XFA_ATTRIBUTE_Value, wsCharData); + pXFANode->InsertChild(pXFAChild); + pXFAChild->SetXMLMappingNode(pXMLCharData); + pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE); + } + continue; + case FDE_XMLNODE_Text: { + IFDE_XMLText *pXMLText = (IFDE_XMLText*)pXMLChild; + CFX_WideString wsText; + pXMLText->GetText(wsText); + if (XFA_FDEExtension_IsStringAllWhitespace(wsText)) { + continue; + } + CXFA_Node *pXFAChild = m_pFactory->CreateNode(XFA_XDPPACKET_Datasets, XFA_ELEMENT_DataValue); + if (pXFAChild == NULL) { + return; + } + pXFAChild->SetCData(XFA_ATTRIBUTE_Value, wsText); + pXFANode->InsertChild(pXFAChild); + pXFAChild->SetXMLMappingNode(pXMLText); + pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE); + } + continue; + case FDE_XMLNODE_Instruction: + continue; + default: + continue; + } + } +} +void CXFA_SimpleParser::ParseDataValue(CXFA_Node* pXFANode, IFDE_XMLNode* pXMLNode, XFA_XDPPACKET ePacketID) +{ + CFX_WideTextBuf wsValueTextBuf; + CFX_WideTextBuf wsCurValueTextBuf; + FX_BOOL bMarkAsCompound = FALSE; + IFDE_XMLNode *pXMLCurValueNode = NULL; + for (IFDE_XMLNode *pXMLChild = pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild); pXMLChild; pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) { + FDE_XMLNODETYPE eNodeType = pXMLChild->GetType(); + if(eNodeType == FDE_XMLNODE_Instruction) { + continue; + } + CFX_WideString wsText; + FX_BOOL bBreak = FALSE; + if(eNodeType == FDE_XMLNODE_Text) { + ((IFDE_XMLText*)pXMLChild)->GetText(wsText); + if(!pXMLCurValueNode) { + pXMLCurValueNode = pXMLChild; + } + wsCurValueTextBuf << wsText; + } else if(eNodeType == FDE_XMLNODE_CharData) { + ((IFDE_XMLCharData*)pXMLChild)->GetCharData(wsText); + if(!pXMLCurValueNode) { + pXMLCurValueNode = pXMLChild; + } + wsCurValueTextBuf << wsText; + } else if(XFA_RecognizeRichText((IFDE_XMLElement*)pXMLChild)) { +#ifdef XFA_PARSE_HAS_LINEIDENTIFIER + XFA_GetPlainTextFromRichText((IFDE_XMLElement*)pXMLChild, wsText); +#else + XFA_ConvertRichTextToPlainText((IFDE_XMLElement*)pXMLChild, wsText); +#endif + if(!pXMLCurValueNode) { + pXMLCurValueNode = pXMLChild; + } + wsCurValueTextBuf << wsText; + } else { + bMarkAsCompound = TRUE; + if(pXMLCurValueNode) { + CFX_WideStringC wsCurValue = wsCurValueTextBuf.GetWideString(); + if(!wsCurValue.IsEmpty()) { + CXFA_Node *pXFAChild = m_pFactory->CreateNode(ePacketID, XFA_ELEMENT_DataValue); + if (pXFAChild == NULL) { + return; + } + pXFAChild->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L"")); + pXFAChild->SetCData(XFA_ATTRIBUTE_Value, wsCurValue); + pXFANode->InsertChild(pXFAChild); + pXFAChild->SetXMLMappingNode(pXMLCurValueNode); + pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE); + wsValueTextBuf << wsCurValue; + wsCurValueTextBuf.Clear(); + } + pXMLCurValueNode = NULL; + } + CXFA_Node *pXFAChild = m_pFactory->CreateNode(ePacketID, XFA_ELEMENT_DataValue); + if (pXFAChild == NULL) { + return; + } + CFX_WideString wsNodeStr; + ((IFDE_XMLElement*)pXMLChild)->GetLocalTagName(wsNodeStr); + pXFAChild->SetCData(XFA_ATTRIBUTE_Name, wsNodeStr); + ParseDataValue(pXFAChild, pXMLChild, ePacketID); + pXFANode->InsertChild(pXFAChild); + pXFAChild->SetXMLMappingNode(pXMLChild); + pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE); + CFX_WideStringC wsCurValue = pXFAChild->GetCData(XFA_ATTRIBUTE_Value); + wsValueTextBuf << wsCurValue; + } + } + if(pXMLCurValueNode) { + CFX_WideStringC wsCurValue = wsCurValueTextBuf.GetWideString(); + if(!wsCurValue.IsEmpty()) { + if(bMarkAsCompound) { + CXFA_Node *pXFAChild = m_pFactory->CreateNode(ePacketID, XFA_ELEMENT_DataValue); + if (pXFAChild == NULL) { + return; + } + pXFAChild->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L"")); + pXFAChild->SetCData(XFA_ATTRIBUTE_Value, wsCurValue); + pXFANode->InsertChild(pXFAChild); + pXFAChild->SetXMLMappingNode(pXMLCurValueNode); + pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE); + } + wsValueTextBuf << wsCurValue; + wsCurValueTextBuf.Clear(); + } + pXMLCurValueNode = NULL; + } + CFX_WideStringC wsNodeValue = wsValueTextBuf.GetWideString(); + pXFANode->SetCData(XFA_ATTRIBUTE_Value, wsNodeValue); +} +void CXFA_SimpleParser::ParseInstruction(CXFA_Node *pXFANode, IFDE_XMLInstruction *pXMLInstruction, XFA_XDPPACKET ePacketID) +{ + if(!m_bDocumentParser) { + return; + } + CFX_WideString wsTargetName; + pXMLInstruction->GetTargetName(wsTargetName); + FX_INT32 iDataCount = pXMLInstruction->CountData(); + if (wsTargetName == FX_WSTRC(L"originalXFAVersion")) { + CFX_WideString wsData; + if(pXMLInstruction->GetData(0, wsData) && (pXFANode->GetDocument()->RecognizeXFAVersionNumber(wsData) != XFA_VERSION_UNKNOWN)) { + wsData.Empty(); + if (pXMLInstruction->GetData(1, wsData) && wsData == FX_WSTRC(L"v2.7-scripting:1")) { + pXFANode->GetDocument()->SetFlag(XFA_DOCFLAG_Scripting, TRUE); + } + } + } else if (wsTargetName == FX_WSTRC(L"acrobat")) { + CFX_WideString wsData; + if (pXMLInstruction->GetData(0, wsData) && wsData == FX_WSTRC(L"JavaScript")) { + if (pXMLInstruction->GetData(1, wsData) && wsData == FX_WSTRC(L"strictScoping")) { + pXFANode->GetDocument()->SetFlag(XFA_DOCFLAG_StrictScoping, TRUE); + } + } + } +} +void CXFA_SimpleParser::CloseParser() +{ + if (m_pXMLDoc) { + m_pXMLDoc->Release(); + m_pXMLDoc = NULL; + } + if (m_pStream) { + m_pStream->Release(); + m_pStream = NULL; + } +} +IXFA_DocParser* IXFA_DocParser::Create(IXFA_Notify *pNotify) +{ + return FX_NEW CXFA_DocumentParser(pNotify); +} +CXFA_DocumentParser::CXFA_DocumentParser(IXFA_Notify *pNotify) + : m_pNotify(pNotify) + , m_nodeParser(NULL, TRUE) + , m_pDocument(NULL) +{ +} +CXFA_DocumentParser::~CXFA_DocumentParser() +{ + CloseParser(); +} +FX_INT32 CXFA_DocumentParser::StartParse(IFX_FileRead *pStream, XFA_XDPPACKET ePacketID ) +{ + CloseParser(); + FX_INT32 nRetStatus = m_nodeParser.StartParse(pStream, ePacketID); + if(nRetStatus == XFA_PARSESTATUS_Ready) { + m_pDocument = FX_NEW CXFA_Document(this); + m_nodeParser.SetFactory(m_pDocument); + } + return nRetStatus; +} +FX_INT32 CXFA_DocumentParser::DoParse(IFX_Pause *pPause ) +{ + FX_INT32 nRetStatus = m_nodeParser.DoParse(pPause); + if (nRetStatus >= XFA_PARSESTATUS_Done) { + FXSYS_assert(m_pDocument); + m_pDocument->SetRoot(m_nodeParser.GetRootNode()); + } + return nRetStatus; +} +FX_INT32 CXFA_DocumentParser::ParseXMLData(const CFX_WideString &wsXML, IFDE_XMLNode* &pXMLNode, IFX_Pause *pPause) +{ + CloseParser(); + FX_INT32 nRetStatus = m_nodeParser.ParseXMLData(wsXML, pXMLNode, NULL); + if(nRetStatus == XFA_PARSESTATUS_Done && pXMLNode) { + m_pDocument = FX_NEW CXFA_Document(this); + m_nodeParser.SetFactory(m_pDocument); + } + return nRetStatus; +} +void CXFA_DocumentParser::ConstructXFANode(CXFA_Node* pXFANode, IFDE_XMLNode* pXMLNode) +{ + if (!pXFANode || !pXMLNode) { + return; + } + m_nodeParser.ConstructXFANode(pXFANode, pXMLNode); + CXFA_Node* pRootNode = m_nodeParser.GetRootNode(); + if (m_pDocument && pRootNode) { + m_pDocument->SetRoot(pRootNode); + } +} +void CXFA_DocumentParser::CloseParser() +{ + if (m_pDocument) { + delete m_pDocument; + m_pDocument = NULL; + } + m_nodeParser.CloseParser(); +} +CXFA_XMLParser::CXFA_XMLParser(IFDE_XMLNode *pRoot, IFX_Stream *pStream) + : m_pRoot(pRoot) + , m_pStream(pStream) + , m_pParser(NULL) + , m_dwStatus(FDE_XMLSYNTAXSTATUS_None) + , m_pParent(pRoot) + , m_pChild(NULL) + , m_NodeStack(16) + , m_ws1() + , m_ws2() +#ifdef _XFA_VERIFY_Checksum_ + , m_nElementStart(0) + , m_dwCheckStatus(0) + , m_dwCurrentCheckStatus(0) +#endif +{ + ASSERT(m_pParent && m_pStream); + m_NodeStack.Push(m_pParent); + m_pParser = IFDE_XMLSyntaxParser::Create(); + m_pParser->Init(m_pStream, 32 * 1024, 1024 * 1024); +} +CXFA_XMLParser::~CXFA_XMLParser() +{ + if (m_pParser) { + m_pParser->Release(); + } + m_NodeStack.RemoveAll(); + m_ws1.Empty(); + m_ws2.Empty(); +} +FX_INT32 CXFA_XMLParser::DoParser(IFX_Pause *pPause) +{ + if (m_dwStatus == FDE_XMLSYNTAXSTATUS_Error) { + return -1; + } + if (m_dwStatus == FDE_XMLSYNTAXSTATUS_EOS) { + return 100; + } + FX_INT32 iCount = 0; + while (TRUE) { + m_dwStatus = m_pParser->DoSyntaxParse(); + switch (m_dwStatus) { + case FDE_XMLSYNTAXSTATUS_InstructionOpen: + break; + case FDE_XMLSYNTAXSTATUS_InstructionClose: + if (m_pChild) { + if (m_pChild->GetType() != FDE_XMLNODE_Instruction) { + m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; + break; + } + } + m_pChild = m_pParent; + break; + case FDE_XMLSYNTAXSTATUS_ElementOpen: +#ifdef _XFA_VERIFY_Checksum_ + if (m_dwCheckStatus != 0x03 && m_NodeStack.GetSize() == 2) { + m_nElementStart = m_pParser->GetCurrentPos() - 1; + } +#endif + break; + case FDE_XMLSYNTAXSTATUS_ElementBreak: + break; + case FDE_XMLSYNTAXSTATUS_ElementClose: + if (m_pChild->GetType() != FDE_XMLNODE_Element) { + m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; + break; + } + m_pParser->GetTagName(m_ws1); + ((IFDE_XMLElement*)m_pChild)->GetTagName(m_ws2); + if (m_ws1.GetLength() > 0 && !m_ws1.Equal(m_ws2)) { + m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; + break; + } + m_NodeStack.Pop(); + if (m_NodeStack.GetSize() < 1) { + m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; + break; + } +#ifdef _XFA_VERIFY_Checksum_ + else if (m_dwCurrentCheckStatus != 0 && m_NodeStack.GetSize() == 2) { + m_nSize[m_dwCurrentCheckStatus - 1] = m_pParser->GetCurrentBinaryPos() - m_nStart[m_dwCurrentCheckStatus - 1]; + m_dwCurrentCheckStatus = 0; + } +#endif + m_pParent = (IFDE_XMLNode*)*m_NodeStack.GetTopElement(); + m_pChild = m_pParent; + iCount++; + break; + case FDE_XMLSYNTAXSTATUS_TargetName: + m_pParser->GetTargetName(m_ws1); + if (m_ws1 == FX_WSTRC(L"originalXFAVersion") || m_ws1 == FX_WSTRC(L"acrobat")) { + m_pChild = IFDE_XMLInstruction::Create(m_ws1); + m_pParent->InsertChildNode(m_pChild); + } else { + m_pChild = NULL; + } + m_ws1.Empty(); + break; + case FDE_XMLSYNTAXSTATUS_TagName: + m_pParser->GetTagName(m_ws1); + m_pChild = IFDE_XMLElement::Create(m_ws1); + m_pParent->InsertChildNode(m_pChild); + m_NodeStack.Push(m_pChild); + m_pParent = m_pChild; +#ifdef _XFA_VERIFY_Checksum_ + if (m_dwCheckStatus != 0x03 && m_NodeStack.GetSize() == 3) { + CFX_WideString wsTag; + ((IFDE_XMLElement*)m_pChild)->GetLocalTagName(wsTag); + if (wsTag == FX_WSTRC(L"template")) { + m_dwCheckStatus |= 0x01; + m_dwCurrentCheckStatus = 0x01; + m_nStart[0] = m_pParser->GetCurrentBinaryPos() - (m_pParser->GetCurrentPos() - m_nElementStart); + } else if (wsTag == FX_WSTRC(L"datasets")) { + m_dwCheckStatus |= 0x02; + m_dwCurrentCheckStatus = 0x02; + m_nStart[1] = m_pParser->GetCurrentBinaryPos() - (m_pParser->GetCurrentPos() - m_nElementStart); + } + } +#endif + break; + case FDE_XMLSYNTAXSTATUS_AttriName: + m_pParser->GetAttributeName(m_ws1); + break; + case FDE_XMLSYNTAXSTATUS_AttriValue: + if (m_pChild) { + m_pParser->GetAttributeName(m_ws2); + if (m_pChild->GetType() == FDE_XMLNODE_Element) { + ((IFDE_XMLElement*)m_pChild)->SetString(m_ws1, m_ws2); + } + } + m_ws1.Empty(); + break; + case FDE_XMLSYNTAXSTATUS_Text: + m_pParser->GetTextData(m_ws1); + m_pChild = IFDE_XMLText::Create(m_ws1); + m_pParent->InsertChildNode(m_pChild); + m_pChild = m_pParent; + break; + case FDE_XMLSYNTAXSTATUS_CData: + m_pParser->GetTextData(m_ws1); + m_pChild = IFDE_XMLCharData::Create(m_ws1); + m_pParent->InsertChildNode(m_pChild); + m_pChild = m_pParent; + break; + case FDE_XMLSYNTAXSTATUS_TargetData: + if (m_pChild) { + if (m_pChild->GetType() != FDE_XMLNODE_Instruction) { + m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; + break; + } + if (!m_ws1.IsEmpty()) { + ((IFDE_XMLInstruction*)m_pChild)->AppendData(m_ws1); + } + m_pParser->GetTargetData(m_ws1); + ((IFDE_XMLInstruction*)m_pChild)->AppendData(m_ws1); + } + m_ws1.Empty(); + break; + default: + break; + } + if (m_dwStatus == FDE_XMLSYNTAXSTATUS_Error || m_dwStatus == FDE_XMLSYNTAXSTATUS_EOS) { + break; + } + if (pPause != NULL && iCount > 500 && pPause->NeedToPauseNow()) { + break; + } + } + return (m_dwStatus == FDE_XMLSYNTAXSTATUS_Error || m_NodeStack.GetSize() != 1) ? -1 : m_pParser->GetStatus(); +} diff --git a/xfa/src/fxfa/src/parser/xfa_parser_imp.h b/xfa/src/fxfa/src/parser/xfa_parser_imp.h new file mode 100644 index 0000000000..41b1462b94 --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_parser_imp.h @@ -0,0 +1,137 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _XFA_PARSER_IMP +#define _XFA_PARSER_IMP +#define _XFA_VERIFY_Checksum_ +class CXFA_XMLParser; +class CXFA_SimpleParser : public IXFA_Parser, public CFX_Object +{ +public: + CXFA_SimpleParser(IXFA_ObjFactory *pFactory, FX_BOOL bDocumentParser = FALSE); + ~CXFA_SimpleParser(); + virtual void Release() + { + delete this; + } + + virtual FX_INT32 StartParse(IFX_FileRead *pStream, XFA_XDPPACKET ePacketID = XFA_XDPPACKET_XDP); + virtual FX_INT32 DoParse(IFX_Pause *pPause = NULL); + virtual FX_INT32 ParseXMLData(const CFX_WideString &wsXML, IFDE_XMLNode* &pXMLNode, IFX_Pause *pPause = NULL); + virtual void ConstructXFANode(CXFA_Node* pXFANode, IFDE_XMLNode* pXMLNode); + virtual IXFA_ObjFactory* GetFactory() const + { + return m_pFactory; + } + virtual CXFA_Node* GetRootNode() const + { + return m_pRootNode; + } + virtual IFDE_XMLDoc* GetXMLDoc() const + { + return m_pXMLDoc; + } + virtual void CloseParser(); +protected: + CXFA_Node* ParseAsXDPPacket (IFDE_XMLNode* pXMLDocumentNode, XFA_XDPPACKET ePacketID); + CXFA_Node* ParseAsXDPPacket_XDP (IFDE_XMLNode* pXMLDocumentNode, XFA_XDPPACKET ePacketID); + CXFA_Node* ParseAsXDPPacket_Config (IFDE_XMLNode* pXMLDocumentNode, XFA_XDPPACKET ePacketID); + CXFA_Node* ParseAsXDPPacket_TemplateForm (IFDE_XMLNode* pXMLDocumentNode, XFA_XDPPACKET ePacketID); + CXFA_Node* ParseAsXDPPacket_Data (IFDE_XMLNode* pXMLDocumentNode, XFA_XDPPACKET ePacketID); + CXFA_Node* ParseAsXDPPacket_LocaleConnectionSourceSet (IFDE_XMLNode* pXMLDocumentNode, XFA_XDPPACKET ePacketID); + CXFA_Node* ParseAsXDPPacket_Xdc (IFDE_XMLNode* pXMLDocumentNode, XFA_XDPPACKET ePacketID); + CXFA_Node* ParseAsXDPPacket_User (IFDE_XMLNode* pXMLDocumentNode, XFA_XDPPACKET ePacketID); + CXFA_Node* NormalLoader (CXFA_Node* pXFANode, IFDE_XMLNode* pXMLDoc, XFA_XDPPACKET ePacketID, FX_BOOL bUseAttribute = TRUE); + CXFA_Node* DataLoader (CXFA_Node* pXFANode, IFDE_XMLNode* pXMLDoc, FX_BOOL bDoTransform); + CXFA_Node* UserPacketLoader (CXFA_Node* pXFANode, IFDE_XMLNode* pXMLDoc); + void ParseContentNode (CXFA_Node* pXFANode, IFDE_XMLNode* pXMLNode, XFA_XDPPACKET ePacketID); + void ParseDataValue (CXFA_Node* pXFANode, IFDE_XMLNode* pXMLNode, XFA_XDPPACKET ePacketID); + void ParseDataGroup (CXFA_Node* pXFANode, IFDE_XMLNode* pXMLNode, XFA_XDPPACKET ePacketID); + void ParseInstruction (CXFA_Node *pXFANode, IFDE_XMLInstruction *pXMLInstruction, XFA_XDPPACKET ePacketID); +protected: + void SetFactory (IXFA_ObjFactory* pFactory); + CXFA_XMLParser* m_pXMLParser; + IFDE_XMLDoc* m_pXMLDoc; + IFX_Stream* m_pStream; + IFX_FileRead* m_pFileRead; + IXFA_ObjFactory* m_pFactory; + CXFA_Node* m_pRootNode; + XFA_XDPPACKET m_ePacketID; + FX_BOOL m_bDocumentParser; + friend class CXFA_DocumentParser; +}; +class CXFA_DocumentParser : public IXFA_DocParser, public CFX_Object +{ +public: + CXFA_DocumentParser(IXFA_Notify *pNotify); + ~CXFA_DocumentParser(); + virtual void Release() + { + delete this; + } + virtual FX_INT32 StartParse(IFX_FileRead *pStream, XFA_XDPPACKET ePacketID = XFA_XDPPACKET_XDP); + virtual FX_INT32 DoParse(IFX_Pause *pPause = NULL); + virtual FX_INT32 ParseXMLData(const CFX_WideString &wsXML, IFDE_XMLNode* &pXMLNode, IFX_Pause *pPause = NULL); + virtual void ConstructXFANode(CXFA_Node* pXFANode, IFDE_XMLNode* pXMLNode); + virtual IXFA_ObjFactory* GetFactory() const + { + return m_nodeParser.GetFactory(); + } + virtual CXFA_Node* GetRootNode() const + { + return m_nodeParser.GetRootNode(); + } + virtual IFDE_XMLDoc* GetXMLDoc() const + { + return m_nodeParser.GetXMLDoc(); + } + virtual IXFA_Notify* GetNotify() const + { + return m_pNotify; + } + virtual CXFA_Document* GetDocument() const + { + return m_pDocument; + } + virtual void CloseParser(); +protected: + CXFA_SimpleParser m_nodeParser; + IXFA_Notify* m_pNotify; + CXFA_Document* m_pDocument; +}; +typedef CFX_StackTemplate CXFA_XMLNodeStack; +class CXFA_XMLParser : public IFDE_XMLParser, public CFX_Object +{ +public: + CXFA_XMLParser(IFDE_XMLNode *pRoot, IFX_Stream *pStream); + ~CXFA_XMLParser(); + + virtual void Release() + { + delete this; + } + virtual FX_INT32 DoParser(IFX_Pause *pPause); +protected: + IFDE_XMLNode *m_pRoot; + IFX_Stream *m_pStream; + IFDE_XMLSyntaxParser *m_pParser; + + IFDE_XMLNode *m_pParent; + IFDE_XMLNode *m_pChild; + CXFA_XMLNodeStack m_NodeStack; + CFX_WideString m_ws1; + CFX_WideString m_ws2; + FX_DWORD m_dwStatus; +#ifdef _XFA_VERIFY_Checksum_ +public: + FX_FILESIZE m_nStart[2]; + size_t m_nSize[2]; + FX_FILESIZE m_nElementStart; + FX_WORD m_dwCheckStatus; + FX_WORD m_dwCurrentCheckStatus; +#endif +}; +#endif diff --git a/xfa/src/fxfa/src/parser/xfa_script_datawindow.cpp b/xfa/src/fxfa/src/parser/xfa_script_datawindow.cpp new file mode 100644 index 0000000000..dc393d7c9b --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_script_datawindow.cpp @@ -0,0 +1,51 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_utils.h" +#include "../common/xfa_object.h" +#include "../common/xfa_document.h" +#include "../common/xfa_parser.h" +#include "../common/xfa_script.h" +#include "../common/xfa_docdata.h" +#include "../common/xfa_doclayout.h" +#include "../common/xfa_debug.h" +#include "../common/xfa_localemgr.h" +#include "../common/xfa_fm2jsapi.h" +#include "xfa_debug_parser.h" +#include "xfa_script_datawindow.h" +CScript_DataWindow::CScript_DataWindow(CXFA_Document* pDocument) + : CXFA_OrdinaryObject(pDocument, XFA_ELEMENT_DataWindow) +{ + m_uScriptHash = XFA_HASHCODE_DataWindow; +} +CScript_DataWindow::~CScript_DataWindow() +{ +} +void CScript_DataWindow::Script_DataWindow_MoveCurrentRecord(CFXJSE_Arguments* pArguments) +{ +} +void CScript_DataWindow::Script_DataWindow_Record(CFXJSE_Arguments* pArguments) +{ +} +void CScript_DataWindow::Script_DataWindow_GotoRecord(CFXJSE_Arguments* pArguments) +{ +} +void CScript_DataWindow::Script_DataWindow_IsRecordGroup(CFXJSE_Arguments* pArguments) +{ +} +void CScript_DataWindow::Script_DataWindow_RecordsBefore(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ +} +void CScript_DataWindow::Script_DataWindow_CurrentRecordNumber(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ +} +void CScript_DataWindow::Script_DataWindow_RecordsAfter(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ +} +void CScript_DataWindow::Script_DataWindow_IsDefined(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ +} diff --git a/xfa/src/fxfa/src/parser/xfa_script_datawindow.h b/xfa/src/fxfa/src/parser/xfa_script_datawindow.h new file mode 100644 index 0000000000..48fd416826 --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_script_datawindow.h @@ -0,0 +1,23 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _SCRIPT_DATAWINDOW_H_ +#define _SCRIPT_DATAWINDOW_H_ +class CScript_DataWindow : public CXFA_OrdinaryObject +{ +public: + CScript_DataWindow(CXFA_Document* pDocument); + virtual ~CScript_DataWindow(); + void Script_DataWindow_MoveCurrentRecord(CFXJSE_Arguments* pArguments); + void Script_DataWindow_Record(CFXJSE_Arguments* pArguments); + void Script_DataWindow_GotoRecord(CFXJSE_Arguments* pArguments); + void Script_DataWindow_IsRecordGroup(CFXJSE_Arguments* pArguments); + void Script_DataWindow_RecordsBefore(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_DataWindow_CurrentRecordNumber(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_DataWindow_RecordsAfter(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_DataWindow_IsDefined(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); +}; +#endif diff --git a/xfa/src/fxfa/src/parser/xfa_script_eventpseudomodel.cpp b/xfa/src/fxfa/src/parser/xfa_script_eventpseudomodel.cpp new file mode 100644 index 0000000000..fb83349961 --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_script_eventpseudomodel.cpp @@ -0,0 +1,218 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_utils.h" +#include "../common/xfa_object.h" +#include "../common/xfa_document.h" +#include "../common/xfa_parser.h" +#include "../common/xfa_script.h" +#include "../common/xfa_docdata.h" +#include "../common/xfa_doclayout.h" +#include "../common/xfa_debug.h" +#include "../common/xfa_localemgr.h" +#include "../common/xfa_fm2jsapi.h" +#include "xfa_debug_parser.h" +#include "xfa_script_eventpseudomodel.h" +CScript_EventPseudoModel::CScript_EventPseudoModel(CXFA_Document* pDocument) + : CXFA_OrdinaryObject(pDocument, XFA_ELEMENT_EventPseudoModel) +{ + m_uScriptHash = XFA_HASHCODE_Event; +} +CScript_EventPseudoModel::~CScript_EventPseudoModel() +{ +} +void Script_EventPseudoModel_StringProperty(FXJSE_HVALUE hValue, CFX_WideString& wsValue, FX_BOOL bSetting) +{ + if (bSetting) { + CFX_ByteString bsValue; + FXJSE_Value_ToUTF8String(hValue, bsValue); + wsValue = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()); + } else { + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue)); + } +} +void Script_EventPseudoModel_InterProperty(FXJSE_HVALUE hValue, FX_INT32& iValue, FX_BOOL bSetting) +{ + if (bSetting) { + iValue = FXJSE_Value_ToInteger(hValue); + } else { + FXJSE_Value_SetInteger(hValue, iValue); + } +} +void Script_EventPseudoModel_BooleanProperty(FXJSE_HVALUE hValue, FX_BOOL& bValue, FX_BOOL bSetting) +{ + if (bSetting) { + bValue = FXJSE_Value_ToBoolean(hValue); + } else { + FXJSE_Value_SetBoolean(hValue, bValue); + } +} +void CScript_EventPseudoModel::Script_EventPseudoModel_Property(FXJSE_HVALUE hValue, FX_DWORD dwFlag, FX_BOOL bSetting) +{ + IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext(); + if (!pScriptContext) { + return; + } + CXFA_EventParam* pEventParam = pScriptContext->GetEventParam(); + if (!pEventParam) { + return; + } + switch (dwFlag) { + case XFA_EVENT_CANCELACTION: + Script_EventPseudoModel_BooleanProperty(hValue, pEventParam->m_bCancelAction, bSetting); + break; + case XFA_EVENT_CHANGE: + Script_EventPseudoModel_StringProperty(hValue, pEventParam->m_wsChange, bSetting); + break; + case XFA_EVENT_COMMITKEY: + Script_EventPseudoModel_InterProperty(hValue, pEventParam->m_iCommitKey, bSetting); + break; + case XFA_EVENT_FULLTEXT: + Script_EventPseudoModel_StringProperty(hValue, pEventParam->m_wsFullText, bSetting); + break; + case XFA_EVENT_KEYDOWN: + Script_EventPseudoModel_BooleanProperty(hValue, pEventParam->m_bKeyDown, bSetting); + break; + case XFA_EVENT_MODIFIER: + Script_EventPseudoModel_BooleanProperty(hValue, pEventParam->m_bModifier, bSetting); + break; + case XFA_EVENT_NEWCONTENTTYPE: + Script_EventPseudoModel_StringProperty(hValue, pEventParam->m_wsNewContentType, bSetting); + break; + case XFA_EVENT_NEWTEXT: + Script_EventPseudoModel_StringProperty(hValue, pEventParam->m_wsNewText, bSetting); + break; + case XFA_EVENT_PREVCONTENTTYPE: + Script_EventPseudoModel_StringProperty(hValue, pEventParam->m_wsPrevContentType, bSetting); + break; + case XFA_EVENT_PREVTEXT: + Script_EventPseudoModel_StringProperty(hValue, pEventParam->m_wsPrevText, bSetting); + break; + case XFA_EVENT_REENTER: + Script_EventPseudoModel_BooleanProperty(hValue, pEventParam->m_bReenter, bSetting); + break; + case XFA_EVENT_SELEND: + Script_EventPseudoModel_InterProperty(hValue, pEventParam->m_iSelEnd, bSetting); + break; + case XFA_EVENT_SELSTART: + Script_EventPseudoModel_InterProperty(hValue, pEventParam->m_iSelStart, bSetting); + break; + case XFA_EVENT_SHIFT: + Script_EventPseudoModel_BooleanProperty(hValue, pEventParam->m_bShift, bSetting); + break; + case XFA_EVENT_SOAPFAULTCODE: + Script_EventPseudoModel_StringProperty(hValue, pEventParam->m_wsSoapFaultCode, bSetting); + break; + case XFA_EVENT_SOAPFAULTSTRING: + Script_EventPseudoModel_StringProperty(hValue, pEventParam->m_wsSoapFaultString, bSetting); + break; + case XFA_EVENT_TARGET: + break; + default: + break; + } +} +void CScript_EventPseudoModel::Script_EventPseudoModel_CancelAction(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + Script_EventPseudoModel_Property(hValue, XFA_EVENT_CANCELACTION, bSetting); +} +void CScript_EventPseudoModel::Script_EventPseudoModel_Change(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + Script_EventPseudoModel_Property(hValue, XFA_EVENT_CHANGE, bSetting); +} +void CScript_EventPseudoModel::Script_EventPseudoModel_CommitKey(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + Script_EventPseudoModel_Property(hValue, XFA_EVENT_COMMITKEY, bSetting); +} +void CScript_EventPseudoModel::Script_EventPseudoModel_FullText(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + Script_EventPseudoModel_Property(hValue, XFA_EVENT_FULLTEXT, bSetting); +} +void CScript_EventPseudoModel::Script_EventPseudoModel_KeyDown(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + Script_EventPseudoModel_Property(hValue, XFA_EVENT_KEYDOWN, bSetting); +} +void CScript_EventPseudoModel::Script_EventPseudoModel_Modifier(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + Script_EventPseudoModel_Property(hValue, XFA_EVENT_MODIFIER, bSetting); +} +void CScript_EventPseudoModel::Script_EventPseudoModel_NewContentType(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + Script_EventPseudoModel_Property(hValue, XFA_EVENT_NEWCONTENTTYPE, bSetting); +} +void CScript_EventPseudoModel::Script_EventPseudoModel_NewText(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + Script_EventPseudoModel_Property(hValue, XFA_EVENT_NEWTEXT, bSetting); +} +void CScript_EventPseudoModel::Script_EventPseudoModel_PrevContentType(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + Script_EventPseudoModel_Property(hValue, XFA_EVENT_PREVCONTENTTYPE, bSetting); +} +void CScript_EventPseudoModel::Script_EventPseudoModel_PrevText(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + Script_EventPseudoModel_Property(hValue, XFA_EVENT_PREVTEXT, bSetting); +} +void CScript_EventPseudoModel::Script_EventPseudoModel_Reenter(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + Script_EventPseudoModel_Property(hValue, XFA_EVENT_REENTER, bSetting); +} +void CScript_EventPseudoModel::Script_EventPseudoModel_SelEnd(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + Script_EventPseudoModel_Property(hValue, XFA_EVENT_SELEND, bSetting); +} +void CScript_EventPseudoModel::Script_EventPseudoModel_SelStart(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + Script_EventPseudoModel_Property(hValue, XFA_EVENT_SELSTART, bSetting); +} +void CScript_EventPseudoModel::Script_EventPseudoModel_Shift(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + Script_EventPseudoModel_Property(hValue, XFA_EVENT_SHIFT, bSetting); +} +void CScript_EventPseudoModel::Script_EventPseudoModel_SoapFaultCode(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + Script_EventPseudoModel_Property(hValue, XFA_EVENT_SOAPFAULTCODE, bSetting); +} +void CScript_EventPseudoModel::Script_EventPseudoModel_SoapFaultString(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + Script_EventPseudoModel_Property(hValue, XFA_EVENT_SOAPFAULTSTRING, bSetting); +} +void CScript_EventPseudoModel::Script_EventPseudoModel_Target(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + Script_EventPseudoModel_Property(hValue, XFA_EVENT_TARGET, bSetting); +} +void CScript_EventPseudoModel::Script_EventPseudoModel_Emit(CFXJSE_Arguments* pArguments) +{ + IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext(); + if (!pScriptContext) { + return; + } + CXFA_EventParam* pEventParam = pScriptContext->GetEventParam(); + if (!pEventParam) { + return; + } + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + IXFA_WidgetHandler* pWidgetHandler = pNotify->GetWidgetHandler(); + if (!pWidgetHandler) { + return; + } + pWidgetHandler->ProcessEvent(pEventParam->m_pTarget, pEventParam); +} +void CScript_EventPseudoModel::Script_EventPseudoModel_Reset(CFXJSE_Arguments* pArguments) +{ + IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext(); + if (!pScriptContext) { + return; + } + CXFA_EventParam* pEventParam = pScriptContext->GetEventParam(); + if (!pEventParam) { + return; + } + pEventParam->Reset(); +} diff --git a/xfa/src/fxfa/src/parser/xfa_script_eventpseudomodel.h b/xfa/src/fxfa/src/parser/xfa_script_eventpseudomodel.h new file mode 100644 index 0000000000..83c59e0917 --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_script_eventpseudomodel.h @@ -0,0 +1,56 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _SCRIPT_EVENTPSEUDOMODEL_H_ +#define _SCRIPT_EVENTPSEUDOMODEL_H_ +#define XFA_EVENT_CHANGE 0 +#define XFA_EVENT_COMMITKEY 1 +#define XFA_EVENT_FULLTEXT 2 +#define XFA_EVENT_KEYDOWN 3 +#define XFA_EVENT_MODIFIER 4 +#define XFA_EVENT_NEWCONTENTTYPE 5 +#define XFA_EVENT_NEWTEXT 6 +#define XFA_EVENT_PREVCONTENTTYPE 7 +#define XFA_EVENT_PREVTEXT 8 +#define XFA_EVENT_REENTER 9 +#define XFA_EVENT_SELEND 10 +#define XFA_EVENT_SELSTART 11 +#define XFA_EVENT_SHIFT 12 +#define XFA_EVENT_SOAPFAULTCODE 13 +#define XFA_EVENT_SOAPFAULTSTRING 14 +#define XFA_EVENT_TARGET 15 +#define XFA_EVENT_CANCELACTION 16 +class CScript_EventPseudoModel : public CXFA_OrdinaryObject +{ +public: + CScript_EventPseudoModel(CXFA_Document* pDocument); + virtual ~CScript_EventPseudoModel(); + + void Script_EventPseudoModel_CancelAction(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_EventPseudoModel_Change(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_EventPseudoModel_CommitKey(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_EventPseudoModel_FullText(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_EventPseudoModel_KeyDown(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_EventPseudoModel_Modifier(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_EventPseudoModel_NewContentType(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_EventPseudoModel_NewText(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_EventPseudoModel_PrevContentType(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_EventPseudoModel_PrevText(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_EventPseudoModel_Reenter(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_EventPseudoModel_SelEnd(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_EventPseudoModel_SelStart(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_EventPseudoModel_Shift(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_EventPseudoModel_SoapFaultCode(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_EventPseudoModel_SoapFaultString(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_EventPseudoModel_Target(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + + + void Script_EventPseudoModel_Emit(CFXJSE_Arguments* pArguments); + void Script_EventPseudoModel_Reset(CFXJSE_Arguments* pArguments); +protected: + void Script_EventPseudoModel_Property(FXJSE_HVALUE hValue, FX_DWORD dwFlag, FX_BOOL bSetting); +}; +#endif diff --git a/xfa/src/fxfa/src/parser/xfa_script_hostpseudomodel.cpp b/xfa/src/fxfa/src/parser/xfa_script_hostpseudomodel.cpp new file mode 100644 index 0000000000..6fd7baad8a --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_script_hostpseudomodel.cpp @@ -0,0 +1,754 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_utils.h" +#include "../common/xfa_object.h" +#include "../common/xfa_document.h" +#include "../common/xfa_parser.h" +#include "../common/xfa_script.h" +#include "../common/xfa_docdata.h" +#include "../common/xfa_doclayout.h" +#include "../common/xfa_debug.h" +#include "../common/xfa_localemgr.h" +#include "../common/xfa_fm2jsapi.h" +#include "xfa_debug_parser.h" +#include "xfa_script_hostpseudomodel.h" +CScript_HostPseudoModel::CScript_HostPseudoModel(CXFA_Document* pDocument) + : CXFA_OrdinaryObject(pDocument, XFA_ELEMENT_HostPseudoModel) +{ + m_uScriptHash = XFA_HASHCODE_Host; +} +CScript_HostPseudoModel::~CScript_HostPseudoModel() +{ +} +void CScript_HostPseudoModel::Script_HostPseudoModel_LoadString(FXJSE_HVALUE hValue, IXFA_Notify* pNotify, FX_DWORD dwFlag) +{ + CFX_WideString wsValue; + pNotify->GetAppProvider()->LoadString(dwFlag, wsValue); + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue)); +} +void CScript_HostPseudoModel::Script_HostPseudoModel_AppType(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + if (bSetting) { + ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); + return; + } + CFX_WideString wsAppType; + pNotify->GetAppProvider()->GetAppType(wsAppType); + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsAppType)); +} +void CScript_HostPseudoModel::Script_HostPseudoModel_FoxitAppType(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + if (bSetting) { + ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); + return; + } + CFX_WideString wsAppType; + pNotify->GetAppProvider()->GetFoxitAppType(wsAppType); + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsAppType)); +} +void CScript_HostPseudoModel::Script_HostPseudoModel_CalculationsEnabled(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + XFA_HDOC hDoc = pNotify->GetHDOC(); + if (bSetting) { + pNotify->GetDocProvider()->SetCalculationsEnabled(hDoc, FXJSE_Value_ToBoolean(hValue)); + return; + } + FX_BOOL bEnabled = pNotify->GetDocProvider()->IsCalculationsEnabled(hDoc); + FXJSE_Value_SetBoolean(hValue, bEnabled); +} +void CScript_HostPseudoModel::Script_HostPseudoModel_CurrentPage(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + XFA_HDOC hDoc = pNotify->GetHDOC(); + if (bSetting) { + pNotify->GetDocProvider()->SetCurrentPage(hDoc, FXJSE_Value_ToInteger(hValue)); + return; + } + FX_INT32 iCurrentPage = pNotify->GetDocProvider()->GetCurrentPage(hDoc); + FXJSE_Value_SetInteger(hValue, iCurrentPage); +} +void CScript_HostPseudoModel::Script_HostPseudoModel_Language(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + if (bSetting) { + ThrowScriptErrorMessage(XFA_IDS_UNABLE_SET_LANGUAGE); + return; + } + CFX_WideString wsLanguage; + pNotify->GetAppProvider()->GetLanguage(wsLanguage); + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsLanguage)); +} +void CScript_HostPseudoModel::Script_HostPseudoModel_NumPages(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + XFA_HDOC hDoc = pNotify->GetHDOC(); + if (bSetting) { + ThrowScriptErrorMessage(XFA_IDS_UNABLE_SET_NUMPAGES); + return; + } + FX_INT32 iNumPages = pNotify->GetDocProvider()->CountPages(hDoc); + FXJSE_Value_SetInteger(hValue, iNumPages); +} +void CScript_HostPseudoModel::Script_HostPseudoModel_Platform(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + if (bSetting) { + ThrowScriptErrorMessage(XFA_IDS_UNABLE_SET_PLATFORM); + return; + } + CFX_WideString wsPlatform; + pNotify->GetAppProvider()->GetPlatform(wsPlatform); + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsPlatform)); +} +void CScript_HostPseudoModel::Script_HostPseudoModel_Title(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (!m_pDocument->GetScriptContext()->IsRunAtClient()) { + return; + } + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + XFA_HDOC hDoc = pNotify->GetHDOC(); + if (bSetting) { + CFX_ByteString bsValue; + FXJSE_Value_ToUTF8String(hValue, bsValue); + pNotify->GetDocProvider()->SetTitle(hDoc, CFX_WideString::FromUTF8(bsValue, bsValue.GetLength())); + return; + } + CFX_WideString wsTitle; + pNotify->GetDocProvider()->GetTitle(hDoc, wsTitle); + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsTitle)); +} +void CScript_HostPseudoModel::Script_HostPseudoModel_ValidationsEnabled(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + XFA_HDOC hDoc = pNotify->GetHDOC(); + if (bSetting) { + pNotify->GetDocProvider()->SetValidationsEnabled(hDoc, FXJSE_Value_ToBoolean(hValue)); + return; + } + FX_BOOL bEnabled = pNotify->GetDocProvider()->IsValidationsEnabled(hDoc); + FXJSE_Value_SetBoolean(hValue, bEnabled); +} +void CScript_HostPseudoModel::Script_HostPseudoModel_Variation(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + if (!m_pDocument->GetScriptContext()->IsRunAtClient()) { + return; + } + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + if (bSetting) { + ThrowScriptErrorMessage(XFA_IDS_UNABLE_SET_VARIATION); + return; + } + CFX_WideString wsVariation; + pNotify->GetAppProvider()->GetVariation(wsVariation); + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsVariation)); +} +void CScript_HostPseudoModel::Script_HostPseudoModel_Version(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + if (bSetting) { + ThrowScriptErrorMessage(XFA_IDS_UNABLE_SET_VERSION); + return; + } + CFX_WideString wsVersion; + pNotify->GetAppProvider()->GetVersion(wsVersion); + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsVersion)); +} +void CScript_HostPseudoModel::Script_HostPseudoModel_FoxitVersion(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + if (bSetting) { + ThrowScriptErrorMessage(XFA_IDS_UNABLE_SET_VERSION); + return; + } + CFX_WideString wsVersion; + pNotify->GetAppProvider()->GetFoxitVersion(wsVersion); + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsVersion)); +} +void CScript_HostPseudoModel::Script_HostPseudoModel_Name(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + if (bSetting) { + ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); + return; + } + CFX_WideString wsAppName; + pNotify->GetAppProvider()->GetAppName(wsAppName); + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsAppName)); +} +void CScript_HostPseudoModel::Script_HostPseudoModel_FoxitName(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + if (bSetting) { + ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); + return; + } + CFX_WideString wsFoxitAppName; + pNotify->GetAppProvider()->GetFoxitAppName(wsFoxitAppName); + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsFoxitAppName)); +} +void CScript_HostPseudoModel::Script_HostPseudoModel_GotoURL(CFXJSE_Arguments* pArguments) +{ + if (!m_pDocument->GetScriptContext()->IsRunAtClient()) { + return; + } + FX_INT32 iLength = pArguments->GetLength(); + if (iLength != 1) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"gotoURL")); + return; + } + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + XFA_HDOC hDoc = pNotify->GetHDOC(); + CFX_WideString wsURL; + if (iLength >= 1) { + CFX_ByteString bsURL = pArguments->GetUTF8String(0); + wsURL = CFX_WideString::FromUTF8(bsURL, bsURL.GetLength()); + } + pNotify->GetDocProvider()->GotoURL(hDoc, wsURL); +} +void CScript_HostPseudoModel::Script_HostPseudoModel_OpenList(CFXJSE_Arguments* pArguments) +{ + if (!m_pDocument->GetScriptContext()->IsRunAtClient()) { + return; + } + FX_INT32 iLength = pArguments->GetLength(); + if (iLength != 1) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"openList")); + return; + } + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + CXFA_Node* pNode = NULL; + if (iLength >= 1) { + FXJSE_HVALUE hValue = pArguments->GetValue(0); + if (FXJSE_Value_IsObject(hValue)) { + pNode = (CXFA_Node*)FXJSE_Value_ToObject(hValue, NULL); + } else if (FXJSE_Value_IsUTF8String(hValue)) { + CFX_ByteString bsString; + FXJSE_Value_ToUTF8String(hValue, bsString); + CFX_WideString wsExpression = CFX_WideString::FromUTF8(bsString, bsString.GetLength()); + IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext(); + if (!pScriptContext) { + FXJSE_Value_Release(hValue); + return; + } + CXFA_Object* pObject = pScriptContext->GetThisObject(); + if (!pObject) { + FXJSE_Value_Release(hValue); + return; + } + FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings; + XFA_RESOLVENODE_RS resoveNodeRS; + FX_INT32 iRet = pScriptContext->ResolveObjects(pObject, wsExpression, resoveNodeRS, dwFlag); + if (iRet < 1 || !resoveNodeRS.nodes[0]->IsNode()) { + FXJSE_Value_Release(hValue); + return; + } + pNode = (CXFA_Node*)resoveNodeRS.nodes[0]; + } + FXJSE_Value_Release(hValue); + } + IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout(); + if (!pDocLayout) { + return; + } + XFA_HWIDGET hWidget = pNotify->GetHWidget(pDocLayout->GetLayoutItem(pNode)); + if (!hWidget) { + return; + } + pNotify->GetDocProvider()->SetFocusWidget(pNotify->GetHDOC(), hWidget); + pNotify->OpenDropDownList(hWidget); +} +void CScript_HostPseudoModel::Script_HostPseudoModel_Response(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength < 1 || iLength > 4) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"response")); + return; + } + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + CFX_WideString wsQuestion; + CFX_WideString wsTitle; + CFX_WideString wsDefaultAnswer; + FX_BOOL bMark = FALSE; + if (iLength >= 1) { + CFX_ByteString bsQuestion = pArguments->GetUTF8String(0); + wsQuestion = CFX_WideString::FromUTF8(bsQuestion, bsQuestion.GetLength()); + } + if (iLength >= 2) { + CFX_ByteString bsTitle = pArguments->GetUTF8String(1); + wsTitle = CFX_WideString::FromUTF8(bsTitle, bsTitle.GetLength()); + } + if (iLength >= 3) { + CFX_ByteString bsDefaultAnswer = pArguments->GetUTF8String(2); + wsDefaultAnswer = CFX_WideString::FromUTF8(bsDefaultAnswer, bsDefaultAnswer.GetLength()); + } + if (iLength >= 4) { + bMark = pArguments->GetInt32(3) == 0 ? FALSE : TRUE; + } + CFX_WideString wsAnswer; + pNotify->GetAppProvider()->Response(wsAnswer, wsQuestion, wsTitle, wsDefaultAnswer, bMark); + FXJSE_HVALUE hValue = pArguments->GetReturnValue(); + if (hValue) { + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsAnswer)); + } +} +void CScript_HostPseudoModel::Script_HostPseudoModel_DocumentInBatch(CFXJSE_Arguments* pArguments) +{ + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + FX_INT32 iCur = pNotify->GetAppProvider()->GetCurDocumentInBatch(); + FXJSE_HVALUE hValue = pArguments->GetReturnValue(); + if (hValue) { + FXJSE_Value_SetInteger(hValue, iCur); + } +} +static FX_INT32 XFA_FilterName(FX_WSTR wsExpression, FX_INT32 nStart, CFX_WideString &wsFilter) +{ + FXSYS_assert(nStart > -1); + FX_INT32 iLength = wsExpression.GetLength(); + if (nStart >= iLength) { + return iLength; + } + FX_LPWSTR pBuf = wsFilter.GetBuffer(iLength - nStart); + FX_INT32 nCount = 0; + FX_LPCWSTR pSrc = wsExpression.GetPtr(); + FX_WCHAR wCur; + while (nStart < iLength) { + wCur = pSrc[nStart ++]; + if (wCur == ',') { + break; + } + pBuf[nCount ++] = wCur; + } + wsFilter.ReleaseBuffer(nCount); + wsFilter.TrimLeft(); + wsFilter.TrimRight(); + return nStart; +} +void CScript_HostPseudoModel::Script_HostPseudoModel_ResetData(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength < 0 || iLength > 1) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"resetData")); + return; + } + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + CFX_WideString wsExpression; + if (iLength >= 1) { + CFX_ByteString bsExpression = pArguments->GetUTF8String(0); + wsExpression = CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength()); + } + if (wsExpression.IsEmpty()) { + pNotify->ResetData(); + return; + } + FX_INT32 iStart = 0; + CFX_WideString wsName; + CXFA_Node* pNode = NULL; + FX_INT32 iExpLength = wsExpression.GetLength(); + while (iStart < iExpLength) { + iStart = XFA_FilterName(wsExpression, iStart, wsName); + IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext(); + if (!pScriptContext) { + return; + } + CXFA_Object* pObject = pScriptContext->GetThisObject(); + if (!pObject) { + return; + } + FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings; + XFA_RESOLVENODE_RS resoveNodeRS; + FX_INT32 iRet = pScriptContext->ResolveObjects(pObject, wsName, resoveNodeRS, dwFlag); + if (iRet < 1 || !resoveNodeRS.nodes[0]->IsNode()) { + continue; + } + pNode = (CXFA_Node*)resoveNodeRS.nodes[0]; + pNotify->ResetData(pNode->GetWidgetData()); + } + if (!pNode) { + pNotify->ResetData(); + } +} +void CScript_HostPseudoModel::Script_HostPseudoModel_Beep(CFXJSE_Arguments* pArguments) +{ + if (!m_pDocument->GetScriptContext()->IsRunAtClient()) { + return; + } + FX_INT32 iLength = pArguments->GetLength(); + if (iLength < 0 || iLength > 1) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"beep")); + return; + } + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + FX_DWORD dwType = 4; + if (iLength >= 1) { + dwType = pArguments->GetInt32(0); + } + pNotify->GetAppProvider()->Beep(dwType); +} +void CScript_HostPseudoModel::Script_HostPseudoModel_SetFocus(CFXJSE_Arguments* pArguments) +{ + if (!m_pDocument->GetScriptContext()->IsRunAtClient()) { + return; + } + FX_INT32 iLength = pArguments->GetLength(); + if (iLength != 1) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"setFocus")); + return; + } + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + XFA_HDOC hDoc = pNotify->GetHDOC(); + CXFA_Node* pNode = NULL; + if (iLength >= 1) { + FXJSE_HVALUE hValue = pArguments->GetValue(0); + if (FXJSE_Value_IsObject(hValue)) { + pNode = (CXFA_Node*)FXJSE_Value_ToObject(hValue, NULL); + } else if (FXJSE_Value_IsUTF8String(hValue)) { + CFX_ByteString bsString; + FXJSE_Value_ToUTF8String(hValue, bsString); + CFX_WideString wsExpression = CFX_WideString::FromUTF8(bsString, bsString.GetLength()); + IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext(); + if (!pScriptContext) { + FXJSE_Value_Release(hValue); + return; + } + CXFA_Object* pObject = pScriptContext->GetThisObject(); + if (!pObject) { + FXJSE_Value_Release(hValue); + return; + } + FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings; + XFA_RESOLVENODE_RS resoveNodeRS; + FX_INT32 iRet = pScriptContext->ResolveObjects(pObject, wsExpression, resoveNodeRS, dwFlag); + if (iRet < 1 || !resoveNodeRS.nodes[0]->IsNode()) { + FXJSE_Value_Release(hValue); + return; + } + pNode = (CXFA_Node*)resoveNodeRS.nodes[0]; + } + FXJSE_Value_Release(hValue); + } + pNotify->SetFocusWidgetNode(pNode); +} +void CScript_HostPseudoModel::Script_HostPseudoModel_GetFocus(CFXJSE_Arguments* pArguments) +{ + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + CXFA_Node* pNode = pNotify->GetFocusWidgetNode(); + if (!pNode) { + return; + } + FXJSE_Value_Set(pArguments->GetReturnValue(), m_pDocument->GetScriptContext()->GetJSValueFromMap(pNode)); +} +void CScript_HostPseudoModel::Script_HostPseudoModel_MessageBox(CFXJSE_Arguments* pArguments) +{ + if (!m_pDocument->GetScriptContext()->IsRunAtClient()) { + return; + } + FX_INT32 iLength = pArguments->GetLength(); + if (iLength < 1 || iLength > 4) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"messageBox")); + return; + } + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + CFX_WideString wsMessage; + CFX_WideString bsTitle; + FX_DWORD dwMessageType = XFA_MBICON_Error; + FX_DWORD dwButtonType = XFA_MB_OK; + if (iLength >= 1) { + if(!Script_HostPseudoModel_ValidateArgsForMsg(pArguments, 0, wsMessage)) { + return; + } + } + if (iLength >= 2) { + if(!Script_HostPseudoModel_ValidateArgsForMsg(pArguments, 1, bsTitle)) { + return; + } + } + if (iLength >= 3) { + dwMessageType = pArguments->GetInt32(2); + if (dwMessageType > XFA_MBICON_Status) { + dwMessageType = XFA_MBICON_Error; + } + } + if (iLength >= 4) { + dwButtonType = pArguments->GetInt32(3); + if (dwButtonType > XFA_MB_YesNoCancel) { + dwButtonType = XFA_MB_OK; + } + } + FX_INT32 iValue = pNotify->GetAppProvider()->MsgBox(wsMessage, bsTitle, dwMessageType, dwButtonType); + FXJSE_HVALUE hValue = pArguments->GetReturnValue(); + if (hValue) { + FXJSE_Value_SetInteger(hValue, iValue); + } +} +FX_BOOL CScript_HostPseudoModel::Script_HostPseudoModel_ValidateArgsForMsg(CFXJSE_Arguments* pArguments, FX_INT32 iArgIndex, CFX_WideString& wsValue) +{ + if(pArguments == NULL || iArgIndex < 0) { + return FALSE; + } + FX_BOOL bIsJsType = FALSE; + if(m_pDocument->GetScriptContext()->GetType() == XFA_SCRIPTLANGTYPE_Javascript) { + bIsJsType = TRUE; + } + FXJSE_HVALUE hValueArg = pArguments->GetValue(iArgIndex); + if(!FXJSE_Value_IsUTF8String(hValueArg) && bIsJsType) { + ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); + FXJSE_Value_Release(hValueArg); + return FALSE; + } + if(FXJSE_Value_IsNull(hValueArg)) { + wsValue = FX_WSTRC(L""); + } else { + CFX_ByteString byMessage; + FXJSE_Value_ToUTF8String(hValueArg, byMessage); + wsValue = CFX_WideString::FromUTF8(byMessage, byMessage.GetLength()); + } + FXJSE_Value_Release(hValueArg); + return TRUE; +} +void CScript_HostPseudoModel::Script_HostPseudoModel_DocumentCountInBatch(CFXJSE_Arguments* pArguments) +{ + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + FX_INT32 iValue = pNotify->GetAppProvider()->GetDocumentCountInBatch(); + FXJSE_HVALUE hValue = pArguments->GetReturnValue(); + if (hValue) { + FXJSE_Value_SetInteger(hValue, iValue); + } +} +void CScript_HostPseudoModel::Script_HostPseudoModel_Print(CFXJSE_Arguments* pArguments) +{ + if (!m_pDocument->GetScriptContext()->IsRunAtClient()) { + return; + } + FX_INT32 iLength = pArguments->GetLength(); + if (iLength != 8) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"print")); + return; + } + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + XFA_HDOC hDoc = pNotify->GetHDOC(); + FX_DWORD dwOptions = 0; + FX_BOOL bShowDialog = TRUE; + if (iLength >= 1) { + bShowDialog = pArguments->GetInt32(0) == 0 ? FALSE : TRUE; + } + if(bShowDialog) { + dwOptions |= XFA_PRINTOPT_ShowDialog; + } + FX_INT32 nStartPage = 0; + if (iLength >= 2) { + nStartPage = pArguments->GetInt32(1); + } + FX_INT32 nEndPage = 0; + if (iLength >= 3) { + nEndPage = pArguments->GetInt32(2); + } + FX_BOOL bCanCancel = TRUE; + if (iLength >= 4) { + bCanCancel = pArguments->GetInt32(3) == 0 ? FALSE : TRUE; + } + if(bCanCancel) { + dwOptions |= XFA_PRINTOPT_CanCancel; + } + FX_BOOL bShrinkPage = TRUE; + if (iLength >= 5) { + bShrinkPage = pArguments->GetInt32(4) == 0 ? FALSE : TRUE; + } + if(bShrinkPage) { + dwOptions |= XFA_PRINTOPT_ShrinkPage; + } + FX_BOOL bAsImage = TRUE; + if (iLength >= 6) { + bAsImage = pArguments->GetInt32(5) == 0 ? FALSE : TRUE; + } + if(bAsImage) { + dwOptions |= XFA_PRINTOPT_AsImage; + } + FX_BOOL bReverseOrder = TRUE; + if (iLength >= 7) { + bAsImage = pArguments->GetInt32(5) == 0 ? FALSE : TRUE; + } + bReverseOrder = pArguments->GetInt32(6) == 0 ? FALSE : TRUE; + if(bReverseOrder) { + dwOptions |= XFA_PRINTOPT_ReverseOrder; + } + FX_BOOL bPrintAnnot = TRUE; + if (iLength >= 8) { + bPrintAnnot = pArguments->GetInt32(7) == 0 ? FALSE : TRUE; + } + if(bPrintAnnot) { + dwOptions |= XFA_PRINTOPT_PrintAnnot; + } + pNotify->GetDocProvider()->Print(hDoc, nStartPage, nEndPage, dwOptions); +} +void CScript_HostPseudoModel::Script_HostPseudoModel_ImportData(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength < 0 || iLength > 1) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"importData")); + return; + } + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + CFX_WideString wsFilePath; + if (iLength > 0) { + CFX_ByteString bsFilePath = pArguments->GetUTF8String(0); + wsFilePath = CFX_WideString::FromUTF8(bsFilePath, bsFilePath.GetLength()); + } + XFA_HDOC hDoc = pNotify->GetHDOC(); + pNotify->GetDocProvider()->ImportData(hDoc, wsFilePath); +} +void CScript_HostPseudoModel::Script_HostPseudoModel_ExportData(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength < 0 || iLength > 2) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"exportData")); + return; + } + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + XFA_HDOC hDoc = pNotify->GetHDOC(); + CFX_WideString wsFilePath; + FX_BOOL bXDP = TRUE; + if (iLength >= 1) { + CFX_ByteString bsFilePath = pArguments->GetUTF8String(0); + wsFilePath = CFX_WideString::FromUTF8(bsFilePath, bsFilePath.GetLength()); + } + if (iLength >= 2) { + bXDP = pArguments->GetInt32(1) == 0 ? FALSE : TRUE; + } + pNotify->GetDocProvider()->ExportData(hDoc, wsFilePath, bXDP); +} +void CScript_HostPseudoModel::Script_HostPseudoModel_PageUp(CFXJSE_Arguments* pArguments) +{ + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + XFA_HDOC hDoc = pNotify->GetHDOC(); + FX_INT32 nCurPage = pNotify->GetDocProvider()->GetCurrentPage(hDoc); + FX_INT32 nNewPage = 0; + if (nCurPage <= 1) { + return; + } + nNewPage = nCurPage - 1; + pNotify->GetDocProvider()->SetCurrentPage(hDoc, nNewPage); +} +void CScript_HostPseudoModel::Script_HostPseudoModel_PageDown(CFXJSE_Arguments* pArguments) +{ + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + XFA_HDOC hDoc = pNotify->GetHDOC(); + FX_INT32 nCurPage = pNotify->GetDocProvider()->GetCurrentPage(hDoc); + FX_INT32 nPageCount = pNotify->GetDocProvider()->CountPages(hDoc); + if (!nPageCount || nCurPage == nPageCount) { + return; + } + FX_INT32 nNewPage = 0; + if (nCurPage >= nPageCount) { + nNewPage = nPageCount - 1; + } else { + nNewPage = nCurPage + 1; + } + pNotify->GetDocProvider()->SetCurrentPage(hDoc, nNewPage); +} +void CScript_HostPseudoModel::Script_HostPseudoModel_CurrentDateTime(CFXJSE_Arguments* pArguments) +{ + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + CFX_WideString wsDataTime = pNotify->GetCurrentDateTime(); + FXJSE_HVALUE hValue = pArguments->GetReturnValue(); + if (hValue) { + FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsDataTime)); + } +} diff --git a/xfa/src/fxfa/src/parser/xfa_script_hostpseudomodel.h b/xfa/src/fxfa/src/parser/xfa_script_hostpseudomodel.h new file mode 100644 index 0000000000..118680e792 --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_script_hostpseudomodel.h @@ -0,0 +1,50 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _SCRIPT_HOSTPSEUDOMODEL_H_ +#define _SCRIPT_HOSTPSEUDOMODEL_H_ +class CScript_HostPseudoModel : public CXFA_OrdinaryObject +{ +public: + CScript_HostPseudoModel(CXFA_Document* pDocument); + virtual ~CScript_HostPseudoModel(); + + void Script_HostPseudoModel_AppType(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_HostPseudoModel_FoxitAppType(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_HostPseudoModel_CalculationsEnabled(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_HostPseudoModel_CurrentPage(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_HostPseudoModel_Language(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_HostPseudoModel_NumPages(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_HostPseudoModel_Platform(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_HostPseudoModel_Title(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_HostPseudoModel_ValidationsEnabled(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_HostPseudoModel_Variation(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_HostPseudoModel_Version(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_HostPseudoModel_FoxitVersion(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_HostPseudoModel_Name(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + void Script_HostPseudoModel_FoxitName(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + + void Script_HostPseudoModel_GotoURL(CFXJSE_Arguments* pArguments); + void Script_HostPseudoModel_OpenList(CFXJSE_Arguments* pArguments); + void Script_HostPseudoModel_Response(CFXJSE_Arguments* pArguments); + void Script_HostPseudoModel_DocumentInBatch(CFXJSE_Arguments* pArguments); + void Script_HostPseudoModel_ResetData(CFXJSE_Arguments* pArguments); + void Script_HostPseudoModel_Beep(CFXJSE_Arguments* pArguments); + void Script_HostPseudoModel_SetFocus(CFXJSE_Arguments* pArguments); + void Script_HostPseudoModel_GetFocus(CFXJSE_Arguments* pArguments); + void Script_HostPseudoModel_MessageBox(CFXJSE_Arguments* pArguments); + void Script_HostPseudoModel_DocumentCountInBatch(CFXJSE_Arguments* pArguments); + void Script_HostPseudoModel_Print(CFXJSE_Arguments* pArguments); + void Script_HostPseudoModel_ImportData(CFXJSE_Arguments* pArguments); + void Script_HostPseudoModel_ExportData(CFXJSE_Arguments* pArguments); + void Script_HostPseudoModel_PageUp(CFXJSE_Arguments* pArguments); + void Script_HostPseudoModel_PageDown(CFXJSE_Arguments* pArguments); + void Script_HostPseudoModel_CurrentDateTime(CFXJSE_Arguments* pArguments); +protected: + void Script_HostPseudoModel_LoadString(FXJSE_HVALUE hValue, IXFA_Notify* pNotify, FX_DWORD dwFlag); + FX_BOOL Script_HostPseudoModel_ValidateArgsForMsg(CFXJSE_Arguments* pArguments, FX_INT32 iArgIndex, CFX_WideString& wsValue); +}; +#endif diff --git a/xfa/src/fxfa/src/parser/xfa_script_imp.cpp b/xfa/src/fxfa/src/parser/xfa_script_imp.cpp new file mode 100644 index 0000000000..bdf59ca082 --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_script_imp.cpp @@ -0,0 +1,750 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_utils.h" +#include "../common/xfa_object.h" +#include "../common/xfa_document.h" +#include "../common/xfa_parser.h" +#include "../common/xfa_script.h" +#include "../common/xfa_docdata.h" +#include "../common/xfa_doclayout.h" +#include "../common/xfa_debug.h" +#include "../common/xfa_localemgr.h" +#include "../common/xfa_fm2jsapi.h" +#include "xfa_debug_parser.h" +#include "xfa_script_imp.h" +#include "xfa_script_resolveprocessor.h" +#include "xfa_script_nodehelper.h" +CXFA_ScriptContext::CXFA_ScriptContext(CXFA_Document* pDocument) + : m_pDocument(pDocument), m_hJsRuntime(NULL), m_hJsContext(NULL), m_hJsClass(NULL) + , m_pEventParam(NULL), m_pResolveProcessor(NULL), m_eScriptType(XFA_SCRIPTLANGTYPE_Unkown) + , m_hFM2JSContext(NULL), m_pThisObject(NULL), m_pScriptNodeArray(NULL) + , m_dwBuiltInInFlags(0) + , m_eRunAtType(XFA_ATTRIBUTEENUM_Client) +{ + FX_memset(&m_JsGlobalClass, 0, sizeof(FXJSE_CLASS)); + FX_memset(&m_JsNormalClass, 0, sizeof(FXJSE_CLASS)); +} +CXFA_ScriptContext::~CXFA_ScriptContext() +{ + FX_POSITION ps = m_mapXFAToHValue.GetStartPosition(); + while (ps) { + CXFA_Object* pXFAObj; + FXJSE_HVALUE pValue; + m_mapXFAToHValue.GetNextAssoc(ps, pXFAObj, pValue); + FXJSE_Value_Release(pValue); + } + m_mapXFAToHValue.RemoveAll(); + ReleaseVariablesMap(); + if(m_hFM2JSContext) { + XFA_FM2JS_ContextRelease(m_hFM2JSContext); + m_hFM2JSContext = NULL; + } + if(m_hJsContext) { + FXJSE_Context_Release(m_hJsContext); + m_hJsContext = NULL; + } + if(m_pResolveProcessor) { + delete m_pResolveProcessor; + m_pResolveProcessor = NULL; + } + m_upObjectArray.RemoveAll(); + for (FX_INT32 i = 0; i < m_CacheListArray.GetSize(); i++) { + delete ((CXFA_NodeList*)m_CacheListArray[i]); + } + m_CacheListArray.RemoveAll(); + if (m_dwBuiltInInFlags & XFA_JSBUILTIN_HasCount) { + FX_POSITION ps = m_JSBuiltInObjects.GetStartPosition(); + while (ps) { + CFX_ByteString bsKey; + void* pValue = NULL; + m_JSBuiltInObjects.GetNextAssoc(ps, bsKey, pValue); + if (pValue) { + FXJSE_Value_Release((FXJSE_HVALUE)pValue); + } + } + m_JSBuiltInObjects.RemoveAll(); + } +} +void CXFA_ScriptContext::Initialize(FXJSE_HRUNTIME hRuntime) +{ + m_hJsRuntime = hRuntime; + DefineJsContext(); + DefineJsClass(); + m_pResolveProcessor = FX_NEW CXFA_ResolveProcessor; +} +void CXFA_ScriptContext::Release() +{ + delete this; +} +FX_BOOL CXFA_ScriptContext::RunScript(XFA_SCRIPTLANGTYPE eScriptType, FX_WSTR wsScript, FXJSE_HVALUE hRetValue, CXFA_Object* pThisObject ) +{ + CFX_ByteString btScript; + XFA_SCRIPTLANGTYPE eSaveType = m_eScriptType; + m_eScriptType = eScriptType; + if(eScriptType == XFA_SCRIPTLANGTYPE_Formcalc) { + if(!m_hFM2JSContext) { + m_hFM2JSContext = XFA_FM2JS_ContextCreate(); + XFA_FM2JS_ContextInitialize(m_hFM2JSContext, m_hJsRuntime, m_hJsContext, m_pDocument); + } + CFX_WideTextBuf wsJavaScript; + CFX_WideString wsErrorInfo; + FX_INT32 iFlags = XFA_FM2JS_Translate(wsScript, wsJavaScript, wsErrorInfo); + if(iFlags) { + FXJSE_Value_SetUndefined(hRetValue); + return FALSE; + } + btScript = FX_UTF8Encode(wsJavaScript.GetBuffer(), wsJavaScript.GetLength()); + } else { + if ((m_dwBuiltInInFlags & XFA_JSBUILTIN_Initialized) == 0) { + m_dwBuiltInInFlags = XFA_JSBUILTIN_Initialized; + FX_POSITION ps = m_JSBuiltInObjects.GetStartPosition(); + if (ps) { + FXJSE_HVALUE hObject = FXJSE_Context_GetGlobalObject(m_hJsContext); + while (ps) { + CFX_ByteString bsKey; + void* pValue; + m_JSBuiltInObjects.GetNextAssoc(ps, bsKey, pValue); + FXJSE_HVALUE hProp = FXJSE_Value_Create(m_hJsRuntime); + if (FXJSE_Value_GetObjectProp(hObject, bsKey, hProp)) { + m_JSBuiltInObjects.SetAt(bsKey, hProp); + FXJSE_Value_DeleteObjectProp(hObject, bsKey); + m_dwBuiltInInFlags |= XFA_JSBUILTIN_HasCount; + } else { + m_JSBuiltInObjects.RemoveKey(bsKey); + FXJSE_Value_Release(hProp); + } + } + FXJSE_Value_Release(hObject); + } + } + btScript = FX_UTF8Encode(wsScript.GetPtr(), wsScript.GetLength()); + } + CXFA_Object *pOriginalObject = m_pThisObject; + m_pThisObject = pThisObject; + FXJSE_HVALUE pValue = pThisObject ? GetJSValueFromMap(pThisObject) : NULL; + FX_BOOL bRet = FXJSE_ExecuteScript(m_hJsContext, btScript, hRetValue, pValue); + m_pThisObject = pOriginalObject; + m_eScriptType = eSaveType; + return bRet; +} +void CXFA_ScriptContext::GlobalPropertySetter(FXJSE_HOBJECT hObject, FX_BSTR szPropName, FXJSE_HVALUE hValue) +{ + CXFA_Object* lpOrginalNode = (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL); + CXFA_Document* pDoc = lpOrginalNode->GetDocument(); + CXFA_ScriptContext* lpScriptContext = (CXFA_ScriptContext*)pDoc->GetScriptContext(); + CXFA_Object* lpCurNode = lpScriptContext->GetVariablesThis(lpOrginalNode); + CFX_WideString wsPropName = CFX_WideString::FromUTF8((FX_LPCSTR)szPropName.GetPtr(), szPropName.GetLength()); + FX_DWORD dwFlag = XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Attributes; + CXFA_Node* pRefNode = (CXFA_Node*)lpScriptContext->GetThisObject(); + if(lpOrginalNode->GetObjectType() == XFA_OBJECTTYPE_VariablesThis) { + pRefNode = (CXFA_Node*)lpCurNode; + } + if(lpScriptContext->QueryNodeByFlag(pRefNode, wsPropName, hValue, dwFlag, TRUE)) { + return; + } + if(lpOrginalNode->GetObjectType() == XFA_OBJECTTYPE_VariablesThis) { + if (FXJSE_Value_IsUndefined(hValue)) { + FXJSE_Value_SetObjectOwnProp(hObject, szPropName, hValue); + return; + } + } + IXFA_Notify* pNotify = pDoc->GetNotify(); + if (!pNotify) { + return; + } + pNotify->GetDocProvider()->SetGlobalProperty(pNotify->GetHDOC(), szPropName, hValue); +} +FX_BOOL CXFA_ScriptContext::QueryNodeByFlag(CXFA_Node* refNode, FX_WSTR propname, FXJSE_HVALUE hValue, FX_DWORD dwFlag, FX_BOOL bSetting) +{ + XFA_RESOLVENODE_RS resolveRs; + FX_INT32 iRet = ResolveObjects(refNode, propname, resolveRs, dwFlag); + FX_BOOL bResult = FALSE; + if (iRet > 0) { + bResult = TRUE; + if(resolveRs.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) { + FXJSE_HVALUE pValue = GetJSValueFromMap(resolveRs.nodes[0]); + FXJSE_Value_Set(hValue, pValue); + } else if(resolveRs.dwFlags == XFA_RESOVENODE_RSTYPE_Attribute) { + XFA_LPCSCRIPTATTRIBUTEINFO lpAttributeInfo = resolveRs.pScriptAttribute; + if(lpAttributeInfo) { + (resolveRs.nodes[0]->*(lpAttributeInfo->lpfnCallback))(hValue, bSetting, (XFA_ATTRIBUTE)lpAttributeInfo->eAttribute); + } + } + } + return bResult; +} +void CXFA_ScriptContext::GlobalPropertyGetter(FXJSE_HOBJECT hObject, FX_BSTR szPropName, FXJSE_HVALUE hValue) +{ + CXFA_Object* pOrginalObject = (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL); + CXFA_Document* pDoc = pOrginalObject->GetDocument(); + CXFA_ScriptContext* lpScriptContext = (CXFA_ScriptContext*)pDoc->GetScriptContext(); + CXFA_Object* lpCurNode = lpScriptContext->GetVariablesThis(pOrginalObject); + CFX_WideString wsPropName = CFX_WideString::FromUTF8((FX_LPCSTR)szPropName.GetPtr(), szPropName.GetLength()); + if (lpScriptContext->GetType() == XFA_SCRIPTLANGTYPE_Formcalc) { + if(szPropName == FX_BSTRC(FOXIT_XFA_FM2JS_FORMCALC_RUNTIME)) { + XFA_FM2JS_GlobalPropertyGetter(lpScriptContext->m_hFM2JSContext, hValue); + return; + } + FX_UINT32 uHashCode = FX_HashCode_String_GetW(wsPropName, wsPropName.GetLength()); + if(uHashCode != XFA_HASHCODE_Layout) { + CXFA_Object * pObject = lpScriptContext->GetDocument()->GetXFANode(uHashCode); + if (pObject) { + FXJSE_Value_Set(hValue, lpScriptContext->GetJSValueFromMap(pObject)); + return; + } + } + } + FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Attributes; + CXFA_Node* pRefNode = (CXFA_Node*)lpScriptContext->GetThisObject(); + if(pOrginalObject->GetObjectType() == XFA_OBJECTTYPE_VariablesThis) { + pRefNode = (CXFA_Node*)lpCurNode; + } + if(lpScriptContext->QueryNodeByFlag(pRefNode, wsPropName, hValue, dwFlag, FALSE)) { + return; + } + dwFlag = XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings; + if(lpScriptContext->QueryNodeByFlag(pRefNode, wsPropName, hValue, dwFlag, FALSE)) { + return; + } + CXFA_Object* pScriptObject = lpScriptContext->GetVariablesThis(pOrginalObject, TRUE); + if (pScriptObject && lpScriptContext->QueryVariableHValue((CXFA_Node *)pScriptObject, szPropName, hValue, TRUE)) { + return; + } + if (lpScriptContext->QueryBuiltinHValue(szPropName, hValue)) { + return; + } + IXFA_Notify* pNotify = pDoc->GetNotify(); + if (!pNotify) { + return; + } + pNotify->GetDocProvider()->GetGlobalProperty(pNotify->GetHDOC(), szPropName, hValue); +} +void CXFA_ScriptContext::NormalPropertyGetter(FXJSE_HOBJECT hObject, FX_BSTR szPropName, FXJSE_HVALUE hValue) +{ + CXFA_Object* pOrginalObject = (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL); + if(pOrginalObject == NULL) { + FXJSE_Value_SetUndefined(hValue); + return; + } + CFX_WideString wsPropName = CFX_WideString::FromUTF8((FX_LPCSTR)szPropName.GetPtr(), szPropName.GetLength()); + CXFA_ScriptContext* lpScriptContext = (CXFA_ScriptContext*)pOrginalObject->GetDocument()->GetScriptContext(); + CXFA_Object* pObject = lpScriptContext->GetVariablesThis(pOrginalObject); + if(wsPropName == FX_WSTRC(L"xfa")) { + FXJSE_HVALUE pValue = lpScriptContext->GetJSValueFromMap(lpScriptContext->GetDocument()->GetRoot()); + FXJSE_Value_Set(hValue, pValue); + return; + } + FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Attributes; + FX_BOOL bRet = lpScriptContext->QueryNodeByFlag((CXFA_Node *)pObject, wsPropName, hValue, dwFlag, FALSE); + if(bRet) { + return; + } + if (pObject == lpScriptContext->GetThisObject() || (lpScriptContext->GetType() == XFA_SCRIPTLANGTYPE_Javascript && !lpScriptContext->IsStrictScopeInJavaScript())) { + dwFlag = XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings; + bRet = lpScriptContext->QueryNodeByFlag((CXFA_Node *)pObject, wsPropName, hValue, dwFlag, FALSE); + } + if(bRet) { + return; + } + CXFA_Object* pScriptObject = lpScriptContext->GetVariablesThis(pOrginalObject, TRUE); + if (pScriptObject) { + bRet = lpScriptContext->QueryVariableHValue((CXFA_Node *)pScriptObject, szPropName, hValue, TRUE); + } + if (!bRet) { + FXJSE_Value_SetUndefined(hValue); + } +} +void CXFA_ScriptContext::NormalPropertySetter(FXJSE_HOBJECT hObject, FX_BSTR szPropName, FXJSE_HVALUE hValue) +{ + CXFA_Object* pOrginalObject = (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL); + if(pOrginalObject == NULL) { + return; + } + CXFA_ScriptContext* lpScriptContext = (CXFA_ScriptContext*)pOrginalObject->GetDocument()->GetScriptContext(); + CXFA_Object* pObject = lpScriptContext->GetVariablesThis(pOrginalObject); + CFX_WideString wsPropName = CFX_WideString::FromUTF8((FX_LPCSTR)szPropName.GetPtr(), szPropName.GetLength()); + XFA_LPCSCRIPTATTRIBUTEINFO lpAttributeInfo = XFA_GetScriptAttributeByName(pObject->GetClassID(), wsPropName); + if(lpAttributeInfo) { + (pObject->*(lpAttributeInfo->lpfnCallback))(hValue, TRUE, (XFA_ATTRIBUTE)lpAttributeInfo->eAttribute); + } else { + if(pObject->IsNode()) { + if(wsPropName.GetAt(0) == '#') { + wsPropName = wsPropName.Right(wsPropName.GetLength() - 1); + } + CXFA_Node* pNode = (CXFA_Node*)pObject; + CXFA_Node *pPropOrChild = NULL; + XFA_LPCELEMENTINFO lpElementInfo = XFA_GetElementByName(wsPropName); + if (lpElementInfo) { + pPropOrChild = pNode->GetProperty(0, lpElementInfo->eName); + } else { + pPropOrChild = pNode->GetFirstChildByName(wsPropName); + } + if (pPropOrChild) { + CFX_WideString wsDefaultName = FX_WSTRC(L"{default}"); + XFA_LPCSCRIPTATTRIBUTEINFO lpAttributeInfo = XFA_GetScriptAttributeByName(pPropOrChild->GetClassID(), wsDefaultName); + if(lpAttributeInfo) { + (pPropOrChild->*(lpAttributeInfo->lpfnCallback))(hValue, TRUE, (XFA_ATTRIBUTE)lpAttributeInfo->eAttribute); + return; + } + } + } + CXFA_Object* pScriptObject = lpScriptContext->GetVariablesThis(pOrginalObject, TRUE); + if (pScriptObject) { + lpScriptContext->QueryVariableHValue((CXFA_Node *)pScriptObject, szPropName, hValue, FALSE); + } + } +} +FX_INT32 CXFA_ScriptContext::NormalPropTypeGetter(FXJSE_HOBJECT hObject, FX_BSTR szPropName, FX_BOOL bQueryIn) +{ + CXFA_Object* pObject = (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL); + if(pObject == NULL) { + return FXJSE_ClassPropType_None; + } + CXFA_ScriptContext* lpScriptContext = (CXFA_ScriptContext*)pObject->GetDocument()->GetScriptContext(); + pObject = lpScriptContext->GetVariablesThis(pObject); + XFA_ELEMENT objElement = pObject->GetClassID(); + CFX_WideString wsPropName = CFX_WideString::FromUTF8((FX_LPCSTR)szPropName.GetPtr(), szPropName.GetLength()); + if(XFA_GetMethodByName(objElement, wsPropName)) { + return FXJSE_ClassPropType_Method; + } + if (bQueryIn && !XFA_GetScriptAttributeByName(objElement, wsPropName)) { + return FXJSE_ClassPropType_None; + } + return FXJSE_ClassPropType_Property; +} +FX_INT32 CXFA_ScriptContext::GlobalPropTypeGetter(FXJSE_HOBJECT hObject, FX_BSTR szPropName, FX_BOOL bQueryIn) +{ + CXFA_Object* pObject = (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL); + if(pObject == NULL) { + return FXJSE_ClassPropType_None; + } + CXFA_ScriptContext* lpScriptContext = (CXFA_ScriptContext*)pObject->GetDocument()->GetScriptContext(); + pObject = lpScriptContext->GetVariablesThis(pObject); + XFA_ELEMENT objElement = pObject->GetClassID(); + CFX_WideString wsPropName = CFX_WideString::FromUTF8((FX_LPCSTR)szPropName.GetPtr(), szPropName.GetLength()); + if(XFA_GetMethodByName(objElement, wsPropName)) { + return FXJSE_ClassPropType_Method; + } + return FXJSE_ClassPropType_Property; +} +void CXFA_ScriptContext::NormalMethodCall(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args) +{ + CXFA_Object* pObject = (CXFA_Object*)FXJSE_Value_ToObject(hThis, NULL); + if(pObject == NULL) { + return; + } + CXFA_ScriptContext* lpScriptContext = (CXFA_ScriptContext*)pObject->GetDocument()->GetScriptContext(); + pObject = lpScriptContext->GetVariablesThis(pObject); + CFX_WideString wsFunName = CFX_WideString::FromUTF8((FX_LPCSTR)szFuncName.GetPtr(), szFuncName.GetLength()); + XFA_LPCMETHODINFO lpMethodInfo = XFA_GetMethodByName(pObject->GetClassID(), wsFunName); + if(NULL == lpMethodInfo) { + return; + } + (pObject->*(lpMethodInfo->lpfnCallback))(&args); +} +FX_BOOL CXFA_ScriptContext::IsStrictScopeInJavaScript() +{ + return m_pDocument->HasFlag(XFA_DOCFLAG_StrictScoping); +} +XFA_SCRIPTLANGTYPE CXFA_ScriptContext::GetType() +{ + return m_eScriptType; +} +void CXFA_ScriptContext::DefineJsContext() +{ + m_JsGlobalClass.constructor = NULL; + m_JsGlobalClass.name = "Root"; + m_JsGlobalClass.propNum = 0; + m_JsGlobalClass.properties = NULL; + m_JsGlobalClass.methNum = 0; + m_JsGlobalClass.methods = NULL; + m_JsGlobalClass.dynPropGetter = CXFA_ScriptContext::GlobalPropertyGetter; + m_JsGlobalClass.dynPropSetter = CXFA_ScriptContext::GlobalPropertySetter; + m_JsGlobalClass.dynPropTypeGetter = CXFA_ScriptContext::GlobalPropTypeGetter; + m_JsGlobalClass.dynPropDeleter = NULL; + m_JsGlobalClass.dynMethodCall = CXFA_ScriptContext::NormalMethodCall; + m_hJsContext = FXJSE_Context_Create(m_hJsRuntime, &m_JsGlobalClass, m_pDocument->GetRoot()); + FXJSE_Context_EnableCompatibleMode(m_hJsContext, FXJSE_COMPATIBLEMODEFLAG_CONSTRUCTOREXTRAMETHODS); +} +FXJSE_HCONTEXT CXFA_ScriptContext::CreateVariablesContext(CXFA_Node* pScriptNode, CXFA_Node* pSubform) +{ + if(pScriptNode == NULL || pSubform == NULL) { + return NULL; + } + if(m_mapVariableToHValue.GetCount() == 0) { + m_JsGlobalVariablesClass.constructor = NULL; + m_JsGlobalVariablesClass.name = "XFAScriptObject"; + m_JsGlobalVariablesClass.propNum = 0; + m_JsGlobalVariablesClass.properties = NULL; + m_JsGlobalVariablesClass.methNum = 0; + m_JsGlobalVariablesClass.methods = NULL; + m_JsGlobalVariablesClass.dynPropGetter = CXFA_ScriptContext::GlobalPropertyGetter; + m_JsGlobalVariablesClass.dynPropSetter = CXFA_ScriptContext::GlobalPropertySetter; + m_JsGlobalVariablesClass.dynPropTypeGetter = CXFA_ScriptContext::NormalPropTypeGetter; + m_JsGlobalVariablesClass.dynPropDeleter = NULL; + m_JsGlobalVariablesClass.dynMethodCall = CXFA_ScriptContext::NormalMethodCall; + } + CXFA_ThisProxy* lpVariableNode = FX_NEW CXFA_ThisProxy(pSubform, pScriptNode); + FXJSE_HCONTEXT hVariablesContext = FXJSE_Context_Create(m_hJsRuntime, &m_JsGlobalVariablesClass, (CXFA_Object*)lpVariableNode); + FXJSE_Context_EnableCompatibleMode(hVariablesContext, FXJSE_COMPATIBLEMODEFLAG_CONSTRUCTOREXTRAMETHODS); + m_mapVariableToHValue.SetAt(pScriptNode, hVariablesContext); + return hVariablesContext; +} +CXFA_Object* CXFA_ScriptContext::GetVariablesThis(CXFA_Object* pObject, FX_BOOL bScriptNode) +{ + if(pObject->GetObjectType() == XFA_OBJECTTYPE_VariablesThis) { + return bScriptNode ? ((CXFA_ThisProxy*)pObject)->GetScriptNode() : ((CXFA_ThisProxy*)pObject)->GetThisNode(); + } + return pObject; +} +FX_BOOL CXFA_ScriptContext::RunVariablesScript(CXFA_Node* pScriptNode) +{ + if(pScriptNode == NULL) { + return FALSE; + } + if(pScriptNode->GetClassID() == XFA_ELEMENT_Script) { + CXFA_Node* pParent = pScriptNode->GetNodeItem(XFA_NODEITEM_Parent); + if(!pParent || pParent->GetClassID() != XFA_ELEMENT_Variables) { + return FALSE; + } + if(m_mapVariableToHValue.GetValueAt(pScriptNode)) { + return TRUE; + } + CXFA_Node *pTextNode = pScriptNode->GetNodeItem(XFA_NODEITEM_FirstChild); + if (!pTextNode) { + return FALSE; + } + CFX_WideStringC wsScript; + if(!pTextNode->TryCData(XFA_ATTRIBUTE_Value, wsScript)) { + return FALSE; + } + CFX_ByteString btScript = FX_UTF8Encode(wsScript.GetPtr(), wsScript.GetLength()); + FXJSE_HVALUE hRetValue = FXJSE_Value_Create(m_hJsRuntime); + CXFA_Node* pThisObject = pParent->GetNodeItem(XFA_NODEITEM_Parent); + FXJSE_HCONTEXT hVariablesContext = CreateVariablesContext(pScriptNode, pThisObject); + CXFA_Object *pOriginalObject = m_pThisObject; + m_pThisObject = pThisObject; + FX_BOOL bRet = FXJSE_ExecuteScript(hVariablesContext, btScript, hRetValue); + m_pThisObject = pOriginalObject; + FXJSE_Value_Release(hRetValue); + return bRet; + } + return TRUE; +} +FX_BOOL CXFA_ScriptContext::QueryVariableHValue(CXFA_Node* pScriptNode, FX_BSTR szPropName, FXJSE_HVALUE hValue, FX_BOOL bGetter) +{ + if(pScriptNode->GetClassID() != XFA_ELEMENT_Script) { + return FALSE; + } + CXFA_Node* variablesNode = pScriptNode->GetNodeItem(XFA_NODEITEM_Parent); + if(!variablesNode || variablesNode->GetClassID() != XFA_ELEMENT_Variables) { + return FALSE; + } + FX_BOOL bRes = FALSE; + FX_LPVOID lpVariables = m_mapVariableToHValue.GetValueAt(pScriptNode); + if(lpVariables) { + FXJSE_HCONTEXT hVariableContext = (FXJSE_HCONTEXT)lpVariables; + FXJSE_HVALUE hObject = FXJSE_Context_GetGlobalObject(hVariableContext); + FXJSE_HVALUE hVariableValue = FXJSE_Value_Create(m_hJsRuntime); + if (!bGetter) { + FXJSE_Value_SetObjectOwnProp(hObject, szPropName, hValue); + bRes = TRUE; + } else if(FXJSE_Value_ObjectHasOwnProp(hObject, szPropName, FALSE)) { + FXJSE_Value_GetObjectProp(hObject, szPropName, hVariableValue); + if(FXJSE_Value_IsFunction(hVariableValue)) { + FXJSE_Value_SetFunctionBind(hValue, hVariableValue, hObject); + } else if (bGetter) { + FXJSE_Value_Set(hValue, hVariableValue); + } else { + FXJSE_Value_Set(hVariableValue, hValue); + } + bRes = TRUE; + } + FXJSE_Value_Release(hVariableValue); + FXJSE_Value_Release(hObject); + } + return bRes; +} +FX_BOOL CXFA_ScriptContext::QueryBuiltinHValue(FX_BSTR szPropName, FXJSE_HVALUE hValue) +{ + void* pBuiltin = NULL; + if ((m_dwBuiltInInFlags & XFA_JSBUILTIN_HasCount) && m_JSBuiltInObjects.Lookup(szPropName, pBuiltin)) { + FXJSE_Value_Set(hValue, (FXJSE_HVALUE)pBuiltin); + return TRUE; + } + return FALSE; +} +void CXFA_ScriptContext::ReleaseVariablesMap() +{ + FX_POSITION ps = m_mapVariableToHValue.GetStartPosition(); + while (ps) { + CXFA_Object* pScriptNode; + FXJSE_HCONTEXT hVariableContext; + m_mapVariableToHValue.GetNextAssoc(ps, pScriptNode, hVariableContext); + FXJSE_HVALUE hObject = FXJSE_Context_GetGlobalObject(hVariableContext); + CXFA_Object* lpCurNode = (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL); + if(lpCurNode) { + delete (CXFA_ThisProxy*)lpCurNode; + lpCurNode = NULL; + } + FXJSE_Value_Release(hObject); + FXJSE_Context_Release(hVariableContext); + hVariableContext = NULL; + } + m_mapVariableToHValue.RemoveAll(); +} +void CXFA_ScriptContext::DefineJsClass() +{ + m_JsNormalClass.constructor = NULL; + m_JsNormalClass.name = "XFAObject"; + m_JsNormalClass.propNum = 0; + m_JsNormalClass.properties = NULL; + m_JsNormalClass.methNum = 0; + m_JsNormalClass.methods = NULL; + m_JsNormalClass.dynPropGetter = CXFA_ScriptContext::NormalPropertyGetter; + m_JsNormalClass.dynPropSetter = CXFA_ScriptContext::NormalPropertySetter; + m_JsNormalClass.dynPropTypeGetter = CXFA_ScriptContext::NormalPropTypeGetter; + m_JsNormalClass.dynPropDeleter = NULL; + m_JsNormalClass.dynMethodCall = CXFA_ScriptContext::NormalMethodCall; + m_hJsClass = FXJSE_DefineClass(m_hJsContext, &m_JsNormalClass); +} +FXJSE_HCLASS CXFA_ScriptContext::GetJseNormalClass() +{ + return m_hJsClass; +} +void CXFA_ScriptContext::AddJSBuiltinObject(XFA_LPCJSBUILTININFO pBuitinObject) +{ + if (m_dwBuiltInInFlags & XFA_JSBUILTIN_Initialized) { + return; + } + m_JSBuiltInObjects.SetAt(pBuitinObject->pName, (void*)pBuitinObject); +} +FX_INT32 CXFA_ScriptContext::ResolveObjects(CXFA_Object* refNode, FX_WSTR wsExpression, XFA_RESOLVENODE_RS& resolveNodeRS, FX_DWORD dwStyles, CXFA_Node* bindNode) +{ + if (wsExpression.IsEmpty()) { + return 0; + } + if (m_eScriptType != XFA_SCRIPTLANGTYPE_Formcalc || (dwStyles & (XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings))) { + m_upObjectArray.RemoveAll(); + } + if(refNode && (dwStyles & (XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings)) && refNode->IsNode()) { + m_upObjectArray.Add((CXFA_Node*)refNode); + } + FX_BOOL bNextCreate = FALSE; + if(dwStyles & XFA_RESOLVENODE_CreateNode) { + m_pResolveProcessor->GetNodeHelper()->XFA_SetCreateNodeType(bindNode); + } + m_pResolveProcessor->GetNodeHelper()->m_pCreateParent = NULL; + m_pResolveProcessor->GetNodeHelper()->m_iCurAllStart = -1; + CXFA_ResolveNodesData rndFind; + FX_INT32 nStart = 0; + FX_INT32 nLevel = 0; + FX_INT32 nRet = -1; + rndFind.m_pSC = this; + CXFA_ObjArray findNodes; + if (refNode != NULL) { + findNodes.Add(refNode); + } else { + findNodes.Add(m_pDocument->GetRoot()); + } + FX_INT32 nNodes = 0; + while (TRUE) { + nNodes = findNodes.GetSize(); + FX_INT32 i = 0; + rndFind.m_dwStyles = dwStyles; + m_pResolveProcessor->m_iCurStart = nStart; + nStart = m_pResolveProcessor->XFA_ResolveNodes_GetFilter(wsExpression, nStart, rndFind); + if (nStart < 1) { + if((dwStyles & XFA_RESOLVENODE_CreateNode) && !bNextCreate) { + CXFA_Node* pDataNode = NULL; + nStart = m_pResolveProcessor->GetNodeHelper()->m_iCurAllStart; + if(nStart != -1) { + pDataNode = m_pDocument->GetNotBindNode(findNodes); + if(pDataNode) { + findNodes.RemoveAll(); + findNodes.Add(pDataNode); + break; + } + } else { + pDataNode = (CXFA_Node*)findNodes[0]; + findNodes.RemoveAll(); + findNodes.Add(pDataNode); + break; + } + dwStyles |= XFA_RESOLVENODE_Bind; + findNodes.RemoveAll(); + findNodes.Add(m_pResolveProcessor->GetNodeHelper()->m_pAllStartParent); + continue; + } else { + break; + } + } + if(bNextCreate) { + FX_BOOL bCreate = m_pResolveProcessor->GetNodeHelper()->XFA_ResolveNodes_CreateNode(rndFind.m_wsName, rndFind.m_wsCondition, nStart == wsExpression.GetLength() ? TRUE : FALSE, this); + if(bCreate) { + continue; + } else { + break; + } + } + CXFA_ObjArray retNodes; + while (i < nNodes) { + FX_BOOL bDataBind = FALSE; + if(((dwStyles & XFA_RESOLVENODE_Bind) || (dwStyles & XFA_RESOLVENODE_CreateNode)) && nNodes > 1) { + CXFA_ResolveNodesData rndBind; + m_pResolveProcessor->XFA_ResolveNodes_GetFilter(wsExpression, nStart, rndBind); + m_pResolveProcessor->XFA_ResolveNode_SetIndexDataBind(rndBind.m_wsCondition, i, nNodes); + bDataBind = TRUE; + } + rndFind.m_CurNode = findNodes[i ++]; + rndFind.m_nLevel = nLevel; + rndFind.m_dwFlag = XFA_RESOVENODE_RSTYPE_Nodes; + nRet = m_pResolveProcessor->XFA_ResolveNodes(rndFind); + if (nRet < 1) { + continue; + } + if (rndFind.m_dwFlag == XFA_RESOVENODE_RSTYPE_Attribute && rndFind.m_pScriptAttribute && nStart < wsExpression.GetLength()) { + FXJSE_HVALUE hValue = FXJSE_Value_Create(m_hJsRuntime); + (rndFind.m_Nodes[0]->*(rndFind.m_pScriptAttribute->lpfnCallback))(hValue, FALSE, (XFA_ATTRIBUTE)rndFind.m_pScriptAttribute->eAttribute); + rndFind.m_Nodes.SetAt(0, (CXFA_Object*)FXJSE_Value_ToObject(hValue, NULL)); + FXJSE_Value_Release(hValue); + } + FX_INT32 iSize = m_upObjectArray.GetSize(); + if (iSize) { + m_upObjectArray.RemoveAt(iSize - 1); + } + retNodes.Append(rndFind.m_Nodes); + rndFind.m_Nodes.RemoveAll(); + if(bDataBind){ + break; + } + } + findNodes.RemoveAll(); + nNodes = retNodes.GetSize(); + if (nNodes < 1) { + if(dwStyles & XFA_RESOLVENODE_CreateNode) { + bNextCreate = TRUE; + if(m_pResolveProcessor->GetNodeHelper()->m_pCreateParent == NULL) { + m_pResolveProcessor->GetNodeHelper()->m_pCreateParent = (CXFA_Node*)rndFind.m_CurNode; + m_pResolveProcessor->GetNodeHelper()->m_iCreateCount = 1; + } + FX_BOOL bCreate = m_pResolveProcessor->GetNodeHelper()->XFA_ResolveNodes_CreateNode(rndFind.m_wsName, rndFind.m_wsCondition, nStart == wsExpression.GetLength() ? TRUE : FALSE, this); + if(bCreate) { + continue; + } else { + break; + } + } else { + break; + } + } + findNodes.Copy(retNodes); + rndFind.m_Nodes.RemoveAll(); + if (nLevel == 0) { + dwStyles &= ~(XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings); + } + nLevel ++; + } + if(!bNextCreate) { + resolveNodeRS.dwFlags = rndFind.m_dwFlag; + if (nNodes > 0) { + resolveNodeRS.nodes.Append(findNodes); + } + if(rndFind.m_dwFlag == XFA_RESOVENODE_RSTYPE_Attribute) { + resolveNodeRS.pScriptAttribute = rndFind.m_pScriptAttribute; + return 1; + } + } + if(dwStyles & (XFA_RESOLVENODE_CreateNode | XFA_RESOLVENODE_Bind | XFA_RESOLVENODE_BindNew)) { + m_pResolveProcessor->XFA_ResolveNode_SetResultCreateNode(resolveNodeRS, rndFind.m_wsCondition); + if (!bNextCreate && (dwStyles & XFA_RESOLVENODE_CreateNode)) { + resolveNodeRS.dwFlags = XFA_RESOVENODE_RSTYPE_ExistNodes; + } + return resolveNodeRS.nodes.GetSize(); + } + return nNodes; +} +FXJSE_HVALUE CXFA_ScriptContext::GetJSValueFromMap(CXFA_Object* pObject) +{ + if (!pObject) { + return NULL; + } + if(pObject->IsNode()) { + RunVariablesScript((CXFA_Node*)pObject); + } + FX_LPVOID pValue = m_mapXFAToHValue.GetValueAt(pObject); + if(pValue == NULL) { + FXJSE_HVALUE jsHvalue = FXJSE_Value_Create(m_hJsRuntime); + FXJSE_Value_SetObject(jsHvalue, pObject, m_hJsClass); + m_mapXFAToHValue.SetAt(pObject, jsHvalue); + pValue = jsHvalue; + } + return (FXJSE_HVALUE)pValue; +} +FX_INT32 CXFA_ScriptContext::GetIndexByName(CXFA_Node* refNode) +{ + CXFA_NodeHelper* lpNodeHelper = m_pResolveProcessor->GetNodeHelper(); + return lpNodeHelper->XFA_GetIndex(refNode, XFA_LOGIC_Transparent, lpNodeHelper->XFA_NodeIsProperty(refNode), FALSE); +} +FX_INT32 CXFA_ScriptContext::GetIndexByClassName(CXFA_Node* refNode) +{ + CXFA_NodeHelper* lpNodeHelper = m_pResolveProcessor->GetNodeHelper(); + return lpNodeHelper->XFA_GetIndex(refNode, XFA_LOGIC_Transparent, lpNodeHelper->XFA_NodeIsProperty(refNode), TRUE); +} +void CXFA_ScriptContext::GetSomExpression(CXFA_Node* refNode, CFX_WideString &wsExpression) +{ + CXFA_NodeHelper* lpNodeHelper = m_pResolveProcessor->GetNodeHelper(); + lpNodeHelper->XFA_GetNameExpression(refNode, wsExpression, TRUE, XFA_LOGIC_Transparent); +} +void CXFA_ScriptContext::SetNodesOfRunScript(CXFA_NodeArray *pArray) +{ + m_pScriptNodeArray = pArray; +} +void CXFA_ScriptContext::AddNodesOfRunScript(const CXFA_NodeArray& nodes) +{ + if (!m_pScriptNodeArray) { + return; + } + if (nodes.GetSize() > 0) { + m_pScriptNodeArray->Copy(nodes); + } +} +void CXFA_ScriptContext::AddNodesOfRunScript(CXFA_Node* pNode) +{ + if (!m_pScriptNodeArray) { + return; + } + if (m_pScriptNodeArray->Find(pNode) == -1) { + m_pScriptNodeArray->Add(pNode); + } +} +IXFA_ScriptContext* XFA_ScriptContext_Create(CXFA_Document* pDocument) +{ + return FX_NEW CXFA_ScriptContext(pDocument); +} +static const XFA_JSBUILTININFO gs_JSBUILTINData[] = { + {0x8108b9a9, (FX_LPCSTR)"Number"}, + {0xe07e3fbe, (FX_LPCSTR)"Date"}, +}; +const FX_INT32 g_iJSBuiltinCount = sizeof(XFA_JSBUILTININFO) / sizeof(XFA_JSBUILTININFO); +XFA_LPCJSBUILTININFO XFA_GetJSBuiltinByHash(FX_UINT32 uHashCode) +{ + FX_INT32 iStart = 0, iEnd = g_iJSBuiltinCount - 1, iMid; + do { + iMid = (iStart + iEnd) / 2; + XFA_LPCJSBUILTININFO pInfo = gs_JSBUILTINData + iMid; + if (uHashCode == pInfo->uUnicodeHash) { + return pInfo; + } else if (uHashCode < pInfo->uUnicodeHash) { + iEnd = iMid - 1; + } else { + iStart = iMid + 1; + } + } while (iStart <= iEnd); + return NULL; +} diff --git a/xfa/src/fxfa/src/parser/xfa_script_imp.h b/xfa/src/fxfa/src/parser/xfa_script_imp.h new file mode 100644 index 0000000000..d8aec1a2f6 --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_script_imp.h @@ -0,0 +1,113 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _FXFA_SCRIPT_IMP_H +#define _FXFA_SCRIPT_IMP_H +#define XFA_RESOLVENODE_TagName 0x0002 +#define XFA_JSBUILTIN_Initialized 0x0001 +#define XFA_JSBUILTIN_HasCount 0x0002 +class CXFA_ResolveProcessor; +class CXFA_ScriptContext : public IXFA_ScriptContext, public CFX_Object +{ +public: + CXFA_ScriptContext(CXFA_Document* pDocument); + ~CXFA_ScriptContext(); + virtual void Release(); + virtual void Initialize(FXJSE_HRUNTIME hRuntime); + virtual void SetEventParam(CXFA_EventParam* pEventParam) + { + m_pEventParam = pEventParam; + } + virtual CXFA_EventParam* GetEventParam() + { + return m_pEventParam; + } + virtual FX_BOOL RunScript(XFA_SCRIPTLANGTYPE eScriptType, FX_WSTR wsScript, FXJSE_HVALUE hRetValue, CXFA_Object* pThisObject = NULL); + + virtual FX_INT32 ResolveObjects(CXFA_Object* refNode, FX_WSTR wsExpression, XFA_RESOLVENODE_RS& resolveNodeRS, FX_DWORD dwStyles = XFA_RESOLVENODE_Children, CXFA_Node* bindNode = NULL); + virtual FXJSE_HVALUE GetJSValueFromMap(CXFA_Object* pObject); + virtual void CacheList(CXFA_NodeList* pList) + { + m_CacheListArray.Add(pList); + } + virtual CXFA_Object* GetThisObject() const + { + return m_pThisObject; + } + virtual FXJSE_HRUNTIME GetRuntime() const + { + return m_hJsRuntime; + } + + virtual FX_INT32 GetIndexByName(CXFA_Node* refNode); + virtual FX_INT32 GetIndexByClassName(CXFA_Node* refNode); + virtual void GetSomExpression(CXFA_Node* refNode, CFX_WideString &wsExpression); + + virtual void SetNodesOfRunScript(CXFA_NodeArray *pArray); + virtual void AddNodesOfRunScript(const CXFA_NodeArray& nodes); + virtual void AddNodesOfRunScript(CXFA_Node* pNode); + virtual FXJSE_HCLASS GetJseNormalClass(); + + virtual void AddJSBuiltinObject(XFA_LPCJSBUILTININFO pBuitinObject); + virtual void SetRunAtType(XFA_ATTRIBUTEENUM eRunAt) + { + m_eRunAtType = eRunAt; + } + virtual FX_BOOL IsRunAtClient() + { + return m_eRunAtType != XFA_ATTRIBUTEENUM_Server; + } + FX_BOOL QueryNodeByFlag(CXFA_Node* refNode, FX_WSTR propname, FXJSE_HVALUE hValue, FX_DWORD dwFlag, FX_BOOL bSetting); + FX_BOOL QueryVariableHValue(CXFA_Node* pScriptNode, FX_BSTR szPropName, FXJSE_HVALUE hValue, FX_BOOL bGetter); + FX_BOOL QueryBuiltinHValue(FX_BSTR szPropName, FXJSE_HVALUE hValue); + static void GlobalPropertyGetter(FXJSE_HOBJECT hObject, FX_BSTR szPropName, FXJSE_HVALUE hValue); + static void GlobalPropertySetter(FXJSE_HOBJECT hObject, FX_BSTR szPropName, FXJSE_HVALUE hValue); + static void NormalPropertyGetter(FXJSE_HOBJECT hObject, FX_BSTR szPropName, FXJSE_HVALUE hValue); + static void NormalPropertySetter(FXJSE_HOBJECT hObject, FX_BSTR szPropName, FXJSE_HVALUE hValue); + static void NormalMethodCall(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args); + static FX_INT32 NormalPropTypeGetter(FXJSE_HOBJECT hObject, FX_BSTR szPropName, FX_BOOL bQueryIn); + static FX_INT32 GlobalPropTypeGetter(FXJSE_HOBJECT hObject, FX_BSTR szPropName, FX_BOOL bQueryIn); + FX_BOOL RunVariablesScript(CXFA_Node* pScriptNode); + CXFA_Object* GetVariablesThis(CXFA_Object* pObject, FX_BOOL bScriptNode = FALSE); + void ReleaseVariablesMap(); + FX_BOOL IsStrictScopeInJavaScript(); + XFA_SCRIPTLANGTYPE GetType(); + CXFA_NodeArray& GetUpObjectArray() + { + return m_upObjectArray; + } + CXFA_Document* GetDocument() const + { + return m_pDocument; + } +protected: + void DefineJsContext(); + FXJSE_HCONTEXT CreateVariablesContext(CXFA_Node* pScriptNode, CXFA_Node* pSubform); + + void DefineJsClass(); + CXFA_Document* m_pDocument; + FXJSE_HCONTEXT m_hJsContext; + FXJSE_HRUNTIME m_hJsRuntime; + FXJSE_HCLASS m_hJsClass; + XFA_SCRIPTLANGTYPE m_eScriptType; + FXJSE_CLASS m_JsGlobalClass; + FXJSE_CLASS m_JsNormalClass; + CFX_MapPtrTemplate m_mapXFAToHValue; + + FXJSE_CLASS m_JsGlobalVariablesClass; + CFX_MapPtrTemplate m_mapVariableToHValue; + CXFA_EventParam* m_pEventParam; + CXFA_NodeArray m_upObjectArray; + CFX_PtrArray m_CacheListArray; + CXFA_NodeArray* m_pScriptNodeArray; + CXFA_ResolveProcessor* m_pResolveProcessor; + XFA_HFM2JSCONTEXT m_hFM2JSContext; + CXFA_Object* m_pThisObject; + CFX_CMapByteStringToPtr m_JSBuiltInObjects; + FX_DWORD m_dwBuiltInInFlags; + XFA_ATTRIBUTEENUM m_eRunAtType; +}; +#endif diff --git a/xfa/src/fxfa/src/parser/xfa_script_layoutpseudomodel.cpp b/xfa/src/fxfa/src/parser/xfa_script_layoutpseudomodel.cpp new file mode 100644 index 0000000000..12da5bc7ea --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_script_layoutpseudomodel.cpp @@ -0,0 +1,524 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_utils.h" +#include "../common/xfa_object.h" +#include "../common/xfa_document.h" +#include "../common/xfa_parser.h" +#include "../common/xfa_script.h" +#include "../common/xfa_docdata.h" +#include "../common/xfa_doclayout.h" +#include "../common/xfa_debug.h" +#include "../common/xfa_localemgr.h" +#include "../common/xfa_fm2jsapi.h" +#include "xfa_debug_parser.h" +#include "xfa_script_layoutpseudomodel.h" +#include "xfa_document_layout_imp.h" +#include "xfa_layout_appadapter.h" +CScript_LayoutPseudoModel::CScript_LayoutPseudoModel(CXFA_Document* pDocument) + : CXFA_OrdinaryObject(pDocument, XFA_ELEMENT_LayoutPseudoModel) +{ + m_uScriptHash = XFA_HASHCODE_Layout; +} +CScript_LayoutPseudoModel::~CScript_LayoutPseudoModel() +{ +} +void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_Ready(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute) +{ + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + XFA_HDOC hDoc = pNotify->GetHDOC(); + if (bSetting) { + ThrowScriptErrorMessage(XFA_IDS_UNABLE_SET_READY); + return; + } + FX_INT32 iStatus = pNotify->GetLayoutStatus(); + FXJSE_Value_SetBoolean(hValue, iStatus >= 2); +} +void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_HWXY(CFXJSE_Arguments* pArguments, XFA_LAYOUTMODEL_HWXY layoutModel) +{ + FX_INT32 iLength = pArguments->GetLength(); + if ( iLength < 1 || iLength > 3) { + FX_LPCWSTR methodName = NULL; + switch (layoutModel) { + case XFA_LAYOUTMODEL_H: + methodName = (FX_LPCWSTR)(L"h"); + break; + case XFA_LAYOUTMODEL_W: + methodName = (FX_LPCWSTR)(L"w"); + break; + case XFA_LAYOUTMODEL_X: + methodName = (FX_LPCWSTR)(L"x"); + break; + case XFA_LAYOUTMODEL_Y: + methodName = (FX_LPCWSTR)(L"y"); + break; + } + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, methodName); + return; + } + CXFA_Node* pNode = NULL; + CFX_WideString wsUnit = FX_WSTRC(L"pt"); + FX_INT32 iIndex = 0; + if (iLength >= 1) { + pNode = (CXFA_Node*)pArguments->GetObject(0); + } + if (iLength >= 2) { + CFX_ByteString bsUnit = pArguments->GetUTF8String(1); + if (!bsUnit.IsEmpty()) { + wsUnit = CFX_WideString::FromUTF8(bsUnit, bsUnit.GetLength()); + } + } + if (iLength >= 3) { + iIndex = pArguments->GetInt32(2); + } + if (!pNode) { + return; + } + IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout(); + if (!pDocLayout) { + return; + } + CFX_RectF rtRect; + CXFA_Measurement measure; + CXFA_LayoutItem* pLayoutItem = pDocLayout->GetLayoutItem(pNode); + if (!pLayoutItem) { + return; + } + while (iIndex > 0 && pLayoutItem) { + pLayoutItem = pLayoutItem->GetNext(); + iIndex --; + } + FXJSE_HVALUE hValue = pArguments->GetReturnValue(); + if (!pLayoutItem) { + FXJSE_Value_SetFloat(hValue, 0); + return; + } + pLayoutItem->GetRect(rtRect, TRUE); + switch (layoutModel) { + case XFA_LAYOUTMODEL_H: + measure.Set(rtRect.height, XFA_UNIT_Pt); + break; + case XFA_LAYOUTMODEL_W: + measure.Set(rtRect.width, XFA_UNIT_Pt); + break; + case XFA_LAYOUTMODEL_X: + measure.Set(rtRect.left, XFA_UNIT_Pt); + break; + case XFA_LAYOUTMODEL_Y: + measure.Set(rtRect.top, XFA_UNIT_Pt); + break; + } + XFA_UNIT unit = measure.GetUnit(wsUnit); + FX_FLOAT fValue = measure.ToUnit(unit); + fValue = FXSYS_round(fValue * 1000) / 1000.0f; + if (hValue) { + FXJSE_Value_SetFloat(hValue, fValue); + } +} +void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_H(CFXJSE_Arguments* pArguments) +{ + Script_LayoutPseudoModel_HWXY(pArguments, XFA_LAYOUTMODEL_H); +} +void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_W(CFXJSE_Arguments* pArguments) +{ + Script_LayoutPseudoModel_HWXY(pArguments, XFA_LAYOUTMODEL_W); +} +void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_X(CFXJSE_Arguments* pArguments) +{ + Script_LayoutPseudoModel_HWXY(pArguments, XFA_LAYOUTMODEL_X); +} +void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_Y(CFXJSE_Arguments* pArguments) +{ + Script_LayoutPseudoModel_HWXY(pArguments, XFA_LAYOUTMODEL_Y); +} +void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_NumberedPageCount(CFXJSE_Arguments* pArguments, FX_BOOL bNumbered) +{ + IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout(); + if (!pDocLayout) { + return; + } + FX_INT32 iPageCount = 0; + FX_INT32 iPageNum = pDocLayout->CountPages(); + if (bNumbered) { + for (FX_INT32 i = 0; i < iPageNum; i++) { + IXFA_LayoutPage* pLayoutPage = pDocLayout->GetPage(i); + if (!pLayoutPage) { + continue; + } + CXFA_Node* pMasterPage = pLayoutPage->GetMasterPage(); + if (pMasterPage->GetInteger(XFA_ATTRIBUTE_Numbered)) { + iPageCount++; + } + } + } else { + iPageCount = iPageNum; + } + FXJSE_HVALUE hValue = pArguments->GetReturnValue(); + if (hValue) { + FXJSE_Value_SetInteger(hValue, iPageCount); + } +} +void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_PageCount(CFXJSE_Arguments* pArguments) +{ + Script_LayoutPseudoModel_NumberedPageCount(pArguments, TRUE); +} +void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_PageSpan(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength != 1) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"pageSpan")); + return; + } + CXFA_Node* pNode = NULL; + if (iLength >= 1) { + pNode = (CXFA_Node*)pArguments->GetObject(0); + } + if (!pNode) { + return; + } + IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout(); + if (!pDocLayout) { + return; + } + FXJSE_HVALUE hValue = pArguments->GetReturnValue(); + CXFA_LayoutItem* pLayoutItem = pDocLayout->GetLayoutItem(pNode); + if (!pLayoutItem) { + FXJSE_Value_SetInteger(hValue, -1); + return; + } + FX_INT32 iLast = pLayoutItem->GetLast()->GetPage()->GetPageIndex(); + FX_INT32 iFirst = pLayoutItem->GetFirst()->GetPage()->GetPageIndex(); + FX_INT32 iPageSpan = iLast - iFirst + 1; + if (hValue) { + FXJSE_Value_SetInteger(hValue, iPageSpan); + } +} +void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_Page(CFXJSE_Arguments* pArguments) +{ + Script_LayoutPseudoModel_PageImp(pArguments, FALSE); +} +void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_GetObjArray(IXFA_DocLayout* pDocLayout, FX_INT32 iPageNo, const CFX_WideString &wsType, FX_BOOL bOnPageArea, CXFA_NodeArray &retArray) +{ + CXFA_ContainerLayoutItemImpl* pLayoutPage = (CXFA_ContainerLayoutItemImpl*)pDocLayout->GetPage(iPageNo); + if (!pLayoutPage) { + return; + } + if (wsType == FX_WSTRC(L"pageArea")) { + if (CXFA_Node* pMasterPage = pLayoutPage->m_pFormNode) { + retArray.Add(pMasterPage); + } + return; + } + if (wsType == FX_WSTRC(L"contentArea")) { + for(CXFA_LayoutItemImpl* pItem = pLayoutPage->m_pFirstChild; pItem; pItem = pItem->m_pNextSibling) { + if(pItem->m_pFormNode->GetClassID() == XFA_ELEMENT_ContentArea) { + retArray.Add(pItem->m_pFormNode); + } + } + return; + } + CFX_MapPtrToPtr formItems; + formItems.InitHashTable(256, TRUE); + if (wsType.IsEmpty()) { + if (CXFA_Node* pMasterPage = pLayoutPage->m_pFormNode) { + retArray.Add(pMasterPage); + } + for(CXFA_LayoutItemImpl* pItem = pLayoutPage->m_pFirstChild; pItem; pItem = pItem->m_pNextSibling) { + if(pItem->m_pFormNode->GetClassID() == XFA_ELEMENT_ContentArea) { + retArray.Add(pItem->m_pFormNode); + if(!bOnPageArea) { + CXFA_NodeIteratorTemplate iterator((CXFA_ContentLayoutItemImpl*)pItem->m_pFirstChild); + for(CXFA_ContentLayoutItemImpl* pItemChild = iterator.GetCurrent(); pItemChild; pItemChild = iterator.MoveToNext()) { + if(!pItemChild->IsContentLayoutItem()) { + continue; + } + XFA_ELEMENT eElementType = pItemChild->m_pFormNode->GetClassID(); + if (eElementType != XFA_ELEMENT_Field && eElementType != XFA_ELEMENT_Draw + && eElementType != XFA_ELEMENT_Subform && eElementType != XFA_ELEMENT_Area) { + continue; + } + if (formItems.GetValueAt(pItemChild->m_pFormNode)) { + continue; + } + formItems.SetAt(pItemChild->m_pFormNode, this); + retArray.Add(pItemChild->m_pFormNode); + } + } + } else { + if(bOnPageArea) { + CXFA_NodeIteratorTemplate iterator((CXFA_ContentLayoutItemImpl*)pItem); + for(CXFA_ContentLayoutItemImpl* pItemChild = iterator.GetCurrent(); pItemChild; pItemChild = iterator.MoveToNext()) { + if(!pItemChild->IsContentLayoutItem()) { + continue; + } + XFA_ELEMENT eElementType = pItemChild->m_pFormNode->GetClassID(); + if (eElementType != XFA_ELEMENT_Field && eElementType != XFA_ELEMENT_Draw + && eElementType != XFA_ELEMENT_Subform && eElementType != XFA_ELEMENT_Area) { + continue; + } + if (formItems.GetValueAt(pItemChild->m_pFormNode)) { + continue; + } + formItems.SetAt(pItemChild->m_pFormNode, this); + retArray.Add(pItemChild->m_pFormNode); + } + } + } + } + return; + } + XFA_ELEMENT eType = XFA_ELEMENT_UNKNOWN; + if (wsType == FX_WSTRC(L"field")) { + eType = XFA_ELEMENT_Field; + } else if (wsType == FX_WSTRC(L"draw")) { + eType = XFA_ELEMENT_Draw; + } else if (wsType == FX_WSTRC(L"subform")) { + eType = XFA_ELEMENT_Subform; + } else if (wsType == FX_WSTRC(L"area")) { + eType = XFA_ELEMENT_Area; + } + if (eType != XFA_ELEMENT_UNKNOWN) { + for(CXFA_LayoutItemImpl* pItem = pLayoutPage->m_pFirstChild; pItem; pItem = pItem->m_pNextSibling) { + if(pItem->m_pFormNode->GetClassID() == XFA_ELEMENT_ContentArea) { + if(!bOnPageArea) { + CXFA_NodeIteratorTemplate iterator((CXFA_ContentLayoutItemImpl*)pItem->m_pFirstChild); + for(CXFA_ContentLayoutItemImpl* pItemChild = iterator.GetCurrent(); pItemChild; pItemChild = iterator.MoveToNext()) { + if(!pItemChild->IsContentLayoutItem()) { + continue; + } + if (pItemChild->m_pFormNode->GetClassID() != eType) { + continue; + } + if (formItems.GetValueAt(pItemChild->m_pFormNode)) { + continue; + } + formItems.SetAt(pItemChild->m_pFormNode, this); + retArray.Add(pItemChild->m_pFormNode); + } + } + } else { + if(bOnPageArea) { + CXFA_NodeIteratorTemplate iterator((CXFA_ContentLayoutItemImpl*)pItem); + for(CXFA_ContentLayoutItemImpl* pItemChild = iterator.GetCurrent(); pItemChild; pItemChild = iterator.MoveToNext()) { + if(!pItemChild->IsContentLayoutItem()) { + continue; + } + if (pItemChild->m_pFormNode->GetClassID() != eType) { + continue; + } + if (formItems.GetValueAt(pItemChild->m_pFormNode)) { + continue; + } + formItems.SetAt(pItemChild->m_pFormNode, this); + retArray.Add(pItemChild->m_pFormNode); + } + } + } + } + return; + } +} +void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_PageContent(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength < 1 || iLength > 3) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"pageContent")); + return; + } + FX_INT32 iIndex = 0; + CFX_WideString wsType; + FX_BOOL bOnPageArea = FALSE; + if (iLength >= 1) { + iIndex = pArguments->GetInt32(0); + } + if (iLength >= 2) { + CFX_ByteString bsType = pArguments->GetUTF8String(1); + wsType = CFX_WideString::FromUTF8(bsType, bsType.GetLength()); + } + if (iLength >= 3) { + bOnPageArea = pArguments->GetInt32(2) == 0 ? FALSE : TRUE; + } + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout(); + if (!pDocLayout) { + return; + } + CXFA_NodeArray retArray; + Script_LayoutPseudoModel_GetObjArray(pDocLayout, iIndex, wsType, bOnPageArea, retArray); + CXFA_ArrayNodeList* pArrayNodeList = FX_NEW CXFA_ArrayNodeList(m_pDocument); + pArrayNodeList->SetArrayNodeList(retArray); + FXJSE_Value_SetObject(pArguments->GetReturnValue(), (CXFA_Object*)pArrayNodeList, m_pDocument->GetScriptContext()->GetJseNormalClass()); +} +void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_AbsPageCount(CFXJSE_Arguments* pArguments) +{ + Script_LayoutPseudoModel_NumberedPageCount(pArguments, FALSE); +} +void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_AbsPageCountInBatch(CFXJSE_Arguments* pArguments) +{ + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + XFA_HDOC hDoc = pNotify->GetHDOC(); + FX_INT32 iPageCount = pNotify->GetDocProvider()->AbsPageCountInBatch(hDoc); + FXJSE_HVALUE hValue = pArguments->GetReturnValue(); + if (hValue) { + FXJSE_Value_SetInteger(hValue, iPageCount); + } +} +void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_SheetCountInBatch(CFXJSE_Arguments* pArguments) +{ + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + XFA_HDOC hDoc = pNotify->GetHDOC(); + FX_INT32 iPageCount = pNotify->GetDocProvider()->SheetCountInBatch(hDoc); + FXJSE_HVALUE hValue = pArguments->GetReturnValue(); + if (hValue) { + FXJSE_Value_SetInteger(hValue, iPageCount); + } +} +void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_Relayout(CFXJSE_Arguments* pArguments) +{ + CXFA_Node* pRootNode = m_pDocument->GetRoot(); + CXFA_Node* pFormRoot = pRootNode->GetFirstChildByClass(XFA_ELEMENT_Form); + FXSYS_assert(pFormRoot); + CXFA_Node* pContentRootNode = pFormRoot->GetNodeItem(XFA_NODEITEM_FirstChild); + CXFA_LayoutProcessor* pLayoutProcessor = m_pDocument->GetLayoutProcessor(); + if (pContentRootNode) { + pLayoutProcessor->AddChangedContainer(pContentRootNode); + } + pLayoutProcessor->SetForceReLayout(TRUE); +} +void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_AbsPageSpan(CFXJSE_Arguments* pArguments) +{ + Script_LayoutPseudoModel_PageSpan(pArguments); +} +void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_AbsPageInBatch(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength != 1) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"absPageInBatch")); + return; + } + CXFA_Node* pNode = NULL; + if (iLength >= 1) { + pNode = (CXFA_Node*)pArguments->GetObject(0); + } + if (!pNode) { + return; + } + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout(); + if (!pDocLayout) { + return; + } + XFA_HWIDGET hWidget = pNotify->GetHWidget(pDocLayout->GetLayoutItem(pNode)); + if (!hWidget) { + return; + } + XFA_HDOC hDoc = pNotify->GetHDOC(); + FX_INT32 iPageCount = pNotify->GetDocProvider()->AbsPageInBatch(hDoc, hWidget); + FXJSE_HVALUE hValue = pArguments->GetReturnValue(); + if (hValue) { + FXJSE_Value_SetInteger(hValue, iPageCount); + } +} +void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_SheetInBatch(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength != 1) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"sheetInBatch")); + return; + } + CXFA_Node* pNode = NULL; + if (iLength >= 1) { + pNode = (CXFA_Node*)pArguments->GetObject(0); + } + if (!pNode) { + return; + } + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout(); + if (!pDocLayout) { + return; + } + XFA_HWIDGET hWidget = pNotify->GetHWidget(pDocLayout->GetLayoutItem(pNode)); + if (!hWidget) { + return; + } + XFA_HDOC hDoc = pNotify->GetHDOC(); + FX_INT32 iPageCount = pNotify->GetDocProvider()->SheetInBatch(hDoc, hWidget); + FXJSE_HVALUE hValue = pArguments->GetReturnValue(); + if (hValue) { + FXJSE_Value_SetInteger(hValue, iPageCount); + } +} +void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_Sheet(CFXJSE_Arguments* pArguments) +{ + Script_LayoutPseudoModel_PageImp(pArguments, TRUE); +} +void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_RelayoutPageArea(CFXJSE_Arguments* pArguments) +{ +} +void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_SheetCount(CFXJSE_Arguments* pArguments) +{ + Script_LayoutPseudoModel_NumberedPageCount(pArguments, FALSE); +} +void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_AbsPage(CFXJSE_Arguments* pArguments) +{ + Script_LayoutPseudoModel_PageImp(pArguments, TRUE); +} +void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_PageImp(CFXJSE_Arguments* pArguments, FX_BOOL bAbsPage) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength != 1) { + FX_LPCWSTR methodName; + if (bAbsPage) { + methodName = (FX_LPCWSTR)(L"absPage"); + } else { + methodName = (FX_LPCWSTR)(L"page"); + } + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, methodName); + return; + } + CXFA_Node* pNode = NULL; + if (iLength >= 1) { + pNode = (CXFA_Node*)pArguments->GetObject(0); + } + FX_INT32 iPage = 0; + FXJSE_HVALUE hValue = pArguments->GetReturnValue(); + if (!pNode && hValue) { + FXJSE_Value_SetInteger(hValue, iPage); + } + IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout(); + if (!pDocLayout) { + return; + } + CXFA_LayoutItem* pLayoutItem = pDocLayout->GetLayoutItem(pNode); + if (!pLayoutItem) { + FXJSE_Value_SetInteger(hValue, -1); + return; + } + iPage = pLayoutItem->GetFirst()->GetPage()->GetPageIndex(); + if (hValue) { + FXJSE_Value_SetInteger(hValue, bAbsPage ? iPage : iPage + 1); + } +} diff --git a/xfa/src/fxfa/src/parser/xfa_script_layoutpseudomodel.h b/xfa/src/fxfa/src/parser/xfa_script_layoutpseudomodel.h new file mode 100644 index 0000000000..c94742aa3f --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_script_layoutpseudomodel.h @@ -0,0 +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 + +#ifndef _SCRIPT_LAYOUTPSEUDOMODEL_H_ +#define _SCRIPT_LAYOUTPSEUDOMODEL_H_ +enum XFA_LAYOUTMODEL_HWXY { + XFA_LAYOUTMODEL_H, + XFA_LAYOUTMODEL_W, + XFA_LAYOUTMODEL_X, + XFA_LAYOUTMODEL_Y +}; +class CScript_LayoutPseudoModel : public CXFA_OrdinaryObject +{ +public: + CScript_LayoutPseudoModel(CXFA_Document* pDocument); + ~CScript_LayoutPseudoModel(); + + void Script_LayoutPseudoModel_Ready(FXJSE_HVALUE hValue, FX_BOOL bSetting, XFA_ATTRIBUTE eAttribute); + + void Script_LayoutPseudoModel_HWXY(CFXJSE_Arguments* pArguments, XFA_LAYOUTMODEL_HWXY layoutModel); + void Script_LayoutPseudoModel_H(CFXJSE_Arguments* pArguments); + void Script_LayoutPseudoModel_W(CFXJSE_Arguments* pArguments); + void Script_LayoutPseudoModel_X(CFXJSE_Arguments* pArguments); + void Script_LayoutPseudoModel_Y(CFXJSE_Arguments* pArguments); + void Script_LayoutPseudoModel_NumberedPageCount(CFXJSE_Arguments* pArguments, FX_BOOL bNumbered); + void Script_LayoutPseudoModel_PageCount(CFXJSE_Arguments* pArguments); + void Script_LayoutPseudoModel_PageSpan(CFXJSE_Arguments* pArguments); + void Script_LayoutPseudoModel_Page(CFXJSE_Arguments* pArguments); + void Script_LayoutPseudoModel_PageContent(CFXJSE_Arguments* pArguments); + void Script_LayoutPseudoModel_AbsPageCount(CFXJSE_Arguments* pArguments); + void Script_LayoutPseudoModel_AbsPageCountInBatch(CFXJSE_Arguments* pArguments); + void Script_LayoutPseudoModel_SheetCountInBatch(CFXJSE_Arguments* pArguments); + void Script_LayoutPseudoModel_Relayout(CFXJSE_Arguments* pArguments); + void Script_LayoutPseudoModel_AbsPageSpan(CFXJSE_Arguments* pArguments); + void Script_LayoutPseudoModel_AbsPageInBatch(CFXJSE_Arguments* pArguments); + void Script_LayoutPseudoModel_SheetInBatch(CFXJSE_Arguments* pArguments); + void Script_LayoutPseudoModel_Sheet(CFXJSE_Arguments* pArguments); + void Script_LayoutPseudoModel_RelayoutPageArea(CFXJSE_Arguments* pArguments); + void Script_LayoutPseudoModel_SheetCount(CFXJSE_Arguments* pArguments); + void Script_LayoutPseudoModel_AbsPage(CFXJSE_Arguments* pArguments); +protected: + void Script_LayoutPseudoModel_GetObjArray(IXFA_DocLayout* pDocLayout, FX_INT32 iPageNo, const CFX_WideString &wsType, FX_BOOL bOnPageArea, CXFA_NodeArray &retArray); + void Script_LayoutPseudoModel_PageImp(CFXJSE_Arguments* pArguments, FX_BOOL bAbsPage); +}; +#endif diff --git a/xfa/src/fxfa/src/parser/xfa_script_logpseudomodel.cpp b/xfa/src/fxfa/src/parser/xfa_script_logpseudomodel.cpp new file mode 100644 index 0000000000..9a4406faf6 --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_script_logpseudomodel.cpp @@ -0,0 +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 "../../../foxitlib.h" +#include "../common/xfa_utils.h" +#include "../common/xfa_object.h" +#include "../common/xfa_document.h" +#include "../common/xfa_parser.h" +#include "../common/xfa_script.h" +#include "../common/xfa_docdata.h" +#include "../common/xfa_doclayout.h" +#include "../common/xfa_debug.h" +#include "../common/xfa_localemgr.h" +#include "../common/xfa_fm2jsapi.h" +#include "xfa_debug_parser.h" +#include "xfa_script_logpseudomodel.h" +CScript_LogPseudoModel::CScript_LogPseudoModel(CXFA_Document* pDocument) + : CXFA_OrdinaryObject(pDocument, XFA_ELEMENT_LogPseudoModel) +{ + m_uScriptHash = XFA_HASHCODE_Log; +} +CScript_LogPseudoModel::~CScript_LogPseudoModel() +{ +} +void CScript_LogPseudoModel::Script_LogPseudoModel_Message(CFXJSE_Arguments* pArguments) +{ +} +void CScript_LogPseudoModel::Script_LogPseudoModel_TraceEnabled(CFXJSE_Arguments* pArguments) +{ +} +void CScript_LogPseudoModel::Script_LogPseudoModel_TraceActivate(CFXJSE_Arguments* pArguments) +{ +} +void CScript_LogPseudoModel::Script_LogPseudoModel_TraceDeactivate(CFXJSE_Arguments* pArguments) +{ +} +void CScript_LogPseudoModel::Script_LogPseudoModel_Trace(CFXJSE_Arguments* pArguments) +{ +} diff --git a/xfa/src/fxfa/src/parser/xfa_script_logpseudomodel.h b/xfa/src/fxfa/src/parser/xfa_script_logpseudomodel.h new file mode 100644 index 0000000000..5616f10f5b --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_script_logpseudomodel.h @@ -0,0 +1,21 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _SCRIPT_LOGPSEUDOMODEL_H_ +#define _SCRIPT_LOGPSEUDOMODEL_H_ +class CScript_LogPseudoModel : public CXFA_OrdinaryObject +{ +public: + CScript_LogPseudoModel(CXFA_Document* pDocument); + virtual ~CScript_LogPseudoModel(); + + void Script_LogPseudoModel_Message(CFXJSE_Arguments* pArguments); + void Script_LogPseudoModel_TraceEnabled(CFXJSE_Arguments* pArguments); + void Script_LogPseudoModel_TraceActivate(CFXJSE_Arguments* pArguments); + void Script_LogPseudoModel_TraceDeactivate(CFXJSE_Arguments* pArguments); + void Script_LogPseudoModel_Trace(CFXJSE_Arguments* pArguments); +}; +#endif diff --git a/xfa/src/fxfa/src/parser/xfa_script_nodehelper.cpp b/xfa/src/fxfa/src/parser/xfa_script_nodehelper.cpp new file mode 100644 index 0000000000..e8cadc900a --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_script_nodehelper.cpp @@ -0,0 +1,393 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_utils.h" +#include "../common/xfa_object.h" +#include "../common/xfa_document.h" +#include "../common/xfa_parser.h" +#include "../common/xfa_script.h" +#include "../common/xfa_docdata.h" +#include "../common/xfa_doclayout.h" +#include "../common/xfa_debug.h" +#include "../common/xfa_localemgr.h" +#include "../common/xfa_fm2jsapi.h" +#include "xfa_debug_parser.h" +#include "xfa_script_nodehelper.h" +#include "xfa_script_imp.h" +CXFA_NodeHelper::CXFA_NodeHelper(void) + : m_eLastCreateType(XFA_ELEMENT_DataValue), m_pCreateParent(NULL) + , m_iCreateCount(0), m_iCreateFlag(XFA_RESOLVENODE_RSTYPE_CreateNodeOne) + , m_iCurAllStart(-1), m_pAllStartParent(NULL) +{ +} +CXFA_NodeHelper::~CXFA_NodeHelper(void) +{ +} +CXFA_Node* CXFA_NodeHelper::XFA_ResolveNodes_GetOneChild(CXFA_Node* parent, FX_LPCWSTR pwsName, FX_BOOL bIsClassName) +{ + if(parent == NULL) { + return NULL; + } + CXFA_NodeArray siblings; + FX_UINT32 uNameHash = FX_HashCode_String_GetW(pwsName, FXSYS_wcslen(pwsName)); + XFA_NodeAcc_TraverseAnySiblings(parent, uNameHash, &siblings, bIsClassName); + if (siblings.GetSize() == 0) { + return NULL; + } + return siblings[0]; +} +FX_INT32 CXFA_NodeHelper::XFA_CountSiblings(CXFA_Node* pNode, XFA_LOGIC_TYPE eLogicType, CXFA_NodeArray *pSiblings, FX_BOOL bIsClassName) +{ + CXFA_Node* parent = XFA_ResolveNodes_GetParent(pNode, XFA_LOGIC_NoTransparent); + if(parent == NULL) { + return 0; + } + XFA_LPCPROPERTY pPropert = XFA_GetPropertyOfElement(parent->GetClassID(), pNode->GetClassID(), XFA_XDPPACKET_UNKNOWN); + if(!pPropert && eLogicType == XFA_LOGIC_Transparent) { + parent = XFA_ResolveNodes_GetParent(pNode, XFA_LOGIC_Transparent); + if (parent == NULL) { + return 0; + } + } + if(bIsClassName) { + return XFA_NodeAcc_TraverseSiblings(parent, pNode->GetClassHashCode(), pSiblings, eLogicType, bIsClassName); + } else { + return XFA_NodeAcc_TraverseSiblings(parent, pNode->GetNameHash(), pSiblings, eLogicType, bIsClassName); + } +} +FX_INT32 CXFA_NodeHelper::XFA_NodeAcc_TraverseAnySiblings(CXFA_Node* parent, FX_DWORD dNameHash, CXFA_NodeArray* pSiblings, FX_BOOL bIsClassName ) +{ + if(parent == NULL || pSiblings == NULL) { + return 0; + } + FX_INT32 nCount = 0; + FX_INT32 i = 0; + CXFA_NodeArray properties; + parent->GetNodeList(properties, XFA_NODEFILTER_Properties); + FX_INT32 nProperties = properties.GetSize(); + for (i = 0; i < nProperties; ++i) { + CXFA_Node* child = properties[i]; + if(bIsClassName) { + if (child->GetClassHashCode() == dNameHash) { + pSiblings->Add(child); + nCount ++; + } + } else { + if (child->GetNameHash() == dNameHash) { + pSiblings->Add(child); + nCount ++; + } + } + if(nCount > 0) { + return nCount; + } + nCount += XFA_NodeAcc_TraverseAnySiblings(child, dNameHash, pSiblings, bIsClassName); + } + CXFA_NodeArray children; + parent->GetNodeList(children, XFA_NODEFILTER_Children); + FX_INT32 nChildren = children.GetSize(); + for (i = 0; i < nChildren; i ++) { + CXFA_Node* child = children[i]; + if(bIsClassName) { + if (child->GetClassHashCode() == dNameHash) { + if (pSiblings) { + pSiblings->Add(child); + } + nCount ++; + } + } else { + if (child->GetNameHash() == dNameHash) { + if (pSiblings) { + pSiblings->Add(child); + } + nCount ++; + } + } + if(nCount > 0) { + return nCount; + } + nCount += XFA_NodeAcc_TraverseAnySiblings(child, dNameHash, pSiblings, bIsClassName); + } + return nCount; +} +FX_INT32 CXFA_NodeHelper::XFA_NodeAcc_TraverseSiblings(CXFA_Node* parent, FX_DWORD dNameHash, CXFA_NodeArray* pSiblings, XFA_LOGIC_TYPE eLogicType, FX_BOOL bIsClassName, FX_BOOL bIsFindProperty) +{ + if (parent == NULL || pSiblings == NULL) { + return 0; + } + FX_INT32 nCount = 0; + FX_INT32 i = 0; + if(bIsFindProperty) { + CXFA_NodeArray properties; + parent->GetNodeList(properties, XFA_NODEFILTER_Properties); + FX_INT32 nProperties = properties.GetSize(); + for (i = 0; i < nProperties; ++i) { + CXFA_Node* child = properties[i]; + if(bIsClassName) { + if (child->GetClassHashCode() == dNameHash) { + pSiblings->Add(child); + nCount ++; + } + } else { + if (child->GetNameHash() == dNameHash) { + if(child->GetClassID() != XFA_ELEMENT_PageSet && child->GetClassID() != XFA_ELEMENT_Extras + && child->GetClassID() != XFA_ELEMENT_Items) { + pSiblings->Add(child); + nCount ++; + } + } + } + if (child->IsUnnamed() && child->GetClassID() == XFA_ELEMENT_PageSet) { + nCount += XFA_NodeAcc_TraverseSiblings(child, dNameHash, pSiblings, eLogicType, bIsClassName, FALSE); + } + } + if(nCount > 0) { + return nCount; + } + } + CXFA_NodeArray children; + parent->GetNodeList(children, XFA_NODEFILTER_Children); + FX_INT32 nChildren = children.GetSize(); + for (i = 0; i < nChildren; i ++) { + CXFA_Node* child = children[i]; + if(child->GetClassID() == XFA_ELEMENT_Variables) { + continue; + } + if(bIsClassName) { + if (child->GetClassHashCode() == dNameHash) { + if (pSiblings) { + pSiblings->Add(child); + } + nCount ++; + } + } else { + if (child->GetNameHash() == dNameHash) { + if (pSiblings) { + pSiblings->Add(child); + } + nCount ++; + } + } + if (eLogicType == XFA_LOGIC_NoTransparent) { + continue; + } + if (XFA_NodeIsTransparent(child) && child->GetClassID() != XFA_ELEMENT_PageSet) { + nCount += XFA_NodeAcc_TraverseSiblings(child, dNameHash, pSiblings, eLogicType, bIsClassName, FALSE); + } + } + return nCount; +} +CXFA_Node* CXFA_NodeHelper::XFA_ResolveNodes_GetParent(CXFA_Node* pNode, XFA_LOGIC_TYPE eLogicType) +{ + if (!pNode) { + return NULL; + } + if (eLogicType == XFA_LOGIC_NoTransparent) { + return pNode->GetNodeItem(XFA_NODEITEM_Parent); + } + CXFA_Node* parent; + CXFA_Node* node = pNode; + while (TRUE) { + parent = XFA_ResolveNodes_GetParent(node); + if (parent == NULL) { + break; + } + XFA_ELEMENT parentElement = parent->GetClassID(); + if ((!parent->IsUnnamed() && parentElement != XFA_ELEMENT_SubformSet) || parentElement == XFA_ELEMENT_Variables) { + break; + } + node = parent; + } + return parent; +} +FX_INT32 CXFA_NodeHelper::XFA_GetIndex(CXFA_Node* pNode, XFA_LOGIC_TYPE eLogicType, FX_BOOL bIsProperty , FX_BOOL bIsClassIndex ) +{ + CXFA_Node* parent = XFA_ResolveNodes_GetParent(pNode, XFA_LOGIC_NoTransparent); + if(parent == NULL) { + return 0; + } + if(!bIsProperty && eLogicType == XFA_LOGIC_Transparent) { + parent = XFA_ResolveNodes_GetParent(pNode, XFA_LOGIC_Transparent); + if (parent == NULL) { + return 0; + } + } + FX_DWORD dwHashName = pNode->GetNameHash(); + if(bIsClassIndex) { + dwHashName = pNode->GetClassHashCode(); + } + CXFA_NodeArray siblings; + FX_INT32 iSize = XFA_NodeAcc_TraverseSiblings(parent, dwHashName, &siblings, eLogicType, bIsClassIndex); + for (FX_INT32 i = 0; i < iSize; ++i) { + CXFA_Node* child = siblings[i]; + if (child == pNode) { + return i; + } + } + return 0; +} +void CXFA_NodeHelper::XFA_GetNameExpression(CXFA_Node* refNode, CFX_WideString &wsName, FX_BOOL bIsAllPath, XFA_LOGIC_TYPE eLogicType) +{ + wsName.Empty(); + if (bIsAllPath) { + XFA_GetNameExpression(refNode, wsName, FALSE, eLogicType); + CFX_WideString wsParent; + CXFA_Node* parent = XFA_ResolveNodes_GetParent(refNode, XFA_LOGIC_NoTransparent); + while (parent != NULL) { + XFA_GetNameExpression(parent, wsParent, FALSE, eLogicType); + wsParent += L"."; + wsParent += wsName; + wsName = wsParent; + parent = XFA_ResolveNodes_GetParent(parent, XFA_LOGIC_NoTransparent); + } + return; + } else { + CFX_WideStringC wsTagName; + CFX_WideString ws; + FX_BOOL bIsProperty = XFA_NodeIsProperty(refNode); + if (refNode->IsUnnamed() || (bIsProperty && refNode->GetClassID() != XFA_ELEMENT_PageSet)) { + refNode->GetClassName(wsTagName); + ws = wsTagName; + wsName.Format((FX_LPCWSTR)L"#%s[%d]", (FX_LPCWSTR)ws, XFA_GetIndex(refNode, eLogicType, bIsProperty, TRUE)); + return; + } + ws = refNode->GetCData(XFA_ATTRIBUTE_Name); + ws.Replace((FX_LPCWSTR)L".", (FX_LPCWSTR)L"\\."); + wsName.Format((FX_LPCWSTR)L"%s[%d]", (FX_LPCWSTR)ws, XFA_GetIndex(refNode, eLogicType, bIsProperty, FALSE)); + } +} +FX_BOOL CXFA_NodeHelper::XFA_NodeIsTransparent(CXFA_Node* refNode) +{ + if(refNode == NULL) { + return FALSE; + } + XFA_ELEMENT eRefNode = refNode->GetClassID(); + if((refNode->IsUnnamed() && refNode->IsContainerNode()) || eRefNode == XFA_ELEMENT_SubformSet + || eRefNode == XFA_ELEMENT_Area || eRefNode == XFA_ELEMENT_Proto) { + return TRUE; + } + return FALSE; +} +FX_BOOL CXFA_NodeHelper::XFA_CreateNode_ForCondition(CFX_WideString & wsCondition) +{ + FX_INT32 iLen = wsCondition.GetLength(); + CFX_WideString wsIndex = FX_WSTRC(L"0");; + FX_BOOL bAll = FALSE; + if(iLen == 0) { + m_iCreateFlag = XFA_RESOLVENODE_RSTYPE_CreateNodeOne; + return FALSE; + } + if(wsCondition.GetAt(0) == '[') { + FX_INT32 i = 1; + for (; i < iLen; ++i) { + FX_WCHAR ch = wsCondition[i]; + if (ch == ' ') { + continue; + } + if (ch == '+' || ch == '-') { + break; + } else if (ch == '*') { + bAll = TRUE; + break; + } else { + break; + } + } + if(bAll) { + wsIndex = FX_WSTRC(L"1"); + m_iCreateFlag = XFA_RESOLVENODE_RSTYPE_CreateNodeAll; + } else { + m_iCreateFlag = XFA_RESOLVENODE_RSTYPE_CreateNodeOne; + wsIndex = wsCondition.Mid(i, iLen - 1 - i); + } + FX_INT32 iIndex = wsIndex.GetInteger(); + m_iCreateCount = iIndex; + return TRUE; + } + return FALSE; +} +FX_BOOL CXFA_NodeHelper::XFA_ResolveNodes_CreateNode(CFX_WideString wsName, CFX_WideString wsCondition, FX_BOOL bLastNode, CXFA_ScriptContext* pScriptContext) +{ + if(m_pCreateParent == NULL) { + return FALSE; + } + FX_BOOL bIsClassName = FALSE; + FX_BOOL bResult = FALSE; + if(wsName.GetAt(0) == '!') { + wsName = wsName.Right(wsName.GetLength() - 1); + m_pCreateParent = (CXFA_Node*)pScriptContext->GetDocument()->GetXFANode(XFA_HASHCODE_Datasets); + } + if(wsName.GetAt(0) == '#') { + bIsClassName = TRUE; + wsName = wsName.Right(wsName.GetLength() - 1); + } + if(m_iCreateCount == 0) { + XFA_CreateNode_ForCondition(wsCondition); + } + if(bIsClassName) { + XFA_LPCELEMENTINFO lpElement = XFA_GetElementByName(wsName); + if(lpElement == NULL) { + return FALSE; + } + for(FX_INT32 iIndex = 0; iIndex < m_iCreateCount; iIndex ++) { + CXFA_Node* pNewNode = m_pCreateParent->CreateSamePacketNode(lpElement->eName); + if(pNewNode) { + m_pCreateParent->InsertChild(pNewNode); + if(iIndex == m_iCreateCount - 1) { + m_pCreateParent = pNewNode; + } + bResult = TRUE; + } + } + } else { + XFA_ELEMENT eClassType = XFA_ELEMENT_DataGroup; + if(bLastNode) { + eClassType = m_eLastCreateType; + } + for(FX_INT32 iIndex = 0; iIndex < m_iCreateCount; iIndex ++) { + CXFA_Node* pNewNode = m_pCreateParent->CreateSamePacketNode(eClassType); + if(pNewNode) { + pNewNode->SetAttribute(XFA_ATTRIBUTE_Name, wsName); + pNewNode->CreateXMLMappingNode(); + m_pCreateParent->InsertChild(pNewNode); + if(iIndex == m_iCreateCount - 1) { + m_pCreateParent = pNewNode; + } + bResult = TRUE; + } + } + } + if(!bResult) { + m_pCreateParent = NULL; + } + return bResult; +} +void CXFA_NodeHelper::XFA_SetCreateNodeType(CXFA_Node* refNode) +{ + if(refNode == NULL) { + return; + } + if(refNode->GetClassID() == XFA_ELEMENT_Subform) { + m_eLastCreateType = XFA_ELEMENT_DataGroup; + } else if(refNode->GetClassID() == XFA_ELEMENT_Field) { + m_eLastCreateType = XFA_FieldIsMultiListBox(refNode) ? XFA_ELEMENT_DataGroup : XFA_ELEMENT_DataValue; + } else if(refNode->GetClassID() == XFA_ELEMENT_ExclGroup) { + m_eLastCreateType = XFA_ELEMENT_DataValue; + } +} +FX_BOOL CXFA_NodeHelper::XFA_NodeIsProperty(CXFA_Node* refNode) +{ + FX_BOOL bRes = FALSE; + CXFA_Node* parent = XFA_ResolveNodes_GetParent(refNode, XFA_LOGIC_NoTransparent); + if(parent != NULL && refNode != NULL) { + XFA_LPCPROPERTY pPropert = XFA_GetPropertyOfElement(parent->GetClassID(), refNode->GetClassID(), XFA_XDPPACKET_UNKNOWN); + if(pPropert) { + bRes = TRUE; + } + } + return bRes; +} diff --git a/xfa/src/fxfa/src/parser/xfa_script_nodehelper.h b/xfa/src/fxfa/src/parser/xfa_script_nodehelper.h new file mode 100644 index 0000000000..5b3be76803 --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_script_nodehelper.h @@ -0,0 +1,41 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 _XFA_NODEHELPER_H_ +#define _XFA_NODEHELPER_H_ +class CXFA_ScriptContext; +enum XFA_LOGIC_TYPE { + XFA_LOGIC_NoTransparent, + XFA_LOGIC_Transparent, +}; +class CXFA_NodeHelper : public CFX_Object +{ +public: + CXFA_NodeHelper(void); + ~CXFA_NodeHelper(void); + CXFA_Node* XFA_ResolveNodes_GetOneChild(CXFA_Node* parent, FX_LPCWSTR pwsName, FX_BOOL bIsClassName = FALSE); + CXFA_Node* XFA_ResolveNodes_GetParent(CXFA_Node* pNode, XFA_LOGIC_TYPE eLogicType = XFA_LOGIC_NoTransparent); + + FX_INT32 XFA_NodeAcc_TraverseSiblings(CXFA_Node* parent, FX_DWORD dNameHash, CXFA_NodeArray* pSiblings, XFA_LOGIC_TYPE eLogicType, FX_BOOL bIsClassName = FALSE, FX_BOOL bIsFindProperty = TRUE); + FX_INT32 XFA_NodeAcc_TraverseAnySiblings(CXFA_Node* parent, FX_DWORD dNameHash, CXFA_NodeArray* pSiblings, FX_BOOL bIsClassName = FALSE); + FX_INT32 XFA_CountSiblings(CXFA_Node* pNode, XFA_LOGIC_TYPE eLogicType, CXFA_NodeArray *pSiblings, FX_BOOL bIsClassName = FALSE); + FX_INT32 XFA_GetIndex(CXFA_Node* pNode, XFA_LOGIC_TYPE eLogicType = XFA_LOGIC_NoTransparent, FX_BOOL bIsProperty = FALSE, FX_BOOL bIsClassIndex = FALSE); + void XFA_GetNameExpression(CXFA_Node* refNode, CFX_WideString &wsName, FX_BOOL bIsAllPath, XFA_LOGIC_TYPE eLogicType = XFA_LOGIC_NoTransparent); + FX_BOOL XFA_NodeIsTransparent(CXFA_Node* refNode); + FX_BOOL XFA_ResolveNodes_CreateNode(CFX_WideString wsName, CFX_WideString wsCondition, FX_BOOL bLastNode, CXFA_ScriptContext* pScriptContext); + FX_BOOL XFA_CreateNode_ForCondition(CFX_WideString & wsCondition); + void XFA_SetCreateNodeType(CXFA_Node* refNode); + FX_BOOL XFA_NodeIsProperty(CXFA_Node* refNode); +public: + XFA_ELEMENT m_eLastCreateType; + CXFA_Node* m_pCreateParent; + FX_INT32 m_iCreateCount; + XFA_RESOVENODE_RSTYPE m_iCreateFlag; + FX_INT32 m_iCurAllStart; + CXFA_Node* m_pAllStartParent; + +}; +#endif diff --git a/xfa/src/fxfa/src/parser/xfa_script_resolveprocessor.cpp b/xfa/src/fxfa/src/parser/xfa_script_resolveprocessor.cpp new file mode 100644 index 0000000000..c133f6b6f1 --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_script_resolveprocessor.cpp @@ -0,0 +1,784 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_utils.h" +#include "../common/xfa_object.h" +#include "../common/xfa_document.h" +#include "../common/xfa_parser.h" +#include "../common/xfa_script.h" +#include "../common/xfa_docdata.h" +#include "../common/xfa_doclayout.h" +#include "../common/xfa_debug.h" +#include "../common/xfa_localemgr.h" +#include "../common/xfa_fm2jsapi.h" +#include "xfa_debug_parser.h" +#include "xfa_script_resolveprocessor.h" +#include "xfa_script_nodehelper.h" +#include "xfa_script_imp.h" +CXFA_ResolveProcessor::CXFA_ResolveProcessor(void) + : m_pNodeHelper(NULL), m_iCurStart(0) +{ + m_pNodeHelper = FX_NEW CXFA_NodeHelper; +} +CXFA_ResolveProcessor::~CXFA_ResolveProcessor(void) +{ + if(m_pNodeHelper) { + delete m_pNodeHelper; + m_pNodeHelper = NULL; + } +} +FX_INT32 CXFA_ResolveProcessor::XFA_ResolveNodes(CXFA_ResolveNodesData &rnd) +{ + if (rnd.m_CurNode == NULL) { + return -1; + } + if(!rnd.m_CurNode->IsNode()) { + if(rnd.m_dwStyles & XFA_RESOLVENODE_Attributes) { + return XFA_ResolveNodes_ForAttributeRs(rnd.m_CurNode, rnd, rnd.m_wsName); + } + return 0; + } + if (rnd.m_dwStyles & XFA_RESOLVENODE_AnyChild) { + return XFA_ResolveNodes_AnyChild(rnd); + } + FX_WCHAR wch = rnd.m_wsName.GetAt(0); + switch (wch) { + case '$': + return XFA_ResolveNodes_Dollar(rnd); + case '!': + return XFA_ResolveNodes_Excalmatory(rnd); + case '#': + return XFA_ResolveNodes_NumberSign(rnd); + case '*': + return XFA_ResolveNodes_Asterisk(rnd); + case '.': + return XFA_ResolveNodes_AnyChild(rnd); + default: + break; + } + if (rnd.m_uHashName == XFA_HASHCODE_This && rnd.m_nLevel == 0) { + rnd.m_Nodes.Add(rnd.m_pSC->GetThisObject()); + return 1; + } else if(rnd.m_CurNode->GetClassID() == XFA_ELEMENT_Xfa) { + CXFA_Object* pObjNode = rnd.m_pSC->GetDocument()->GetXFANode(rnd.m_uHashName); + if(pObjNode) { + rnd.m_Nodes.Add(pObjNode); + } else if (rnd.m_uHashName == XFA_HASHCODE_Xfa) { + rnd.m_Nodes.Add(rnd.m_CurNode); + } else if ((rnd.m_dwStyles & XFA_RESOLVENODE_Attributes) && XFA_ResolveNodes_ForAttributeRs(rnd.m_CurNode, rnd, rnd.m_wsName)) { + return 1; + } + if (rnd.m_Nodes.GetSize() > 0) { + XFA_ResolveNode_FilterCondition(rnd, rnd.m_wsCondition); + } + return rnd.m_Nodes.GetSize(); + } + FX_INT32 nRet = XFA_ResolveNodes_Normal(rnd); + if (nRet < 1 && rnd.m_uHashName == XFA_HASHCODE_Xfa) { + rnd.m_Nodes.Add(rnd.m_pSC->GetDocument()->GetRoot()); + } + return rnd.m_Nodes.GetSize(); +} +FX_INT32 CXFA_ResolveProcessor::XFA_ResolveNodes_AnyChild(CXFA_ResolveNodesData &rnd) +{ + CFX_WideString wsName = rnd.m_wsName.Right(rnd.m_wsName.GetLength() - 1); + CFX_WideString wsCondition = rnd.m_wsCondition; + CXFA_Node* findNode = NULL; + CXFA_NodeArray siblings; + FX_BOOL bClassName = FALSE; + if(wsName.GetAt(0) == '#') { + bClassName = TRUE; + wsName = wsName.Right(wsName.GetLength() - 1); + } + findNode = m_pNodeHelper->XFA_ResolveNodes_GetOneChild((CXFA_Node*)rnd.m_CurNode, wsName, bClassName); + if (findNode == NULL) { + return 0; + } + if (wsCondition.IsEmpty()) { + rnd.m_Nodes.Add(findNode); + return rnd.m_Nodes.GetSize(); + } + m_pNodeHelper->XFA_CountSiblings(findNode, XFA_LOGIC_Transparent, (CXFA_NodeArray*)&rnd.m_Nodes, bClassName); + XFA_ResolveNode_FilterCondition(rnd, wsCondition); + return rnd.m_Nodes.GetSize(); +} +FX_INT32 CXFA_ResolveProcessor::XFA_ResolveNodes_Dollar(CXFA_ResolveNodesData &rnd) +{ + CXFA_ObjArray &nodes = rnd.m_Nodes; + CFX_WideString wsName = rnd.m_wsName; + CFX_WideString wsCondition = rnd.m_wsCondition; + FX_INT32 iNameLen = wsName.GetLength(); + if (iNameLen == 1) { + nodes.Add(rnd.m_CurNode); + return 1; + } + if (rnd.m_nLevel > 0) { + return -1; + } + FX_DWORD dwNameHash = FX_HashCode_String_GetW((FX_LPCWSTR)wsName + 1, iNameLen - 1); + if (dwNameHash == XFA_HASHCODE_Xfa) { + nodes.Add(rnd.m_pSC->GetDocument()->GetRoot()); + } else { + CXFA_Object* pObjNode = rnd.m_pSC->GetDocument()->GetXFANode(dwNameHash); + if(pObjNode) { + rnd.m_Nodes.Add(pObjNode); + } + } + if (rnd.m_Nodes.GetSize() > 0) { + XFA_ResolveNode_FilterCondition(rnd, wsCondition); + } + return rnd.m_Nodes.GetSize(); +} +FX_INT32 CXFA_ResolveProcessor::XFA_ResolveNodes_Excalmatory(CXFA_ResolveNodesData &rnd) +{ + if (rnd.m_nLevel > 0) { + return 0; + } + CXFA_Node* datasets = (CXFA_Node*)rnd.m_pSC->GetDocument()->GetXFANode(XFA_HASHCODE_Datasets); + if (datasets == NULL) { + return 0; + } + CXFA_ResolveNodesData rndFind; + rndFind.m_pSC = rnd.m_pSC; + rndFind.m_CurNode = datasets; + rndFind.m_wsName = rnd.m_wsName.Right(rnd.m_wsName.GetLength() - 1); + rndFind.m_uHashName = FX_HashCode_String_GetW(rndFind.m_wsName, rndFind.m_wsName.GetLength()); + rndFind.m_nLevel = rnd.m_nLevel + 1; + rndFind.m_dwStyles = XFA_RESOLVENODE_Children; + rndFind.m_wsCondition = rnd.m_wsCondition; + XFA_ResolveNodes(rndFind); + if (rndFind.m_Nodes.GetSize() > 0) { + rnd.m_Nodes.Append(rndFind.m_Nodes); + rndFind.m_Nodes.RemoveAll(); + } + return rnd.m_Nodes.GetSize(); +} +FX_INT32 CXFA_ResolveProcessor::XFA_ResolveNodes_NumberSign(CXFA_ResolveNodesData &rnd) +{ + FX_DWORD dwStyles = rnd.m_dwStyles; + CFX_WideString wsName = rnd.m_wsName.Right(rnd.m_wsName.GetLength() - 1); + CFX_WideString wsCondition = rnd.m_wsCondition; + CXFA_Node* curNode = (CXFA_Node*)rnd.m_CurNode; + if(XFA_ResolveNodes_ForAttributeRs(curNode, rnd, wsName)) { + return 1; + } + CXFA_ResolveNodesData rndFind; + rndFind.m_pSC = rnd.m_pSC; + rndFind.m_nLevel = rnd.m_nLevel + 1; + rndFind.m_dwStyles = rnd.m_dwStyles; + rndFind.m_dwStyles |= XFA_RESOLVENODE_TagName; + rndFind.m_dwStyles &= ~XFA_RESOLVENODE_Attributes; + rndFind.m_wsName = wsName; + rndFind.m_uHashName = FX_HashCode_String_GetW(rndFind.m_wsName, rndFind.m_wsName.GetLength()); + rndFind.m_wsCondition = wsCondition; + rndFind.m_CurNode = curNode; + XFA_ResolveNodes_Normal(rndFind); + if (rndFind.m_Nodes.GetSize() > 0) { + if(wsCondition.GetLength() == 0 && rndFind.m_Nodes.Find(curNode) >= 0) { + rnd.m_Nodes.Add(curNode); + } else { + rnd.m_Nodes.Append(rndFind.m_Nodes); + rndFind.m_Nodes.RemoveAll(); + } + } + return rnd.m_Nodes.GetSize(); +} +FX_INT32 CXFA_ResolveProcessor::XFA_ResolveNodes_ForAttributeRs(CXFA_Object* curNode, CXFA_ResolveNodesData &rnd, FX_WSTR strAttr) +{ + XFA_LPCSCRIPTATTRIBUTEINFO lpScriptAttribute = XFA_GetScriptAttributeByName(curNode->GetClassID(), strAttr); + if(lpScriptAttribute) { + rnd.m_pScriptAttribute = lpScriptAttribute; + rnd.m_Nodes.Add(curNode); + rnd.m_dwFlag = XFA_RESOVENODE_RSTYPE_Attribute; + return 1; + } + return 0; +} +FX_INT32 CXFA_ResolveProcessor::XFA_ResolveNodes_Normal(CXFA_ResolveNodesData &rnd) +{ + if (rnd.m_nLevel > 32) { + return 0; + } + if(!rnd.m_CurNode->IsNode()) { + return 0; + } + CXFA_Node* curNode = (CXFA_Node*)rnd.m_CurNode; + CXFA_ObjArray &nodes = rnd.m_Nodes; + FX_INT32 nNum = nodes.GetSize(); + FX_DWORD dwStyles = rnd.m_dwStyles; + CFX_WideString &wsName = rnd.m_wsName; + FX_UINT32 uNameHash = rnd.m_uHashName; + CFX_WideString &wsCondition = rnd.m_wsCondition; + CXFA_ResolveNodesData rndFind; + rndFind.m_wsName = rnd.m_wsName; + rndFind.m_wsCondition = rnd.m_wsCondition; + rndFind.m_pSC = rnd.m_pSC; + rndFind.m_nLevel = rnd.m_nLevel + 1; + rndFind.m_uHashName = uNameHash; + CXFA_NodeArray children; + CXFA_NodeArray properties; + CXFA_Node* pVariablesNode = NULL; + CXFA_Node* pPageSetNode = NULL; + CXFA_Node *pChild = curNode->GetNodeItem(XFA_NODEITEM_FirstChild); + while (pChild) { + if(pChild->GetClassID() == XFA_ELEMENT_Variables) { + pVariablesNode = pChild; + pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling); + continue; + } else if(pChild->GetClassID() == XFA_ELEMENT_PageSet) { + pPageSetNode = pChild; + pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling); + continue; + } else { + XFA_LPCPROPERTY pPropert = XFA_GetPropertyOfElement(curNode->GetClassID(), pChild->GetClassID(), XFA_XDPPACKET_UNKNOWN); + if(pPropert) { + properties.Add(pChild); + } else { + children.Add(pChild); + } + } + pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling); + } + if((dwStyles & XFA_RESOLVENODE_Properties) && pVariablesNode) { + FX_UINT32 uPropHash = pVariablesNode->GetClassHashCode(); + if (uPropHash == uNameHash) { + nodes.Add(pVariablesNode); + } else { + rndFind.m_CurNode = pVariablesNode; + XFA_ResolveNodes_SetStylesForChild(dwStyles, rndFind); + CFX_WideString wsSaveCondition = rndFind.m_wsCondition; + rndFind.m_wsCondition.Empty(); + XFA_ResolveNodes_Normal(rndFind); + rndFind.m_wsCondition = wsSaveCondition; + if (rndFind.m_Nodes.GetSize() > 0) { + nodes.Append(rndFind.m_Nodes); + rndFind.m_Nodes.RemoveAll(); + } + } + if (nodes.GetSize() > nNum) { + XFA_ResolveNode_FilterCondition(rnd, wsCondition); + if (nodes.GetSize() > 0) { + return 1; + } + return 0; + } + } + if (dwStyles & XFA_RESOLVENODE_Children) { + FX_BOOL bSetFlag = FALSE; + if(pPageSetNode && (dwStyles & XFA_RESOLVENODE_Properties)) { + children.Add(pPageSetNode); + } + for(FX_INT32 i = 0; i < children.GetSize(); i++) { + CXFA_Node* child = children[i]; + if (dwStyles & XFA_RESOLVENODE_TagName) { + if (child->GetClassHashCode() == uNameHash) { + nodes.Add(child); + } + } else if (child->GetNameHash() == uNameHash) { + nodes.Add(child); + } + if (m_pNodeHelper->XFA_NodeIsTransparent(child) && child->GetClassID() != XFA_ELEMENT_PageSet) { + if(!bSetFlag) { + XFA_ResolveNodes_SetStylesForChild(dwStyles, rndFind); + bSetFlag = TRUE; + } + rndFind.m_CurNode = child; + CFX_WideString wsSaveCondition = rndFind.m_wsCondition; + rndFind.m_wsCondition.Empty(); + XFA_ResolveNodes_Normal(rndFind); + rndFind.m_wsCondition = wsSaveCondition; + if (rndFind.m_Nodes.GetSize() > 0) { + nodes.Append(rndFind.m_Nodes); + rndFind.m_Nodes.RemoveAll(); + } + } + } + if (nodes.GetSize() > nNum) { + if(!(dwStyles & XFA_RESOLVENODE_ALL)) { + CXFA_NodeArray upArrayNodes; + if(m_pNodeHelper->XFA_NodeIsTransparent((CXFA_Node*)curNode)) { + m_pNodeHelper->XFA_CountSiblings((CXFA_Node*)nodes[0], XFA_LOGIC_Transparent, &upArrayNodes, dwStyles & XFA_RESOLVENODE_TagName ? TRUE : FALSE); + } + if(upArrayNodes.GetSize() > nodes.GetSize()) { + upArrayNodes[0] = (CXFA_Node*)nodes[0]; + nodes.RemoveAll(); + nodes.Append((CXFA_ObjArray &)upArrayNodes); + upArrayNodes.RemoveAll(); + } + } + XFA_ResolveNode_FilterCondition(rnd, wsCondition); + if (nodes.GetSize() > 0) { + return 1; + } + return 0; + } + } + if (dwStyles & XFA_RESOLVENODE_Attributes) { + if(XFA_ResolveNodes_ForAttributeRs(curNode, rnd, wsName)) { + return 1; + } + } + if (dwStyles & XFA_RESOLVENODE_Properties) { + FX_BOOL bSetFlag = FALSE; + for(FX_INT32 i = 0; i < properties.GetSize(); i++) { + CXFA_Node* childProperty = properties[i]; + if(childProperty->IsUnnamed()) { + FX_UINT32 uPropHash = childProperty->GetClassHashCode(); + XFA_ELEMENT eName = childProperty->GetClassID(); + if (uPropHash == uNameHash) { + nodes.Add(childProperty); + } + } else if(childProperty->GetNameHash() == uNameHash && childProperty->GetClassID() != XFA_ELEMENT_Extras + && childProperty->GetClassID() != XFA_ELEMENT_Items) { + nodes.Add(childProperty); + } + } + if (nodes.GetSize() > nNum) { + XFA_ResolveNode_FilterCondition(rnd, wsCondition); + if (nodes.GetSize() > 0) { + return 1; + } + return 0; + } + CXFA_Node* pProp = NULL; + if(XFA_ELEMENT_Subform == curNode->GetClassID() && XFA_HASHCODE_Occur == uNameHash) { + CXFA_Node* pInstanceManager = ((CXFA_Node*)curNode)->GetInstanceMgrOfSubform(); + if(pInstanceManager) { + pProp = pInstanceManager->GetProperty(0, XFA_ELEMENT_Occur, TRUE); + } + } else { + XFA_LPCELEMENTINFO pElement = XFA_GetElementByName(wsName); + if (pElement) { + pProp = ((CXFA_Node*)curNode)->GetProperty(0, pElement->eName, pElement->eName != XFA_ELEMENT_PageSet); + } + } + if (pProp) { + nodes.Add(pProp); + return nodes.GetSize(); + } + } + CXFA_Node* parentNode = m_pNodeHelper->XFA_ResolveNodes_GetParent((CXFA_Node *)curNode, XFA_LOGIC_NoTransparent); + FX_UINT32 uCurClassHash = curNode->GetClassHashCode(); + if (parentNode == NULL) { + if(uCurClassHash == uNameHash) { + nodes.Add((CXFA_Node*)curNode); + XFA_ResolveNode_FilterCondition(rnd, wsCondition); + if(nodes.GetSize() > 0) { + return 1; + } + } + return 0; + } + if (dwStyles & XFA_RESOLVENODE_Siblings) { + CXFA_Node* child = parentNode->GetNodeItem(XFA_NODEITEM_FirstChild); + FX_DWORD dwSubStyles = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties; + if (dwStyles & XFA_RESOLVENODE_TagName) { + dwSubStyles |= XFA_RESOLVENODE_TagName; + } + if (dwStyles & XFA_RESOLVENODE_ALL) { + dwSubStyles |= XFA_RESOLVENODE_ALL; + } + rndFind.m_dwStyles = dwSubStyles; + while (child) { + if (child == curNode) { + if (dwStyles & XFA_RESOLVENODE_TagName) { + if (uCurClassHash == uNameHash) { + nodes.Add(curNode); + } + } else { + if (child->GetNameHash() == uNameHash) { + nodes.Add(curNode); + if(rnd.m_nLevel == 0 && wsCondition.GetLength() == 0) { + nodes.RemoveAll(); + nodes.Add(curNode); + return 1; + } + } + } + child = child->GetNodeItem(XFA_NODEITEM_NextSibling); + continue; + } + if (dwStyles & XFA_RESOLVENODE_TagName) { + if (child->GetClassHashCode() == uNameHash) { + nodes.Add(child); + } + } else if (child->GetNameHash() == uNameHash) { + nodes.Add(child); + } + XFA_LPCPROPERTY pPropert = XFA_GetPropertyOfElement(parentNode->GetClassID(), child->GetClassID(), XFA_XDPPACKET_UNKNOWN); + FX_BOOL bInnerSearch = FALSE; + if(pPropert) { + if((child->GetClassID() == XFA_ELEMENT_Variables || child->GetClassID() == XFA_ELEMENT_PageSet)) { + bInnerSearch = TRUE; + } + } else { + if(m_pNodeHelper->XFA_NodeIsTransparent(child)) { + bInnerSearch = TRUE; + } + } + if (bInnerSearch) { + rndFind.m_CurNode = child; + CFX_WideString wsOriginCondition = rndFind.m_wsCondition; + rndFind.m_wsCondition.Empty(); + FX_DWORD dwOriginStyle = rndFind.m_dwStyles; + rndFind.m_dwStyles = dwOriginStyle | XFA_RESOLVENODE_ALL; + XFA_ResolveNodes_Normal(rndFind); + rndFind.m_dwStyles = dwOriginStyle; + rndFind.m_wsCondition = wsOriginCondition; + if (rndFind.m_Nodes.GetSize() > 0) { + nodes.Append(rndFind.m_Nodes); + rndFind.m_Nodes.RemoveAll(); + } + } + child = child->GetNodeItem(XFA_NODEITEM_NextSibling); + } + if (nodes.GetSize() > nNum) { + if(m_pNodeHelper->XFA_NodeIsTransparent(parentNode)) { + CXFA_NodeArray upArrayNodes; + m_pNodeHelper->XFA_CountSiblings((CXFA_Node*)nodes[0], XFA_LOGIC_Transparent, &upArrayNodes, dwStyles & XFA_RESOLVENODE_TagName ? TRUE : FALSE); + if(upArrayNodes.GetSize() > nodes.GetSize()) { + upArrayNodes[0] = (CXFA_Node*)nodes[0]; + nodes.RemoveAll(); + nodes.Append((CXFA_ObjArray &)upArrayNodes); + upArrayNodes.RemoveAll(); + } + } + XFA_ResolveNode_FilterCondition(rnd, wsCondition); + if (nodes.GetSize() > 0) { + return 1; + } + return 0; + } + } + if (dwStyles & XFA_RESOLVENODE_Parent) { + FX_DWORD dwSubStyles = XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Properties; + if (dwStyles & XFA_RESOLVENODE_TagName) { + dwSubStyles |= XFA_RESOLVENODE_TagName; + } + if (dwStyles & XFA_RESOLVENODE_ALL) { + dwSubStyles |= XFA_RESOLVENODE_ALL; + } + rndFind.m_dwStyles = dwSubStyles; + rndFind.m_CurNode = parentNode; + CXFA_NodeArray& array = rnd.m_pSC->GetUpObjectArray(); + array.Add(parentNode); + XFA_ResolveNodes_Normal(rndFind); + if (rndFind.m_Nodes.GetSize() > 0) { + nodes.Append(rndFind.m_Nodes); + rndFind.m_Nodes.RemoveAll(); + } + if (nodes.GetSize() > nNum) { + return 1; + } + } + return 0; +} +FX_INT32 CXFA_ResolveProcessor::XFA_ResolveNodes_Asterisk(CXFA_ResolveNodesData &rnd) +{ + CXFA_Node* curNode = (CXFA_Node*)rnd.m_CurNode; + CXFA_ObjArray &nodes = rnd.m_Nodes; + CXFA_NodeArray array; + curNode->GetNodeList(array, XFA_NODEFILTER_Children | XFA_NODEFILTER_Properties); + nodes.Append((CXFA_ObjArray &)array); + return nodes.GetSize(); +} +FX_INT32 CXFA_ResolveProcessor::XFA_ResolveNodes_PopStack(CFX_Int32Array &stack) +{ + FX_INT32 nType = -1; + FX_INT32 iSize = stack.GetSize() - 1; + if (iSize > -1) { + nType = stack[iSize]; + stack.RemoveAt(iSize, 1); + } + return nType; +} +FX_INT32 CXFA_ResolveProcessor::XFA_ResolveNodes_GetFilter(FX_WSTR wsExpression, FX_INT32 nStart, CXFA_ResolveNodesData &rnd) +{ + FXSYS_assert(nStart > -1); + FX_INT32 iLength = wsExpression.GetLength(); + if (nStart >= iLength) { + return 0; + } + CFX_WideString& wsName = rnd.m_wsName; + CFX_WideString& wsCondition = rnd.m_wsCondition; + FX_LPWSTR pNameBuf = wsName.GetBuffer(iLength - nStart); + FX_LPWSTR pConditionBuf = wsCondition.GetBuffer(iLength - nStart); + FX_INT32 nCount = 0; + FX_INT32 nNameCount = 0; + FX_INT32 nConditionCount = 0; + CFX_Int32Array stack; + FX_INT32 nType = -1; + FX_LPCWSTR pSrc = wsExpression.GetPtr(); + FX_WCHAR wPrev = 0, wCur; + FX_BOOL bIsCondition = FALSE; + while (nStart < iLength) { + wCur = pSrc[nStart ++]; + if (wCur == '.') { + if (wPrev == '\\') { + pNameBuf[nNameCount - 1] = wPrev = '.'; + continue; + } + if(nNameCount == 0) { + pNameBuf[nNameCount ++] = wCur; + continue; + } + FX_WCHAR wLookahead = nStart < iLength ? pSrc [nStart] : 0; + if(wLookahead != '[' && wLookahead != '(') { + if (nType < 0) { + break; + } + } + } + if (wCur == '[' || wCur == '(') { + bIsCondition = TRUE; + } else if (wCur == '.' && nStart < iLength && (pSrc[nStart] == '[' || pSrc[nStart] == '(')) { + bIsCondition = TRUE; + } + if(bIsCondition) { + pConditionBuf[nConditionCount ++] = wCur; + } else { + pNameBuf[nNameCount ++] = wCur; + } + FX_BOOL bRecursive = TRUE; + switch (nType) { + case 0: + if (wCur == ']') { + nType = XFA_ResolveNodes_PopStack(stack); + bRecursive = FALSE; + } + break; + case 1: + if (wCur == ')') { + nType = XFA_ResolveNodes_PopStack(stack); + bRecursive = FALSE; + } + break; + case 2: + if (wCur == '"') { + nType = XFA_ResolveNodes_PopStack(stack); + bRecursive = FALSE; + } + break; + } + if (bRecursive) { + switch (wCur) { + case '[': + stack.Add(nType); + nType = 0; + break; + case '(': + stack.Add(nType); + nType = 1; + break; + case '"': + stack.Add(nType); + nType = 2; + break; + } + } + wPrev = wCur; + } + if (stack.GetSize() > 0) { + return -1; + } + wsName.ReleaseBuffer(nNameCount); + wsName.TrimLeft(); + wsName.TrimRight(); + wsCondition.ReleaseBuffer(nConditionCount); + wsCondition.TrimLeft(); + wsCondition.TrimRight(); + rnd.m_uHashName = FX_HashCode_String_GetW(wsName, wsName.GetLength()); + return nStart; +} +void CXFA_ResolveProcessor::XFA_ResolveNode_ConditionArray(FX_INT32 iCurIndex, CFX_WideString wsCondition, FX_INT32 iFoundCount, CXFA_ResolveNodesData &rnd) +{ + CXFA_NodeArray &findNodes = (CXFA_NodeArray&)rnd.m_Nodes; + FX_INT32 iLen = wsCondition.GetLength(); + FX_BOOL bRelative = FALSE; + FX_BOOL bAll = FALSE; + FX_INT32 i = 1; + for (; i < iLen; ++i) { + FX_WCHAR ch = wsCondition[i]; + if (ch == ' ') { + continue; + } + if (ch == '+' || ch == '-') { + bRelative = TRUE; + break; + } else if (ch == '*') { + bAll = TRUE; + break; + } else { + break; + } + } + if (bAll) { + if(rnd.m_dwStyles & XFA_RESOLVENODE_CreateNode) { + if(rnd.m_dwStyles & XFA_RESOLVENODE_Bind) { + m_pNodeHelper->m_pCreateParent = (CXFA_Node*)rnd.m_CurNode; + m_pNodeHelper->m_iCreateCount = 1; + findNodes.RemoveAll(); + m_pNodeHelper->m_iCurAllStart = -1; + m_pNodeHelper->m_pAllStartParent = NULL; + } else { + if(m_pNodeHelper->m_iCurAllStart == -1) { + m_pNodeHelper->m_iCurAllStart = m_iCurStart; + m_pNodeHelper->m_pAllStartParent = (CXFA_Node*)rnd.m_CurNode; + } + } + } else if(rnd.m_dwStyles & XFA_RESOLVENODE_BindNew) { + if(m_pNodeHelper->m_iCurAllStart == -1) { + m_pNodeHelper->m_iCurAllStart = m_iCurStart; + } + } + return; + } + if (iFoundCount == 1 && !iLen) { + return; + } + CFX_WideString wsIndex; + wsIndex = wsCondition.Mid(i, iLen - 1 - i); + FX_INT32 iIndex = wsIndex.GetInteger(); + if (bRelative) { + iIndex += iCurIndex; + } + if (iFoundCount <= iIndex || iIndex < 0) { + if(rnd.m_dwStyles & XFA_RESOLVENODE_CreateNode) { + m_pNodeHelper->m_pCreateParent = (CXFA_Node*)rnd.m_CurNode; + m_pNodeHelper->m_iCreateCount = iIndex - iFoundCount + 1; + } + findNodes.RemoveAll(); + } else { + CXFA_Node* ret = findNodes[iIndex]; + findNodes.RemoveAll(); + findNodes.Add(ret); + } +} +void CXFA_ResolveProcessor::XFA_ResolveNode_DoPredicateFilter(FX_INT32 iCurIndex, CFX_WideString wsCondition, FX_INT32 iFoundCount, CXFA_ResolveNodesData &rnd) +{ + CXFA_NodeArray &findNodes = (CXFA_NodeArray&)rnd.m_Nodes; + FXSYS_assert(iFoundCount == findNodes.GetSize()); + CFX_WideString wsExpression; + IXFA_ScriptContext* pContext = NULL; + XFA_SCRIPTLANGTYPE eLangType = XFA_SCRIPTLANGTYPE_Unkown; + if (wsCondition.Left(2) == FX_WSTRC(L".[") && wsCondition.Right(1) == FX_WSTRC(L"]")) { + eLangType = XFA_SCRIPTLANGTYPE_Formcalc; + } else if (wsCondition.Left(2) == FX_WSTRC(L".(") && wsCondition.Right(1) == FX_WSTRC(L")")) { + eLangType = XFA_SCRIPTLANGTYPE_Javascript; + } else { + return; + } + pContext = rnd.m_pSC; + wsExpression = wsCondition.Mid(2, wsCondition.GetLength() - 3); + for(FX_INT32 i = iFoundCount - 1; i >= 0; i--) { + CXFA_Object* node = findNodes[i]; + FX_BOOL bRet = FALSE; + FXJSE_HVALUE pRetValue = FXJSE_Value_Create(rnd.m_pSC->GetRuntime()); + bRet = pContext->RunScript(eLangType, wsExpression, pRetValue, node); + if(!bRet || !FXJSE_Value_ToBoolean(pRetValue)) { + findNodes.RemoveAt(i); + } + FXJSE_Value_Release(pRetValue); + } + return; +} +void CXFA_ResolveProcessor::XFA_ResolveNode_FilterCondition(CXFA_ResolveNodesData &rnd, CFX_WideString wsCondition) +{ + CXFA_NodeArray &findNodes = (CXFA_NodeArray&)rnd.m_Nodes; + FX_INT32 iCurrIndex = 0; + const CXFA_NodeArray &array = rnd.m_pSC->GetUpObjectArray(); + FX_INT32 iSize = array.GetSize(); + if (iSize) { + CXFA_Node* curNode = array[iSize - 1]; + FX_BOOL bIsProperty = m_pNodeHelper->XFA_NodeIsProperty(curNode); + if(curNode->IsUnnamed() || (bIsProperty && curNode->GetClassID() != XFA_ELEMENT_PageSet)) { + iCurrIndex = m_pNodeHelper->XFA_GetIndex(curNode, XFA_LOGIC_Transparent, bIsProperty, TRUE); + } else { + iCurrIndex = m_pNodeHelper->XFA_GetIndex(curNode, XFA_LOGIC_Transparent, bIsProperty, FALSE); + } + } + FX_INT32 iFoundCount = findNodes.GetSize(); + wsCondition.TrimLeft(); + wsCondition.TrimRight(); + FX_INT32 iLen = wsCondition.GetLength(); + if (!iLen) { + if (rnd.m_dwStyles & XFA_RESOLVENODE_ALL) { + return; + } + if (iFoundCount == 1) { + return; + } + if (iFoundCount <= iCurrIndex) { + if(rnd.m_dwStyles & XFA_RESOLVENODE_CreateNode) { + m_pNodeHelper->m_pCreateParent = (CXFA_Node*)rnd.m_CurNode; + m_pNodeHelper->m_iCreateCount = iCurrIndex - iFoundCount + 1; + } + findNodes.RemoveAll(); + return; + } else { + CXFA_Node* ret = findNodes[iCurrIndex]; + findNodes.RemoveAll(); + findNodes.Add(ret); + return; + } + } + FX_WCHAR wTypeChar = wsCondition[0]; + switch (wTypeChar) { + case '[': + XFA_ResolveNode_ConditionArray(iCurrIndex, wsCondition, iFoundCount, rnd); + return; + case '(': + return; + case '"': + return; + case '.': + if(iLen > 1 && (wsCondition[1] == '[' || wsCondition[1] == '(')) { + XFA_ResolveNode_DoPredicateFilter(iCurrIndex, wsCondition, iFoundCount, rnd); + } + default: + return; + } +} +void CXFA_ResolveProcessor::XFA_ResolveNodes_SetStylesForChild(FX_DWORD dwParentStyles, CXFA_ResolveNodesData &rnd) +{ + FX_DWORD dwSubStyles = XFA_RESOLVENODE_Children; + if (dwParentStyles & XFA_RESOLVENODE_TagName) { + dwSubStyles |= XFA_RESOLVENODE_TagName; + } + dwSubStyles &= ~XFA_RESOLVENODE_Parent; + dwSubStyles &= ~XFA_RESOLVENODE_Siblings; + dwSubStyles &= ~XFA_RESOLVENODE_Properties; + dwSubStyles |= XFA_RESOLVENODE_ALL; + rnd.m_dwStyles = dwSubStyles; +} +FX_INT32 CXFA_ResolveProcessor::XFA_ResolveNode_SetResultCreateNode(XFA_RESOLVENODE_RS& resolveNodeRS, CFX_WideString &wsLastCondition) +{ + if(m_pNodeHelper->m_pCreateParent) { + resolveNodeRS.nodes.Add(m_pNodeHelper->m_pCreateParent); + } else { + m_pNodeHelper->XFA_CreateNode_ForCondition(wsLastCondition); + } + resolveNodeRS.dwFlags = m_pNodeHelper->m_iCreateFlag; + if(resolveNodeRS.dwFlags == XFA_RESOLVENODE_RSTYPE_CreateNodeOne) { + if(m_pNodeHelper->m_iCurAllStart != -1) { + resolveNodeRS.dwFlags = XFA_RESOLVENODE_RSTYPE_CreateNodeMidAll; + } + } + return resolveNodeRS.nodes.GetSize(); +} +void CXFA_ResolveProcessor::XFA_ResolveNode_SetIndexDataBind(CFX_WideString &wsNextCondition, FX_INT32 &iIndex, FX_INT32 iCount) +{ + if(m_pNodeHelper->XFA_CreateNode_ForCondition(wsNextCondition)) { + if(m_pNodeHelper->m_eLastCreateType == XFA_ELEMENT_DataGroup) { + iIndex = 0; + } else { + iIndex = iCount - 1; + } + } else { + iIndex = iCount - 1; + } +} diff --git a/xfa/src/fxfa/src/parser/xfa_script_resolveprocessor.h b/xfa/src/fxfa/src/parser/xfa_script_resolveprocessor.h new file mode 100644 index 0000000000..08fe52ddca --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_script_resolveprocessor.h @@ -0,0 +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 + +#ifndef _XFA_RESOLVEPROCESSOR_H_ +#define _XFA_RESOLVEPROCESSOR_H_ +class CXFA_NodeHelper; +class CXFA_ScriptContext; +class CXFA_ResolveNodesData : public CFX_Object +{ +public: + CXFA_ResolveNodesData(CXFA_ScriptContext *pSC = NULL) + : m_pSC(pSC) + , m_CurNode(NULL) + , m_wsName() + , m_uHashName(0) + , m_wsCondition() + , m_nLevel(0) + , m_Nodes() + , m_dwStyles(XFA_RESOLVENODE_Children) + , m_pScriptAttribute(NULL) + , m_dwFlag(XFA_RESOVENODE_RSTYPE_Nodes) + { + } + ~CXFA_ResolveNodesData() + { + m_Nodes.RemoveAll(); + } + CXFA_ScriptContext* m_pSC; + CXFA_Object* m_CurNode; + CFX_WideString m_wsName; + FX_UINT32 m_uHashName; + CFX_WideString m_wsCondition; + FX_INT32 m_nLevel; + CXFA_ObjArray m_Nodes; + FX_DWORD m_dwStyles; + XFA_LPCSCRIPTATTRIBUTEINFO m_pScriptAttribute; + XFA_RESOVENODE_RSTYPE m_dwFlag; +}; +class CXFA_ResolveProcessor : public CFX_Object +{ +public: + CXFA_ResolveProcessor(void); + ~CXFA_ResolveProcessor(void); + FX_INT32 XFA_ResolveNodes(CXFA_ResolveNodesData &rnd); + FX_INT32 XFA_ResolveNodes_AnyChild(CXFA_ResolveNodesData &rnd); + FX_INT32 XFA_ResolveNodes_Dollar(CXFA_ResolveNodesData &rnd); + FX_INT32 XFA_ResolveNodes_Excalmatory(CXFA_ResolveNodesData &rnd); + FX_INT32 XFA_ResolveNodes_NumberSign(CXFA_ResolveNodesData &rnd); + FX_INT32 XFA_ResolveNodes_Asterisk(CXFA_ResolveNodesData &rnd); + FX_INT32 XFA_ResolveNodes_Normal(CXFA_ResolveNodesData &rnd); + FX_INT32 XFA_ResolveNodes_ForAttributeRs(CXFA_Object* curNode, CXFA_ResolveNodesData &rnd, FX_WSTR strAttr); + void XFA_ResolveNode_ConditionArray(FX_INT32 iCurIndex, CFX_WideString wsCondition, FX_INT32 iFoundCount, CXFA_ResolveNodesData &rnd); + void XFA_ResolveNode_DoPredicateFilter(FX_INT32 iCurIndex, CFX_WideString wsCondition, FX_INT32 iFoundCount, CXFA_ResolveNodesData &rnd); + FX_INT32 XFA_ResolveNodes_GetFilter(FX_WSTR wsExpression, FX_INT32 nStart, CXFA_ResolveNodesData &rnd); + void XFA_ResolveNode_FilterCondition(CXFA_ResolveNodesData &rnd, CFX_WideString wsCondition); + FX_INT32 XFA_ResolveNodes_PopStack(CFX_Int32Array &stack); + void XFA_ResolveNodes_SetStylesForChild(FX_DWORD dwParentStyles, CXFA_ResolveNodesData &rnd); + FX_INT32 XFA_ResolveNode_SetResultCreateNode(XFA_RESOLVENODE_RS& resolveNodeRS, CFX_WideString &wsLastCondition); + void XFA_ResolveNode_SetIndexDataBind(CFX_WideString &wsNextCondition, FX_INT32 &iIndex, FX_INT32 iCount); + CXFA_NodeHelper* GetNodeHelper() + { + return m_pNodeHelper; + } +private: + CXFA_NodeHelper* m_pNodeHelper; +public: + FX_INT32 m_iCurStart; +}; +#endif diff --git a/xfa/src/fxfa/src/parser/xfa_script_signaturepseudomodel.cpp b/xfa/src/fxfa/src/parser/xfa_script_signaturepseudomodel.cpp new file mode 100644 index 0000000000..69b9de1a64 --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_script_signaturepseudomodel.cpp @@ -0,0 +1,122 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_utils.h" +#include "../common/xfa_object.h" +#include "../common/xfa_document.h" +#include "../common/xfa_parser.h" +#include "../common/xfa_script.h" +#include "../common/xfa_docdata.h" +#include "../common/xfa_doclayout.h" +#include "../common/xfa_debug.h" +#include "../common/xfa_localemgr.h" +#include "../common/xfa_fm2jsapi.h" +#include "xfa_debug_parser.h" +#include "xfa_script_signaturepseudomodel.h" +CScript_SignaturePseudoModel::CScript_SignaturePseudoModel(CXFA_Document* pDocument) + : CXFA_OrdinaryObject(pDocument, XFA_ELEMENT_SignaturePseudoModel) +{ + m_uScriptHash = XFA_HASHCODE_Signature; +} +CScript_SignaturePseudoModel::~CScript_SignaturePseudoModel() +{ +} +void CScript_SignaturePseudoModel::Script_SignaturePseudoModel_Verify(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength < 1 || iLength > 4) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"verify")); + return; + } + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + XFA_HDOC hDoc = pNotify->GetHDOC(); + CXFA_Node* pNode = NULL; + if (iLength >= 1) { + pNode = (CXFA_Node*)pArguments->GetObject(0); + } + FX_INT32 bVerify = pNotify->GetDocProvider()->Verify(hDoc, pNode); + FXJSE_HVALUE hValue = pArguments->GetReturnValue(); + if (hValue) { + FXJSE_Value_SetInteger(hValue, bVerify); + } +} +void CScript_SignaturePseudoModel::Script_SignaturePseudoModel_Sign(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength < 3 || iLength > 7) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"sign")); + return; + } + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + XFA_HDOC hDoc = pNotify->GetHDOC(); + CXFA_NodeList* pNodeList = NULL; + CFX_WideString wsExpression; + CFX_WideString wsXMLIdent; + if (iLength >= 1) { + pNodeList = (CXFA_NodeList*)pArguments->GetObject(0); + } + if (iLength >= 2) { + CFX_ByteString bsExpression = pArguments->GetUTF8String(1); + wsExpression = CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength()); + } + if (iLength >= 3) { + CFX_ByteString bsXMLIdent = pArguments->GetUTF8String(2); + wsXMLIdent = CFX_WideString::FromUTF8(bsXMLIdent, bsXMLIdent.GetLength()); + } + FX_BOOL bSign = pNotify->GetDocProvider()->Sign(hDoc, pNodeList, wsExpression, wsXMLIdent); + FXJSE_HVALUE hValue = pArguments->GetReturnValue(); + if (hValue) { + FXJSE_Value_SetBoolean(hValue, bSign); + } +} +void CScript_SignaturePseudoModel::Script_SignaturePseudoModel_Enumerate(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength != 0) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"enumerate")); + return; + } + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + XFA_HDOC hDoc = pNotify->GetHDOC(); + CXFA_NodeList *pList = pNotify->GetDocProvider()->Enumerate(hDoc); + FXJSE_Value_Set(pArguments->GetReturnValue(), m_pDocument->GetScriptContext()->GetJSValueFromMap(pList)); +} +void CScript_SignaturePseudoModel::Script_SignaturePseudoModel_Clear(CFXJSE_Arguments* pArguments) +{ + FX_INT32 iLength = pArguments->GetLength(); + if (iLength < 1 || iLength > 2) { + ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"clear")); + return; + } + IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); + if (!pNotify) { + return; + } + XFA_HDOC hDoc = pNotify->GetHDOC(); + CXFA_Node* pNode = NULL; + FX_BOOL bClear = TRUE; + if (iLength >= 1) { + pNode = (CXFA_Node*)pArguments->GetObject(0); + } + if (iLength >= 2) { + bClear = pArguments->GetInt32(1) == 0 ? FALSE : TRUE; + } + FX_BOOL bFlag = pNotify->GetDocProvider()->Clear(hDoc, pNode, bClear); + FXJSE_HVALUE hValue = pArguments->GetReturnValue(); + if (hValue) { + FXJSE_Value_SetBoolean(hValue, bFlag); + } +} diff --git a/xfa/src/fxfa/src/parser/xfa_script_signaturepseudomodel.h b/xfa/src/fxfa/src/parser/xfa_script_signaturepseudomodel.h new file mode 100644 index 0000000000..d389820ce7 --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_script_signaturepseudomodel.h @@ -0,0 +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 _SCRIPT_SIGNATUREPSEUDOMODEL_H_ +#define _SCRIPT_SIGNATUREPSEUDOMODEL_H_ +class CScript_SignaturePseudoModel : public CXFA_OrdinaryObject +{ +public: + CScript_SignaturePseudoModel(CXFA_Document* pDocument); + ~CScript_SignaturePseudoModel(); + void Script_SignaturePseudoModel_Verify(CFXJSE_Arguments* pArguments); + void Script_SignaturePseudoModel_Sign(CFXJSE_Arguments* pArguments); + void Script_SignaturePseudoModel_Enumerate(CFXJSE_Arguments* pArguments); + void Script_SignaturePseudoModel_Clear(CFXJSE_Arguments* pArguments); +}; +#endif diff --git a/xfa/src/fxfa/src/parser/xfa_utils_imp.cpp b/xfa/src/fxfa/src/parser/xfa_utils_imp.cpp new file mode 100644 index 0000000000..9c7ca9c274 --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_utils_imp.cpp @@ -0,0 +1,382 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../../foxitlib.h" +#include "../common/xfa_utils.h" +#include "../common/xfa_object.h" +#include "../common/xfa_document.h" +#include "../common/xfa_parser.h" +#include "../common/xfa_script.h" +#include "../common/xfa_docdata.h" +#include "../common/xfa_doclayout.h" +#include "../common/xfa_debug.h" +#include "../common/xfa_localemgr.h" +#include "../common/xfa_fm2jsapi.h" +#include "xfa_debug_parser.h" +CXFA_Node* XFA_CreateUIChild(CXFA_Node* pNode, XFA_ELEMENT& eWidgetType) +{ + XFA_ELEMENT eType = pNode->GetClassID(); + eWidgetType = eType; + if (eType != XFA_ELEMENT_Field && eType != XFA_ELEMENT_Draw) { + return NULL; + } + eWidgetType = XFA_ELEMENT_UNKNOWN; + XFA_ELEMENT eUIType = XFA_ELEMENT_UNKNOWN; + CXFA_Value defValue = pNode->GetProperty(0, XFA_ELEMENT_Value, TRUE); + XFA_ELEMENT eValueType = (XFA_ELEMENT)defValue.GetChildValueClassID(); + switch (eValueType) { + case XFA_ELEMENT_Boolean: + eUIType = XFA_ELEMENT_CheckButton; + break; + case XFA_ELEMENT_Integer: + case XFA_ELEMENT_Decimal: + case XFA_ELEMENT_Float: + eUIType = XFA_ELEMENT_NumericEdit; + break; + case XFA_ELEMENT_ExData: + case XFA_ELEMENT_Text: + eUIType = XFA_ELEMENT_TextEdit; + eWidgetType = XFA_ELEMENT_Text; + break; + case XFA_ELEMENT_Date: + case XFA_ELEMENT_Time: + case XFA_ELEMENT_DateTime: + eUIType = XFA_ELEMENT_DateTimeEdit; + break; + case XFA_ELEMENT_Image: + eUIType = XFA_ELEMENT_ImageEdit; + eWidgetType = XFA_ELEMENT_Image; + break;; + case XFA_ELEMENT_Arc: + case XFA_ELEMENT_Line: + case XFA_ELEMENT_Rectangle: + eUIType = XFA_ELEMENT_DefaultUi; + eWidgetType = eValueType; + break; + default: + break; + } + CXFA_Node* pUIChild = NULL; + CXFA_Node* pUI = pNode->GetProperty(0, XFA_ELEMENT_Ui, TRUE); + CXFA_Node *pChild = pUI->GetNodeItem(XFA_NODEITEM_FirstChild); + for ( ; pChild; pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { + XFA_ELEMENT eChild = pChild->GetClassID(); + if (eChild == XFA_ELEMENT_Extras || eChild == XFA_ELEMENT_Picture) { + continue; + } + XFA_LPCPROPERTY pProterty = XFA_GetPropertyOfElement(XFA_ELEMENT_Ui, eChild, XFA_XDPPACKET_Form); + if (pProterty && (pProterty->uFlags & XFA_PROPERTYFLAG_OneOf)) { + pUIChild = pChild; + break; + } + } + if(eType == XFA_ELEMENT_Draw) { + XFA_ELEMENT eDraw = pUIChild ? pUIChild->GetClassID() : XFA_ELEMENT_UNKNOWN; + switch (eDraw) { + case XFA_ELEMENT_TextEdit: + eWidgetType = XFA_ELEMENT_Text; + break; + case XFA_ELEMENT_ImageEdit: + eWidgetType = XFA_ELEMENT_Image; + break; + default: + eWidgetType = eWidgetType == XFA_ELEMENT_UNKNOWN ? XFA_ELEMENT_Text : eWidgetType; + break; + } + } else { + if (pUIChild && pUIChild->GetClassID() == XFA_ELEMENT_DefaultUi) { + eWidgetType = XFA_ELEMENT_TextEdit; + } else { + eWidgetType = pUIChild ? pUIChild->GetClassID() : (eUIType == XFA_ELEMENT_UNKNOWN ? XFA_ELEMENT_TextEdit : eUIType); + } + } + if (!pUIChild) { + if (eUIType == XFA_ELEMENT_UNKNOWN) { + eUIType = XFA_ELEMENT_TextEdit; + ((CXFA_Node*)defValue)->GetProperty(0, XFA_ELEMENT_Text, TRUE); + } + pUIChild = pUI->GetProperty(0, eUIType, TRUE); + } else if (eUIType == XFA_ELEMENT_UNKNOWN) { + switch (pUIChild->GetClassID()) { + case XFA_ELEMENT_CheckButton: { + eValueType = XFA_ELEMENT_Text; + if (CXFA_Node* pItems = pNode->GetChild(0, XFA_ELEMENT_Items)) { + if (CXFA_Node* pItem = pItems->GetChild(0, XFA_ELEMENT_UNKNOWN)) { + eValueType = pItem->GetClassID(); + } + } + } + break; + case XFA_ELEMENT_DateTimeEdit: + eValueType = XFA_ELEMENT_DateTime; + break; + case XFA_ELEMENT_ImageEdit: + eValueType = XFA_ELEMENT_Image; + break; + case XFA_ELEMENT_NumericEdit: + eValueType = XFA_ELEMENT_Float; + break; + case XFA_ELEMENT_ChoiceList: { + eValueType = (pUIChild->GetEnum(XFA_ATTRIBUTE_Open) == XFA_ATTRIBUTEENUM_MultiSelect) ? XFA_ELEMENT_ExData : XFA_ELEMENT_Text; + } + break; + case XFA_ELEMENT_Barcode: + case XFA_ELEMENT_Button: + case XFA_ELEMENT_PasswordEdit: + case XFA_ELEMENT_Signature: + case XFA_ELEMENT_TextEdit: + default: + eValueType = XFA_ELEMENT_Text; + break; + } + ((CXFA_Node*)defValue)->GetProperty(0, eValueType, TRUE); + } + return pUIChild; +} +CXFA_LocaleValue XFA_GetLocaleValue(CXFA_WidgetData* pWidgetData) +{ + CXFA_Node* pNodeValue = pWidgetData->GetNode()->GetChild(0, XFA_ELEMENT_Value); + if (!pNodeValue) { + return CXFA_LocaleValue(); + } + CXFA_Node* pValueChild = pNodeValue->GetNodeItem(XFA_NODEITEM_FirstChild); + if (!pValueChild) { + return CXFA_LocaleValue(); + } + FX_INT32 iVTType = XFA_VT_NULL; + XFA_ELEMENT eType = pValueChild->GetClassID(); + switch (eType) { + case XFA_ELEMENT_Decimal: + iVTType = XFA_VT_DECIMAL; + break; + case XFA_ELEMENT_Float: + iVTType = XFA_VT_FLOAT; + break; + case XFA_ELEMENT_Date: + iVTType = XFA_VT_DATE; + break; + case XFA_ELEMENT_Time: + iVTType = XFA_VT_TIME; + break; + case XFA_ELEMENT_DateTime: + iVTType = XFA_VT_DATETIME; + break; + case XFA_ELEMENT_Boolean: + iVTType = XFA_VT_BOOLEAN; + break; + case XFA_ELEMENT_Integer: + iVTType = XFA_VT_INTEGER; + break; + case XFA_ELEMENT_Text: + iVTType = XFA_VT_TEXT; + break; + default: + iVTType = XFA_VT_NULL; + break; + } + return CXFA_LocaleValue(iVTType, pWidgetData->GetRawValue(), pWidgetData->GetNode()->GetDocument()->GetLocalMgr()); +} +void XFA_GetPlainTextFromRichText(IFDE_XMLNode *pXMLNode, CFX_WideString &wsPlainText) +{ + if (pXMLNode == NULL) { + return; + } + switch(pXMLNode->GetType()) { + case FDE_XMLNODE_Element: { + IFDE_XMLElement *pXMLElement = (IFDE_XMLElement*)pXMLNode; + CFX_WideString wsTag; + pXMLElement->GetLocalTagName(wsTag); + FX_UINT32 uTag = FX_HashCode_String_GetW(wsTag, wsTag.GetLength(), TRUE); + if (uTag == 0x0001f714) { + wsPlainText += L"\n"; + } else if (uTag == 0x00000070) { + if (!wsPlainText.IsEmpty()) { + wsPlainText += L"\n"; + } + } else if (uTag == 0xa48ac63) { + if (!wsPlainText.IsEmpty() && wsPlainText[wsPlainText.GetLength() - 1] != '\n') { + wsPlainText += L"\n"; + } + } + } + break; + case FDE_XMLNODE_Text: { + CFX_WideString wsContent; + ((IFDE_XMLText*)pXMLNode)->GetText(wsContent); + wsPlainText += wsContent; + } + break; + case FDE_XMLNODE_CharData: { + CFX_WideString wsCharData; + ((IFDE_XMLCharData*)pXMLNode)->GetCharData(wsCharData); + wsPlainText += wsCharData; + } + break; + default: + break; + } + for (IFDE_XMLNode *pChildXML = pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild); pChildXML; pChildXML = pChildXML->GetNodeItem(IFDE_XMLNode::NextSibling)) { + XFA_GetPlainTextFromRichText(pChildXML, wsPlainText); + } +} +FX_BOOL XFA_FieldIsMultiListBox(CXFA_Node* pFieldNode) +{ + FX_BOOL bRet = FALSE; + if (!pFieldNode) { + return bRet; + } + CXFA_Node *pUIChild = pFieldNode->GetChild(0, XFA_ELEMENT_Ui); + if (pUIChild) { + CXFA_Node *pFirstChild = pUIChild->GetNodeItem(XFA_NODEITEM_FirstChild); + if (pFirstChild && pFirstChild->GetClassID() == XFA_ELEMENT_ChoiceList) { + bRet = pFirstChild->GetEnum(XFA_ATTRIBUTE_Open) == XFA_ATTRIBUTEENUM_MultiSelect; + } + } + return bRet; +} +FX_BOOL XFA_IsLayoutElement(XFA_ELEMENT eElement, FX_BOOL bLayoutContainer ) +{ + switch (eElement) { + case XFA_ELEMENT_Draw: + case XFA_ELEMENT_Field: + case XFA_ELEMENT_InstanceManager: + return !bLayoutContainer; + case XFA_ELEMENT_Area: + case XFA_ELEMENT_Subform: + case XFA_ELEMENT_ExclGroup: + case XFA_ELEMENT_SubformSet: + return TRUE; + case XFA_ELEMENT_PageArea: + case XFA_ELEMENT_Form: + return TRUE; + default: + return FALSE; + } + return FALSE; +} +FX_BOOL XFA_IsTakingupSpace(XFA_ATTRIBUTEENUM ePresence) +{ + switch (ePresence) { + case XFA_ATTRIBUTEENUM_Visible: + case XFA_ATTRIBUTEENUM_Invisible: + return TRUE; + default: + return FALSE; + } + return FALSE; +} +FX_BOOL XFA_IsFlowingLayout(XFA_ATTRIBUTEENUM eLayout) +{ + switch (eLayout) { + case XFA_ATTRIBUTEENUM_Tb: + case XFA_ATTRIBUTEENUM_Lr_tb: + case XFA_ATTRIBUTEENUM_Rl_tb: + return TRUE; + default: + return FALSE; + } + return FALSE; +} +FX_BOOL XFA_IsHorizontalFlow(XFA_ATTRIBUTEENUM eLayout) +{ + switch (eLayout) { + case XFA_ATTRIBUTEENUM_Lr_tb: + case XFA_ATTRIBUTEENUM_Rl_tb: + return TRUE; + default: + return FALSE; + } + return FALSE; +} +static const FX_DOUBLE fraction_scales[] = {0.1, 0.01, 0.001, 0.0001, 0.00001, 0.000001, + 0.0000001, 0.00000001, 0.000000001, 0.0000000001, 0.00000000001, 0.000000000001, + 0.0000000000001, 0.00000000000001, 0.000000000000001, 0.0000000000000001 + }; +FX_DOUBLE XFA_WideStringToDouble(const CFX_WideString &wsStringVal) +{ + CFX_WideString wsValue = wsStringVal; + wsValue.TrimLeft(); + wsValue.TrimRight(); + FX_BOOL bValid = TRUE; + FX_INT64 nIntegral = 0; + FX_DWORD dwFractional = 0; + FX_INT32 nExponent = 0; + FX_INT32 cc = 0; + FX_BOOL bNegative = FALSE, bExpSign = FALSE; + FX_LPCWSTR str = (FX_LPCWSTR)wsValue; + FX_INT32 len = wsValue.GetLength(); + if (str[0] == '+') { + cc++; + } else if (str[0] == '-') { + bNegative = TRUE; + cc++; + } + FX_INT32 nIntegralLen = 0; + while (cc < len) { + if (str[cc] == '.' || str[cc] == 'E' || str[cc] == 'e' || nIntegralLen > 17) { + break; + } + if (!XFA_IsDigit(str[cc])) { + return 0; + } + nIntegral = nIntegral * 10 + str[cc] - '0'; + cc ++; + nIntegralLen++; + } + nIntegral = bNegative ? -nIntegral : nIntegral; + FX_INT32 scale = 0; + FX_DOUBLE fraction = 0.0; + if (cc < len && str[cc] == '.') { + cc ++; + while (cc < len) { + fraction += fraction_scales[scale] * (str[cc] - '0'); + scale ++; + cc ++; + if (cc == len) { + break; + } + if (scale == sizeof (fraction_scales) / sizeof(FX_DOUBLE) + || str[cc] == 'E' + || str[cc] == 'e') { + break; + } + if (!XFA_IsDigit(str[cc])) { + return 0; + } + } + dwFractional = (FX_DWORD)(fraction * 4294967296.0); + } + if (cc < len && (str[cc] == 'E' || str[cc] == 'e')) { + cc ++; + if (cc < len) { + if (str[cc] == '+') { + cc++; + } else if (str[cc] == '-') { + bExpSign = TRUE; + cc++; + } + } + while (cc < len) { + if (str[cc] == '.' || !XFA_IsDigit(str[cc])) { + return 0; + } + nExponent = nExponent * 10 + str[cc] - '0'; + cc ++; + } + nExponent = bExpSign ? -nExponent : nExponent; + } + FX_DOUBLE dValue = (dwFractional / 4294967296.0); + dValue = nIntegral + (nIntegral >= 0 ? dValue : -dValue); + if (nExponent != 0) { + dValue *= FXSYS_pow(10, (FX_FLOAT)nExponent); + } + return dValue; +} +FX_DOUBLE XFA_ByteStringToDouble(FX_BSTR szStringVal) +{ + CFX_WideString wsValue = CFX_WideString::FromUTF8(szStringVal.GetCStr(), szStringVal.GetLength()); + return XFA_WideStringToDouble(wsValue); +} diff --git a/xfa/src/fxgraphics/src/fx_graphics.cpp b/xfa/src/fxgraphics/src/fx_graphics.cpp new file mode 100644 index 0000000000..340d46dfa9 --- /dev/null +++ b/xfa/src/fxgraphics/src/fx_graphics.cpp @@ -0,0 +1,1670 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "pre.h" +#include "fx_path_generator.h" +class CAGG_Graphics : public CFX_Object +{ +public: + CAGG_Graphics(); + FX_ERR Create(CFX_Graphics * owner, + FX_INT32 width, + FX_INT32 height, + FXDIB_Format format); + virtual ~CAGG_Graphics(); +private: + CFX_Graphics * _owner; +}; +CFX_Graphics::CFX_Graphics() +{ + _type = FX_CONTEXT_None; + _info._graphState.SetDashCount(0); + _info._isAntialiasing = TRUE; + _info._strokeAlignment = FX_STROKEALIGNMENT_Center; + _info._CTM.Reset(); + _info._isActOnDash = FALSE; + _info._strokeColor = NULL; + _info._fillColor = NULL; + _info._font = NULL; + _info._fontSize = 40.0; + _info._fontHScale = 1.0; + _info._fontSpacing = 0.0; + _renderDevice = NULL; + _aggGraphics = NULL; +} +FX_ERR CFX_Graphics::Create(CFX_RenderDevice * renderDevice, + FX_BOOL isAntialiasing ) +{ + _FX_RETURN_VALUE_IF_FAIL(renderDevice, FX_ERR_Parameter_Invalid); + if (_type != FX_CONTEXT_None) { + return FX_ERR_Property_Invalid; + } + _type = FX_CONTEXT_Device; + _info._isAntialiasing = isAntialiasing; + _renderDevice = renderDevice; + if (_renderDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_SOFT_CLIP) { + return FX_ERR_Succeeded; + } + return FX_ERR_Indefinite; +} +FX_ERR CFX_Graphics::Create(FX_INT32 width, + FX_INT32 height, + FXDIB_Format format, + FX_BOOL isNative , + FX_BOOL isAntialiasing ) +{ + if (_type != FX_CONTEXT_None) { + return FX_ERR_Property_Invalid; + } + _type = FX_CONTEXT_Device; + _info._isAntialiasing = isAntialiasing; + { + _aggGraphics = FX_NEW CAGG_Graphics; + return _aggGraphics->Create(this, width, height, format); + } +} +CFX_Graphics::~CFX_Graphics() +{ + if (_aggGraphics) { + delete _aggGraphics; + _aggGraphics = NULL; + } + _renderDevice = NULL; + _info._graphState.SetDashCount(0); + _type = FX_CONTEXT_None; +} +FX_ERR CFX_Graphics::GetDeviceCap(const FX_INT32 capID, FX_DeviceCap & capVal) +{ + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + capVal = _renderDevice->GetDeviceCaps(capID); + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::IsPrinterDevice(FX_BOOL & isPrinter) +{ + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + FX_INT32 deviceClass = _renderDevice->GetDeviceClass(); + if (deviceClass == FXDC_PRINTER) { + isPrinter = TRUE; + } else { + isPrinter = FALSE; + } + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::EnableAntialiasing(FX_BOOL isAntialiasing) +{ + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + _info._isAntialiasing = isAntialiasing; + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::SaveGraphState() +{ + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + _renderDevice->SaveState(); + TInfo * info = FX_NEW TInfo; + info->_graphState.Copy(_info._graphState); + info->_isAntialiasing = _info._isAntialiasing; + info->_strokeAlignment = _info._strokeAlignment; + info->_CTM = _info._CTM; + info->_isActOnDash = _info._isActOnDash; + info->_strokeColor = _info._strokeColor; + info->_fillColor = _info._fillColor; + info->_font = _info._font; + info->_fontSize = _info._fontSize; + info->_fontHScale = _info._fontHScale; + info->_fontSpacing = _info._fontSpacing; + _infoStack.Add(info); + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::RestoreGraphState() +{ + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + _renderDevice->RestoreState(); + FX_INT32 size = _infoStack.GetSize(); + if (size <= 0) { + return FX_ERR_Intermediate_Value_Invalid; + } + FX_INT32 topIndex = size - 1; + TInfo * info = (TInfo *) _infoStack.GetAt(topIndex); + _FX_RETURN_VALUE_IF_FAIL(info, FX_ERR_Intermediate_Value_Invalid); + _info._graphState.Copy(info->_graphState); + _info._isAntialiasing = info->_isAntialiasing; + _info._strokeAlignment = info->_strokeAlignment; + _info._CTM = info->_CTM; + _info._isActOnDash = info->_isActOnDash; + _info._strokeColor = info->_strokeColor; + _info._fillColor = info->_fillColor; + _info._font = info->_font; + _info._fontSize = info->_fontSize; + _info._fontHScale = info->_fontHScale; + _info._fontSpacing = info->_fontSpacing; + delete info; + info = NULL; + _infoStack.RemoveAt(topIndex); + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::GetLineCap(CFX_GraphStateData::LineCap & lineCap) +{ + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + lineCap = _info._graphState.m_LineCap; + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::SetLineCap(CFX_GraphStateData::LineCap lineCap) +{ + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + _info._graphState.m_LineCap = lineCap; + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::GetDashCount(FX_INT32 & dashCount) +{ + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + dashCount = _info._graphState.m_DashCount; + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::GetLineDash(FX_FLOAT & dashPhase, FX_FLOAT * dashArray) +{ + _FX_RETURN_VALUE_IF_FAIL(dashArray, FX_ERR_Parameter_Invalid); + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + dashPhase = _info._graphState.m_DashPhase; + FXSYS_memcpy(dashArray, + _info._graphState.m_DashArray, + _info._graphState.m_DashCount * sizeof (FX_FLOAT)); + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::SetLineDash(FX_FLOAT dashPhase, + FX_FLOAT * dashArray, + FX_INT32 dashCount) +{ + if (dashCount > 0 && !dashArray) { + return FX_ERR_Parameter_Invalid; + } + dashCount = dashCount < 0 ? 0 : dashCount; + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + FX_FLOAT scale = 1.0; + if (_info._isActOnDash) { + scale = _info._graphState.m_LineWidth; + } + _info._graphState.m_DashPhase = dashPhase; + _info._graphState.SetDashCount(dashCount); + for (FX_INT32 i = 0; i < dashCount; i++) { + _info._graphState.m_DashArray[i] = dashArray[i] * scale; + } + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::SetLineDash(FX_DashStyle dashStyle) +{ + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + return RenderDeviceSetLineDash(dashStyle); + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::GetLineJoin(CFX_GraphStateData::LineJoin & lineJoin) +{ + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + lineJoin = _info._graphState.m_LineJoin; + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::SetLineJoin(CFX_GraphStateData::LineJoin lineJoin) +{ + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + _info._graphState.m_LineJoin = lineJoin; + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::GetMiterLimit(FX_FLOAT & miterLimit) +{ + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + miterLimit = _info._graphState.m_MiterLimit; + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::SetMiterLimit(FX_FLOAT miterLimit) +{ + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + _info._graphState.m_MiterLimit = miterLimit; + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::GetLineWidth(FX_FLOAT & lineWidth) +{ + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + lineWidth = _info._graphState.m_LineWidth; + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::SetLineWidth(FX_FLOAT lineWidth, FX_BOOL isActOnDash ) +{ + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + _info._graphState.m_LineWidth = lineWidth; + _info._isActOnDash = isActOnDash; + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::GetStrokeAlignment(FX_StrokeAlignment & strokeAlignment) +{ + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + strokeAlignment = _info._strokeAlignment; + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::SetStrokeAlignment(FX_StrokeAlignment strokeAlignment) +{ + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + _info._strokeAlignment = strokeAlignment; + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::SetStrokeColor(CFX_Color * color) +{ + _FX_RETURN_VALUE_IF_FAIL(color, FX_ERR_Parameter_Invalid); + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + _info._strokeColor = color; + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::SetFillColor(CFX_Color * color) +{ + _FX_RETURN_VALUE_IF_FAIL(color, FX_ERR_Parameter_Invalid); + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + _info._fillColor = color; + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::StrokePath(CFX_Path * path, CFX_Matrix * matrix ) +{ + _FX_RETURN_VALUE_IF_FAIL(path, FX_ERR_Parameter_Invalid); + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + return RenderDeviceStrokePath(path, matrix); + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::FillPath(CFX_Path * path, + FX_FillMode fillMode , + CFX_Matrix * matrix ) +{ + _FX_RETURN_VALUE_IF_FAIL(path, FX_ERR_Parameter_Invalid); + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + return RenderDeviceFillPath(path, fillMode, matrix); + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::ClipPath(CFX_Path * path, + FX_FillMode fillMode , + CFX_Matrix * matrix ) +{ + _FX_RETURN_VALUE_IF_FAIL(path, FX_ERR_Parameter_Invalid); + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + FX_BOOL result = _renderDevice->SetClip_PathFill(path->GetPathData(), + (CFX_AffineMatrix *) matrix, + fillMode); + _FX_RETURN_VALUE_IF_FAIL(result, FX_ERR_Indefinite); + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::DrawImage(CFX_DIBSource * source, + const CFX_PointF & point, + CFX_Matrix * matrix ) +{ + _FX_RETURN_VALUE_IF_FAIL(source, FX_ERR_Parameter_Invalid); + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + return RenderDeviceDrawImage(source, point, matrix); + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::StretchImage(CFX_DIBSource * source, + const CFX_RectF & rect, + CFX_Matrix * matrix ) +{ + _FX_RETURN_VALUE_IF_FAIL(source, FX_ERR_Parameter_Invalid); + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + return RenderDeviceStretchImage(source, rect, matrix); + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::ConcatMatrix(CFX_Matrix * matrix) +{ + _FX_RETURN_VALUE_IF_FAIL(matrix, FX_ERR_Parameter_Invalid); + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + _info._CTM.Concat(*matrix); + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +CFX_Matrix * CFX_Graphics::GetMatrix() +{ + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, NULL); + return &_info._CTM; + } + default: { + return NULL; + } + } +} +FX_ERR CFX_Graphics::GetClipRect(CFX_RectF & rect) +{ + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + FX_RECT r = _renderDevice->GetClipBox(); + rect.left = (FX_FLOAT) r.left; + rect.top = (FX_FLOAT) r.top; + rect.width = (FX_FLOAT) r.Width(); + rect.height = (FX_FLOAT) r.Height(); + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::SetClipRect(const CFX_RectF & rect) +{ + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + FX_RECT r(FXSYS_round(rect.left), + FXSYS_round(rect.top), + FXSYS_round(rect.right()), + FXSYS_round(rect.bottom())); + FX_BOOL result = _renderDevice->SetClip_Rect(&r); + _FX_RETURN_VALUE_IF_FAIL(result, FX_ERR_Method_Not_Supported); + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::ClearClip() +{ + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + FX_BOOL result = FX_ERR_Succeeded; + _FX_RETURN_VALUE_IF_FAIL(result, FX_ERR_Method_Not_Supported); + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::SetFont(CFX_Font * font) +{ + _FX_RETURN_VALUE_IF_FAIL(font, FX_ERR_Parameter_Invalid); + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + _info._font = font; + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::SetFontSize(const FX_FLOAT size) +{ + FX_FLOAT fontSize = size <= 0 ? 1.0f : size; + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + _info._fontSize = fontSize; + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::SetFontHScale(const FX_FLOAT scale) +{ + FX_FLOAT fontHScale = scale <= 0 ? 1.0f : scale; + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + _info._fontHScale = fontHScale; + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::SetCharSpacing(const FX_FLOAT spacing) +{ + FX_FLOAT fontSpacing = spacing < 0 ? 0 : spacing; + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + _info._fontSpacing = fontSpacing; + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::SetTextDrawingMode(const FX_INT32 mode) +{ + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::ShowText(const CFX_PointF & point, + const CFX_WideString & text, + CFX_Matrix * matrix ) +{ + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + return RenderDeviceShowText(point, text, matrix); + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::CalcTextRect(CFX_RectF & rect, + const CFX_WideString & text, + FX_BOOL isMultiline , + CFX_Matrix * matrix ) +{ + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + FX_INT32 length = text.GetLength(); + FX_DWORD * charCodes = FX_Alloc(FX_DWORD, length); + FXTEXT_CHARPOS * charPos = FX_Alloc(FXTEXT_CHARPOS, + length * sizeof (FXTEXT_CHARPOS)); + CalcTextInfo(text, charCodes, charPos, rect); + FX_Free(charPos); + FX_Free(charCodes); + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::Transfer(CFX_Graphics * graphics, CFX_Matrix * matrix ) +{ + _FX_RETURN_VALUE_IF_FAIL(graphics, FX_ERR_Parameter_Invalid); + CFX_Matrix m; + m.Set(_info._CTM.a, _info._CTM.b, _info._CTM.c, _info._CTM.d, _info._CTM.e, _info._CTM.f); + if (matrix) { + m.Concat(*matrix); + } + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + { + _FX_RETURN_VALUE_IF_FAIL(graphics->_renderDevice, + FX_ERR_Parameter_Invalid); + CFX_DIBitmap * bitmap = graphics->_renderDevice->GetBitmap(); + FX_BOOL result = _renderDevice->SetDIBits(bitmap, 0, 0); + _FX_RETURN_VALUE_IF_FAIL(result, FX_ERR_Method_Not_Supported); + } + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::Transfer(CFX_Graphics * graphics, + FX_FLOAT srcLeft, + FX_FLOAT srcTop, + const CFX_RectF & dstRect, + CFX_Matrix * matrix ) +{ + _FX_RETURN_VALUE_IF_FAIL(graphics, FX_ERR_Parameter_Invalid); + CFX_Matrix m; + m.Set(_info._CTM.a, _info._CTM.b, _info._CTM.c, _info._CTM.d, _info._CTM.e, _info._CTM.f); + if (matrix) { + m.Concat(*matrix); + } + switch (_type) { + case FX_CONTEXT_Device: { + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + { + _FX_RETURN_VALUE_IF_FAIL(graphics->_renderDevice, + FX_ERR_Parameter_Invalid); + CFX_DIBitmap * bitmap = graphics->_renderDevice->GetBitmap(); + FX_BOOL result = FX_ERR_Indefinite; + CFX_DIBitmap bmp; + result = bmp.Create((FX_INT32) dstRect.width, + (FX_INT32) dstRect.height, + bitmap->GetFormat()); + _FX_RETURN_VALUE_IF_FAIL(result, FX_ERR_Intermediate_Value_Invalid); + result = graphics->_renderDevice->GetDIBits(&bmp, + (FX_INT32) srcLeft, + (FX_INT32) srcTop); + _FX_RETURN_VALUE_IF_FAIL(result, FX_ERR_Method_Not_Supported); + result = _renderDevice->SetDIBits(&bmp, + (FX_INT32) dstRect.left, + (FX_INT32) dstRect.top); + _FX_RETURN_VALUE_IF_FAIL(result, FX_ERR_Method_Not_Supported); + return FX_ERR_Succeeded; + } + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +CFX_RenderDevice * CFX_Graphics::GetRenderDevice() +{ + return _renderDevice; +} +FX_ERR CFX_Graphics::InverseRect(const CFX_RectF & rect) +{ + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + CFX_DIBitmap * bitmap = _renderDevice->GetBitmap(); + _FX_RETURN_VALUE_IF_FAIL(bitmap, FX_ERR_Property_Invalid); + CFX_RectF temp(rect); + _info._CTM.TransformRect(temp); + CFX_RectF r; + r.Set(0, 0, (FX_FLOAT)bitmap->GetWidth(), (FX_FLOAT)bitmap->GetWidth()); + r.Intersect(temp); + if (r.IsEmpty()) { + return FX_ERR_Parameter_Invalid; + } + FX_ARGB* pBuf = (FX_ARGB*)(bitmap->GetBuffer() + FX_INT32(r.top) * bitmap->GetPitch()); + FX_INT32 bottom = (FX_INT32)r.bottom(); + FX_INT32 right = (FX_INT32)r.right(); + for (FX_INT32 i = (FX_INT32)r.top; i < bottom; i ++) { + FX_ARGB* pLine = pBuf + (FX_INT32)r.left; + for (FX_INT32 j = (FX_INT32)r.left; j < right; j ++) { + FX_ARGB c = *pLine; + *pLine ++ = (c & 0xFF000000) | (0xFFFFFF - (c & 0x00FFFFFF)); + } + pBuf = (FX_ARGB*)((FX_LPBYTE)pBuf + bitmap->GetPitch()); + } + return FX_ERR_Succeeded; +} +FX_ERR CFX_Graphics::XorDIBitmap(const CFX_DIBitmap * srcBitmap, const CFX_RectF & rect) +{ + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + CFX_DIBitmap * dst = _renderDevice->GetBitmap(); + _FX_RETURN_VALUE_IF_FAIL(dst, FX_ERR_Property_Invalid); + CFX_RectF temp(rect); + _info._CTM.TransformRect(temp); + CFX_RectF r; + r.Set(0, 0, (FX_FLOAT)dst->GetWidth(), (FX_FLOAT)dst->GetWidth()); + r.Intersect(temp); + if (r.IsEmpty()) { + return FX_ERR_Parameter_Invalid; + } + FX_ARGB* pSrcBuf = (FX_ARGB*)(srcBitmap->GetBuffer() + FX_INT32(r.top) * srcBitmap->GetPitch()); + FX_ARGB* pDstBuf = (FX_ARGB*)(dst->GetBuffer() + FX_INT32(r.top) * dst->GetPitch()); + FX_INT32 bottom = (FX_INT32)r.bottom(); + FX_INT32 right = (FX_INT32)r.right(); + for (FX_INT32 i = (FX_INT32)r.top; i < bottom; i ++) { + FX_ARGB* pSrcLine = pSrcBuf + (FX_INT32)r.left; + FX_ARGB* pDstLine = pDstBuf + (FX_INT32)r.left; + for (FX_INT32 j = (FX_INT32)r.left; j < right; j ++) { + FX_ARGB c = *pDstLine; + *pDstLine ++ = ArgbEncode(FXARGB_A(c), (c & 0xFFFFFF) ^ (*pSrcLine & 0xFFFFFF)); + pSrcLine ++; + } + pSrcBuf = (FX_ARGB*)((FX_LPBYTE)pSrcBuf + srcBitmap->GetPitch()); + pDstBuf = (FX_ARGB*)((FX_LPBYTE)pDstBuf + dst->GetPitch()); + } + return FX_ERR_Succeeded; +} +FX_ERR CFX_Graphics::EqvDIBitmap(const CFX_DIBitmap * srcBitmap, const CFX_RectF & rect) +{ + _FX_RETURN_VALUE_IF_FAIL(_renderDevice, FX_ERR_Property_Invalid); + CFX_DIBitmap * dst = _renderDevice->GetBitmap(); + _FX_RETURN_VALUE_IF_FAIL(dst, FX_ERR_Property_Invalid); + CFX_RectF temp(rect); + _info._CTM.TransformRect(temp); + CFX_RectF r; + r.Set(0, 0, (FX_FLOAT)dst->GetWidth(), (FX_FLOAT)dst->GetWidth()); + r.Intersect(temp); + if (r.IsEmpty()) { + return FX_ERR_Parameter_Invalid; + } + FX_ARGB* pSrcBuf = (FX_ARGB*)(srcBitmap->GetBuffer() + FX_INT32(r.top) * srcBitmap->GetPitch()); + FX_ARGB* pDstBuf = (FX_ARGB*)(dst->GetBuffer() + FX_INT32(r.top) * dst->GetPitch()); + FX_INT32 bottom = (FX_INT32)r.bottom(); + FX_INT32 right = (FX_INT32)r.right(); + for (FX_INT32 i = (FX_INT32)r.top; i < bottom; i ++) { + FX_ARGB* pSrcLine = pSrcBuf + (FX_INT32)r.left; + FX_ARGB* pDstLine = pDstBuf + (FX_INT32)r.left; + for (FX_INT32 j = (FX_INT32)r.left; j < right; j ++) { + FX_ARGB c = *pDstLine; + *pDstLine ++ = ArgbEncode(FXARGB_A(c), ~((c & 0xFFFFFF) ^ (*pSrcLine & 0xFFFFFF))); + pSrcLine ++; + } + pSrcBuf = (FX_ARGB*)((FX_LPBYTE)pSrcBuf + srcBitmap->GetPitch()); + pDstBuf = (FX_ARGB*)((FX_LPBYTE)pDstBuf + dst->GetPitch()); + } + return FX_ERR_Succeeded; +} +FX_ERR CFX_Graphics::RenderDeviceSetLineDash(FX_DashStyle dashStyle) +{ + switch (dashStyle) { + case FX_DASHSTYLE_Solid: { + _info._graphState.SetDashCount(0); + return FX_ERR_Succeeded; + } + case FX_DASHSTYLE_Dash: { + FX_FLOAT dashArray[] = {3, 1}; + SetLineDash(0, dashArray, 2); + return FX_ERR_Succeeded; + } + case FX_DASHSTYLE_Dot: { + FX_FLOAT dashArray[] = {1, 1}; + SetLineDash(0, dashArray, 2); + return FX_ERR_Succeeded; + } + case FX_DASHSTYLE_DashDot: { + FX_FLOAT dashArray[] = {3, 1, 1, 1}; + SetLineDash(0, dashArray, 4); + return FX_ERR_Succeeded; + } + case FX_DASHSTYLE_DashDotDot: { + FX_FLOAT dashArray[] = {4, 1, 2, 1, 2, 1}; + SetLineDash(0, dashArray, 6); + return FX_ERR_Succeeded; + } + default: { + return FX_ERR_Parameter_Invalid; + } + } +} +FX_ERR CFX_Graphics::RenderDeviceStrokePath(CFX_Path * path, CFX_Matrix * matrix) +{ + _FX_RETURN_VALUE_IF_FAIL(_info._strokeColor, FX_ERR_Property_Invalid); + CFX_Matrix m; + m.Set(_info._CTM.a, _info._CTM.b, _info._CTM.c, _info._CTM.d, _info._CTM.e, _info._CTM.f); + if (matrix) { + m.Concat(*matrix); + } + switch (_info._strokeColor->_type) { + case FX_COLOR_Solid: { + FX_BOOL result = _renderDevice->DrawPath(path->GetPathData(), + (CFX_AffineMatrix *) &m, + &_info._graphState, + 0x0, + _info._strokeColor->_argb, + 0); + _FX_RETURN_VALUE_IF_FAIL(result, FX_ERR_Indefinite); + return FX_ERR_Succeeded; + } + case FX_COLOR_Pattern: { + return StrokePathWithPattern(path, &m); + } + case FX_COLOR_Shading: { + return StrokePathWithShading(path, &m); + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::RenderDeviceFillPath(CFX_Path * path, + FX_FillMode fillMode, + CFX_Matrix * matrix) +{ + _FX_RETURN_VALUE_IF_FAIL(_info._fillColor, FX_ERR_Property_Invalid); + CFX_Matrix m; + m.Set(_info._CTM.a, _info._CTM.b, _info._CTM.c, _info._CTM.d, _info._CTM.e, _info._CTM.f); + if (matrix) { + m.Concat(*matrix); + } + switch (_info._fillColor->_type) { + case FX_COLOR_Solid: { + FX_BOOL result = _renderDevice->DrawPath(path->GetPathData(), + (CFX_AffineMatrix *) &m, + &_info._graphState, + _info._fillColor->_argb, + 0x0, + fillMode); + _FX_RETURN_VALUE_IF_FAIL(result, FX_ERR_Indefinite); + return FX_ERR_Succeeded; + } + case FX_COLOR_Pattern: { + { + return FillPathWithPattern(path, fillMode, &m); + } + } + case FX_COLOR_Shading: { + { + return FillPathWithShading(path, fillMode, &m); + } + } + default: { + return FX_ERR_Property_Invalid; + } + } +} +FX_ERR CFX_Graphics::RenderDeviceDrawImage(CFX_DIBSource * source, + const CFX_PointF & point, + CFX_Matrix * matrix) +{ + CFX_Matrix m1; + m1.Set(_info._CTM.a, _info._CTM.b, _info._CTM.c, _info._CTM.d, _info._CTM.e, _info._CTM.f); + if (matrix) { + m1.Concat(*matrix); + } + CFX_Matrix m2; + m2.Set((FX_FLOAT) source->GetWidth(), + 0.0, + 0.0, + (FX_FLOAT) source->GetHeight(), + point.x, + point.y); + m2.Concat(m1); + FX_INT32 left, top; + CFX_DIBitmap * bmp1 = source->FlipImage(FALSE, TRUE); + CFX_DIBitmap * bmp2 = bmp1->TransformTo((CFX_AffineMatrix *) &m2, left, top); + CFX_RectF r; + GetClipRect(r); + FX_ERR result = FX_ERR_Indefinite; + { + CFX_DIBitmap * bitmap = _renderDevice->GetBitmap(); + CFX_DIBitmap bmp; + bmp.Create(bitmap->GetWidth(), bitmap->GetHeight(), FXDIB_Argb); + _renderDevice->GetDIBits(&bmp, 0, 0); + bmp.TransferBitmap(FXSYS_round(r.left), + FXSYS_round(r.top), + FXSYS_round(r.Width()), + FXSYS_round(r.Height()), + bmp2, + FXSYS_round(r.left - left), + FXSYS_round(r.top - top)); + _renderDevice->SetDIBits(&bmp, 0, 0); + result = FX_ERR_Succeeded; + } + if (bmp2) { + delete bmp2; + bmp2 = NULL; + } + if (bmp1) { + delete bmp1; + bmp1 = NULL; + } + return result; +} +FX_ERR CFX_Graphics::RenderDeviceStretchImage(CFX_DIBSource * source, + const CFX_RectF & rect, + CFX_Matrix * matrix) +{ + CFX_Matrix m1; + m1.Set(_info._CTM.a, _info._CTM.b, _info._CTM.c, _info._CTM.d, _info._CTM.e, _info._CTM.f); + if (matrix) { + m1.Concat(*matrix); + } + CFX_DIBitmap * bmp1 = source->StretchTo((FX_INT32) rect.Width(), + (FX_INT32) rect.Height()); + CFX_Matrix m2; + m2.Set(rect.Width(), 0.0, 0.0, rect.Height(), rect.left, rect.top); + m2.Concat(m1); + FX_INT32 left, top; + CFX_DIBitmap * bmp2 = bmp1->FlipImage(FALSE, TRUE); + CFX_DIBitmap * bmp3 = bmp2->TransformTo((CFX_AffineMatrix *) &m2, left, top); + CFX_RectF r; + GetClipRect(r); + FX_ERR result = FX_ERR_Indefinite; + { + CFX_DIBitmap * bitmap = _renderDevice->GetBitmap(); + bitmap->CompositeBitmap(FXSYS_round(r.left), + FXSYS_round(r.top), + FXSYS_round(r.Width()), + FXSYS_round(r.Height()), + bmp3, + FXSYS_round(r.left - left), + FXSYS_round(r.top - top)); + result = FX_ERR_Succeeded; + } + if (bmp3) { + delete bmp3; + bmp3 = NULL; + } + if (bmp2) { + delete bmp2; + bmp2 = NULL; + } + if (bmp1) { + delete bmp1; + bmp1 = NULL; + } + return result; +} +FX_ERR CFX_Graphics::RenderDeviceShowText(const CFX_PointF & point, + const CFX_WideString & text, + CFX_Matrix * matrix) +{ + FX_INT32 length = text.GetLength(); + FX_DWORD * charCodes = FX_Alloc(FX_DWORD, length); + FXTEXT_CHARPOS * charPos = FX_Alloc(FXTEXT_CHARPOS, + length * sizeof (FXTEXT_CHARPOS)); + CFX_RectF rect; + rect.Set(point.x, point.y, 0, 0); + CalcTextInfo(text, charCodes, charPos, rect); + CFX_Matrix m; + m.Set(_info._CTM.a, _info._CTM.b, _info._CTM.c, _info._CTM.d, _info._CTM.e, _info._CTM.f); + m.Translate(0, _info._fontSize * _info._fontHScale); + if (matrix) { + m.Concat(*matrix); + } + FX_BOOL result = _renderDevice->DrawNormalText(length, + charPos, + _info._font, + CFX_GEModule::Get()->GetFontCache(), + -_info._fontSize * _info._fontHScale, + (CFX_AffineMatrix *) &m, + _info._fillColor->_argb, + FXTEXT_CLEARTYPE); + _FX_RETURN_VALUE_IF_FAIL(result, FX_ERR_Indefinite); + FX_Free(charPos); + FX_Free(charCodes); + return FX_ERR_Succeeded; +} +FX_ERR CFX_Graphics::StrokePathWithPattern(CFX_Path * path, CFX_Matrix * matrix) +{ + return FX_ERR_Method_Not_Supported; +} +FX_ERR CFX_Graphics::StrokePathWithShading(CFX_Path * path, CFX_Matrix * matrix) +{ + return FX_ERR_Method_Not_Supported; +} +FX_ERR CFX_Graphics::FillPathWithPattern(CFX_Path * path, + FX_FillMode fillMode, + CFX_Matrix * matrix) +{ + CFX_Pattern * pattern = _info._fillColor->_pattern; + CFX_DIBitmap * bitmap = _renderDevice->GetBitmap(); + FX_INT32 width = bitmap->GetWidth(); + FX_INT32 height = bitmap->GetHeight(); + CFX_DIBitmap bmp; + bmp.Create(width, height, FXDIB_Argb); + _renderDevice->GetDIBits(&bmp, 0, 0); + switch (pattern->_type) { + case FX_PATTERN_Bitmap: { + FX_INT32 xStep = FXSYS_round(pattern->_x1Step); + FX_INT32 yStep = FXSYS_round(pattern->_y1Step); + FX_INT32 xCount = width / xStep + 1; + FX_INT32 yCount = height / yStep + 1; + for (FX_INT32 i = 0; i <= yCount; i++) { + for (FX_INT32 j = 0; j <= xCount; j++) { + bmp.TransferBitmap(j * xStep, + i * yStep, + xStep, + yStep, + pattern->_bitmap, + 0, + 0); + } + } + break; + } + case FX_PATTERN_Hatch: { + FX_HatchStyle hatchStyle = _info._fillColor->_pattern->_hatchStyle; + if (hatchStyle < FX_HATCHSTYLE_Horizontal || hatchStyle > FX_HATCHSTYLE_SolidDiamond) { + return FX_ERR_Intermediate_Value_Invalid; + } + const FX_HATCHDATA & data = hatchBitmapData[hatchStyle]; + CFX_DIBitmap mask; + mask.Create(data.width, data.height, FXDIB_1bppMask); + FXSYS_memcpy(mask.GetBuffer(), data.maskBits, mask.GetPitch() * data.height); + CFX_FloatRect rectf = path->GetPathData()->GetBoundingBox(); + if (matrix) { + rectf.Transform((const CFX_AffineMatrix *) matrix); + } + FX_RECT rect(FXSYS_round(rectf.left), + FXSYS_round(rectf.top), + FXSYS_round(rectf.right), + FXSYS_round(rectf.bottom)); + CFX_FxgeDevice device; + device.Attach(&bmp); + device.FillRect(&rect, _info._fillColor->_pattern->_backArgb); + for (FX_INT32 j = rect.bottom; j < rect.top; j += mask.GetHeight()) { + for (FX_INT32 i = rect.left; i < rect.right; i += mask.GetWidth()) { + device.SetBitMask(&mask, i, j, _info._fillColor->_pattern->_foreArgb); + } + } + break; + } + } + _renderDevice->SaveState(); + _renderDevice->SetClip_PathFill(path->GetPathData(), + (CFX_AffineMatrix *) matrix, + fillMode); + SetDIBitsWithMatrix(&bmp, &pattern->_matrix); + _renderDevice->RestoreState(); + return FX_ERR_Succeeded; +} +FX_ERR CFX_Graphics::FillPathWithShading(CFX_Path * path, + FX_FillMode fillMode, + CFX_Matrix * matrix) +{ + CFX_DIBitmap * bitmap = _renderDevice->GetBitmap(); + FX_INT32 width = bitmap->GetWidth(); + FX_INT32 height = bitmap->GetHeight(); + FX_FLOAT start_x = _info._fillColor->_shading->_beginPoint.x; + FX_FLOAT start_y = _info._fillColor->_shading->_beginPoint.y; + FX_FLOAT end_x = _info._fillColor->_shading->_endPoint.x; + FX_FLOAT end_y = _info._fillColor->_shading->_endPoint.y; + CFX_DIBitmap bmp; + bmp.Create(width, height, FXDIB_Argb); + _renderDevice->GetDIBits(&bmp, 0, 0); + FX_INT32 pitch = bmp.GetPitch(); + FX_BOOL result = FALSE; + switch (_info._fillColor->_shading->_type) { + case FX_SHADING_Axial: { + 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); + for (FX_INT32 row = 0; row < height; row++) { + FX_DWORD * dib_buf = (FX_DWORD *) (bmp.GetBuffer() + row * pitch); + for (FX_INT32 column = 0; column < width; column++) { + FX_FLOAT x = (FX_FLOAT)(column); + FX_FLOAT y = (FX_FLOAT)(row); + FX_FLOAT scale = FXSYS_Div(FXSYS_Mul(x - start_x, x_span) + FXSYS_Mul(y - start_y, y_span), + axis_len_square); + if (scale < 0) { + if (!_info._fillColor->_shading->_isExtendedBegin) { + continue; + } + scale = 0; + } else if (scale > 1.0f) { + if (!_info._fillColor->_shading->_isExtendedEnd) { + continue; + } + scale = 1.0f; + } + FX_INT32 index = (FX_INT32)(scale * (FX_SHADING_Steps - 1)); + dib_buf[column] = _info._fillColor->_shading->_argbArray[index]; + } + } + result = TRUE; + break; + } + case FX_SHADING_Radial: { + FX_FLOAT start_r = _info._fillColor->_shading->_beginRadius; + FX_FLOAT end_r = _info._fillColor->_shading->_endRadius; + 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); + for (FX_INT32 row = 0; row < height; row++) { + FX_DWORD * dib_buf = (FX_DWORD *) (bmp.GetBuffer() + row * pitch); + for (FX_INT32 column = 0; column < width; column++) { + FX_FLOAT x = (FX_FLOAT)(column); + FX_FLOAT y = (FX_FLOAT)(row); + 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 (s2 <= 1.0f || _info._fillColor->_shading->_isExtendedEnd) { + s = (s2); + } else { + s = (s1); + } + if ((start_r) + s * (end_r - start_r) < 0) { + continue; + } + } + if (s < 0) { + if (!_info._fillColor->_shading->_isExtendedBegin) { + continue; + } + s = 0; + } + if (s > 1.0f) { + if (!_info._fillColor->_shading->_isExtendedEnd) { + continue; + } + s = 1.0f; + } + int index = (FX_INT32)(s * (FX_SHADING_Steps - 1)); + dib_buf[column] = _info._fillColor->_shading->_argbArray[index]; + } + } + result = TRUE; + break; + } + default: { + result = FALSE; + } + } + if (result) { + _renderDevice->SaveState(); + _renderDevice->SetClip_PathFill(path->GetPathData(), + (CFX_AffineMatrix *) matrix, + fillMode); + SetDIBitsWithMatrix(&bmp, matrix); + _renderDevice->RestoreState(); + } + return result; +} +FX_ERR CFX_Graphics::SetDIBitsWithMatrix(CFX_DIBSource * source, CFX_Matrix * matrix) +{ + if (matrix->IsIdentity()) { + _renderDevice->SetDIBits(source, 0, 0); + } else { + CFX_Matrix m; + m.Set((FX_FLOAT)source->GetWidth(), 0, 0, (FX_FLOAT)source->GetHeight(), 0, 0); + m.Concat(*matrix); + FX_INT32 left, top; + CFX_DIBitmap * bmp1 = source->FlipImage(FALSE, TRUE); + CFX_DIBitmap * bmp2 = bmp1->TransformTo((CFX_AffineMatrix *) &m, left, top); + _renderDevice->SetDIBits(bmp2, left, top); + if (bmp2) { + delete bmp2; + bmp2 = NULL; + } + if (bmp1) { + delete bmp1; + bmp1 = NULL; + } + } + return FX_ERR_Succeeded; +} +FX_ERR CFX_Graphics::CalcTextInfo(const CFX_WideString & text, FX_DWORD * charCodes, FXTEXT_CHARPOS * charPos, CFX_RectF & rect) +{ + IFX_FontEncoding * encoding = FXGE_CreateUnicodeEncoding(_info._font); + FX_INT32 length = text.GetLength(); + FX_FLOAT penX = (FX_FLOAT) rect.left; + FX_FLOAT penY = (FX_FLOAT) rect.top; + FX_FLOAT left = (FX_FLOAT)(0); + FX_FLOAT top = (FX_FLOAT)(0); + charCodes[0] = text.GetAt(0); + charPos[0].m_OriginX = penX + left; + charPos[0].m_OriginY = penY + top; + charPos[0].m_GlyphIndex = encoding->GlyphFromCharCode(charCodes[0]); + charPos[0].m_FontCharWidth = FXSYS_round(_info._font->GetGlyphWidth(charPos[0].m_GlyphIndex) * _info._fontHScale); + charPos[0].m_bGlyphAdjust = TRUE; + charPos[0].m_AdjustMatrix[0] = -1; + charPos[0].m_AdjustMatrix[1] = 0; + charPos[0].m_AdjustMatrix[2] = 0; + charPos[0].m_AdjustMatrix[3] = 1; + penX += (FX_FLOAT)(charPos[0].m_FontCharWidth) * _info._fontSize / 1000 + _info._fontSpacing; + for (FX_INT32 i = 1; i < length; i++) { + charCodes[i] = text.GetAt(i); + charPos[i].m_OriginX = penX + left; + charPos[i].m_OriginY = penY + top; + charPos[i].m_GlyphIndex = encoding->GlyphFromCharCode(charCodes[i]); + charPos[i].m_FontCharWidth = FXSYS_round(_info._font->GetGlyphWidth(charPos[i].m_GlyphIndex) * _info._fontHScale); + charPos[i].m_bGlyphAdjust = TRUE; + charPos[i].m_AdjustMatrix[0] = -1; + charPos[i].m_AdjustMatrix[1] = 0; + charPos[i].m_AdjustMatrix[2] = 0; + charPos[i].m_AdjustMatrix[3] = 1; + penX += (FX_FLOAT)(charPos[i].m_FontCharWidth) * _info._fontSize / 1000 + _info._fontSpacing; + } + rect.width = (FX_FLOAT) penX - rect.left; + rect.height = rect.top + _info._fontSize * _info._fontHScale - rect.top; + delete encoding; + encoding = NULL; + return FX_ERR_Succeeded; +} +CAGG_Graphics::CAGG_Graphics() +{ + _owner = NULL; +} +FX_ERR CAGG_Graphics::Create(CFX_Graphics * owner, + FX_INT32 width, + FX_INT32 height, + FXDIB_Format format) +{ + if (owner->_renderDevice) { + return FX_ERR_Parameter_Invalid; + } + if (_owner) { + return FX_ERR_Property_Invalid; + } + CFX_FxgeDevice * device = FX_NEW CFX_FxgeDevice; + device->Create(width, height, format); + _owner = owner; + _owner->_renderDevice = device; + _owner->_renderDevice->GetBitmap()->Clear(0xFFFFFFFF); + return FX_ERR_Succeeded; +} +CAGG_Graphics::~CAGG_Graphics() +{ + if (_owner->_renderDevice) { + delete (CFX_FxgeDevice *) _owner->_renderDevice; + } + _owner = NULL; +} +CFX_Path::CFX_Path() +{ + _generator = NULL; +} +FX_ERR CFX_Path::Create() +{ + if (_generator) { + return FX_ERR_Property_Invalid; + } + _generator = FX_NEW CFX_PathGenerator; + _generator->Create(); + return FX_ERR_Succeeded; +} +CFX_Path::~CFX_Path() +{ + if (_generator) { + delete _generator; + _generator = NULL; + } +} +FX_ERR CFX_Path::MoveTo(FX_FLOAT x, FX_FLOAT y) +{ + _FX_RETURN_VALUE_IF_FAIL(_generator, FX_ERR_Property_Invalid); + _generator->MoveTo(x, y); + return FX_ERR_Succeeded; +} +FX_ERR CFX_Path::LineTo(FX_FLOAT x, FX_FLOAT y) +{ + _FX_RETURN_VALUE_IF_FAIL(_generator, FX_ERR_Property_Invalid); + _generator->LineTo(x, y); + return FX_ERR_Succeeded; +} +FX_ERR CFX_Path::BezierTo(FX_FLOAT ctrlX1, + FX_FLOAT ctrlY1, + FX_FLOAT ctrlX2, + FX_FLOAT ctrlY2, + FX_FLOAT toX, + FX_FLOAT toY) +{ + _FX_RETURN_VALUE_IF_FAIL(_generator, FX_ERR_Property_Invalid); + _generator->BezierTo(ctrlX1, ctrlY1, ctrlX2, ctrlY2, toX, toY); + return FX_ERR_Succeeded; +} +FX_ERR CFX_Path::ArcTo(FX_FLOAT left, + FX_FLOAT top, + FX_FLOAT width, + FX_FLOAT height, + FX_FLOAT startAngle, + FX_FLOAT sweepAngle) +{ + _FX_RETURN_VALUE_IF_FAIL(_generator, FX_ERR_Property_Invalid); + _generator->ArcTo(left + width / 2, + top + height / 2, + width / 2, + height / 2, + startAngle, + sweepAngle); + return FX_ERR_Succeeded; +} +FX_ERR CFX_Path::Close() +{ + _FX_RETURN_VALUE_IF_FAIL(_generator, FX_ERR_Property_Invalid); + _generator->Close(); + return FX_ERR_Succeeded; +} +FX_ERR CFX_Path::AddLine(FX_FLOAT x1, + FX_FLOAT y1, + FX_FLOAT x2, + FX_FLOAT y2) +{ + _FX_RETURN_VALUE_IF_FAIL(_generator, FX_ERR_Property_Invalid); + _generator->AddLine(x1, y1, x2, y2); + return FX_ERR_Succeeded; +} +FX_ERR CFX_Path::AddBezier(FX_FLOAT startX, + FX_FLOAT startY, + FX_FLOAT ctrlX1, + FX_FLOAT ctrlY1, + FX_FLOAT ctrlX2, + FX_FLOAT ctrlY2, + FX_FLOAT endX, + FX_FLOAT endY) +{ + _FX_RETURN_VALUE_IF_FAIL(_generator, FX_ERR_Property_Invalid); + _generator->AddBezier(startX, startY, ctrlX1, ctrlY1, ctrlX2, ctrlY2, endX, endY); + return FX_ERR_Succeeded; +} +FX_ERR CFX_Path::AddRectangle(FX_FLOAT left, + FX_FLOAT top, + FX_FLOAT width, + FX_FLOAT height) +{ + _FX_RETURN_VALUE_IF_FAIL(_generator, FX_ERR_Property_Invalid); + _generator->AddRectangle(left, top, left + width, top + height); + return FX_ERR_Succeeded; +} +FX_ERR CFX_Path::AddEllipse(FX_FLOAT left, + FX_FLOAT top, + FX_FLOAT width, + FX_FLOAT height) +{ + _FX_RETURN_VALUE_IF_FAIL(_generator, FX_ERR_Property_Invalid); + _generator->AddEllipse(left + width / 2, top + height / 2, width / 2, height / 2); + return FX_ERR_Succeeded; +} +FX_ERR CFX_Path::AddEllipse(const CFX_RectF & rect) +{ + _FX_RETURN_VALUE_IF_FAIL(_generator, FX_ERR_Property_Invalid); + _generator->AddEllipse(rect.left + rect.Width() / 2, + rect.top + rect.Height() / 2, + rect.Width() / 2, + rect.Height() / 2); + return FX_ERR_Succeeded; +} +FX_ERR CFX_Path::AddArc(FX_FLOAT left, + FX_FLOAT top, + FX_FLOAT width, + FX_FLOAT height, + FX_FLOAT startAngle, + FX_FLOAT sweepAngle) +{ + _FX_RETURN_VALUE_IF_FAIL(_generator, FX_ERR_Property_Invalid); + _generator->AddArc(left + width / 2, + top + height / 2, + width / 2, + height / 2, + startAngle, + sweepAngle); + return FX_ERR_Succeeded; +} +FX_ERR CFX_Path::AddPie(FX_FLOAT left, + FX_FLOAT top, + FX_FLOAT width, + FX_FLOAT height, + FX_FLOAT startAngle, + FX_FLOAT sweepAngle) +{ + _FX_RETURN_VALUE_IF_FAIL(_generator, FX_ERR_Property_Invalid); + _generator->AddPie(left + width / 2, + top + height / 2, + width / 2, + height / 2, + startAngle, + sweepAngle); + return FX_ERR_Succeeded; +} +FX_ERR CFX_Path::AddSubpath(CFX_Path * path) +{ + _FX_RETURN_VALUE_IF_FAIL(_generator, FX_ERR_Property_Invalid); + _generator->AddPathData(path->GetPathData()); + return FX_ERR_Succeeded; +} +FX_ERR CFX_Path::Clear() +{ + _FX_RETURN_VALUE_IF_FAIL(_generator, FX_ERR_Property_Invalid); + _generator->GetPathData()->SetPointCount(0); + return FX_ERR_Succeeded; +} +FX_BOOL CFX_Path::IsEmpty() +{ + _FX_RETURN_VALUE_IF_FAIL(_generator, FX_ERR_Property_Invalid); + if (_generator->GetPathData()->GetPointCount() == 0) { + return TRUE; + } + return FALSE; +} +CFX_PathData * CFX_Path::GetPathData() +{ + _FX_RETURN_VALUE_IF_FAIL(_generator, NULL); + return _generator->GetPathData(); +} +CFX_Color::CFX_Color() +{ + _type = FX_COLOR_None; +} +CFX_Color::CFX_Color(const FX_ARGB argb) +{ + _type = FX_COLOR_None; + Set(argb); +} +CFX_Color::CFX_Color(CFX_Pattern * pattern, const FX_ARGB argb ) +{ + _type = FX_COLOR_None; + Set(pattern, argb); +} +CFX_Color::CFX_Color(CFX_Shading * shading) +{ + _type = FX_COLOR_None; + Set(shading); +} +CFX_Color::~CFX_Color() +{ + _type = FX_COLOR_None; +} +FX_ERR CFX_Color::Set(const FX_ARGB argb) +{ + _type = FX_COLOR_Solid; + _argb = argb; + _pattern = NULL; + return FX_ERR_Succeeded; +} +FX_ERR CFX_Color::Set(CFX_Pattern * pattern, const FX_ARGB argb ) +{ + _FX_RETURN_VALUE_IF_FAIL(pattern, FX_ERR_Parameter_Invalid); + _type = FX_COLOR_Pattern; + _argb = argb; + _pattern = pattern; + return FX_ERR_Succeeded; +} +FX_ERR CFX_Color::Set(CFX_Shading * shading) +{ + _FX_RETURN_VALUE_IF_FAIL(shading, FX_ERR_Parameter_Invalid); + _type = FX_COLOR_Shading; + _shading = shading; + return FX_ERR_Succeeded; +} +CFX_Pattern::CFX_Pattern() +{ + _type = FX_PATTERN_None; + _matrix.Reset(); +} +FX_ERR CFX_Pattern::Create(CFX_DIBitmap * bitmap, + const FX_FLOAT xStep, + const FX_FLOAT yStep, + CFX_Matrix * matrix ) +{ + _FX_RETURN_VALUE_IF_FAIL(bitmap, FX_ERR_Parameter_Invalid); + if (_type != FX_PATTERN_None) { + return FX_ERR_Property_Invalid; + } + _type = FX_PATTERN_Bitmap; + _bitmap = bitmap; + _x1Step = xStep; + _y1Step = yStep; + if (matrix) { + _matrix.Set(matrix->a, matrix->b, matrix->c, matrix->d, matrix->e, matrix->f); + } + return FX_ERR_Succeeded; +} +FX_ERR CFX_Pattern::Create(FX_HatchStyle hatchStyle, + const FX_ARGB foreArgb, + const FX_ARGB backArgb, + CFX_Matrix * matrix ) +{ + if (hatchStyle < FX_HATCHSTYLE_Horizontal + || hatchStyle > FX_HATCHSTYLE_SolidDiamond) { + return FX_ERR_Parameter_Invalid; + } + if (_type != FX_PATTERN_None) { + return FX_ERR_Property_Invalid; + } + _type = FX_PATTERN_Hatch; + _hatchStyle = hatchStyle; + _foreArgb = foreArgb; + _backArgb = backArgb; + if (matrix) { + _matrix.Set(matrix->a, matrix->b, matrix->c, matrix->d, matrix->e, matrix->f); + } + return FX_ERR_Succeeded; +} +CFX_Pattern::~CFX_Pattern() +{ + _type = FX_PATTERN_None; +} +CFX_Shading::CFX_Shading() +{ + _type = FX_SHADING_None; +} +FX_ERR CFX_Shading::CreateAxial(const CFX_PointF & beginPoint, + const CFX_PointF & endPoint, + FX_BOOL isExtendedBegin, + FX_BOOL isExtendedEnd, + const FX_ARGB beginArgb, + const FX_ARGB endArgb) +{ + if (_type != FX_SHADING_None) { + return FX_ERR_Property_Invalid; + } + _type = FX_SHADING_Axial; + _beginPoint = beginPoint; + _endPoint = endPoint; + _isExtendedBegin = isExtendedBegin; + _isExtendedEnd = isExtendedEnd; + _beginArgb = beginArgb; + _endArgb = endArgb; + return InitArgbArray(); +} +FX_ERR CFX_Shading::CreateRadial(const CFX_PointF & beginPoint, + const CFX_PointF & endPoint, + const FX_FLOAT beginRadius, + const FX_FLOAT endRadius, + FX_BOOL isExtendedBegin, + FX_BOOL isExtendedEnd, + const FX_ARGB beginArgb, + const FX_ARGB endArgb) +{ + if (_type != FX_SHADING_None) { + return FX_ERR_Property_Invalid; + } + _type = FX_SHADING_Radial; + _beginPoint = beginPoint; + _endPoint = endPoint; + _beginRadius = beginRadius; + _endRadius = endRadius; + _isExtendedBegin = isExtendedBegin; + _isExtendedEnd = isExtendedEnd; + _beginArgb = beginArgb; + _endArgb = endArgb; + return InitArgbArray(); +} +CFX_Shading::~CFX_Shading() +{ + _type = FX_SHADING_None; +} +FX_ERR CFX_Shading::InitArgbArray() +{ + FX_INT32 a1, r1, g1, b1; + ArgbDecode(_beginArgb, a1, r1, g1, b1); + FX_INT32 a2, r2, g2, b2; + ArgbDecode(_endArgb, a2, r2, g2, b2); + FX_FLOAT f = (FX_FLOAT) (FX_SHADING_Steps - 1); + FX_FLOAT aScale = (FX_FLOAT) (1.0 * (a2 - a1) / f); + FX_FLOAT rScale = (FX_FLOAT) (1.0 * (r2 - r1) / f); + FX_FLOAT gScale = (FX_FLOAT) (1.0 * (g2 - g1) / f); + FX_FLOAT bScale = (FX_FLOAT) (1.0 * (b2 - b1) / f); + FX_INT32 a3, r3, g3, b3; + for (FX_INT32 i = 0; i < FX_SHADING_Steps; i++) { + a3 = (FX_INT32) (i * aScale); + r3 = (FX_INT32) (i * rScale); + g3 = (FX_INT32) (i * gScale); + b3 = (FX_INT32) (i * bScale); + _argbArray[i] = FXARGB_TODIB(FXARGB_MAKE((a1 + a3), + (r1 + r3), + (g1 + g3), + (b1 + b3))); + } + return FX_ERR_Succeeded; +} +class CFX_Pause : public IFX_Pause +{ +public: + virtual FX_BOOL NeedToPauseNow() + { + return TRUE; + } +}; diff --git a/xfa/src/fxgraphics/src/fx_metafile_interpreter.cpp b/xfa/src/fxgraphics/src/fx_metafile_interpreter.cpp new file mode 100644 index 0000000000..388fbc5ad5 --- /dev/null +++ b/xfa/src/fxgraphics/src/fx_metafile_interpreter.cpp @@ -0,0 +1,281 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "pre.h" +#include "../include/fx_graphics.h" +#include "fx_metafile_interpreter.h" +CFX_MetafileInterpreter::CFX_MetafileInterpreter() +{ + _element = NULL; +} +CFX_MetafileInterpreter::~CFX_MetafileInterpreter() +{ + _element = NULL; +} +FX_BOOL CFX_MetafileInterpreter::SetCurrentElement(CXML_Element * element) +{ + _FX_RETURN_VALUE_IF_FAIL(element, FALSE); + _element = element; + return TRUE; +} +FX_BOOL CFX_MetafileInterpreter::ParamOf_SetLineCap(FX_INT32 & lineCap) +{ + _FX_RETURN_VALUE_IF_FAIL(_element, FALSE); + CXML_Element * lineCapElement = _element->GetElement(0); + _FX_RETURN_VALUE_IF_FAIL(lineCapElement, FALSE); + lineCap = lineCapElement->GetAttrInteger("CFX_GraphStateData::LineCap"); + return TRUE; +} +FX_BOOL CFX_MetafileInterpreter::ParamOf_SetLineDash(FX_FLOAT & dashPhase, + FX_INT32 & dashArray, + FX_INT32 & dashCount) +{ + _FX_RETURN_VALUE_IF_FAIL(_element, FALSE); + CXML_Element * dashPhaseElement = _element->GetElement(0); + _FX_RETURN_VALUE_IF_FAIL(dashPhaseElement, FALSE); + dashPhase = dashPhaseElement->GetAttrFloat("FX_FLOAT"); + CXML_Element * dashArrayElement = _element->GetElement(1); + _FX_RETURN_VALUE_IF_FAIL(dashArrayElement, FALSE); + dashArray = dashArrayElement->GetAttrInteger("FX_FLOAT *"); + CXML_Element * dashCountElement = _element->GetElement(2); + _FX_RETURN_VALUE_IF_FAIL(dashCountElement, FALSE); + dashCount = dashCountElement->GetAttrInteger("FX_INT32"); + return TRUE; +} +FX_BOOL CFX_MetafileInterpreter::ParamOf_SetLineDash(FX_INT32 & dashStyle) +{ + _FX_RETURN_VALUE_IF_FAIL(_element, FALSE); + CXML_Element * dashStyleElement = _element->GetElement(0); + _FX_RETURN_VALUE_IF_FAIL(dashStyleElement, FALSE); + dashStyle = dashStyleElement->GetAttrInteger("FX_DashStyle"); + return TRUE; +} +FX_BOOL CFX_MetafileInterpreter::ParamOf_SetLineJoin(FX_INT32 & lineJoin) +{ + _FX_RETURN_VALUE_IF_FAIL(_element, FALSE); + CXML_Element * lineJoinElement = _element->GetElement(0); + _FX_RETURN_VALUE_IF_FAIL(lineJoinElement, FALSE); + lineJoin = lineJoinElement->GetAttrInteger("CFX_GraphStateData::LineJoin"); + return TRUE; +} +FX_BOOL CFX_MetafileInterpreter::ParamOf_SetMiterLimit(FX_FLOAT & miterLimit) +{ + _FX_RETURN_VALUE_IF_FAIL(_element, FALSE); + CXML_Element * miterLimitElement = _element->GetElement(0); + _FX_RETURN_VALUE_IF_FAIL(miterLimitElement, FALSE); + miterLimit = miterLimitElement->GetAttrFloat("FX_FLOAT"); + return TRUE; +} +FX_BOOL CFX_MetafileInterpreter::ParamOf_SetLineWidth(FX_FLOAT & lineWidth, + FX_INT32 & isActOnDash) +{ + _FX_RETURN_VALUE_IF_FAIL(_element, FALSE); + CXML_Element * lineWidthElement = _element->GetElement(0); + _FX_RETURN_VALUE_IF_FAIL(lineWidthElement, FALSE); + lineWidth = lineWidthElement->GetAttrFloat("FX_FLOAT"); + CXML_Element * isActOnDashElement = _element->GetElement(1); + _FX_RETURN_VALUE_IF_FAIL(isActOnDashElement, FALSE); + isActOnDash = isActOnDashElement->GetAttrInteger("FX_BOOL"); + return TRUE; +} +FX_BOOL CFX_MetafileInterpreter::ParamOf_SetStrokeColor(FX_INT32 & color) +{ + _FX_RETURN_VALUE_IF_FAIL(_element, FALSE); + CXML_Element * colorElement = _element->GetElement(0); + _FX_RETURN_VALUE_IF_FAIL(colorElement, FALSE); + color = colorElement->GetAttrInteger("CFX_Color *"); + return TRUE; +} +FX_BOOL CFX_MetafileInterpreter::ParamOf_SetFillColor(FX_INT32 & color) +{ + _FX_RETURN_VALUE_IF_FAIL(_element, FALSE); + CXML_Element * colorElement = _element->GetElement(0); + _FX_RETURN_VALUE_IF_FAIL(colorElement, FALSE); + color = colorElement->GetAttrInteger("CFX_Color *"); + return TRUE; +} +FX_BOOL CFX_MetafileInterpreter::ParamOf_StrokePath(FX_INT32 & path, FX_INT32 & matrix) +{ + _FX_RETURN_VALUE_IF_FAIL(_element, FALSE); + CXML_Element * pathElement = _element->GetElement(0); + _FX_RETURN_VALUE_IF_FAIL(pathElement, FALSE); + path = pathElement->GetAttrInteger("CFX_Path *"); + CXML_Element * matrixElement = _element->GetElement(1); + _FX_RETURN_VALUE_IF_FAIL(matrixElement, FALSE); + matrix = matrixElement->GetAttrInteger("CFX_Matrix *"); + return TRUE; +} +FX_BOOL CFX_MetafileInterpreter::ParamOf_FillPath(FX_INT32 & path, + FX_INT32 & fillMode, + FX_INT32 & matrix) +{ + _FX_RETURN_VALUE_IF_FAIL(_element, FALSE); + CXML_Element * pathElement = _element->GetElement(0); + _FX_RETURN_VALUE_IF_FAIL(pathElement, FALSE); + path = pathElement->GetAttrInteger("CFX_Path *"); + CXML_Element * fillModeElement = _element->GetElement(1); + _FX_RETURN_VALUE_IF_FAIL(fillModeElement, FALSE); + fillMode = fillModeElement->GetAttrInteger("FX_FillMode"); + CXML_Element * matrixElement = _element->GetElement(2); + _FX_RETURN_VALUE_IF_FAIL(matrixElement, FALSE); + matrix = matrixElement->GetAttrInteger("CFX_Matrix *"); + return TRUE; +} +FX_BOOL CFX_MetafileInterpreter::ParamOf_ClipPath(FX_INT32 & path, + FX_INT32 & fillMode, + FX_INT32 & matrix) +{ + _FX_RETURN_VALUE_IF_FAIL(_element, FALSE); + CXML_Element * pathElement = _element->GetElement(0); + _FX_RETURN_VALUE_IF_FAIL(pathElement, FALSE); + path = pathElement->GetAttrInteger("CFX_Path *"); + CXML_Element * fillModeElement = _element->GetElement(1); + _FX_RETURN_VALUE_IF_FAIL(fillModeElement, FALSE); + fillMode = fillModeElement->GetAttrInteger("FX_FillMode"); + CXML_Element * matrixElement = _element->GetElement(2); + _FX_RETURN_VALUE_IF_FAIL(matrixElement, FALSE); + matrix = matrixElement->GetAttrInteger("CFX_Matrix *"); + return TRUE; +} +FX_BOOL CFX_MetafileInterpreter::ParamOf_DrawImage(FX_INT32 & source, + FX_INT32 & point, + FX_INT32 & matrix) +{ + _FX_RETURN_VALUE_IF_FAIL(_element, FALSE); + CXML_Element * sourceElement = _element->GetElement(0); + _FX_RETURN_VALUE_IF_FAIL(sourceElement, FALSE); + source = sourceElement->GetAttrInteger("CFX_DIBSource *"); + CXML_Element * pointElement = _element->GetElement(1); + _FX_RETURN_VALUE_IF_FAIL(pointElement, FALSE); + point = pointElement->GetAttrInteger("CFX_PointF *"); + CXML_Element * matrixElement = _element->GetElement(2); + _FX_RETURN_VALUE_IF_FAIL(matrixElement, FALSE); + matrix = matrixElement->GetAttrInteger("CFX_Matrix *"); + return TRUE; +} +FX_BOOL CFX_MetafileInterpreter::ParamOf_StretchImage(FX_INT32 & source, + FX_INT32 & rect, + FX_INT32 & matrix) +{ + _FX_RETURN_VALUE_IF_FAIL(_element, FALSE); + CXML_Element * sourceElement = _element->GetElement(0); + _FX_RETURN_VALUE_IF_FAIL(sourceElement, FALSE); + source = sourceElement->GetAttrInteger("CFX_DIBSource *"); + CXML_Element * rectElement = _element->GetElement(1); + _FX_RETURN_VALUE_IF_FAIL(rectElement, FALSE); + rect = rectElement->GetAttrInteger("CFX_RectF *"); + CXML_Element * matrixElement = _element->GetElement(2); + _FX_RETURN_VALUE_IF_FAIL(matrixElement, FALSE); + matrix = matrixElement->GetAttrInteger("CFX_Matrix *"); + return TRUE; +} +FX_BOOL CFX_MetafileInterpreter::ParamOf_ConcatMatrix(FX_INT32 & matrix) +{ + _FX_RETURN_VALUE_IF_FAIL(_element, FALSE); + CXML_Element * matrixElement = _element->GetElement(0); + _FX_RETURN_VALUE_IF_FAIL(matrixElement, FALSE); + matrix = matrixElement->GetAttrInteger("CFX_Matrix *"); + return TRUE; +} +FX_BOOL CFX_MetafileInterpreter::ParamOf_SetClipRect(FX_INT32 & rect) +{ + _FX_RETURN_VALUE_IF_FAIL(_element, FALSE); + CXML_Element * rectElement = _element->GetElement(0); + _FX_RETURN_VALUE_IF_FAIL(rectElement, FALSE); + rect = rectElement->GetAttrInteger("CFX_RectF *"); + return TRUE; +} +FX_BOOL CFX_MetafileInterpreter::ParamOf_SetFont(FX_INT32 & font) +{ + _FX_RETURN_VALUE_IF_FAIL(_element, FALSE); + CXML_Element * fontElement = _element->GetElement(0); + _FX_RETURN_VALUE_IF_FAIL(fontElement, FALSE); + font = fontElement->GetAttrInteger("CFX_Font *"); + return TRUE; +} +FX_BOOL CFX_MetafileInterpreter::ParamOf_SetFontSize(FX_FLOAT & size) +{ + _FX_RETURN_VALUE_IF_FAIL(_element, FALSE); + CXML_Element * sizeElement = _element->GetElement(0); + _FX_RETURN_VALUE_IF_FAIL(sizeElement, FALSE); + size = sizeElement->GetAttrFloat("FX_FLOAT"); + return TRUE; +} +FX_BOOL CFX_MetafileInterpreter::ParamOf_SetFontHScale(FX_FLOAT & scale) +{ + _FX_RETURN_VALUE_IF_FAIL(_element, FALSE); + CXML_Element * scaleElement = _element->GetElement(0); + _FX_RETURN_VALUE_IF_FAIL(scaleElement, FALSE); + scale = scaleElement->GetAttrFloat("FX_FLOAT"); + return TRUE; +} +FX_BOOL CFX_MetafileInterpreter::ParamOf_SetCharSpacing(FX_FLOAT & spacing) +{ + _FX_RETURN_VALUE_IF_FAIL(_element, FALSE); + CXML_Element * spacingElement = _element->GetElement(0); + _FX_RETURN_VALUE_IF_FAIL(spacingElement, FALSE); + spacing = spacingElement->GetAttrFloat("FX_FLOAT"); + return TRUE; +} +FX_BOOL CFX_MetafileInterpreter::ParamOf_SetTextDrawingMode(FX_INT32 & mode) +{ + _FX_RETURN_VALUE_IF_FAIL(_element, FALSE); + CXML_Element * modeElement = _element->GetElement(0); + _FX_RETURN_VALUE_IF_FAIL(modeElement, FALSE); + mode = modeElement->GetAttrInteger("FX_INT32"); + return TRUE; +} +FX_BOOL CFX_MetafileInterpreter::ParamOf_SetText(FX_INT32 & point, + FX_INT32 & text, + FX_INT32 & matrix) +{ + _FX_RETURN_VALUE_IF_FAIL(_element, FALSE); + CXML_Element * pointElement = _element->GetElement(0); + _FX_RETURN_VALUE_IF_FAIL(pointElement, FALSE); + point = pointElement->GetAttrInteger("CFX_PointF *"); + CXML_Element * textElement = _element->GetElement(1); + _FX_RETURN_VALUE_IF_FAIL(textElement, FALSE); + text = textElement->GetAttrInteger("CFX_WideString *"); + CXML_Element * matrixElement = _element->GetElement(2); + _FX_RETURN_VALUE_IF_FAIL(matrixElement, FALSE); + matrix = matrixElement->GetAttrInteger("CFX_Matrix *"); + return TRUE; +} +FX_BOOL CFX_MetafileInterpreter::ParamOf_Transfer(FX_INT32 & graphics, FX_INT32 & matrix) +{ + _FX_RETURN_VALUE_IF_FAIL(_element, FALSE); + CXML_Element * graphicsElement = _element->GetElement(0); + _FX_RETURN_VALUE_IF_FAIL(graphicsElement, FALSE); + graphics = graphicsElement->GetAttrInteger("CFX_Graphics *"); + CXML_Element * matrixElement = _element->GetElement(1); + _FX_RETURN_VALUE_IF_FAIL(matrixElement, FALSE); + matrix = matrixElement->GetAttrInteger("CFX_Matrix *"); + return TRUE; +} +FX_BOOL CFX_MetafileInterpreter::ParamOf_Transfer(FX_INT32 & graphics, + FX_FLOAT & srcLeft, + FX_FLOAT & srcTop, + FX_INT32 & dstRect, + FX_INT32 & matrix) +{ + _FX_RETURN_VALUE_IF_FAIL(_element, FALSE); + CXML_Element * graphicsElement = _element->GetElement(0); + _FX_RETURN_VALUE_IF_FAIL(graphicsElement, FALSE); + graphics = graphicsElement->GetAttrInteger("CFX_Graphics *"); + CXML_Element * srcLeftElement = _element->GetElement(2); + _FX_RETURN_VALUE_IF_FAIL(srcLeftElement, FALSE); + srcLeft = srcLeftElement->GetAttrFloat("FX_FLOAT"); + CXML_Element * srcTopElement = _element->GetElement(3); + _FX_RETURN_VALUE_IF_FAIL(srcTopElement, FALSE); + srcTop = srcTopElement->GetAttrFloat("FX_FLOAT"); + CXML_Element * dstRectElement = _element->GetElement(1); + _FX_RETURN_VALUE_IF_FAIL(dstRectElement, FALSE); + dstRect = dstRectElement->GetAttrInteger("CFX_RectF *"); + CXML_Element * matrixElement = _element->GetElement(4); + _FX_RETURN_VALUE_IF_FAIL(matrixElement, FALSE); + matrix = matrixElement->GetAttrInteger("CFX_Matrix *"); + return TRUE; +} diff --git a/xfa/src/fxgraphics/src/fx_metafile_interpreter.h b/xfa/src/fxgraphics/src/fx_metafile_interpreter.h new file mode 100644 index 0000000000..6d827b6f30 --- /dev/null +++ b/xfa/src/fxgraphics/src/fx_metafile_interpreter.h @@ -0,0 +1,54 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 __H_FX_METAFILE_INTERPRETER__ +#define __H_FX_METAFILE_INTERPRETER__ +class CFX_MetafileInterpreter : public CFX_Object +{ +public: + CFX_MetafileInterpreter(); + virtual ~CFX_MetafileInterpreter(); + + FX_BOOL SetCurrentElement(CXML_Element * element); + + FX_BOOL ParamOf_SetLineCap(FX_INT32 & lineCap); + FX_BOOL ParamOf_SetLineDash(FX_FLOAT & dashPhase, + FX_INT32 & dashArray, + FX_INT32 & dashCount); + FX_BOOL ParamOf_SetLineDash(FX_INT32 & dashStyle); + FX_BOOL ParamOf_SetLineJoin(FX_INT32 & lineJoin); + FX_BOOL ParamOf_SetMiterLimit(FX_FLOAT & miterLimit); + FX_BOOL ParamOf_SetLineWidth(FX_FLOAT & lineWidth, FX_INT32 & isActOnDash); + + FX_BOOL ParamOf_SetStrokeColor(FX_INT32 & color); + FX_BOOL ParamOf_SetFillColor(FX_INT32 & color); + + FX_BOOL ParamOf_StrokePath(FX_INT32 & path, FX_INT32 & matrix); + FX_BOOL ParamOf_FillPath(FX_INT32 & path, FX_INT32 & fillMode, FX_INT32 & matrix); + FX_BOOL ParamOf_ClipPath(FX_INT32 & path, FX_INT32 & fillMode, FX_INT32 & matrix); + + FX_BOOL ParamOf_DrawImage(FX_INT32 & source, FX_INT32 & point, FX_INT32 & matrix); + FX_BOOL ParamOf_StretchImage(FX_INT32 & source, FX_INT32 & rect, FX_INT32 & matrix); + + FX_BOOL ParamOf_ConcatMatrix(FX_INT32 & matrix); + FX_BOOL ParamOf_SetClipRect(FX_INT32 & rect); + FX_BOOL ParamOf_SetFont(FX_INT32 & font); + FX_BOOL ParamOf_SetFontSize(FX_FLOAT & size); + FX_BOOL ParamOf_SetFontHScale(FX_FLOAT & scale); + FX_BOOL ParamOf_SetCharSpacing(FX_FLOAT & spacing); + FX_BOOL ParamOf_SetTextDrawingMode(FX_INT32 & mode); + FX_BOOL ParamOf_SetText(FX_INT32 & point, FX_INT32 & text, FX_INT32 & matrix); + FX_BOOL ParamOf_Transfer(FX_INT32 & graphics, FX_INT32 & matrix); + FX_BOOL ParamOf_Transfer(FX_INT32 & graphics, + FX_FLOAT & srcLeft, + FX_FLOAT & srcTop, + FX_INT32 & dstRect, + FX_INT32 & matrix); + +private: + CXML_Element * _element; +}; +#endif diff --git a/xfa/src/fxgraphics/src/fx_path_generator.cpp b/xfa/src/fxgraphics/src/fx_path_generator.cpp new file mode 100644 index 0000000000..da9d3df063 --- /dev/null +++ b/xfa/src/fxgraphics/src/fx_path_generator.cpp @@ -0,0 +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 "pre.h" +#include "fx_path_generator.h" +CFX_PathGenerator::CFX_PathGenerator() +{ + m_pPathData = NULL; +} +void CFX_PathGenerator::Create() +{ + m_pPathData = FX_NEW CFX_PathData; +} +CFX_PathGenerator::~CFX_PathGenerator() +{ + if ( m_pPathData) { + delete m_pPathData; + m_pPathData = NULL; + } +} +void CFX_PathGenerator::AddPathData(CFX_PathData *pPathData) +{ + if (pPathData && pPathData->GetPointCount() > 0) { + int nCount = pPathData->GetPointCount(); + FX_PATHPOINT *pPoints = pPathData->GetPoints(); + AddPathData(pPoints, nCount); + } +} +void CFX_PathGenerator::AddPathData(FX_PATHPOINT *pPoints, int nCount) +{ + if (pPoints && nCount > 0) { + int nOldCount = m_pPathData->GetPointCount(); + m_pPathData->AddPointCount(nCount); + FX_PATHPOINT *pDstPoints = m_pPathData->GetPoints(); + FXSYS_memcpy(pDstPoints + nOldCount, pPoints, sizeof(FX_PATHPOINT) * nCount); + } +} +void CFX_PathGenerator::MoveTo(FX_FLOAT x, FX_FLOAT y) +{ + m_pPathData->AddPointCount(1); + m_pPathData->SetPoint(m_pPathData->GetPointCount() - 1, x, y, FXPT_MOVETO); +} +void CFX_PathGenerator::LineTo(FX_FLOAT x, FX_FLOAT y) +{ + m_pPathData->AddPointCount(1); + m_pPathData->SetPoint(m_pPathData->GetPointCount() - 1, x, y, FXPT_LINETO); +} +void CFX_PathGenerator::BezierTo(FX_FLOAT ctrl_x1, FX_FLOAT ctrl_y1, + FX_FLOAT ctrl_x2, FX_FLOAT ctrl_y2, FX_FLOAT to_x, FX_FLOAT to_y) +{ + int old_count = m_pPathData->GetPointCount(); + m_pPathData->AddPointCount(3); + m_pPathData->SetPoint(old_count, ctrl_x1, ctrl_y1, FXPT_BEZIERTO); + m_pPathData->SetPoint(old_count + 1, ctrl_x2, ctrl_y2, FXPT_BEZIERTO); + m_pPathData->SetPoint(old_count + 2, to_x, to_y, FXPT_BEZIERTO); +} +void CFX_PathGenerator::Close() +{ + if (m_pPathData->GetPointCount() > 0) { + int index = m_pPathData->GetPointCount() - 1; + FX_PATHPOINT *pPoints = m_pPathData->GetPoints(); + pPoints[index].m_Flag |= FXPT_CLOSEFIGURE; + } +} +void CFX_PathGenerator::AddLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2) +{ + int old_count = m_pPathData->GetPointCount(); + m_pPathData->AddPointCount(2); + m_pPathData->SetPoint(old_count, x1, y1, FXPT_MOVETO); + m_pPathData->SetPoint(old_count + 1, x2, y2, FXPT_LINETO); +} +void CFX_PathGenerator::AddBezier(FX_FLOAT start_x, FX_FLOAT start_y, + FX_FLOAT ctrl_x1, FX_FLOAT ctrl_y1, FX_FLOAT ctrl_x2, FX_FLOAT ctrl_y2, + FX_FLOAT end_x, FX_FLOAT end_y) +{ + int old_count = m_pPathData->GetPointCount(); + m_pPathData->AddPointCount(4); + m_pPathData->SetPoint(old_count, start_x, start_y, FXPT_MOVETO); + m_pPathData->SetPoint(old_count + 1, ctrl_x1, ctrl_y1, FXPT_BEZIERTO); + m_pPathData->SetPoint(old_count + 2, ctrl_x2, ctrl_y2, FXPT_BEZIERTO); + m_pPathData->SetPoint(old_count + 3, end_x, end_y, FXPT_BEZIERTO); +} +void CFX_PathGenerator::AddRectangle(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2) +{ + m_pPathData->AppendRect(x1, y1, x2, y2); +} +void CFX_PathGenerator::AddEllipse(FX_FLOAT x, FX_FLOAT y, FX_FLOAT width, FX_FLOAT height) +{ +#if 0 + FX_FIXFLOAT16 k; + k = fix16_to_8(fixsqrt_32_to_16(fixmul_8_8_to_32(width, width) + fixmul_8_8_to_32(height, height)) / 2); + int old_count = m_pPathData->GetPointCount(); + m_pPathData->AddPointCount(7); + m_pPathData->SetPoint(old_count, x, y - height / 2, FXPT_MOVETO); + m_pPathData->SetPoint(old_count + 1, x + k, y - height / 2, FXPT_BEZIERTO); + m_pPathData->SetPoint(old_count + 2, x + k, y + height / 2, FXPT_BEZIERTO); + m_pPathData->SetPoint(old_count + 3, x, y + height / 2, FXPT_BEZIERTO); + m_pPathData->SetPoint(old_count + 4, x - k, y + height / 2, FXPT_BEZIERTO); + m_pPathData->SetPoint(old_count + 5, x - k, y - height / 2, FXPT_BEZIERTO); + m_pPathData->SetPoint(old_count + 6, x, y - height / 2, FXPT_BEZIERTO); +#else + AddArc(x, y, width, height, 0, FX_PI * 2); +#endif +} +void CFX_PathGenerator::ArcTo(FX_FLOAT x, FX_FLOAT y, FX_FLOAT width, FX_FLOAT height, + FX_FLOAT start_angle, FX_FLOAT sweep_angle) +{ + FX_FLOAT x0 = FXSYS_cos(sweep_angle / 2); + FX_FLOAT y0 = FXSYS_sin(sweep_angle / 2); + FX_FLOAT tx = FXSYS_Div((1.0f - x0) * 4, 3 * 1.0f); + FX_FLOAT ty = y0 - FXSYS_Div(FXSYS_Mul(tx, x0), y0); + FX_FLOAT px[3], py[3]; + px[0] = x0 + tx; + py[0] = -ty; + px[1] = x0 + tx; + py[1] = ty; + FX_FLOAT sn = FXSYS_sin(start_angle + sweep_angle / 2); + FX_FLOAT cs = FXSYS_cos(start_angle + sweep_angle / 2); + int old_count = m_pPathData->GetPointCount(); + m_pPathData->AddPointCount(3); + FX_FLOAT bezier_x, bezier_y; + bezier_x = x + FXSYS_Mul(width, FXSYS_Mul(px[0], cs) - FXSYS_Mul(py[0], sn)); + bezier_y = y + FXSYS_Mul(height, FXSYS_Mul(px[0], sn) + FXSYS_Mul(py[0], cs)); + m_pPathData->SetPoint(old_count, bezier_x, bezier_y, FXPT_BEZIERTO); + bezier_x = x + FXSYS_Mul(width, FXSYS_Mul(px[1], cs) - FXSYS_Mul(py[1], sn)); + bezier_y = y + FXSYS_Mul(height, FXSYS_Mul(px[1], sn) + FXSYS_Mul(py[1], cs)); + m_pPathData->SetPoint(old_count + 1, bezier_x, bezier_y, FXPT_BEZIERTO); + bezier_x = x + FXSYS_Mul(width, FXSYS_cos(start_angle + sweep_angle)), + bezier_y = y + FXSYS_Mul(height, FXSYS_sin(start_angle + sweep_angle)); + m_pPathData->SetPoint(old_count + 2, bezier_x, bezier_y, FXPT_BEZIERTO); +} +void CFX_PathGenerator::AddArc(FX_FLOAT x, FX_FLOAT y, FX_FLOAT width, FX_FLOAT height, + FX_FLOAT start_angle, FX_FLOAT sweep_angle) +{ +#if 0 + FX_FIXFLOAT32 sweep = sweep_angle; + while (sweep > FIXFLOAT32_PI * 2) { + sweep -= FIXFLOAT32_PI * 2; + } + if (sweep == 0) { + return; + } + m_pPathData->AddPointCount(1); + m_pPathData->SetPoint(m_pPathData->GetPointCount() - 1, + x + fixmul_8_32_to_8(width, fixcos(start_angle)), + y + fixmul_8_32_to_8(height, fixsin(start_angle)), FXPT_MOVETO); + FX_FIXFLOAT32 angle1 = 0, angle2; + FX_BOOL bDone = FALSE; + do { + angle2 = angle1 + FIXFLOAT32_PI / 2; + if (angle2 >= sweep) { + angle2 = sweep; + bDone = TRUE; + } + ArcTo(x, y, width, height, start_angle + angle1, angle2 - angle1); + angle1 = angle2; + } while (!bDone); +#else + if (sweep_angle == 0) { + return; + } + static const FX_FLOAT bezier_arc_angle_epsilon = (FX_FLOAT)(0.01f); + while (start_angle > FX_PI * 2) { + start_angle -= FX_PI * 2; + } + while (start_angle < 0) { + start_angle += FX_PI * 2; + } + if(sweep_angle >= FX_PI * 2) { + sweep_angle = FX_PI * 2; + } + if(sweep_angle <= -FX_PI * 2) { + sweep_angle = -FX_PI * 2; + } + m_pPathData->AddPointCount(1); + m_pPathData->SetPoint(m_pPathData->GetPointCount() - 1, + x + FXSYS_Mul(width, FXSYS_cos(start_angle)), + y + FXSYS_Mul(height, FXSYS_sin(start_angle)), FXPT_MOVETO); + FX_FLOAT total_sweep = 0, local_sweep = 0, prev_sweep = 0; + FX_BOOL done = FALSE; + do { + if (sweep_angle < 0) { + prev_sweep = total_sweep; + local_sweep = -FX_PI / 2; + total_sweep -= FX_PI / 2; + if (total_sweep <= sweep_angle + bezier_arc_angle_epsilon) { + local_sweep = sweep_angle - prev_sweep; + done = TRUE; + } + } else { + prev_sweep = total_sweep; + local_sweep = FX_PI / 2; + total_sweep += FX_PI / 2; + if (total_sweep >= sweep_angle - bezier_arc_angle_epsilon) { + local_sweep = sweep_angle - prev_sweep; + done = TRUE; + } + } + ArcTo(x, y, width, height, start_angle, local_sweep); + start_angle += local_sweep; + } while (!done); +#endif +} +void CFX_PathGenerator::AddPie(FX_FLOAT x, FX_FLOAT y, FX_FLOAT width, FX_FLOAT height, + FX_FLOAT start_angle, FX_FLOAT sweep_angle) +{ + if (sweep_angle == 0) { + int old_count = m_pPathData->GetPointCount(); + m_pPathData->AddPointCount(2); + m_pPathData->SetPoint(old_count, x, y, FXPT_MOVETO); + m_pPathData->SetPoint(old_count + 1, + x + FXSYS_Mul(width, FXSYS_cos(start_angle)), + y + FXSYS_Mul(height, FXSYS_sin(start_angle)), FXPT_LINETO); + return; + } + AddArc(x, y, width, height, start_angle, sweep_angle); + m_pPathData->AddPointCount(1); + m_pPathData->SetPoint(m_pPathData->GetPointCount() - 1, x, y, FXPT_LINETO | FXPT_CLOSEFIGURE); +} diff --git a/xfa/src/fxgraphics/src/fx_path_generator.h b/xfa/src/fxgraphics/src/fx_path_generator.h new file mode 100644 index 0000000000..c1447f6c3a --- /dev/null +++ b/xfa/src/fxgraphics/src/fx_path_generator.h @@ -0,0 +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 __H_FX_PATH_GENERATOR__ +#define __H_FX_PATH_GENERATOR__ +class CFX_PathGenerator : public CFX_Object +{ +public: + CFX_PathGenerator(); + void Create(); + ~CFX_PathGenerator(); + CFX_PathData *GetPathData() const + { + return m_pPathData; + } + void AddPathData(CFX_PathData *path_data); + void AddPathData(FX_PATHPOINT *points, int count); + void MoveTo(FX_FLOAT x, FX_FLOAT y); + void LineTo(FX_FLOAT x, FX_FLOAT y); + void BezierTo(FX_FLOAT ctrl_x1, FX_FLOAT ctrl_y1, + FX_FLOAT ctrl_x2, FX_FLOAT ctrl_y2, FX_FLOAT to_x, FX_FLOAT to_y); + void Close(); + void ArcTo(FX_FLOAT x, FX_FLOAT y, FX_FLOAT width, FX_FLOAT height, + FX_FLOAT start_angle, FX_FLOAT sweep_angle); + + void AddLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2); + void AddBezier(FX_FLOAT start_x, FX_FLOAT start_y, + FX_FLOAT ctrl_x1, FX_FLOAT ctrl_y1, FX_FLOAT ctrl_x2, FX_FLOAT ctrl_y2, + FX_FLOAT end_x, FX_FLOAT end_y); + void AddRectangle(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2); + void AddEllipse(FX_FLOAT x, FX_FLOAT y, FX_FLOAT width, FX_FLOAT height); + void AddArc(FX_FLOAT x, FX_FLOAT y, FX_FLOAT width, FX_FLOAT height, + FX_FLOAT start_angle, FX_FLOAT sweep_angle); + void AddPie(FX_FLOAT x, FX_FLOAT y, FX_FLOAT width, FX_FLOAT height, + FX_FLOAT start_angle, FX_FLOAT sweep_angle); +protected: + CFX_PathData *m_pPathData; +}; +#endif diff --git a/xfa/src/fxgraphics/src/pre.h b/xfa/src/fxgraphics/src/pre.h new file mode 100644 index 0000000000..dc82b35a74 --- /dev/null +++ b/xfa/src/fxgraphics/src/pre.h @@ -0,0 +1,115 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../foxitlib.h" +#ifndef FXSYS_Mul +#define FXSYS_Mul(a, b) ((a) * (b)) +#define FXSYS_Div(a, b) ((a) / (b)) +#define FXSYS_MulDiv(a, b, c) ((a) * (b) / (c)) +#define FXSYS_sqrt2(a, b) (FX_FLOAT)FXSYS_sqrt((a)*(a) + (b)*(b)) +#endif +enum { + FX_CONTEXT_None = 0, + FX_CONTEXT_Device, +}; +enum { + FX_COLOR_None = 0, + FX_COLOR_Solid, + FX_COLOR_Pattern, + FX_COLOR_Shading +}; +enum { + FX_PATTERN_None = 0, + FX_PATTERN_Bitmap, + FX_PATTERN_Hatch +}; +enum { + FX_SHADING_None = 0, + FX_SHADING_Axial, + FX_SHADING_Radial +}; +#define FX_HATCHSTYLE_Total 53 +struct FX_HATCHDATA { + FX_INT32 width; + FX_INT32 height; + FX_BYTE maskBits[64]; +}; +typedef FX_HATCHDATA const * FX_LPCHATCHDATA; +static const FX_HATCHDATA hatchBitmapData[FX_HATCHSTYLE_Total] = { + {16, 16, {0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}}, + {16, 16, {0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,}}, + {16, 16, {0x80, 0x80, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,}}, + {16, 16, {0x01, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,}}, + {16, 16, {0xff, 0xff, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,}}, + {16, 16, {0x81, 0x81, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00,}}, + {16, 16, {0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}}, + {16, 16, {0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}}, + {16, 16, {0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}}, + {16, 16, {0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,}}, + {16, 16, {0xaa, 0xaa, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00,}}, + {16, 16, {0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x51, 0x51, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x15, 0x15, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x51, 0x51, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x15, 0x15, 0x00, 0x00,}}, + {16, 16, {0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,}}, + {16, 16, {0xee, 0xee, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xbb, 0xbb, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xee, 0xee, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xbb, 0xbb, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xee, 0xee, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xbb, 0xbb, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xee, 0xee, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xbb, 0xbb, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,}}, + {16, 16, {0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00,}}, + {16, 16, {0x77, 0x77, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,}}, + {16, 16, {0xef, 0xef, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xef, 0xef, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xef, 0xef, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xef, 0xef, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,}}, + {16, 16, {0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xf7, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xf7, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x00,}}, + {16, 16, {0x88, 0x88, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00,}}, + {16, 16, {0x11, 0x11, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,}}, + {16, 16, {0xcc, 0xcc, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00,}}, + {16, 16, {0x33, 0x33, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00,}}, + {16, 16, {0xc1, 0xc1, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x83, 0x83, 0x00, 0x00, 0xc1, 0xc1, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x83, 0x83, 0x00, 0x00,}}, + {16, 16, {0x83, 0x83, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, 0xc1, 0xc1, 0x00, 0x00, 0x83, 0x83, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, 0xc1, 0xc1, 0x00, 0x00,}}, + {16, 16, {0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,}}, + {16, 16, {0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}}, + {16, 16, {0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,}}, + {16, 16, {0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}}, + {16, 16, {0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,}}, + {16, 16, {0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}}, + {16, 16, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}}, + {16, 16, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}}, + {16, 16, {0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}}, + {16, 16, {0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,}}, + {16, 16, {0x80, 0x80, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00,}}, + {16, 16, {0xb1, 0xb1, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x1b, 0x1b, 0x00, 0x00, 0xd8, 0xd8, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x8d, 0x8d, 0x00, 0x00, 0xb1, 0xb1, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x1b, 0x1b, 0x00, 0x00, 0xd8, 0xd8, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x8d, 0x8d, 0x00, 0x00,}}, + {16, 16, {0x81, 0x81, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,}}, + {16, 16, {0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x25, 0x25, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x25, 0x25, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x25, 0x25, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x25, 0x25, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00,}}, + {16, 16, {0x01, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00,}}, + {16, 16, {0xff, 0xff, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,}}, + {16, 16, {0x88, 0x88, 0x00, 0x00, 0x54, 0x54, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x45, 0x45, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x14, 0x14, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x51, 0x51, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x54, 0x54, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x45, 0x45, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x14, 0x14, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x51, 0x51, 0x00, 0x00,}}, + {16, 16, {0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00,}}, + {16, 16, {0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,}}, + {16, 16, {0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}}, + {16, 16, {0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}}, + {16, 16, {0x03, 0x03, 0x00, 0x00, 0x84, 0x84, 0x00, 0x00, 0x48, 0x48, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x84, 0x84, 0x00, 0x00, 0x48, 0x48, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,}}, + {16, 16, {0xff, 0xff, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00,}}, + {16, 16, {0x77, 0x77, 0x00, 0x00, 0x89, 0x89, 0x00, 0x00, 0x8f, 0x8f, 0x00, 0x00, 0x8f, 0x8f, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0x98, 0x98, 0x00, 0x00, 0xf8, 0xf8, 0x00, 0x00, 0xf8, 0xf8, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0x89, 0x89, 0x00, 0x00, 0x8f, 0x8f, 0x00, 0x00, 0x8f, 0x8f, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0x98, 0x98, 0x00, 0x00, 0xf8, 0xf8, 0x00, 0x00, 0xf8, 0xf8, 0x00, 0x00,}}, + {16, 16, {0xff, 0xff, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,}}, + {16, 16, {0x99, 0x99, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00,}}, + {16, 16, {0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00,}}, + {16, 16, {0x82, 0x82, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x28, 0x28, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x28, 0x28, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x82, 0x82, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x82, 0x82, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x28, 0x28, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x28, 0x28, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x82, 0x82, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,}}, + {16, 16, {0x10, 0x10, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x7c, 0x7c, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0x7c, 0x7c, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x7c, 0x7c, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0x7c, 0x7c, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}}, +}; +#if defined (__WIN32__) || defined (_WIN32) +#define FX_START_TIMER SYSTEMTIME start, stop; \ + ::GetLocalTime(&start); +#define FX_STOP_TIMER ::GetLocalTime(&stop); \ + WORD wSecond = stop.wSecond - start.wSecond; \ + WORD wMilliseconds = stop.wMilliseconds - start.wMilliseconds; \ + char buf[256]; \ + sprintf(buf, "duration is %d millisecond\n", wSecond * 1000 + wMilliseconds); \ + ::OutputDebugString(buf); +#elif defined (__linux) || defined (linux) +#define FX_START_TIMER +#define FX_STOP_TIMER +#elif defined (__APPLE__) || defined (__MACOSX__) +#define FX_START_TIMER NSTimeInterval start, stop; \ + start = [NSDate timeIntervalSinceReferenceDate]; +#define FX_STOP_TIMER stop = [NSDate timeIntervalSinceReferenceDate]; \ + NSTimeInterval duration = stop - start; \ + printf("duration is %f millisecond\n", duration * 1000); +#else +#endif diff --git a/xfa/src/fxjse/src/class.cpp b/xfa/src/fxjse/src/class.cpp new file mode 100644 index 0000000000..326e8d47c2 --- /dev/null +++ b/xfa/src/fxjse/src/class.cpp @@ -0,0 +1,268 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../foxitlib.h" +#include "fxv8.h" +#include "context.h" +#include "class.h" +#include "value.h" +#include "scope_inline.h" +#include "util_inline.h" +static void FXJSE_V8ConstructorCallback_Wrapper(const v8::FunctionCallbackInfo& info); +static void FXJSE_V8FunctionCallback_Wrapper(const v8::FunctionCallbackInfo& info); +static void FXJSE_V8GetterCallback_Wrapper(v8::Local property, const v8::PropertyCallbackInfo& info); +static void FXJSE_V8SetterCallback_Wrapper(v8::Local property, v8::Local value, const v8::PropertyCallbackInfo& info); +void FXJSE_DefineFunctions(FXJSE_HCONTEXT hContext, const FXJSE_FUNCTION* lpFunctions, int nNum) +{ + CFXJSE_Context* lpContext = reinterpret_cast(hContext); + ASSERT(lpContext); + CFXJSE_ScopeUtil_IsolateHandleContext scope(lpContext); + v8::Isolate *pIsolate = lpContext->GetRuntime(); + v8::Handle hGlobalObject = FXJSE_GetGlobalObjectFromContext(scope.GetLocalContext()); + for(FX_INT32 i = 0; i < nNum; i++) { + hGlobalObject->ForceSet(v8::String::NewFromUtf8(pIsolate, lpFunctions[i].name), + v8::Function::New(pIsolate, FXJSE_V8FunctionCallback_Wrapper, v8::External::New(pIsolate, const_cast(lpFunctions + i))), + static_cast(v8::ReadOnly | v8::DontDelete)); + } +} +FXJSE_HCLASS FXJSE_DefineClass(FXJSE_HCONTEXT hContext, const FXJSE_CLASS* lpClass) +{ + CFXJSE_Context* lpContext = reinterpret_cast(hContext); + ASSERT(lpContext); + return reinterpret_cast(CFXJSE_Class::Create(lpContext, lpClass, FALSE)); +} +FXJSE_HCLASS FXJSE_GetClass(FXJSE_HCONTEXT hContext, FX_BSTR szName) +{ + return reinterpret_cast(CFXJSE_Class::GetClassFromContext(reinterpret_cast(hContext), szName)); +} +static void FXJSE_V8FunctionCallback_Wrapper(const v8::FunctionCallbackInfo& info) +{ + const FXJSE_FUNCTION* lpFunctionInfo = static_cast(info.Data().As()->Value()); + if (!lpFunctionInfo) { + return; + } + CFX_ByteStringC szFunctionName(lpFunctionInfo->name); + CFXJSE_Value* lpThisValue = CFXJSE_Value::Create(info.GetIsolate()); + lpThisValue->ForceSetValue(info.This()); + CFXJSE_Value* lpRetValue = CFXJSE_Value::Create(info.GetIsolate()); + CFXJSE_ArgumentsImpl impl = {&info, lpRetValue}; + lpFunctionInfo->callbackProc(reinterpret_cast(lpThisValue), szFunctionName, reinterpret_cast(impl)); + if(!lpRetValue->DirectGetValue().IsEmpty()) { + info.GetReturnValue().Set(lpRetValue->DirectGetValue()); + } + delete lpRetValue; + lpRetValue = NULL; + delete lpThisValue; + lpThisValue = NULL; +} +static void FXJSE_V8ClassGlobalConstructorCallback_Wrapper(const v8::FunctionCallbackInfo& info) +{ + const FXJSE_CLASS* lpClassDefinition = static_cast(info.Data().As()->Value()); + if (!lpClassDefinition) { + return; + } + CFX_ByteStringC szFunctionName(lpClassDefinition->name); + CFXJSE_Value* lpThisValue = CFXJSE_Value::Create(info.GetIsolate()); + lpThisValue->ForceSetValue(info.This()); + CFXJSE_Value* lpRetValue = CFXJSE_Value::Create(info.GetIsolate()); + CFXJSE_ArgumentsImpl impl = {&info, lpRetValue}; + lpClassDefinition->constructor(reinterpret_cast(lpThisValue), szFunctionName, reinterpret_cast(impl)); + if(!lpRetValue->DirectGetValue().IsEmpty()) { + info.GetReturnValue().Set(lpRetValue->DirectGetValue()); + } + delete lpRetValue; + lpRetValue = NULL; + delete lpThisValue; + lpThisValue = NULL; +} +static void FXJSE_V8GetterCallback_Wrapper(v8::Local property, const v8::PropertyCallbackInfo& info) +{ + const FXJSE_PROPERTY* lpPropertyInfo = static_cast(info.Data().As()->Value()); + if (!lpPropertyInfo) { + return; + } + CFX_ByteStringC szPropertyName(lpPropertyInfo->name); + CFXJSE_Value* lpThisValue = CFXJSE_Value::Create(info.GetIsolate()); + CFXJSE_Value* lpPropValue = CFXJSE_Value::Create(info.GetIsolate()); + lpThisValue->ForceSetValue(info.This()); + lpPropertyInfo->getProc(reinterpret_cast(lpThisValue), szPropertyName, reinterpret_cast(lpPropValue)); + info.GetReturnValue().Set(lpPropValue->DirectGetValue()); + delete lpThisValue; + lpThisValue = NULL; + delete lpPropValue; + lpPropValue = NULL; +} +static void FXJSE_V8SetterCallback_Wrapper(v8::Local property, v8::Local value, const v8::PropertyCallbackInfo& info) +{ + const FXJSE_PROPERTY* lpPropertyInfo = static_cast(info.Data().As()->Value()); + if (!lpPropertyInfo) { + return; + } + CFX_ByteStringC szPropertyName(lpPropertyInfo->name); + CFXJSE_Value* lpThisValue = CFXJSE_Value::Create(info.GetIsolate()); + CFXJSE_Value* lpPropValue = CFXJSE_Value::Create(info.GetIsolate()); + lpThisValue->ForceSetValue(info.This()); + lpPropValue->ForceSetValue(value); + lpPropertyInfo->setProc(reinterpret_cast(lpThisValue), szPropertyName, reinterpret_cast(lpPropValue)); + delete lpThisValue; + lpThisValue = NULL; + delete lpPropValue; + lpPropValue = NULL; +} +static void FXJSE_V8ConstructorCallback_Wrapper(const v8::FunctionCallbackInfo& info) +{ + const FXJSE_CLASS* lpClassDefinition = static_cast(info.Data().As()->Value()); + if (!lpClassDefinition) { + return; + } + FXSYS_assert(info.This()->InternalFieldCount()); + info.This()->SetAlignedPointerInInternalField(0, NULL); + CFXJSE_Value* lpThisValue = CFXJSE_Value::Create(info.GetIsolate()); + lpThisValue->ForceSetValue(info.This()); + if(lpClassDefinition->dynMethodCall || lpClassDefinition->dynPropGetter || lpClassDefinition->dynPropSetter || lpClassDefinition->dynPropTypeGetter) { + CFXJSE_Class::SetUpDynPropHandler(NULL, lpThisValue, lpClassDefinition); + } + delete lpThisValue; + lpThisValue = NULL; +} +FXJSE_HRUNTIME CFXJSE_Arguments::GetRuntime() const +{ + const CFXJSE_ArgumentsImpl* lpArguments = reinterpret_cast(this); + return reinterpret_cast(lpArguments->m_pRetValue->GetIsolate()); +} +FX_INT32 CFXJSE_Arguments::GetLength() const +{ + const CFXJSE_ArgumentsImpl* lpArguments = reinterpret_cast(this); + return lpArguments->m_pInfo->Length(); +} +FXJSE_HVALUE CFXJSE_Arguments::GetValue(FX_INT32 index) const +{ + const CFXJSE_ArgumentsImpl* lpArguments = reinterpret_cast(this); + CFXJSE_Value* lpArgValue = CFXJSE_Value::Create(v8::Isolate::GetCurrent()); + ASSERT(lpArgValue); + lpArgValue->ForceSetValue((*lpArguments->m_pInfo)[index]); + return reinterpret_cast(lpArgValue); +} +FX_BOOL CFXJSE_Arguments::GetBoolean(FX_INT32 index) const +{ + const CFXJSE_ArgumentsImpl* lpArguments = reinterpret_cast(this); + return (*lpArguments->m_pInfo)[index]->BooleanValue() ? TRUE : FALSE; +} +FX_INT32 CFXJSE_Arguments::GetInt32(FX_INT32 index) const +{ + const CFXJSE_ArgumentsImpl* lpArguments = reinterpret_cast(this); + return static_cast((*lpArguments->m_pInfo)[index]->NumberValue()); +} +FX_FLOAT CFXJSE_Arguments::GetFloat(FX_INT32 index) const +{ + const CFXJSE_ArgumentsImpl* lpArguments = reinterpret_cast(this); + return static_cast((*lpArguments->m_pInfo)[index]->NumberValue()); +} +CFX_ByteString CFXJSE_Arguments::GetUTF8String(FX_INT32 index) const +{ + const CFXJSE_ArgumentsImpl* lpArguments = reinterpret_cast(this); + v8::Handle hString = (*lpArguments->m_pInfo)[index]->ToString(); + v8::String::Utf8Value szStringVal(hString); + return CFX_ByteString(*szStringVal); +} +FX_LPVOID CFXJSE_Arguments::GetObject(FX_INT32 index, FXJSE_HCLASS hClass ) const +{ + const CFXJSE_ArgumentsImpl* lpArguments = reinterpret_cast(this); + v8::Handle hValue = (*lpArguments->m_pInfo)[index]; + ASSERT(!hValue.IsEmpty()); + if(!hValue->IsObject()) { + return NULL; + } + CFXJSE_Class* lpClass = reinterpret_cast(hClass); + return FXJSE_RetrieveObjectBinding(hValue.As(), lpClass); +} +FXJSE_HVALUE CFXJSE_Arguments::GetReturnValue() +{ + const CFXJSE_ArgumentsImpl* lpArguments = reinterpret_cast(this); + return reinterpret_cast(lpArguments->m_pRetValue); +} +static void FXJSE_Context_GlobalObjToString(const v8::FunctionCallbackInfo& info) +{ + const FXJSE_CLASS* lpClass = static_cast(info.Data().As()->Value()); + if (!lpClass) { + return; + } + if(info.This() == info.Holder() && lpClass->name) { + CFX_ByteString szStringVal; + szStringVal.Format("[object %s]", lpClass->name); + info.GetReturnValue().Set(v8::String::NewFromUtf8(info.GetIsolate(), (FX_LPCSTR)szStringVal, v8::String::kNormalString, szStringVal.GetLength())); + } else { + info.GetReturnValue().Set(info.This()->ObjectProtoToString()); + } +} +CFXJSE_Class* CFXJSE_Class::Create(CFXJSE_Context* lpContext, const FXJSE_CLASS* lpClassDefinition, FX_BOOL bIsJSGlobal ) +{ + if(!lpContext || !lpClassDefinition) { + return NULL; + } + CFXJSE_Class* pClass = GetClassFromContext(lpContext, lpClassDefinition->name); + if(pClass) { + return pClass; + } + v8::Isolate* pIsolate = lpContext->m_pIsolate; + pClass = FX_NEW CFXJSE_Class(lpContext); + ASSERT(pClass); + pClass->m_szClassName = lpClassDefinition->name; + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(pIsolate); + v8::Local hFunctionTemplate = v8::FunctionTemplate::New(pIsolate, bIsJSGlobal ? 0 : FXJSE_V8ConstructorCallback_Wrapper, v8::External::New(pIsolate, const_cast(lpClassDefinition))); + hFunctionTemplate->SetClassName(v8::String::NewFromUtf8(pIsolate, lpClassDefinition->name)); + hFunctionTemplate->InstanceTemplate()->SetInternalFieldCount(1); + v8::Local hObjectTemplate = hFunctionTemplate->InstanceTemplate(); + if (lpClassDefinition->dynPropDeleter || lpClassDefinition->dynPropTypeGetter) { + SetUpNamedPropHandler(pIsolate, hObjectTemplate, lpClassDefinition); + } + if(lpClassDefinition->propNum) { + for(FX_INT32 i = 0; i < lpClassDefinition->propNum; i++) { + hObjectTemplate->SetNativeDataProperty(v8::String::NewFromUtf8(pIsolate, lpClassDefinition->properties[i].name), + lpClassDefinition->properties[i].getProc ? FXJSE_V8GetterCallback_Wrapper : NULL, + lpClassDefinition->properties[i].setProc ? FXJSE_V8SetterCallback_Wrapper : NULL, + v8::External::New(pIsolate, const_cast(lpClassDefinition->properties + i)), + static_cast(v8::DontDelete)); + } + } + if(lpClassDefinition->methNum) { + for(FX_INT32 i = 0; i < lpClassDefinition->methNum; i++) { + hObjectTemplate->Set(v8::String::NewFromUtf8(pIsolate, lpClassDefinition->methods[i].name), + v8::FunctionTemplate::New(pIsolate, FXJSE_V8FunctionCallback_Wrapper, + v8::External::New(pIsolate, const_cast(lpClassDefinition->methods + i))), + static_cast(v8::ReadOnly | v8::DontDelete)); + } + } + if(lpClassDefinition->constructor) { + if(bIsJSGlobal) { + hObjectTemplate->Set(v8::String::NewFromUtf8(pIsolate, lpClassDefinition->name), + v8::FunctionTemplate::New(pIsolate, FXJSE_V8ClassGlobalConstructorCallback_Wrapper, + v8::External::New(pIsolate, const_cast(lpClassDefinition))), + static_cast(v8::ReadOnly | v8::DontDelete)); + } else { + v8::Local hLocalContext = v8::Local::New(pIsolate, lpContext->m_hContext); + FXJSE_GetGlobalObjectFromContext(hLocalContext)->Set(v8::String::NewFromUtf8(pIsolate, lpClassDefinition->name), + v8::Function::New(pIsolate, FXJSE_V8ClassGlobalConstructorCallback_Wrapper, + v8::External::New(pIsolate, const_cast(lpClassDefinition)))); + } + } + if(bIsJSGlobal) { + hObjectTemplate->Set(v8::String::NewFromUtf8(pIsolate, "toString"), v8::FunctionTemplate::New(pIsolate, FXJSE_Context_GlobalObjToString, v8::External::New(pIsolate, const_cast(lpClassDefinition)))); + } + pClass->m_hTemplate.Reset(lpContext->m_pIsolate, hFunctionTemplate); + lpContext->m_rgClasses.Add(pClass); + return pClass; +} +CFXJSE_Class* CFXJSE_Class::GetClassFromContext(CFXJSE_Context* pContext, FX_BSTR szName) +{ + for(int count = pContext->m_rgClasses.GetSize(), i = 0; i < count; i++) { + CFXJSE_Class* pClass = pContext->m_rgClasses[i]; + if(pClass->m_szClassName == szName) { + return pClass; + } + } + return NULL; +} diff --git a/xfa/src/fxjse/src/class.h b/xfa/src/fxjse/src/class.h new file mode 100644 index 0000000000..6a0f89fc72 --- /dev/null +++ b/xfa/src/fxjse/src/class.h @@ -0,0 +1,40 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 FXJSE_CLASS_H_ +#define FXJSE_CLASS_H_ +class CFXJSE_Context; +class CFXJSE_Value; +class CFXJSE_Class : public CFX_Object +{ +protected: + CFXJSE_Class(CFXJSE_Context* lpContext) : m_pContext(lpContext) {} +public: + inline CFXJSE_Context* GetContext() + { + return m_pContext; + } + inline v8::Persistent& GetTemplate() + { + return m_hTemplate; + } +public: + static CFXJSE_Class* Create(CFXJSE_Context* pContext, const FXJSE_CLASS* lpClassDefintion, FX_BOOL bIsJSGlobal = FALSE); + static CFXJSE_Class* GetClassFromContext(CFXJSE_Context* pContext, FX_BSTR szName); + static void SetUpDynPropHandler(CFXJSE_Context* pContext, CFXJSE_Value* pValue, const FXJSE_CLASS* lpClassDefinition); + static void SetUpNamedPropHandler(v8::Isolate* pIsolate, v8::Local& hObjectTemplate, const FXJSE_CLASS* lpClassDefinition); +protected: + CFX_ByteString m_szClassName; + CFXJSE_Context* m_pContext; + v8::Persistent m_hTemplate; + friend class CFXJSE_Context; + friend class CFXJSE_Value; +}; +struct CFXJSE_ArgumentsImpl { + const v8::FunctionCallbackInfo* m_pInfo; + CFXJSE_Value* m_pRetValue; +}; +#endif diff --git a/xfa/src/fxjse/src/context.cpp b/xfa/src/fxjse/src/context.cpp new file mode 100644 index 0000000000..f2d979ee55 --- /dev/null +++ b/xfa/src/fxjse/src/context.cpp @@ -0,0 +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 "../../foxitlib.h" +#include "fxv8.h" +#include "context.h" +#include "class.h" +#include "value.h" +#include "scope_inline.h" +#include "util_inline.h" +FXJSE_HCONTEXT FXJSE_Context_Create(FXJSE_HRUNTIME hRuntime, const FXJSE_CLASS* lpGlobalClass , FX_LPVOID lpGlobalObject ) +{ + CFXJSE_Context* pContext = CFXJSE_Context::Create(reinterpret_cast(hRuntime), lpGlobalClass, lpGlobalObject); + return reinterpret_cast(pContext); +} +void FXJSE_Context_Release(FXJSE_HCONTEXT hContext) +{ + CFXJSE_Context* pContext = reinterpret_cast(hContext); + if(pContext) { + delete pContext; + } +} +FXJSE_HVALUE FXJSE_Context_GetGlobalObject(FXJSE_HCONTEXT hContext) +{ + CFXJSE_Context* pContext = reinterpret_cast(hContext); + if(!pContext) { + return NULL; + } + CFXJSE_Value* lpValue = CFXJSE_Value::Create(pContext->GetRuntime()); + ASSERT(lpValue); + pContext->GetGlobalObject(lpValue); + return reinterpret_cast(lpValue); +} +FXJSE_HRUNTIME FXJSE_Context_GetRuntime(FXJSE_HCONTEXT hContext) +{ + CFXJSE_Context* pContext = reinterpret_cast(hContext); + return pContext ? reinterpret_cast(pContext->GetRuntime()) : NULL; +} +static FX_LPCSTR szCompatibleModeScripts[] = { + "(function (global, list) { 'use strict'; var objname; for (objname in list) { var globalobj = global[objname];\n\ + if (globalobj) { list[objname].forEach( function (name) { if (!globalobj[name]) { Object.defineProperty(globalobj, name, {writable: true, enumerable: false, value: \n\ + (function (obj) {\n\ + if (arguments.length === 0) {\n\ + throw new TypeError('missing argument 0 when calling function ' + objname + '.' + name);\n\ + }\n\ + return globalobj.prototype[name].apply(obj, Array.prototype.slice.call(arguments, 1));\n\ +})});}});}}}(this, {String: ['substr', 'toUpperCase']}));", +}; +void FXJSE_Context_EnableCompatibleMode(FXJSE_HCONTEXT hContext, FX_DWORD dwCompatibleFlags) +{ + for (FX_UINT32 i = 0; i < (FX_UINT32)FXJSE_COMPATIBLEMODEFLAGCOUNT; i++) { + if (dwCompatibleFlags & (1 << i)) { + FXJSE_ExecuteScript(hContext, szCompatibleModeScripts[i], NULL, NULL); + } + } +} +FX_BOOL FXJSE_ExecuteScript(FXJSE_HCONTEXT hContext, FX_LPCSTR szScript, FXJSE_HVALUE hRetValue, FXJSE_HVALUE hNewThisObject ) +{ + CFXJSE_Context* pContext = reinterpret_cast(hContext); + ASSERT(pContext); + return pContext->ExecuteScript(szScript, reinterpret_cast(hRetValue), reinterpret_cast(hNewThisObject)); +} +v8::Handle FXJSE_CreateReturnValue(v8::Isolate* pIsolate, v8::TryCatch& trycatch) +{ + v8::Handle hReturnValue = v8::Object::New(pIsolate); + if (trycatch.HasCaught()) { + v8::Handle hException = trycatch.Exception(); + v8::Handle hMessage = trycatch.Message(); + if (hException->IsObject()) { + v8::Local hValue; + hValue = hException.As()->Get(v8::String::NewFromUtf8(pIsolate, "name")); + if(hValue->IsString() || hValue->IsStringObject()) { + hReturnValue->Set(0, hValue); + } else { + hReturnValue->Set(0, v8::String::NewFromUtf8(pIsolate, "Error")); + } + hValue = hException.As()->Get(v8::String::NewFromUtf8(pIsolate, "message")); + if(hValue->IsString() || hValue->IsStringObject()) { + hReturnValue->Set(1, hValue); + } else { + hReturnValue->Set(1, hMessage->Get()); + } + } else { + hReturnValue->Set(0, v8::String::NewFromUtf8(pIsolate, "Error")); + hReturnValue->Set(1, hMessage->Get()); + } + hReturnValue->Set(2, hException); + hReturnValue->Set(3, v8::Integer::New(pIsolate, hMessage->GetLineNumber())); + hReturnValue->Set(4, hMessage->GetSourceLine()); + hReturnValue->Set(5, v8::Integer::New(pIsolate, hMessage->GetStartColumn())); + hReturnValue->Set(6, v8::Integer::New(pIsolate, hMessage->GetEndColumn())); + } + return hReturnValue; +} +FX_BOOL FXJSE_ReturnValue_GetMessage(FXJSE_HVALUE hRetValue, CFX_ByteString& utf8Name, CFX_ByteString& utf8Message) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hRetValue); + if(!lpValue) { + return FALSE; + } + v8::Isolate* pIsolate = lpValue->GetIsolate(); + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(pIsolate); + v8::Local hValue = v8::Local::New(pIsolate, lpValue->DirectGetValue()); + if(!hValue->IsObject()) { + return FALSE; + } + v8::String::Utf8Value hStringVal0(hValue.As()->Get(0)->ToString()); + utf8Name = *hStringVal0; + v8::String::Utf8Value hStringVal1(hValue.As()->Get(1)->ToString()); + utf8Message = *hStringVal1; + return TRUE; +} +FX_BOOL FXJSE_ReturnValue_GetLineInfo(FXJSE_HVALUE hRetValue, FX_INT32& nLine, FX_INT32& nCol) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hRetValue); + if(!lpValue) { + return FALSE; + } + v8::Isolate* pIsolate = lpValue->GetIsolate(); + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(pIsolate); + v8::Local hValue = v8::Local::New(pIsolate, lpValue->DirectGetValue()); + if(!hValue->IsObject()) { + return FALSE; + } + nLine = hValue.As()->Get(3)->ToInt32()->Value(); + nCol = hValue.As()->Get(5)->ToInt32()->Value(); + return TRUE; +} +CFXJSE_Context* CFXJSE_Context::Create(v8::Isolate* pIsolate, const FXJSE_CLASS* lpGlobalClass , FX_LPVOID lpGlobalObject ) +{ + CFXJSE_ScopeUtil_IsolateHandle scope(pIsolate); + CFXJSE_Context* pContext = FX_NEW CFXJSE_Context(pIsolate); + CFXJSE_Class* lpGlobalClassObj = NULL; + v8::Local hObjectTemplate; + if(lpGlobalClass) { + lpGlobalClassObj = CFXJSE_Class::Create(pContext, lpGlobalClass, TRUE); + ASSERT(lpGlobalClassObj); + v8::Local hFunctionTemplate = v8::Local::New(pIsolate, lpGlobalClassObj->m_hTemplate); + hObjectTemplate = hFunctionTemplate->InstanceTemplate(); + } else { + hObjectTemplate = v8::ObjectTemplate::New(); + hObjectTemplate->SetInternalFieldCount(1); + } + v8::Local hNewContext = v8::Context::New(pIsolate, NULL, hObjectTemplate); + v8::Local hRootContext = v8::Local::New(pIsolate, CFXJSE_RuntimeData::Get(pIsolate)->m_hRootContext); + hNewContext->SetSecurityToken(hRootContext->GetSecurityToken()); + v8::Local hGlobalObject = FXJSE_GetGlobalObjectFromContext(hNewContext); + FXJSE_UpdateObjectBinding(hGlobalObject, lpGlobalObject); + pContext->m_hContext.Reset(pIsolate, hNewContext); + if (lpGlobalClass) { + if(lpGlobalClass->dynMethodCall || lpGlobalClass->dynPropGetter || lpGlobalClass->dynPropSetter || lpGlobalClass->dynPropTypeGetter) { + CFXJSE_Value* lpThisValue = CFXJSE_Value::Create(pIsolate); + lpThisValue->ForceSetValue(hGlobalObject); + CFXJSE_Class::SetUpDynPropHandler(pContext, lpThisValue, lpGlobalClass); + delete lpThisValue; + lpThisValue = NULL; + } + } + return pContext; +} +CFXJSE_Context::~CFXJSE_Context() +{ + for(FX_INT32 i = 0, count = m_rgClasses.GetSize(); i < count; i++) { + CFXJSE_Class* pClass = m_rgClasses[i]; + if(pClass) { + delete pClass; + } + } + m_rgClasses.RemoveAll(); +} +void CFXJSE_Context::GetGlobalObject(CFXJSE_Value* pValue) +{ + ASSERT(pValue); + CFXJSE_ScopeUtil_IsolateHandleContext scope(this); + v8::Local hContext = v8::Local::New(m_pIsolate, m_hContext); + v8::Local hGlobalObject = hContext->Global(); + pValue->ForceSetValue(hGlobalObject); +} +FX_BOOL CFXJSE_Context::ExecuteScript(FX_LPCSTR szScript, CFXJSE_Value* lpRetValue, CFXJSE_Value* lpNewThisObject ) +{ + CFXJSE_ScopeUtil_IsolateHandleContext scope(this); + v8::TryCatch trycatch; + v8::Local hScriptString = v8::String::NewFromUtf8(m_pIsolate, szScript); + if(lpNewThisObject == NULL) { + v8::Local hScript = v8::Script::Compile(hScriptString); + if(!trycatch.HasCaught()) { + v8::Local hValue = hScript->Run(); + if(!trycatch.HasCaught()) { + if(lpRetValue) { + lpRetValue->m_hValue.Reset(m_pIsolate, hValue); + } + return TRUE; + } + } + if(lpRetValue) { + lpRetValue->m_hValue.Reset(m_pIsolate, FXJSE_CreateReturnValue(m_pIsolate, trycatch)); + } + return FALSE; + } else { + v8::Local hNewThis = v8::Local::New(m_pIsolate, lpNewThisObject->m_hValue); + ASSERT(!hNewThis.IsEmpty()); + v8::Local hWrapper = v8::Script::Compile(v8::String::NewFromUtf8(m_pIsolate, "(function () { return eval(arguments[0]); })")); + v8::Local hWrapperValue = hWrapper->Run(); + ASSERT(hWrapperValue->IsFunction()); + v8::Local hWrapperFn = hWrapperValue.As(); + if(!trycatch.HasCaught()) { + v8::Handle rgArgs[] = {hScriptString}; + v8::Local hValue = hWrapperFn->Call(hNewThis.As(), 1, rgArgs); + if(!trycatch.HasCaught()) { + if(lpRetValue) { + lpRetValue->m_hValue.Reset(m_pIsolate, hValue); + } + return TRUE; + } + } + if(lpRetValue) { + lpRetValue->m_hValue.Reset(m_pIsolate, FXJSE_CreateReturnValue(m_pIsolate, trycatch)); + } + return FALSE; + } +} diff --git a/xfa/src/fxjse/src/context.h b/xfa/src/fxjse/src/context.h new file mode 100644 index 0000000000..6579cd973a --- /dev/null +++ b/xfa/src/fxjse/src/context.h @@ -0,0 +1,37 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 FXJSE_CONTEXT_H_ +#define FXJSE_CONTEXT_H_ +class CFXJSE_Class; +class CFXJSE_Value; +class CFXJSE_Context : public CFX_Object +{ +protected: + CFXJSE_Context(v8::Isolate* pIsolate) : m_pIsolate(pIsolate) {} +public: + static CFXJSE_Context* Create(v8::Isolate* pIsolate, const FXJSE_CLASS* lpGlobalClass = NULL, FX_LPVOID lpGlobalObject = NULL); + ~CFXJSE_Context(); + V8_INLINE v8::Isolate* GetRuntime(void) + { + return m_pIsolate; + } + void GetGlobalObject(CFXJSE_Value* pValue); + FX_BOOL ExecuteScript(FX_LPCSTR szScript, CFXJSE_Value* lpRetValue, CFXJSE_Value* lpNewThisObject = NULL); +protected: + CFXJSE_Context(); + CFXJSE_Context(const CFXJSE_Context&); + CFXJSE_Context& operator = (const CFXJSE_Context&); +protected: + v8::Persistent m_hContext; + v8::Isolate* m_pIsolate; + CFX_ArrayTemplate m_rgClasses; + friend class CFXJSE_Class; + friend class CFXJSE_ScopeUtil_IsolateHandleContext; + friend class CFXJSE_ScopeUtil_IsolateHandleRootOrNormalContext; +}; +v8::Handle FXJSE_CreateReturnValue(v8::Isolate* pIsolate, v8::TryCatch& trycatch); +#endif diff --git a/xfa/src/fxjse/src/dynprop.cpp b/xfa/src/fxjse/src/dynprop.cpp new file mode 100644 index 0000000000..fd03dcf6fd --- /dev/null +++ b/xfa/src/fxjse/src/dynprop.cpp @@ -0,0 +1,284 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../foxitlib.h" +#include "fxv8.h" +#include "class.h" +#include "value.h" +static void FXJSE_DynPropGetterAdapter_MethodCallback (const v8::FunctionCallbackInfo& info) +{ + v8::Local hCallBackInfo = info.Data().As(); + FXJSE_CLASS* lpClass = static_cast(hCallBackInfo->GetAlignedPointerFromInternalField(0)); + v8::Local hPropName = hCallBackInfo->GetInternalField(1).As(); + ASSERT(lpClass && !hPropName.IsEmpty()); + v8::String::Utf8Value szPropName(hPropName); + CFX_ByteStringC szFxPropName = *szPropName; + CFXJSE_Value* lpThisValue = CFXJSE_Value::Create(info.GetIsolate()); + lpThisValue->ForceSetValue(info.This()); + CFXJSE_Value* lpRetValue = CFXJSE_Value::Create(info.GetIsolate()); + CFXJSE_ArgumentsImpl impl = {&info, lpRetValue}; + lpClass->dynMethodCall(reinterpret_cast(lpThisValue), szFxPropName, reinterpret_cast(impl)); + if(!lpRetValue->DirectGetValue().IsEmpty()) { + info.GetReturnValue().Set(lpRetValue->DirectGetValue()); + } + delete lpRetValue; + lpRetValue = NULL; + delete lpThisValue; + lpThisValue = NULL; +} +static void FXJSE_DynPropGetterAdapter (const FXJSE_CLASS* lpClass, FXJSE_HOBJECT hObject, FX_BSTR szPropName, FXJSE_HVALUE hValue) +{ + ASSERT(lpClass); + FX_INT32 nPropType = lpClass->dynPropTypeGetter == NULL ? FXJSE_ClassPropType_Property : lpClass->dynPropTypeGetter(hObject, szPropName, FALSE); + if(nPropType == FXJSE_ClassPropType_Property) { + if(lpClass->dynPropGetter) { + lpClass->dynPropGetter(hObject, szPropName, hValue); + } + } else if(nPropType == FXJSE_ClassPropType_Method) { + if(lpClass->dynMethodCall && hValue) { + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + v8::Isolate* pIsolate = lpValue->GetIsolate(); + v8::HandleScope hscope(pIsolate); + v8::Local hCallBackInfoTemplate = v8::ObjectTemplate::New(); + hCallBackInfoTemplate->SetInternalFieldCount(2); + v8::Local hCallBackInfo = hCallBackInfoTemplate->NewInstance(); + hCallBackInfo->SetAlignedPointerInInternalField(0, const_cast(lpClass)); + hCallBackInfo->SetInternalField(1, v8::String::NewFromUtf8(pIsolate, reinterpret_cast(szPropName.GetPtr()), v8::String::kNormalString, szPropName.GetLength())); + lpValue->ForceSetValue(v8::Function::New(lpValue->GetIsolate(), FXJSE_DynPropGetterAdapter_MethodCallback, hCallBackInfo)); + } + } +} +static void FXJSE_DynPropSetterAdapter (const FXJSE_CLASS* lpClass, FXJSE_HOBJECT hObject, FX_BSTR szPropName, FXJSE_HVALUE hValue) +{ + ASSERT(lpClass); + FX_INT32 nPropType = lpClass->dynPropTypeGetter == NULL ? FXJSE_ClassPropType_Property : lpClass->dynPropTypeGetter(hObject, szPropName, FALSE); + if(nPropType != FXJSE_ClassPropType_Method) { + if(lpClass->dynPropSetter) { + lpClass->dynPropSetter(hObject, szPropName, hValue); + } + } +} +static FX_BOOL FXJSE_DynPropQueryAdapter (const FXJSE_CLASS* lpClass, FXJSE_HOBJECT hObject, FX_BSTR szPropName) +{ + ASSERT(lpClass); + FX_INT32 nPropType = lpClass->dynPropTypeGetter == NULL ? FXJSE_ClassPropType_Property : lpClass->dynPropTypeGetter(hObject, szPropName, TRUE); + return nPropType != FXJSE_ClassPropType_None; +} +static FX_BOOL FXJSE_DynPropDeleterAdapter (const FXJSE_CLASS* lpClass, FXJSE_HOBJECT hObject, FX_BSTR szPropName) +{ + ASSERT(lpClass); + FX_INT32 nPropType = lpClass->dynPropTypeGetter == NULL ? FXJSE_ClassPropType_Property : lpClass->dynPropTypeGetter(hObject, szPropName, FALSE); + if(nPropType != FXJSE_ClassPropType_Method) { + if(lpClass->dynPropDeleter) { + return lpClass->dynPropDeleter(hObject, szPropName); + } else { + return nPropType == FXJSE_ClassPropType_Property ? FALSE : TRUE; + } + } + return FALSE; +} +static void FXJSE_V8ProxyCallback_getOwnPropertyDescriptor_getter(const v8::FunctionCallbackInfo& info) +{ + v8::Local hCallBackInfo = info.Data().As(); + FXJSE_CLASS* lpClass = static_cast(hCallBackInfo->GetAlignedPointerFromInternalField(0)); + v8::Local hPropName = hCallBackInfo->GetInternalField(1).As(); + ASSERT(lpClass && !hPropName.IsEmpty()); + v8::String::Utf8Value szPropName(hPropName); + CFX_ByteStringC szFxPropName = *szPropName; + CFXJSE_Value* lpThisValue = CFXJSE_Value::Create(info.GetIsolate()); + CFXJSE_Value* lpNewValue = CFXJSE_Value::Create(info.GetIsolate()); + lpThisValue->ForceSetValue(info.This()); + FXJSE_DynPropGetterAdapter(lpClass, reinterpret_cast(lpThisValue), szFxPropName, reinterpret_cast(lpNewValue)); + info.GetReturnValue().Set(lpNewValue->DirectGetValue()); + delete lpThisValue; + lpThisValue = NULL; + delete lpNewValue; + lpNewValue = NULL; +} +static void FXJSE_V8ProxyCallback_getOwnPropertyDescriptor_setter(const v8::FunctionCallbackInfo& info) +{ + v8::Local hCallBackInfo = info.Data().As(); + FXJSE_CLASS* lpClass = static_cast(hCallBackInfo->GetAlignedPointerFromInternalField(0)); + v8::Local hPropName = hCallBackInfo->GetInternalField(1).As(); + ASSERT(lpClass && !hPropName.IsEmpty()); + v8::String::Utf8Value szPropName(hPropName); + CFX_ByteStringC szFxPropName = *szPropName; + CFXJSE_Value* lpThisValue = CFXJSE_Value::Create(info.GetIsolate()); + CFXJSE_Value* lpNewValue = CFXJSE_Value::Create(info.GetIsolate()); + lpThisValue->ForceSetValue(info.This()); + lpNewValue->ForceSetValue(info[0]); + FXJSE_DynPropSetterAdapter(lpClass, reinterpret_cast(lpThisValue), szFxPropName, reinterpret_cast(lpNewValue)); + delete lpThisValue; + lpThisValue = NULL; + delete lpNewValue; + lpNewValue = NULL; +} +static void FXJSE_V8ProxyCallback_getOwnPropertyDescriptor (const v8::FunctionCallbackInfo& info) +{ + const FXJSE_CLASS* lpClass = static_cast(info.Data().As()->Value()); + if (!lpClass) { + return; + } + v8::Isolate* pIsolate = info.GetIsolate(); + v8::HandleScope scope(pIsolate); + v8::Local hPropName = info[0]->ToString(); + v8::String::Utf8Value szPropName(hPropName); + CFX_ByteStringC szFxPropName(*szPropName, szPropName.length()); + v8::Local hCallBackInfoTemplate = v8::ObjectTemplate::New(); + hCallBackInfoTemplate->SetInternalFieldCount(2); + v8::Local hCallBackInfo = hCallBackInfoTemplate->NewInstance(); + hCallBackInfo->SetAlignedPointerInInternalField(0, const_cast(lpClass)); + hCallBackInfo->SetInternalField(1, hPropName); + v8::Local hPropDescriptor = v8::Object::New(pIsolate); + hPropDescriptor->ForceSet(v8::String::NewFromUtf8(pIsolate, "get"), v8::Function::New(pIsolate, FXJSE_V8ProxyCallback_getOwnPropertyDescriptor_getter, hCallBackInfo)); + hPropDescriptor->ForceSet(v8::String::NewFromUtf8(pIsolate, "set"), v8::Function::New(pIsolate, FXJSE_V8ProxyCallback_getOwnPropertyDescriptor_setter, hCallBackInfo)); + hPropDescriptor->ForceSet(v8::String::NewFromUtf8(pIsolate, "enumerable"), v8::Boolean::New(pIsolate, false)); + hPropDescriptor->ForceSet(v8::String::NewFromUtf8(pIsolate, "configurable"), v8::Boolean::New(pIsolate, true)); + info.GetReturnValue().Set(hPropDescriptor); +} +static void FXJSE_V8ProxyCallback_getPropertyDescriptor (const v8::FunctionCallbackInfo& info) +{ + v8::Isolate* pIsolate = info.GetIsolate(); + v8::Local hChainObj = info.This()->GetPrototype().As(); + v8::Local fnSource = v8::Script::Compile(v8::String::NewFromUtf8(pIsolate, + "(function (o, name) { var fn, x, d; fn = Object.getOwnPropertyDescriptor; x = o; while(x && !(d = fn(x, name))){x = x.__proto__;} return d; })")); + v8::Local fn = fnSource->Run().As(); + v8::Handle rgArgs[] = {hChainObj, info[0]}; + v8::Local hChainDescriptor = fn->Call(info.This(), 2, rgArgs); + if(!hChainDescriptor.IsEmpty() && hChainDescriptor->IsObject()) { + info.GetReturnValue().Set(hChainDescriptor); + } else { + FXJSE_V8ProxyCallback_getOwnPropertyDescriptor(info); + } +} +static void FXJSE_V8ProxyCallback_getOwnPropertyNames (const v8::FunctionCallbackInfo& info) +{ + v8::Isolate* pIsolate = info.GetIsolate(); + v8::HandleScope scope(pIsolate); + info.GetReturnValue().Set(v8::Array::New(pIsolate)); +} +static void FXJSE_V8ProxyCallback_getPropertyNames (const v8::FunctionCallbackInfo& info) +{ + v8::Local hChainObj = info.This()->GetPrototype().As(); + v8::Local hChainPropertyNames = hChainObj->GetPropertyNames(); + info.GetReturnValue().Set(hChainPropertyNames); +} +static void FXJSE_V8ProxyCallback_defineProperty (const v8::FunctionCallbackInfo& info) +{ + const FXJSE_CLASS* lpClass = static_cast(info.Data().As()->Value()); + if (!lpClass) { + return; + } + v8::Isolate* pIsolate = info.GetIsolate(); + v8::HandleScope scope(pIsolate); + v8::Local hPropName = info[0]->ToString(); + v8::Local hPropDescriptor = info[1]->ToObject(); + v8::String::Utf8Value szPropName(hPropName); + if(!hPropDescriptor->Has(v8::String::NewFromUtf8(pIsolate, "value"))) { + return; + } + v8::Local hPropValue = hPropDescriptor->Get(v8::String::NewFromUtf8(pIsolate, "value")); + CFX_ByteStringC szFxPropName(*szPropName, szPropName.length()); + CFXJSE_Value* lpThisValue = CFXJSE_Value::Create(info.GetIsolate()); + CFXJSE_Value* lpPropValue = CFXJSE_Value::Create(info.GetIsolate()); + lpThisValue->ForceSetValue(info.This()); + lpPropValue->ForceSetValue(hPropValue); + FXJSE_DynPropSetterAdapter(lpClass, reinterpret_cast(lpThisValue), szFxPropName, reinterpret_cast(lpPropValue)); + delete lpThisValue; + lpThisValue = NULL; + delete lpPropValue; + lpPropValue = NULL; +} +static void FXJSE_V8ProxyCallback_delete (const v8::FunctionCallbackInfo& info) +{ + info.GetReturnValue().Set(true); + const FXJSE_CLASS* lpClass = static_cast(info.Data().As()->Value()); + if (!lpClass) { + return; + } + v8::Isolate* pIsolate = info.GetIsolate(); + v8::HandleScope scope(pIsolate); + v8::Local hPropName = info[0]->ToString(); + v8::String::Utf8Value szPropName(hPropName); + CFX_ByteStringC szFxPropName(*szPropName, szPropName.length()); + CFXJSE_Value* lpThisValue = CFXJSE_Value::Create(info.GetIsolate()); + lpThisValue->ForceSetValue(info.This()); + info.GetReturnValue().Set(FXJSE_DynPropDeleterAdapter(lpClass, reinterpret_cast(lpThisValue), szFxPropName) ? true : false); + delete lpThisValue; + lpThisValue = NULL; +} +static void FXJSE_V8ProxyCallback_fix (const v8::FunctionCallbackInfo& info) +{ + info.GetReturnValue().SetUndefined(); +} +static void FXJSE_V8_NamedPropertyQueryCallback(v8::Local property, const v8::PropertyCallbackInfo& info) +{ + v8::Local thisObject = info.This(); + if (thisObject->HasRealNamedProperty(property)) { + return; + } + const FXJSE_CLASS* lpClass = static_cast(info.Data().As()->Value()); + v8::Isolate* pIsolate = info.GetIsolate(); + v8::HandleScope scope(pIsolate); + v8::String::Utf8Value szPropName(property); + CFX_ByteStringC szFxPropName(*szPropName, szPropName.length()); + CFXJSE_Value* lpThisValue = CFXJSE_Value::Create(info.GetIsolate()); + lpThisValue->ForceSetValue(thisObject); + if(FXJSE_DynPropQueryAdapter(lpClass, reinterpret_cast(lpThisValue), szFxPropName)) { + info.GetReturnValue().Set(v8::DontDelete); + } else { + const FX_INT32 iV8Absent = 64; + info.GetReturnValue().Set(iV8Absent); + } + delete lpThisValue; + lpThisValue = NULL; +} +static void FXJSE_V8_NamedPropertyDeleterCallback(v8::Local property, const v8::PropertyCallbackInfo& info) +{ + v8::Local thisObject = info.This(); + if (thisObject->HasRealNamedProperty(property)) { + return; + } + const FXJSE_CLASS* lpClass = static_cast(info.Data().As()->Value()); + v8::Isolate* pIsolate = info.GetIsolate(); + v8::HandleScope scope(pIsolate); + v8::String::Utf8Value szPropName(property); + CFX_ByteStringC szFxPropName(*szPropName, szPropName.length()); + CFXJSE_Value* lpThisValue = CFXJSE_Value::Create(info.GetIsolate()); + lpThisValue->ForceSetValue(thisObject); + info.GetReturnValue().Set(FXJSE_DynPropDeleterAdapter(lpClass, reinterpret_cast(lpThisValue), szFxPropName) ? true : false); + delete lpThisValue; + lpThisValue = NULL; +} +void CFXJSE_Class::SetUpDynPropHandler(CFXJSE_Context* pContext, CFXJSE_Value* pValue, const FXJSE_CLASS* lpClassDefinition) +{ + v8::Isolate* pIsolate = pValue->GetIsolate(); + CFXJSE_ScopeUtil_IsolateHandleRootOrNormalContext scope(pIsolate, pContext); + v8::Local hContext = v8::Local::New(pIsolate, pContext ? pContext->m_hContext : CFXJSE_RuntimeData::Get(pIsolate)->m_hRootContext); + v8::Local hObject = v8::Local::New(pIsolate, pValue->m_hValue.As()); + v8::Local hHarmonyProxyObj = hContext->Global()->Get(v8::String::NewFromUtf8(pIsolate, "Proxy")).As(); + v8::Local hHarmonyProxyCreateFn = hHarmonyProxyObj->Get(v8::String::NewFromUtf8(pIsolate, "create")).As(); + v8::Local hOldPrototype = hObject->GetPrototype(); + v8::Local hTrapper = v8::Object::New(pIsolate); + hTrapper->ForceSet(v8::String::NewFromUtf8(pIsolate, "getOwnPropertyDescriptor"), v8::Function::New(pIsolate, FXJSE_V8ProxyCallback_getOwnPropertyDescriptor, v8::External::New(pIsolate, const_cast(lpClassDefinition)))); + hTrapper->ForceSet(v8::String::NewFromUtf8(pIsolate, "getPropertyDescriptor"), v8::Function::New(pIsolate, FXJSE_V8ProxyCallback_getPropertyDescriptor, v8::External::New(pIsolate, const_cast(lpClassDefinition)))); + hTrapper->ForceSet(v8::String::NewFromUtf8(pIsolate, "getOwnPropertyNames"), v8::Function::New(pIsolate, FXJSE_V8ProxyCallback_getOwnPropertyNames, v8::External::New(pIsolate, const_cast(lpClassDefinition)))); + hTrapper->ForceSet(v8::String::NewFromUtf8(pIsolate, "getPropertyNames"), v8::Function::New(pIsolate, FXJSE_V8ProxyCallback_getPropertyNames, v8::External::New(pIsolate, const_cast(lpClassDefinition)))); + hTrapper->ForceSet(v8::String::NewFromUtf8(pIsolate, "delete"), v8::Function::New(pIsolate, FXJSE_V8ProxyCallback_delete, v8::External::New(pIsolate, const_cast(lpClassDefinition)))); + hTrapper->ForceSet(v8::String::NewFromUtf8(pIsolate, "defineProperty"), v8::Function::New(pIsolate, FXJSE_V8ProxyCallback_defineProperty, v8::External::New(pIsolate, const_cast(lpClassDefinition)))); + hTrapper->ForceSet(v8::String::NewFromUtf8(pIsolate, "fix"), v8::Function::New(pIsolate, FXJSE_V8ProxyCallback_fix, v8::External::New(pIsolate, const_cast(lpClassDefinition)))); + v8::Handle rgArgs[] = {hTrapper, hOldPrototype}; + v8::Local hNewPrototype = hHarmonyProxyCreateFn->Call(hHarmonyProxyObj, 2, rgArgs); + hObject->SetPrototype(hNewPrototype); +} +void CFXJSE_Class::SetUpNamedPropHandler(v8::Isolate* pIsolate, v8::Local& hObjectTemplate, const FXJSE_CLASS* lpClassDefinition) +{ + hObjectTemplate->SetNamedPropertyHandler(0, 0, + lpClassDefinition->dynPropTypeGetter ? FXJSE_V8_NamedPropertyQueryCallback : 0, + lpClassDefinition->dynPropDeleter ? FXJSE_V8_NamedPropertyDeleterCallback : 0, + 0, + v8::External::New(pIsolate, const_cast(lpClassDefinition))); +} diff --git a/xfa/src/fxjse/src/fxv8.h b/xfa/src/fxjse/src/fxv8.h new file mode 100644 index 0000000000..4cc7b3f406 --- /dev/null +++ b/xfa/src/fxjse/src/fxv8.h @@ -0,0 +1,11 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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_V8_H_ +#define _FX_V8_H_ +#include +#include +#endif diff --git a/xfa/src/fxjse/src/runtime.cpp b/xfa/src/fxjse/src/runtime.cpp new file mode 100644 index 0000000000..e406f6a233 --- /dev/null +++ b/xfa/src/fxjse/src/runtime.cpp @@ -0,0 +1,118 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../foxitlib.h" +#include "fxv8.h" +#include "runtime.h" +#include "scope_inline.h" +static void FXJSE_KillV8() +{ + v8::V8::Dispose(); +} +void FXJSE_Initialize() +{ + static FX_BOOL bV8Initialized = FALSE; + if (bV8Initialized) { + return; + } + bV8Initialized = TRUE; + atexit(FXJSE_KillV8); + FX_LPCSTR szCmdFlags = + "--harmony_proxies " + "--block_concurrent_recompilation " + ; + v8::V8::SetFlagsFromString(szCmdFlags, FXSYS_strlen(szCmdFlags)); + v8::V8::InitializeICU(); + v8::Platform* platform = v8::platform::CreateDefaultPlatform(); + v8::V8::InitializePlatform(platform); + v8::V8::Initialize(); + if(!CFXJSE_RuntimeData::g_RuntimeList) { + CFXJSE_RuntimeData::g_RuntimeList = FX_NEW CFXJSE_RuntimeList; + } +} +static void FXJSE_Runtime_DisposeCallback(v8::Isolate* pIsolate) +{ + { + v8::Locker locker(pIsolate); + CFXJSE_RuntimeData *pRuntimeData = reinterpret_cast(pIsolate->GetData(0)); + if(pRuntimeData) { + pIsolate->SetData(0, NULL); + delete pRuntimeData; + } + } + pIsolate->Dispose(); +} +void FXJSE_Finalize() +{ + if(CFXJSE_RuntimeData::g_RuntimeList) { + CFXJSE_RuntimeData::g_RuntimeList->RemoveAllRuntimes(FXJSE_Runtime_DisposeCallback); + delete CFXJSE_RuntimeData::g_RuntimeList; + CFXJSE_RuntimeData::g_RuntimeList = NULL; + } +} +FXJSE_HRUNTIME FXJSE_Runtime_Create() +{ + v8::Isolate* pIsolate = v8::Isolate::New(); + ASSERT(pIsolate && CFXJSE_RuntimeData::g_RuntimeList); + CFXJSE_RuntimeData::g_RuntimeList->AppendRuntime(pIsolate); + return reinterpret_cast(pIsolate); +} +void FXJSE_Runtime_Release(FXJSE_HRUNTIME hRuntime) +{ + v8::Isolate* pIsolate = reinterpret_cast(hRuntime); + if(pIsolate) { + ASSERT(CFXJSE_RuntimeData::g_RuntimeList); + CFXJSE_RuntimeData::g_RuntimeList->RemoveRuntime(pIsolate, FXJSE_Runtime_DisposeCallback); + } +} +CFXJSE_RuntimeData* CFXJSE_RuntimeData::Create(v8::Isolate* pIsolate) +{ + CFXJSE_RuntimeData* pRuntimeData = FX_NEW CFXJSE_RuntimeData(pIsolate); + ASSERT(pRuntimeData); + CFXJSE_ScopeUtil_IsolateHandle scope(pIsolate); + v8::Local hFuncTemplate = v8::FunctionTemplate::New(pIsolate); + v8::Local hContext = v8::Context::New(pIsolate, 0, hFuncTemplate->InstanceTemplate()); + hContext->SetSecurityToken(v8::External::New(pIsolate, pIsolate)); + pRuntimeData->m_hRootContextGlobalTemplate.Reset(pIsolate, hFuncTemplate); + pRuntimeData->m_hRootContext.Reset(pIsolate, hContext); + return pRuntimeData; +} +CFXJSE_RuntimeData* CFXJSE_RuntimeData::Get(v8::Isolate* pIsolate) +{ + ASSERT(pIsolate); + CFXJSE_RuntimeData* pRuntimeData = static_cast(pIsolate->GetData(0)); + if(!pRuntimeData) { + pRuntimeData = CFXJSE_RuntimeData::Create(pIsolate); + ASSERT(pRuntimeData); + pIsolate->SetData(0, pRuntimeData); + } + return pRuntimeData; +} +CFXJSE_RuntimeList * CFXJSE_RuntimeData::g_RuntimeList = NULL; +void CFXJSE_RuntimeList::AppendRuntime(v8::Isolate* pIsolate) +{ + m_RuntimeList.Add(pIsolate); +} +void CFXJSE_RuntimeList::RemoveRuntime(v8::Isolate* pIsolate, CFXJSE_RuntimeList::RuntimeDisposeCallback lpfnDisposeCallback) +{ + FX_INT32 iIdx = m_RuntimeList.Find(pIsolate, 0); + if(iIdx >= 0) { + m_RuntimeList.RemoveAt(iIdx, 1); + } + if(lpfnDisposeCallback) { + lpfnDisposeCallback(pIsolate); + } +} +void CFXJSE_RuntimeList::RemoveAllRuntimes(CFXJSE_RuntimeList::RuntimeDisposeCallback lpfnDisposeCallback) +{ + FX_INT32 iSize = m_RuntimeList.GetSize(); + if(lpfnDisposeCallback) { + for(FX_INT32 iIdx = 0; iIdx < iSize; iIdx++) { + lpfnDisposeCallback(m_RuntimeList[iIdx]); + } + } + m_RuntimeList.RemoveAll(); +} diff --git a/xfa/src/fxjse/src/runtime.h b/xfa/src/fxjse/src/runtime.h new file mode 100644 index 0000000000..78e891bfe4 --- /dev/null +++ b/xfa/src/fxjse/src/runtime.h @@ -0,0 +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 FXJSE_RUNTIME_H_ +#define FXJSE_RUNTIME_H_ +class CFXJSE_RuntimeList; +class CFXJSE_RuntimeData : public CFX_Object +{ +protected: + CFXJSE_RuntimeData(v8::Isolate* pIsolate) : m_pIsolate(pIsolate) {}; +public: + static CFXJSE_RuntimeData* Create(v8::Isolate* pIsolate); + static CFXJSE_RuntimeData* Get(v8::Isolate* pIsolate); +public: + v8::Isolate* m_pIsolate; + v8::Persistent m_hRootContextGlobalTemplate; + v8::Persistent m_hRootContext; +public: + static CFXJSE_RuntimeList* g_RuntimeList; +protected: + CFXJSE_RuntimeData(); + CFXJSE_RuntimeData(const CFXJSE_RuntimeData&); + CFXJSE_RuntimeData& operator = (const CFXJSE_RuntimeData&); +}; +class CFXJSE_RuntimeList : public CFX_Object +{ +public: + typedef void (*RuntimeDisposeCallback)(v8::Isolate*); +public: + void AppendRuntime(v8::Isolate* pIsolate); + void RemoveRuntime(v8::Isolate* pIsolate, RuntimeDisposeCallback lpfnDisposeCallback); + void RemoveAllRuntimes(RuntimeDisposeCallback lpfnDisposeCallback); +protected: + CFX_ArrayTemplate m_RuntimeList; +}; +#endif diff --git a/xfa/src/fxjse/src/scope_inline.h b/xfa/src/fxjse/src/scope_inline.h new file mode 100644 index 0000000000..8a590f3fb8 --- /dev/null +++ b/xfa/src/fxjse/src/scope_inline.h @@ -0,0 +1,86 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 FXJSE_SCOPE_INLINE_H_ +#define FXJSE_SCOPE_INLINE_H_ +#include "runtime.h" +#include "context.h" +class CFXJSE_ScopeUtil_IsolateHandle +{ +protected: + v8::Isolate* m_isolate; + v8::Locker m_locker; + v8::Isolate::Scope m_iscope; + v8::HandleScope m_hscope; +public: + explicit CFXJSE_ScopeUtil_IsolateHandle(v8::Isolate* pIsolate) : m_isolate(pIsolate), m_locker(pIsolate), m_iscope(pIsolate), m_hscope(pIsolate) {} + v8::Isolate* GetIsolate() + { + return m_isolate; + } +private: + CFXJSE_ScopeUtil_IsolateHandle(const CFXJSE_ScopeUtil_IsolateHandle&); + void operator=(const CFXJSE_ScopeUtil_IsolateHandle&); + void* operator new(size_t size); + void operator delete(void*, size_t); +}; +class CFXJSE_ScopeUtil_IsolateHandleRootContext +{ + CFXJSE_ScopeUtil_IsolateHandle m_parent; + v8::Context::Scope m_cscope; +public: + explicit CFXJSE_ScopeUtil_IsolateHandleRootContext(v8::Isolate* pIsolate) : m_parent(pIsolate), m_cscope(v8::Local::New(pIsolate, CFXJSE_RuntimeData::Get(pIsolate)->m_hRootContext)) {} +private: + CFXJSE_ScopeUtil_IsolateHandleRootContext(const CFXJSE_ScopeUtil_IsolateHandleRootContext&); + void operator=(const CFXJSE_ScopeUtil_IsolateHandleRootContext&); + void* operator new(size_t size); + void operator delete(void*, size_t); +}; +class CFXJSE_ScopeUtil_IsolateHandleContext +{ + CFXJSE_Context* m_context; + CFXJSE_ScopeUtil_IsolateHandle m_parent; + v8::Context::Scope m_cscope; +public: + explicit CFXJSE_ScopeUtil_IsolateHandleContext(CFXJSE_Context* pContext) : m_context(pContext), m_parent(pContext->m_pIsolate), m_cscope(v8::Local::New(pContext->m_pIsolate, pContext->m_hContext)) {} + v8::Isolate* GetIsolate() + { + return m_context->m_pIsolate; + } + v8::Local GetLocalContext() + { + return v8::Local::New(m_context->m_pIsolate, m_context->m_hContext); + } +private: + CFXJSE_ScopeUtil_IsolateHandleContext(const CFXJSE_ScopeUtil_IsolateHandleContext&); + void operator=(const CFXJSE_ScopeUtil_IsolateHandleContext&); + void* operator new(size_t size); + void operator delete(void*, size_t); +}; +class CFXJSE_ScopeUtil_IsolateHandleRootOrNormalContext +{ + CFXJSE_Context* m_context; + CFXJSE_ScopeUtil_IsolateHandle m_parent; + v8::Context::Scope m_cscope; +public: + explicit CFXJSE_ScopeUtil_IsolateHandleRootOrNormalContext(v8::Isolate* pIsolate, CFXJSE_Context* pContext) + : m_context(pContext), m_parent(pIsolate), m_cscope(v8::Local::New(pIsolate, pContext ? pContext->m_hContext : CFXJSE_RuntimeData::Get(pIsolate)->m_hRootContext)) {} + v8::Isolate* GetIsolate() + { + return m_parent.GetIsolate(); + } + v8::Local GetLocalContext() + { + v8::Isolate* pIsolate = m_parent.GetIsolate(); + return v8::Local::New(pIsolate, m_context ? m_context->m_hContext : CFXJSE_RuntimeData::Get(pIsolate)->m_hRootContext); + } +private: + CFXJSE_ScopeUtil_IsolateHandleRootOrNormalContext(const CFXJSE_ScopeUtil_IsolateHandleRootOrNormalContext&); + void operator=(const CFXJSE_ScopeUtil_IsolateHandleRootOrNormalContext&); + void* operator new(size_t size); + void operator delete(void*, size_t); +}; +#endif diff --git a/xfa/src/fxjse/src/util_inline.h b/xfa/src/fxjse/src/util_inline.h new file mode 100644 index 0000000000..dddcab3053 --- /dev/null +++ b/xfa/src/fxjse/src/util_inline.h @@ -0,0 +1,44 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 FXJSE_UTIL_INLINE_H_ +#define FXJSE_UTIL_INLINE_H_ +static V8_INLINE v8::Local FXJSE_GetGlobalObjectFromContext(const v8::Local& hContext) +{ + return hContext->Global()->GetPrototype().As(); +} +static V8_INLINE void FXJSE_UpdateObjectBinding(v8::Local& hObject, FX_LPVOID lpNewBinding) +{ + ASSERT(!hObject.IsEmpty()); + ASSERT(hObject->InternalFieldCount() > 0); + hObject->SetAlignedPointerInInternalField(0, lpNewBinding); +} +static V8_INLINE FX_LPVOID FXJSE_RetrieveObjectBinding(const v8::Local& hJSObject, CFXJSE_Class* lpClass = NULL) +{ + ASSERT(!hJSObject.IsEmpty()); + if(!hJSObject->IsObject()) { + return NULL; + } + v8::Local hObject = hJSObject; + if(hObject->InternalFieldCount() == 0) { + v8::Handle hProtoObject = hObject->GetPrototype(); + if(hProtoObject.IsEmpty() || !hProtoObject->IsObject()) { + return NULL; + } + hObject = hProtoObject.As(); + if(hObject->InternalFieldCount() == 0) { + return NULL; + } + } + if(lpClass) { + v8::Local hClass = v8::Local::New(lpClass->GetContext()->GetRuntime(), lpClass->GetTemplate()); + if(!hClass->HasInstance(hObject)) { + return NULL; + } + } + return hObject->GetAlignedPointerFromInternalField(0); +} +#endif diff --git a/xfa/src/fxjse/src/value.cpp b/xfa/src/fxjse/src/value.cpp new file mode 100644 index 0000000000..cd2fff1595 --- /dev/null +++ b/xfa/src/fxjse/src/value.cpp @@ -0,0 +1,524 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../foxitlib.h" +#include "fxv8.h" +#include "value.h" +#include "class.h" +#include +#include "util_inline.h" +#if !defined(__PLACEMENT_NEW_INLINE) && !defined(_MFC_VER) && !defined(_NEW) +#define __PLACEMENT_NEW_INLINE +inline void* operator new(size_t size, void* pos) +{ + return pos; +} +inline void operator delete(void* ptr, void* pos) +{ +} +#endif +FX_BOOL FXJSE_Value_IsUndefined (FXJSE_HVALUE hValue) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + return lpValue && lpValue->IsUndefined(); +} +FX_BOOL FXJSE_Value_IsNull (FXJSE_HVALUE hValue) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + return lpValue && lpValue->IsNull(); +} +FX_BOOL FXJSE_Value_IsBoolean (FXJSE_HVALUE hValue) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + return lpValue && lpValue->IsBoolean(); +} +FX_BOOL FXJSE_Value_IsUTF8String(FXJSE_HVALUE hValue) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + return lpValue && lpValue->IsString(); +} +FX_BOOL FXJSE_Value_IsNumber (FXJSE_HVALUE hValue) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + return lpValue && lpValue->IsNumber(); +} +FX_BOOL FXJSE_Value_IsInteger (FXJSE_HVALUE hValue) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + return lpValue && lpValue->IsInteger(); +} +FX_BOOL FXJSE_Value_IsObject (FXJSE_HVALUE hValue) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + return lpValue && lpValue->IsObject(); +} +FX_BOOL FXJSE_Value_IsArray (FXJSE_HVALUE hValue) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + return lpValue && lpValue->IsArray(); +} +FX_BOOL FXJSE_Value_IsFunction(FXJSE_HVALUE hValue) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + return lpValue && lpValue->IsFunction(); +} +FX_BOOL FXJSE_Value_IsDate(FXJSE_HVALUE hValue) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + return lpValue && lpValue->IsDate(); +} +FX_BOOL FXJSE_Value_ToBoolean (FXJSE_HVALUE hValue) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + ASSERT(lpValue); + return lpValue->ToBoolean(); +} +FX_FLOAT FXJSE_Value_ToFloat (FXJSE_HVALUE hValue) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + ASSERT(lpValue); + return lpValue->ToFloat(); +} +FXJSE_DOUBLE FXJSE_Value_ToDouble (FXJSE_HVALUE hValue) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + ASSERT(lpValue); + return lpValue->ToDouble(); +} +void FXJSE_Value_ToUTF8String (FXJSE_HVALUE hValue, CFX_ByteString& szStrOutput) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + ASSERT(lpValue); + return lpValue->ToString(szStrOutput); +} +FX_INT32 FXJSE_Value_ToInteger (FXJSE_HVALUE hValue) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + ASSERT(lpValue); + return lpValue->ToInteger(); +} +FX_LPVOID FXJSE_Value_ToObject (FXJSE_HVALUE hValue, FXJSE_HCLASS hClass) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + CFXJSE_Class* lpClass = reinterpret_cast(hClass); + ASSERT(lpValue); + return lpValue->ToObject(lpClass); +} +void FXJSE_Value_SetUndefined (FXJSE_HVALUE hValue) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + ASSERT(lpValue); + return lpValue->SetUndefined(); +} +void FXJSE_Value_SetNull (FXJSE_HVALUE hValue) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + ASSERT(lpValue); + return lpValue->SetNull(); +} +void FXJSE_Value_SetBoolean (FXJSE_HVALUE hValue, FX_BOOL bBoolean) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + ASSERT(lpValue); + return lpValue->SetBoolean(bBoolean); +} +void FXJSE_Value_SetUTF8String (FXJSE_HVALUE hValue, FX_BSTR szString) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + ASSERT(lpValue); + return lpValue->SetString(szString); +} +void FXJSE_Value_SetInteger (FXJSE_HVALUE hValue, FX_INT32 nInteger) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + ASSERT(lpValue); + return lpValue->SetInteger(nInteger); +} +void FXJSE_Value_SetFloat (FXJSE_HVALUE hValue, FX_FLOAT fFloat) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + ASSERT(lpValue); + return lpValue->SetFloat(fFloat); +} +void FXJSE_Value_SetDouble (FXJSE_HVALUE hValue, FXJSE_DOUBLE dDouble) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + ASSERT(lpValue); + return lpValue->SetDouble(dDouble); +} +void FXJSE_Value_SetObject (FXJSE_HVALUE hValue, FX_LPVOID lpObject, FXJSE_HCLASS hClass) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + CFXJSE_Class* lpClass = reinterpret_cast(hClass); + if(lpClass == NULL) { + ASSERT(lpObject == NULL); + lpValue->SetJSObject(); + } else if(lpClass != NULL) { + lpValue->SetHostObject(lpObject, lpClass); + } +} +void FXJSE_Value_SetArray (FXJSE_HVALUE hValue, FX_UINT32 uValueCount, FXJSE_HVALUE* rgValues) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + return lpValue->SetArray(uValueCount, reinterpret_cast(rgValues)); +} +void FXJSE_Value_SetDate (FXJSE_HVALUE hValue, FXJSE_DOUBLE dDouble) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + return lpValue->SetDate(dDouble); +} +void FXJSE_Value_Set (FXJSE_HVALUE hValue, FXJSE_HVALUE hOriginalValue) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + CFXJSE_Value* lpOriginalValue = reinterpret_cast(hOriginalValue); + ASSERT(lpValue && lpOriginalValue); + return lpValue->Assign(lpOriginalValue); +} +FX_BOOL FXJSE_Value_GetObjectProp (FXJSE_HVALUE hValue, FX_BSTR szPropName, FXJSE_HVALUE hPropValue) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + CFXJSE_Value* lpPropValue = reinterpret_cast(hPropValue); + ASSERT(lpValue && lpPropValue); + return lpValue->GetObjectProperty(szPropName, lpPropValue); +} +FX_BOOL FXJSE_Value_SetObjectProp (FXJSE_HVALUE hValue, FX_BSTR szPropName, FXJSE_HVALUE hPropValue) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + CFXJSE_Value* lpPropValue = reinterpret_cast(hPropValue); + ASSERT(lpValue && lpPropValue); + return lpValue->SetObjectProperty(szPropName, lpPropValue); +} +FX_BOOL FXJSE_Value_GetObjectPropByIdx (FXJSE_HVALUE hValue, FX_UINT32 uPropIdx, FXJSE_HVALUE hPropValue) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + CFXJSE_Value* lpPropValue = reinterpret_cast(hPropValue); + ASSERT(lpValue && lpPropValue); + return lpValue->GetObjectProperty(uPropIdx, lpPropValue); +} +FX_BOOL FXJSE_Value_SetObjectPropByIdx (FXJSE_HVALUE hValue, FX_UINT32 uPropIdx, FXJSE_HVALUE hPropValue) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + CFXJSE_Value* lpPropValue = reinterpret_cast(hPropValue); + ASSERT(lpValue && lpPropValue); + return lpValue->SetObjectProperty(uPropIdx, lpPropValue); +} +FX_BOOL FXJSE_Value_DeleteObjectProp (FXJSE_HVALUE hValue, FX_BSTR szPropName) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + ASSERT(lpValue); + return lpValue->DeleteObjectProperty(szPropName); +} +FX_BOOL FXJSE_Value_ObjectHasOwnProp (FXJSE_HVALUE hValue, FX_BSTR szPropName, FX_BOOL bUseTypeGetter) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + ASSERT(lpValue); + return lpValue->HasObjectOwnProperty(szPropName, bUseTypeGetter); +} +FX_BOOL FXJSE_Value_SetObjectOwnProp (FXJSE_HVALUE hValue, FX_BSTR szPropName, FXJSE_HVALUE hPropValue) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + CFXJSE_Value* lpPropValue = reinterpret_cast(hPropValue); + ASSERT(lpValue && lpPropValue); + return lpValue->SetObjectOwnProperty(szPropName, lpPropValue); +} +FX_BOOL FXJSE_Value_SetFunctionBind (FXJSE_HVALUE hValue, FXJSE_HVALUE hOldFunction, FXJSE_HVALUE hNewThis) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + CFXJSE_Value* lpOldFunction = reinterpret_cast(hOldFunction); + CFXJSE_Value* lpNewThis = reinterpret_cast(hNewThis); + ASSERT(lpValue && lpOldFunction && lpNewThis); + return lpValue->SetFunctionBind(lpOldFunction, lpNewThis); +} +FX_BOOL FXJSE_Value_CallFunction(FXJSE_HVALUE hFunction, FXJSE_HVALUE hThis, FXJSE_HVALUE hRetValue, FX_UINT32 nArgCount, FXJSE_HVALUE* lpArgs) +{ + CFXJSE_Value* lpFunction = reinterpret_cast(hFunction); + CFXJSE_Value* lpThis = reinterpret_cast(hThis); + CFXJSE_Value* lpRetValue = reinterpret_cast(hRetValue); + ASSERT(lpFunction); + return lpFunction->Call(lpThis, lpRetValue, nArgCount, lpArgs); +} +FXJSE_HVALUE FXJSE_Value_Create (FXJSE_HRUNTIME hRuntime) +{ + CFXJSE_Value* lpValue = CFXJSE_Value::Create(reinterpret_cast(hRuntime)); + ASSERT(lpValue); + return reinterpret_cast(lpValue); +} +void FXJSE_Value_Release (FXJSE_HVALUE hValue) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + if(lpValue) { + delete lpValue; + } +} +FXJSE_HRUNTIME FXJSE_Value_GetRuntime(FXJSE_HVALUE hValue) +{ + CFXJSE_Value* lpValue = reinterpret_cast(hValue); + ASSERT(lpValue); + return reinterpret_cast(lpValue->GetIsolate()); +} +void FXJSE_ThrowMessage(FX_BSTR utf8Name, FX_BSTR utf8Message) +{ + v8::Isolate* pIsolate = v8::Isolate::GetCurrent(); + ASSERT(pIsolate); + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(pIsolate); + v8::Handle hMessage = v8::String::NewFromUtf8(pIsolate, utf8Message.GetCStr(), v8::String::kNormalString, utf8Message.GetLength()); + v8::Handle hError; + if(utf8Name == "RangeError") { + hError = v8::Exception::RangeError(hMessage); + } else if(utf8Name == "ReferenceError") { + hError = v8::Exception::ReferenceError(hMessage); + } else if(utf8Name == "SyntaxError") { + hError = v8::Exception::SyntaxError(hMessage); + } else if(utf8Name == "TypeError") { + hError = v8::Exception::TypeError(hMessage); + } else { + hError = v8::Exception::Error(hMessage); + if(utf8Name != "Error" && !utf8Name.IsEmpty()) { + hError.As()->Set(v8::String::NewFromUtf8(pIsolate, "name"), v8::String::NewFromUtf8(pIsolate, utf8Name.GetCStr(), v8::String::kNormalString, utf8Name.GetLength())); + } + } + pIsolate->ThrowException(hError); +} +CFXJSE_Value* CFXJSE_Value::Create(v8::Isolate* pIsolate) +{ + return FX_NEW CFXJSE_Value(pIsolate); +} +FX_LPVOID CFXJSE_Value::ToObject(CFXJSE_Class* lpClass) const +{ + ASSERT(!m_hValue.IsEmpty()); + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hValue = v8::Local::New(m_pIsolate, m_hValue); + ASSERT(!hValue.IsEmpty()); + if(!hValue->IsObject()) { + return NULL; + } + return FXJSE_RetrieveObjectBinding(hValue.As(), lpClass); +} +V8_INLINE static double FXJSE_ftod(FX_FLOAT fNumber) +{ + if(sizeof(FX_FLOAT) != 4) { + ASSERT(FALSE); + return fNumber; + } + FX_UINT32 nFloatBits = (FX_UINT32&)fNumber; + FX_UINT8 nExponent = (FX_UINT8)(nFloatBits >> 16 >> 7 ); + if(nExponent == 0 || nExponent == 255) { + return fNumber; + } + FX_INT8 nErrExp = nExponent - 127 - 23; + if(nErrExp >= 0) { + return fNumber; + } + double dwError = pow(2.0, nErrExp), dwErrorHalf = dwError / 2; + double dNumber = fNumber, dNumberAbs = fabs(fNumber); + double dNumberAbsMin = dNumberAbs - dwErrorHalf, dNumberAbsMax = dNumberAbs + dwErrorHalf; + FX_INT32 iErrPos = 0; + if(floor(dNumberAbsMin) == floor(dNumberAbsMax)) { + dNumberAbsMin = fmod(dNumberAbsMin, 1.0); + dNumberAbsMax = fmod(dNumberAbsMax, 1.0); + FX_INT32 iErrPosMin = 1, iErrPosMax = 38; + do { + FX_INT32 iMid = (iErrPosMin + iErrPosMax) / 2; + double dPow = pow(10.0, iMid); + if(floor(dNumberAbsMin * dPow) == floor(dNumberAbsMax * dPow)) { + iErrPosMin = iMid + 1; + } else { + iErrPosMax = iMid; + } + } while (iErrPosMin < iErrPosMax); + iErrPos = iErrPosMax; + } + double dPow = pow(10.0, iErrPos); + return fNumber < 0 ? ceil(dNumber * dPow - 0.5) / dPow : floor(dNumber * dPow + 0.5) / dPow; +} +void CFXJSE_Value::SetFloat(FX_FLOAT fFloat) +{ + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::Number::New(m_pIsolate, FXJSE_ftod(fFloat)); + m_hValue.Reset(m_pIsolate, hValue); +} +void CFXJSE_Value::SetHostObject(FX_LPVOID lpObject, CFXJSE_Class* lpClass) +{ + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + ASSERT(lpClass); + v8::Local hClass = v8::Local::New(m_pIsolate, lpClass->m_hTemplate); + v8::Local hObject = hClass->InstanceTemplate()->NewInstance(); + FXJSE_UpdateObjectBinding(hObject, lpObject); + m_hValue.Reset(m_pIsolate, hObject); +} +void CFXJSE_Value::SetArray(FX_UINT32 uValueCount, CFXJSE_Value** rgValues) +{ + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hArrayObject = v8::Array::New(m_pIsolate, uValueCount); + if (rgValues) { + for(FX_UINT32 i = 0; i < uValueCount; i++) { + if(rgValues[i]) { + hArrayObject->Set(i, v8::Local::New(m_pIsolate, rgValues[i]->DirectGetValue())); + } + } + } + m_hValue.Reset(m_pIsolate, hArrayObject); +} +void CFXJSE_Value::SetDate(FXJSE_DOUBLE dDouble) +{ + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hDate = v8::Date::New(m_pIsolate, dDouble); + m_hValue.Reset(m_pIsolate, hDate); +} +FX_BOOL CFXJSE_Value::SetObjectProperty(FX_BSTR szPropName, CFXJSE_Value* lpPropValue) +{ + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hObject = v8::Local::New(m_pIsolate, m_hValue); + if(!hObject->IsObject()) { + return FALSE; + } + v8::Local hPropValue = v8::Local::New(m_pIsolate, lpPropValue->DirectGetValue()); + return (FX_BOOL)hObject.As()->Set(v8::String::NewFromUtf8(m_pIsolate, szPropName.GetCStr(), v8::String::kNormalString, szPropName.GetLength()), hPropValue); +} +FX_BOOL CFXJSE_Value::GetObjectProperty(FX_BSTR szPropName, CFXJSE_Value* lpPropValue) +{ + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hObject = v8::Local::New(m_pIsolate, m_hValue); + if(!hObject->IsObject()) { + return FALSE; + } + v8::Local hPropValue = hObject.As()->Get(v8::String::NewFromUtf8(m_pIsolate, szPropName.GetCStr(), v8::String::kNormalString, szPropName.GetLength())); + lpPropValue->ForceSetValue(hPropValue); + return TRUE; +} +FX_BOOL CFXJSE_Value::SetObjectProperty(FX_UINT32 uPropIdx, CFXJSE_Value* lpPropValue) +{ + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hObject = v8::Local::New(m_pIsolate, m_hValue); + if(!hObject->IsObject()) { + return FALSE; + } + v8::Local hPropValue = v8::Local::New(m_pIsolate, lpPropValue->DirectGetValue()); + return (FX_BOOL)hObject.As()->Set(uPropIdx, hPropValue); +} +FX_BOOL CFXJSE_Value::GetObjectProperty(FX_UINT32 uPropIdx, CFXJSE_Value* lpPropValue) +{ + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hObject = v8::Local::New(m_pIsolate, m_hValue); + if(!hObject->IsObject()) { + return FALSE; + } + v8::Local hPropValue = hObject.As()->Get(uPropIdx); + lpPropValue->ForceSetValue(hPropValue); + return TRUE; +} +FX_BOOL CFXJSE_Value::DeleteObjectProperty(FX_BSTR szPropName) +{ + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hObject = v8::Local::New(m_pIsolate, m_hValue); + if(!hObject->IsObject()) { + return FALSE; + } + hObject.As()->Delete(v8::String::NewFromUtf8(m_pIsolate, szPropName.GetCStr(), v8::String::kNormalString, szPropName.GetLength())); + return TRUE; +} +FX_BOOL CFXJSE_Value::HasObjectOwnProperty(FX_BSTR szPropName, FX_BOOL bUseTypeGetter) +{ + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hObject = v8::Local::New(m_pIsolate, m_hValue); + if(!hObject->IsObject()) { + return FALSE; + } + v8::Local hKey = v8::String::NewFromUtf8(m_pIsolate, szPropName.GetCStr(), v8::String::kNormalString, szPropName.GetLength()); + return hObject.As()->HasRealNamedProperty(hKey) || (bUseTypeGetter && hObject.As()->HasOwnProperty(hKey)); +} +FX_BOOL CFXJSE_Value::SetObjectOwnProperty(FX_BSTR szPropName, CFXJSE_Value* lpPropValue) +{ + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hObject = v8::Local::New(m_pIsolate, m_hValue); + if(!hObject->IsObject()) { + return FALSE; + } + v8::Local hValue = v8::Local::New(m_pIsolate, lpPropValue->m_hValue); + return hObject.As()->ForceSet(v8::String::NewFromUtf8(m_pIsolate, szPropName.GetCStr(), v8::String::kNormalString, szPropName.GetLength()), hValue); +} +FX_BOOL CFXJSE_Value::SetFunctionBind(CFXJSE_Value* lpOldFunction, CFXJSE_Value* lpNewThis) +{ + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Handle rgArgs[2]; + v8::Local hOldFunction = v8::Local::New(m_pIsolate, lpOldFunction->DirectGetValue()); + if(hOldFunction.IsEmpty() || !hOldFunction->IsFunction()) { + return FALSE; + } + rgArgs[0] = hOldFunction; + v8::Local hNewThis = v8::Local::New(m_pIsolate, lpNewThis->DirectGetValue()); + if(hNewThis.IsEmpty()) { + return FALSE; + } + rgArgs[1] = hNewThis; + v8::Local hBinderFuncSource = v8::String::NewFromUtf8(m_pIsolate, "(function (oldfunction, newthis) { return oldfunction.bind(newthis); })"); + v8::Local hBinderFunc = v8::Script::Compile(hBinderFuncSource)->Run().As(); + v8::Local hBoundFunction = hBinderFunc->Call(m_pIsolate->GetCurrentContext()->Global(), 2, rgArgs); + if(hBoundFunction.IsEmpty() || !hBoundFunction->IsFunction()) { + return FALSE; + } + m_hValue.Reset(m_pIsolate, hBoundFunction); + return TRUE; +} +#define FXJSE_INVALID_PTR ((FX_LPVOID)(FX_INTPTR)-1) +FX_BOOL CFXJSE_Value::Call(CFXJSE_Value* lpReceiver, CFXJSE_Value* lpRetValue, FX_UINT32 nArgCount, FXJSE_HVALUE* lpArgs) +{ + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hFunctionValue = v8::Local::New(m_pIsolate, DirectGetValue()); + v8::Local hFunctionObject = !hFunctionValue.IsEmpty() && hFunctionValue->IsObject() ? hFunctionValue.As() : v8::Local(); + v8::TryCatch trycatch; + if (hFunctionObject.IsEmpty() || !hFunctionObject->IsCallable()) { + if(lpRetValue) { + lpRetValue->ForceSetValue(FXJSE_CreateReturnValue(m_pIsolate, trycatch)); + } + return FALSE; + } + v8::Local hReturnValue; + v8::Handle* lpLocalArgs = NULL; + if(nArgCount) { + lpLocalArgs = FX_Alloc(v8::Handle, nArgCount); + if (!lpLocalArgs) { + return FALSE; + } + for (FX_UINT32 i = 0; i < nArgCount; i++) { + new (lpLocalArgs + i) v8::Handle; + CFXJSE_Value* lpArg = (CFXJSE_Value*)lpArgs[i]; + if(lpArg) { + lpLocalArgs[i] = v8::Local::New(m_pIsolate, lpArg->DirectGetValue()); + } + if (lpLocalArgs[i].IsEmpty()) { + lpLocalArgs[i] = v8::Undefined(m_pIsolate); + } + } + } + FX_BOOL bRetValue = TRUE; + if(lpReceiver == FXJSE_INVALID_PTR) { + hReturnValue = hFunctionObject->CallAsConstructor(nArgCount, lpLocalArgs); + } else { + v8::Local hReceiver; + if(lpReceiver) { + hReceiver = v8::Local::New(m_pIsolate, lpReceiver->DirectGetValue()); + } + if(hReceiver.IsEmpty() || !hReceiver->IsObject()) { + hReceiver = v8::Object::New(m_pIsolate); + } + hReturnValue = hFunctionObject->CallAsFunction(hReceiver, nArgCount, lpLocalArgs); + } + if(trycatch.HasCaught()) { + hReturnValue = FXJSE_CreateReturnValue(m_pIsolate, trycatch); + bRetValue = FALSE; + } + if(lpRetValue) { + lpRetValue->ForceSetValue(hReturnValue); + } + if(lpLocalArgs) { + for (FX_UINT32 i = 0; i < nArgCount; i++) { + lpLocalArgs[i].~Handle(); + } + FX_Free(lpLocalArgs); + } + return bRetValue; +} diff --git a/xfa/src/fxjse/src/value.h b/xfa/src/fxjse/src/value.h new file mode 100644 index 0000000000..aca23bf310 --- /dev/null +++ b/xfa/src/fxjse/src/value.h @@ -0,0 +1,236 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed 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 FXJSE_VALUE_H_ +#define FXJSE_VALUE_H_ +#include "scope_inline.h" +class CFXJSE_Value : public CFX_Object +{ +public: + CFXJSE_Value(v8::Isolate* pIsolate) : m_pIsolate(pIsolate) {} +protected: + CFXJSE_Value(); + CFXJSE_Value(const CFXJSE_Value&); + CFXJSE_Value& operator = (const CFXJSE_Value&); +public: + V8_INLINE FX_BOOL IsUndefined() const + { + if (m_hValue.IsEmpty()) { + return FALSE; + } + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::Local::New(m_pIsolate, m_hValue); + return hValue->IsUndefined(); + } + V8_INLINE FX_BOOL IsNull() const + { + if (m_hValue.IsEmpty()) { + return FALSE; + } + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::Local::New(m_pIsolate, m_hValue); + return hValue->IsNull(); + } + V8_INLINE FX_BOOL IsBoolean() const + { + if (m_hValue.IsEmpty()) { + return FALSE; + } + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::Local::New(m_pIsolate, m_hValue); + return hValue->IsBoolean(); + } + V8_INLINE FX_BOOL IsString() const + { + if (m_hValue.IsEmpty()) { + return FALSE; + } + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::Local::New(m_pIsolate, m_hValue); + return hValue->IsString(); + } + V8_INLINE FX_BOOL IsNumber() const + { + if (m_hValue.IsEmpty()) { + return FALSE; + } + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::Local::New(m_pIsolate, m_hValue); + return hValue->IsNumber(); + } + V8_INLINE FX_BOOL IsInteger() const + { + if (m_hValue.IsEmpty()) { + return FALSE; + } + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::Local::New(m_pIsolate, m_hValue); + return hValue->IsInt32(); + } + V8_INLINE FX_BOOL IsObject() const + { + if (m_hValue.IsEmpty()) { + return FALSE; + } + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::Local::New(m_pIsolate, m_hValue); + return hValue->IsObject(); + } + V8_INLINE FX_BOOL IsArray() const + { + if (m_hValue.IsEmpty()) { + return FALSE; + } + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::Local::New(m_pIsolate, m_hValue); + return hValue->IsArray(); + } + V8_INLINE FX_BOOL IsFunction() const + { + if (m_hValue.IsEmpty()) { + return FALSE; + } + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::Local::New(m_pIsolate, m_hValue); + return hValue->IsFunction(); + } + V8_INLINE FX_BOOL IsDate() const + { + if (m_hValue.IsEmpty()) { + return FALSE; + } + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::Local::New(m_pIsolate, m_hValue); + return hValue->IsDate(); + } +public: + V8_INLINE FX_BOOL ToBoolean() const + { + ASSERT(!m_hValue.IsEmpty()); + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hValue = v8::Local::New(m_pIsolate, m_hValue); + return static_cast(hValue->BooleanValue()); + } + V8_INLINE FX_FLOAT ToFloat() const + { + ASSERT(!m_hValue.IsEmpty()); + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hValue = v8::Local::New(m_pIsolate, m_hValue); + return static_cast(hValue->NumberValue()); + } + V8_INLINE FXJSE_DOUBLE ToDouble() const + { + ASSERT(!m_hValue.IsEmpty()); + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hValue = v8::Local::New(m_pIsolate, m_hValue); + return static_cast(hValue->NumberValue()); + } + V8_INLINE FX_INT32 ToInteger() const + { + ASSERT(!m_hValue.IsEmpty()); + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hValue = v8::Local::New(m_pIsolate, m_hValue); + return static_cast(hValue->NumberValue()); + } + V8_INLINE void ToString(CFX_ByteString& szStrOutput) const + { + ASSERT(!m_hValue.IsEmpty()); + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hValue = v8::Local::New(m_pIsolate, m_hValue); + v8::Local hString = hValue->ToString(); + v8::String::Utf8Value hStringVal(hString); + szStrOutput = *hStringVal; + } + FX_LPVOID ToObject(CFXJSE_Class* lpClass) const; +public: + V8_INLINE void SetUndefined() + { + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::Undefined(m_pIsolate); + m_hValue.Reset(m_pIsolate, hValue); + } + V8_INLINE void SetNull() + { + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::Null(m_pIsolate); + m_hValue.Reset(m_pIsolate, hValue); + } + V8_INLINE void SetBoolean(FX_BOOL bBoolean) + { + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::Boolean::New(m_pIsolate, bBoolean != FALSE); + m_hValue.Reset(m_pIsolate, hValue); + } + V8_INLINE void SetInteger(FX_INT32 nInteger) + { + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::Integer::New(m_pIsolate, nInteger); + m_hValue.Reset(m_pIsolate, hValue); + } + V8_INLINE void SetDouble(FXJSE_DOUBLE dDouble) + { + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::Number::New(m_pIsolate, dDouble); + m_hValue.Reset(m_pIsolate, hValue); + } + V8_INLINE void SetString(FX_BSTR szString) + { + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::String::NewFromUtf8(m_pIsolate, + reinterpret_cast(szString.GetPtr()), + v8::String::kNormalString, szString.GetLength()); + m_hValue.Reset(m_pIsolate, hValue); + } + V8_INLINE void SetFloat(FX_FLOAT fFloat); + V8_INLINE void SetJSObject() + { + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hValue = v8::Object::New(m_pIsolate); + m_hValue.Reset(m_pIsolate, hValue); + } + void SetHostObject(FX_LPVOID lpObject, CFXJSE_Class* lpClass); + void SetArray(FX_UINT32 uValueCount, CFXJSE_Value** rgValues); + void SetDate(FXJSE_DOUBLE dDouble); +public: + FX_BOOL GetObjectProperty(FX_BSTR szPropName, CFXJSE_Value* lpPropValue); + FX_BOOL SetObjectProperty(FX_BSTR szPropName, CFXJSE_Value* lpPropValue); + FX_BOOL GetObjectProperty(FX_UINT32 uPropIdx, CFXJSE_Value* lpPropValue); + FX_BOOL SetObjectProperty(FX_UINT32 uPropIdx, CFXJSE_Value* lpPropValue); + FX_BOOL DeleteObjectProperty(FX_BSTR szPropName); + FX_BOOL HasObjectOwnProperty(FX_BSTR szPropName, FX_BOOL bUseTypeGetter); + FX_BOOL SetObjectOwnProperty(FX_BSTR szPropName, CFXJSE_Value* lpPropValue); + FX_BOOL SetFunctionBind(CFXJSE_Value* lpOldFunction, CFXJSE_Value* lpNewThis); + FX_BOOL Call(CFXJSE_Value* lpReceiver, CFXJSE_Value* lpRetValue, FX_UINT32 nArgCount, FXJSE_HVALUE* lpArgs); +public: + V8_INLINE v8::Isolate* GetIsolate() const + { + return m_pIsolate; + } + V8_INLINE const v8::Persistent& DirectGetValue() const + { + return m_hValue; + } + V8_INLINE void ForceSetValue(v8::Local hValue) + { + m_hValue.Reset(m_pIsolate, hValue); + } + V8_INLINE void Assign(const CFXJSE_Value* lpValue) + { + if(lpValue) { + m_hValue.Reset(m_pIsolate, lpValue->m_hValue); + } else { + m_hValue.Reset(); + } + } +public: + static CFXJSE_Value* Create(v8::Isolate* pIsolate); +protected: + v8::Isolate* m_pIsolate; + v8::Persistent m_hValue; + friend class CFXJSE_Context; + friend class CFXJSE_Class; +}; +#endif -- cgit v1.2.3